From owner-freebsd-hackers Fri Jul 5 20:58:53 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id UAA08027 for hackers-outgoing; Fri, 5 Jul 1996 20:58:53 -0700 (PDT) Received: from kithrup.com (kithrup.com [205.179.156.40]) by freefall.freebsd.org (8.7.5/8.7.3) with SMTP id UAA08021 for ; Fri, 5 Jul 1996 20:58:48 -0700 (PDT) Received: (from sef@localhost) by kithrup.com (8.6.8/8.6.6) id UAA22247 for hackers@freebsd.org; Fri, 5 Jul 1996 20:58:48 -0700 Date: Fri, 5 Jul 1996 20:58:48 -0700 From: Sean Eric Fagan Message-Id: <199607060358.UAA22247@kithrup.com> To: hackers@freebsd.org Subject: patches to mail -- thoughts, comments? Sender: owner-hackers@freebsd.org X-Loop: FreeBSD.org Precedence: bulk This adds a "|" command to Mail. I'm not extremely happy with it, mind you, which is why I'm soliciting comments ;). These are relative to my sources, but should apply with some fuzz to stock freebsd sources ;). *** /usr/src/usr.bin/mail/cmd2.c Sat Jun 12 07:50:30 1993 --- cmd2.c Fri Jul 5 20:56:28 1996 *************** *** 145,150 **** --- 145,156 ---- return save1(str, 0, "copy", saveignore); } + pipeto(str) + char str[]; + { + return save1(str, 0, "pipe", saveignore); + } + /* * Save/copy the indicated messages at the end of the passed file name. * If mark is true, mark the message "saved." *************** *** 157,166 **** register int *ip; register struct message *mp; char *file, *disp; ! int f, *msgvec; FILE *obuf; msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec); if ((file = snarf(str, &f)) == NOSTR) return(1); if (!f) { --- 163,174 ---- register int *ip; register struct message *mp; char *file, *disp; ! int f, *msgvec, dopipe; FILE *obuf; msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec); + dopipe = !strcmp(cmd, "pipe"); + if ((file = snarf(str, &f)) == NOSTR) return(1); if (!f) { *************** *** 173,187 **** } if (f && getmsglist(str, msgvec, 0) < 0) return(1); if ((file = expand(file)) == NOSTR) return(1); printf("\"%s\" ", file); fflush(stdout); ! if (access(file, 0) >= 0) disp = "[Appended]"; else disp = "[New file]"; ! if ((obuf = Fopen(file, "a")) == NULL) { perror(NOSTR); return(1); } --- 181,218 ---- } if (f && getmsglist(str, msgvec, 0) < 0) return(1); + if (!dopipe) { if ((file = expand(file)) == NOSTR) return(1); printf("\"%s\" ", file); + } else if (file[0] == *(file + strlen(file) - 1)) { + char delim = file[0]; + char *endstr = file + strlen(file) - 1; + /* + * pipes are a special case... we want to remove any + * delimitting quotes, so we check for file[0] equal + * to '\'' or '"'; if it is, and the last character is + * the same, then we remove them. + */ + if (delim == '"' || delim == '\'') { + memmove (file, file+1, endstr - file); + file[strlen(file)] = 0; + } + } + fflush(stdout); ! if (dopipe) ! disp = "[Pipe]"; ! else if (access(file, 0) >= 0) disp = "[Appended]"; else disp = "[New file]"; ! if (dopipe) { ! if ((obuf = Popen(file, "w")) == NULL) { ! perror(NOSTR); ! return(1); ! } ! } else if ((obuf = Fopen(file, "a")) == NULL) { perror(NOSTR); return(1); } *************** *** 190,196 **** touch(mp); if (send(mp, obuf, ignore, NOSTR) < 0) { perror(file); ! Fclose(obuf); return(1); } if (mark) --- 221,227 ---- touch(mp); if (send(mp, obuf, ignore, NOSTR) < 0) { perror(file); ! (dopipe ? Pclose : Fclose)(obuf); return(1); } if (mark) *************** *** 199,205 **** fflush(obuf); if (ferror(obuf)) perror(file); ! Fclose(obuf); printf("%s\n", disp); return(0); } --- 230,236 ---- fflush(obuf); if (ferror(obuf)) perror(file); ! (dopipe ? Pclose : Fclose)(obuf); printf("%s\n", disp); return(0); } *** /usr/src/usr.bin/mail/cmdtab.c Sat Jun 12 07:50:29 1993 --- cmdtab.c Thu Jul 4 16:21:20 1996 *************** *** 53,58 **** --- 53,59 ---- extern int folders(), igfield(), Type(), retfield(), more(), More(); extern int saveigfield(), saveretfield(); extern int unread(); /* , Header(); */ + extern int pipeto(); struct cmd cmdtab[] = { "next", next, NDMLIST, 0, MMNDEL, *************** *** 82,87 **** --- 83,89 ---- "chdir", schdir, M|RAWLIST, 0, 1, "cd", schdir, M|RAWLIST, 0, 1, "save", save, STRLIST, 0, 0, + "|", pipeto, STRLIST, 0, 0, "source", source, M|RAWLIST, 1, 1, "set", set, M|RAWLIST, 0, 1000, "shell", dosh, I|NOLIST, 0, 0,