/** * this is the function that takes over from main(). * It will call all functions nessicary to finish off the * rest of the program and then return properly. **/ void createMail(void) { dstrbuf *msg=NULL, *full_msg=NULL; char subject[MAXBUF]={0}; /** * first let's check if someone has tried to send stuff in from STDIN * if they have, let's call a read to stdin */ if (isatty(STDIN_FILENO) == 0) { msg = readInput(); if (!msg) { fatal("Problem reading from STDIN redirect\n"); properExit(ERROR); } } else { /* If they aren't sending a blank email */ if (!Mopts.blank) { /* let's check if they want to add a subject or not */ if (Mopts.subject == NULL) { fprintf(stderr, "Subject: "); fgets(subject, sizeof(subject)-1, stdin); chomp(subject); Mopts.subject = subject; } /* Now we need to let them create a file */ msg = editEmail(); if (!msg) { properExit(ERROR); } } else { /* Create a blank message */ msg = DSB_NEW; } } /* Create a message according to the type */ if (Mopts.gpg_opts) { full_msg = createGpgEmail(msg, Mopts.gpg_opts); } else { full_msg = createPlainEmail(msg); } if (!full_msg) { deadLetter(msg); dsbDestroy(msg); properExit(ERROR); } dsbDestroy(msg); int retsend = sendmail(full_msg); dsbDestroy(full_msg); if (retsend == ERROR) { properExit(ERROR); } }
/** * ModuleUsage will take an argument for the specified * module and print out help information on the topic. * information is stored in a written file in the location * in Macro EMAIL_DIR. and also specified with EMAIL_HELP_FILE */ static void moduleUsage(const char *module) { FILE *help=NULL; short found=0; char *moduleptr=NULL; dstrbuf *buf = DSB_NEW; dstrbuf *help_file = expandPath(EMAIL_HELP_FILE); if (!(help = fopen(help_file->str, "r"))) { fatal("Could not open help file: %s", help_file->str); dsbDestroy(help_file); properExit(ERROR); } dsbDestroy(help_file); while (!feof(help)) { dsbReadline(buf, help); if ((buf->str[0] == '#') || (buf->str[0] == '\n')) { continue; } chomp(buf->str); moduleptr = strtok(buf->str, "|"); if (strcasecmp(moduleptr, module) != 0) { while ((moduleptr = strtok(NULL, "|")) != NULL) { if (strcasecmp(moduleptr, module) == 0) { found = 1; break; } } } else { found = 1; } if (!found) { continue; } while (!feof(help)) { dsbReadline(buf, help); if (!strcmp(buf->str, "EOH\n")) { break; } printf("%s", buf->str); } break; } if (feof(help)) { printf("There is no help in the module: %s\n", module); usage(); } dsbDestroy(buf); fclose(help); exit(0); }
int main(int argc, char **argv) { int get; int opt_index = 0; /* for getopt */ char *cc_string = NULL; char *bcc_string = NULL; const char *opts = "f:n:a:p:oVedvtb?c:s:r:u:i:g:m:H:x:"; /* Set certian global options to NULL */ conf_file = NULL; memset(&Mopts, 0, sizeof(struct mailer_options)); Mopts.encoding = true; /* Check if they need help */ if ((argc > 1) && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "-help") || !strcmp(argv[1], "--help"))) { if (argc == 3) { moduleUsage(argv[2]); } else if (argc == 2) { usage(); } else { fprintf(stderr, "Only specify one option with %s: \n", argv[1]); usage(); } } table = dhInit(28, defaultDestr); if (!table) { fprintf(stderr, "ERROR: Could not initialize Hash table.\n"); exit(0); } while ((get = getopt_long_only(argc, argv, opts, Gopts, &opt_index)) > EOF) { switch (get) { case 'n': setConfValue("MY_NAME", xstrdup(optarg)); break; case 'f': setConfValue("MY_EMAIL", xstrdup(optarg)); break; case 'a': if (!Mopts.attach) { Mopts.attach = dlInit(defaultDestr); } dlInsertTop(Mopts.attach, xstrdup(optarg)); break; case 'V': Mopts.verbose = true; break; case 'p': setConfValue("SMTP_PORT", xstrdup(optarg)); break; case 'o': Mopts.priority = 1; break; case 'e': Mopts.gpg_opts |= GPG_ENC; break; case 's': Mopts.subject = optarg; break; case 'r': setConfValue("SMTP_SERVER", xstrdup(optarg)); break; case 'c': conf_file = optarg; break; case 't': checkConfig(); printf("Configuration file is proper.\n"); dhDestroy(table); return (0); break; case 'v': printf("email - By Dean Jones; Version %s\n", EMAIL_VERSION); dhDestroy(table); exit(EXIT_SUCCESS); break; case 'b': Mopts.blank = 1; break; case 'u': setConfValue("SMTP_AUTH_USER", xstrdup(optarg)); break; case 'i': setConfValue("SMTP_AUTH_PASS", xstrdup(optarg)); break; case 'm': setConfValue("SMTP_AUTH", xstrdup(optarg)); break; case 'g': setConfValue("GPG_PASS", xstrdup(optarg)); break; case 'H': if (!Mopts.headers) { Mopts.headers = dlInit(defaultDestr); } dlInsertTop(Mopts.headers, xstrdup(optarg)); break; case 'x': setConfValue("TIMEOUT", xstrdup(optarg)); break; case '?': usage(); break; case 1: Mopts.html = 1; break; case 2: Mopts.gpg_opts |= GPG_SIG; break; case 3: cc_string = optarg; break; case 4: bcc_string = optarg; break; case 5: /* To name? */ break; case 6: setConfValue("USE_TLS", xstrdup("true")); break; case 7: Mopts.encoding = false; break; default: /* Print an error message here */ usage(); break; } } /* first let's check to make sure they specified some recipients */ if (optind == argc) { usage(); } configure(); /* Check to see if we need to attach a vcard. */ if (getConfValue("VCARD")) { dstrbuf *vcard = expandPath(getConfValue("VCARD")); if (!Mopts.attach) { Mopts.attach = dlInit(defaultDestr); } dlInsertTop(Mopts.attach, xstrdup(vcard->str)); dsbDestroy(vcard); } /* set to addresses if argc is > 1 */ if (!(Mopts.to = getNames(argv[optind]))) { fatal("You must specify at least one recipient!\n"); properExit(ERROR); } /* Set CC and BCC addresses */ if (cc_string) { Mopts.cc = getNames(cc_string); } if (bcc_string) { Mopts.bcc = getNames(bcc_string); } signal(SIGTERM, properExit); signal(SIGINT, properExit); signal(SIGPIPE, properExit); signal(SIGHUP, properExit); signal(SIGQUIT, properExit); createMail(); properExit(0); /* We never get here, but gcc will whine if i don't return something */ return 0; }