Beginnings of pinentry support in pwmd. This will remove the forking
[pwmd.git] / src / pinentry.c
blobad643e2b940199a7a08cfc5511ec66d273ed4234
1 /* vim:tw=78:ts=8:sw=4:set ft=c: */
2 /*
3 Copyright (C) 2007 Ben Kibbey <bjk@luxsci.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include <gcrypt.h>
20 #include <glib.h>
22 #define _ASSUAN_ONLY_GPG_ERRORS 1
23 #include <assuan.h>
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
29 #include "common.h"
30 #include "pinentry.h"
32 static gpg_error_t getpin(struct client_s *client, char **result, int which)
34 #if 0
35 gpg_error_t error = set_pinentry_strings(client, pctx, which);
37 if (error) {
38 pinentry_disconnect(pwm);
39 return error;
42 error = do_getpin(pwm, result);
43 pinentry_disconnect(pwm);
44 #endif
45 return 0;
48 gpg_error_t pinentry_fork(assuan_context_t ctx)
50 struct client_s *client = assuan_get_pointer(ctx);
51 gpg_error_t error;
52 gint p[2];
53 pid_t pid;
54 pinentry_key_s pk;
55 gsize len;
57 if (pipe(p) == -1) {
58 error = gpg_error_from_syserror();
59 return send_error(ctx, error);
62 pid = fork();
64 switch (pid) {
65 case -1:
66 error = gpg_error_from_syserror();
67 close(p[0]);
68 close(p[1]);
69 return send_error(ctx, error);
70 case 0:
71 close(p[0]);
72 pk.error = 0; //getpin()
74 #if 0
75 if (pk.error) {
76 if (client->pctx)
77 pinentry_disconnect(pctx);
79 pk.error = error;
80 write(p[1], &pk, sizeof(pk));
81 close(p[1]);
82 // FIXME cleanup?
83 _exit(1);
85 #endif
87 pk.error = 0;
88 strncpy(pk.key, "test", sizeof(pk.key));
89 len = write(p[1], &pk, sizeof(pk));
91 if (len != sizeof(pk))
92 log_write("pth_write() short len");
93 close(p[1]);
94 // FIXME cleanup?
95 _exit(0);
96 default:
97 client->pinentry_fd = p[0];
98 client->pinentry_pid = pid;
99 client->pinentry_status = PINENTRY_INIT;
100 break;
104 * Don't call assuan_process_done() here. That should be done in
105 * open_command_finalize() after the key has been retrieved.
107 return 0;