|
|
1.1 root 1: /* install-mh.c - initialize the MH environment */
2:
3: #include "../h/mh.h"
4: #include <pwd.h>
5: #include <stdio.h>
6: #include <sys/types.h>
7: #include <sys/stat.h>
8:
9: /* */
10:
11: static char *message[] = {
12: "Prior to using MH, it is necessary to have a file in your login",
13: "directory (%s) named %s which contains information",
14: "to direct certain MH operations. The only item which is required",
15: "is the path to use for all MH folder operations. The suggested MH",
16: "path for you is %s/Mail...",
17: NULL
18: };
19:
20:
21: char *geta ();
22:
23: struct passwd *getpwuid ();
24:
25: /* */
26:
27: /* ARGSUSED */
28:
29: main (argc, argv)
30: int argc;
31: char **argv;
32: {
33: int autof,
34: i;
35: char *cp,
36: *path;
37: struct node *np;
38: struct passwd *pw;
39: struct stat st;
40: FILE *in,
41: *out;
42:
43: invo_name = r1bindex (argv[0], '/');
44:
45: #ifdef COMPAT
46: if (argc == 2 && strcmp (argv[1], "-compat") == 0) {
47: context = "/dev/null"; /* hack past m_getdefs() */
48:
49: m_getdefs ();
50: for (np = m_defs; np; np = np -> n_next)
51: if (uleq (pfolder, np -> n_name)
52: || ssequal ("atr-", np -> n_name)
53: || ssequal ("cur-", np -> n_name))
54: np -> n_context = 1;
55:
56: ctxpath = getcpy (m_maildir (context = "context"));
57: ctxflags |= CTXMOD;
58: m_update ();
59:
60: if ((out = fopen (defpath, "w")) == NULL)
61: adios (defpath, "unable to write");
62: for (np = m_defs; np; np = np -> n_next)
63: if (!np -> n_context)
64: fprintf (out, "%s: %s\n", np -> n_name, np -> n_field);
65: (void) fclose (out);
66:
67: done (0);
68: }
69: #endif COMPAT
70:
71: autof = (argc == 2 && strcmp (argv[1], "-auto") == 0);
72: if (mypath == NULL) { /* straight from m_getdefs... */
73: if (mypath = getenv ("HOME"))
74: mypath = getcpy (mypath);
75: else
76: if ((pw = getpwuid (getuid ())) == NULL
77: || pw -> pw_dir == NULL
78: || *pw -> pw_dir == NULL)
79: adios (NULLCP, "no HOME envariable");
80: else
81: mypath = getcpy (pw -> pw_dir);
82: if ((cp = mypath + strlen (mypath) - 1) > mypath && *cp == '/')
83: *cp = NULL;
84: }
85: defpath = concat (mypath, "/", mh_profile, NULLCP);
86:
87: if (stat (defpath, &st) != NOTOK)
88: if (autof)
89: adios (NULLCP, "invocation error");
90: else
91: adios (NULLCP,
92: "You already have an MH profile, use an editor to modify it");
93:
94: if (!autof && gans ("Do you want help? ", anoyes)) {
95: (void) putchar ('\n');
96: for (i = 0; message[i]; i++) {
97: printf (message[i], mypath, mh_profile);
98: (void) putchar ('\n');
99: }
100: (void) putchar ('\n');
101: }
102:
103: /* */
104:
105: cp = concat (mypath, "/", "Mail", NULLCP);
106: if (stat (cp, &st) != NOTOK) {
107: if ((st.st_mode & S_IFMT) == S_IFDIR) {
108: cp = concat ("You already have the standard MH directory \"",
109: cp, "\".\nDo you want to use it for MH? ", NULLCP);
110: if (gans (cp, anoyes))
111: path = "Mail";
112: else
113: goto query;
114: }
115: else
116: goto query;
117: }
118: else {
119: if (autof)
120: printf ("I'm going to create the standard MH path for you.\n");
121: else
122: cp = concat ("Do you want the standard MH path \"",
123: mypath, "/", "Mail\"? ", NULLCP);
124: if (autof || gans (cp, anoyes))
125: path = "Mail";
126: else {
127: query: ;
128: if (gans ("Do you want a path below your login directory? ",
129: anoyes)) {
130: printf ("What is the path? %s/", mypath);
131: path = geta ();
132: }
133: else {
134: printf ("What is the whole path? /");
135: path = concat ("/", geta (), NULLCP);
136: }
137: }
138: }
139:
140: (void) chdir (mypath);
141: if (chdir (path) == NOTOK) {
142: cp = concat ("\"", path, "\" doesn't exist; Create it? ", NULLCP);
143: if (autof || gans (cp, anoyes))
144: if (makedir (path) == 0)
145: adios (NULLCP, "unable to create %s", path);
146: }
147: else
148: printf ("[Using existing directory]\n");
149:
150: /* */
151:
152: np = m_defs = (struct node *) malloc (sizeof *np);
153: if (np == NULL)
154: adios (NULLCP, "unable to allocate profile storage");
155: np -> n_name = getcpy ("Path");
156: np -> n_field = getcpy (path);
157: np -> n_context = 0;
158: np -> n_next = NULL;
159:
160: if (in = fopen (mh_defaults, "r")) {
161: m_readefs (&np -> n_next, in, mh_defaults, 0);
162: (void) fclose (in);
163: }
164:
165: ctxpath = getcpy (m_maildir (context = "context"));
166: m_replace (pfolder, defalt);
167: m_update ();
168:
169: if ((out = fopen (defpath, "w")) == NULL)
170: adios (defpath, "unable to write");
171: for (np = m_defs; np; np = np -> n_next)
172: if (!np -> n_context)
173: fprintf (out, "%s: %s\n", np -> n_name, np -> n_field);
174: (void) fclose (out);
175:
176: done (0);
177: }
178:
179: /* */
180:
181: static char *geta () {
182: register char *cp;
183: static char line[BUFSIZ];
184:
185: (void) fflush (stdout);
186: if (fgets (line, sizeof line, stdin) == NULL)
187: done (1);
188: if (cp = index (line, '\n'))
189: *cp = NULL;
190: return line;
191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.