$(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
# 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 \
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)
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
+++ /dev/null
-/*
-** 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;
-}
--- /dev/null
+#!/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