X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fwhatnowsbr.c;h=72e9d1ffdd288bcaa2d8581fdf1888ce355db06c;hb=51c505fd1a7488d62088d5268ae1f8a5bc885b19;hp=d863b5bb257745cda3853b698ffba6da739ab7c1;hpb=81a21a9a97d8633f6d6231e31fdb6e328d0d3ff2;p=mmh diff --git a/uip/whatnowsbr.c b/uip/whatnowsbr.c index d863b5b..72e9d1f 100644 --- a/uip/whatnowsbr.c +++ b/uip/whatnowsbr.c @@ -120,6 +120,7 @@ static int buildfile (char **, char *); static int check_draft (char *); static int whomfile (char **, char *); static int removefile (char *); +static void writelscmd(char *, int, char *, char **); #ifdef HAVE_LSTAT static int copyf (char *, char *); @@ -353,17 +354,7 @@ WhatNow (int argc, char **argv) * Use the user's shell so that we can take advantage of any * syntax that the user is accustomed to. */ - - cp = buf + sprintf(buf, "$SHELL -c \" cd %s;ls", cwd); - - while (*++argp != (char *)0) { - if (cp + strlen(*argp) + 2 >= buf + BUFSIZ) - adios((char *)0, "arguments too long"); - - cp += sprintf(cp, " %s", *argp); - } - - (void)strcat(cp, "\""); + writelscmd(buf, sizeof(buf), cwd, argp); (void)system(buf); break; @@ -423,17 +414,7 @@ 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. */ - - cp = buf + sprintf(buf, "$SHELL -c \" cd %s;ls", cwd); - - while (*++argp != (char *)0) { - if (cp + strlen(*argp) + 3 >= buf + BUFSIZ) - adios((char *)0, "arguments too long"); - - cp += sprintf(cp, " %s", *argp); - } - - (void)strcat(cp, "\""); + writelscmd(buf, sizeof(buf), cwd, argp); /* * Read back the response from the shell, which contains a number of lines @@ -560,6 +541,40 @@ WhatNow (int argc, char **argv) /*NOTREACHED*/ } + +/* + * 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 *cwd, char **argp) +{ + char *cp; + int ln = snprintf(buf, bufsz, "$SHELL -c \" cd %s;ls", cwd); + /* 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 " and NUL + */ + if (ln < 0 || ln + 2 > bufsz) + adios((char *)0, "arguments too long"); + + cp = buf + ln; + + while (*++argp != (char *)0) { + ln = strlen(*argp); + /* +3 for leading space and trailing quote and NUL */ + if (ln + 3 > bufsz - (cp-buf)) + adios((char *)0, "arguments too long"); + *cp++ = ' '; + memcpy(cp, *argp, ln+1); + cp += ln; + } + *cp++ = '"'; + *cp = 0; +} + /* * EDIT */ @@ -1005,6 +1020,8 @@ static struct swit sendswitches[] = { { "user", SASLminc(-4) }, #define SNDATTACHSW 39 { "attach file", 6 }, +#define SNDATTACHFORMAT 40 + { "attachformat", 7 }, { NULL, 0 } }; @@ -1030,6 +1047,8 @@ sendit (char *sp, char **arg, char *file, int pushed) char **arguments, *vec[MAXARGS]; struct stat st; char *attach = (char *)0; /* attachment header field name */ + int attachformat = 0; /* mhbuild format specifier for + attachments */ #ifndef lint int distsw = 0; @@ -1190,6 +1209,21 @@ sendit (char *sp, char **arg, char *file, int pushed) return; } continue; + + case SNDATTACHFORMAT: + if (! *argp || **argp == '-') + adios (NULL, "missing argument to %s", argp[-1]); + else { + attachformat = atoi (*argp); + if (attachformat < 0 || + attachformat > ATTACHFORMATS - 1) { + advise (NULL, "unsupported attachformat %d", + attachformat); + continue; + } + } + ++argp; + continue; } } advise (NULL, "usage: %s [switches]", sp); @@ -1255,7 +1289,7 @@ sendit (char *sp, char **arg, char *file, int pushed) vec[0] = r1bindex (postproc, '/'); closefds (3); - if (sendsbr (vec, vecp, file, &st, 1, attach) == OK) + if (sendsbr (vec, vecp, file, &st, 1, attach, attachformat) == OK) done (0); }