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