diff options
| -rw-r--r-- | FICS/utils.c | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/FICS/utils.c b/FICS/utils.c index 530b9e7..2f891ac 100644 --- a/FICS/utils.c +++ b/FICS/utils.c @@ -269,35 +269,52 @@ mail_string_to_user(int p, char *subj, char *str) PUBLIC int mail_file_to_address(char *addr, char *subj, char *fname) { - FILE *fp1, *fp2; + FILE *fp[2] = { NULL, NULL }; char com[1000] = { '\0' }; char tmp[MAX_LINE_SIZE] = { '\0' }; + int ret; /* maybe unused */ - (void) fp2; (void) tmp; #ifdef SENDMAILPROG - snprintf(com, sizeof com, "%s %s\n", SENDMAILPROG, SENDMAILPROG_ARGS); + ret = snprintf(com, sizeof com, "%s %s\n", SENDMAILPROG, + SENDMAILPROG_ARGS); #else - snprintf(com, sizeof com, "%s -s \"%s\" %s < %s&", MAILPROGRAM, subj, - addr, fname); + ret = snprintf(com, sizeof com, "%s -s \"%s\" %s < %s&", MAILPROGRAM, + subj, addr, fname); #endif - if ((fp1 = popen(com, "w")) == NULL) + + if (ret < 0 || (size_t)ret >= sizeof com) { + warnx("%s: command too long", __func__); + return -1; + } + + if ((fp[0] = popen(com, "w")) == NULL) return -1; + #ifdef SENDMAILPROG - if ((fp2 = fopen(fname, "r")) == NULL) { - pclose(fp1); + if ((fp[1] = fopen(fname, "r")) == NULL) { + (void) pclose(fp[0]); return -1; } - fprintf(fp1, "To: %s\nSubject: %s\n", addr, subj); + ret = fprintf(fp[0], "To: %s\nSubject: %s\n", addr, subj); + + if (ret < 0) + warnx("%s: fprintf() error", __func__); + + while (fgets(tmp, sizeof tmp, fp[1]) != NULL && + fputs(tmp, fp[0]) != EOF) { + /* null */; + } - while (fgets(tmp, sizeof tmp, fp2) != NULL && !feof(fp2)) - fputs(tmp, fp1); - fclose(fp2); + if (fclose(fp[1]) != 0) + warn("%s: fclose() error", __func__); #endif - pclose(fp1); + + if (pclose(fp[0]) == -1) + warn("%s: pclose() error", __func__); return 0; } |
