4 * by JH <jheinonen@users.sourceforge.net>
6 * Copyright (C) Jaakko Heinonen
18 #if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
33 static void init_abook();
34 static void quit_abook_sig(int i);
35 static void set_filenames();
36 static void free_filenames();
37 static void parse_command_line(int argc, char **argv);
38 static void show_usage();
39 static void mutt_query(char *str);
40 static void init_mutt_query();
41 static void convert(char *srcformat, char *srcfile,
42 char *dstformat, char *dstfile);
43 static void add_email(int);
45 char *datafile = NULL;
54 signal(SIGKILL, quit_abook_sig);
55 signal(SIGTERM, quit_abook_sig);
63 * this is very ugly for now
65 /*if( options_get_int("datafile", "autosave") )*/
67 if( load_database(datafile) == 2 ) {
68 char *tmp = strconcat(getenv("HOME"),
71 if( safe_strcmp(tmp, datafile) ) {
73 statusline_msg("Sorry, the specified file does "
74 "not appear to be a valid abook addressbook");
75 statusline_msg("Will open default addressbook...");
78 load_database(datafile);
89 if( options_get_int("autosave") )
91 else if( statusline_ask_boolean("Save database", TRUE) )
103 quit_abook_sig(int i)
109 main(int argc, char **argv)
111 #if defined(HAVE_SETLOCALE) && defined(HAVE_LOCALE_H)
112 setlocale(LC_ALL, "" );
115 parse_command_line(argc, argv);
131 if( (stat(getenv("HOME"), &s)) == -1 || ! S_ISDIR(s.st_mode) ) {
132 fprintf(stderr,"%s is not a valid HOME directory\n", getenv("HOME") );
137 datafile = strconcat(getenv("HOME"), "/" DATAFILE, NULL);
140 rcfile = strconcat(getenv("HOME"), "/" RCFILE, NULL);
142 atexit(free_filenames);
159 MODE_ADD_EMAIL_QUIET,
165 change_mode(int *current, int mode)
167 if(*current != MODE_CONT) {
168 fprintf(stderr, "Cannot combine options --mutt-query, "
170 "--add-email or --add-email-quiet\n");
178 set_filename(char **var, char *path)
183 assert(*var == NULL); /* or else we probably leak memory */
184 assert(path != NULL);
193 *var = strconcat(cwd, path, NULL);
198 #define set_convert_var(X) do { if(mode != MODE_CONVERT) {\
199 fprintf(stderr, "please use option --%s after --convert option\n",\
200 long_options[option_index].name);\
207 parse_command_line(int argc, char **argv)
209 int mode = MODE_CONT;
210 char *query_string = NULL;
211 char *informat = "abook",
218 int option_index = 0;
230 static struct option long_options[] = {
231 { "help", 0, 0, 'h' },
232 { "add-email", 0, 0, OPT_ADD_EMAIL },
233 { "add-email-quiet", 0, 0, OPT_ADD_EMAIL_QUIET },
234 { "datafile", 1, 0, 'f' },
235 { "mutt-query", 1, 0, OPT_MUTT_QUERY },
236 { "config", 1, 0, 'C' },
237 { "convert", 0, 0, OPT_CONVERT },
238 { "informat", 1, 0, OPT_INFORMAT },
239 { "outformat", 1, 0, OPT_OUTFORMAT },
240 { "infile", 1, 0, OPT_INFILE },
241 { "outfile", 1, 0, OPT_OUTFILE },
242 { "formats", 0, 0, OPT_FORMATS },
246 c = getopt_long(argc, argv, "hC:",
247 long_options, &option_index);
257 change_mode(&mode, MODE_ADD_EMAIL);
259 case OPT_ADD_EMAIL_QUIET:
260 change_mode(&mode, MODE_ADD_EMAIL_QUIET);
263 set_filename(&datafile, optarg);
266 query_string = optarg;
267 change_mode(&mode, MODE_QUERY);
270 set_filename(&rcfile, optarg);
273 change_mode(&mode, MODE_CONVERT);
276 set_convert_var(informat);
279 set_convert_var(outformat);
282 set_convert_var(infile);
285 set_convert_var(outfile);
296 fprintf(stderr, "%s: unrecognized arguments on command line\n",
304 case MODE_ADD_EMAIL_QUIET:
307 mutt_query(query_string);
309 convert(informat, infile, outformat, outfile);
317 puts (PACKAGE " v " VERSION "\n");
318 puts (" -h --help show usage");
319 puts (" -C --config <file> use an alternative configuration file");
320 puts (" --datafile <file> use an alternative addressbook file");
321 puts (" --mutt-query <string> make a query for mutt");
322 puts (" --add-email "
323 "read an e-mail message from stdin and\n"
325 "add the sender to the addressbook");
326 puts (" --add-email-quiet "
327 "same as --add-email but doesn't\n"
330 puts (" --convert convert address book files");
331 puts (" options to use with --convert:");
332 puts (" --informat <format> format for input file");
333 puts (" (default: abook)");
334 puts (" --infile <file> source file");
335 puts (" (default: stdin)");
336 puts (" --outformat <format> format for output file");
337 puts (" (default: text)");
338 puts (" --outfile <file> destination file");
339 puts (" (default: stdout)");
340 puts (" --formats list available formats");
347 extern list_item *database;
350 quit_mutt_query(int status)
359 muttq_print_item(FILE *file, int item)
361 char emails[MAX_EMAILS][MAX_EMAIL_LEN];
364 split_emailstr(item, emails);
366 for(i = 0; i < (options_get_int("mutt_return_all_emails") ?
367 MAX_EMAILS : 1) ; i++)
369 fprintf(file, "%s\t%s\t%s\n", emails[i],
370 database[item][NAME],
371 database[item][NOTES] == NULL ? " " :
372 database[item][NOTES]
377 mutt_query(char *str)
381 if( str == NULL || !strcasecmp(str, "all") ) {
382 struct db_enumerator e = init_db_enumerator(ENUM_ALL);
383 printf("All items\n");
384 db_enumerate_items(e)
385 muttq_print_item(stdout, e.item);
387 int search_fields[] = {NAME, EMAIL, NICK, -1};
389 if( (i = find_item(str, 0, search_fields)) < 0 ) {
390 printf("Not found\n");
395 muttq_print_item(stdout, i);
396 i = find_item(str, i+1, search_fields);
409 if( load_database(datafile) ) {
410 printf("Cannot open database\n");
418 make_mailstr(int item)
420 char email[MAX_EMAIL_LEN];
422 char *name = mkstr("\"%s\"", database[item][NAME]);
424 get_first_email(email, item);
426 ret = *database[item][EMAIL] ?
427 mkstr("%s <%s>", name, email) :
436 print_stderr(int item)
438 fprintf (stderr, "%c", '\n');
440 if( is_valid_item(item) )
441 muttq_print_item(stderr, item);
443 struct db_enumerator e = init_db_enumerator(ENUM_SELECTED);
444 db_enumerate_items(e) {
445 muttq_print_item(stderr, e.item);
452 launch_mutt(int item)
454 char *cmd = NULL, *mailstr = NULL;
455 char *mutt_command = options_get_str("mutt_command");
457 if(mutt_command == NULL || !*mutt_command)
460 if( is_valid_item(item) )
461 mailstr = make_mailstr(item);
463 struct db_enumerator e = init_db_enumerator(ENUM_SELECTED);
465 db_enumerate_items(e) {
468 strconcat(tmp, ",", make_mailstr(e.item), NULL):
469 strconcat(make_mailstr(e.item), NULL);
474 cmd = strconcat(mutt_command, " \'", mailstr,
478 fprintf(stderr, "cmd: %s\n", cmd);
484 * we need to make sure that curses settings are correct
490 launch_wwwbrowser(int item)
494 if( !is_valid_item(item) )
497 if( database[item][URL] )
498 cmd = mkstr("%s '%s'",
499 options_get_str("www_command"),
500 safe_str(database[item][URL]));
510 * we need to make sure that curses settings are correct
516 abook_malloc(size_t size)
520 if ( (ptr = malloc(size)) == NULL ) {
521 if( is_ui_initialized() )
523 perror("malloc() failed");
531 abook_realloc(void *ptr, size_t size)
533 ptr = realloc(ptr, size);
539 if( is_ui_initialized() )
541 perror("realloc() failed");
549 abook_fopen (const char *path, const char *mode)
553 if( ! strchr(mode, 'r') )
554 return fopen(path, mode);
556 if ( (stat(path, &s)) == -1 )
559 return S_ISREG(s.st_mode) ? fopen(path, mode) : NULL;
565 convert(char *srcformat, char *srcfile, char *dstformat, char *dstfile)
569 if( !srcformat || !srcfile || !dstformat || !dstfile ) {
570 fprintf(stderr, "too few argumets to make conversion\n");
571 fprintf(stderr, "try --help\n");
575 if( !strcasecmp(srcformat, dstformat) ) {
576 printf( "input and output formats are the same\n"
585 switch( import_file(srcformat, srcfile) ) {
588 "input format %s not supported\n", srcformat);
592 fprintf(stderr, "cannot read file %s\n", srcfile);
598 switch( export_file(dstformat, dstfile) ) {
601 "output format %s not supported\n",
607 "cannot write file %s\n", dstfile);
618 * --add-email handling
621 static int add_email_count = 0;
626 if(add_email_count > 0) {
627 if(save_database() < 0) {
628 fprintf(stderr, "cannot open %s\n", datafile);
631 printf("%d item(s) added to %s\n", add_email_count, datafile);
633 puts("Valid sender address not found");
640 quit_add_email_sig(int signal)
649 atexit(free_filenames);
651 atexit(close_config);
654 * we don't actually care if loading fails or not
656 load_database(datafile);
658 atexit(close_database);
660 signal(SIGINT, quit_add_email_sig);
664 add_email_add_item(int quiet, char *name, char *email)
669 FILE *in = fopen("/dev/tty", "r");
672 fprintf(stderr, "cannot open /dev/tty\n"
673 "you may want to use --add-email-quiet\n");
676 printf("Add ``%s <%s>'' to %s ? (y/n)\n",
683 if(c == 'n' || c == 'N') {
687 } while(c != 'y' && c != 'Y');
691 memset(item, 0, sizeof(item));
692 item[NAME] = strdup(name);
693 item[EMAIL] = strdup(email);
694 add_item2database(item);
703 char *name = NULL, *email = NULL;
708 line = getaline(stdin);
709 if(line && !strncasecmp("From:", line, 5) ) {
710 getname(line, &name, &email);
711 add_email_count += add_email_add_item(quiet,
717 } while( !feof(stdin) );
723 * end of --add-email handling