Menu software... version 1.35 upgrade to "lush" part 1/1
Paul Shields
shields at yunccn.UUCP
Tue Jan 9 10:15:20 AEST 1990
Note: I haven't compiled lush for MS-DOS in at least a year. You may
have to work on it.
You'll also need a termcap library that will work on MS-DOS. I ported
the GNU termcap to MS-DOS and posted it to comp.sources.misc some time
ago (last year? I don't recall.) Drop me a note if you can't find it
anywhere, and I'll send it to you.
#--------------------------------CUT HERE-------------------------------------
#! /bin/sh
#
# This is a shell archive. Save this into a file, edit it
# and delete all lines above this comment. Then give this
# file to sh by executing the command "sh file". The files
# will be extracted into the current directory owned by
# you with default permissions.
#
# The files contained herein are:
#
# -rw-r--r-- 1 shields staff 1941 Jan 8 17:48 Makefile.MS
# -rw-r--r-- 1 shields staff 1185 Jan 8 16:04 config.h
# -rw-r--r-- 1 shields staff 1643 Jan 8 16:47 defs.h
# -rw-r--r-- 1 shields staff 6587 Jan 8 16:37 edit.c
# -rw-r--r-- 1 shields staff 8788 Jan 8 16:51 envinit.c
# -rw-r--r-- 1 shields staff 701 Jan 8 16:41 login.c
# -rw-r--r-- 1 shields staff 66 Jan 8 17:07 version.h
#
echo 'x - Makefile.MS'
if test -f Makefile.MS; then echo 'shar: not overwriting Makefile.MS'; else
sed 's/^X//' << '________This_Is_The_END________' > Makefile.MS
X# Makefile.MS - Generic MS-DOS Makefile for lush
X# This file is untested, so it will probably need work, especially in
X# the link phase. --Note -- Microsoft make won't work on this Makefile.
X# Use something like NdMake.
X
X# You'll probably want to change LIBDIR and BINDIR to something more sane.
X# Don't forget to change config.h as well.
X
XLIBDIR=\usr\lib\lush
XBINDIR=\usr\local\bin
X
X# compiler definitions you might want to have:
X#
X# -DPROTOTYPE if your compiler can handle prototype statements
X# -DMULTIUSER for MSDOS users, if you have getuid(), getpwnam(), ttyname(), getgrpnam()
X
XDEBUG =
XDEFS = -DMSDOS
XCFLAGS = $(DEBUG) $(DEFS)
XLDFLAGS=
XLIBS = -lc -ltermcap
X
XHFILES = mparse.h mlex.h mfile.h menu.h edit.h lush.h defs.h version.h config.h
XCFILES = mparse.c mlex.c mfile.c menu.c edit.c lush.c envinit.c getin.c login.c
XOBJS = mparse.obj mlex.obj mfile.obj menu.obj edit.obj lush.obj envinit.obj\
X getin.obj login.obj
X
X# ----------------------------- dependencies --------------------------------
X
Xlush.exe: $(OBJS)
X $(CC) $(LDFLAGS) $(OBJS) $(LIBS) -o lush.exe
X
Xclean:
X -del lush.exe
X -del errs
X -del *.obj
X -del *.map
X
Xinstall: lush.exe lushrc menu
X -mkdir $(BINDIR)
X -mkdir $(LIBDIR)
X copy lush.exe $(BINDIR)
X copy lushrc $(LIBDIR)
X copy menu $(LIBDIR)
X
Xmparse.obj: mparse.c mparse.h mlex.h mfile.h menu.h lush.h defs.h config.h
X $(CC) $(CFLAGS) mparse.c -c
X
Xmlex.obj: mlex.c mlex.h mfile.h lush.h defs.h
X $(CC) $(CFLAGS) mlex.c -c
X
Xmfile.obj: mfile.c mfile.h lush.h defs.h
X $(CC) $(CFLAGS) mfile.c -c
X
Xmenu.obj: menu.c menu.h lush.h defs.h config.h
X $(CC) $(CFLAGS) menu.c -c
X
Xedit.obj: edit.c edit.h lush.h defs.h config.h
X $(CC) $(CFLAGS) edit.c -c
X
Xenvinit.obj: envinit.c lush.h defs.h config.h
X $(CC) $(CFLAGS) envinit.c -c
X
Xlogin.obj: login.c defs.h
X $(CC) $(CFLAGS) login.c -c
X
Xgetin.obj: getin.c defs.h
X $(CC) $(CFLAGS) getin.c -c
X
Xlush.obj: lush.c lush.h defs.h config.h version.h
X $(CC) $(CFLAGS) lush.c -c
________This_Is_The_END________
if test `wc -l < Makefile.MS` -ne 71; then
echo 'shar: Makefile.MS was damaged during transit (should have been 71 lines)'
fi
fi ; : end of overwriting check
echo 'x - config.h'
if test -f config.h; then echo 'shar: not overwriting config.h'; else
sed 's/^X//' << '________This_Is_The_END________' > config.h
X/* config.h - some definitions you might want to change. */
X
X#define GLOBALFILE "/usr/lib/lush/lushrc" /* global config file */
X#define MENUFILE "/usr/lib/lush/menu" /* menu file */
X#define ROOTMENU "MAIN_MENU" /* the default root menu */
X
X#ifdef MSDOS
X#define LUSHRC "~/lushrc" /* user config file */
X/* #define MULTIUSER */ /* if you have the getpwiud() library. */
X#else
X#define LUSHRC "~/.lushrc"
X#define MULTIUSER /* UNIX is always multiuser, right? */
X#endif
X
X#define ILLEGAL "|<>;&" /* disallowed user-input characters */
X#define TERM "dumb" /* terminal type if none in environment */
X
X/* things you probably don't want to change... */
X#define LJ_MAX 20 /* Max size of setjmp() stack. This governs how
X many levels down in the menu hierarchy you can go. */
X
X#define MAX_OPTIONS 20 /*(menu.h) max options per menu */
X#define MAX_RESP 10 /*(menu.h) max number of responses per option */
X#define NAME_SIZE 20 /*(menu.h) Max size of a menu name or option word */
X
X#define MAX_MENUS 50 /*(mparse.c) max number of menus in the system */
X
X#define MAX_TOKENS 200 /*(mlex.c) Max number of lexical tokens. */
________This_Is_The_END________
if test `wc -l < config.h` -ne 28; then
echo 'shar: config.h was damaged during transit (should have been 28 lines)'
fi
fi ; : end of overwriting check
echo 'x - defs.h'
if test -f defs.h; then echo 'shar: not overwriting defs.h'; else
sed 's/^X//' << '________This_Is_The_END________' > defs.h
X/* File: defs.h
X Author: PAS
X Date: Sept 7, 1987
X Purpose: Contains global definitions for lush and other programs.
X */
X/* -- standard headers -------------------------------------------------- */
X
X#ifdef DEBUG
X#include <stdio.h>
X#endif
X#include <fcntl.h>
X
X/* #ifdef MSDOS
X#include <stdlib.h>
X#include <dos.h>
X#include <float.h>
X#endif */
X
X#include <string.h>
X#include <ctype.h>
X#include <time.h>
X#ifdef MULTIUSER
X#include <pwd.h>
X#include <grp.h>
X#endif
X#include <signal.h>
X#include <setjmp.h>
X#include <errno.h>
X
X#ifndef PROTOTYPE /* function declarations are not done for us. */
Xextern char *malloc();
Xextern int getopt();
Xextern char *getenv();
Xextern int putenv();
X#ifdef MULTIUSER
Xextern char *ttyname();
Xextern char *getlogin();
X#endif
X#endif
X
X/* -- system dependent defs --------------------------------------------- */
X
X#ifdef MSDOS
X#define access laccess /* our own access() function. */
X#define TTY "con" /* default terminal. */
X#else
X#define TTY "/dev/null" /* no default terminal. */
X#endif
X
X#ifdef MULTIUSER /* have getpwiud() library? */
X#define GROUP "/etc/group" /* various group access permissions. */
X#define PASSWD "/etc/passwd" /* where to find the passwords. */
X#else
X#define USER "nobody" /* user name */
X#define HOMEDIR "/" /* home directory */
X#endif
X
X/* -- immutable defs ---------------------------------------------------- */
X
X/* function return values... */
X#define OK 0
X#define ERROR -1
X#define FALSE 0
X#define TRUE 1
X
X#define MAX_LEN 255 /* maximum line length in a file */
X#define PATH_LEN 64 /* max length of a path. */
________This_Is_The_END________
if test `wc -l < defs.h` -ne 67; then
echo 'shar: defs.h was damaged during transit (should have been 67 lines)'
fi
fi ; : end of overwriting check
echo 'x - edit.c'
if test -f edit.c; then echo 'shar: not overwriting edit.c'; else
sed 's/^X//' << '________This_Is_The_END________' > edit.c
X/* File: edit.c
X Author: Paul Shields
X Date: May 15, 1987
X Purpose: this is where the real work is done.
X */
X
X#include "lush.h"
X#ifndef DEBUG
X#include <stdio.h>
X#endif
X#include "edit.h"
X
X#ifdef PROTOTYPE
Xint (*funcs[])(char *) = /* array of pointers to functions taking char* and returning int. */
X#else
Xint (*funcs[])() =
X#endif
X{ ChgDir, /* 00 change directory */
X ChkPort, /* 01 check port access */
X ChkTerm, /* 02 check terminal type */
X Pause, /* 03 pause with "Press enter: " message */
X ChkRdAcc, /* 04 check read access to a file list */
X CallCmd, /* 05 system() to a command with parameters */
X SecurChk, /* 06 perform a security check */
X ChkWrAcc, /* 07 check write access to a file list */
X Expert, /* 08 toggle novice/expert mode */
X P1name, /* 09 write prompt, get parameter. */
X P2name, /* 10 write prompt, get second parameter. */
X ChkAccess, /* 11 check read/write access to a file list */
X SetEnvt, /* 12 set environment variable */
X SaveStr, /* 13 save string in (global) recall-buffer */
X P1Recall, /* 14 put recall-buffer in parameter 1 */
X P2Recall /* 15 put recall-buffer in parameter 2 */
X};
X
Xstatic char param1[MAX_LEN]; /* parameter for CallCmd. */
Xstatic char param2[MAX_LEN]; /* parameter for CallCmd. */
Xstatic char recall[MAX_LEN]; /* global recall-buffer. */
X
Xint ChgDir(dn) /* change to a directory. */
Xchar *dn;
X{
X char *buf, pbuf[MAX_LEN];
X
X sprintf(pbuf, dn, param1, param2); /* add the parameter(s) to the command. */
X buf = envsubst(pbuf); /* substitute environment variables if nec. */
X
X if(chdir(buf) != 0) {
X perror(buf);
X return ERROR;
X }
X return OK;
X}
X
Xint lookupfile(nam, str) /* find a string in a file. */
Xchar *nam, *str;
X{
X FILE *fp;
X char line[MAX_LEN+1];
X int i = strlen(str);
X
X line[MAX_LEN] = '\0';
X if((fp = fopen(nam, "r")) != NULL) {
X while(fgets(line, MAX_LEN, fp) != NULL)
X if(strncmp(str, line, i) == 0) {
X fclose(fp);
X return OK;
X }
X fclose(fp);
X } else
X perror(nam);
X
X return ERROR;
X}
X
Xint ChkPort(c) /* check for local mode */
Xchar *c;
X{
X if(lookupfile(c, tty) == OK)
X return OK;
X
X printf("\nThis command is unavailable from TTY %s\n", tty);
X return ERROR;
X}
X
Xint ChkTerm(c) /* check for remote mode */
Xchar *c;
X{
X if(lookupfile(c, term) == OK)
X return OK;
X
X printf("\nThis command is unavailable on terminals of type %s\n", term);
X return ERROR;
X}
X
Xint Pause(c) /* wait for user */
Xchar *c;
X{
X getin("Press enter: ");
X return OK;
X}
X
Xint ChkRdAcc(list) /* 04 */
Xchar *list;
X{
X printf("\nFile Access Check failed\n");
X return ERROR;
X}
X
Xint ChkWrAcc(list) /* 07 */
Xchar *list;
X{
X printf("\nFile Access Check failed\n");
X return ERROR;
X}
X
Xint ChkAccess(list) /* 11 */
Xchar *list;
X{
X printf("\nFile Access Check failed\n");
X return ERROR;
X}
X
Xint P1name(prompt)
Xchar *prompt;
X{
X int i;
X char *p;
X
X p = getin(prompt);
X
X if(strlen(p) > 0) {
X /* none of that funny stuff... */
X i = strcspn(p, ILLEGAL);
X }
X else i=0;
X
X strncpy(param1, p, i);
X param1[i] = '\0';
X
X return OK; /* null is ok. */
X}
X
Xint P2name(prompt)
Xchar *prompt;
X{
X int i;
X char *p;
X
X p = getin(prompt);
X
X if(strlen(p) > 0) {
X /* none of that funny stuff... */
X i = strcspn(p, ILLEGAL);
X }
X else i=0;
X
X strncpy(param2, p, i);
X param2[i] = '\0';
X
X return OK; /* null is ok. */
X}
X
Xint CallCmd(cmd) /* use the system function to execute a command. */
Xchar *cmd; /* name of command to call. */
X{
X int ret;
X char *buf, pbuf[MAX_LEN];
X
X sprintf(pbuf, cmd, param1, param2); /* add the parameter(s) to the command. */
X buf = envsubst(pbuf); /* substitute environment variables if nec. */
X
X#ifdef DEBUG
X if(debuglevel & 1)
X fprintf(stderr,"CallCmd(%s)= system(\"%s\")\n", cmd, buf);
X#endif
X if((ret = system(buf)) == 0)
X return OK;
X
X#ifdef DEBUG
X fprintf(stderr,"--returned error %d--\n", errno);
X perror(buf);
X#endif
X return ERROR;
X}
X
X/* Return TRUE if user is a member of the group, ow FALSE.
X */
Xstatic int member(gr)
Xchar *gr;
X{
X#ifdef MULTIUSER
X struct group *grp;
X char **n;
X
X if((grp = getgrnam(gr)) != NULL) {
X for(n = grp->gr_mem; *n != NULL && strcmp(user, *n) != 0; n++)
X#ifdef DEBUG
X if(debuglevel & 1)
X fprintf(stderr, "%s ",*n)
X#endif
X ;
X return (*n != NULL);
X }
X /* else invalid group. */
X printf("\nSystem error verifying group %s. Please consult system administrator\n",gr);
X return FALSE;
X#else
X /* in single-user system, always return TRUE */
X
X return TRUE;
X#endif
X}
X
Xint SecurChk(gr) /* check to see that the user is a member of the */
Xchar *gr; /* permitted groups... */
X{
X#ifdef DEBUG
X if(debuglevel & 1)
X fprintf(stderr,"SecurChk(%s) ",gr);
X#endif
X#ifdef MULTIUSER
X if(getuid() == 0)
X return OK;
X
X if(*gr == '!') { /* user must not be member of this group. */
X if(!member(++gr)) return OK;
X } else
X if(member(gr)) return OK;
X
X printf("\nYou are not allowed to use this command.\n");
X return ERROR;
X#else
X return OK; /* single-user system, always return TRUE. */
X#endif
X}
X
Xint Expert(w) /* toggle novice/expert mode */
Xchar *w;
X{
X novice ^= TRUE; /* xor */
X return OK;
X}
X
Xint SetEnvt(w) /* set environment variable. allocates memory for it, */
Xchar *w; /* and substitutes parameters, etc. */
X{
X char *buf, pbuf[MAX_LEN];
X
X sprintf(pbuf, w, param1, param2); /* add the parameter(s) to the command. */
X buf = envsubst(pbuf); /* substitute environment variables if nec. */
X
X if((w = malloc(strlen(buf)+1)) == NULL) /* allocate in static storage */
X return ERROR;
X strcpy(w, buf);
X
X if(putenv(w) != 0) {
X free(w);
X return ERROR;
X }
X return OK;
X}
X
Xint SaveStr(w) /* save string in global recall buffer. */
Xchar *w;
X{
X strncpy(w, recall, MAX_LEN-1);
X recall[MAX_LEN] = 0;
X return OK;
X}
X
Xint P1Recall(w) /* save string in global recall buffer. */
Xchar *w;
X{
X strcpy(recall, param1);
X return OK;
X}
Xint P2Recall(w) /* save string in global recall buffer. */
Xchar *w;
X{
X strcpy(recall, param2);
X return OK;
X}
________This_Is_The_END________
if test `wc -l < edit.c` -ne 283; then
echo 'shar: edit.c was damaged during transit (should have been 283 lines)'
fi
fi ; : end of overwriting check
echo 'x - envinit.c'
if test -f envinit.c; then echo 'shar: not overwriting envinit.c'; else
sed 's/^X//' << '________This_Is_The_END________' > envinit.c
X/* File: envinit.c
X Author: Paul Shields
X Date: May 13, 1987
X Purpose: sets up variables for the environment.
X */
X
X#include "lush.h"
X#ifndef DEBUG
X#include <stdio.h>
X#endif
X
X/* We logged into the console, a local tty, or a remote tty. Certain things
X are unavailable from a remote tty, so we'll need to compare the environment
X variable TTY with a list of permitted devices when the need calls for it.
X */
Xchar *root_menu = NULL, /* default main menu name. */
X *menufile = NULL, /* name of menu file. */
X *globalrc = NULL, /* name of global rc file. */
X *userrc = NULL, /* name of user rc file. */
X *user, /* name of the user. */
X *tty, /* TTY environment variable. */
X *term = NULL; /* TERM environment variable. */
X
Xchar *CL, *SO, *SE; /* termcap Clear-screen, Stand-out, Unstand-out */
Xint LI, CO; /* lines, columns */
X
X
Xchar *
Xgethome(u) /* allocate and return user home dir or null. */
Xchar *u;
X{
X#ifdef MULTIUSER
X struct passwd *pw;
X /* if u is null, use default of current user. */
X if(u == NULL || strlen(u) == 0)
X u = user;
X if((pw = getpwnam(u)) == NULL)
X return NULL;
X if((u = malloc(strlen(pw->pw_dir)+1)) == NULL)
X return NULL;
X strcpy(u,pw->pw_dir);
X return u;
X#else
X return HOMEDIR;
X#endif
X}
X
X/* allocate and store an environment variable. */
Xchar *mputenv(var,def)
Xchar *var,*def;
X{
X char *ut;
X if((ut = malloc(strlen(var)+1+strlen(def)+1)) == NULL)
X return NULL;
X sprintf(ut, "%s=%s",var,def);
X putenv(ut);
X return ut;
X}
X
X#define trim(s) {char *tl; while(*s && isspace(*s)) s++; \
X for(tl=s; *tl; tl++) ; for(tl--; tl > s; tl--) \
X { if(isspace(*tl)) *tl = '\0'; else break; } }
X
X/* Process a line in the global rc.
X Allow environment definitions.
X Do translation of $VAR and ~user strings.
X *** Yet to add: System() out to commands enclosed in ``.
X
X Side-effects: writes junk into the line.
X */
Xstatic int proc_global(line)
Xchar *line;
X{
X char *tl, *var, *def;
X
X#ifdef DEBUG
X if(debuglevel & 1)
X fprintf(stderr,"line: |%s|\n",line);
X#endif
X
X/***/ /* this won't do. need to convert to use the scanner in mparse.c */
X if((tl = strpbrk(line,"#")) != NULL) /* strip comments */
X *tl = '\0';
X
X /* look for = and break into two: "A=B" => "A","B" */
X if((def = strpbrk(line, "=")) != NULL) {
X var = strtok(line, "=");
X def++;
X trim(var); /* zap leading/trailing white space */
X trim(def);
X tl = envsubst(def); /* do $ and ~ substitutions */
X mputenv(var, tl);
X } else {
X trim(line);
X if(strlen(line) > 0)
X return ERROR;
X }
X return OK;
X}
X
X/* Process a line in the user rc.
X Only environment definitions allowed.
X Restrict to ones already defined.
X */
Xstatic int proc_user(line)
Xchar *line;
X{
X return proc_global(line); /***/ /* for now, do the same. */
X}
X
X/* Get and process the global rc file */
Xstatic int getrc_global(name)
Xchar *name;
X{
X FILE *fp;
X char line[MAX_LEN+1];
X int ln;
X
X if((fp=fopen(name, "r")) == NULL) {
X perror(name);
X return ERROR;
X }
X for(ln=1; fgets(line, MAX_LEN, fp) != NULL; ln++)
X if(proc_global(line) == ERROR)
X fprintf(stderr,"%s: syntax error: line %d\n",name,ln);
X fclose(fp);
X return OK;
X}
X
X/* Get and process the user rc file */
Xstatic int getrc_user(name)
Xchar *name;
X{
X FILE *fp;
X char line[MAX_LEN+1];
X int ln;
X
X if((fp=fopen(name, "r")) == NULL) {
X perror(name);
X return ERROR;
X }
X for(ln=1; fgets(line, MAX_LEN, fp) != NULL; ln++)
X if(proc_user(line) == ERROR)
X fprintf(stderr,"%s: syntax error: line %d\n",name,ln);
X fclose(fp);
X return OK;
X}
X
Xint envinit(argc,argv)
Xint argc;
Xchar *argv[];
X{
X register char *h;
X char *ut; /* temporary */
X int err = 0, c;
X extern char *optarg;
X
X#ifndef MSDOS
X if(getenv("SHELL") != argv[0]) /* security. */
X mputenv("SHELL",argv[0]);
X#endif
X
X /* find out who we are. */
X#ifdef MULTIUSER
X if((user = getlogin()) == NULL) {
X struct passwd *pw;
X if((pw = getpwuid(getuid())) == NULL) {
X fprintf(stderr,"Can't find your username anywhere.\n");
X return ERROR;
X }
X ut = pw->pw_name;
X if((user = malloc(strlen(ut)+1)) == NULL)
X { perror("envinit()"); return ERROR; }
X strcpy(user,ut);
X }
X#else
X user=USER;
X#endif
X mputenv("USER",user);
X#ifdef DEBUG
X if(debuglevel & 1)
X fprintf(stderr,"USER=<%s> ",user);
X#endif
X
X if((ut = getenv("HOME")) == NULL) {
X if((ut = gethome(user)) == NULL) {
X fprintf(stderr,"No home directory.\n");
X return ERROR;
X }
X mputenv("HOME",ut);
X }
X#ifdef DEBUG
X if(debuglevel & 1)
X fprintf(stderr,"HOME=<%s> ",ut);
X#endif
X
X /* process the command line options... */
X while ((c = getopt(argc, argv, "f:R:M:G:U:")) != EOF)
X switch((char)c) {
X case 'f':
X case 'M':
X if((menufile=malloc(strlen(optarg)+1)) == NULL)
X { perror("envinit()"); return ERROR; }
X strcpy(menufile,optarg);
X break;
X case 'R':
X if((root_menu=malloc(strlen(optarg)+1)) == NULL)
X { perror("envinit()"); return ERROR; }
X strcpy(root_menu,optarg);
X break;
X case 'G':
X if((globalrc=malloc(strlen(optarg)+1)) == NULL)
X { perror("envinit()"); return ERROR; }
X strcpy(globalrc,optarg);
X break;
X case 'U':
X if((userrc=malloc(strlen(optarg)+1)) == NULL)
X { perror("envinit()"); return ERROR; }
X strcpy(userrc,optarg);
X break;
X case '?':
X err = TRUE;
X }
X if(err) {
X fprintf(stderr, "Usage: %s [-G global-config-file] [-M menufile]\n",argv[0]);
X fprintf(stderr, " [-R rootmenu] [-U user-config-file]\n");
X return ERROR;
X }
X
X if(globalrc == NULL) /* default global rc file location */
X globalrc = GLOBALFILE;
X
X#ifdef DEBUG
X if(debuglevel & 1)
X fprintf(stderr,"global rc=<%s>\n",globalrc);
X#endif
X /* Now process global rc file... must always exist. */
X getrc_global(globalrc);
X
X if(menufile == NULL) /* default menu file location */
X if((menufile = getenv("MENUFILE")) == NULL)
X menufile = MENUFILE;
X
X if(root_menu == NULL) /* default root menu name */
X if((root_menu = getenv("ROOTMENU")) == NULL)
X root_menu = ROOTMENU;
X
X if(userrc == NULL)
X if((userrc = getenv("LUSHRC")) == NULL)
X userrc = LUSHRC;
X
X#ifdef DEBUG
X if(debuglevel & 1)
X printf("userrc: <%s>, menufile: <%s>, root_menu: <%s>\n",
X userrc, menufile, root_menu);
X#endif
X /***/ /* note: may need to subst ~ in userrc here. */
X
X /* now process the user rc file... */
X getrc_user(userrc);
X
X if((tty = getenv("TTY")) == NULL) { /* default terminal */
X#ifdef MULTIUSER
X if((ut = ttyname(fileno(stdin))) == NULL)
X tty = TTY;
X else {
X tty = malloc(strlen(ut)+1);
X strcpy(tty, ut);
X }
X#else
X tty = TTY;
X#endif
X mputenv("TTY",tty);
X }
X
X if((term = getenv("TERM")) == NULL) { /* default to "dumb" terminal */
X term = TERM;
X mputenv("TERM",term);
X }
X
X return OK;
X}
X
X/* Initialize the termcap variables. Some of this code is from MicroEMACS
X by Daniel M. Lawrence (and others.) */
Xint
Xtcapinit() /* important. call envinit() before this. */
X{
X char *tgetstr();
X int tgetnum();
X char tcbuf[1024];
X static char strbuf[128];
X char *str = strbuf;
X
X if (term == NULL) {
X fprintf(stderr,"Environment variable TERM not defined!\n");
X return ERROR;
X }
X
X if ((tgetent(tcbuf, term)) <= 0) {
X fprintf(stderr, "Unknown terminal type %s!\n", term);
X return ERROR;
X }
X
X LI = tgetnum("li"); /* lines & columns */
X CO = tgetnum("co");
X
X if((CL = tgetstr("cl",&str)) == NULL) /* clear screen */
X CL = "\n------------------------------------------------------------------------------\n";
X
X if((SO = tgetstr("so",&str)) == NULL) /* stand-out enter */
X SO = "";
X
X if((SE = tgetstr("se", &str)) == NULL) /* stand-out end */
X SE = "";
X
X /* caution: we lose access to tcbuf now. don't call any more termcap
X functions. CL, SO, and SE are in static memory. */
X
X return OK;
X}
X
Xstatic char retbuf[BUFSIZ];
X#define scanword(s, var) {char *tmp; \
X tmp = ++(s); while(isalnum(*(s))) (s)++; \
X strncpy(var, tmp, (s)-tmp); \
X (var)[(s)-tmp] = '\0'; }
X
Xchar * /* substitute environment values in "$VAR" strings for s. */
Xenvsubst(s) /* returns with static data which is overwritten by the next call. */
Xchar *s;
X{
X char *r = retbuf, *tmp;
X static char var[MAX_LEN];
X
X while(*r = *s) {
X if(*s == '\\') /* escape with \$ or \~. */
X *++r = *++s;
X if(*s == '$') { /* substitute */
X scanword(s, var);
X if((tmp = getenv(var)) == NULL) /* look it up.. */
X tmp = ""; /* Nothing there */
X while(*r = *tmp++) /* copy */
X r++;
X continue;
X }
X if(*s == '~') { /* look for ~user */
X scanword(s, var);
X
X if((tmp = gethome(var)) == NULL)
X tmp = ""; /* no translation */
X
X while(*r = *tmp++) /* copy */
X r++;
X continue;
X }
X s++;
X r++;
X }
X
X return retbuf;
X}
________This_Is_The_END________
if test `wc -l < envinit.c` -ne 362; then
echo 'shar: envinit.c was damaged during transit (should have been 362 lines)'
fi
fi ; : end of overwriting check
echo 'x - login.c'
if test -f login.c; then echo 'shar: not overwriting login.c'; else
sed 's/^X//' << '________This_Is_The_END________' > login.c
X/* File: login.c
X Author: Paul Shields
X Date: May 13, 1987
X Purpose: Miscellaneous esoteric system-dependent functions
X */
X
X#include "defs.h"
X#ifndef NULL
X#define NULL (char *)0
X#endif
X
X/***/ /* the following is a stub. it does nothing. */
Xvoid login(p) /* log in operator. */
Xchar *p; /* oper name */
X{
X#ifdef MULTIUSER
X struct passwd *pwd = getpwuid(getuid());
X
X if((char *)pwd != NULL)
X strcpy(p,pwd->pw_name); /* set operator name */
X#else
X strcpy(p,USER);
X#endif
X
X /***/ /* remember login time. */
X}
X
X/***/ /* the following is a stub. it does nothing. */
Xvoid logout(p) /* log out operator */
Xchar *p; /* oper name */
X{ /* log system use */
X}
________This_Is_The_END________
if test `wc -l < login.c` -ne 32; then
echo 'shar: login.c was damaged during transit (should have been 32 lines)'
fi
fi ; : end of overwriting check
echo 'x - version.h'
if test -f version.h; then echo 'shar: not overwriting version.h'; else
sed 's/^X//' << '________This_Is_The_END________' > version.h
X#define VERSION "LUSH version 1.35, Mon Jan 8 17:06:49 EST 1990"
________This_Is_The_END________
if test `wc -l < version.h` -ne 1; then
echo 'shar: version.h was damaged during transit (should have been 1 lines)'
fi
fi ; : end of overwriting check
exit 0
--
Paul Shields, shields at nccn.yorku.ca (..!uunet!yunccn!shields)
More information about the Alt.sources
mailing list