Replaced C program `install-mh' by shell script `mmh'.
authormarkus schnalke <meillo@marmaro.de>
Fri, 23 Dec 2011 07:12:20 +0000 (08:12 +0100)
committermarkus schnalke <meillo@marmaro.de>
Fri, 23 Dec 2011 07:12:20 +0000 (08:12 +0100)
It is updated to the separated directories.

.gitignore
uip/Makefile.in
uip/install-mh.c [deleted file]
uip/mmh.sh [new file with mode: 0755]

index f3a4caa..a3dc4a2 100644 (file)
@@ -51,6 +51,7 @@
 /uip/mhshow
 /uip/mhstore
 /uip/mhtest
+/uip/mmh
 /uip/msgchk
 /uip/msh
 /uip/new
index d92d27a..ee096aa 100644 (file)
@@ -50,7 +50,7 @@ SETGID_MAIL    = @SETGID_MAIL@
        $(COMPILE) $<
 
 # commands to build
-CMDS = ali anno burst comp dist flist folder forw install-mh mark mhbuild \
+CMDS = ali anno burst comp dist flist folder forw mmh mark mhbuild \
        mhlist mhmail mhparam mhpath mhshow mhstore msgchk \
        new packf pick prompter refile repl rmf rmm scan send show \
        sortm whatnow
@@ -68,7 +68,7 @@ SCMDS = inc
 # source files
 SRCS = ali.c aliasbr.c anno.c annosbr.c ap.c burst.c comp.c \
        conflict.c dist.c distsbr.c dp.c dropsbr.c flist.c fmtdump.c \
-       folder.c forw.c ftpsbr.c inc.c install-mh.c mark.c md5.c mhbuild.c \
+       folder.c forw.c ftpsbr.c inc.c mmh.sh mark.c md5.c mhbuild.c \
        mhbuildsbr.c mhcachesbr.c mhfree.c mhl.c mhlist.c mhlistsbr.c \
        mhlsbr.c mhmail.c mhmisc.c mhoutsbr.c mhparam.c mhparse.c \
        mhpath.c mhshow.c mhshowsbr.c mhstore.c mhstoresbr.c mhtest.c \
