This is attach.c in view mode; [Download] [Up]
/* $Id: attach.c,v 1.3 91/05/25 15:31:16 cap Exp $ * Handle attachments */ #include <stdio.h> #ifdef USG #include <string.h> #else #include <strings.h> #include <sys/param.h> #endif #include "config.h" #include "tnextmail.h" char *basename(), *pathname(); struct attach *noteattach(); extern int rtfpos; #ifdef HAVE_GETCWD extern char *getcwd(); #else extern char *getwd(); #endif extern char *malloc(), *realloc(); struct attach *attachments; int lastattach; /* number of next attachment */ int maxattach; /* number of attachment slots allocated */ char cwd[MAXPATHLEN]; /* current directory */ /* * rtfattach - generate the rtf information necessary for the * attachment named. Also, do the housekeeping to * note the existence of a new attachment. */ rtfattach(out, filename) FILE *out; char *filename; { struct attach *a; if ((a = noteattach(filename)) == NULL) return -1; fprintf(out, "\n{\\attachment%d %s\n}\n", rtfpos, a->basename); return 0; } /* basename - return the last component of a filename */ char *basename(fullname) char *fullname; { char *base; if ((base = rindex(fullname, '/')) == NULL) return fullname; else return base + 1; } /* * pathname - return the path part of a filename. The pointer returned * is in static space */ char *pathname(fullname) char *fullname; { static char path[MAXPATHLEN]; char *lastslash; strncpy(path, fullname, MAXPATHLEN); lastslash = rindex(path, '/'); if (lastslash != NULL) *++lastslash = '\0'; else path[0] = '\0'; return path; } /* * noteattach - note down in our table the existence of a new * attachment. We store the full path name and the file * name. */ struct attach *noteattach(filename) char *filename; { char *base = basename(filename), *path = pathname(filename); char *p; int i; struct attach *a, *retval; if (++lastattach >= maxattach) { if (!attachments) { /* first time through */ maxattach = 4; attachments = (struct attach *) malloc(maxattach * sizeof (struct attach)); } else { /* allocate more */ maxattach *= 2; attachments = (struct attach *) realloc(attachments, maxattach * sizeof (struct attach)); } if (!attachments) { perror("malloc"); fatalerrors++; lastattach--; return NULL; } } if (!strcmp(base, RTF_NAME)) { fprintf(stderr, "Please don't name an attachment %s.\n", RTF_NAME); fatalerrors++; retval = NULL; } if (cwd[0] == '\0') { /* haven't figured out current dir yet */ #ifdef HAVE_GETCWD if (getcwd(cwd, sizeof cwd - 2) == NULL) { perror("pwd"); fatalerrors++; } #else if (getwd(cwd) == NULL) { fprintf(stderr, cwd); fatalerrors++; } #endif strcat(cwd, "/"); /* add trailing / */ } for (i = 0; i < lastattach; i++) { a = &attachments[i]; if (!strcmp(a->basename, base)) { fprintf(stderr, "You cannot have two attachments with the same basename %s\n", base); fatalerrors++; retval = NULL; } else retval = a; } /* * i is the slot for the new attachment. Now determine if it's a * relative path or absolute, and possibly add the current * directory accordingly. */ if (path[0] == '\0') /* in current directory */ strcpy(a->pathname, cwd); else if (*path == '/') /* absolute path was given */ strcpy(a->pathname, path); else /* relative path given */ sprintf(a->pathname, "%s%s", cwd, path); p = &a->pathname[strlen(a->pathname) - 1]; strcpy(a->basename, base); return retval; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.