This is batch.c in view mode; [Download] [Up]
/* $Id: batch.c,v 1.3 91/05/25 15:32:20 cap Exp $ * Make a connection to tar, compress, and uuencode to batch up the * message and all its attachments. */ #include <stdio.h> #include <ctype.h> #include <sys/types.h> #ifdef USG #include <sys/unistd.h> #else #include <sys/param.h> #include <sys/file.h> #endif #include <sys/stat.h> #include "config.h" #include "tnextmail.h" char command[MAXPATHLEN], attach_name[64], tar_uu_name[MAXPATHLEN]; char **tolist; /* list of addressees */ char *construct_attach_header(); extern int lastattach; extern struct attach *attachments; /* * batch_message - make a system(3) call to tar, compress, and uuencode * to create the body of the message to be mailed. * Output is written to the file tar.uu in the temp * directory. */ batch_message(tmpdir_name) char *tmpdir_name; { sprintf(tar_uu_name, "%s/tar.uu", tmpdir_name); sprintf(command, "%s cf - -C %s %s ", TAR, tmpdir_name, RTF_NAME); construct_filelist(); strcat(command, "| compress | uuencode "); construct_batch_name(); strcat(command, attach_name); strcat(command, " > "); strcat(command, tar_uu_name); #ifdef DEBUG fprintf(stderr, "I will run \"%s\"\n", command); #endif if (system(command) == 127) { perror("batching"); fatalerrors++; return; } } /* * construct_filelist - make a list of the form * -C where index.rtf -C dir1 attach1 * where 'where' is the location of the rtf * file, index.rtf is the rtf file, dir1 is the * directory in which attach1 is located, etc. */ construct_filelist() { int i; char *cend; for (i = 0; i < lastattach; i++) { cend = &command[strlen(command)]; sprintf(cend, "-C %s %s ", attachments[i].pathname, attachments[i].basename); } } /* * construct_batch_name - make the weird file name from the subject * line. The weird name is placed in the * global variable attach_name. */ construct_batch_name() { int i; char *sp = message_subject, *bp = attach_name; if (message_subject[0]) sp = message_subject; else sp = "No subject"; sprintf(bp, ".tar.%d.", getpid()); bp = &attach_name[strlen(attach_name)]; for (i = 0; i < 17 && *sp; i++, sp++) { if (isalnum(*sp)) *bp++ = *sp; else *bp++ = '_'; } strcpy(bp, ".attach"); } /* * check_file_access - make sure all attachments are readable. Print * out an error message and increment fatalerrors * for each unreadable file */ check_file_access() { int i; char filename[MAXPATHLEN]; struct stat stbuf; for (i = 0; i < lastattach; i++) { sprintf(filename, "%s%s", attachments[i].pathname, attachments[i].basename); if (access(filename, R_OK)) { perror(filename); fatalerrors++; } else if (stat(filename, &stbuf)) { perror(filename); fatalerrors++; } #if 0 /* * I'm not sure we want this restriction at all. For one * thing, NeXT mail allows you to attach directories. * [cap 8/6/92] */ else if (!(stbuf.st_mode & S_IFREG)) { fprintf(stderr, "Cannot mail %s; can mail only regular files.\n", filename); fatalerrors++; } #endif } } /* * construct_attach_header - * Make the "Next-Attachment:" line for the mail header. It is * constructed in static string space, and a pointer to it is * returned. */ char *construct_attach_header() { static char header[128]; struct stat stbuf; long blocks; /* weird NeXT blocks */ if (stat(tar_uu_name, &stbuf)) { perror(tar_uu_name); fatalerrors++; return NULL; } /* * I don't know what the blocks field is used for, but according * to NeXT's specifications, it should be ceil(stbuf.st_size / 48) * 66 */ blocks = stbuf.st_size / 48; if (stbuf.st_size % 48) blocks++; blocks *= 66; sprintf(header, "Next-Attachment: %s, %ld, 1/1, %ld, 0", attach_name, stbuf.st_size, blocks); return header; } /* * mail_message - create the headers we add and send the message to * the mailer. */ mail_message(tmpdir_name) char tmpdir_name[]; { char *attach_header = construct_attach_header(); char mailcmd[10240]; char **tp; int c; FILE *mailpipe, *message; strcpy(mailcmd, MAILER); for (tp = tolist; *tp != NULL; tp++) { strcat(mailcmd, " "); strcat(mailcmd, *tp); } #if 0 fprintf(stderr, "Mail command is \"%s\"\n", mailcmd); sprintf(mailcmd, "cat > /tmp/sent_to_mailer"); #endif if ((mailpipe = popen(mailcmd, "w")) == NULL) { perror(mailcmd); fatalerrors++; return; } fprintf(mailpipe, "To:"); for (tp = tolist; *tp != NULL; tp++) fprintf(mailpipe, " %s", *tp); if (message_subject[0]) fprintf(mailpipe, "\nSubject: %s\n", message_subject); else putc('\n', mailpipe); fprintf(mailpipe, "%s\n\n", attach_header); if ((message = fopen(tar_uu_name, "r")) == NULL) { perror(tar_uu_name); pclose(mailpipe); fatalerrors++; return; } while ((c = getc(message)) != EOF) putc(c, mailpipe); fclose(message); pclose(mailpipe); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.