|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 12603 (0x313b) Types: TextFile Names: »do-rfc934.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Format/rfc934/do-rfc934.c«
/* do-rfc934.c: routines to carry out rfc934 conversion */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Format/rfc934/RCS/do-rfc934.c,v 5.0 90/09/20 16:02:52 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Format/rfc934/RCS/do-rfc934.c,v 5.0 90/09/20 16:02:52 pp Exp Locker: pp $ * * $Log: do-rfc934.c,v $ * Revision 5.0 90/09/20 16:02:52 pp * rcsforce : 5.0 public release * */ #include "util.h" #include <sys/stat.h> #include <sys/file.h> #include <isode/usr.dirent.h> #include "retcode.h" #include <isode/cmd_srch.h> #include "tb_bpt84.h" extern CMD_TABLE bptbl_body_parts84[/* x400 84 body_parts */]; extern char *hdr_822_bp; #define EBch '-' #define Stuffing "- " char file[FILNSIZE], line[LINESIZE]; int fp; int more = TRUE; int start_depth = 0; /* number of chars in buffer currently */ int noInput = 0; int fatal = FALSE; static int recursiveproc(); static int ishdr(); static int file_link(); static void output_startmessage(); static void output_endmessage(); static int depth(); static void output_stuffing(); static void output_endbodypart(); static void output_line(); static int output_file(); static int output_header(); static void output_ia5(); static int numBodyParts(); static int bpFile(); #define MaxCharPerInt 16 static char *itoa(i) int i; { char buf[MaxCharPerInt]; sprintf(buf,"%d",i); return strdup(buf); } int do_rfc934(from,to,perr) char *from, /* original directory */ *to, /* new directory */ **perr; { char hdr[FILNSIZE], *stripped_hdr, outfile[FILNSIZE], buf[BUFSIZ], wrkfile[FILNSIZE]; int result = OK, msgnum = 1, fd_in, first, noBps, bodynum; noInput = 0; msg_rinit(from); start_depth = depth(from) + 1; fatal = FALSE; noBps = numBodyParts(from); if (msg_rfile(hdr) != RP_OK) { PP_LOG(LLOG_EXCEPTIONS, ("Chans/rfc934 directory '%s' is empty",from)); (void) sprintf (buf, "directory '%s' is empty", from); *perr = strdup(buf); return NOTOK; } if ((stripped_hdr = rindex(hdr,'/')) == NULL) stripped_hdr = hdr; else stripped_hdr++; if (ishdr(stripped_hdr) != OK) { PP_LOG(LLOG_EXCEPTIONS, ("Chans/rfc934 cannot find hdr in '%s'",hdr)); (void) sprintf (buf, "Did not find valid header in message - unable to flatten"); fatal = TRUE; *perr = strdup(buf); return NOTOK; } if (result != OK) return NOTOK; if (msg_rfile(file) != RP_OK) { /* empty body that's ok */ result = file_link(from,to, stripped_hdr); return OK; } more = TRUE; first = TRUE; do { if (depth(file) > start_depth) { if (first == TRUE) { result = put_out_header(hdr, to, stripped_hdr); /* open output file */ sprintf(outfile,"%s/1.ia5",to); if ((fp = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) { PP_SLOG(LLOG_EXCEPTIONS, outfile, ("Can't open file")); (void) sprintf(buf, "Unable to open output file '%s'", outfile); *perr = strdup(buf); return NOTOK; } } result = recursiveproc(msgnum++,perr); } else { strcpy(wrkfile, file); if (msg_rfile(file) != RP_OK) more = FALSE; if (first == TRUE) { if (more == FALSE) { /* single body part */ /* link hdr across */ result = file_link(from,to, stripped_hdr); /* link single body part across */ result = file_link(from, to, rindex(wrkfile,'/')); return result; } else { put_out_header(hdr, to, stripped_hdr); /* open output file */ sprintf(outfile,"%s/1.ia5",to); if ((fp = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) { PP_SLOG(LLOG_EXCEPTIONS, outfile, ("Can't open file")); (void) sprintf(buf, "Unable to open output file '%s'", outfile); *perr = strdup(buf); return NOTOK; } } } if ((fd_in = open(wrkfile, O_RDONLY)) == -1) { PP_SLOG(LLOG_EXCEPTIONS, wrkfile, ("Can't open file")); (void) sprintf (buf, "Unable to open input file '%s'", wrkfile); *perr = strdup(buf); result = NOTOK; } if (result == OK) { result = output_file(fd_in,start_depth,wrkfile, noBps, &bodynum, perr); if (more == FALSE) output_endbodypart(fp, bodynum, start_depth); close(fd_in); } } first = FALSE; } while (result == OK && more == TRUE); close(fp); return result; } static int recursiveproc(num, perr) int num; char **perr; /* uses external file */ { int mydepth; int fd_in; int result = OK; int bpnum, bodynum = 0; char *dir_stub = NULL, buf[BUFSIZ], *ix; int cont, msgnum = 1; int noBps; mydepth = depth(file); if ((ix = rindex(file,'/')) == NULL) dir_stub = strdup(file); else{ while (*(ix-1) == '/') ix--; *ix = '\0'; dir_stub = strdup(file); *ix = '/'; } if ((ix = rindex(dir_stub, '/')) == NULL) ix = dir_stub; else ix++; bpnum = atoi(ix); noBps = numBodyParts(dir_stub); output_startmessage(fp,num,bpnum,mydepth); do { /* output file with char stuffing */ if ((fd_in = open(file, O_RDONLY)) == -1) { PP_SLOG(LLOG_EXCEPTIONS, file, ("Can't open file")); (void) sprintf(buf, "Unable to open input file '%s'", file); result = NOTOK; } if (result == OK) { result = output_file(fd_in,mydepth,file,noBps, &bodynum,perr); close(fd_in); } if (msg_rfile(file) != RP_OK) more = FALSE; else { if (depth(file) > mydepth) result = recursiveproc(msgnum++,perr); bodynum = 0; } cont = FALSE; if ((result == OK) && (more == TRUE) && (depth(file) == mydepth)) cont = TRUE; if ((ix = rindex(file,'/')) != NULL) { while (*(ix-1) == '/') ix--; *ix = '\0'; } if ((cont == TRUE) && (strcmp(dir_stub,file) != 0)) cont = FALSE; if (ix != NULL) *ix = '/'; } while ((result == OK) && (more == TRUE) && (cont == TRUE)); if (dir_stub != NULL) free(dir_stub); if (noBps > 1 && bodynum != 0) output_endbodypart(fp, bodynum, mydepth); output_endmessage(fp,num,bpnum,mydepth); return result; } static int ishdr(name) char *name; { /* if (strcmp(name,rcmd_srch(BPT_HDR_P2,bptbl_body_parts84)) == 0) return OK; if (strcmp(name,rcmd_srch(BPT_HDR_822,bptbl_body_parts84)) == 0) return OK;*/ if (strncmp(name,hdr_822_bp,strlen(hdr_822_bp)) == 0) return OK; return NOTOK; } /* \f */ /* input and output routines */ #define CMASK 0377 /* for making char's > 0 */ #define Start_message "------------------------------ Start of forwarded message " static void output_startmessage(fd, num, bpnum, deep) int fd; int num; int bpnum; int deep; { char *cnum = itoa(num); if (bpnum != 1) write(fd,"\n",strlen("\n")); output_stuffing(fd,deep-1); write(fd,Start_message,strlen(Start_message)); write(fd,cnum,strlen(cnum)); free(cnum); /* write(fd," (bodypart ",strlen("(bodypart ")); cnum = itoa(bpnum); write(fd,cnum,strlen(cnum));*/ write(fd,"\n\n",strlen("\n\n")); free(cnum); } #define End_message "------------------------------ End of forwarded message " static void output_endmessage(fd,num,bpnum,deep) int fd, num, bpnum, deep; { char *cnum = itoa(num); write(fd,"\n",strlen("\n")); output_stuffing(fd,deep-1); write(fd,End_message,strlen(End_message)); write(fd,cnum,strlen(cnum)); free(cnum); /* write(fd," (bodypart ",strlen("(bodypart ")); cnum = itoa(bpnum); write(fd,cnum,strlen(cnum));*/ if (more == FALSE) write(fd,"\n",strlen("\n")); else write(fd,"\n\n",strlen("\n\n")); free(cnum); } #define Bodypart_seperatorstart "------------------------------ Start of body part " #define Bodypart_seperatorend "------------------------------ End of body part " static int output_startbodypart(fd, num, deep) int fd; int num; int deep; { char *cnum = itoa(num); write(fd,"\n",strlen("\n")); output_stuffing(fd,deep); write(fd,Bodypart_seperatorstart,strlen(Bodypart_seperatorstart)); write(fd,cnum,strlen(cnum)); write(fd,"\n\n",strlen("\n\n")); free(cnum); } static void output_endbodypart(fd, num, deep) int fd; int num; int deep; { char *cnum = itoa(num); write(fd,"\n",strlen("\n")); output_stuffing(fd,deep); write(fd,Bodypart_seperatorend,strlen(Bodypart_seperatorend)); write(fd,cnum,strlen(cnum)); if (more == FALSE) write(fd,"\n",strlen("\n")); else write(fd,"\n\n",strlen("\n\n")); free(cnum); } static char mygetchar(fd) int fd; { static char buf[FILNSIZE]; static char *bufp = buf; if (noInput == 0) { /* buffer is empty */ noInput = read(fd, buf, FILNSIZE); bufp = buf; } return ((--noInput >= 0) ? *bufp++ : EOF); } static int getline(fd,linebuf) int fd; char linebuf[]; { int i = 0; int c; while (i < LINESIZE && ((c = mygetchar(fd)) != EOF) && c != '\n') linebuf[i++] = c; if (c == '\n') linebuf[i++] = c; linebuf[i] = '\0'; return i; } static void output_stuffing(fd, deep) int fd; int deep; { int i = 0; while (i++ < (deep - start_depth)) write(fd,Stuffing,strlen(Stuffing)); } static void output_line(fd,buf) int fd; char buf[]; { write(fd,buf,strlen(buf)); } static int output_file(fd_in, deep, filename, noBps,pnum, perr) int fd_in, deep; char *filename; int noBps; int *pnum; char **perr; { char *ix = NULL, buf[BUFSIZ], *ix2; /* reset input buffer */ noInput = 0; if (((ix = rindex(filename,'/')) != NULL) && (strncmp(++ix, hdr_822_bp, strlen(hdr_822_bp)) == 0)) { output_header(fd_in, FALSE); output_line(fp, "\n"); return OK; } else if (strcmp(ix,rcmd_srch(BPT_P2_DLIV_TXT, bptbl_body_parts84)) == 0) { PP_LOG(LLOG_EXCEPTIONS, ("Chans/rfc934 : illegal file type '%s' ignoring it",filename)); return OK; } if (((ix = rindex(filename,'.')) != NULL) && (strcmp(++ix, rcmd_srch(BPT_IA5, bptbl_body_parts84)) == 0)) { *(ix - 1) = '\0'; ix2 = rindex(filename,'/'); *ix2++ = '\0'; *pnum = atoi(ix2); output_ia5(fd_in, deep, *pnum, noBps); *(ix - 1) = '.'; *(ix2 - 1) ='/'; return OK; } PP_LOG(LLOG_EXCEPTIONS, ("Chans/rfc934 : illegal file type '%s' BOMBING OUT",filename)); (void) sprintf(buf, "illegal file type '%s' unable to flatten", filename); *perr = strdup(buf); fatal = TRUE; return NOTOK; } static int output_header(fd_in, first) int fd_in; int first; { int msgtype; msgtype = FALSE; while(getline(fd_in,line) != 0) { if (first == TRUE && line[0] == '\n' && msgtype == FALSE) output_line(fp, "Message-Type: Multiple Part"); output_line(fp, line); if (strncmp(line, "Message-Type", strlen("Message-Type")) == 0) msgtype = TRUE; } return msgtype; } static void output_ia5(fd_in, deep, bp_num, noBps) int fd_in, deep, bp_num, noBps; { if (noBps > 1) output_startbodypart(fp, bp_num, deep); while (getline(fd_in,line) != 0) { if (line[0] == EBch) output_stuffing(fp, deep); output_line(fp, line); } } static int depth (filename) char *filename; { char *p; int count = 0; for (p = filename; *p; p++) if (*p == '/') { count ++; while(*p == '/') p++; } return count; } static int file_link(orig,tmp,filename) char *orig, /* original message directory */ *tmp, /* new temporary directory */ *filename; /* file to link across */ { char old[FILNSIZE], /* old file */ new[FILNSIZE]; /* new link */ struct stat statbuf; int result = OK; (void) sprintf(old, "%s/%s",orig,filename); (void) sprintf(new, "%s/%s",tmp,filename); if ((stat(old, &statbuf) == OK) && (stat(new, &statbuf) != OK) && (link(old, new) != -1)) { result = OK; } else result = NOTOK; return result; } put_out_header(old, to, stripped_hdr) char *old, *to, *stripped_hdr; { int fd_in; char outfile[FILNSIZE]; int gotMsgType = FALSE; if ((fd_in = open(old, O_RDONLY)) == -1) { PP_SLOG(LLOG_EXCEPTIONS, old, ("Can't open file")); return NOTOK; } sprintf(outfile,"%s/%s",to, stripped_hdr); if ((fp = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) { PP_SLOG(LLOG_EXCEPTIONS, outfile, ("Can't open file")); return NOTOK; } gotMsgType = output_header(fd_in, TRUE); close(fd_in); close(fp); return OK; } static int bpFile(entry) struct dirent *entry; { if (strcmp(entry->d_name, "..") == 0 || strcmp(entry->d_name, ".") == 0 || strncmp(entry->d_name, hdr_822_bp, strlen(hdr_822_bp)) == 0) return 0; return 1; } static int numBodyParts(dir) char *dir; { struct dirent **namelist = NULL; int ret = _scandir(dir, &namelist, bpFile, NULLIFP); if (namelist) free ((char *) namelist); return ret; }