@@ -129,8 +129,9 @@ forw: forw.o whatnowproc.o whatnowsbr.o sendsbr.o annosbr.o distsbr.o $(LOCALLIB
 inc: inc.o scansbr.o dropsbr.o termsbr.o $(LOCALLIBS)
        $(LINK) inc.o scansbr.o dropsbr.o termsbr.o $(LINKLIBS) $(TERMLIB)
 
-install-mh: install-mh.o $(LOCALLIBS)
-       $(LINK) install-mh.o $(LINKLIBS)
+mmh: mmh.sh
+       cp mmh.sh mmh
+       chmod +x mmh
 
 mark: mark.o $(LOCALLIBS)
        $(LINK) mark.o $(LINKLIBS)
@@ -246,7 +247,6 @@ install-lcmds:
        rm -f $(DESTDIR)$(bindir)/unseen
        rm -f $(DESTDIR)$(bindir)/prev
        rm -f $(DESTDIR)$(bindir)/next
-       rm -f $(DESTDIR)$(libdir)/install-mh
        $(LN) $(DESTDIR)$(bindir)/flist  $(DESTDIR)$(bindir)/flists
        $(LN) $(DESTDIR)$(bindir)/folder $(DESTDIR)$(bindir)/folders
        $(LN) $(DESTDIR)$(bindir)/new    $(DESTDIR)$(bindir)/fnext
diff --git a/uip/install-mh.c b/uip/install-mh.c
deleted file mode 100644 (file)
index d5c16d9..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
-** 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
-** complete copyright information.
-*/
-
-#include <h/mh.h>  /* mh internals */
-#include <h/utils.h>
-#include <pwd.h>  /* structure for getpwuid() results */
-
-static struct swit switches[] = {
-#define AUTOSW  0
-       { "auto", 0 },
-#define VERSIONSW  1
-       { "version", 0 },
-#define HELPSW  2
-       { "help", 0 },
-#define CHECKSW  3
-       { "check", 1 },
-       { NULL, 0 }
-};
-
-/*
-** static prototypes
-*/
-static char *geta(void);
-
-
-int
-main(int argc, char **argv)
-{
-       int autof = 0;
-       char *cp, *pathname, buf[BUFSIZ];
-       char *dp, **arguments, **argp;
-       struct node *np;
-       struct passwd *pw;
-       struct stat st;
-       FILE *in, *out;
-       int check;
-
-#ifdef LOCALE
-       setlocale(LC_ALL, "");
-#endif
-       invo_name = mhbasename(argv[0]);
-       arguments = getarguments(invo_name, argc, argv, 0);
-       argp = arguments;
-
-       check = 0;
-
-       while ((dp = *argp++)) {
-               if (*dp == '-') {
-                       switch (smatch(++dp, switches)) {
-                               case AMBIGSW:
-                                       ambigsw(dp, switches);
-                                       done(1);
-                               case UNKWNSW:
-                                       adios(NULL, "-%s unknown\n", dp);
-
-                               case HELPSW:
-                                       snprintf(buf, sizeof(buf), "%s [switches]", invo_name);
-                                       print_help(buf, switches, 0);
-                                       done(1);
-                               case VERSIONSW:
-                                       print_version(invo_name);
-                                       done(1);
-
-                               case AUTOSW:
-                                       autof++;
-                                       continue;
-
-                               case CHECKSW:
-                                       check = 1;
-                                       continue;
-                       }
-               } else {
-                       adios(NULL, "%s is invalid argument", dp);
-               }
-       }
-
-       /*
-       ** Find user's home directory.  Try the HOME environment
-       ** variable first, the home directory field in the password file
-       ** if that's not found.
-       */
-
-       if ((mypath = getenv("HOME")) == NULL) {
-               if ((pw = getpwuid(getuid())) == (struct passwd *)0 ||
-                               *pw->pw_dir == '\0')
-                       adios(NULL, "cannot determine your home directory");
-               else
-                       mypath = pw->pw_dir;
-       }
-
-       /*
-       ** Find the user's profile.  Check for the existence of an
-       ** MH environment variable first with non-empty contents.
-       ** Convert any relative path name found there to an absolute one.
-       ** Look for the profile in the user's home directory if the MH
-       ** environment variable isn't set.
-       */
-
-       if ((cp = getenv("MH")) && *cp != '\0')
-               defpath = getcpy(expanddir(cp));
-       else
-               defpath = concat(mypath, "/", mh_profile, NULL);
-
-       /*
-       ** Check for the existence of the profile file.  It's an
-       ** error if it exists and this isn't an installation check.
-       ** An installation check fails if it does not exist, succeeds
-       ** if it does.
-       */
-
-       if (stat(defpath, &st) != NOTOK) {
-               if (check)
-                       done(0);
-
-               else if (autof)
-                       adios(NULL, "invocation error");
-               else
-                       adios(NULL, "You already have an nmh profile, use an editor to modify it");
-       } else if (check) {
-               done(1);
-       }
-
-       if (!autof && gans("Do you want help? ", anoyes)) {
-               printf("\n"
-                "Prior to using nmh, it is necessary to have a file in your login\n"
-                "directory (%s) named %s which contains information\n"
-                "to direct certain nmh operations.  The only item which is required\n"
-                "is the path to use for all nmh folder operations.  The suggested nmh\n"
-                "path for you is %s/Mail...\n"
-                "\n", mypath, mh_profile, mypath);
-       }
-
-       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 {
-                       goto query;
-               }
-       } else {
-               if (autof)
-                       printf("I'm going to create the standard nmh path for you.\n");
-               else
-                       cp = concat("Do you want the standard nmh path \"",
-                                       mypath, "/", "Mail\"? ", NULL);
-               if (autof || gans(cp, anoyes))
-                       pathname = "Mail";
-               else {
-query:
-                       if (gans("Do you want a path below your login directory? ", anoyes)) {
-                               printf("What is the path?  %s/", mypath);
-                               pathname = geta();
-                       } else {
-                               printf("What is the whole path?  /");
-                               pathname = concat("/", geta(), NULL);
-                       }
-               }
-       }
-
-       chdir(mypath);
-       if (chdir(pathname) == NOTOK) {
-               cp = concat("\"", pathname, "\" doesn't exist; Create it? ",
-                               NULL);
-               if (autof || gans(cp, anoyes))
-                       if (makedir(pathname) == 0)
-                               adios(NULL, "unable to create %s", pathname);
-       } else {
-               printf("[Using existing directory]\n");
-       }
-
-       /*
-       ** 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);
-       np->n_context = 0;
-       np->n_next = NULL;
-
-       /*
-       ** If there is a default profile file in the
-       ** nmh `etc' directory, then read it also.
-       */
-       if ((in = fopen(mh_defaults, "r"))) {
-               readconfig(&np->n_next, in, mh_defaults, 0);
-               fclose(in);
-       }
-
-       ctxpath = getcpy(toabsdir(context = "context"));
-
-       /* Initialize current folder to default */
-       context_replace(curfolder, defaultfolder);
-       context_save();
-
-       /*
-       ** Now write out the initial .mh_profile
-       */
-       if ((out = fopen(defpath, "w")) == NULL)
-               adios(defpath, "unable to write");
-       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;
-}
-
-
-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;
-}
diff --git a/uip/mmh.sh b/uip/mmh.sh
new file mode 100755 (executable)
index 0000000..cb27ae8
--- /dev/null
@@ -0,0 +1,143 @@
+#!/bin/sh
+# 2011  markus schnalke <meillo@marmaro.de>
+#
+# replacement for install-mh(1)
+# set up mmh for the user
+#
+# Uses: folder(1)
+#
+# Todo: use chmod or set umask for created files?
+# Todo: install signal handlers and tell how to abort
+
+
+# the following constants must match the values in config/config.c
+mmhdir=.mmh
+profile=profile
+mailstore=Mail
+
+
+#
+# process args
+#
+while [ $# -ge 1 ] ; do
+       case $1 in
+       -c*)
+               # check if mmh is set up
+               # Note: The mail storage dir gets silently created if
+               #       everything else is properly set up.
+               # (folder will always create the folder if input is no tty!)
+               echo | folder >/dev/null 2>&1
+               exit $?
+               ;;
+       -v*)
+               echo "mmh has no own version number, thus this instead:"
+               folder -version
+               exit 0
+               ;;
+       -h*|*)
+               echo "Usage: $0      -- set up mmh for you" >&2
+               echo "       $0 -c   -- check if mmh is set up for you" >&2
+               exit 1
+       esac
+       shift
+done
+
+
+cat <<!
+Welcome to mmh, meillo's MH version
+===================================
+This program does only one small, but important task: it sets up mmh for your
+user account. Afterwards you can access the functions of mmh by using any of
+the specialized tools from the mmh toolchest. The man page mmh(1) lists them.
+Consult the man pages of the individual programs for further documentation.
+
+But now, let's set up mmh for you ...
+
+!
+
+
+# fail early and loud
+set -e
+
+
+finish() {
+       cd "$mmhpath"
+       echo "Path: $mailstore" >"$profile"
+       echo 3.
+       folder
+       echo
+       echo "Enjoy ..."
+       exit 0
+}
+
+
+#
+# mmh dir
+#
+mmhdir="${MMH:=$mmhdir}"
+cd  # relative to HOME
+echo 1.
+if [ -d "$mmhdir" ] ; then
+       echo "--> Using existing mmh directory $mmhdir"
+else
+       mkdir "$mmhdir" && echo "--> Created mmh directory $mmhdir"
+fi
+cd "$mmhdir"
+mmhpath="`pwd`"
+
+
+#
+# profile
+#
+profile="${MMHP:=$profile}"  # relative to $mmhpath
+if [ -f "$profile" ] ; then
+       echo 2.
+       echo "You already have an mmh profile."
+       printf "Do you want to edit the file now? [Y/n]  "
+       read answ
+       case "$answ" in
+       ''|Y*|y*)
+               cd "$mmhpath"
+               ${VISUAL:-${EDITOR:-vi}} "$profile"
+               echo 3.
+               folder
+               echo
+               echo "Enjoy ..."
+               exit 0
+               ;;
+       *)
+               echo "Exiting."
+               exit 1
+               ;;
+       esac
+fi
+
+
+#
+# mail store
+#
+echo 2.
+echo "Mmh needs a mail storage."
+cd  # relative to HOME
+if [ -d "$mailstore" ] ; then
+       echo "The suggested directory `pwd`/$mailstore already exists."
+       printf "Do you want to use it for mmh? [Y/n]  "
+       read answ
+       case "$answ" in
+       ''|Y*|y*)
+               cd "$mailstore"
+               echo "--> Using existing directory $mailstore"
+               finish
+               exit
+               ;;
+       esac
+fi
+printf "Where do you want it to be located? [`pwd`/Mail]  "
+read answ
+if [ -z "$answ" ] ; then
+       answ="`pwd`/Mail"
+fi
+mkdir "$answ" && echo "--> Created $answ"
+cd "$answ"
+mailstore="`pwd`"
+finish