/[pkg-mixmaster]/trunk/Mix/Src/main.c
ViewVC logotype

Contents of /trunk/Mix/Src/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 332 - (hide annotations) (download)
Wed Oct 9 20:53:32 2002 UTC (10 years, 8 months ago) by weaselp
File MIME type: text/plain
File size: 18641 byte(s)
Whitespace cleanup:
for i in *.c; do cp -a $i $i.orig; sed -e 's/^        /<TAB>/' $i.orig > $i; rm $i.orig; done
for i in *.c *.h; do cp -a $i $i.orig; sed -e 's/[ <TAB>]*$//' $i.orig > $i; rm $i.orig; done
1 rabbi 1 /* Mixmaster version 3 -- (C) 1999 Anonymizer Inc.
2    
3     Mixmaster may be redistributed and modified under certain conditions.
4     This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
5     ANY KIND, either express or implied. See the file COPYRIGHT for
6     details.
7    
8     Command-line based frontend
9 weaselp 332 $Id: main.c,v 1.24 2002/10/09 20:53:29 weaselp Exp $ */
10 rabbi 1
11    
12     #include "mix3.h"
13 rabbi 186 #include "pgp.h"
14 rabbi 1 #include <stdio.h>
15     #include <string.h>
16     #include <ctype.h>
17 weaselp 120 #include <stdlib.h>
18 rabbi 1 #ifdef POSIX
19     #include <unistd.h>
20 rabbi 262 #else /* end of POSIX */
21 rabbi 1 #include <io.h>
22 rabbi 262 #endif /* else if not POSIX */
23 rabbi 1
24     static char *largopt(char *p, char *opt, char *name, int *error);
25     static void noarg(char *name, char p);
26 weaselp 194 static int check_get_pass(int force);
27 rabbi 1
28     /** main *****************************************************************/
29    
30     /* Returns:
31     0 successful operation
32     1 command line error
33     2 client error condition */
34    
35 rabbi 30 #ifdef WIN32SERVICE
36     int mix_main(int argc, char *argv[])
37     #else
38 rabbi 1 int main(int argc, char *argv[])
39 rabbi 262 #endif /* WIN32SERVICE */
40 rabbi 1 {
41     int error = 0, deflt = 1, help = 0, readmail = 0, send = -1, sendpool = 0,
42     header = 1, maint = 0, keygen = 0, verbose = 2, sign = 0, encrypt = 0;
43 weaselp 177 int daemon = 0, type_list = 0, nodetach = 0;
44 rabbi 1
45     #ifdef USE_SOCK
46     int pop3 = 0;
47    
48 rabbi 262 #endif /* USE_SOCK */
49 rabbi 1 char *filename = NULL;
50     int i;
51     int ret = 0;
52     char *p, *q;
53     char chain[1024] = "";
54     char nym[LINELEN] = "";
55     BUFFER *nymopt, *pseudonym, *attachments;
56     int numcopies = 0; /* default value set in mix.cfg */
57     BUFFER *msg, *chainlist, *field, *content;
58     FILE *f;
59    
60     mix_init(NULL);
61    
62     msg = buf_new();
63     chainlist = buf_new();
64     nymopt = buf_new();
65     pseudonym = buf_new();
66     attachments = buf_new();
67     field = buf_new();
68     content = buf_new();
69    
70     #ifdef USE_NCURSES
71     if (argc == 1) {
72     if (isatty(fileno(stdin)))
73     menu_main();
74     else
75     menu_folder(0, NULL);
76     goto end;
77     }
78 rabbi 262 #endif /* USE_NCURSES */
79 rabbi 1 if (argc > 1 && strleft(argv[1], "-f")) {
80     menu_folder(strlen(argv[1]) > 2 ? argv[1][2] : 0,
81     argc < 3 ? NULL : argv[2]);
82     goto end;
83     }
84     for (i = 1; i < argc; i++) {
85     p = argv[i];
86     if (p[0] == '-' && p[1] != '\0') {
87     if (p[1] == '-') {
88     p += 2;
89     if (strieq(p, "help"))
90     help = 1, deflt = 0;
91     else if (streq(p, "verbose"))
92     verbose = 1;
93 weaselp 332 else if (streq(p, "type-list"))
94     type_list = 1;
95 rabbi 1 else if (streq(p, "dummy"))
96     send = MSG_NULL, deflt = 0;
97     else if (streq(p, "remailer"))
98     maint = 1, deflt = 0;
99     else if (streq(p, "generate-key"))
100     keygen = 2, deflt = 0;
101     else if (streq(p, "update-keys"))
102     keygen = 1, deflt = 0;
103     else if (streq(p, "send"))
104     sendpool = 1, deflt = 0;
105     else if (streq(p, "read-mail"))
106     readmail = 1, deflt = 0;
107 rabbi 147 else if (streq(p, "store-mail"))
108     readmail = 2, deflt = 0;
109 rabbi 1 #ifdef USE_SOCK
110     else if (streq(p, "pop-mail"))
111     pop3 = 1, deflt = 0;
112 rabbi 262 #endif /* USE_SOCK */
113 rabbi 1 else if (streq(p, "daemon"))
114     daemon = 1, deflt = 0;
115 weaselp 177 else if (streq(p, "no-detach"))
116     nodetach = 1;
117 rabbi 1 else if (streq(p, "post"))
118     send = MSG_POST;
119     else if (streq(p, "mail"))
120     send = MSG_MAIL;
121     else if (streq(p, "sign"))
122     sign = 1;
123     else if (streq(p, "encrypt"))
124     encrypt = 1;
125     else if ((q = largopt(p, "to", argv[0], &error)) != NULL) {
126     header = 0;
127     buf_appendf(msg, "To: %s\n", q);
128     } else if ((q = largopt(p, "post-to", argv[0], &error)) != NULL) {
129     send = MSG_POST, header = 0;
130     buf_appendf(msg, "Newsgroups: %s\n", q);
131     } else if ((q = largopt(p, "subject", argv[0], &error)) != NULL) {
132     buf_appendf(msg, "Subject: %s\n", q);
133     } else if ((q = largopt(p, "header", argv[0], &error)) != NULL) {
134     buf_appendf(msg, "%s\n", q);
135     } else if ((q = largopt(p, "chain", argv[0], &error)) != NULL) {
136     buf_appendf(msg, "Chain: %s\n", q);
137     }
138 weaselp 332 #ifdef USE_PGP
139 rabbi 1 else if ((q = largopt(p, "reply-chain", argv[0], &error)) != NULL) {
140     buf_appendf(msg, "Reply-Chain: %s\n", q);
141     } else if ((q = largopt(p, "latency", argv[0], &error)) != NULL) {
142     buf_appendf(msg, "Latency: %s\n", q);
143     } else if ((q = largopt(p, "attachment", argv[0], &error)) != NULL) {
144     buf_appendf(attachments, "%s\n", q);
145     } else if ((q = largopt(p, "nym-config", argv[0], &error)) != NULL) {
146     deflt = 0;
147     strncpy(nym, q, sizeof(nym));
148     if (i > argc && strileft(argv[i + 1], "name="))
149     buf_sets(pseudonym, argv[++i] + 5);
150     else if (i > argc && strileft(argv[i + 1], "opt="))
151     buf_appends(nymopt, argv[++i] + 5);
152     } else if ((q = largopt(p, "nym", argv[0], &error)) != NULL) {
153     buf_appendf(msg, "Nym: %s\n", q);
154     }
155 rabbi 262 #endif /* USE_PGP */
156 rabbi 1 else if ((q = largopt(p, "copies", argv[0], &error)) != NULL) {
157     sscanf(q, "%d", &numcopies);
158 disastry 265 } else if ((q = largopt(p, "config", argv[0], &error)) != NULL) {
159     strncpy(MIXCONF, q, PATHMAX);
160     MIXCONF[PATHMAX-1] = 0;
161     mix_config(); /* configuration file changed - reread it */
162 rabbi 1 } else if (error == 0 && mix_configline(p) == 0) {
163     fprintf(stderr, "%s: Invalid option %s\n", argv[0], argv[i]);
164     error = 1;
165     }
166     } else {
167     while (*++p) {
168     switch (*p) {
169     case 'd':
170     send = MSG_NULL, deflt = 0;
171     break;
172     case 'R':
173     readmail = 1, deflt = 0;
174     break;
175 rabbi 147 case 'I':
176     readmail = 2, deflt = 0;
177     break;
178 rabbi 1 case 'S':
179     sendpool = 1, deflt = 0;
180     break;
181     case 'M':
182     maint = 1, deflt = 0;
183     break;
184     #ifdef USE_SOCK
185     case 'P':
186     pop3 = 1, deflt = 0;
187     break;
188 rabbi 262 #endif /* USE_SOCK */
189 rabbi 1 case 'D':
190     daemon = 1, deflt = 0;
191     break;
192     case 'G':
193     keygen = 2, deflt = 0;
194     break;
195     case 'K':
196     keygen = 1, deflt = 0;
197     break;
198     case 'L': /* backwards compatibility */
199     break;
200     case 'v':
201     verbose = 1;
202     break;
203     case 'h':
204     help = 1, deflt = 0;
205     break;
206     case 'T':
207     type_list = 1;
208     break;
209     case 't':
210     if (*(p + 1) == 'o')
211     p++;
212     header = 0;
213     if (i < argc - 1)
214     buf_appendf(msg, "To: %s\n", argv[++i]);
215     else {
216     fprintf(stderr, "%s: Missing argument for option -to\n",
217     argv[0]);
218     error = 1;
219     }
220     break;
221     case 's':
222     if (i < argc - 1)
223     buf_appendf(msg, "Subject: %s\n", argv[++i]);
224     else {
225     noarg(argv[0], *p);
226     error = 1;
227     }
228     break;
229     case 'l':
230     if (i < argc - 1)
231     buf_appendf(msg, "Chain: %s\n", argv[++i]);
232     else {
233     noarg(argv[0], *p);
234     error = 1;
235     }
236     break;
237     case 'r':
238     if (i < argc - 1)
239 weaselp 120 buf_appendf(msg, "Reply-Chain: %s\n", argv[++i]);
240 rabbi 1 else {
241     noarg(argv[0], *p);
242     error = 1;
243     }
244     break;
245     #ifdef USE_PGP
246     case 'n':
247     if (i < argc - 1)
248     buf_appendf(msg, "Nym: %s\n", argv[++i]);
249     else {
250     noarg(argv[0], *p);
251     error = 1;
252     }
253     break;
254 rabbi 262 #endif /* USE_PGP */
255 rabbi 1 case 'c':
256     if (i < argc - 1)
257     sscanf(argv[++i], "%d", &numcopies);
258     else {
259     noarg(argv[0], *p);
260     error = 1;
261     }
262     break;
263     case 'p':
264     send = MSG_POST;
265     break;
266     case 'g':
267     if (i < argc - 1) {
268     send = MSG_POST, header = 0;
269     buf_appendf(msg, "Newsgroups: %s\n", argv[++i]);
270     } else {
271     noarg(argv[0], *p);
272     error = 1;
273     }
274 weaselp 69 break;
275 rabbi 1 case 'a':
276     if (i < argc - 1)
277     buf_appendf(attachments, "%s\n", argv[++i]);
278     else {
279     noarg(argv[0], *p);
280     error = 1;
281     }
282 weaselp 69 break;
283 rabbi 1 case 'm':
284     send = MSG_MAIL;
285     break;
286     default:
287     fprintf(stderr, "%s: Invalid option -%c\n", argv[0], *p);
288     error = 1;
289     break;
290     }
291     }
292     }
293     } else {
294     if (strchr(argv[i], '@')) {
295     header = 0;
296     buf_appendf(msg, "To: %s\n", argv[i]);
297     } else {
298     if (filename == NULL)
299     filename = argv[i];
300     else {
301     fprintf(stderr, "%s: Error in command line: %s\n", argv[0], argv[i]);
302     error = 1;
303     }
304     }
305     }
306     }
307    
308     if (error) {
309     ret = 1;
310     goto end;
311     }
312     if (type_list) {
313 weaselp 168 BUFFER *type2list;
314     type2list = buf_new();
315     if (prepare_type2list(type2list) < 0) {
316 rabbi 101 fprintf(stderr, "Cannot print type2.list.\n");
317     ret = 2;
318 weaselp 168 } else {
319     printf("%s", type2list->data);
320     };
321     buf_free(type2list);
322 rabbi 1 goto end;
323     }
324     if (help || (isatty(fileno(stdin)) && isatty(fileno(stdout))))
325     fprintf(stderr, "Mixmaster %s - %s\n", VERSION, COPYRIGHT);
326    
327     if (help) {
328     printf("Usage: %s [options] [user@host] [filename]\n\n", argv[0]);
329     printf("Options:\n\
330     \n\
331     -h, --help summary of command line options\n\
332     -T, --type-list list available remailers\n\
333     -t, --to=user@host the recipient's address(es)\n\
334     -g, --post-to=newsgroup newsgroup(s) to post to\n\
335     -p, --post input is a Usenet article\n\
336     -m, --mail input is a mail message\n\
337     -s, --subject=subject message subject\n\
338     --header='header line' arbitrary message headers\n\
339     -a, --attachment=file attach a file\n"
340     #ifdef USE_PGP
341     "-n, --nym=yournym use pseudonym to send the message\n\
342     --encrypt encrypt the message using the PGP format\n\
343     --sign sign the message using the PGP format\n"
344 rabbi 262 #endif /* USE_PGP */
345 rabbi 1 "-l, --chain=mix1,mix2,mix3,... specify a remailer chain\n\
346     -c, --copies=num send num copies to increase reliability\n\
347     -d, --dummy generate a dummy message\n\
348     -S, --send send the message(s) in the pool\n"
349     #ifdef USE_PGP
350     " --nym-config=yournym generate a new pseudonym\n\
351     --latency=hours reply chain latency\n\
352     --reply-chain=rem1,rem2,... reply chain for the pseudonym\n"
353 rabbi 262 #endif /* USE_PGP */
354 rabbi 1 "-v, --verbose output informational messages\n\
355     -f [file] read a mail folder\n"
356     #ifndef USE_NCURSES
357     "\n-fr, -ff, -fg [file] send reply/followup/group reply to a message\n"
358 rabbi 262 #endif /* USE_NCURSES */
359 rabbi 1 "\nThe input file is expected to contain mail headers if no address is\n\
360     specified in the command line.\n\
361     \n\
362     Remailer:\n\
363     \n\
364     -R, --read-mail read remailer message from stdin\n\
365 rabbi 147 -I, --store-mail read remailer msg from stdin, do not decrypt\n\
366 rabbi 1 -M, --remailer process the remailer pool\n\
367 weaselp 199 -D, --daemon remailer as background process\n\
368 weaselp 177 --no-detach do not detach from terminal as daemon\n"
369 rabbi 1 #ifdef USE_SOCK
370     "-S, --send force sending messages from the pool\n"
371 rabbi 262 #endif /* USE_SOCK */
372 rabbi 1 "-P, --pop-mail force getting messages from POP3 servers\n\
373     -G, --generate-key generate a new remailer key\n\
374 disastry 265 -K, --update-keys generate remailer keys if necessary\n\
375     --config=file use alternate configuration file\n"
376 rabbi 30 #ifdef WIN32SERVICE
377     "\n\
378     WinNT service:\n\
379     \n\
380 rabbi 37 --install-svc install the service\n\
381     --remove-svc remove the service\n\
382     --run-svc run as a service\n"
383 rabbi 262 #endif /* WIN32SERVICE */
384 rabbi 30 );
385 rabbi 1
386     ret = 0;
387     goto end;
388     }
389     if (deflt && send == -1)
390     send = MSG_MAIL;
391     if (nym[0] != 0)
392     send = -1;
393     if ((send == MSG_MAIL || send == MSG_POST) && filename == NULL &&
394     header == 1 && isatty(fileno(stdin))) {
395     /* we don't get here if USE_NCURSES is set */
396     printf("Run `%s -h' to view a summary of the command line options.\n\nEnter the message, complete with headers.\n",
397     argv[0]);
398     #ifdef UNIX
399     printf("When done, press ^D.\n\n");
400     #else
401     printf("When done, press ^Z.\n\n");
402 rabbi 262 #endif /* else not UNIX */
403 rabbi 1 }
404     if (header == 0)
405     buf_nl(msg);
406    
407     if (readmail || send == MSG_MAIL || send == MSG_POST) {
408     if (filename == NULL || streq(filename, "-"))
409     f = stdin;
410     else {
411     f = fopen(filename, "r");
412     if (f == NULL)
413     fprintf(stderr, "Can't open %s.\n", filename);
414     }
415    
416     if (f && buf_read(msg, f) != -1) {
417 weaselp 194 if (readmail == 1) {
418 weaselp 332 check_get_pass(1);
419 rabbi 1 mix_decrypt(msg);
420 weaselp 194 } else if (readmail == 2)
421 rabbi 147 pool_add(msg, "inf");
422 rabbi 1 if (send == MSG_MAIL || send == MSG_POST) {
423     BUFFER *sendmsg;
424     int numdest = 0;
425    
426     sendmsg = buf_new();
427    
428     while (buf_getheader(msg, field, content) == 0) {
429     if (bufieq(field, "nym")) {
430     strncpy(nym, content->data, sizeof(nym));
431     } else if (bufieq(field, "chain"))
432     if (strchr(content->data, ';')) {
433     i = strchr(content->data, ';') - (char *)content->data;
434     strncpy(chain, content->data, i);
435     if (strstr(content->data + i, "copies=") != NULL) {
436     sscanf(strstr(content->data + i, "copies=") +
437     sizeof("copies=") - 1, "%d", &numcopies);
438     }
439     } else
440     strncpy(chain, content->data, sizeof(chain));
441     else { /* line goes into message */
442     if ((send == MSG_MAIL && bufieq(field, "to"))
443     || (send == MSG_POST && bufieq(field, "newsgroups")))
444     numdest++;
445     if (bufieq(field, "from"))
446     fprintf(stderr, "Warning: The message has a From: line.\n");
447     buf_appendheader(sendmsg, field, content);
448     }
449     }
450     buf_nl(sendmsg);
451     buf_rest(sendmsg, msg);
452    
453     while (buf_getline(attachments, field) != -1)
454     if (attachfile(sendmsg, field) == -1) {
455     errlog(ERRORMSG, "Can't attach %b!\n", field);
456     ret = 2;
457     goto end;
458     }
459    
460     #ifdef USE_PGP
461     if (nym[0] != 0 && strchr(nym, '@') == NULL)
462     strcatn(nym, "@", sizeof(nym));
463     if (sign || encrypt) {
464     BUFFER *pass;
465    
466     pass = buf_new();
467     user_pass(pass);
468     if (pgp_mailenc((encrypt ? PGP_ENCRYPT : 0) |
469     (nym[0] != 0 && sign ? PGP_SIGN : 0) |
470     PGP_TEXT | PGP_REMAIL, sendmsg, nym,
471     pass, NULL, NYMSECRING) != 0) {
472     fprintf(stderr, "Encryption failed: missing key!");
473     ret = 2;
474     goto end;
475     }
476     buf_free(pass);
477     }
478     if (nym[0] != 0) {
479     if (nym_encrypt(sendmsg, nym, send) == 0)
480     send = MSG_MAIL;
481     else
482     fprintf(stderr, "Nym error, sending message anonymously.\n");
483     }
484 rabbi 262 #endif /* USE_PGP */
485 rabbi 1 if (numdest == 0) {
486     fprintf(stderr, "No destination address given!\n");
487     ret = 2;
488     } else if (numcopies < 0 || numcopies > 10) {
489     fprintf(stderr, "Invalid number of copies!\n");
490     ret = 2;
491     } else {
492     if (mix_encrypt(send, sendmsg, chain, numcopies,
493     chainlist) == -1) {
494     ret = 2;
495     if (chainlist->length)
496     fprintf(stderr, "%s\n", chainlist->data);
497     else
498     fprintf(stderr, "Failed!\n");
499     } else if (verbose) {
500     fprintf(stderr, "Chain: ");
501     buf_write(chainlist, stderr);
502     }
503     }
504    
505     buf_free(sendmsg);
506     }
507     if (filename != NULL)
508     fclose(f);
509     } else
510     ret = 2;
511     }
512     if (send == MSG_NULL) {
513     if (msg->length) {
514     while (buf_getheader(msg, field, content) == 0) {
515     if (bufieq(field, "chain"))
516     strncpy(chain, content->data, sizeof(chain));
517     }
518     }
519     if (mix_encrypt(MSG_NULL, NULL, chain, numcopies, chainlist) == -1) {
520     ret = 2;
521     if (chainlist->length)
522     fprintf(stderr, "%s\n", chainlist->data);
523     else
524     fprintf(stderr, "Failed!\n");
525     } else if (verbose) {
526     fprintf(stderr, "Chain: ");
527     buf_write(chainlist, stderr);
528     }
529     }
530     #ifdef USE_PGP
531     if (nym[0] != 0) {
532     char nymserver[LINELEN] = "*";
533     BUFFER *chains;
534    
535     chains = buf_new();
536     if (numcopies < 1 || numcopies > 10)
537     numcopies = 1;
538     while (buf_getheader(msg, field, content) != -1) {
539     if (bufieq(field, "chain"))
540     strncpy(chain, content->data, sizeof(chain));
541     else if (bufieq(field, "reply-chain"))
542     buf_appendf(chains, "Chain: %b\n", content);
543     else if (field->length)
544     buf_appendheader(chains, field, content);
545     else
546     buf_nl(chains);
547     }
548 weaselp 120 if (strrchr(nym, '@')) {
549     strncpy(nymserver, strrchr(nym, '@'), sizeof(nymserver));
550     *strrchr(nym, '@') = '\0';
551 rabbi 1 }
552     if (nym_config(NYM_CREATE, nym, nymserver, pseudonym,
553     chain, numcopies, chains, nymopt) < 0) {
554     ret = 2;
555     fprintf(stderr, "Failed!\n");
556     }
557     user_delpass();
558     buf_free(chains);
559     }
560 rabbi 262 #endif /* USE_PGP */
561 rabbi 1
562 weaselp 194 if (keygen) {
563     check_get_pass(0);
564 rabbi 1 keymgt(keygen);
565 weaselp 194 }
566 rabbi 1 if (sendpool)
567     mix_send();
568     #ifdef USE_SOCK
569     if (pop3)
570     pop3get();
571 rabbi 262 #endif /* USE_SOCK */
572 weaselp 194 if (maint) {
573     check_get_pass(1);
574 rabbi 1 mix_regular(0);
575 weaselp 194 }
576 ulfm 314 if (REMAIL == 0)
577     mix_regular(0); /* check client pool */
578 rabbi 1
579     end:
580     buf_free(field);
581     buf_free(content);
582     buf_free(chainlist);
583     buf_free(msg);
584     buf_free(nymopt);
585     buf_free(pseudonym);
586     buf_free(attachments);
587    
588     if (daemon) {
589 weaselp 194 check_get_pass(1);
590 rabbi 1 #ifdef UNIX
591 rabbi 186 if (! nodetach) {
592     int pid;
593 rabbi 1
594 weaselp 177 fprintf(stderr, "Detaching.\n");
595     /* Detach as suggested by the Unix Programming FAQ */
596     pid = fork();
597     if (pid > 0)
598     exit(0);
599     if (setsid() < 0) {
600     /* This should never happen. */
601     fprintf(stderr, "setsid() failed.\n");
602     exit(1);
603 weaselp 124 };
604 weaselp 177 pid = fork();
605     if (pid > 0)
606     exit(0);
607     if (chdir(MIXDIR) < 0) {
608     if (chdir("/") < 0) {
609     fprintf(stderr, "Cannot chdir to mixdir or /.\n");
610     exit(1);
611     };
612     };
613 weaselp 197 if (write_pidfile(PIDFILE)) {
614     fprintf(stderr, "Aborting.\n");
615     exit(1);
616     }
617 weaselp 177 freopen ("/dev/null", "r", stdin);
618     freopen ("/dev/null", "w", stdout);
619     freopen ("/dev/null", "w", stderr);
620     }
621 rabbi 262 #endif /* UNIX */
622 rabbi 1 mix_daemon();
623 weaselp 332 #ifdef UNIX
624 rabbi 262 /* ifdef this one to, so that we do not need to export it from windows dll */
625 weaselp 197 clear_pidfile(PIDFILE);
626 rabbi 262 #endif /* UNIX */
627 rabbi 1 }
628     mix_exit();
629     return (ret);
630     }
631    
632     static char *largopt(char *p, char *opt, char *name, int *error)
633     {
634     if (streq(p, opt)) {
635     fprintf(stderr, "%s: Missing argument for option --%s\n", name, p);
636     *error = 1;
637     } else if (strleft(p, opt) && p[strlen(opt)] == '=') {
638     return (p + strlen(opt) + 1);
639     }
640     return (NULL);
641     }
642    
643     static void noarg(char *name, char p)
644     {
645     fprintf(stderr, "%s: Missing argument for option -%c\n", name, p);
646     }
647 weaselp 194
648     static int check_get_pass(int force)
649     /* get a passphrase and check against keys
650 rabbi 262 * if force != 0 passphrase must match with some key */
651 weaselp 194 {
652     BUFFER *pass, *pass2, *key;
653     int n = 0;
654    
655 weaselp 196 if (PASSPHRASE[0] == '\0' && isatty(fileno(stdin))) {
656     pass = buf_new();
657     pass2 = buf_new();
658     key = buf_new();
659     buf_sets(pass, PASSPHRASE);
660 disastry 254 while (pgpdb_getkey(PK_DECRYPT, PGP_ES_RSA, NULL, NULL, NULL, NULL, NULL,
661 weaselp 196 NULL, NULL, NULL, pass) < 0 &&
662 disastry 254 pgpdb_getkey(PK_DECRYPT, PGP_E_ELG, NULL, NULL, NULL, NULL, NULL,
663 weaselp 196 NULL, NULL, NULL, pass) < 0 &&
664     getv2seckey(NULL, key) < 0)
665     {
666     user_delpass();
667     if (n)
668     fprintf(stderr, "re-");
669     user_pass(pass);
670     strncpy(PASSPHRASE, pass->data, LINELEN);
671     PASSPHRASE[LINELEN-1] = 0;
672     if (!force) {
673     if (n && buf_eq(pass, pass2))
674     break;
675     buf_set(pass2, pass);
676     }
677     n=1;
678     }
679     user_delpass();
680     buf_free(pass);
681     buf_free(pass2);
682     buf_free(key);
683 weaselp 194
684 weaselp 196 strncpy(ENTEREDPASSPHRASE, PASSPHRASE, LINELEN);
685     ENTEREDPASSPHRASE[LINELEN-1] = 0;
686 weaselp 194 }
687     return 1;
688     }

  ViewVC Help
Powered by ViewVC 1.1.5