/** * Exit just handles all the signals and exiting of the * program by freeing the allocated memory and writing * the dead.letter if we had a sudden interrupt... **/ void properExit(int sig) { if (sig != 0 && global_msg) { deadLetter(); } dsbDestroy(global_msg); /* Free lists */ if (Mopts.attach) { dlDestroy(Mopts.attach); } if (Mopts.headers) { dlDestroy(Mopts.headers); } if (Mopts.to) { dlDestroy(Mopts.to); } if (Mopts.cc) { dlDestroy(Mopts.cc); } if (Mopts.bcc) { dlDestroy(Mopts.bcc); } dhDestroy(table); exit(sig); }
/** * 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); } }