-/*
- * install-mh.c -- initialize the nmh environment of a new user
+/* install-mh.c -- initialize the nmh environment of a new user
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
#include <h/mh.h> /* mh internals */
#include <h/utils.h>
+#include "sbr/m_maildir.h"
+#include "sbr/makedir.h"
#include <pwd.h> /* structure for getpwuid() results */
+#include "sbr/read_line.h"
#define INSTALLMH_SWITCHES \
X("auto", 0, AUTOSW) \
DEFINE_SWITCH_ARRAY(INSTALLMH, switches);
#undef X
-/*
- * static prototypes
- */
-static char *geta(void);
-
int
main (int argc, char **argv)
{
int autof = 0;
- char *cp, *pathname, buf[BUFSIZ];
+ char *cp, buf[BUFSIZ];
+ const char *pathname;
char *dp, **arguments, **argp;
struct node *np;
struct passwd *pw;
FILE *in, *out;
int check;
- setlocale(LC_ALL, "");
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 0 /* use context_foil() */ )) { return 1; }
+
arguments = getarguments (invo_name, argc, argv, 0);
argp = arguments;
* the home directory field in the password file if that's not found.
*/
- if ((mypath = getenv("HOME")) == (char *)0) {
- if ((pw = getpwuid(getuid())) == (struct passwd *)0 || *pw->pw_dir == '\0')
+ if ((mypath = getenv("HOME")) == NULL) {
+ if ((pw = getpwuid(getuid())) == NULL || *pw->pw_dir == '\0')
adios(NULL, "cannot determine your home directory");
- else
- mypath = pw->pw_dir;
+ mypath = pw->pw_dir;
}
/*
if (stat (defpath, &st) != NOTOK) {
if (check)
done(0);
-
- else if (autof)
+ if (autof)
adios (NULL, "invocation error");
- else
- adios (NULL, "You already have an nmh profile, use an editor to modify it");
+ adios (NULL, "You already have an nmh profile, use an editor to modify it");
}
- else if (check) {
+ if (check)
done(1);
- }
- if (!autof && gans ("Do you want help? ", anoyes)) {
+ if (!autof && read_switch ("Do you want help? ", anoyes)) {
(void)printf(
"\n"
"Prior to using nmh, it is necessary to have a file in your login\n"
cp = concat (mypath, "/", "Mail", NULL);
if (stat (cp, &st) != NOTOK) {
- if (S_ISDIR(st.st_mode)) {
- cp = concat ("You already have the standard nmh directory \"",
- cp, "\".\nDo you want to use it for nmh? ", NULL);
- if (gans (cp, anoyes))
- pathname = "Mail";
- else
- goto query;
- } else {
+ if (!S_ISDIR(st.st_mode))
goto query;
- }
+ cp = concat ("You already have the standard nmh directory \"",
+ cp, "\".\nDo you want to use it for nmh? ", NULL);
+ if (!read_switch (cp, anoyes))
+ goto query;
+ pathname = "Mail";
} else {
if (autof)
- printf ("I'm going to create the standard nmh path for you.\n");
+ puts("I'm going to create the standard nmh path for you.");
else
cp = concat ("Do you want the standard nmh path \"",
mypath, "/", "Mail\"? ", NULL);
- if (autof || gans (cp, anoyes))
+ if (autof || read_switch (cp, anoyes))
pathname = "Mail";
else {
query:
- if (gans ("Do you want a path below your login directory? ",
+ if (read_switch ("Do you want a path below your login directory? ",
anoyes)) {
printf ("What is the path? %s/", mypath);
- pathname = geta ();
+ pathname = read_line ();
+ if (pathname == NULL) done (1);
} else {
printf ("What is the whole path? /");
- pathname = concat ("/", geta (), NULL);
+ pathname = read_line ();
+ if (pathname == NULL) done (1);
+ pathname = concat ("/", pathname, NULL);
}
}
}
- chdir (mypath);
+ if (chdir (mypath) < 0) {
+ advise (mypath, "chdir");
+ }
if (chdir (pathname) == NOTOK) {
cp = concat ("\"", pathname, "\" doesn't exist; Create it? ", NULL);
- if (autof || gans (cp, anoyes))
+ if (autof || read_switch (cp, anoyes))
if (makedir (pathname) == 0)
adios (NULL, "unable to create %s", pathname);
} else {
- printf ("[Using existing directory]\n");
+ puts("[Using existing directory]");
}
/*
* Add some initial elements to the profile/context list
*/
- m_defs = (struct node *) mh_xmalloc (sizeof *np);
- np = m_defs;
- np->n_name = getcpy ("Path");
- np->n_field = getcpy (pathname);
+ NEW(np);
+ m_defs = np;
+ np->n_name = mh_xstrdup("Path");
+ np->n_field = mh_xstrdup(pathname);
np->n_context = 0;
np->n_next = NULL;
*/
if ((out = fopen (defpath, "w")) == NULL)
adios (defpath, "unable to write");
+ /*
+ * The main purpose of this first line is to fool file(1).
+ * Without it, if the first line of the profile is Path:,
+ * file 5.19 reports its type as message/news. With it,
+ * it reports the type as text/plain.
+ */
+ fprintf (out, "MH-Profile-Version: 1.0\n");
for (np = m_defs; np; np = np->n_next) {
if (!np->n_context)
fprintf (out, "%s: %s\n", np->n_name, np->n_field);
}
fclose (out);
- done (0);
- return 1;
-}
+ puts ("\nPlease see the nmh(7) man page for an introduction to nmh.\n");
+ print_intro (stdout, false);
-static char *
-geta (void)
-{
- char *cp;
- static char line[BUFSIZ];
-
- fflush(stdout);
- if (fgets(line, sizeof(line), stdin) == NULL)
- done (1);
- if ((cp = strchr(line, '\n')))
- *cp = 0;
- return line;
+ /* Initialize the saved nmh version. The Path profile entry was added
+ above, that's all this needs. */
+ (void) nmh_version_changed (0);
+
+ done (0);
+ return 1;
}