Fix uip/whom.c for C89 compatibility
[mmh] / uip / whatnow.c
index 4f8d956..be046ac 100644 (file)
 #include <signal.h>
 #include <h/mime.h>
 #include <h/utils.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <locale.h>
+#include <sysexits.h>
+
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
 
 static struct swit switches[] = {
 #define EDITRSW  0
@@ -24,6 +32,8 @@ static struct swit switches[] = {
        { NULL, 0 }
 };
 
+char *version=VERSION;
+
 /*
 ** Options at the "whatnow" prompt
 */
@@ -64,7 +74,7 @@ static char *myprompt = "\nWhat now? ";
 /*
 ** static prototypes
 */
-static int editfile(char **, char **, char *, int);
+static int editfile(char **, char **, char *);
 static int sendfile(char **, char *);
 static int refile(char **, char *);
 static int removefile(char *);
@@ -77,7 +87,7 @@ static int system_in_dir(const char *, const char *);
 int
 main(int argc, char **argv)
 {
-       int use = 0;
+       int use = NOUSE;
        char *cp;
        char *ed = NULL, *drft = NULL;
        char buf[BUFSIZ], prompt[BUFSIZ];
@@ -102,7 +112,7 @@ main(int argc, char **argv)
        */
 
        if (!getcwd(cwd, sizeof (cwd))) {
-               adios("getcwd", "could not get working directory");
+               adios(EX_USAGE, "getcwd", "could not get working directory");
        }
 
        while ((cp = *argp++)) {
@@ -110,42 +120,42 @@ main(int argc, char **argv)
                        switch (smatch(++cp, switches)) {
                        case AMBIGSW:
                                ambigsw(cp, switches);
-                               done(1);
+                               exit(EX_USAGE);
                        case UNKWNSW:
-                               adios(NULL, "-%s unknown", cp);
+                               adios(EX_USAGE, NULL, "-%s unknown", cp);
 
                        case HELPSW:
                                snprintf(buf, sizeof(buf),
                                                "%s [switches] [file]",
                                                invo_name);
                                print_help(buf, switches, 1);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
                        case VERSIONSW:
                                print_version(invo_name);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
 
                        case EDITRSW:
                                if (!(ed = *argp++) || *ed == '-')
-                                       adios(NULL, "missing argument to %s",
+                                       adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
                                continue;
 
                        case PRMPTSW:
                                if (!(myprompt = *argp++) || *myprompt == '-')
-                                       adios(NULL, "missing argument to %s",
+                                       adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
                                continue;
 
                        }
                }
                if (drft)
-                       adios(NULL, "only one draft at a time!");
+                       adios(EX_USAGE, NULL, "only one draft at a time!");
                else
                        drft = cp;
        }
 
        if ((!drft && !(drft = getenv("mhdraft"))) || !*drft)
-               drft = getcpy(m_draft(seq_cur));
+               drft = mh_xstrdup(m_draft(seq_cur));
 
        if ((cp = getenv("mhuse")) && *cp)
                use = atoi(cp);
@@ -156,20 +166,16 @@ main(int argc, char **argv)
 
        /* start editing the draft, unless editor is the empty string */
        if (*ed) {
-               if (editfile(&ed, NULL, drft, use) <0) {
+               if (editfile(&ed, NULL, drft) <0) {
                        if (!use) {
                                unlink(drft);
                        }
-                       advise(NULL, "Try again.");
-                       done(1);
+                       adios(EX_SOFTWARE, NULL, "Try again.");
                }
        }
 
        snprintf(prompt, sizeof(prompt), myprompt, invo_name);
-       for (;;) {
-               if (!(argp = getans(prompt, aleqs))) {
-                       done(1);
-               }
+       while ((argp = getans(prompt, aleqs))) {
                switch (smatch(*argp, aleqs)) {
                case DISPSW:
                        /* display the msg being replied to or distributed */
@@ -185,7 +191,7 @@ main(int argc, char **argv)
                        /* Call an editor on the draft file */
                        if (*++argp)
                                ed = *argp++;
-                       editfile(&ed, argp, drft, NOUSE);
+                       editfile(&ed, argp, drft);
                        break;
 
                case LISTSW:
@@ -199,12 +205,12 @@ main(int argc, char **argv)
                        if (stat(drft, &st) != NOTOK) {
                                advise(NULL, "draft left on %s", drft);
                        }
-                       done(1);
+                       exit(EX_OK);
 
                case DELETESW:
                        /* Delete draft and exit */
                        removefile(drft);
-                       done(1);
+                       exit(EX_OK);
 
                case SENDSW:
                        /* Send draft */
@@ -214,7 +220,7 @@ main(int argc, char **argv)
                case REFILEOPT:
                        /* Refile the draft */
                        if (refile(++argp, drft) == 0) {
-                               done(0);
+                               exit(EX_OK);
                        }
                        break;
 
@@ -374,7 +380,8 @@ main(int argc, char **argv)
                        break;
                }
        }
-       /*NOTREACHED*/
+
+       exit(EX_IOERR);
 }
 
 
@@ -406,7 +413,7 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
        */
        int trailln = strlen(trailcmd) + 3;
        if (ln < 0 || ln + trailln > bufsz)
-               adios(NULL, "arguments too long");
+               adios(EX_USAGE, NULL, "arguments too long");
 
        cp = buf + ln;
 
@@ -414,7 +421,7 @@ writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp)
                ln = strlen(*argp);
                /* +1 for leading space */
                if (ln + trailln + 1 > bufsz - (cp-buf))
-                       adios(NULL, "arguments too long");
+                       adios(EX_USAGE, NULL, "arguments too long");
                *cp++ = ' ';
                memcpy(cp, *argp, ln+1);
                cp += ln;
@@ -448,12 +455,12 @@ system_in_dir(const char *dir, const char *cmd)
        char olddir[BUFSIZ];
        int r;
        if (getcwd(olddir, sizeof(olddir)) == 0)
-               adios("getcwd", "could not get working directory");
+               adios(EX_OSERR, "getcwd", "could not get working directory");
        if (chdir(dir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        r = system(cmd);
        if (chdir(olddir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        return r;
 }
 
@@ -464,12 +471,12 @@ popen_in_dir(const char *dir, const char *cmd, const char *type)
        char olddir[BUFSIZ];
        FILE *f;
        if (getcwd(olddir, sizeof(olddir)) == 0)
-               adios("getcwd", "could not get working directory");
+               adios(EX_OSERR, "getcwd", "could not get working directory");
        if (chdir(dir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        f = popen(cmd, type);
        if (chdir(olddir) != 0)
-               adios("chdir", "could not change working directory");
+               adios(EX_OSERR, "chdir", "could not change working directory");
        return f;
 }
 
@@ -482,7 +489,7 @@ static char *edsave = NULL;  /* the editor we used previously */
 
 
 static int
-editfile(char **ed, char **arg, char *file, int use)
+editfile(char **ed, char **arg, char *file)
 {
        int pid, status, vecp;
        char *cp, *vec[MAXARGS];
@@ -511,7 +518,7 @@ editfile(char **ed, char **arg, char *file, int use)
        switch (pid = fork()) {
        case NOTOK:
                advise("fork", "unable to");
-               status = NOTOK;
+               status = EX_OSERR;
                break;
 
        case OK:
@@ -526,13 +533,13 @@ editfile(char **ed, char **arg, char *file, int use)
                execvp(*ed, vec);
                fprintf(stderr, "%s: unable to exec ", invo_name);
                perror(*ed);
-               _exit(-1);
+               _exit(EX_OSERR);
 
        default:
                if ((status = pidwait(pid, NOTOK))) {
                        if ((status & 0xff00) == 0xff00) {
                                /* cmd not found or pidwait() failed */
-                               status = -1;
+                               status = EX_SOFTWARE;
                                break;
                        }
                        if (status & 0x00ff) {
@@ -550,7 +557,7 @@ editfile(char **ed, char **arg, char *file, int use)
        }
 
        /* remember which editor we used */
-       edsave = getcpy(*ed);
+       edsave = mh_xstrdup(*ed);
 
        *ed = NULL;
 
@@ -580,7 +587,7 @@ sendfile(char **arg, char *file)
        execvp(*vec, vec);
        fprintf(stderr, "%s: unable to exec ", invo_name);
        perror("send");
-       _exit(-1);
+       _exit(EX_OSERR);
 }
 
 
@@ -618,7 +625,7 @@ static int
 removefile(char *drft)
 {
        if (unlink(drft) == NOTOK)
-               adios(drft, "unable to unlink");
+               adios(EX_IOERR, drft, "unable to unlink");
 
        return OK;
 }