X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fwhatnowsbr.c;h=a5f8839906f20742134f1998ad00b6ecfa56a20b;hp=f8b7223b1d8d21a3c4b0dfa4925d11b4c9333e4b;hb=240013872c392fe644bd4f79382d9f5314b4ea60;hpb=337338b404931f06f0db2119c9e145e8ca5a9860 diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index f8b7223..a5f8839 100644 --- a/uip/whatnowsbr.c +++ b/uip/whatnowsbr.c @@ -1,41 +1,41 @@ /* - * whatnowsbr.c -- the WhatNow shell - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - * - * Several options have been added to ease the inclusion of attachments - * using the header field name mechanism added to anno and send. The - * -attach option is used to specify the header field name for attachments. - * - * Several commands have been added at the whatnow prompt: - * - * cd [ directory ] This option works just like the shell's - * cd command and lets the user change the - * directory from which attachments are - * taken so that long path names are not - * needed with every file. - * - * ls [ ls-options ] This option works just like the normal - * ls command and exists to allow the user - * to verify file names in the directory. - * - * pwd This option works just like the normal - * pwd command and exists to allow the user - * to verify the directory. - * - * attach files This option attaches the named files to - * the draft. - * - * alist [-ln] This option lists the attachments on the - * draft. -l gets long listings, -n gets - * numbered listings. - * - * detach files This option removes attachments from the - * detach -n numbers draft. This can be done by file name or - * by attachment number. - */ +** whatnowsbr.c -- the WhatNow shell +** +** This code is Copyright (c) 2002, by the authors of nmh. See the +** COPYRIGHT file in the root directory of the nmh distribution for +** complete copyright information. +** +** Several options have been added to ease the inclusion of attachments +** using the header field name mechanism added to anno and send. The +** -attach option is used to specify the header field name for attachments. +** +** Several commands have been added at the whatnow prompt: +** +** cd [ directory ] This option works just like the shell's +** cd command and lets the user change the +** directory from which attachments are +** taken so that long path names are not +** needed with every file. +** +** ls [ ls-options ] This option works just like the normal +** ls command and exists to allow the user +** to verify file names in the directory. +** +** pwd This option works just like the normal +** pwd command and exists to allow the user +** to verify the directory. +** +** attach files This option attaches the named files to +** the draft. +** +** alist [-ln] This option lists the attachments on the +** draft. -l gets long listings, -n gets +** numbered listings. +** +** detach files This option removes attachments from the +** detach -n numbers draft. This can be done by file name or +** by attachment number. +*/ #include #include @@ -60,8 +60,8 @@ static struct swit whatnowswitches[] = { }; /* - * Options at the "whatnow" prompt - */ +** Options at the "whatnow" prompt +*/ static struct swit aleqs[] = { #define EDITSW 0 { "edit [ ]", 0 }, @@ -99,15 +99,15 @@ static struct swit aleqs[] = { static char *myprompt = "\nWhat now? "; /* - * static prototypes - */ -static int editfile (char **, char **, char *, int, struct msgs *, +** static prototypes +*/ +static int editfile(char **, char **, char *, int, struct msgs *, char *, char *, int); -static int sendfile (char **, char *, int); -static void sendit (char *, char **, char *, int); -static int buildfile (char **, char *); -static int check_draft (char *); -static int removefile (char *); +static int sendfile(char **, char *, int); +static void sendit(char *, char **, char *, int); +static int buildfile(char **, char *); +static int check_draft(char *); +static int removefile(char *); static void writelscmd(char *, int, char **); static void writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp); static FILE* popen_in_dir(const char *dir, const char *cmd, const char *type); @@ -115,12 +115,12 @@ static int system_in_dir(const char *dir, const char *cmd); #ifdef HAVE_LSTAT -static int copyf (char *, char *); +static int copyf(char *, char *); #endif int -WhatNow (int argc, char **argv) +WhatNow(int argc, char **argv) { int nedit = 0, use = 0; char *cp; @@ -136,17 +136,17 @@ WhatNow (int argc, char **argv) char *l; /* set on -l to alist command */ int n; /* set on -n to alist command */ - invo_name = r1bindex (argv[0], '/'); + invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); - arguments = getarguments (invo_name, argc, argv, 1); + arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* - * Get the initial current working directory. - */ + ** Get the initial current working directory. + */ if (getcwd(cwd, sizeof (cwd)) == (char *)0) { adios("getcwd", "could not get working directory"); @@ -154,24 +154,27 @@ WhatNow (int argc, char **argv) while ((cp = *argp++)) { if (*cp == '-') { - switch (smatch (++cp, whatnowswitches)) { + switch (smatch(++cp, whatnowswitches)) { case AMBIGSW: - ambigsw (cp, whatnowswitches); - done (1); + ambigsw(cp, whatnowswitches); + done(1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + adios(NULL, "-%s unknown", cp); case HELPSW: - snprintf (buf, sizeof(buf), "%s [switches] [file]", invo_name); - print_help (buf, whatnowswitches, 1); - done (1); + snprintf(buf, sizeof(buf), + "%s [switches] [file]", + invo_name); + print_help(buf, whatnowswitches, 1); + done(1); case VERSIONSW: print_version(invo_name); - done (1); + done(1); case EDITRSW: if (!(ed = *argp++) || *ed == '-') - adios (NULL, "missing argument to %s", argp[-2]); + adios(NULL, "missing argument to %s", + argp[-2]); nedit = 0; continue; case NEDITSW: @@ -180,115 +183,122 @@ WhatNow (int argc, char **argv) case PRMPTSW: if (!(myprompt = *argp++) || *myprompt == '-') - adios (NULL, "missing argument to %s", argp[-2]); + adios(NULL, "missing argument to %s", + argp[-2]); continue; case ATTACHSW: if (attach != (char *)0) adios(NULL, "only one attachment header field name at a time!"); if (!(attach = *argp++) || *attach == '-') - adios (NULL, "missing argument to %s", argp[-2]); + adios(NULL, "missing argument to %s", + argp[-2]); continue; } } if (drft) - adios (NULL, "only one draft at a time!"); + adios(NULL, "only one draft at a time!"); else drft = cp; } - if ((drft == NULL && (drft = getenv ("mhdraft")) == NULL) || *drft == 0) - drft = getcpy (m_draft("cur")); + if ((drft == NULL && (drft = getenv("mhdraft")) == NULL) || *drft == 0) + drft = getcpy(m_draft("cur")); - msgnam = (cp = getenv ("mhaltmsg")) && *cp ? getcpy (cp) : NULL; + msgnam = (cp = getenv("mhaltmsg")) && *cp ? getcpy(cp) : NULL; - if ((cp = getenv ("mhuse")) && *cp) - use = atoi (cp); + if ((cp = getenv("mhuse")) && *cp) + use = atoi(cp); - if (ed == NULL && ((ed = getenv ("mheditor")) == NULL || *ed == 0)) { + if (ed == NULL && ((ed = getenv("mheditor")) == NULL || *ed == 0)) { ed = NULL; nedit++; } /* start editing the draft, unless -noedit was given */ - if (!nedit && editfile (&ed, NULL, drft, use, NULL, msgnam, NULL, 1) < 0) - done (1); + if (!nedit && editfile(&ed, NULL, drft, use, NULL, msgnam, NULL, 1) + < 0) + done(1); - snprintf (prompt, sizeof(prompt), myprompt, invo_name); + snprintf(prompt, sizeof(prompt), myprompt, invo_name); for (;;) { - if (!(argp = getans (prompt, aleqs))) { - unlink (altmsglink); - done (1); + if (!(argp = getans(prompt, aleqs))) { + unlink(altmsglink); + done(1); } - switch (smatch (*argp, aleqs)) { + switch (smatch(*argp, aleqs)) { case DISPSW: - /* display the message being replied to, or distributed */ + /* + ** display the message being replied to, + ** or distributed + */ if (msgnam) - showfile (++argp, msgnam); + showfile(++argp, msgnam); else - advise (NULL, "no alternate message to display"); + advise(NULL, "no alternate message to display"); break; case BUILDMIMESW: /* Translate MIME composition file */ - buildfile (++argp, drft); + buildfile(++argp, drft); break; case EDITSW: /* Call an editor on the draft file */ if (*++argp) ed = *argp++; - if (editfile (&ed, argp, drft, NOUSE, NULL, msgnam, NULL, 1) == NOTOK) - done (1); + if (editfile(&ed, argp, drft, NOUSE, NULL, + msgnam, NULL, 1) == NOTOK) + done(1); break; case LISTSW: /* display the draft file */ - showfile (++argp, drft); + showfile(++argp, drft); break; case QUITSW: /* Quit, and possibly delete the draft */ if (*++argp && (*argp[0] == 'd' || ((*argp)[0] == '-' && (*argp)[1] == 'd'))) { - removefile (drft); + removefile(drft); } else { - if (stat (drft, &st) != NOTOK) - advise (NULL, "draft left on %s", drft); + if (stat(drft, &st) != NOTOK) + advise(NULL, "draft left on %s", drft); } - done (1); + done(1); case DELETESW: /* Delete draft and exit */ - removefile (drft); - done (1); + removefile(drft); + done(1); case PUSHSW: /* Send draft in background */ - if (sendfile (++argp, drft, 1)) - done (1); + if (sendfile(++argp, drft, 1)) + done(1); break; case SENDSW: /* Send draft */ - sendfile (++argp, drft, 0); + sendfile(++argp, drft, 0); break; case REFILEOPT: /* Refile the draft */ - if (refile (++argp, drft) == 0) - done (0); + if (refile(++argp, drft) == 0) + done(0); break; case CDCMDSW: /* - * Change the working directory for attachments - * - * Run the directory through the user's shell - * so that we can take advantage of any syntax - * that the user is accustomed to. Read back - * the absolute path. - */ + ** Change the working directory for attachments + ** + ** Run the directory through the user's shell + ** so that we can take advantage of any syntax + ** that the user is accustomed to. Read back + ** the absolute path. + */ if (*(argp+1) == (char *)0) { (void)sprintf(buf, "$SHELL -c \"cd;pwd\""); @@ -315,24 +325,24 @@ WhatNow (int argc, char **argv) case LSCMDSW: /* - * List files in the current attachment working - * directory - * - * Use the user's shell so that we can take - * advantage of any syntax that the user is - * accustomed to. - */ + ** List files in the current attachment working + ** directory + ** + ** Use the user's shell so that we can take + ** advantage of any syntax that the user is + ** accustomed to. + */ writelscmd(buf, sizeof(buf), argp); (void)system_in_dir(cwd, buf); break; case ALISTCMDSW: /* - * List attachments on current draft. Options are: - * - * -l long listing (full path names) - * -n numbers listing - */ + ** List attachments on current draft. Options are: + ** + ** -l long listing (full path names) + ** -n numbers listing + */ if (attach == (char *)0) { advise((char *)0, "can't list because no header field name was given."); @@ -349,7 +359,8 @@ WhatNow (int argc, char **argv) else if (strcmp(*argp, "-n") == 0) n = 1; - else if (strcmp(*argp, "-ln") == 0 || strcmp(*argp, "-nl") == 0) { + else if (strcmp(*argp, "-ln") == 0 || + strcmp(*argp, "-nl") == 0) { l = "/"; n = 1; } else { @@ -368,8 +379,8 @@ WhatNow (int argc, char **argv) case ATTACHCMDSW: /* - * Attach files to current draft. - */ + ** Attach files to current draft. + */ if (attach == (char *)0) { advise((char *)0, "can't attach because no header field name was given."); @@ -382,32 +393,36 @@ WhatNow (int argc, char **argv) } /* - * Build a command line that causes the user's - * shell to list the file name arguments. - * This handles and wildcard expansion, tilde - * expansion, etc. - */ + ** Build a command line that causes the user's + ** shell to list the file name arguments. + ** This handles and wildcard expansion, tilde + ** expansion, etc. + */ writelscmd(buf, sizeof(buf), argp); /* - * Read back the response from the shell, - * which contains a number of lines with one - * file name per line. Remove off the newline. - * Determine whether we have an absolute or - * relative path name. Prepend the current - * working directory to relative path names. - * Add the attachment annotation to the draft. - */ + ** Read back the response from the shell, + ** which contains a number of lines with one + ** file name per line. Remove off the newline. + ** Determine whether we have an absolute or + ** relative path name. Prepend the current + ** working directory to relative path names. + ** Add the attachment annotation to the draft. + */ if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { - while (fgets(shell, sizeof (shell), f) != (char *)0) { + while (fgets(shell, sizeof (shell), f) + != (char *)0) { *(strchr(shell, '\n')) = '\0'; if (*shell == '/') - (void)annotate(drft, attach, shell, 1, 0, -2, 1); + annotate(drft, attach, shell, + 1, 0, -2, 1); else { - (void)sprintf(file, "%s/%s", cwd, shell); - (void)annotate(drft, attach, file, 1, 0, -2, 1); + sprintf(file, "%s/%s", cwd, + shell); + annotate(drft, attach, file, + 1, 0, -2, 1); } } @@ -420,8 +435,8 @@ WhatNow (int argc, char **argv) case DETACHCMDSW: /* - * Detach files from current draft. - */ + ** Detach files from current draft. + */ if (attach == (char *)0) { advise((char *)0, "can't detach because no header field name was given."); @@ -429,12 +444,14 @@ WhatNow (int argc, char **argv) } /* - * Scan the arguments for a -n. Mixed file - * names and numbers aren't allowed, so this - * catches a -n anywhere in the argument list. - */ - - for (n = 0, arguments = argp + 1; *arguments != (char *)0; arguments++) { + ** Scan the arguments for a -n. Mixed file + ** names and numbers aren't allowed, so this + ** catches a -n anywhere in the argument list. + */ + + for (n = 0, arguments = argp + 1; + *arguments != (char *)0; + arguments++) { if (strcmp(*arguments, "-n") == 0) { n = 1; break; @@ -442,21 +459,24 @@ WhatNow (int argc, char **argv) } /* - * A -n was found so interpret the arguments as - * attachment numbers. Decrement any remaining - * argument number that is greater than the one - * just processed after processing each one so - * that the numbering stays correct. - */ + ** A -n was found so interpret the arguments as + ** attachment numbers. Decrement any remaining + ** argument number that is greater than the one + ** just processed after processing each one so + ** that the numbering stays correct. + */ if (n == 1) { - for (arguments = argp + 1; *arguments != (char *)0; arguments++) { + for (arguments = argp + 1; + *arguments != (char *)0; + arguments++) { if (strcmp(*arguments, "-n") == 0) continue; if (**arguments != '\0') { n = atoi(*arguments); - (void)annotate(drft, attach, (char *)0, 1, 0, n, 1); + annotate(drft, attach, NULL, + 1, 0, n, 1); for (argp = arguments + 1; *argp != (char *)0; argp++) { if (atoi(*argp) > n) { @@ -471,22 +491,24 @@ WhatNow (int argc, char **argv) } /* - * The arguments are interpreted as file names. - * Run them through the user's shell for wildcard - * expansion and other goodies. Do this from - * the current working directory if the argument - * is not an absolute path name (does not begin - * with a /). - * - * We feed all the file names to the shell at - * once, otherwise you can't provide a file name - * with a space in it. - */ + ** The arguments are interpreted as file names. + ** Run them through the user's shell for wildcard + ** expansion and other goodies. Do this from + ** the current working directory if the argument + ** is not an absolute path name (does not begin + ** with a /). + ** + ** We feed all the file names to the shell at + ** once, otherwise you can't provide a file name + ** with a space in it. + */ writelscmd(buf, sizeof(buf), argp); if ((f = popen_in_dir(cwd, buf, "r")) != (FILE *)0) { - while (fgets(shell, sizeof (shell), f) != (char *)0) { + while (fgets(shell, sizeof (shell), f) + != NULL) { *(strchr(shell, '\n')) = '\0'; - (void)annotate(drft, attach, shell, 1, 0, 0, 1); + annotate(drft, attach, shell, + 1, 0, 0, 1); } pclose(f); } else { @@ -497,7 +519,7 @@ WhatNow (int argc, char **argv) default: /* Unknown command */ - advise (NULL, "say what?"); + advise(NULL, "say what?"); break; } } @@ -507,27 +529,30 @@ WhatNow (int argc, char **argv) /* - * Build a command line of the form $SHELL -c "cd 'cwd'; cmd argp ... ; - * trailcmd". - */ +** Build a command line of the form $SHELL -c "cd 'cwd'; cmd argp ... ; +** trailcmd". +*/ static void writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp) { char *cp; - /* Note that we do not quote -- the argp from the user - * is assumed to be quoted as they desire. (We can't treat - * it as pure literal as that would prevent them using ~, - * wildcards, etc.) The buffer produced by this function - * should be given to popen_in_dir() or system_in_dir() so - * that the current working directory is set correctly. - */ + /* + ** Note that we do not quote -- the argp from the user + ** is assumed to be quoted as they desire. (We can't treat + ** it as pure literal as that would prevent them using ~, + ** wildcards, etc.) The buffer produced by this function + ** should be given to popen_in_dir() or system_in_dir() so + ** that the current working directory is set correctly. + */ int ln = snprintf(buf, bufsz, "$SHELL -c \"%s", cmd); - /* NB that some snprintf() return -1 on overflow rather than the - * new C99 mandated 'number of chars that would have been written' - */ - /* length checks here and inside the loop allow for the - * trailing ';', trailcmd, '"' and NUL - */ + /* + ** NB that some snprintf() return -1 on overflow rather than the + ** new C99 mandated 'number of chars that would have been written' + */ + /* + ** length checks here and inside the loop allow for the + ** trailing ';', trailcmd, '"' and NUL + */ int trailln = strlen(trailcmd) + 3; if (ln < 0 || ln + trailln > bufsz) adios((char *)0, "arguments too long"); @@ -553,18 +578,19 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp) } /* - * Build a command line that causes the user's shell to list the file name - * arguments. This handles and wildcard expansion, tilde expansion, etc. - */ +** Build a command line that causes the user's shell to list the file name +** arguments. This handles and wildcard expansion, tilde expansion, etc. +*/ static void writelscmd(char *buf, int bufsz, char **argp) { writesomecmd(buf, bufsz, "ls", "", argp); } -/* Like system(), but run the command in directory dir. - * This assumes the program is single-threaded! - */ +/* +** Like system(), but run the command in directory dir. +** This assumes the program is single-threaded! +*/ static int system_in_dir(const char *dir, const char *cmd) { @@ -598,15 +624,15 @@ popen_in_dir(const char *dir, const char *cmd, const char *type) /* - * EDIT - */ +** EDIT +*/ static int reedit = 0; /* have we been here before? */ static char *edsave = NULL; /* the editor we used previously */ static int -editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, +editfile(char **ed, char **arg, char *file, int use, struct msgs *mp, char *altmsg, char *cwd, int save_editor) { int pid, status, vecp; @@ -625,40 +651,43 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, if (reedit) { if (!*ed) { /* no explicit editor */ *ed = edsave; /* so use the previous one */ - if ((cp = r1bindex (*ed, '/')) == NULL) + if ((cp = mhbasename(*ed)) == NULL) cp = *ed; /* unless we've specified it via "editor-next" */ - cp = concat (cp, "-next", NULL); - if ((cp = context_find (cp)) != NULL) + cp = concat(cp, "-next", NULL); + if ((cp = context_find(cp)) != NULL) *ed = cp; } } else { /* set initial editor */ - if (*ed == NULL && (*ed = context_find ("editor")) == NULL) + if (*ed == NULL && (*ed = context_find("editor")) == NULL) *ed = defaulteditor; } if (altmsg) { if (mp == NULL || *altmsg == '/' || cwd == NULL) - strncpy (altpath, altmsg, sizeof(altpath)); + strncpy(altpath, altmsg, sizeof(altpath)); else - snprintf (altpath, sizeof(altpath), "%s/%s", mp->foldpath, altmsg); + snprintf(altpath, sizeof(altpath), "%s/%s", + mp->foldpath, altmsg); if (cwd == NULL) - strncpy (linkpath, altmsglink, sizeof(linkpath)); + strncpy(linkpath, altmsglink, sizeof(linkpath)); else - snprintf (linkpath, sizeof(linkpath), "%s/%s", cwd, altmsglink); + snprintf(linkpath, sizeof(linkpath), "%s/%s", + cwd, altmsglink); } if (altmsg) { - unlink (linkpath); + unlink(linkpath); #ifdef HAVE_LSTAT - if (link (altpath, linkpath) == NOTOK) { + if (link(altpath, linkpath) == NOTOK) { #if 0 /* I don't think permission on symlinks matters /JLR */ - oumask = umask(0044); /* PJS: else symlinks are world 'r' */ + /* PJS: else symlinks are world 'r' */ + oumask = umask(0044); #endif - symlink (altpath, linkpath); + symlink(altpath, linkpath); #if 0 umask(oumask); /* PJS: else symlinks are world 'r' */ #endif @@ -667,57 +696,56 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, slinked = 0; } #else /* not HAVE_LSTAT */ - link (altpath, linkpath); + link(altpath, linkpath); #endif /* not HAVE_LSTAT */ } - context_save (); /* save the context file */ - fflush (stdout); + context_save(); /* save the context file */ + fflush(stdout); - switch (pid = vfork ()) { + switch (pid = vfork()) { case NOTOK: - advise ("fork", "unable to"); + advise("fork", "unable to"); status = NOTOK; break; case OK: if (cwd) - chdir (cwd); + chdir(cwd); if (altmsg) { if (mp) - m_putenv ("mhfolder", mp->foldpath); - m_putenv ("editalt", altpath); + m_putenv("mhfolder", mp->foldpath); + m_putenv("editalt", altpath); } vecp = 0; - vec[vecp++] = r1bindex (*ed, '/'); + vec[vecp++] = mhbasename(*ed); if (arg) while (*arg) vec[vecp++] = *arg++; vec[vecp++] = file; vec[vecp] = NULL; - execvp (*ed, vec); - fprintf (stderr, "unable to exec "); - perror (*ed); - _exit (-1); + execvp(*ed, vec); + fprintf(stderr, "unable to exec "); + perror(*ed); + _exit(-1); default: - if ((status = pidwait (pid, NOTOK))) { + if ((status = pidwait(pid, NOTOK))) { #ifdef ATTVIBUG - if ((cp = r1bindex (*ed, '/')) - && strcmp (cp, "vi") == 0 - && (status & 0x00ff) == 0) + if ((cp = mhbasename(*ed)) && + strcmp(cp, "vi") == 0 && + (status & 0x00ff) == 0) status = 0; else { #endif if (((status & 0xff00) != 0xff00) && (!reedit || (status & 0x00ff))) { - if (!use && (status & 0xff00) && - (rename (file, cp = m_backup (file)) != NOTOK)) { - advise (NULL, "problems with edit--draft left in %s", cp); + if (!use && (status & 0xff00) && (rename(file, cp = m_backup (file)) != NOTOK)) { + advise(NULL, "problems with edit--draft left in %s", cp); } else { - advise (NULL, "problems with edit--%s preserved", file); + advise(NULL, "problems with edit--%s preserved", file); } } status = -2; /* maybe "reedit ? -2 : -1"? */ @@ -729,37 +757,33 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, reedit++; #ifdef HAVE_LSTAT - if (altmsg - && mp - && !is_readonly(mp) - && (slinked - ? lstat (linkpath, &st) != NOTOK - && S_ISREG(st.st_mode) - && copyf (linkpath, altpath) == NOTOK - : stat (linkpath, &st) != NOTOK - && st.st_nlink == 1 - && (unlink (altpath) == NOTOK - || link (linkpath, altpath) == NOTOK))) - advise (linkpath, "unable to update %s from", altmsg); + if (altmsg && mp && !is_readonly(mp) && (slinked ? + lstat (linkpath, &st) != NOTOK && + S_ISREG(st.st_mode) && + copyf(linkpath, altpath) == NOTOK : + stat(linkpath, &st) != NOTOK && + st.st_nlink == 1 && + (unlink(altpath) == NOTOK || + link(linkpath, altpath) == NOTOK))) + advise(linkpath, "unable to update %s from", altmsg); #else /* HAVE_LSTAT */ - if (altmsg - && mp - && !is_readonly(mp) - && stat (linkpath, &st) != NOTOK - && st.st_nlink == 1 - && (unlink (altpath) == NOTOK - || link (linkpath, altpath) == NOTOK)) - advise (linkpath, "unable to update %s from", altmsg); + if (altmsg && mp && !is_readonly(mp) && + stat(linkpath, &st) != NOTOK && + st.st_nlink == 1 && + (unlink(altpath) == NOTOK || + link(linkpath, altpath) == NOTOK)) + advise(linkpath, "unable to update %s from", + altmsg); #endif /* HAVE_LSTAT */ } /* normally, we remember which editor we used */ if (save_editor) - edsave = getcpy (*ed); + edsave = getcpy(*ed); *ed = NULL; if (altmsg) - unlink (linkpath); + unlink(linkpath); return status; } @@ -767,78 +791,75 @@ editfile (char **ed, char **arg, char *file, int use, struct msgs *mp, #ifdef HAVE_LSTAT static int -copyf (char *ifile, char *ofile) +copyf(char *ifile, char *ofile) { int i, in, out; char buffer[BUFSIZ]; - if ((in = open (ifile, O_RDONLY)) == NOTOK) + if ((in = open(ifile, O_RDONLY)) == NOTOK) return NOTOK; - if ((out = open (ofile, O_WRONLY | O_TRUNC)) == NOTOK) { - admonish (ofile, "unable to open and truncate"); - close (in); + if ((out = open(ofile, O_WRONLY | O_TRUNC)) == NOTOK) { + admonish(ofile, "unable to open and truncate"); + close(in); return NOTOK; } - while ((i = read (in, buffer, sizeof(buffer))) > OK) - if (write (out, buffer, i) != i) { - advise (ofile, "may have damaged"); + while ((i = read(in, buffer, sizeof(buffer))) > OK) + if (write(out, buffer, i) != i) { + advise(ofile, "may have damaged"); i = NOTOK; break; } - close (in); - close (out); + close(in); + close(out); return i; } #endif /* HAVE_LSTAT */ /* - * SEND - */ +** SEND +*/ static int -sendfile (char **arg, char *file, int pushsw) +sendfile(char **arg, char *file, int pushsw) { pid_t child_id; int i, vecp; char *cp, *sp, *vec[MAXARGS]; /* Translate MIME composition file, if necessary */ - if ((cp = context_find ("automimeproc")) - && (!strcmp (cp, "1")) - && !getenv ("NOMHNPROC") - && check_draft (file) - && (buildfile (NULL, file) == NOTOK)) + if ((cp = context_find("automimeproc")) && (!strcmp(cp, "1")) && + !getenv("NOMHNPROC") && check_draft(file) && + (buildfile(NULL, file) == NOTOK)) return 0; /* For backwards compatibility */ - if ((cp = context_find ("automhnproc")) - && !getenv ("NOMHNPROC") - && check_draft (file) - && (i = editfile (&cp, NULL, file, NOUSE, NULL, NULL, NULL, 0))) + if ((cp = context_find("automhnproc")) && !getenv("NOMHNPROC") + && check_draft(file) && (i = editfile(&cp, NULL, + file, NOUSE, NULL, NULL, NULL, 0))) return 0; /* - * If the sendproc is the nmh command `send', then we call - * those routines directly rather than exec'ing the command. - */ - if (strcmp (sp = r1bindex (sendproc, '/'), "send") == 0) { + ** If the sendproc is the nmh command `send', then we call + ** those routines directly rather than exec'ing the command. + */ + if (strcmp(sp = mhbasename(sendproc), "send") == 0) { cp = invo_name; - sendit (invo_name = sp, arg, file, pushsw); + sendit(invo_name = sp, arg, file, pushsw); invo_name = cp; return 1; } - context_save (); /* save the context file */ - fflush (stdout); + context_save(); /* save the context file */ + fflush(stdout); for (i = 0; (child_id = vfork()) == NOTOK && i < 5; i++) - sleep (5); + sleep(5); switch (child_id) { case NOTOK: - advise (NULL, "unable to fork, so sending directly..."); + advise(NULL, "unable to fork, so sending directly..."); case OK: vecp = 0; vec[vecp++] = invo_name; @@ -850,25 +871,25 @@ sendfile (char **arg, char *file, int pushsw) vec[vecp++] = file; vec[vecp] = NULL; - execvp (sendproc, vec); - fprintf (stderr, "unable to exec "); - perror (sendproc); - _exit (-1); + execvp(sendproc, vec); + fprintf(stderr, "unable to exec "); + perror(sendproc); + _exit(-1); default: if (pidwait(child_id, OK) == 0) - done (0); + done(0); return 1; } } /* - * Translate MIME composition file (call buildmimeproc) - */ +** Translate MIME composition file (call buildmimeproc) +*/ static int -buildfile (char **argp, char *file) +buildfile(char **argp, char *file) { int i; char **args, *ed; @@ -884,11 +905,11 @@ buildfile (char **argp, char *file) args = (char **) mh_xmalloc((i + 2) * sizeof(char *)); /* - * For backward compatibility, we need to add -build - * if we are using mhn as buildmimeproc - */ + ** For backward compatibility, we need to add -build + ** if we are using mhn as buildmimeproc + */ i = 0; - if (strcmp (r1bindex (ed, '/'), "mhn") == 0) + if (strcmp(mhbasename(ed), "mhn") == 0) args[i++] = "-build"; /* copy any other arguments */ @@ -896,42 +917,43 @@ buildfile (char **argp, char *file) args[i++] = *argp++; args[i] = NULL; - i = editfile (&ed, args, file, NOUSE, NULL, NULL, NULL, 0); - free (args); + i = editfile(&ed, args, file, NOUSE, NULL, NULL, NULL, 0); + free(args); return (i ? NOTOK : OK); } /* - * Check if draft is a mhbuild composition file - */ +** Check if draft is a mhbuild composition file +*/ static int -check_draft (char *msgnam) +check_draft(char *msgnam) { int state; char buf[BUFSIZ], name[NAMESZ]; FILE *fp; - if ((fp = fopen (msgnam, "r")) == NULL) + if ((fp = fopen(msgnam, "r")) == NULL) return 0; for (state = FLD;;) - switch (state = m_getfld (state, name, buf, sizeof(buf), fp)) { + switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) { case FLD: case FLDPLUS: case FLDEOF: /* - * If draft already contains any of the - * Content-XXX fields, then assume it already - * been converted. - */ - if (uprf (name, XXX_FIELD_PRF)) { - fclose (fp); + ** If draft already contains any of the + ** Content-XXX fields, then assume it already + ** been converted. + */ + if (uprf(name, XXX_FIELD_PRF)) { + fclose(fp); return 0; } while (state == FLDPLUS) - state = m_getfld (state, name, buf, sizeof(buf), fp); + state = m_getfld(state, name, buf, + sizeof(buf), fp); break; case BODY: @@ -940,16 +962,17 @@ check_draft (char *msgnam) for (bp = buf; *bp; bp++) if (*bp != ' ' && *bp != '\t' && *bp != '\n') { - fclose (fp); + fclose(fp); return 1; } - state = m_getfld (state, name, buf, sizeof(buf), fp); + state = m_getfld(state, name, buf, + sizeof(buf), fp); } while (state == BODY); /* and fall... */ default: - fclose (fp); + fclose(fp); return 0; } } @@ -1043,15 +1066,14 @@ extern char *distfile; static void -sendit (char *sp, char **arg, char *file, int pushed) +sendit(char *sp, char **arg, char *file, int pushed) { int vecp, n = 1; char *cp, buf[BUFSIZ], **argp; char **arguments, *vec[MAXARGS]; struct stat st; char *attach = (char *)0; /* attachment header field name */ - int attachformat = 0; /* mhbuild format specifier for - attachments */ + int attachformat = 0; /* mhbuild format specifier for attachments */ #ifndef lint int distsw = 0; @@ -1061,35 +1083,35 @@ sendit (char *sp, char **arg, char *file, int pushed) #endif /* - * Make sure these are defined. In particular, we need - * vec[1] to be NULL, in case "arg" is NULL below. It - * doesn't matter what is the value of vec[0], but we - * set it to NULL, to help catch "off-by-one" errors. - */ + ** Make sure these are defined. In particular, we need + ** vec[1] to be NULL, in case "arg" is NULL below. It + ** doesn't matter what is the value of vec[0], but we + ** set it to NULL, to help catch "off-by-one" errors. + */ vec[0] = NULL; vec[1] = NULL; /* - * Temporarily copy arg to vec, since the brkstring() call in - * getarguments() will wipe it out before it is merged in. - * Also, we skip the first element of vec, since getarguments() - * skips it. Then we count the number of arguments - * copied. The value of "n" will be one greater than - * this in order to simulate the standard argc/argv. - */ + ** Temporarily copy arg to vec, since the brkstring() call in + ** getarguments() will wipe it out before it is merged in. + ** Also, we skip the first element of vec, since getarguments() + ** skips it. Then we count the number of arguments + ** copied. The value of "n" will be one greater than + ** this in order to simulate the standard argc/argv. + */ if (arg) { char **bp; - copyip (arg, vec+1, MAXARGS-1); + copyip(arg, vec+1, MAXARGS-1); bp = vec+1; while (*bp++) n++; } /* - * Merge any arguments from command line (now in vec) - * and arguments from profile. - */ + ** Merge any arguments from command line (now in vec) + ** and arguments from profile. + */ arguments = getarguments (sp, n, vec, 1); argp = arguments; @@ -1104,24 +1126,25 @@ sendit (char *sp, char **arg, char *file, int pushed) vecp = 1; /* we'll get the zero'th element later */ vec[vecp++] = "-library"; - vec[vecp++] = getcpy (m_maildir ("")); + vec[vecp++] = getcpy(m_maildir("")); while ((cp = *argp++)) { if (*cp == '-') { - switch (smatch (++cp, sendswitches)) { + switch (smatch(++cp, sendswitches)) { case AMBIGSW: - ambigsw (cp, sendswitches); + ambigsw(cp, sendswitches); return; case UNKWNSW: - advise (NULL, "-%s unknown\n", cp); + advise(NULL, "-%s unknown\n", cp); return; case SHELPSW: - snprintf (buf, sizeof(buf), "%s [switches]", sp); - print_help (buf, sendswitches, 1); + snprintf(buf, sizeof(buf), + "%s [switches]", sp); + print_help(buf, sendswitches, 1); return; case SVERSIONSW: - print_version (invo_name); + print_version(invo_name); return; case SPSHSW: @@ -1182,28 +1205,27 @@ sendit (char *sp, char **arg, char *file, int pushed) case PORTSW: vec[vecp++] = --cp; if (!(cp = *argp++) || *cp == '-') { - advise (NULL, "missing argument to %s", argp[-2]); + advise(NULL, "missing argument to %s", argp[-2]); return; } vec[vecp++] = cp; continue; case SNDATTACHSW: - if (!(attach = *argp++) || *attach == '-') { - advise (NULL, "missing argument to %s", argp[-2]); + if (!(attach = *argp++) || + *attach == '-') { + advise(NULL, "missing argument to %s", argp[-2]); return; } continue; case SNDATTACHFORMAT: if (! *argp || **argp == '-') - adios (NULL, "missing argument to %s", argp[-1]); + adios(NULL, "missing argument to %s", argp[-1]); else { - attachformat = atoi (*argp); - if (attachformat < 0 || - attachformat > ATTACHFORMATS - 1) { - advise (NULL, "unsupported attachformat %d", - attachformat); + attachformat = atoi(*argp); + if (attachformat < 0 || attachformat > ATTACHFORMATS - 1) { + advise(NULL, "unsupported attachformat %d", attachformat); continue; } } @@ -1211,83 +1233,82 @@ sendit (char *sp, char **arg, char *file, int pushed) continue; } } - advise (NULL, "usage: %s [switches]", sp); + advise(NULL, "usage: %s [switches]", sp); return; } /* allow Aliasfile: profile entry */ - if ((cp = context_find ("Aliasfile"))) { + if ((cp = context_find("Aliasfile"))) { char **ap, *dp; - dp = getcpy (cp); - for (ap = brkstring (dp, " ", "\n"); ap && *ap; ap++) { + dp = getcpy(cp); + for (ap = brkstring(dp, " ", "\n"); ap && *ap; ap++) { vec[vecp++] = "-alias"; vec[vecp++] = *ap; } } - if ((cp = getenv ("SIGNATURE")) == NULL || *cp == 0) - if ((cp = context_find ("signature")) && *cp) - m_putenv ("SIGNATURE", cp); + if ((cp = getenv("SIGNATURE")) == NULL || *cp == 0) + if ((cp = context_find("signature")) && *cp) + m_putenv("SIGNATURE", cp); #ifdef UCI else { - snprintf (buf, sizeof(buf), "%s/.signature", mypath); - if ((fp = fopen (buf, "r")) != NULL - && fgets (buf, sizeof(buf), fp) != NULL) { - fclose (fp); - if (cp = strchr (buf, '\n')) - *cp = 0; - m_putenv ("SIGNATURE", buf); + snprintf(buf, sizeof(buf), "%s/.signature", mypath); + if ((fp = fopen(buf, "r")) != NULL && + fgets(buf, sizeof(buf), fp) != NULL) { + fclose(fp); + if (cp = strchr(buf, '\n')) + *cp = 0; + m_putenv("SIGNATURE", buf); } } #endif /* UCI */ - if ((annotext = getenv ("mhannotate")) == NULL || *annotext == 0) + if ((annotext = getenv("mhannotate")) == NULL || *annotext == 0) annotext = NULL; - if ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == 0) + if ((altmsg = getenv("mhaltmsg")) == NULL || *altmsg == 0) altmsg = NULL; - if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != 0)) - inplace = atoi (cp); + if (annotext && ((cp = getenv("mhinplace")) != NULL && *cp != 0)) + inplace = atoi(cp); - if ((cp = getenv ("mhdist")) - && *cp + if ((cp = getenv("mhdist")) && *cp #ifndef lint && (distsw = atoi (cp)) #endif /* not lint */ && altmsg) { vec[vecp++] = "-dist"; - distfile = getcpy (m_mktemp2(altmsg, invo_name, NULL, NULL)); - if (link (altmsg, distfile) == NOTOK) - adios (distfile, "unable to link %s to", altmsg); + distfile = getcpy(m_mktemp2(altmsg, invo_name, NULL, NULL)); + if (link(altmsg, distfile) == NOTOK) + adios(distfile, "unable to link %s to", altmsg); } else { distfile = NULL; } - if (altmsg == NULL || stat (altmsg, &st) == NOTOK) { + if (altmsg == NULL || stat(altmsg, &st) == NOTOK) { st.st_mtime = 0; st.st_dev = 0; st.st_ino = 0; } if ((pushsw = pushed)) - push (); + push(); - vec[0] = r1bindex (postproc, '/'); - closefds (3); + vec[0] = mhbasename(postproc); + closefds(3); - if (sendsbr (vec, vecp, file, &st, 1, attach, attachformat) == OK) - done (0); + if (sendsbr(vec, vecp, file, &st, 1, attach, attachformat) == OK) + done(0); } /* - * Remove the draft file - */ +** Remove the draft file +*/ static int -removefile (char *drft) +removefile(char *drft) { - if (unlink (drft) == NOTOK) - adios (drft, "unable to unlink"); + if (unlink(drft) == NOTOK) + adios(drft, "unable to unlink"); return OK; }