|
|
1.1 ! root 1: /* m_getdefs.c - read the user's MH environment */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: #include <errno.h> ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: #include <pwd.h> ! 9: ! 10: ! 11: extern int errno; ! 12: ! 13: struct passwd *getpwuid (); ! 14: ! 15: ! 16: #ifndef OVERHEAD ! 17: #define FOpen(f,m,e,c) fopen (f, m) ! 18: #define FClose(f) fclose (f) ! 19: #else OVERHEAD ! 20: FILE *FOpen (); ! 21: int FClose (); ! 22: ! 23: long lseek (); ! 24: #endif OVERHEAD ! 25: ! 26: ! 27: void m_getdefs() { ! 28: int pid; ! 29: register char *cp, ! 30: *pp; ! 31: #if defined (notdef) || defined (COMPAT) ! 32: register char *ctx; ! 33: #endif notdef or COMPAT ! 34: char buf[BUFSIZ]; ! 35: struct stat st; ! 36: register struct passwd *pw; ! 37: register FILE *ib; ! 38: ! 39: if (defpath) ! 40: return; ! 41: if (mypath == NULL) { ! 42: if (mypath = getenv ("HOME")) ! 43: mypath = getcpy (mypath); ! 44: else ! 45: if ((pw = getpwuid (getuid ())) == NULL ! 46: || pw -> pw_dir == NULL ! 47: || *pw -> pw_dir == NULL) ! 48: adios (NULLCP, "no HOME envariable"); ! 49: else ! 50: mypath = getcpy (pw -> pw_dir); ! 51: if ((cp = mypath + strlen (mypath) - 1) > mypath && *cp == '/') ! 52: *cp = NULL; ! 53: } ! 54: ! 55: if ((cp = getenv ("MH")) && *cp) { ! 56: defpath = path (cp, TFILE); ! 57: if ((ib = FOpen (defpath, "r", "MHFD", 0)) == NULL) ! 58: adios (defpath, "unable to read"); ! 59: if (*cp != '/') ! 60: (void) putenv ("MH", defpath); ! 61: } ! 62: else { ! 63: defpath = concat (mypath, "/", mh_profile, NULLCP); ! 64: ! 65: if ((ib = FOpen (defpath, "r", "MHFD", 0)) == NULL) ! 66: switch (pid = vfork ()) { ! 67: case NOTOK: ! 68: adios ("fork", "unable to"); ! 69: ! 70: case OK: ! 71: (void) setgid (getgid ()); ! 72: (void) setuid (getuid ()); ! 73: ! 74: execlp (installproc, "install-mh", "-auto", NULLCP); ! 75: fprintf (stderr, "unable to exec "); ! 76: perror (installproc); ! 77: _exit (-1); ! 78: ! 79: default: ! 80: if (pidwait (pid, OK) ! 81: || (ib = fopen (defpath, "r")) == NULL) ! 82: adios (NULLCP, "[install-mh aborted]"); ! 83: } ! 84: } ! 85: ! 86: #if defined (notdef) || defined (COMPAT) ! 87: ctx = context; ! 88: #endif notdef or COMPAT ! 89: m_readefs (&m_defs, ib, mh_profile, 0); ! 90: (void) FClose (ib); ! 91: ! 92: if ((pp = m_find ("path")) != NULL && *pp) { ! 93: if (*pp != '/') ! 94: (void) sprintf (buf, "%s/%s", mypath, pp); ! 95: else ! 96: (void) strcpy (buf, pp); ! 97: if (stat(buf, &st) == NOTOK) { ! 98: if (errno != ENOENT) ! 99: adios (buf, "error opening"); ! 100: cp = concat ("Your MH-directory \"", buf, ! 101: "\" doesn't exist; Create it? ", NULLCP); ! 102: if (!getanswer(cp)) ! 103: adios (NULLCP, "unable to access MH-directory \"%s\"", buf); ! 104: free (cp); ! 105: if (!makedir (buf)) ! 106: adios (NULLCP, "unable to create", buf); ! 107: } ! 108: } ! 109: ! 110: #ifdef COMPAT ! 111: if (strcmp (ctx, "/dev/null") == 0) ! 112: return; /* called by install-mh */ ! 113: ! 114: if (access (ctxpath = getcpy (m_maildir (ctx)), 0) == NOTOK) ! 115: switch (pid = fork ()) { ! 116: case NOTOK: ! 117: adios ("fork", "unable to"); ! 118: ! 119: case OK: ! 120: (void) setgid (getgid ()); ! 121: (void) setuid (getuid ()); ! 122: fprintf (stderr, "install-mh -compat\n"); ! 123: ! 124: execlp (installproc, "install-mh", "-compat", NULLCP); ! 125: fprintf (stderr, "unable to exec "); ! 126: perror (installproc); ! 127: _exit (-1); ! 128: ! 129: default: ! 130: if (pidwait (pid, OK) || access (ctxpath, 0) == NOTOK) ! 131: adios (NULLCP, "[install-mh aborted]"); ! 132: ! 133: if ((ib = fopen (defpath, "r")) == NULL) ! 134: adios (defpath, "unable to read"); ! 135: m_readefs (&m_defs, ib, mh_profile, 0); ! 136: (void) FClose (ib); ! 137: } ! 138: free (ctxpath); ! 139: #endif COMPAT ! 140: ! 141: if ((cp = getenv ("MHCONTEXT")) == NULL || *cp == NULL) ! 142: cp = context; ! 143: if ((ib = FOpen (ctxpath = getcpy (m_maildir (cp)), "r", "MHCONTEXTFD", 1)) ! 144: == NULL) { ! 145: #ifdef notdef /* XXX */ ! 146: if (cp != ctx) ! 147: adios (ctxpath, "unable to read"); ! 148: #endif notdef ! 149: } ! 150: else { ! 151: m_readefs ((struct node **) 0, ib, cp, 1); ! 152: (void) FClose (ib); ! 153: } ! 154: } ! 155: ! 156: /* */ ! 157: ! 158: #ifdef OVERHEAD ! 159: int fd_def = NOTOK; ! 160: int fd_ctx = NOTOK; ! 161: ! 162: ! 163: static FILE *FOpen (filename, mode, envariable, ctx) ! 164: register char *filename, ! 165: *mode, ! 166: *envariable; ! 167: register int ctx; ! 168: { ! 169: register int fd; ! 170: register char *cp; ! 171: char buffer[10]; ! 172: struct stat st1; ! 173: register FILE * fp; ! 174: ! 175: if ((cp = getenv (envariable)) == NULL || *cp == NULL) ! 176: goto not_open; ! 177: ! 178: if ((fd = atoi (cp)) <= fileno (stderr)) { ! 179: advise (NULLCP, "bad value for $%s: %s", envariable, cp); ! 180: (void) unputenv (envariable); ! 181: return fopen (filename, mode); ! 182: } ! 183: if (ctx) ! 184: fd_ctx = fd; ! 185: else ! 186: fd_def = fd; ! 187: ! 188: if (fstat (fd, &st1) == NOTOK) { ! 189: not_open: ; ! 190: if ((fp = fopen (filename, mode)) ! 191: && !strcmp (mode, "r") ! 192: && fileno (fp) > fileno (stderr)) { ! 193: (void) sprintf (buffer, "%d", fileno (fp)); ! 194: if (!putenv (envariable, buffer)) ! 195: if (ctx) ! 196: fd_ctx = fileno (fp); ! 197: else ! 198: fd_def = fileno (fp); ! 199: } ! 200: ! 201: if ((cp = getenv ("MHFDEBUG")) && *cp) ! 202: fprintf (stderr, "FOpen of %s sets %d\n", filename, fileno (fp)); ! 203: return fp; ! 204: } ! 205: ! 206: (void) lseek (fd, 0L, 0); ! 207: return fdopen (fd, mode); ! 208: } ! 209: ! 210: ! 211: static int FClose (f) ! 212: register FILE *f; ! 213: { ! 214: register int d1, ! 215: d2, ! 216: i; ! 217: register char *cp; ! 218: ! 219: if (f == NULL) ! 220: return OK; ! 221: ! 222: if ((d1 = fileno (f)) != fd_def && d1 != fd_ctx) ! 223: return fclose (f); ! 224: ! 225: d2 = dup (d1); ! 226: i = fclose (f); ! 227: ! 228: if (d2 != NOTOK) { ! 229: (void) dup2 (d2, d1); ! 230: (void) close (d2); ! 231: } ! 232: else ! 233: if (d1 == fd_def) ! 234: fd_def = NOTOK; ! 235: else ! 236: fd_ctx = NOTOK; ! 237: ! 238: if ((cp = getenv ("MHFDEBUG")) && *cp) ! 239: fprintf (stderr, "FClose emulating close of %d (%d)\n", d1, d2); ! 240: return i; ! 241: } ! 242: #endif OVERHEAD
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.