From 3d8d4b3686dc5f041dd3d9129e64654dc11080d6 Mon Sep 17 00:00:00 2001 From: danw Date: Tue, 2 Jul 1996 01:48:42 +0000 Subject: [PATCH] Initial revision --- Makefile | 274 +++++ afssync/INSTRUCTIONS | 168 +++ afssync/Imakefile | 24 + clients/moira/Doc/Makefile | 9 + clients/moira/Doc/delete.doc | 158 +++ clients/moira/Doc/internal.PS.Z | 152 +++ clients/moira/Doc/internal.mss | 1765 +++++++++++++++++++++++++++++ clients/mrtest/scripts/dcm.sc | 140 +++ clients/mrtest/scripts/doit.sc | 4 + clients/mrtest/scripts/filesys.sc | 138 +++ clients/mrtest/scripts/list.sc | 103 ++ clients/mrtest/scripts/mach.sc | 115 ++ clients/mrtest/scripts/misc.sc | 106 ++ clients/mrtest/scripts/queries.sc | 16 + clients/mrtest/scripts/users.sc | 142 +++ clients/mrtest/scripts/zephyr.sc | 33 + clients/userreg/login.info | 2 + clients/xregister/Makefile | 13 + clients/xregister/help | 1 + clients/xregister/welcome | 10 + gen/report.dc | 286 +++++ include/afs/auth.h | 57 + include/des.h | 48 + include/kadm.h | 141 +++ include/mit-sipb-copyright.h | 19 + include/prot.h | 87 ++ man/canonicalize_hostname.3 | 1 + man/format_filesys_type.3 | 1 + man/mr_auth.3 | 1 + man/mr_connect.3 | 1 + man/mr_disconnect.3 | 1 + man/mr_do_update.3 | 1 + man/mr_host.3 | 1 + man/mr_motd.3 | 1 + man/mr_noop.3 | 1 + man/mr_query.3 | 1 + man/mr_set_alternate_input.3 | 1 + man/parse_filesys_type.3 | 1 + man/sq_create.3 | 1 + man/sq_destroy.3 | 1 + man/sq_empty.3 | 1 + man/sq_get_data.3 | 1 + man/sq_remove_data.3 | 1 + man/sq_save_args.3 | 1 + man/sq_save_data.3 | 1 + man/sq_save_unique_data.3 | 1 + man/sq_save_unique_string.3 | 1 + man/strsave.3 | 1 + man/strtrim.3 | 1 + reg_svr/regtest/create | 12 + reg_svr/regtest/message | 50 + reg_svr/regtest/message.head | 13 + reg_svr/regtest/message.tail | 37 + reg_svr/regtest/names | 39 + reg_svr/regtest/names.crypt | 39 + reg_svr/regtest/printit | 11 + reg_svr/regtest/script | 39 + server/TODO | 34 + 58 files changed, 4308 insertions(+) create mode 100644 Makefile create mode 100644 afssync/INSTRUCTIONS create mode 100644 afssync/Imakefile create mode 100644 clients/moira/Doc/Makefile create mode 100644 clients/moira/Doc/delete.doc create mode 100644 clients/moira/Doc/internal.PS.Z create mode 100644 clients/moira/Doc/internal.mss create mode 100644 clients/mrtest/scripts/dcm.sc create mode 100644 clients/mrtest/scripts/doit.sc create mode 100644 clients/mrtest/scripts/filesys.sc create mode 100644 clients/mrtest/scripts/list.sc create mode 100644 clients/mrtest/scripts/mach.sc create mode 100644 clients/mrtest/scripts/misc.sc create mode 100644 clients/mrtest/scripts/queries.sc create mode 100644 clients/mrtest/scripts/users.sc create mode 100644 clients/mrtest/scripts/zephyr.sc create mode 100644 clients/userreg/login.info create mode 100644 clients/xregister/Makefile create mode 100644 clients/xregister/help create mode 100644 clients/xregister/welcome create mode 100644 gen/report.dc create mode 100644 include/afs/auth.h create mode 100644 include/des.h create mode 100644 include/kadm.h create mode 100644 include/mit-sipb-copyright.h create mode 100644 include/prot.h create mode 100644 man/canonicalize_hostname.3 create mode 100644 man/format_filesys_type.3 create mode 100644 man/mr_auth.3 create mode 100644 man/mr_connect.3 create mode 100644 man/mr_disconnect.3 create mode 100644 man/mr_do_update.3 create mode 100644 man/mr_host.3 create mode 100644 man/mr_motd.3 create mode 100644 man/mr_noop.3 create mode 100644 man/mr_query.3 create mode 100644 man/mr_set_alternate_input.3 create mode 100644 man/parse_filesys_type.3 create mode 100644 man/sq_create.3 create mode 100644 man/sq_destroy.3 create mode 100644 man/sq_empty.3 create mode 100644 man/sq_get_data.3 create mode 100644 man/sq_remove_data.3 create mode 100644 man/sq_save_args.3 create mode 100644 man/sq_save_data.3 create mode 100644 man/sq_save_unique_data.3 create mode 100644 man/sq_save_unique_string.3 create mode 100644 man/strsave.3 create mode 100644 man/strtrim.3 create mode 100755 reg_svr/regtest/create create mode 100644 reg_svr/regtest/message create mode 100644 reg_svr/regtest/message.head create mode 100644 reg_svr/regtest/message.tail create mode 100644 reg_svr/regtest/names create mode 100644 reg_svr/regtest/names.crypt create mode 100755 reg_svr/regtest/printit create mode 100644 reg_svr/regtest/script create mode 100644 server/TODO diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..aff57e98 --- /dev/null +++ b/Makefile @@ -0,0 +1,274 @@ +# Makefile generated by imake - do not edit! +# $XConsortium: imake.c,v 1.86 93/10/11 12:12:36 rws Exp $ + +# +# This makefile is automatically generated by imake... do not modify +# or you may lose your changes when imake generates makefiles again. +# Ignore this message if you are not using imake. +# +# $Source$ +# + +NEWTOP=. +BUILDTOP=. + +INCLUDE= -I$(BUILDTOP)/include -I$(BUILDTOP)/lib -I/usr/athena/include \ + $(SS_INCL) +CFLAGS=$(DBG) $(INCLUDE) $(DEFINES) $(GLOBAL_CDEFS) +LINTFLAGS=$(INCLUDE) $(DEFINES) $(GLOBAL_CDEFS) + +# $Source$ +# + +CURSES= -L/usr/css/lib -lcurses -ltermcap + +OSDEFS= -DPOSIX -DSOLARIS -I/usr/openwin/include +OSLIBS= -L/usr/ccs/lib -lcurses -ltermcap -lresolv \ + -lsocket -lnsl -lc /usr/ucblib/libucb.a -lelf -ldl +CURSES= + +GLOBAL_CDEFS= -DHESIOD -DZEPHYR -DGDSS -DATHENA -DDBMS=INGRES -I/usr/athena/include $(OSDEFS) + +SRCTOP=/mit/moiradev/src + +DESTDIR= + +USRDIR= /usr +ETCDIR= /usr/athena/etc +PROGDIR=/usr/athena/bin +LIBDIR= /usr/athena/lib +LINTLIBDIR = /usr/lib/lint +INCLDIR= /usr/athena/include +MANDIR= /usr/athena/man + +LZEHPYR=-lzephyr + +LIBGDSS= /mit/gdss/`machtype`/libgdss.a +GDSSINC= -I/mit/gdss/include + +LINTLIBFLAG=-C + +MR_LIB=$(BUILDTOP)/lib/libmoira.a +MR_LIBDEP=$(MR_LIB) +MR_LINTLIB=$(BUILDTOP)/lib/llib-lmoira.ln +GDB_LIB=$(BUILDTOP)/gdb/libmrgdb.a +GDB_LIBDEP=$(GDB_LIB) +GDB_LINTLIB=$(BUILDTOP)/gdb/llib-lmrgdb.ln + +COMPILE_ET= compile_et + +COM_ERR = -lcom_err + +MAKE_COMMANDS= mk_cmds + +SS_LIB = -lss + +LLIB = -L/usr/athena/lib + +CLIBS= $(MR_LIB) $(GDB_LIB) $(LLIB) $(LZEPHYR) $(COM_ERR) -lkrb -ldes -lhesiod + +SQL_LIB= /usr/ingres/lib/libingres.a -lm + +ARCHIVE= ar cru + +RANLIB= /bin/true + +INSTALLFILE= install -c -m 444 + +INSTALLLIB= install -c -m 444 + +INSTALLPROG= install -c -m 555 + +INSTALLRAW= install + +LD=ld + +AS=as + +LINT=lint + +CC=gcc -traditional + +CCRO=$(CC) -R + +HCC=$(CC) + +CPP=$(CC) -E + +DBG=-O + +HCFLAGS=$(CFLAGS) + +TAGGER=etags + +MAKE=make +RM=rm -f +MV=mv +CP=cp +LN=ln -s +LPR=lpr -p +CHMOD=chmod +AWK=awk + +DEPEND=makedepend +IMAKE=imake -I$(BUILDTOP)/util/imake.includes + +# $Source$ +# + +# $Header$ +# +# Copyright 1990 by the Massachusetts Institute of Technology. +# +# For copying and distribution information, +# please see the file . +# +# Imakefile for top level directory. +# + +CODE=Imakefile +CLIENTDIRS=util include gdb lib clients man update +SVRDIRS=server db backup dbck dcm gen reg_svr incremental regtape + +SUBDIRS=$(CLIENTDIRS) + +all:: + +world:: + make ${MFLAGS} clean-imake + make ${MFLAGS} Makefile + make ${MFLAGS} Makefiles + make ${MFLAGS} depend + make ${MFLAGS} all + +clean-imake: + cd util/imake; make clean + +imake:: + cd util/imake; make + +install:: + -mkdir ${DESTDIR} + -mkdir ${DESTDIR}${USRDIR} + -mkdir ${DESTDIR}${ETCDIR} + -mkdir ${DESTDIR}${PROGDIR} + -mkdir ${DESTDIR}${LIBDIR} + -mkdir ${DESTDIR}${LINTLIBDIR} + -mkdir ${DESTDIR}${INCLDIR} + -mkdir ${DESTDIR}${MANDIR} + -mkdir ${DESTDIR}${MANDIR}/man1 + -mkdir ${DESTDIR}${MANDIR}/man3 + -mkdir ${DESTDIR}${MANDIR}/man5 + -mkdir ${DESTDIR}${MANDIR}/man8 + -mkdir ./bin + +et: + cd util/et; make ${MFLAGS} DEPEND="$(BUILDTOP)/../../$(DEPEND)" depend; make ${MFLAGS} all + +ss: + cd util/ss; make ${MFLAGS} DEPEND="$(BUILDTOP)/../../$(DEPEND)" depend; make ${MFLAGS} all + +makedepend: + cd util/makedepend; make + +all:: + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making" all "in" `pwd`; \ + $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) all ; \ + echo "### Done with" `pwd`); \ + done + +install:: + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making" install "in" `pwd`; \ + $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) install ; \ + echo "### Done with" `pwd`); \ + done + +clean:: + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making" clean "in" `pwd`; \ + $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) clean ; \ + echo "### Done with" `pwd`); \ + done + +depend:: + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making" depend "in" `pwd`; \ + $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) depend ; \ + echo "### Done with" `pwd`); \ + done + +tags:: + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making" tags "in" `pwd`; \ + $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) tags ; \ + echo "### Done with" `pwd`); \ + done + +print:: + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making" print "in" `pwd`; \ + $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) print ; \ + echo "### Done with" `pwd`); \ + done + +src:: + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making" src "in" `pwd`; \ + $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) src ; \ + echo "### Done with" `pwd`); \ + done + +Makefiles:: + @echo "### Making Makefiles in" `pwd` + @for d in $(SUBDIRS); \ + do \ + (cd $$d; echo "### Making Makefile in" `pwd`; \ + $(MAKE) $(MFLAGS) SRCTOP=$(SRCTOP) \ + NEWTOP=../$(BUILDTOP) \ + BUILDTOP=../$(BUILDTOP) \ + -f ../Makefile \ + Makefile; \ + $(MAKE) $(MFLAGS) SRCTOP=$(SRCTOP) \ + NEWTOP=../$(BUILDTOP) \ + Makefiles; \ + echo "### Done with" `pwd`); \ + done + +depend:: $(SRCS) + @echo "### Now computing dependencies" + @$(DEPEND) -s "# DO NOT DELETE" -- $(CFLAGS) -- $(SRCS) + +clean:: + $(RM) *~ \#* *.bak $(TAGSFILE) + +tags:: + $(TAGGER) *.c *.h + +Makefile:: + -$(RM) Makefile.bak; $(MV) Makefile Makefile.bak + $(IMAKE) -DNEW_TOP=$(NEWTOP) -s Makefile + +print:: ${CODE} + ${LPR} ${CODE} + +src:: ${CODE} + +${CODE}: + $(RM) $@ + -$(LN) ${SRCDIR}/$@ $@ + +install:: + +Makefiles:: + +# DO NOT DELETE THIS LINE + diff --git a/afssync/INSTRUCTIONS b/afssync/INSTRUCTIONS new file mode 100644 index 00000000..05bc2502 --- /dev/null +++ b/afssync/INSTRUCTIONS @@ -0,0 +1,168 @@ +Date: Tue, 26 Jul 1994 14:37:39 -0400 +To: Kimberly Carney +Cc: dkk@MIT.EDU, op@MIT.EDU +In-Reply-To: Kimberly Carney's message of Tue, 26 Jul 1994 14:00:29 EDT, + <9407261800.AA13079@chich.MIT.EDU> +Subject: Re: AFS prdb sync'd with Moira +From: "Richard Basch" + +[ Note: make sure that you have the binaries from afsuser copied + locally onto your local machine; also make sure that you have all + scripts (see below) copied locally before you start, since AFS may + disappear on you. Altnertiavely, your machine should not be + depending on the Athena cell. For syspacks, root.afs (/afs), etc. + Make sure you have superuser tokens for all cells that you might need.] + +The binaries are now in /moira/sync/ on the Moira server. +Most of the commands must be done on the Moira server. + + touch /moira/afs/noafs +(This gives you some grace time, but watch for critical AFS errors after +this happens, as you will have to handle those by hand.) + +[ 30 minutes after an AFS incrementals starts, they will time out.... + So after that, they will log critical error and then they will + have to be done by hand! ] + + /moira/sync/afssync /var/prdb.moira +(I recommend that you do the following few steps concurrently with this, +as the "noafs" lock file doesn't give you too much grace time.) +[ ^^ This takes roughly 20-40 minutes.] + +[ Check all PTS servers to make sure they have a consistent versions. + Note the PTS database version number, make sure no write + transactions are in progress. "udebug -p 7002".] + + rcp root@orf:/usr/afs/db/prdb.DB0 /var/prdb.old +(use "udebug -p 7002" before and after to make sure the version +hasn't changed.) + +[ Check to make sure that the version number is the same with udebug.] + + /moira/sync/pt_util -x -m -u -g -d /var/prdb.extra -p /var/prdb.old + perl /moira/sync/pt_util.pl < /var/prdb.extra > /var/prdb.extra.sort +(These two commands extract and prepare the personal groups and special +user entries in the old prdb for being reincorporated into the new prdb.) + +*** Make sure the "afssync" command has completed *** + cp /var/prdb.moira /var/prdb.new + /moira/sync/pt_util -w -d /var/prdb.extra.sort -p /var/prdb.new +(This almost completes the preparation of the prdb.) +[ ^^ This takes 40 minutes, may take longer. Exponentially with +number of personal groups.] + + pts listmax +(Save the numbers printed.) + +copy /var/prdb.new to *ALL* the database servers (/usr/afs/db/prdb.new) + +The following should be done as quickly as possible... + +foreach i ( ) + bos shutdown $i ptserver + bos exec $i "rm /usr/afs/db/prdb.DB*; mv /usr/afs/db/prdb.new /usr/afs/db/prdb.DB0" +end + +foreach i ( ) + bos restart $i ptserver +end + +Watch the status of the servers using "udebug" to make sure things are +going well... make sure the beacons are working, and that once quorom +is established that the servers are resynchronizing their notions of the +databases and that the dbcurrent and up fields all become set and the +state goes to 1f. Also watch out for large rx packet queues on port +7002 using rxdebug, as the fileservers may get excessively backlogged, +and restart servers, if necessary, if the congestion remains excessive. + +[ Use udebug on prill.... will take 75 seconds for the pts servers to +elect a master, and then additional time for the master to propagate +its database to the rest of the pts servers.] + + pts listmax +(if the id's are lower than the saved ones, reset them appropriately to +the saved one's, using "pts setmax"). + + pts ex system:administrators +(good spot check, especially since it has special people) +(also spot check one of the personal groups and perhaps, something like +the membership of rcmd.ronald-ann) + + rm /moira/afs/noafs +(You need to remove the lock file you put on.) + +-Richard + +*************************************************************************** + +NOTES: + +1. There is also a faster pt_util command for integrating the various personal +groups. However, it has not been fully verified. It can be found in the +development sources as pt_util-fast.c. Feel free to try using this one, but +I would also recommend generating the database the old way just in case... + +2. The goal is to minimize the outage and minimize the potential for changes +so concurrency is highly recommended. + +3. Make sure you copy the database to all the protection servers, as the +servers will be more than happy to give "no such user" answers and users +will not be able to reestablish authentic connections without doing +"aklog -force". + +4. Don't do this when you're tired... There may be no cleanup procedure +available, with certain mistakes. + +5. /moira/afs/noafs is only good for 30 minutes. Keep track of the +critical log, and you may have to do some operations by hand when the +operation is complete. Also, if requests depend on other requests, they +may be processed out of order, and fail, and may need to be done by hand. + +*************************************************************************** + +(The following is a very old message...) + + +To: op@MIT.EDU, mar@MIT.EDU +Cc: tjm@MIT.EDU +Subject: AFS/Moira sync +From: "Richard Basch" + + +I have rebuilt the AFS protection database from the information in the +Moira and old prdb (for the special entries and personal groups). It +has been installed without a problem. The old prdb is in + + prill:/usr/afs/db/prdb.old + +As usual, I installed it with no interruption of service (there may have +been a couple minutes when AFS was a bit slow as the protection database +servers were being restarted, but that's it). + +The following is the basic procedure I used to create the new prdb... + +-Richard + + +moira2# /moira/bin/afssync /var/prdb +Doing users: Tue Sep 7 23:59:37 1993 +Doing groups: Wed Sep 8 00:16:26 1993 +Error adding group system:mit id -101: Entry for id already exists +Error adding group system:authuser id -102: Entry for id already exists +Error adding group system:administrators id -204: Entry for id already exists +Reading/preparing members: Wed Sep 8 00:30:11 1993 +Doing members: Wed Sep 8 00:34:22 1993 +Done (16591 users, 18144 groups, 23 kerberos, 39097 members): Wed Sep 8 00:41:10 1993 + +prill# /mit/opssrc/moira/afssync/pt_util -x -m -u -g -d /tmp/xxx +prill# perl /mit/moiradev/pmax/afssync/pt_util.pl < /tmp/xxx > /tmp/prdb.extra + +moira2# cd /var +moira2# cp -p prdb prdb.new +moira2# /mit/moiradev/pmax/afssync/pt_util -w -d /var/prdb.extra -p /var/prdb.new +Ubik Version is: 0.0 +Error while creating who:rune-staff: User or group doesn't exist +Error while creating system:gsipbbin: Entry for id already exists +Error while creating celine:admin: User or group doesn't exist +Error while creating celine:titan: User or group doesn't exist + diff --git a/afssync/Imakefile b/afssync/Imakefile new file mode 100644 index 00000000..c27e135e --- /dev/null +++ b/afssync/Imakefile @@ -0,0 +1,24 @@ +DBCFLAGS= +DBLIBS= -L/usr/ingres/lib -lingres -lm + +DEFINES= -I$(AFSDIR)/include -I$(AFSDIR)/include/afs -I../include +LIBS= -L../lib -L/usr/athena/lib -lmoira -lcom_err -lkrb -ldes ${DBLIBS} + +OBJS= ptutils.o utils.o ubik.o +SRCS= ptutils.c utils.c ubik.c +CODE= $(SRCS) migrate.qc sync.dc + +AFSDIR = /mit/afsdev/bld/dest +AFSLIBS=$(AFSDIR)/lib/afs/libprot.a $(AFSDIR)/lib/afs/libauth.a \ + $(AFSDIR)/lib/libubik.a $(AFSDIR)/lib/afs/util.a \ + $(AFSDIR)/lib/librxkad.a $(AFSDIR)/lib/afs/libsys.a \ + $(AFSDIR)/lib/librx.a $(AFSDIR)/lib/liblwp.a + +sqlrule() + +genutil(afssync,sync.o $(OBJS),,$(AFSLIBS) $(LIBS)) +genutil(pt_util,pt_util.o $(OBJS),,$(AFSLIBS) -L../lib -L/usr/athena/lib -lcom_err -ldes) +/* genutil(ptdump,ptdump.o $(OBJS),,) */ + +sqlfile(sync) +sqlfile(migrate) diff --git a/clients/moira/Doc/Makefile b/clients/moira/Doc/Makefile new file mode 100644 index 00000000..021061b4 --- /dev/null +++ b/clients/moira/Doc/Makefile @@ -0,0 +1,9 @@ +# $Header$ + +all: internal.PS + +internal.PS: internal.mss + scribe internal + +clean: + rm -f *.PS *.err *.aux *.otl diff --git a/clients/moira/Doc/delete.doc b/clients/moira/Doc/delete.doc new file mode 100644 index 00000000..f8aa2f25 --- /dev/null +++ b/clients/moira/Doc/delete.doc @@ -0,0 +1,158 @@ + +Here is the explanation of the steps involved in deleting users and +lists, the examples were created using cut and paste, so they should +reflect what actually is printed to the user. The one thing that +something like this can't give you a feel for is how long it takes to +delete a list or user. If you let the client do all the work of +removing references then deleting an average list or user seems to +take 7 or 8 minutes. + +Comments on this, Anyone??? + + Chris + +------------------------------------------------------------ + Deleting lists +------------------------------------------------------------ + +Before a list can be sucessfully deleted a number of things must be +checked, they are: + +- This list may be a member of other lists. + +- This list may have members of its own. + +- This list may be the ACL of another object. + +Since the SMS server makes these checks internally we will make an +attempt to delete the list, and only if this fails with SMS_IN_USE +will we attempt to check and assist the user in deleting the list. + +Once this list has been deleted then some new lists that may be likely +canidates for deletion, these would be lists of the following types: + +- The ACL of this list may now not be in use. + +- A list of which this list was a member may now no longer have any members. + +In both these cases the lists mentioned should be deleted. +I suggest, and have implemented the following user interface. + +delete list foo: + +------------------------------------------------------------ +list kit is the Access Control Entity (ACE) for the following data objects: + +FILESYS kit +LIST kit +LIST xconq-acl +LIST plx-acl + +The ACE for each of these items must be changed before +the list kit can be deleted. + +Command: +------------------------------------------------------------ + +Once this has been changed, we try again, and... + +------------------------------------------------------------ +Are you sure that you want to delete the list kit [n]: y +List kit has 4 members: + +USER kit +USER kubitron +USER mar +LIST xconq + +Remove these members from list kit? [n]: y +list kit is a member of 2 other list(s). + +mar +xconq +Remove list kit from these lists? [n]: y +List kit deleted. + +Delete the unused Access Control Entity (ACE) foo? [n]: y +Are you sure that you want to delete the list foo [n]: y + +Delete the empty list xconq? [n]: +Command: - ready for next command... + +------------------------------------------------------------ + +and the process continues until all dangling references are cleaned up. + + +------------------------------------------------------------ + Deleting Users +------------------------------------------------------------ + + Checks must also be made before a user is deleted. + +- The user's home filesystem should be deleted. (query first) ? + +- The user's group should be deleted. (query first) ? + +- Is the user an ACL of any object in the database ? + +- Is the user a member of any lists ? + +Once again, since the SMS server makes these checks internally +we will make an attempt to delete the user, and only if this fails +with SMS_IN_USE will the client attempt to check why it failed and +assist the user in deleting this user. + +If these checks are passed then another attempt will be made +to delete the user. This time there should be no way to get an +SMS_IN_USE error. Now that the user has been sucessfully deleted, +one last check is made to clean up dangling references in the database. + +- Remove any lists that are now empty due to the user being deleted from them. + +NOTE: postoffice and finger info are deleted automatically by the SMS server. + +User interface for delete user: + +------------------------------------------------------------ +Delete user +Login name: foo_bar +Are you sure that you want to delete this user? [n]: y + +Delete the filesystem named foo_bar (y/n)? [n]: y +Filesystem Successfully Deleted. + +There is also a list named foo_bar, delete it? [n]: y +Are you sure that you want to delete the list foo_bar [n]: y +List foo_bar has 1 member: + +USER foo_bar + +Remove this member from list foo_bar? [n]: y + +user foo_bar is the ACE for the following data objects: + +LIST xconq + +The ACE for each of these items must be changed before +the user foo_bar can be deleted. + +------------------------------------------------------------ +once this has been done then we try again and get... +------------------------------------------------------------ + +user foo_bar is a member of 2 other lists. + +kit +xconq + +Remove user foo_bar from these lists? [n]: + +User foo_bar deleted. +Command: + +Delete the empty list xconq? [n]: +Are you sure that you want to delete the list bar [n]: y +List Sucessfully Deleted. +------------------------------------------------------------ + diff --git a/clients/moira/Doc/internal.PS.Z b/clients/moira/Doc/internal.PS.Z new file mode 100644 index 00000000..0ad09a12 --- /dev/null +++ b/clients/moira/Doc/internal.PS.Z @@ -0,0 +1,152 @@ +%B@™Ò"™7bÊ´á†‚%¨¤¡Ã¦ŒiÜÐ)#ÇM6.Ú̙ó°‘7cê´)£Ñȍs.¢³Ñ ™%‡È)C󍜋MÂÈY"ˆ RÞÌa9gcF,ŠÐ€ÑbƌMX\­1 6b€½D› ¦Œ‘“&!ˆ(b܀'D<é¤yI„¦E1j€0RFŒœ:BóΑ`:jÔ( %̙21A̬y³d›CÞ´Y ó!(Jé¨e ‡Îélê)Œϴkۖq¡à…) ö¼˜bĜ0vhÏ6F÷9:¦#çì6~A4Œ¢Åvãc>–éBLF2 –÷.|Ï4oîÀ±L›8ˆM}Ž/>}3½M1DpKQw†c¼Á†O䙇–z/ÑX€ÐMláá€/HA„Á]ai1A¢sŽ• +€ÜShÑÜs(¦#n”qƌŽÕ(!…få·S-¾xcS˜ˆ£ŽÆeT"‰ Α^vØ(cu°aå’;Öèㄆ!äxE¦aFl,eakü÷’kÚ¦QƒýA˜ä‰ÏٙDp §dxŒcØ!džH}Hçƒÿõ&"‰/„V[Õvžœ®Ù â}> + ‚Zj¦ˆzhÄ¢èÙyc tÕ¨*ŸÃÝ꠬ֈ¥–Ë%z*ŒrĦŽøi ƒšq雈Æ*㬀ÑõÜ­¥*Êkª¾0aŸm¼‘o€°`ÔrˆEÁ¥$ÇNÁñFF®1«.j[·¨nØ[LwÆqÉ-)Mƒf»m·dÔ¯tSVY#³r<ïE7/•qGdÐ1hrPœ#·ÆQ÷F› œ·CNkï L ¡/¿´åø¯Æñ,1E_œ1sìñÃï‹mMÉ12m&c†ò~†ÛÅí!t¿2ÏG³Ã ø³Î÷üÃ?s4Ì!MrÒcÖ ¡JMvÕ×üðÍ[cܵ‹Ã +qÁðú\±Øx3»0±\Þ6ÄxçØåsÿ¸‹c,¸”Õ<ã=5Ñ"Ÿ}²~jWË6wRožrÓ+³-çl7­7›†bE]²èL×Y-B÷ő+Ü4SgvEÜl-ÔúÜáU»}¾ß|—GÞrsEÁñ~ŸÒœ« á¹ ç½ïÿùK9»q]vFÓá—ñdP™žÁà‰wüsÉ;ëóú{ôþU½=\ï?Ùë͸·ïÑ.*_ýƐ)üEèMAÒ@Á¼ *W 9CF (¡rÙÁ $Ô Sˆ=ñUË d z^à“4ˆÐ#lh±F…¬ì ¤úV¸\äÃci$b{àÛ`0 r°]„[ƒâã†=¸D#Ü`™u:ÇL«á ?¢C#zqC€Ü64¹L‰)"\ã>Ö-ÁÎq…‹c¨æ8·È)¥ ë‹\àÁ" èh[š·Þ®•MÁe„ÏÙH5¡mÌ îƒµ7@ð +ÁqÌ NGƒîpÇhlÐ×Ð0ÀO¶M”§Lòî£ U®N“ë$¥°Få9¦5`E„Õ¨}ï+^ ø7ȯxßñ ¸#ÌÚõê^¼ Ž/Mé¿ü “™Ž‰ßüZPL=™Ä+ƒ¢ùjîr½ì&0—×»8 +Jéb“õéðŒáÇä`¬2FASŸWåê\YcF«Ãl×¼Aã°<ŠFiêp$5 R +s|¤”fô2gB¦ôSuVã°*¼ °ƒPŠLÅÐYH¦užOj`µÃn¦I Er”*¸bmên ¾^*—AªoÈîóŠ½úÛҋ>‹bêg†3¡Ë5‚Œ+ww*|߁#1c/fŽsföuëÏrX¸YR™8–Ùz ZÉí¦ªI~sXÃX€ßMMXhÝiÏæx°èV®qèQ6YòcˆViÈW[7Œ6…S¸ÈxqZùwT Gaiàê‚ xì“6}yeNu1`gT`Wj†EjxjGÅVS`cÕx‹¢†d½‡ÒE‡–hKa„sP¡"&é(–øF1M±tk"(³tT‡@wR0–‚Ñ9ÙÕm„9/cPn4¦&Æ•fqiKÁÌюòS1è‘Y!‚/X„²\pÀADA’„„sazw ‚¡J¥&§)k›vŒ‹ñ[ÜxG…oÀk÷ljâ$"ç/Öw{®qšþaÞ‡wuГd k ·™‚WcfÒ—™6ø™Ò-ST[4P‹yˆ>pje©!X€íX{®wxnùWeIX¢ÆxW`@¥VæՓ.0û™\‘(jÅtÒUzA1ýV&9b¯—fèñykâþÆÓæLIžsВµ†c æŸf\QŠ¥Vãv  `pIZdá ]×,šËÁƒù)%–ïwiƒ7X†G¢0ٟ¼ š6k.£`e” J£ÀÉu3Vyâ$d‘•bž•F’š9¤…—Ÿ!#®a0FJ–'š¤öW…0m³Q¥|%¥3úR5êÒeÚ£¥é¡gΧóŽy(˜Û¥y%¹r0¢1Š¤ÿÙl]O‚¡Vg° ‰–&tZ¢2º\ š§VŠA w—ŠÒ§ol±’Êñ<ŠVJ0YŒ3)©cõ\—èÌ£áš?”¶7”ùY”¶8`¤…A]rÁjUÅ09Šqe¡'%Xéš/Áþ&{fЧáh](‘~È6(a„gÚ6(Óv+Ñs³ÖžBeZ-ÚaÛêŽdºåAZŠá…Ý‚1ï×<ò¬]é¨/U›^»FL…oBq7|÷}FGõj¡î#g¯80 ôúwù8n7W=BQ†›YúšBQlÝV6ƒ–nVYyn  q(xa¦W45 {ù(.‹xoڞSag•Úa4f)ª~ÏEq› ±X%´ÓF´¯\÷°v°0Ð[‹°Ay1Óvÿè¡XJ°Ñú§_*% †Ùj|‡x0e…Œ—`oyh qWKAˆ¡%—§|ìe&E†±‰º²»£)?r€„æëÊ^/¸@©¸Z˵0àµ[b˵:ùªÔ(a2©SyKVåæÎdƒyH¸âéÅîXWÍ+8ÑÊõé£]bOç›dÕ>ÜaŒû¤‰¨ r–iÑ-MiÑêÎ(%Ì •õæS@=Ç|§—“Be(€Øú)S”®Fx",ÐògjÝkó¬VOÐTc(XEô‘peÛ9xF#Ö~ÁÉ,;ET0À‰ž¨V (ŠyHŠ|xŠH]‚H_QJ“¡R³Øˆ¥« ·¨S”È‹–¨V4@º±zº“SÆg·JGAËÔQdRå„v)?µA²• ª¬†'¦»ÖhadåbQv“k•»‡^²‡›´A1;øLæn=G¶c—Èk*j͕Wªl)ÉwšŒ¬|:Òå)-Å8!Ð^qP!¿Yë€Â^æU±;a.\–Øj®q!dúÒ1Íw« ÔúTçÞ™ùú=»G%›V† Z) ^sáBìî½Ùé"TpœÊLkŸ S8SÑfÅ֓É{^T&RÖv†;Âem6X¡{2&ùà cxßÓaà +pÆ[Û¢ñ)Í +^ÍÑ- +ŽÞè-kŠ©ß÷ž³©VZ–Yò†Õ®Q€ñ]âèœÏUœnlæfe`ßè:[éøS¦Wt=°8ìä51ßk>°q6gfÐÖìiå'Å¢¾m]$¹›„_¶Ò1ž½]UnAž .ú¦ô1}ñ¬çð‘ÀNÜ$;-ÅsGlä=u¾'n侈Æl’}zý(D‡v„Ñ]?çÊ4n(‹ä×VyŒúŒùˆÌ( ‚·Íë„kßh£'T&¾ßÃgpL)m•7ÛO2ÜW[€mÒ1h!<ˆ%m`®K²{#‘ãB‹@©ÕdÖRe4npׂm#m¨·ˆVܸØxÈŽmŠ~¨€¨Š|Ŋ%Pˆ!6 ‹ü¥ÙvJ¬¹h`A׋Â]&Œ&«¨Ûl¶…ÖºE„dz DÀª¶×£¹û–ßÉ.¶|[€K¡±7(w Âë…V°ÚtÉI(F3,íòºe’vI)„IܱñÐ%ƒ©§ºo!Ít¬ì±=…ÑV4|)䫺CRhw$ý¼)™)"_õ2MÚoÚ¾Y“0 Ü­«“ pF¯%V€ôŒÎ]º½Ùªb¼tJIT|[cˆluÓMZ“ª§]ǖCFíµSôwðf÷RÁ¡:­kv&“Tª™šol•åLø¦7Ä]o’!µÒI‚Zr(Ä.ÝÒT¹nðQ‘éÜßLߘTbÊñǬTŠ‘e罫áՏº÷¾yZ4pÝ~Ævmð¬ÝžJ¥6z¥Þgû€}þRH<•ãVF(“rreìá)â$ æóB)Éq>՛ ê<µ¤+N²ž¶°·ûzÌ\’‘â¡š¥‡‡ y‰wškðu‘Š…Zh^]0Feüßù U‘§l=¡¦£˜Â˳t•çò˜ ì§Ú[÷Ë>ӆúY›ïwHS:ôç6—çÑ2Bÿ3Kˆ¯§¨®cÿ6•áã-ü/ÿ™¨ø÷ÿÐXHFÑæ閥Py ¨’. 0Ÿ•‡çs}PˆICojzÁšÁ˜ÀàBn„¥—ç7ϠγC—å#‹—ŸZ¡5"ŸØ*µâë@nà›…£¥@4À¥am6 MI7˜¢PP=#o+Ñ}hÖ?U•‚+MêÁZ]x{;f«çŒ%O#«ât±{Ò¤° !¨€V*¾L˜õAÃâ\~]ê:¾¬åс£Àڀ +BããÍô¸UudÀ ¨º +f¬èt‹Ôc’ÆmWãl¨©0QÑhC“s[Á /—ÍƛÔz9rÇ/ WX¥F‰ ¨g,Hõìˆ9vwþÕvAf€“Áª¯G&Þ± + ¤è᪣0¨CÔ«A o둼·÷‘Ò±*ˆåî·²ù¤Ô\—fG¼pÄüŒƲd•gÁ!A,ˆUÊÍo{Âó}“ƒ¸KQc<3 :?4¥ÜU3 €ë„­™ƒP²—bðm†…$·Uhڀbˆ!ÇöÀGC¦šØæš8¢â*Mb³™ +dAJ›‚´L´; ¾Ð"’¨¼åsèŸZ¹‡®!Äà°Y~Ë‹ˆNçé™Ã¢+‚WQAj©€8ðÍØM±Jò–ÔŽ +Rdr'dEÓ³¿@¢AY`¬8Ec¸‚NB¨&÷ ]\ä+y‹,àAµÒþb#ÊFg=y´¦… mË+…­Bš%€ ã‘â}¾¥×é‚… +؄£&,Á¹ï&Ò*–O,GllǨ‹as(tŸچŒìí°ßwØ¢MëÂx!ê­C—´ÛLžÜ;Œž,µÄµS¿¸@4.nBÑ5Íwä–ÚÃm†Ù¾zˆ+Ô!r|jª¡ÕHWÕû>ÑMïÑÁ\ĵ¢L¨ a™–xT8ƒÍù=çk‡¹eȅŒSºú>³Í¦©­Ók %â}ZèJʶ$›Í\€Ñf +D•Jq-S‹½älÇï¨hKn¹HOW{eNBÒ¨¹PÖÀ%ÌÁ=X²H‰¸n‘YØ@¿Ð-4¹©‰Eg¥„ïaQ`p°µ!ÃïèÂ'²CõN•¢>„ŠöÝdkE†È±Ü‚LjüK;XÓ1F»K趢ÎãTŠìh2£ØaØÑ ±§¨?ÖuÒ̈* +ÝÅe¦‘(2iƒ·t ¶Áç ­Á#CҀ†HÙ %C³¥ÕNàû}U(S·FTAc”„쨴;£©‰~_’w/3ÅÌ{G3#[ ZEƒèß¹" ‚x&-‚{»+áí"¡©VnÀÃ{¯"#eÔaX€PÉQ1dGåöx#ììmÀ1åŵ"Çx"ˆ“ÏHú( ¥Ddx TdÀy¤JÁä\sÃPãýà Z^VÔ8:Løð™„tT\¢ªü=Ëmò>±pZèæZš”o³¶h¡ƒ÷``だ+`oá—¨w\}z‘Þ" Œu…2²OʘdŠ9ýžÞD“ž!´Q+QˈIcƒœ„ßIrQ0ÉOGiªå·ù4úqjŒŒf%óBÑۙÁ€}’#4±†ûP +¡4©à4;Jb´!‡õEÖföÊa qB®Éì1'Ë*O°ˆ%Oÿ'ª¨PtZG‡ÕáÓB¾Erâ³'gªÇJF<¥Ù¡Dr˜ÉêÍﻓðl¥5ÆDò€+…UL@ª’É EóMVj”Hæ(Àå(ڎšûA%F¸T€cp`ëµ”¥ÆË¢€_襄S–XT(­BŽ©H& £Z*ç¯z²>æÑÎbUtH{q)ö€¢zTK+3+0ÎE*ҍ³gáͬ¬•œKüBìYD€šª_àa&Ik„œèNP¥FÈDafQ`QHæž5-¶.—"–(²­ê„¥£ +\ø> – (XŽõçF)zˆKˆe¡Ò O§©è¿a©¥Aٓ´uèWPŽ $:Œš­Ýh0àÙx´3/]c3Öï\ĕ²(BRö¹¶á üiD5ààäÍ Jr ÑTŠÀØ !æà8Fk£á7A9julÚ2²é—X)ñ _%VcœD¶]Y›¬¢JGC¥ý¤Õ)TZÔ©Lª À° Ç£MÑۈƒ1V¹ò¶;ÅÕp tÑ«.µÉaf,l†ÒWŽëût‘hPÛëÁ·U‹k\ê* +Т[7Á\µÆB; ù|Jé›klÖLc´q=)/J»Êƒ•0ìóü<éHÅYÁÓSzSÚŵ-v×^Ú^;w­ŒU»b…ø„*¦]M)å„geëì©)w3®Á[®:Å ÕÆN:ÌE{ßÕLɆ:)ÛE( 9Àu¾Þ‹ð>íì08 h¶Ï–4¥-arYúÅÀcÁ•%±—n>D.âh…ÁuM +ñ €›D´ÌËeµWrŸfIÍb0—Ìg[›ÅrL¼×Š8t P +{*±–}p¥êýT*Ç3Nõͧÿû¸Ô+°”uçlT¡#Vá˜Ü¯²kz:QÝÄI¼Öu“üR³!¡ƒ {Ð*ÞÓ¸ÛuÁBÇäÈ@ã()õ¥ŽxºI‹èf9qB¥§ä@ù‚•©†dõZÄƪeQ +H‹Ÿ×ÐÝGVÞÔQœŠIq)²V|/Ç£:"Á]3a„yøP€eÌcõÄÁ˜èm¤pݝd5ññìWs‘¬»U‹ç¬Ã¢3¯Šû./-¶îù¢‡€n³ḉ€5ƺAV{åx)YèÂ×5TWÇeDÓ®gÛoÇÔ7‘{âîcÁ>2”(±CØëÛ~óoLkÕ’ø}LFƁyˆ€º=[˜P:ìRzLÍÇKã\øƒm£‡E‘:D TÜS¿@NŽ¢3‰YbìºèÍÑɝ4ÖÄÒv9p˜Ñ҆ü;ˆ÷¤üÑÃا¸,GsR¤ﯥªóZؘssîUf=Àހ‚å³ v(þ¶WTžZq¢bÙÚxAm0F¹( c 5dúpÏRG³q÷âºÞZÈHÔg³ +Sa°ÚY%\ƒXae‘4 ³<…eAýÁVñ²z^¾róh³[ÈVQ/Ê×õ“‚$ª&ÈGå +ÏÁ,¼ßL;”'y¹2(>ì÷ŽÊ£«€8«ÅhZz‰Q?^<ë؆Ã#‘1®¯m¥A˜´ ¬Õ%]üm¯{¹õXæf]}8áªÙâÊ\1iš ©…°Q´yºO·)e²ð]3±>6»kõ'†v¬GQ@܅«t` Ë䳃QŒ¦ B‰jÚL՝61VS¤÷Ø ï7S“–¢ »hȨ…U½Z'ÏjBÍ°|FÔ´ßèöH‘ŒpÁÑ͞IƒBÚÍ¿Éo—÷ìЅ*t‹5¥FÖ¨z»±²Nd-«¡þå^"VÚÐ<À‚%Ɇ²Ê‰„™À"µ®V62ËP—ZÐf÷5µ5€ÝÉg&q®*f58EX zÁ4)Qhó5¢8Šv_;Ú!ã®ë4璴ÂL²î‹J»XÍ1дV‘Óf"…þŒ\;þÊ`ꪡoê]–Þ;¶º éôj¢ê¤ õ­¾Ö:hµ›¨ó«Õ®oyS«·!ÁXxý…ïÔzê5ÖôÒÖcå]¹‘0Ä[[”Œ’Ûêv§èԞ8#y¢¾êL½©iWXÒ¹uµŽdRí[»Î©®Ú Ó +dÓJTŠåÝFÉúµ¼Nkm«­5zMÚT³T\¨‚ãé¡ì€sŠf§™][;7ÊÙ:ۛö®òǍœR‘5ñRè=½Û].Ñ@[]³j}M/þ¢`Uîq¸˜LýÂ@ã,=V‚ᥑÔÕɼ´Õèß¹L•ü½‘——PnŠcF€^;́n¿ð¾¦ÝÜ9٢Ȯ+Ô=É‘y¢Bù-oEáÖEšwHú.Èç ™Ž"¢é±˜è¢¸©J5Q½%¢ú·nkyŸ— Wd¤áUi”÷4#-´"–ÔŠÌÀ¨›½æ£–w¹Äsä•@ÒQ‘oèpgsGC¿@†bÀ¹â,ÆëZ vÚ7ªÝµk—Û§.”AÅY1p¤µ”ëÔ2•«a.8ûš+Oö.{ZM$•°š (ÏÉE@íC͹ö¨ƒö‡¿Ç§"˜èà2â‚…aûÓ² +.¬V¾öM0¬¨àüá-Á)¸G[• û`÷hіFFʏµ<Âf÷©Cµ¥Õ¯ÕZÎÉàÆ?­©éX©5n›q-î™{«˜-~™Z%‡`6åÉþ¥NüÛsOÅjþZ´«5æBڔñwf>ŽZ~ “òÎ^.;ҷš‡è¹ë\ ͺvæoä­Ùåf¾æ +èg¦»œ³¨Ûd×j¥Ä'ëÕ =ÎÉR™'“fZVáîÍív¬øø{[·ðÉú ¶]Àø¦| +ël§\bÒjÑ%e/¦Ø÷Ù½ºq.ås² ;G!‹ÞOƒq‚'5HFP"xߒ÷³N<ò+˜s¥m~®Á…0n?Ȕʣ•ñ‘ÌLP+?Ny|ÈMºà¡; £×îJYÉ#ÀÊs¨7Ve݇Խ!¦]‘Ófè…à]‡+Þ×W~ø²è•.t>TLyØ,äåbP€Â¦íh©Âe(MºÞ'¤ÞwÏ\Šâ°Eô–²¢HÔ5+¾KäS9‚U¬$£Á¬iëQÁÜ_ÀÊó"ÐI“sè|l²[Ùz((œ~C“‚¬‡¾HfžùO“ZäÈwöûC{Siö)c/ÚØ÷»Î[êYÈ +U|=8øÛ×ww#ìÙ&e{Žl™K$ô¿6+¼f—ð~ږðFH¶„ +e„:þ—'ù¢;ìÁ«záüü£ÆBµÃ£Å?·G|¨Òñ´ÆÒ¬iÄ)œr Bú´ßôJO$T¯tÌç|\³ó-³ñ5dpÅ?ñVÏûžÍÁ—.&Ÿõ(ýÜÎô]þŒ¤ŸšÒ{ëPÕäV¾žñtüµï·°cîÎçú¡^ w¦%áÅ3̚~;C·¦VD~җñ;^Ô÷xyï¶"ýr±{ +…Æs¶x‹»Y0•%vPà´)ÉÚÍßj&*ÖmÚêûU[°û|žs³ÕÞÚÛ)«ñdH çõ5çW¾0ŽeùEý \]Z.é˜ÆtCð©[;¶ô]' `švE'4Þn »SaÞâ üpá\1‘¹  GÞ /\3Øôd‹¼¡×¾žÉòŒ™¶Ÿ|$øå¾òjÚ±[ÖûÖÙ/ux9Þ1”'>¹“‰?­NÔí~hü ÃÛÙº5tpÌïrT€×J¶âUÙyîÞGè=šÆsQ,•}¿’ƒÁãuB€˜ ý؎²×s 1ø^ÇÊÜz¹ßî÷ô~tÀýS\¢ZÔF¢•ìÇçä#ÁÆ¡¤ë°|›HÊäîìðÎçDÓÑ!Xš½£¥åt©Èͤ:"2LÔOaQÆ i§ŽQ‡á©8FÓÔ|yHÃِ¿,@-^d7u~ßÖ؍=ôOÞE8$Ø¥ó+}å‡E#wÄ8mGô}SêˆqÕad€ßÒGZ ¼ÜäDï­0‹ +q'6… ªž“ïÉw¸G‡Þ(oÇöÿ  Ô?QL]´•ÔcI¿÷RTAᅓ@s +áD?Ýs˜QViZ_÷åJSÁ’gŸŒ7º’íkz ôWÏÅOÌĕÐ=r©Ò§rÏÂRH•yšX“}|3[XâsJa·:èŽdq! ôé Ž\ ¼d’žâíq Jwé¡}Í Ä¥‚ÔK®¦' +rÌTÓRê%r›Ë3T¡p‹ÕwG%€m™¬\‰f8قë!gu ˆøQy³Ü!2 7»ÑgtyX -( +nUˆ®Õu8eOňê­h‚Gé¾G”W6y¥|fß Á‚!7ÎRÀ7PÅ$³€RψÑFÖgÛs¸ WàÖH¤W™³rRËÈü”k)˜‘t°€Œ +F0/çK,È eT…”Ix ösä‘sAØ)wôHBÀz,WÒõ˜ŒELw‘åá¯R"P%¢TÚGݘVÒÑÇ. …ÞY2M/yWv¸”5ÞI÷qMbhˌQg؃¯øp\‡Áu h +65Fåݘ 7"„¸ £¶Ï݁tLäG}€gæŸû€þI '€ú7œ¡OÑjñzîß)ÆÂ0ôÓÁÕ0…sÏÖax`ÙÖÉ!ž©¡­aóP(ŒtÇ Ÿ´ü`5ûU˜ŒOÄùncÕYás fԙÐr ¦&g”…*N@–À~ˆ¢5Å$ù¡IbHF…\.À ðaô94äG¸Nzæ‘t‘C¦<䥏?…ý4(IYûÊû”Dfxbö§Ôè$`e9ãÅà„˜YI!x†ˆK¯£7¯5;›#=Ò9.P݂ü–ÜŒD££/c:¢Žªã­Ä:ºŽHg‘;åyØìçÔÕGÁ`Ž°¹¢­•6=wvÓVÔ~s Döík´D’#OXÖøù†°D2¢]&PÈXߍkªG&)ñ­õRƒéˆ²RÍxf°`sÌ[¤t”äq§&”bÎR•sz÷LÄw˜Th@­Ì9PÛ±xGEe‡–5 îcÌ>áM¿±•$ƒfršø4£†[ƒoüB}©‘ßtdxT†„'Ýb·ð*¢„žÁ$¢RãÄbԐ٠<„Ý`Xm@Éq‘§K¨ !vÒ 57ÅÜošG¿’M®Ϋôº%aÀh’K^vsŠ¼ÔÔ6õQ®¬£H•kHcž#ƒœc„Êü¶¯ fAÓZÖ¨V_%"Lø¤ëJò"ºH±Ä_Mc$>©YC I‰``‹‚’ÆFhŒ ؑÞ[S0²Mj&[×ò®!,*a²ðÝάÆ4òÛ^Ð$y4à% ;*qL´ñD²Ó>™_E„'F(±ËH"w†0šô¸i!FpLøÁÒ蔟–PqðÝb(åÑ´ùà‰ÆWVJ‘¦Z÷R²Zˆ… $XV(b¥d`LeáR°­¨Kt¸ÜoÐAi¯)…¹’+æº=wÉHri¤0¬‘ÒÖó#j10 +‹JEƒš¨Fˆð’r‰ˆ]B„Â) ¿àÕD¿p˜$Íy "e»LPãäÚ׎ñ}ú^ö K;ˬD3~M¿PømäEEö³ˆeø%ˆÏÍCZvG¦åüUcœÅåãAHye9žfyðWìʕe®©-}WÓHZtuKÞb¹ –Ö¢æ”à©uŒ µ±Û¡µ¯ù2"@÷†¨€osÒQY²kJeR4•Fˆ}YI•¢K§¥2р1àLw¥‰N7Ýc6ÚLbãH6Â!>ÅÙh¦•H#. l$H"QASçž-­ÍCÛìRã¡0W¬D}¥Šƒ6zZ]@Ø-$JkƦÄ[ž)9!kÄâ7ÅFγr¼'¦›Y£)‘’Ÿ¸€ù,H.IFB•?µ5Z&Q¸tI‹Ð'•e2=ýM³SFþ‚ +Ú÷¡ŒÅ ÎÖ$(ÿ]©Ié†AW±ñŽ"m"AÊ^"7²í›FˆP-…`„ˆtãÒXaj•© ¤tkN·”àÈå-gŽ×aTž#‰Ù‰yD˜Ã̹Ѝ€d®éii!5V´ñxÒ‘'ÜYoâ—1boa‰´ŠpØ«$›œ3¾Lò@rŽŸaÀ bâ nR1bš®.š -zô®ø&²£¦VÜÝLÐe}² 0Ku@ApGÍöiñoX%æ¦Uþž!ËÎyTè~sï'¼€Èçoöb :‘e wŠÙœ‡Â"åþ=„ A‘>æˆoŽ—H3<T‰Ý‘¶p,ÐYÕ…á •Bòè4ÀKŽvžõj%i"B$Œ“ùGn’d’Å®Šn‡<ó‡Iš!aÒ–L\(ÀðY|Ž“gjMYlw¢âC"AI{f¾©ü§ÿ‰[¾ö¦Â¹Çx›ãDBõE_ç(¨©YˆIŽ4áVBÁ–GTˆY*€Ã©r¶q§• 6„šˆk ŠèqN¡Ë7xo.tw7"†Žƒ%çÞ5ç³ysâ Ó_ÚÄxô|£„ÓɆV¡€ÐÙ´,å¦í™ç€c •È=ÜF@ôÁt…L—ØÔt9 Ìäaî^;àï€i€A)˜˜BДb +7>›#/eåE¶¡Ièø’œæ§bZ´eN#Z)8¢»˜l"ÿE¢NPpŽ¥K\†GD:JŸ·’¼QðDD†¢‡Êˆ‡‘“Z>sA³Ó´è†zæHW±`{>ŠmÃî‘0‘á Ödâ(p¼s$Í à4šÜtq£;Zx£u~y˜râ$b‡qyàB"p}°oH§9šP†·Á9*д®ÉŠ‚3Aɓ¢•);U³“UúzWÎo±u¨Rãým­3ÒE, +Š€´¨ºÝh"ÃV²‰šdØæ7 +2ôGåÛeÈxµ±¡’%i3‹“ü!,ex‡MP5¤è¡0Eà•%Y§wT”ˆèÈDyˆ†ÜˆGz„€³(ªèµxP(÷)…*T¨Ïi…Vf–Øz]œ]h‹÷Ɂ¡s¨ÚôYbÅÄ`E”îmH!5±U©ꄪ}ÒÀQ,…¥€Ûh‡^U4'÷‰€Š›}(ïsÑž2ˆZ¥u©à7÷‰‰(¶÷q ‡/ +‰J¢ð!깎‘ɈG£”ú~Mið'’&L§”™w’ˆ¹óõVôäÙA|Øs©’:¥ÄfFéA‹iº/‹èÛhwÕp,¾d¡cJ^J¡¤ ±FG^Vy´ […9P†®É P†Ó[õ¡eˆ t€¡óT¬ŸkÓ@‰OÇKv1z|T¥iž·…K—)Sº„j¦­©$·ž [ CU}Ær§¶·•!‚•ÖaL¤€QPfA JrmR.PÎMøŒŽI!¥ßôlAëM˜i•¡–8åÈ ¨ðG>¹™ +R †‚*àå” ^¯cx4g©QZ«’®ƒÚ04¡çJ—rW(\g|ÙlžZÉÉqŽ}k÷閆¨p釱E#*¦h—wh<êl~£8§dªñ™:ÑFíB Ö¢¤ÅïCqj‹kÆä§cchVÒ©h¶„.!áwìBü©1&ÿ¹ûJ"8|ÄO¥Žð©ˆÝ…°dªÔ )ãè…o?ÍÑ"vÁaÍäuè”5U!/J}æÁ„4¤==Ç1æW’eÍ©å<èUmËSöLŸR0ú¥H7N€C :Z;B 9#Hô²w5#tÍÅ@µ’•àH’tpÌ£_ùl8&l¢Þ•€:‹Ô]OqØX‘JéxJ¤lØH!¥:! _4Çj>¦G¾9½XO"ʂŽ~yˆ¢ +zRÇ4ŠVTŽEÇ7ú€"ffÆøO6ŸF§¹á +£èE¦ŠnÐÂê%õY]ïiÄå[è¤ôéVY½mZžïɖITŠ$°öœ4R”hc¾ªRcÀ¬¥ƒ´¯€ vd’Š—^o@m¢eXÖu@} `KU’ñØ9ÑVpBb5n¼^¹ú,|e‚7EÑFºº®¢7íjð®>¥¢¦«öW¬ÑÀ™R¾&vTƒëcÝà~.§‹š©! ÈÚY˜3`•fn˜]£&ª{™NüŽ'ú¥¹"¤ˆX@ŠjpFÒrŠF*Š¤xCpšÒ„p¼œPb̙{b@x¨^úŸö¨^i³ñb°~F•ÛС@'u u)ìߚ0€QmËC(ÀّÏÝmðTŒ­b·kEŠj8q”eG…Åjoe¬ky:¦ ]¥éÐEARÂP_@ HGRšz'Ý©—‡a ;dŸ]¾)nö©6ÝsIzoø9|ciB}p¸~NÀ‘”$1w&=҂v£ Ésg’D%+GÖ©*@±Ö©‰³|'«kÏAA%Qa‰ ¤¸EihÁØzA^U`¥)QÁ­ØRüiÐ+ä|j։(H2µΞÝ¹¶v”šŽæqd¬ aÚX¹L'” –(„BUà<¬¥…é(•½è¨Á½†"@ `z’-M…ê/Öå$ jXÚ·› ”®Æ¢kÀ·2*ðjfTHɐÐ]_ò©î¥a‚ŠOlf낰׈Ij+䦯`¯çØÛzł s«FúŠAÜÈÿê°,G¯®(mSSt®iÁ誸2®R€•øŸJ®$嚏8œ’×Xõlˆ†G…÷Ù¹*á'Ic¸"®¥+’ÔU«–†¦ZåZÝ+ïs‚g]Ç; +’rEÞ%‡u¿S!¨óˆHþÕä/øÁ¼à,-‚7ö­ÝAV¶ãàeÍﺍ«ÌÁú*ü%Üm¿¶³ÁòAô übq‡jsú÷°Q!„æMDÞ܇GEíØQn f$܄«žÖOI–«L,ƒ‚Y‘€O +õŒl¯hW G^NQØ9Ùjø(Õ Þ‰Pæ0,&Ñ+à\I.YNÑKzÈ8_­'QF³“®‚ž–ПÁ`2|ÅfJø4Ž^ºÈ°î9~á êsL¤öÉÎæ…ÛÄ!fìæ£BVíPÐb ê i²(Y‰Šáí0[A†ˆpÚ°dsQ·á›Rì‹jÒB\’ÁK£Ö´Që’gŲFX씀ز4^ˆ([EÚJ6u±ÛÆ¢S÷_š8® +Jp+¬uTÑ­ºÜ7MH;Ò´(!¦c4‘ ¡ÑY¸Ú±‹ë‘¤Ç~£|ì?¢?þ±/çÁ‚À²çêŠS\B滢‹,éjº>²<’${&í¤ ÖÓá1N ‚¶ÕA˜®^˜j‡A‡Ã2ÜY—¦êã—~ÈB\ÄU+Ka“5™ç|›ZÔjõªÆ§°©ˆV2Ÿ‰²HUß RË˸³xRkO÷`ÈC«V7Ô­ ÑôQJó¥Úˆ6EdeôeI&‰¨¢±ÓKdFQ–¢Ä8>¨vøeÂä&Ynxn‚ØzK«J Ø-Dbõ·ŸT³VÈå ÀÁ¥>`‘ÝÓ#ÕÁIX¬g;5±JËIÛL1.³ŽqFâ Ú%1öì·Œ‚V¾!påË6Û<ÆvƒÕŒÖƘ5燺B0`4s°“zˆ¶z.@tawªr¤!»ðª&+ôš?þ=yHzayÊəÐÒÙ”¡ßë¦Ð/;…Á:'™Ñ4*6܈¡%Kòk ëå9 VçÈzZœ‘”ßWÒ¦M…Ý0az-ÿK˜aK^xc)úãSlxëf_)=û]l…\™x6ŠÇ•zF0mÕG=†*²ÕË*’ „¬Œž&çr6mÚdã­'²§ëóçvRçsEUY‰ÑšÃƜLV}éxäFyà•x…é²fŠTˆCŒ×uÉ U‘`lÖ͚¢þ ÂB >º(K’Ç8Ò4®Ô8¹åš/¥ú¢æ Hߐ[ÝX‘N[ò O€@T>7¾QÀw¤GXÒ~d¾iøw +âÐÊÍÀ8ùH‚*å58V²¢nKÆØrôŠÄ%k%ْÇN«ÜjK¦iH0jE¸ì.‰¹ïm—¸G4s"öl¼À™HuKª€4]fv_þJü9Ym™ßG ´¯j®!^».´Ëàø:WâoŠ¢­Þ.˵˜ԑMõš—d‘×æ.6/>ÏT ½»ïa¼k^ö¤ªóš³‰{+ÄJ½æ#JÅ©SñSÆŽHä{WàQñUª¹“0žÂ¨ùÀNÞ+þ¤Yaڂnr…dœŠÚÆù<7²»kÑ«¶Õ)mۆ‚x½Âá ûÒm¦š‡(–^°¼”:)N›ê"rŠ°{Xµ}^¥Éû*œÑ±fÞ:l÷%Y[•Ã®!ªœ`eôuˆ®œjò¢gI+Z[«K” €d èÆî‘Jœe@Æ!%OÔÓ``âÞgDk°–u¼ÝËSF° ãt2䎊¸ÓÄ`™jÏG)•±€øa[ÿ—óqfôƒ½`yTd¤¾§%f½]ðVðr¼êSÔK÷Ð֝Tµ®É«%~±W-‹øSLXF˜ºÜJ9XCÒÿÅB|‘Á­FÈóUZÁ‘ú2èÊmD‡Hӆ¬c(úâ +JêFmÑuíÓõ§ÆÒネèÁ§qw4^ r2ë̲>r±†ñ.f}Æãp&&‘¿ ö'-PWÆۅo€ RÍtÁq¸–$z27âÇ:~0 „S†A–QœŒp<«i—º!ñ8J«ïa:’žK^Žü “ƒ¨ÅÒ%ÜÈaÊ«'³6]nÏkE&)ÚH)È |T¬«ƒ07äò¹Kž À^YCÐf~ɄhŽIƒ1pÕG´éœÇ ´Ã»¡¡’YJ„þŠ²c$… “ +rD\Âr’1ú)!¬ ñ Kôœ]‹L¢ö°0jÈh‘ö”»±Ôj‚ 2ÊݲLÓ­íÅafi_#'úÿ¬@`Y0|ÁýÓw Ú¨˜aɼUºÁpY}æ¦ŽÑ é®ßaQÌ\$tՉœ"ÃÄælÈbÆVA䒂æ„ë#É°vx́¸Øu<…=ºßÀ_P +¬–‘ŃLý‰ß´ÖÚ_^\'‰o¸…ÇۚA‚áó¿@L#Œò!Ñ&·Á´",À{Æs¡Eª¹Õ®æ)¸jꮔJD5ﱆ¢£­ÖAb(„‘‰„#1‚‚viV~)‚ +ÑP ñ’~*le¸}"ÈzÞHªöØô!?¤WŽÂ£Ù»ë˜\PÝp³40«€"@"Å¥RXyêá”̬dЖa‰éÆHð­,nqÞ¢‘£È:ÈbÀÖ&9èRØ<'nßèS-;ӆôG=¦Š–†rò÷Š¸ì©èb£?cOYïÈ[%ÀAjèDñdôèÚeƒ’Á˜W5*CÂÜÃĜT'¬Åf–rq£!ÿo¿Pª…´Œ'«BœáÕE9’bE1'š±V4XÁ6ž`D šÌÒãÊ*f½Ì´1¹hã1¸1 +€3“¾†é]:sz)ÜðJÚFt̂Áú<ý(Ú1°;™blÍÎÄ 3 ¹”é’Ç*RJsÃz˜O2§ª#ÛîÄó+ò/]³ó½«i™ÆÁÐÐt˜G +Ñ$$Âãˆ#3u`¾Û~IýÌásÐÜÃo Ổ ¡”3SÐ ; JÒ›]XQ«å”Ñ–Å:¥xL¿w"ž{Tèh1L¥0 Ñ#4SÝfÁ—(x${›(Ïê‚¢ËÐi%ÇN(攌Š®iÁykǘU´HZÅá_¯"”9㊓À“D%ð-òdºc_K”G_vK×$¢è_VÉÍ{Þ$lFâp¦‡ï‘‹\7øƀæø*i“ú„¨ ™Å¦¼Ò$Ýf›DÒÕ}†t;»ÔÜpãk”éâJ¡0\yX¸ã\N&ÔjÙuP!’ð¡GLH¤}o㍹^̘m˜yo–D‡h6+.‰Úë–5%–yiä3`V(&—RNÇ­h ¶œB lµ»3 ¥½6Öô‹9›uj3­¨’t€žg›7-šQ‰ÑŠ3Ԑ4 ¬â£ðÎd˜Ò¶Ó(ôsX AÂp4¼†Gý‘éÙ$Ý~\BÇF2ÖFè3í¬—Â(0ÔîþÔj +YgáH˚ôôZ‰Î! ن&·$(^¯ôËUJ³$šÍ2,Ԕ —ÐȓaØãxp#«´–à>eYqŠCŠ(Óòƒ ÐL…1€\·f#g®ºY ~…Ü´‘†&‹µíaW€˜ÏdR ¸ä[ ]âW*‰Z͐Ô6:lú£17„ÊÚût4iî6ÝN/zq‹¼Â¢ ?8ØB“ÆÉ35 SÄ7òvl1½mP\ˆòÆ+pávÈnè 1撂 uÜ¡FYՊä×ÀzWÌÐOå)ÐQÉV}WªÄb[  #ÕüôåŒ ¶}‚+™w«¦Í²šç—L½³" + ¥SÕpµ˜|>BM/(„üíUÆpóW…ÜI®ÉßôJ®zٜm[ôBD\aÚû†˜"©£´›ï©… ×½°;ý·ȝ55$­YO H¾êš”©®m´2kB‡’ÊÃgAÇÂæê_hõɔëtR½JõÃrA'T¯é]˜Bª’Ö‘eGrý$ Õµœ¨ˆÏ…]C?aµ†"ú¹m‡„×g5TÊÅaÈˉj#Ñ°«½±§W×Õ!âeV,µÆ ök\HáqoÖºð`‹ÜŒø›…­ƒ[­†#r*Xłú˔²a=¨öñaù†ÂMD[{Æ×w¥‹` —]~çL~Ñ0òYa¦F1瓟zÝ`²ÝQ᫚¶ð(’;Ž`›ì_ä5gŽ‰ù bwDçØQ)GµUÊҕNW=vŠ=´l¸‡èˆ{‚Žç…Ûªl¥|ïóÃÒ6Ñ†=‚Øèëra½†7ˆ/J1¥ ð¼jÝTþé7ú1‹p.v–}»ˆ£íÆ°D™t¡T½hÕ¼Œí*·HpÝ®è³i¼Eïzbùlƒ¢ÙÄ!\‡*]KåCQÚ©jš8ÿ VS€/̝ÉÊõ/ŒX0SÄ0_¥ y)“ÔT[£d´ZÑö9ÓÝ쮍Vä½°ÓÝt?_ú¼”DU€¤…¥ÛäU»Eæµ +Ù?ØD¡Xўý½ò™èD0*ZÆ2GfÃyÁÃíz,ÛFwàÙ[wSä!H0zÍlRvpfµUUÁA ]“}$YÒuÿ¡l=cMDԝµO‹¶d-ºÕośÛÊQ†níŠ ä(”}Çß±Ê0¸õ\á³ej!u +н¹¶n‘ʇ$E©º˜tݦm­n[€Œ5³í™ÁØ6]MžÔµý:h—Ѧ"ufÓØXæŽVýœZ(G†?àB‹u+Æ%U£Â O”YxëÒ«udwÉ'Õ(¶ƒEï3»SÏÕÑÞÖªrÓH²pÄUÏ|©Yr:³7¯¼ze[æfÇÄjû„@4ßþv†]Ý×ôّvHT¥ö aÅsX\?Œ–¨8uŸ¸ =M[²…¸TrÜq2~þ¡0…PêìØÚs#µìsi5.¸žhN• x +>o›|vLF·|lzDoDwú(ÀáEˆit³ø-ß!ò82t|aJ·Z°‘œ³’N< ˆÉӍ%†R`6O™VŠ¦E +pZXÉo£ÓzTÀ£Pu6ªó$ˆuV•Ï8U7ÚÍã-QÑ/A=‹¥¦\„ªÄ@<ýËpÊ«ªN£|2zÛW Ì4óSJÌr²\€·9ÍW^cÞ>lk֘âK؁Ë궴sœŒ8¾±Þ•b7™o[ÇN¤YôN:´D9ž8Åž×aÐo6ˆ†Lcã•Êš|*Tá×eCÔ3óáYbîY¡™ßJ5 {:{¶]\»R÷&xé;Yæ½|ngíÙºˆØ`\,‰Õ53‹ÚulÝ6ìkã!¥EÇ%d?ÿÁîìv΄býökKfu bjžãqc%éE‚ÄB@ k=8¨ˆ&ý®f#ÐVªVŒkÇMPLš”…Ì?£-‘·€XZ‹`ć vOÉàô`ïºä)ÃÿÑ !.Í¢sa…L¿l|T„A,³#‰ZMš£"øĈÉiàôýlÉÝÖn-x€Ùüér6‹{\'@ˆt§ªî/aG×Kõ)ԏát œ¤šÂæòž3}ˆ©z åÍ˚ô7UbÜ Ó¨X±:ƒ²äCÍÈ.¢$É/Ñ¡ÐE *]ào%®l‡Ö?Í̓]ÝWaå±wrLۀɛ¡²÷oõçdEØ`U÷My‹4QÇ.r‡*^e‡‹éŒ9ó³ôQ s@e ý{Y¼Ÿ7¶™çñ“ÜH՛µnΝ|' +ä¸Ä_Dê¯ï[Üá¸SÁÄÁwH—²Ò Ž sPSÛÍTr/·I‘óæ p‰mšH㋡fêÓJÒÞ\K$õ¢¬a›j´Kë¨eÍz×E˜+ʖòÖQ’4*éqä´w×Ña½{ª8|4~TÆùé¬jGÊYØtRÛ †òÕ"Ö‡S°Eg˜]4 +`Ó!Éa´dHêEÀ­Ž„uÁïóx1φ}­¬_À R@PÎzxÑ`ìêÐ>Á\ë_ð JRÐì†ë‡H[£¿…Ûó¤Z® ID@á ¥ÃëÆÚÁ«ë}zˈ£cëøºÀë£ ' (­‰ƽ>$]p3¯;<þúF,¾ê{âÚ§ÃëDSbô¯G\ø`¬Ç\Å¡ÐÐ6Úx±Þ¥ƒšÆ(‘¬ìD’“¾¯+¸zš®°‹Þž$.BzåG9݇«·ˆÙzŸÇS^ÒÞ*f +R”pèE†‡>H¾ƒ£½³§ëD¸¯7O[yéb¸ì»˜>ID€’Àë˜ÈÍ^ݍ=iÃ>µ×êüz/9­Ww£D‡D¨§Cr +UÑUðeºtœcGÁÊ>²exמ§ƒ<™°¬.ÒÂëuÙ^ê¤ »˜Ž wêÛÃÕ~Bö³Z˜."¸×«;”ÞáRÙ®»&¼ÕõȦÇè;ÛN³?믈ۮµ"Սpc¥ïјAqª²+êf®­{®Çè '³Ž¸ÿCÅêî†À9R»˜ž»›é‘ûé.®óî {̼”\î²Gîž$ J8î¹+~7ªãîœ: Ð-m»’¾º“U[¶Ú.¼sê™0ð,áàºñ΋Lîß{²âÑ(ë¹»@7ÐÁ»êފÓÃÌ;¶Ê©3»M”îì¶%ê;єµ·â¿r騏ï_Àp0᝻ún;yì­ø'ó²#ð +<À×ìɗ´þ½G +x˜>¸çîÜz $5ëêûš¦Á·âÛÈíŽÀtÄ; _³u'üc âûO¾Iúº º÷ìûLm â¼ ÿì»úSüÇêž`7×;¯CìT€ÄnÄÔ{ÐDj²|½š»›î/ühƒ!*ñ¿È¾¥« ÀÏ،0y#_†¨ûíiã¢8ÁîG€ºž Ëì:<´ÞsT)Ý4,„ÖðõjÿdÂ]álÔñ :¹žÇ[†*</ÇPÀá*«£Gê;&bÈû•—Ò=£¬ûñ™°NhëN@Û>ɗfµ¦£còC|4XI€H»¾cÐá{É/òTø`…×ï{ŸM7îŠü¯±Ûê|ŸÇ[7:©•®H²1҇Ÿ²ïíw¿ž‘—o|½ +ÐÑñ»û°Zºw/{t|0ÈKîŸüÚ7VÈÖ‹BÏõ»üÕNÅ÷ç25ãþ«ïEf|?¬Ák<íöˆîT}ážÊ§ï5{]0ÉgÃrÁM_ÏgÂ-<7Ï+lŠX^?Ä›»â¯œHW¼ÔgÂ\<êÞ¯kõ½Q¼wVzP`˜ÈǼ²dƒ°ñ"aSýÏÏñrúîÏU+tB/{öžºä¾ÚCDîûiÿÕçëN=!‰ÔòcþÔ׫™0߶›í¼uèeÛ?ñ;Âþ¹ìWüæ,Ñ¿öi=AÄÏëS:¬=·{öÁr½!êA³É>³d5܎@ÚׇÖÍYÜP@)½/áŸz¥Ž¦1ñ§=z¿ì2U€Hë؃ê!âïÚSò}e^”íl}êræ¾õEèù|J-#ôVqÔõ,¢ÿÏ;¹;4¯¾×¼½mì?ø¹;4ð/üْŸˆ<†Ï©këV@0Ðýé¡z%/â"­’Tß».ýl¤˜­øMºÉ×ì£Í_ÿgõ+~èIÈô ûs˯øøzqë\ËûÞ¤;ïCÒUïÀËë;¨¥“*ëþ O@ñ.Còõ+r‚ýà^åG÷5»QÇ5Ô¼ d¥›ïC†ڏnãý§¤Îÿóæ»î>á/÷Í<ç?½ä^á']ª…þÜÓq¾ð`žûQ‡êww>˜oÙ{øùìÒïìµGz[·JòRnˆ¤‡äÑ^|I½Iû>o<Áô“‚Lÿ´ï7zFÔÎÙïEW”Dñoövý‰“ÔÿóQ@‘tʳYÀºûõ‡}u×µÁúéúà8vòF<£¯årõ¼~P<TÀØÉ ûÍ#«fÞ˱¾†/TÀ‘”¤îF)àn†òñоz½ò9~®¿¸kÜ>mëù¹}ýŽÎ3&–ûoßí ÷½üQâàõî¾¹Ûcùðºí´î»'=¯ïßóô«ý ÞÎí9fýŽÌî¸fßÕîU€œß×Óùqèw+ë ÀÐûò~õnÚ×û¿‹áLÀ9/î·d­ý?ßðᇻú~Ù'ï-YmÏñ7ü’òãøPþý~،îbzÃÿ6oòLÀ§îð¥]¤Îwü->@ÈMû~sßÌË:?Ü|ñ×ìúþÈïqðJ}ŒÞð?2[¸­^HèR;iݗû?º?©³Ñ#ë ¿ð׫:“_Ä¿ð¸þ¼n|ýðÏ>mö_ùa=¯¡¦ $óÐßðÿûG|Æ4Qºï{át¢SN5z¸§¾óå²Na~˜HfÁ™-rü»fA@~t ?Cßn×;úw9†é9mô^ô¤Ÿ$‹Ñ!&(Šùšþo•×ÞäÍídˆÈ:£•ëH]yPþðšÚȾ˜ñyŽ’³&V¤AÒ$|EÞGíðTàÕQr& u´Y€Ž”ô˜þ,Ý{¥dd4ÿælZº ²ƒS¯ÑjUô a2m ÎÄ¡Ô´ù‹^P)0#EÁ”`XÎ ´Ñj†S͎¨‰š(ÿ‘&ÁœÄþâE ”v´ÄÃ5Ñÿ»¯èHÊ%Wf°×]Æ ×µê†Š£3•9ò:Ü0\T…^ ‚§Ö`Úq>t۝VëΒÄ`8 +ø2 %»æOÍ.XW²KüI-tä†ÍBVý"»UŽ\["@ÔìŽÑf²æP€$Š 8kcñr.1ÀðÂÏhåཻ© Ž!µÇBŽ"¨|b9÷P¾_ƅà³'wi0¨ï°{ é¨lʼ%s4_F„Ád¬ÙA€h\†æAÓ¡Edz¨ò)sL@—‰å„ˆƒŽ‚ AÀß $Ñ»Û.»€.“I ¯=âœ8X$¬eyÀÇÀZÆk%H-Þ 7„=ÜF‰Ï‘ •B `‘6l*¢î@@ˆ‡" tÌÅTXšU¼CJÌ¡œÙƒ'ñ´07ŒÿP€œ$&•Ÿp¬h @}: $ÀïÞ¹,JatÚýdt€Î…Ó +ÒJ8@Ȧ«H}ÀE™wo®·SqÁ€€ÏóS‡áːAä /žÅëì6Ä F*nÆ×aGÊV:JÀi;b˜tš¯YaJd…{Fs Ê†<êvéÀΏ}‚ø äE´ša@ÎŅ@ãQ³Èbsã <žÂ¢[ ¬€÷‚\Àg p=ÁšhÇ@"ùA°!ÈMŠá…NvO…ˆ _ÈX€bŒH¤#{ÙR 8/«7Üì زt‹R@ܑ‡¸^ú zW‡E:z•ä]1| ËE°º}¤%‚.ˆJ‘MÚ  <VX‚‹@è×uJ¸HX:P&î†J RPŒ0Á h9y@P òNåEòºŽ"’„LD|jÉÓ½é~­ÈO¯?¥Æ½MÛ³ U´فŠ#ÆÝNÙòp N±ÈOŒƒ Hl6H¿ 3„™BTò ¡ŽK͎”\a™‚,‚ƒKžU_/x5âœÉ8F¹LêíºÕ‰ƒ]ú ɈÒ.Âø‚úo}ú\;±—i˜b¡Ô×ì˜úÛP€º˜ÞpÂÊ8Í° +XgÃ@ÒQÁ¨ÊZŽE¶Â ¶Áז0G¼€X3ÈԝøA`5PÙr ¼·¥ÀœÁ@.mÕ- Ë<ÏAu„NjȹÀ¼]́èÀ© Ô"9ضP¥À”N™ð ²,)F:ªþZÔw6Á€PßÀ䪁}ƒ, +ªÛQ! 8q’­6‚J…\WQHja^ù¯y]¬/ÎÀø oдPͳV ud@xƒp\¦\J ÆMýÁÉڐÝÎC ’qàŠ !~Ýð Ì°Ø¥º˜§BˆÐ9è\Ý3–b¤£ó†DAEX³KõÉöƒá‘ 1á9ÈS(¯Erš@•`^§d¾M1ÁM9üº;H+çé(æÖñ†t`pd`Â+¼à(¾`ˆ„.™H +OЗá¼Ö쀂 !Í©–!3 +ÒÑKF1,fÔ„ +: =‚UÁH q#1¹"4{ƒ•8ÀWp)\J…“£ YBˆÐ¡ÊRCšØ‚ó‚®H®âÖ¼A4  þ×a8Úír¹ÁPßnð'Ó<)Œ=6†fPˆÇPtx äŽ Ù=ƒ0mD\j­¢Clàð8¸føßL³{†BœaðØQB Ճ“·fE½J—Hœ¢·êƒ«C{à’h9öHÑgBa>MŽ¦ †÷x„¨;3bBá>b‚!a±ñ¸²~e‚¡ÃÞ!êŽyèìÏÁA‡SBºÝM0”H"äF¬ 9¼C/!RàwÈI¼r÷‡á!±­b,Dc4û„¢C^¢œðy脐7  +…ÄD~çp̲(œ4 +µcÛC”̤«KòôH & ¹…'ÄOâ}ÇÆ,ºgŒ +߉ ÄCb_è*ä ê‚F)Œ +º €4Ä':—KòDVᴐ¨ôOœ'"b>9ö•¢A‘ˆˆP¤*GšÁ†"$náѨâëUE3›@Wö€˜sï&ÅÝQ íÊMH3Úé‰UÆ9c™SÏÉM9d""ÒÀɉÇ«°þŠRhr »…HÅÒãŠwüÓÔ<±@#ÄÆQ€qÒPLRa”.ƒw£ñ!–n×ÁøÀ1°t›Ÿ¢nA—‘¢*þ.Œ‡\€£¢h&©¸äY*–,䉉7 UQ1U\f +ǀ >™V1¨ØU, DDÒRц°¢Ó©8-”«äc„d˜7Ý1«7µÒh*~H.&àÅQ[Qâ–)\+ZSYºÈœViQ â@òD §Ó¥r7L#vè0€“ˆç  GDþÌu‰á…)@ZЎ(µX.¨ÁqáÄǒIÐööGt¢‹ÖÁ™axᵨB1ŽºJâFb¼Ä‘è"òŸ¾Å ÃR°ix*«„rÂã"ü)¶ÈX¼t„›À:ÀŽÐrø#l&:ÉŒWÔÛpâ $ôJ톧C.CêJ¸:4×Ê^;ÁÝ¡Ñé'ÈL¡‰~¢? Q%dT;ò £‚Êڝ6Ñ»ÈM”Fµ‚BÔÂO3€+'váuÚCH¡:Ñéáú~Û&ŠREâ‡@ù€ôú”1҇‹3\a®Øaä'îÉFãVa¿ÔŽùé飃óÂia÷†Ä¸b41†*ˆJ4FYáÚ§H8X‘ Æá‰)ƸâE1HqKæɅ«@øÎÈVC<2ò ßD¹ah°£7¬ô /}Š…®ÀQ¥§0¼Dý^z°Á³Cì NCF¼‹å„(†uŠ^ h+¢ÔFRJ‹‡÷BF ¨Zzç9I¦à›†BΈBø`Ü ½$ –áÄáƒAg\-Ž +[Ú8U™A,e·Ë^‰,¨ÄÔ¢¡1‰çÁÃM‚ š’„…9°.Ü -‰NÒ1ÃLæº-ê «`ÞÅBƒî¨È@aX¶±†¤Ä✲H´Ú Ÿ +ÿ›ËÃúÈC¦h¸¶ m‰lB§$0&:¤eˆJ€U.BâSÁ$8T-1‰u;M">лÈl ¶!‡jÉ!çB6IBŸ„xÆJ†â:ñë²6Ê!%ÍÏ¡/C] [ÀÈS¤J#¾á Pr˜*€n +!aëKÈ`ÐNµ‹Áì!À±ug êbiB¤œP^Ì&’Á¿D\b0±Jx;Ìê{‚óÅbc}Ñ8Xáí„ÄCêaŽçš`4/zT8Ž‰jôÐZ!=$þ.úkÑ,ã9‰“N|=I*H5 >ã1ÃlàŠL õɃ '’³>ü2±t=G##ѱ·W£xL@wŽnE¤#£‚SØi Üèøo͎Qã4 êxtÜÒMŸ…?G +` ±n@|-p$©9×Ǭ‘C­ð͎;Ä¥DÏMØh,:v½ŽUE¥#!þft¤Ã ñŽÁ¢Z;ɧmXä©Ê1ߊ„‡¸HœgXD‚•é“YhwT"¾áŽ|Ç»c‘Ñâæ)Œ +yk™È` ÑZÈBl RQˆÎ% â +‘`ãÌ2×Ñ_ˆ«Ç±ãÉʂH7L=>?ùœ„‹¥b¸]8"ŠˆFnj"Ý°‰8üX=â¹ù¨¨£~hzÌ0JtðŽ,¢»J$…ÛHyd=Þ“Ž*rc1¯Â¹p3h + \R(&~3&fZÁ ¡3B`¢Âq:s±ÀӁg0’W"+x4\‰ ÁÎbÅPx1Dëè ä È±(:¬3~ÛX‹¦‡ü£2ê†àâ[X ÃÚ" :˜ dúç^Ø$ +ÁùL-0ꉾ ç"¼„vr¤ +æ3›ÆÀGb°ˆVhˆÑ} ÇÛ‽L\/ +çïÀƒÊe1¾ˆqŒ‚У ÀC<0šxpd3ºLŠ0n5B ò›(ƒ|8:UŽÝD¬ 81iØ·ÁAYÿæD#:QÂhsü”¸ ohîÄÊãAÑ/˜l`ýŠªeƙ€úÐúxbÜ &ːIœ©‹¼êXxYà:V» pHà#3E3H†œõ@c:³—)"•±Š80¼"º"b W-#kPÅÔh‚=1ìÚ ÄP®|C3V-†kÆY¢›18(¤íŒTôá`âû0j>¤ QˆùŠ†¬0<h”¶ ÏŸÈ$Ïa‘³®%°ÆMH:_Æ[.8C¤‰ŠÄà¢/ƒ iL ¬C‘Z‚÷Í-RR»®i"AGæâJ${ÁAˆEÊ ÓH¬C–‚ò[rF†ajìâ6ò}cÜ),…6ÛÈìÃû&‘økT+'ÉÄäƑ*x_¬JŒ€gc;Žäˆt8·‰PH#ËÁ8$¬ªîWHÎXP IsäB…^pW¬ãïñǘ@ü Ҍˆű° t¤HŸÄÚÝo{ӌD2î↠¾ÃÀÀ¤6äÀ^hT‘Á‚I2փ’Ä ¡Y’ƒ œÒB#ç¤H%´$1ŒÀ9ƒMr%É{´‘•ÝX5‰W„X`ˆxÆwiFL$oð9(V€ïuEM„r¤nñCü>ø×°DvN80„Å4v.”-~A +ä›C^h(Úkì@oäi0—dF"» +iI£Ã`-)µpKTü‚rÉvҀï’ƒw‰G¤ÄÑIqK2ö?ïH@ŽÆ±Ùá7ÔèÀ ,‘ ¾Ïâ:%cøF|3J Ւ×A‹*’ïô[ú3F—òE‡}q/™jÔEV +t1—¤¡¹ñ/G³Kv-R ZI ¤ôÃ\¦7º)ŽBŸÆ¥á rÛHÀ*@“#J åßÐCA6©ï)®n†àÈëbá0$QŽ<4^2J” ²I>Ï×XKT+Œa¿’r¤}qm¤¤Qn%DZÝ:'Ààf¨Œ6˜91Heâ җH/Nۋ)Cl#2ØèƒÔ8!½‹õH"$xˆn,:ð#Ÿ‚¡Éæáh2P¸rü&¶“†2?9ñz˜…tM: +ǂ$šI€Â¬I¹'Š!ݎÍÉá£nrõ¨¤HÄ@ö’mÇ®ƒðñ†8ždT¶)º2¯&Ï#û0ÈzT!†$@bzáæñóxz¬=z*-K§%Î`Åø¸©¼Mš*ŸKŸÊú¡^)33zˆTº*õF§J=—®åzEDÌ" ½NBÀ7꣒üÇ5£0²×Á@ž•‰HÚ¡Å+ØpÌJ—Ô;ˆ•i¾~`‚­Ûd–,Ћƒ[I_6P8vj¬®¨•Ô K½‘´óÀôV ¡d2ˆÈ2ÓK ++”èÊþ +gn]Ih7¾+y +v8(`’Ð0ir,F¥„ŒI0eÒ°€w„SÞ%˔·ÅÊdò™h,B«Hߚ7åar!ø$0$M“vJ‚$0¤š”92$…°É.¤ŒÊö7@°Cf +ٍíÊP]S-cS)¦0caCª·Ÿ, •—ÈdåTÒ7X äDš—=JycxaèVÙ¢>@H(„%€à=WÜ3<(§A4ÞRtX®Œ7²%WP¦­Ëƒß2‘ØhAšý–åÈ[£©ê˜U?¸ ù-M“Y5ÉZ%QEI˜l’0—µÆ΀4/jò¿é\>—?ŠËƒ2êŒÌQ—¨KScu®—X˜[62*8—è†×åÛrv¹ôâ#eÂÝa w©L$A,ϕ¿KWðRÉ¢ê#^Æ +£‰Ä*eíd`‰KÜXŽ;–ŠI„åË¢19MS²/ä‹Ëæå<²îF±TSñ‘›ÃøŸÆ²`é±´ +F!Œ†Â<åÈdé§ÜB¦,’ˆBe;± 5œìÞ`{\’ŽÊ8Ó:IvŒ—|˜ÆÉ #Ó̅)ér¡ü–¶É®ãP_s9 (VŽblÊ æpòU¸Áa–ýT•$'æK^HQ,a‡Œ7Æ¢ ³ƒYö“⨠——/Ìæ[qÃÈÁüF0'—…cÓ éM©Yù ӓTD!HÏ=yÈòˆä“F+–Þ/Â¥÷`Xý–H“¥ ÿ§ÿó=h{ZʓÎͳ‚ +puÙ ¬ÿÚWˌ^Ö‰9ˆTbªÞ¼– (’©AÉé#{xú4[#Ó[À0)·Äd’½'Ð(æJO*8j£Y1Û`ZÌ£Â\a6³”‹äìV DVÁ~ƒXc’XJA`H¦b¦Ù!¤jP…¢:B>M&î&Hµ`øõ³P0tÈžp#t&8#ùéªd˜LèX$ó“Qú}>- ÌL¦ð¡.Òmzà±L¬Žð!ä5Xq DÀºÀÌSf$ÓÎЙ,ÛXÆ@ׇC,˜‰Ê좐r¢ oUŠ?!—)Ë\^e¹*cp—¬‹í„šÙ@X2xˆ#m¦K¦2ÓþÀS虩x$¸Lr¦ý!"Ò_ôj1ÔôÜLa&[ÍX±š°±DX9¡T”<Ñ̈¤¨±$XÿLwU@3™Ê´?ÀC„ª”ÊI'…m7"'±“hgÙÑ~’˜ç.âo¤LJ搈Ë\…]ƒW”¸£]8Ï4%Îçª&d±ât`<.8± ´Àì"Q»¸]”uÀ +ºfŠKÅ©‡`,9}'®@“lãՁ¡Ôu<eœÌ”;¦, 6Ìl«-¹r ‡ÇÃû0—Û‡<9Gœl@éÂϯˆi4¡r†%Î +͎²G")íÑ¥|nn¢œKž9gîÁHB¢ZëG$ :¤ÍY5ùs*<BN;—o®ˆ±Ž¼9œ¡ +A瘳÷ٙ1ýNÊbŠÞߥ3ùäÑiþ!ó°•UR¬‰Ò@¢ Þ.z ¸‹£sÆÙu0uR9ñ’G%3ÂSU8ÐÄ81Ò/"ªóPm™1Ág0½ÎH̏ЪvÞ:—3&¨Á‹ª“uuÖåFœ+=éÂQçHT»0I‰¤Eá®óHÂØtÖÒr¡69Ü%‰Á +stf;»c½‘ Qͺ±1„ƒÔ˜^µ 'DÁöäîÔpN9ÿB‡\g)D½U&qB´·VIýÎ%P“Ûɵ15̘p„M€¦X*V'¤Š‰;¬œ¤4š¶ÓÔ¹é$ +V+s4kg3¢Ç ã$S Ò´ƒ|4('BBáùeä­±ZdJ\̨Яæ‘Ð:wN’|O¼”ßœ[“ô–sBÄåŒÎ«W VÃS¸Ñ«<hÎÂIPî(€ûCãÁ$ +šß&I˜“ñ\y†*ROÆa§PA1’~˜µ8[÷ãî/áyõtR9³1E¦ú‘b¹@ „=°@²§táòà¬és¶r\Lý_bŒYÆWXþœVÏ¿QŒ¯•¥Ÿdžœ$™ÎÀgסYÄTcZ¢´–IL>&~³$@ÆìIr(™$CI¯ ¸¸"l.Ë׎V·°UtŠßjÆb„ \ No newline at end of file diff --git a/clients/moira/Doc/internal.mss b/clients/moira/Doc/internal.mss new file mode 100644 index 00000000..6d6f1f5f --- /dev/null +++ b/clients/moira/Doc/internal.mss @@ -0,0 +1,1765 @@ +@Comment($Header$) +@Make(Manual) +@Device(PostScript) +@PageFooting(center "Draft of @value(date)") +@style(spacing = 1.5, indent 5, FontFamily = TimesRoman, size = 12) +@style(LeftMargin 1 inch, RightMargin 1 inch) + +@Begin(TitlePage) +@Begin(TitleBox) +@b[The Athena Service Management System] +@blankspace ( 1 line ) +@b[SMS Client Internals Document] +@blankspace ( 1 line ) +@i[Chris D. Peterson] +@End(TitleBox) +@CopyrightNotice(Massachusetts Institute of Technology) +@End(TitlePage) + +@Chapter(Introduction) + +The @i(Sms Client) program was designed to allow ordinary users a +simple method of performing all database manipulations common here at +@i(Project Athena). The user interacts with the program through a +terminal based menu. This allows use of sms on a wide variety of +platforms. Unlike previous packages where many different clients were +necessary to perform all these tasks, the @i(Sms Client) program +allows all operations to be performed from one application. This +saves the user time and effort by having all common operations in one +convenient place. I have spent a good deal of time cleaning up the +code to make it uniform throughout the entire client and am writing +this document to explain some of the decisions. My hope is that this +will allow you to add features with a minimum of amount effort, as +well as easing the transition between your code and mine. + +@Chapter(Overview) + +This section presents general concepts that hold throughout the code. +Some of the items may seem trivial, but together they keep the code +consistent and understandable. + +@Section(File Organization) + +Most files correspond to one type of item in the @i(SMS) database, +such as lists, machines, clusters, etc. These files are self +contained so that you can pick and choose which of these you would +like to use in any new client you decide to build. There are a few +special files that do not follow this convention. +@begin(description) + +@i[util.c]@\Utility functions used by many of the other files. + +@i[menu.c]@\Menu definitions for the entire application. + +@i[main.c]@\The main driver that handles application start up. + +@i[delete.c]@\Functions that handle deletion of lists and users. + +@i[globals.c]@\All global variable definitions. +@end(description) + +@Section(Command Organization) + +Each menu item has one and only one function associated with it, +although the same function may be used by two identical menu items. +The arguments passed to these functions from the menu package are an +array of character strings and the number of strings in the array. +The first argument in the array (argv[0]) is the name of the menu item +that has been selected. Thus the actual user specified arguments are +passed starting at the second argument (argv[1]). + +@Section(Naming and Comment Conventions) + +@Index(Variables) +@Index(Functions) + +I use all capital letters for constants, while variables are all small +letters, and functions are represented by mixing capital and small +letters, capitalizing each word in the function name. I use long +function names as functions are usually not called often, and long +names are much more descriptive. There are a few functions that do +not follow the mixed caps and small convention, these are generally +those I called out of @i(SMSLib), @i[CLib], or the menu package. + +@Index(Comments) + +Each file has a header containing the Revision Control System (RCS) +modification time and some history information, as well as some +information about the file. The template for this is a file named +'header'. Each function has a comment preceding it describing the +function, all variables used, and the value that this function +returns. Notes of special concern for this function are also listed +here. The function template is in a file called, surprisingly enough, +'function'. Other comments are placed where appropriate. + +@Section(Retrieving data from the server) +@Label(queue-def) + +Since one of the limitations of @i[SMS] is that no query may be +executed recursively, all information returned by a query must be +received before another query can be executed. To facilitate +programming simplicity I store the information returned from each +query into a queue as soon as it is received. This allows a simple, +although rather memory intensive, method of getting around this +problem. Another advantage of this method is that since no operations +are taking place on the data as it comes back from the server the time +that the server spends sending the data to the clients is kept to a +minimum, a necessity in large-scale environments. + +@Chapter[Application Wide Definitions] + +This section will cover all items that cross function boundaries, +including global variables, structure definitions, and constant +definitions. + +@Section[Global Variables] + +@Label(Globals)The @i[SMS Client] has a few global variables. Since +you will run into them throughout the application they warrant mention +here. +@Index(program_name) +@Index(user) +@Index(verbose) +@Index(found_some) +@begin(description) +@i[program_name] @\This is the name of the program currently being +executed, and is retrieved from argv[0] in @i[main.c]. + +@i[user] @\This is the name of the user currently executing the program, +and is also set in @i[main.c]. + +@i[verbose] @\This is a boolean value that, when FALSE turns off the +delete confirmation. For more information see section @ref(confirm). + +@i[found_some] @\This is a boolean that allows the @b[PrintByType()] +(sect. @ref(pbytype) function to be able to communicate with the +function calling the query that invokes it, as well as among calls to +itself. +@end(description) + +@Section[Structure Definitions] + +@Index(qelem) + +The only global structure definition is the one for the queue element. +What I will refer to as the queue is actually a doubly linked list +that all my queue manipulation functions (sect. @ref(queuecount)) +treat as a true queue. + +@begin(Format) +struct qelem { + struct qelem *q_forw; + struct qelem *q_back; + char * q_data; +}; +@end(Format) + +The queue data need not be a string; @i[char *] is used as a generic +pointer here. + +@Section[Definitions] + +@Index(FVoid) +@Index(FInt) +@Index(FCharStar) + +For readability there are a few important global definitions. +Function pointers in @i[C] tend to be tough to read so I have typedef'ed the +function pointers; FVoid, FInt, and FCharStar. These refer to functions +that return nothing, integers, and strings, respectively. + +@Index(MOD_FORMAT) + +Another global definition, MOD_FORMAT, is used to format the +modification information of an item for printing. It is important that +all modification information is presented to the user with this +format, to keep the @i[SMS Client] consistent. + +@Index(Infodefs) +@Label(infodefs) + +Information about an item in the database is returned by sms_query() +in an array of strings. Remembering what @i[info][7] is can be +difficult and it is possible that in future updates of the @i[SMS +Server] @i[info][7] may contain completely different information. To +solve both of these problems I have created a set of definitions for +each element of the argument list of each data type that the @i[SMS +Client] uses. A list of these can be found in appendix +@ref(a_infodefs), as well as the file @i[infodefs.h]. + +@Chapter(Utility Functions) + +I created several utility functions that handle common operations used +by many of the functions in the @i[SMS Client]. These functions +perform things like the storing of information in a queue as it comes +in from the @i(SMS Server), queue manipulation, querying the user, +and printing information. + +@Section(Storing and Freeing the Queue) + +As noted in section @ref(queue-def), all incoming information from the +@i(SMS Server) is stored in a queue as soon as it is received. The +function that does this, @b[StoreInfo()], as well the one that frees the +queue when we are finished with it, @b[FreeQueue()], are described here. + +@Index(StoreInfo) + +Use the function @b[StoreInfo()] to store all information received +from the @i[SMS Server] into a queue. Space for this queue is +dynamically allocated using malloc(). The actual information is +stored in a NULL terminated array of strings. The number of strings +in this array can be easily found with the function @b[CountArgs()] +(sect. @ref(countargs)). +@begin(format) + +int +StoreInfo(@i[argc, argv, data]) +int @i[argc]; +char ** @i[argv]; +char * @i[data]; +@end(format) +@begin(Description) + +@i[argc] @\The number of strings passed in argv. + +@i[argv] @\An array of strings to be stored in the queue. + +@i[data] @\A pointer to the previous element in this queue, or NULL if@\it +should create a new queue. This is updated with each call to @b[StoreInfo()] +and the value associated with this pointer is the last element in the +queue. + +@end(Description) +@blankspace(1 line) +Here is an example of an @i[SMS] query that would use this function to store +its arguments. + +@Begin[Format] + +struct qelem * elem = NULL; +status = sms_query("query handle", num_args, args, StoreInfo, &elem); + +@End[Format] + +The variable elem must initially be set to NULL, or @b[StoreInfo()] +will try to add the first element of this queue to a currently +existing queue that is really just the garbage left on the stack. The +value of elem when this query returns is the last element in the +queue, and the function @b[QueueTop()] (section @ref(queuetop)) should +be used to get the top element of the queue, which is expected by most +other queue operations. + +@Center(________) + +@Index(FreeQueue) + +To free the queue and any data associated with it, the function +@b[FreeQueue()] is used. This function expects a queue similar to the +one created by the @b[StoreInfo()] function. @b[FreeQueue()] frees +all memory associated with this particular queue, and will do bad +things if the information stored in the queue is not a NULL +terminated, allocated array of allocated strings. All allocations +are assumed to have been done with the @i[C] malloc() function. + +@begin(Format) + +void +FreeQueue(@i[elem]) +struct qelem * @i[elem]; +@end(Format) +@begin(Description) + +@i[elem] @\Any element in the queue. The entire queue will be freed +regardless of the element passed. +@end(Description) + +@Section[Queue Manipulation] + +The following group of functions perform common tasks that involve +retrieving information from or manipulating a queue. All these functions +will handle NULL passed to them in an appropriate manner, either returning +zero, or NULL. + +@Label(queuetop) +@Index(QueueTop) + +To find the top element of a queue use the function @b[QueueTop()]. + +@begin(Format) + +struct qelem * +QueueTop(@i[elem]) +struct qelem * @i[elem]; +@end(Format) +@begin(Description) +@i[elem] @\Any element in the queue. +@end(Description) + +@blankspace(1 line) + +@b[QueueTop()] returns the top element of the queue defined by its +argument. + +@Center(________) + + +@label(queuecount) +@Index(QueueCount) + +The function @b[QueueCount()] counts the number of elements in a queue. + +@begin(Format) +int +QueueCount(@i[elem]) +struct qelem * @i[elem]; +@end(Format) +@begin(Description) +@i[elem] @\Any element in the queue. +@end(Description) + +@blankspace(1 line) + +@b[QueueCount()] returns the number of elements in the queue defined +by it argument, it need not be the top element, any +element will do. + +@Section[Array Manipulation] + +The arrays of strings have some manipulation functions of their own. +All arrays used in the @i[SMS Client] are assumed to be NULL terminated. +In general this is no problem as @b[StoreInfo()] creates NULL terminated +arrays. + +@Label(countargs) +@Index(CountArgs) + +@b[CountArgs()] counts the number of elements in a NULL +terminated array of strings. + +@begin(Format) +int +CountArgs(@i[info]) +char ** @i[info]; +@end(Format) +@begin(description) +info @\A NULL terminated array of character strings. +@end(description) + +@blankspace(1 line) + +@b[CountArgs()] returns the number of strings in the NULL terminated array +of strings passed to it. A common use of @b[CountArgs()] is to tell +sms_query() how many items are in the argument list passed to the +query, as shown below. +@begin(format) + +status = sms_query("query", CountArgs(args), args, StoreInfo, &elem); +@end(format) + +@Center(________) +@Index(FreeInfo) + +To free all elements in a NULL terminated array of strings use the +@b[FreeInfo()] function. + +@begin(Format) +void +FreeInfo(@i[info]) +char ** @i[info]; +@end(Format) + +@begin(Description) + +@i[info] @\A NULL terminated array of strings allocated with malloc(), +to be freed. +@end(Description) + +@Center(________) + + +@Label(sinn) +@Index(SlipInNewName) + +Most update queries use the same argument list that is returned by the +information query for the database item is question. For instance, +update_list uses almost the same arguments that get_list_info returns. +The difference in these arguments lists is that update queries expect +the new name to be the second element in the list. The +@b[SlipInNewName()] function adds the new name as the second argument +in the list passed to it, bumping all the other arguments down one +slot. + +@begin(Format) +void +SlipInNewName(@i[info, name]) +char ** @i[info]; +char * @i[name]; +@end(Format) + +@begin(Description) +@i[info] @\A NULL terminated array of strings. + +@i[name] @\The new name to be slipped into @i[info] at position @i[info][1]. +@end(Description) + +@Blankspace(1 line) + +Once @b[SlipInNewName()] has been performed on a argument list do not +try to use the definitions for that type of element, as they will be +wrong. Don't use @i[info][L_ACE] to try to retrieve the ace of the +list, as this function has shifted all the items except the old name +down one element. + +@Section[Special Queue Functions] + +The following two functions @b[Loop()] and @b[QueryLoop()] are used +when an operation needs to be performed on every element of the queue. +The difference between these two functions is that @b[QueryLoop()] +presents a method of asking the user if the operation should be +performed, while @b[Loop()] just performs it on each element. + +@Index(Loop) +@Index(LoopFunc) + +To perform an operation on every element in the queue use the +@b[Loop()] function. + +@begin(Format) +void +Loop(@i[top, LoopFunc]) +struct qelem * @i[top]; +FVoid @i[LoopFunc]; +@end(Format) +@begin(Description) +@i[top] @\The top element of the queue. + +@i[LoopFunc] @\The function to perform on each element of the queue. +@end(Description) + +@blankspace(1 line) + +The @i[LoopFunc] has the following format and is performed with the +data of each element in the queue. + +@begin(Format) +void +LoopFunc(@i[info]) +char ** @i[info]; +@end(Format) +@begin(Description) +@i[info] @\The array of strings that is stored as the @i[q_data] of each element +of the queue. +@end(Description) + +@blankspace(1 line) + +No provision is made for the @i[LoopFunc] function to return a value. + +@Center(________) + + +@Label(qloop) +@Index(QueryLoop) +@Index(PrintFunc) +@Index(QueryLoopFunc) + +If you want to query the user before your function is called on each +element of the queue, use the @b[QueryLoop()] routine. + +@Begin[Format] +void +QueryLoop(@i[top, PrintFunc, QueryLoopFunc, query_string]) +struct qelem * @i[top]; +FCharStar @i[PrintFunc]; +FVoid @i[QueryLoopFunc]; +char * @i[query_string]; +@End[Format] +@begin(Description) +@i[top] @\The top element of the queue. + +@i[PrintFunc] @\The function that will print information to the user +about each specific element of the queue, its return value is appended +to the query string, and asked as a @b[YesNoQuitQuestion()] (sect. +@ref[ynqquestion]) of the user. + +@i[QueryLoopFunc] @\This function is called if the user answers yes to the +question asked of him, or if there is only one element in the queue. + +query_string @\Basic prompt for the @b[YesNoQuitQuestion()] asked of +the user, the string returned by the @i[PrintFunc] is appended to this +string to form the full prompt. +@end(Description) + +@blankspace(1 line) + +@Index(PrintFunc) + +@i[PrintFunc] is called using the data stored in each element of the +queue, unless there is only one element in the queue, in which case +@i[QueryLoopFunc] is called without querying the user. @i[PrintFunc] +has the following format. + +@begin(Format) +char * +PrintFunc(@i[info]) +char ** @i[info]; +@end(Format) +@begin(Description) + +@i[info] @\The array of strings that is stored as the @i[q_data] of +each element in the queue. +@end(Description) + +@blankspace(1 line) + +The @i[PrintFunc] returns a string that is to be appended to the +query_string() of the @b[QueryLoop()] function. This string is then +used to ask the user if the @i[QueryLoopFunc] should be called. The +return string from the @i[PrintFunc] is usually just the name of the +item contained in the data field of each queue element. + +@Index(QueryLoopFunc) + +@i[QueryLoopFunc] is called each time the user answers 'yes' to the +question asked of him, with the current element's information. The +only exception to this is if the queue has only one element, in which +case @i[QueryLoopFunc] is called immediately with @i[one_item] set to TRUE. +@i[QueryLoopFunc] has this format. + +@begin(Format) +void +QueryLoopFunc(@i[info, one_item]) +char ** @i[info]; +Bool @i[one_item] +@end(Format) +@begin(Description) + +@i[info] @\The array of strings that is stored as the @i[q_data] of +each element in the queue. + +@i[one_item] @\This is TRUE if this function is being called without asking +the user, because there is only one item in the queue. +@end(Description) + +@blankspace(1 line) + +No provision is made for the @b[QueryLoop()] function to return a value. + +@b[QueryLoop()] automatically performs the @i[QueryLoopFunc] without +calling the @i[PrintFunc] if there is only one item in the queue, but +the @i[QueryLoopFunc] is alerted to this fact by the @i[one_item] +variable. If there is more than one item on the queue the the +@i[PrintFunc] is executed, and the user is prompted, as in the +following example. + +@begin(format) +@tabset(10) + +@b[Source Code:] + +QueryLoop(top_of_queue, PrintListInfo, UpdateList, "Would you like to update list"); + +@tabclear() +@tabset(50, 60) +@b[User Sees:] + +List: foo @\Members: @\35 +This list is a group@\GID: @\9803 + +Would you like to update list foo (y/n/q) [n]: +@end(format) + +This question is asked of the user for every item in the queue, and if +the answer is yes then the @i[QueryLoopFunc] is called. If the answer +is no then it continues onto the next element, quit drops out of the +loop entirely. + +@Index(NullPrint) + +The return value of the @i[PrintFunc] is the name of the list in the +above example (i.e. foo). A simple print function, @b[Nullprint()], +is detailed in section @ref(nullprint). If @b[Nullprint()] were used +in the above example following would be the result: + +@blankspace(1 line) + +@begin(Format) +Would you like to update list foo (y/n/q) [n]: +@end(Format) + +@Section[Generic @i{SMS} query routines] + +These two very common routines are used as sms_query() callbacks. +Using these common routines helps other programmers immediately +identify what type of tuples your query is expected to return. + +@Index(Scream) + +Use the @b[Scream()] function when you do not expect any tuples to be +returned by the @i[SMS Server], as in an update, add, or delete query. + +@begin(Format) +int +Scream() +@end(Format) + +A Sample use of this function. + +@begin(Format) +status = sms_query("update_list", CountArgs(args), args, Scream, NULL); +@end(Format) + +@Center(________) + + +@Index(NullFunc) + +@b[NullFunc()] does nothing at all with the tuples, it just ignores them. + +@begin(Format) +int +NullFunc() +@end(Format) + +@b[NullFunc()] is useful when you are expecting tuples to be returned, +but are not interested in their contents, I used it when I was testing +for existence of a list by performing a count_members_of_list query +and then testing the return value, but was not interested in the +tuples. A sample use of this @b[NullFunc()]. + +@begin(Format) +status = sms_query("get_list_info", CountArgs(args), args, NullFunc, NULL); +@end(Format) + +@Section[Retrieving User Input] + +To keep a consistent user interface across the entire application, the +@i[SMS Client] uses the following functions to handle most user input. +The only other accepted method of retrieving user input is by making +a call to @b[Prompt_input()], which is in the menu library, and the +basis for all these functions. + +@Index(PromptWithDefault) + +Use @b[PromptWithDefault()] when you need to prompt the user for a value +and you want to provide him with a default value. + +@begin(Format) +int +PromptWithDefault(@i[prompt, buf, buflen, def]) +char * @i[prompt], * @i[buf]; +int @i[buflen]; +char * @i[def]; +@end(Format) + +@begin(Description) +prompt @\The string to prompt the user with. + +buf @\The buffer to return the answer in. + +buflen @\The length of the return buffer. + +def @\The default return value (if NULL then "" is the default). + +@End[Description] + +@Blankspace( 1 line) + +A typical call to this function is as follows: +@begin(format) + +@b[Source Code:] + +PromptWithDefault("Input a value for the string", buf, BUFSIZ, "foo"); + +@b[User Sees:] + +Input a value for the string [foo]: + +@end(format) + +@b[PromptWithDefault()] will return (-1) if the user breaks out of this +prompt with control-C or some other break character. + +@Center(________) + + +@Label(ynquestion) +@Index(YesNoQuestion) + +@b[YesNoQuestion()] is used to ask the user a question that is best +answered with a response of either yes or no. It also gives the user +a default value in the same form as @b[PromptWithDefault()]. + +@begin(Format) +Bool +YesNoQuestion(@i[prompt, bool_def]) +char @i[*prompt]; +Bool @i[bool_def]; +@end(Format) + +@begin(Description) +@i[prompt] @\The string to prompt the user with. + +@i[bool_def] @\The default value, either TRUE or FALSE. +@end(Description) + +@blankspace(1 line) + +@b[YesNoQuestion()] returns either TRUE or FALSE, or possibly (-1) on +a break by the user. The only accepted values from the user are 'y', +'Y', 'n', and 'N'. All other values prompt the user with "Please +answer 'y' or 'n'." and ask the question again. + +@Center(________) + + +@Label(ynqquestion) +@Index(YesNoQuitQuestion) + +Use @b[YesNoQuitQuestion()] when you want the user to have the option to +quit as well as answer yes or no. + +@begin(Format) +Bool +YesNoQuitQuestion(@i[prompt, bool_def]) +char @i[*prompt]; +Bool @i[bool_def]; +@end(Format) + +@begin(Description) + +@i[prompt] @\The string to prompt the user with. + +@i[bool_def] @\The default value, either TRUE or FALSE. +@end(Description) + +@blankspace(1 line) + +@b[YesNoQuitQuestion()] is very similar to @b[YesNoQuestion()], in +fact the only difference is that this function interprets the keys 'q' +and 'Q' the same as hitting a break, causing +@b[YesNoQuitQuestion()] to return (-1). + +@Center(________) + + +@Label(confirm) +@Index(Confirm) + +When you want to ask the user for delete confirmation use the @b[Confirm()] +function. + +@begin(Format) +Bool +Confirm(@i[prompt]) +char * @i[prompt]; +@end(Format) +@begin(Description) +@i[prompt] @\The string to prompt the user with. +@end(Description) + +@blankspace(1 line) + +@b[Confirm()] is a specialized user input function. This function is +meant to be used only when making delete confirmation. It will +immediately return TRUE if the verbose global variable (see section +@ref(globals)) is FALSE, implying that no confirmation is wanted. +Otherwise it asks the user a @b[YesNoQuestion()] using its argument as +the prompt, with a default value of FALSE. If the user answers yes +then the function will return TRUE, otherwise FALSE is returned. + +@Center(________) + + +@Label(gvfu) +@Index(GetValueFromUser) + +The @b[GetValueFromUser()] routine is used to update a string that was +previously allocated with malloc(). + +@begin(format) +int +GetValueFromUser(@i[prompt, pointer]) +char * @i[prompt], ** pointer; +@end(format) +@begin(Description) +@i[prompt] @\The string to prompt the user with. + +@i[pointer] @\A pointer to the malloced item that is to be updated, or a +pointer to NULL. +@end(Description) + +@Blankspace( 1 line ) + +@b[GetValueFromUser()] returns SUB_ERROR if the user broke out of the +prompt with control-C, else SUB_NORMAL. The old value is freed, +unless it is NULL, and the new value is allocated and pointed to by +@i[pointer]. + +@Center(________) + + +@Index(GetYesNoValueFromUser) + +If the value to be updated is an @i[SMS] style boolean ("0" or "1") +then use the the @b[GetYesNoValueFromUser()] function, which asks the +user a @b[YesNoQuestion()]. + +@begin(Format) +int +GetYesNoValueFromUser(@i[prompt, pointer]) +char * @i[prompt], ** @i[pointer]; +@end(Format) + +@begin(Description) +@i[prompt] @\The string to prompt the user with. + +@i[pointer] @\A pointer to the malloced item that is to be updated, or a +pointer to NULL. +@end(Description) + +@Blankspace( 1 line) + +@b[GetYesNoValueFromUser()] also returns SUB_ERROR if the user broke +out of the prompt with control-C, and SUB_NORMAL otherwise. +@i[pointer] is freed - Unless it is NULL - and reset to point to a +properly allocated value of "0" or "1" depending upon the user's answer +to the question. + +@Center(________) + + +@Index(GetFSTypes) + +The @i[SMS Server] expects file types to be passed as an integer bit +mask. Use the @b[GetFSTypes()] function to query the user about the +new value of this field. + +@begin(Format) +int +GetFSTypes(@i[pointer]) +char ** @i[pointer]; +@end(Format) + +@begin(Description) +@i[pointer] @\A pointer to the current allocated filesystem type that +is to be updated, or a pointer to NULL. +@end(Description) + +@Blankspace( 1 line) + +@b[GetFSTypes()] returns SUB_ERROR if the user broke out of the prompt +with control-C, and SUB_NORMAL otherwise. It also constructs the +correct bit field by asking the user about each type, providing a +default value, of course. The new filesystem type is passed back as +the new value pointed to by @i[pointer]. If non-NULL the old pointer +is freed. + +@Section[Printing Routines] + +Here are a few general printing routines. Most printing is done with +routines that are specific to the type of database item we are dealing +with, but these few printing functions are general enough to describe +here. + +@Label(print) +@Index(Print) + +Use the @b[Print()] function to print out all elements in each tuple +returned by a call to sms_query(). + +@begin(Format) +int +Print(@i[argc, argv, callback]); +int @i[argc]; +char ** @i[argv], * @i[callback]; +@end(Format) + +@begin(Description) +@i[argc] @\The number if strings passed in argv. + +@i[argv] @\An array of strings that is the data to be stored in the queue. + +@i[callback] @\Not Used. +@end(Description) + +@blankspace(1 line) + +@b[Print()] returns SMS_CONT. Every time this function is called it +sets the global variable @i[found_some] to TRUE. + +@Center(________) + +@Label(pbytype) +@Index(PrintByType) + +If you want something a bit more specialized then try +@b[PrintByType()]. If a string compare of @i[argv][0] and +@i[callback] shows them to be equal then the tuple is printed. If +@i[callback] is NULL then it acts exactly like @b[Print()]. + +@begin(Format) +int +PrintByType(@i[argc, argv, callback]); +int @i[argc]; +char ** @i[argv], * @i[callback]; +@end(Format) + +@begin(Description) +@i[argc] @\The number if strings passed in argv. + +@i[argv] @\An array of strings that is the data to be stored in the queue. + +@i[callback] @\@i[Argv][0] is compared to this with strcmp() and if +they are equal then the tuple printed. In the special case where +callback is NULL all tuples are printed. +@end(Description) + +@blankspace(1 line) + +@b[PrintByType()] returns SMS_CONT. Every time this function is +called it sets the global variable found_some to TRUE. + +@Center(________) + + +@Index(PrintHelp) + +If the help information is stored in a NULL terminated array of strings +then use the @b[PrintHelp()] function to print the information for the user. + +@begin(Format) +int +PrintHelp(@i[message]) +char ** @i[message]; +@end(Format) + +@begin(Description) +@i[message] @\The help message stored in a NULL terminated array of strings. +@end(Description) + +@blankspace(1 line) + +@b[PrintHelp()] returns DM_NORMAL to allow help routines to remain as +simple as possible. + +@Center(________) + + +@Index(NullPrint) +@Label(nullprint) + +When using the @b[QueryLoop()] function (sect. @ref(qloop)) there are +times when all the @i[PrintFunc] needs to return is the name of the item, if +the item's name is the first element of the tuple then use the @b[NullPrint()] +function to retrieve this name. + +@begin(Format) +char * +NullPrint(@i[info]) +char ** @i[info]; +@end(Format) +@begin(Description) +info@\ An array of strings. +@end(Description) + +@blankspace(1 line) + +@b[NullPrint()] returns the first element in the array passed to it, +@i[info][0]. + +@Section[Miscellaneous Utility Functions] + +This section contains the rest of the utility functions, these don't +really fit into a category. + +@Index(FreeAndClear) + +Use @b[FreeAndClear()] to free a pointer and set it to NULL. + +@Begin[Format] +void +FreeAndClear(@i[pointer, free_it]) +char ** @i[pointer]; +Bool @i[free_it]; +@End[Format] + +@begin(Description) + +@i[pointer] @\A pointer to the item to free or clear, if this item is +NULL then the function does not try to free it. + +@i[free_it] @\This function always sets the item to NULL, but only if +this is TRUE is it freed. + +@end(Description) + +@Blankspace(1 line) +@Center(________) + + +@Index(ValidName) + +@b[ValidName()] check to see if string is a valid name for a new +item in the database. + +@begin(Format) +Bool +ValidName(@i[s]) +char * @i[s]; +@end(Format) + +@begin(Description) +@i[s] @\The string to check. +@end(Description) + +@Blankspace( 1 line ) + +If the name is not valid, @b[ValidName()] alerts the user to the +problems encountered and returns FALSE. Checks are made to see if +this name contains a wildcard, contains spaces, or has no characters +at all. This is by no means an exhaustive search, but does handle some +common things that confuse the database. + +@Center(________) + + +@Index(ToggelVerboseMode) + +The @b[ToggleVerboseMode()] function is associated with the menu items +that allows the user to toggle the verbose global variable (see sect. +@ref(globals)). + +@Center(________) + + +@Index(Strsave) + +Use the @b[Strsave()] function to allocate space for a new string. + +@begin(Format) +char * +Strsave(@i[str]) +char * @i[str]; +@end(Format) + +@begin(Description) +@i[str] @\The string that needs to have space allocated for it. +@end(Description) + +@Blankspace( 1 line ) + +@b[Strsave()] returns an allocated copy of the string passed to it. + +@Center(________) + + +@Index(EncryptMITID) +@Index(RemoveHyphens) + +To save an MIT ID number two functions are needed, @b[EncryptMITID()] and +@b[RemoveHyphens()]. + +@begin(Format) +void +EncryptMITID(@i[sbuf], @i[idnumber], @i[first], @i[last]) +char * @i[sbuf], * @i[idnumber], * @i[first], * @i[last]; +@end(Format) + +@begin(Description) +@i[spbuf] @\The buffer used to return the encrypted id number. + +@i[idnumber] @\The unencrypted id number. + +@i[first, last] @\The name of the user whose id number we are encrypting. + +@end(Description) + +@Blankspace(1 line) +@Center(________) + + +@begin(Format) +void +RemoveHyphens(@i[str)] +char * @i[str]; +@end(Format) + +@begin(Description) + +@i[str] @\This is the string with hyphens to remove, when the function +returns it will no longer have hyphens. +@end(Description) + +@Chapter[Function Organization within Files] + +The functions within each of the files tend to be quite similar. I +have organized these so that at the top of the file are all the +general routines for the type of element currently being worked upon. +In @i[attach.c], for example, there is a @b[PrintFSInfo()] function, an +@b[AskFSInfo()] function, and a @b[GetFSInfo()] function. Each of the +item types will have a file that contains very similar functions, and +all will be grouped near the top of the file. As an example consider the +general functions in @i[attach.c]. + +@b[PrintFSInfo()] is used to print out all the information about a filesystem. + +@begin(Format) +static char * +PrintFSInfo(@i[info]) +char ** @i[info]; +@end(Format) + +@begin(Description) +@i[info] @\A NULL terminated array of strings that contains all information +about a filesystem. +@end(Description) + +@blankspace(1 line) + +@b[PrintFSInfo()] has the same format as @i[PrintFunc] (sect. +@ref(qloop)) and can be used as the @i[PrintFunc] for @b[QueryLoop()] +calls in the functions that update and delete filesystems. + +@Center(________) + + +@b[AskFSInfo()] is used to ask the user to update the current filesystem +information. + +@begin(Format) +static char ** +AskFSInfo(@i[info, name]) +char ** @i[info]; +Bool @i[name]; +@end(Format) + +@begin(Description) + +@i[info] @\A NULL terminated array of malloced strings that contains +all information about a filesystem. When the function is called this +array contains the default values to present to the user, and when the +function is returned this array contains the argument list for the +update or add query. + +@i[name] @\A boolean value that when TRUE tells this function to ask +the user for a new value for the name of this filesystem, and then +slip it into the @i[info] list, using @b[SlipInNewName()] (sect. +@ref(sinn)) +@end(Description) + +@Blankspace( 1 line ) + +The return value of @b[AskFSInfo()] is just the @i[info] array after +it has been updated with the new values. This function is used to +perform most of the information gathering in the update and add +filesystem queries. For an update query the information returned from +a @i[get_filesys_by_label] can be used for the @i[info] array, but for +an add filesystem, the program must come up with a reasonable set +default values for the @i[info] array. + +If the @i[name] flag is set then the @b[SlipInNewName()] function is +called to add a new name to the @i[info] array, this causes the array +indices for most values to be changed and thus the predefined values +used to access the information in this array can no longer be used +(see sections @ref(infodefs) and @Ref(sinn)). + +@Center(________) + + +The @b[GetFSInfo()] function is used to to perform common information +gathering @i[SMS] queries for a filesystem. + +@begin(Format) +static struct qelem * +GetFSInfo(@i[type, name]) +int @i[type]; +char * @i[name]; +@end(Format) + +@begin(Description) +@i[type] @\The type of filesystem query to make, can be one of; +LABEL, MACHINE, GROUP or ALIAS. The valid names for @i[type] are +typedef'ed at the beginning of each file. + +@i[name] @\The name to pass as the argument to the query. +@end(Description) + +@Blankspace(1 line) + +The @b[GetFSInfo()] function is a simple method of making the most +common information gathering @i[SMS] queries, it handles all return +values from the call to sms_query() and returns the top element of a +queue containing all information returned by the server. If an error +is detected then NULL is returned and an error message is printed to +the user. + +After this group of general functions come those that actually +correspond to items in the menu. These commonly perform get, add, +update, and delete operations. For more information on the functions +in each of the files see the appendix @ref(fqlist). + +@Appendix(The @i[SMS] Query String Array Definitions) + +@Label(a_infodefs) + +@Begin[Format] + +/* + * This file contains all definitions that allow easy access to + * elements returned by most of the @i[SMS] queries. + * + * If the order of the arguments in the @i[SMS] queries change (again) + * then all that needs to be changed are the values of these items + * and all should be well, (hopefully :-). + * + * Chris D. Peterson - kit@@athena + * 6/8/88 + */ + +@Begin[Verbatim] + +#ifndef _infodefs_ +#define _infodefs_ + +#include "mit-copyright.h" + +#define NAME 0 + +/* get_ace_use */ + +#define ACE_TYPE 0 +#define ACE_NAME 1 +#define ACE_END 2 + +/* alias queries. */ + +#define ALIAS_NAME 0 +#define ALIAS_TYPE 1 +#define ALIAS_TRANS 2 +#define ALIAS_END 3 + +/* Cluster information queries */ + +#define C_NAME 0 +#define C_DESCRIPT 1 +#define C_LOCATION 2 +#define C_MODTIME 3 +#define C_MODBY 4 +#define C_MODWITH 5 +#define C_END 6 + +/* Cluster Data information queries */ + +#define CD_NAME 0 +#define CD_LABEL 1 +#define CD_DATA 2 +#define CD_END 3 + +/* Delete Member from list queries. */ + +#define DM_LIST 0 +#define DM_TYPE 1 +#define DM_MEMBER 2 +#define DM_END 3 + +/* Filesys queries */ + +#define FS_NAME 0 +#define FS_TYPE 1 +#define FS_MACHINE 2 +#define FS_PACK 3 +#define FS_M_POINT 4 +#define FS_ACCESS 5 +#define FS_COMMENTS 6 +#define FS_OWNER 7 +#define FS_OWNERS 8 +#define FS_CREATE 9 +#define FS_L_TYPE 10 +#define FS_MODTIME 11 +#define FS_MODBY 12 +#define FS_MODWITH 13 +#define FS_END 14 + +/* Get List Of Member queries. */ + +#define GLOM_NAME 0 +#define GLOM_ACTIVE 1 +#define GLOM_PUBLIC 2 +#define GLOM_HIDDEN 3 +#define GLOM_MAILLIST 4 +#define GLOM_GROUP 5 +#define GLOM_END 6 + +/* General List information queries. */ + +#define L_NAME 0 +#define L_ACTIVE 1 +#define L_PUBLIC 2 +#define L_HIDDEN 3 +#define L_MAILLIST 4 +#define L_GROUP 5 +#define L_GID 6 +#define L_ACE_TYPE 7 +#define L_ACE_NAME 8 +#define L_DESC 9 +#define L_MODTIME 10 +#define L_MODBY 11 +#define L_MODWITH 12 +#define L_END 13 + +/* List Member information queries. */ + +#define LM_LIST 0 +#define LM_TYPE 1 +#define LM_MEMBER 2 +#define LM_END 3 + +/* Machine information queries */ + +#define M_NAME 0 +#define M_TYPE 1 +#define M_MODTIME 2 +#define M_MODBY 3 +#define M_MODWITH 4 +#define M_END 5 + +/* Machine to cluster Mapping */ + +#define MAP_MACHINE 0 +#define MAP_CLUSTER 1 +#define MAP_END 2 + +/* NFS phys. queries. */ + +#define NFS_NAME 0 +#define NFS_DIR 1 +#define NFS_DEVICE 2 +#define NFS_STATUS 3 +#define NFS_ALLOC 4 +#define NFS_SIZE 5 +#define NFS_MODTIME 6 +#define NFS_MODBY 7 +#define NFS_MODWITH 8 +#define NFS_END 9 + +/* PO box information queries */ + +#define PO_NAME 0 +#define PO_TYPE 1 +#define PO_BOX 2 +#define PO_END 3 + +/* Quota queries */ + +#define Q_FILESYS 0 +#define Q_LOGIN 1 +#define Q_QUOTA 2 +#define Q_DIRECTORY 3 +#define Q_MACHINE 4 +#define Q_MODTIME 5 +#define Q_MODBY 6 +#define Q_MODWITH 7 +#define Q_END 8 + +/* User information queries */ + +#define U_NAME 0 +#define U_UID 1 +#define U_SHELL 2 +#define U_LAST 3 +#define U_FIRST 4 +#define U_MIDDLE 5 +#define U_STATE 6 +#define U_MITID 7 +#define U_CLASS 8 +#define U_MODTIME 9 +#define U_MODBY 10 +#define U_MODWITH 11 +#define U_END 12 + +#endif _infodefs_ /* Do not add anything after this line. */ + +@End[Verbatim] + +@End[Format] + +@Appendix(List of Menus, Functions, and Query Names) + +@Label(fqlist) + +@blankspace(2 lines) + +The menu tree for the @i[SMS Client] has three levels, the root, tier +1 and tier 2. A diagram of the menu tree is show in appendix @ref(tree). +The root of the tree is composed of calls to other menus. + +@blankspace(2 lines) + +@begin(Group) +@Center(Sms Database Manipulation) +@begin(Verbatim) + + 1. (cluster) Cluster Menu. + 2. (filesys) Filesystem Menu. + 3. (list) Lists and Group Menu. + 4. (machine) Machine Menu. + 5. (nfs) Physical NFS Menu. + 6. (user) User Menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) +@Hinge() +@Section[First Tier Menus] + +@Center{ @b[Cluster Menu] } + +@begin(Verbatim) + + 1. (show) Get cluster information. + 2. (add) Add a new cluster. + 3. (update) Update cluster information. + 4. (delete) Delete this cluster. + 5. (mappings) Machine To Cluster Mappings Menu. + 6. (c_data) Cluster Data Menu. + 7. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@Begin(Format) +@tabset(20,40,60) +show@\get_cluster +add@\get_cluster@\add_cluster +update@\get_cluster@\update_cluster +delete@\get_cluster@\delete_cluster + +@End[Format] +@Hinge() +@Center{ @b[Filesystem Menu] } + +@begin(Verbatim) + + 1. (get) Get Filesystem Name Information. + 2. (add) Add New Filesystem to Database. + 3. (change) Update Filesystem Information. + 4. (delete) Delete Filesystem. + 5. (check) Check An Association. + 6. (alias) Associate with a Filesystem. + 7. (unalias) Dissociate from a Filesystem. + 8. (quotas) Quota Menu. + 9. (verbose) Toggle Verbosity of Delete. +10. (help) Help ... + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40,60) +get@\get_filesys_by_label +add@\get_filesys_by_label@\add_filesys +change@\get_filesys_by_label@\update_filesys +delete@\get_filesys_by_label@\delete_filesys +check@\get_alias +alias@\get_alias@\add_alias +unalias@\get_alias@\delete_alias + +@end(Format) +@Hinge() +@Center{ @b[List Menu] } + +@begin(Verbatim) + + 1. (show) Display information about a list. + 2. (add) Create new List. + 3. (update) Update characteristics of a list. + 4. (delete) Delete a List. + 5. (query_remove) Interactively remove an item from all lists. + 6. (members) Member Menu - Change/Show Members of a List. + 7. (list_info) List Info Menu. + 8. (quotas) Quota Menu. + 9. (verbose) Toggle Verbosity of Delete. +10. (help) Print Help. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40,60) +show@\get_list_info +add@\get_list_info@\add_list +update@\get_list_info@\update_list +delete@\get_list_info@\get_ace_use +@\count_members_of_list@\get_lists_of_member +@\get_members_of_list@\delete_list +@\delete_member_from_list +query_remove@\get_lists_of_member@\delete_member_from_list + +@end(Format) +@Hinge() +@Center{ @b[Machine Menu] } + +@begin(Verbatim) + + 1. (show) Get machine information. + 2. (add) Add a new machine. + 3. (update) Update machine information. + 4. (delete) Delete this machine. + 5. (mappings) Machine To Cluster Mappings Menu. + 6. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +show@\get_machine +add@\get_machine@\add_machine +update@\get_machine@\update_machine +delete@\get_machine@\delete_machine + +@end(Format) + +Delete machine needs to make some other checks. For lack of time these +have not been implemented. +@begin(Itemize) +@tabset(45) +Is the machine a server@\get_server_host_info + +Is the machine an NFS server@\get_nfsphys + +Are there any ACE's that this machine references@\get_server_host_access +@end(Itemize) + +@Hinge() + +@Center{ @b[NFS Physical Menu] } + +@begin(Verbatim) + + 1. (show) Show an NFS server. + 2. (add) Add NFS server. + 3. (update) Update NFS server. + 4. (delete) Delete NFS server. + 5. (quotas) Quota Menu. + 6. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +show@\get_nfsphys +add@\get_nfsphys@\add_nfsphys +update@\get_nfsphys@\update_nfsphys +delete@\get_nfsphys@\get_filesys_by_nfsphys +@\delete_nfsphys + +@end(Format) +@Hinge() +@Center{ @b[User Menu] } + +@begin(Verbatim) + + 1. (login) Show user information by login name. + 2. (name) Show user information by name. + 3. (class) Show names of users in a given class. + 4. (modify) Change all user fields. + 5. (adduser) Add a new user to the database. + 6. (register) Register a user. + 7. (delete) Delete user. + 8. (udelete) Delete user by uid. + 9. (pobox) Post Office Box Menu. +10. (quota) Quota Menu. +11. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +login@\get_user_by_login +name@\get_user_by_name +class@\get_user_by_class +modify@\get_user_by_login@\update_user +adduser@\add_user +register@\get_user_by_name@\register_user +@\Kerberos server is queried also. +delete@\delete_user@\get_filesys_by_label +@\delete_filesys@\get_members_of_list +@\delete_list@\count_members_of_list +@\get_lists_of_member@\delete_member_from_list +@\get_list_info@\get_ace_use +udelete@\get_user_by_uid@\(plus all of the above). + +@end(Format) +@Hinge() +@Section[Second Tier Menus] + +@Center{ @b[Cluster Data Menu] } + +@begin(Verbatim) + + 1. (show) Show Data on a given Cluster. + 2. (add) Add Data to a given Cluster. + 3. (delete) Remove Data to a given Cluster. + 4. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +show@\get_cluster_data +add@\add_cluster_data +delete@\get_cluster_data@\delete_cluster_data + +@end(Format) +@Hinge() +@Center{ @b[List Information Menu] } + +@begin(Verbatim) + + 1. (member) Show all lists to which a given member belongs. + 2. (admin) Show all items which a given member can administer. + 3. (groups) Show all lists which are groups. + 4. (public) Show all public mailing lists. + 5. (maillists) Show all mailing lists. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +member@\get_lists_of_member +admin@\get_ace_use +groups@\qualified_get_lists +public@\qualified_get_lists +maillists@\qualified_get_lists + +@end(Format) +@Hinge() +@Center{ @b[Mappings Menu] } + +@begin(Verbatim) + + 1. (map) Show Machine to cluster mapping. + 2. (addcluster) Add machines to a clusters. + 3. (remcluster) Remove machines from clusters. + 4. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +map@\get_machine_to_cluster_map +addcluster@\get_machine@\get_cluster +@\add_machine_to_cluster +remcluster@\get_machine_to_cluster_map +@\delete_machine_from_cluster + +@end(Format) +@Hinge() +@Center{ @b[Membership Menu] } + +@begin(Verbatim) + + 1. (add) Add a member to this list. + 2. (remove) Remove a member from this list. + 3. (all) Show the members of this list. + 4. (user) Show the members of type USER. + 5. (list) Show the members of type LIST. + 6. (string) Show the members of type STRING. + 7. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +add@\add_member_to_list +remove@\delete_member_from_list +all@\get_members_of_list +user@\get_members_of_list +list@\get_members_of_list +string@\get_members_of_list + +@end(Format) +@Hinge() +@Center{ @b[Post Office Box Menu] } + +@begin(Verbatim) + + 1. (show) Show a user's post office box. + 2. (set) Set (Add or Change) a user's post office box. + 3. (remove) Remove a user's post office box. + 4. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +show@\get_pobox +set@\get_pobox@\get_server_locations +@\set_pobox_pop@\set_pobox +remove@\delete_pobox + +@end(Format) +@Hinge() +@Center{ @b[Quota Menu] } + +@begin(Verbatim) + + 1. (shdef) Show default user quota (in KB). + 2. (chdef) Change default user quota. + 3. (shquota) Show a user's disk quota on a filesystem. + 4. (addquota) Add a new disk quota for user on a filesystem. + 5. (chquota) Change a user's disk quota on a filesystem. + 6. (rmquota) Remove a user's disk quota on a filesystem. + 7. (verbose) Toggle Verbosity of Delete. + r. (return) Return to previous menu. + t. (toggle) Toggle logging on and off. + q. (quit) Quit. + +@end(Verbatim) + +@begin(Format) +@tabset(20,40, 60) +shdef@\get_value +chdef@\update_value@\get_value +shquota@\get_nfs_quota +addquota@\add_nfs_quota +chquota@\get_nfs_quota@\update_nfs_quota +rmquota@\get_nfs_quota@\delete_nfs_quota +@end(Format) +@end(Group) + +@Appendix(Menu Tree Diagram) + +@Label(tree) diff --git a/clients/mrtest/scripts/dcm.sc b/clients/mrtest/scripts/dcm.sc new file mode 100644 index 00000000..08a68775 --- /dev/null +++ b/clients/mrtest/scripts/dcm.sc @@ -0,0 +1,140 @@ +% DCM Stuff +qy dshi test kiwi.mit.edu +qy dsin test + +qy _help gsin +qy gsin * +qy gsin nfs +qy gsin no-such-service + +qy _help qgsv +qy qgsv true true true +qy qgsv false false false +qy qgsv dontcare dontcare dontcare +qy qgsv dontcare dontcare bad-type +qy qgsv dontcare bad-type dontcare +qy qgsv bad-type dontcare dontcare + +qy _help asin +qy asin test 1 target script unique 1 user mar +qy asin test 1 target script unique 1 user mar +qy gsin test +qy asin testing 1 target script bad-type 1 user mar +qy asin testing 1 target script unique 1 bad-acl mar +qy asin testing 1 target script unique 1 user bad-user + +qy _help usin +qy usin test 2 trgt scrpt replicated 0 list dbadmin +qy gsin test +qy usin test 60 trgt scrpt replicated 0 list dbadmin +qy gsin test* +qy usin test 60 t s bad-type 1 list dbadmin +qy usin test 60 t s unique 1 bad-acl dbadmin +qy usin test 60 t s unique 1 list bad-list + +qy _help rsve +qy rsve * +qy ssif test now 0 1 msg +qy gsin test +qy rsve test +qy gsin test +qy rsve test +qy rsve no-such-service + +qy _help ssif +qy ssif test now 1 1 msg +qy ssif test now 1 1 msg +qy ssif test now 0 0 "" +qy ssif test bad-date 0 0 foo +qy ssif no-such-service now 1 1 msg +qy ssif * now 1 1 msg + +qy _help dsin +qy dsin nfs +qy dsin * +qy dsin test +qy dsin no-such-service +qy asin test 1 target script unique 1 user mar + +qy _help gshi +qy gshi * * +qy gshi nfs * +qy gshi * kiwi.mit.edu +qy gshi nfs kiwi.mit.edu +qy gshi nfs e40-po.mit.edu +qy gshi pop kiwi.mit.edu +qy gshi no-service * +qy gshi * no-host + +qy _help qgsh +qy qgsh * dontcare dontcare dontcare dontcare dontcare +qy qgsh test dontcare dontcare dontcare dontcare dontcare +qy qgsh nfs true true true true true +qy qgsh hesiod false false false false false +qy qgsh no-service dontcare dontcare dontcare dontcare dontcare +qy qgsh * dontcare dontcare dontcare dontcare bad-bool +qy qgsh * dontcare dontcare dontcare bad-bool dontcare +qy qgsh * dontcare dontcare bad-bool dontcare dontcare +qy qgsh * dontcare bad-bool dontcare dontcare dontcare +qy qgsh * bad-bool dontcare dontcare dontcare dontcare + +qy _help ashi +qy ashi test kiwi.mit.edu 1 1 2 list +qy gshi test kiwi.mit.edu +qy ashi test kiwi.mit.edu 1 1 2 list +qy ashi no-service kiwi.mit.edu 1 1 2 list +qy ashi test no-such-host 1 1 2 list +qy ashi * kiwi.mit.edu 1 1 2 list +qy ashi test * 1 2 3 foo + +qy _help ushi +qy ushi test kiwi.mit.edu 0 42 56 "" +qy gshi test kiwi.mit.edu +qy ushi no-service kiwi.mit.edu 0 1 2 3 +qy uwhi test no-such-host 0 1 2 3 + +qy _help rshe +qy sshi test kiwi.mit.edu 0 0 0 1 msg now now +qy gshi test kiwi.mit.edu +qy rshe test kiwi.mit.edu +qy gshi test kiwi.mit.edu +qy rshe test kiwi.mit.edu +qy rshe no-service kiwi.mit.edu +qy rshe test no-such-host +qy rshe test * +qy rshe * kiwi.mit.edu + +qy _help ssho +qy sshi test kiwi.mit.edu 0 0 0 0 "" now now +qy gshi test kiwi.mit.edu +qy ssho test kiwi.mit.edu +qy gshi test kiwi.mit.edu +qy ssho test kiwi.mit.edu +qy ssho no-service kiwi.mit.edu +qy ssho test no-such-host +qy ssho test * +qy ssho * kiwi.mit.edu + +qy _help sshi +qy gshi test kiwi.mit.edu +qy sshi test kiwi.mit.edu 0 1 1 42 msg now now +qy gshi test kiwi.mit.edu +qy sshi no-service kiwi.mit.edu 0 1 1 42 msg now now +qy sshi test no-such-host 0 1 1 42 msg now now +qy sshi test kiwi.mit.edu 0 1 1 42 msg bad-date now +qy sshi test kiwi.mit.edu 0 1 1 42 msg now bad-date + +qy _help dshi +qy dsin test +qy dshi test kiwi.mit.edu +qy dshi no-service kiwi.mit.edu +qy dshi test no-such-host +qy dshi test * +qy dshi * kiwi.mit.edu +qy dsin test + +qy _help gslo +qy gslo * +qy gslo nfs +qy gslo no-such-service + diff --git a/clients/mrtest/scripts/doit.sc b/clients/mrtest/scripts/doit.sc new file mode 100644 index 00000000..051af83e --- /dev/null +++ b/clients/mrtest/scripts/doit.sc @@ -0,0 +1,4 @@ +c +a +script queries.sc +quit diff --git a/clients/mrtest/scripts/filesys.sc b/clients/mrtest/scripts/filesys.sc new file mode 100644 index 00000000..bb3087e9 --- /dev/null +++ b/clients/mrtest/scripts/filesys.sc @@ -0,0 +1,138 @@ +% Filesystems +qy dfil test +qy dfil testing + +qy _help gfsl +%qy gfsl * +qy gfsl mar +qy gfsl no-such-fs + +qy _help gfsm +%qy gfsm * +qy gfsm toto.mit.edu +qy gfsm no-such-mach + +qy _help gfsn +%qy gfsn * * +qy gfsn kiwi.mit.edu * +qy gfsn * /site +qy gfsn kiwi.mit.edu /site +qy gfsn no-such-mach /site +qy gfsn kiwi.mit.edu no-such-dir + +qy _help gfsg +%qy gfsg * +qy gfsg mar +qy gfsg no-such-list + +qy _help afil +qy afil test rvd kiwi.mit.edu pack mount r comments mar mar 0 other +qy afil test rvd kiwi.mit.edu pack mount r comments mar mar 0 other +qy afil tset rvd no-such-mach pack mount r comments mar mar 0 other +qy afil tset rvd kiwi.mit.edu pack mount h comments mar mar 0 other +qy afil tset rvd kiwi.mit.edu pack mount r comments no-user mar 0 other +qy afil tset rvd kiwi.mit.edu pack mount r comments mar no-list 0 other +qy afil tset rvd kiwi.mit.edu pack mount r comments mar mar 0 no-locker +qy afil testing nfs kiwi.mit.edu /site/test mount w none mar mar 1 homedir +qy afil testing nfs kiwi.mit.edu /site/test mount w none mar mar 1 homedir +qy afil tset nfs no-such-mach /site/test mount w none mar mar 1 homedir +qy afil tset nfs kiwi.mit.edu /bin/test mount w none mar mar 1 homedir +qy afil tset nfs kiwi.mit.edu /site/test mount h none mar mar 1 homedir +qy afil tset bad-type kiwi.mit.edu /site/test mount h none mar mar 1 other +qy afil tsetse afs \[NONE\] /afs/athena.mit.edu/astaff/project/longname /mit/longname r "" mar mar 0 other + +qy _help ufil +qy ufil test tested rvd kiwi.mit.edu pack mount r comments mar mar 0 other +qy gfsl test* +qy ufil tested testing rvd kiwi.mit.edu pack mount r comments mar mar 0 other +qy ufil tested tested rvd kiwi.mit.edu pack mount r comments mar mar 0 other +qy ufil tested tested badtype kiwi.mit.edu pack mount r comments mar mar 0 other +qy ufil tested tested rvd no-such-mach pack mount r comments mar mar 0 other +qy ufil tested tested rvd kiwi.mit.edu pack mount h comments mar mar 0 other +qy ufil tested tested rvd kiwi.mit.edu pack mount r comments no-user mar 0 other +qy ufil tested tested rvd kiwi.mit.edu pack mount r comments mar no-list 0 other +qy ufil tested tested rvd kiwi.mit.edu pack mount r comments mar mar 0 bad-type +qy ufil testing testing nfs kiwi.mit.edu /site/test /mit/test r "" mar mar 1 project + +qy _help dfil +qy dfil * +qy dfil no-such-fs +qy dfil tested +qy dfil tsetse + +qy _help ganf +qy ganf + +qy _help gnfp +%qy gnfp * * +qy gnfp kiwi.mit.edu * +qy gnfp * /site +qy gnfp kiwi.mit.edu /site +qy gnfp no-such-mach /site +qy gnfp kiwi.mit.edu /bin + +qy _help anfp +qy anfp kiwi.mit.edu /u1 /dev/ra1c 0 0 1000 +qy anfp kiwi.mit.edu /u1 /dev/ra1c 0 0 1000 +qy anfp no-such-mach /u1 /dev/ra1c 0 0 1000 +qy anfp kiwi.mit.edu /u1 /dev/ra1c bad 0 1000 + +qy _help unfp +qy unfp kiwi.mit.edu /u1 /dev/ra1c 1 100 2000 +qy gnfp kiwi.mit.edu /u1 + +qy _help ajnf +qy ajnf kiwi.mit.edu /u1 -666 +qy gnfp kiwi.mit.edu /u1 +qy ajnf no-such-mach /u1 0 +qy ajnf kiwi.mit.edu /bin 100 +qy ajnf e40-po.mit.edu /site 50 +qy ajnf * * 1 +qy ajnf kiwi.mit.edu * 2 +qy ajnf * /site 3 + +qy _help dnfp +qy dnfp kiwi.mit.edu /u1 +qy dnfp * /site +qy dnfp kiwi.mit.edu * +qy dnfp kiwi.mit.edu /site +qy dnfp no-such-mach /site + +qy _help gnfq +%qy gnfq * * +qy gnfq * mar +qy gnfq test * +qy gnfq mar mar +qy gnfq no-such-fs mar + +qy _help gnqp +qy gnqp kiwi.mit.edu /site +qy gnqp * /site +qy gnqp kiwi.mit.edu * +qy gnqp no-such-mach /site + +qy _help anfq +qy gnfp kiwi.mit.edu /site +qy anfq testing mar 500 +gy gnfp kiwi.mit.edu /site +qy anfq testing mar 500 +qy anfq no-such-fs mar 500 +qy anfq testing no-such-user 500 +qy anfq testing mar no-number +qy anfq * mar 500 +qy gnfq * mar + +qy _help unfq +qy unfq testing mar 400 +qy gnfp kiwi.mit.edu /site +qy unfq no-such-fs mar 45400 +qy unfq poto mar 500 +qy unfq poto no-such-user 5 + +qy _help dnfq +qy dnfq testing mar +qy gnfq testing mar +qy dnfq poto qjb +qy dnfq no-such-fs mar +qy dnfq testing no-such-user +qy dnfq testing poto diff --git a/clients/mrtest/scripts/list.sc b/clients/mrtest/scripts/list.sc new file mode 100644 index 00000000..a9e47477 --- /dev/null +++ b/clients/mrtest/scripts/list.sc @@ -0,0 +1,103 @@ +% lists +qy dlis testlist +qy dlis testl +qy dlis testlst + +qy _help glin +% qy glin * +qy glin mar +qy glin no-such-list + +qy _help exln +% qy exln * +qy exln mar +qy exln no-such-list +qy exln m*r + +qy _help alis +qy alis testlist 1 0 0 0 0 "create unique GID" user mar desc +qy glin testlist +qy alis testlist 1 0 0 0 0 "create unique GID" user mar desc +qy alis testl 1 1 1 1 1 1234 list testl desc +qy glin testl +qy alis tst 0 0 0 0 0 0 bad-type mar desc +qy alis tst 0 0 0 0 0 0 user no-such-user desc +qy alis tst 0 0 0 0 0 0 list no-such-list desc + +qy _help ulis +qy ulis testlist testlist 1 0 0 1 0 "create unique GID" user mar description +qy glin testlist +qy ulis testlist testlst 1 0 0 1 1 "create unique GID" user mar description +qy glin testl* +qy ulis no-such-list testlst 1 0 0 1 1 "create unique GID" user mar desc +qy ulis testlst dbadmin 1 0 0 1 1 "create unique GID" user mar description +qy ulis testlst tst 1 0 0 1 1 "create unique GID" bad-type mar description + +qy _help dlis +qy dlis testlst +qy dlis testlst +qy dlis dbadmin +qy dlis * + +qy _help amtl +qy amtl testl user mar +qy amtl testl list testl +qy amtl testl string "a random string (with * stars)" +qy amtl testl user mar +qy amtl testl user default +qy gmol testl +qy amtl no-such-list user mar +qy amtl testl user no-such-user +qy amtl testl list no-such-list + +qy _help dmfl +qy dmfl testl user default +qy dmfl testl user default +qy dmfl testl user no-such-user +qy dmfl no-such-list user mar +qy dmfl testl list no-such-list +qy dmfl testl string foobar +qy gmol + +qy _help gaus +qy gaus user mar +qy gaus ruser gamit +qy gaus user no-such-user +qy gaus list testl +qy gaus list no-such-list +qy gaus rlist test +qy gaus no-such-type mar + +qy _help qgli +qy qgli false false false false false +qy qgli true true true true true +% qy qgli dontcare dontcare dontcare dontcare dontcare +qy qgli true dontcare dontcare true false +qy qgli dontcare dontcare dontcare dontcare no-such-bool +qy qgli dontcare dontcare dontcare no-such-bool dontcare +qy qgli dontcare dontcare no-such-bool dontcare dontcare +qy qgli dontcare no-such-bool dontcare dontcare dontcare +qy qgli no-such-bool dontcare dontcare dontcare dontcare + +qy _help gmol +qy gmol testl +qy gmol no-such-list +qy gmol * + +qy _help glom +qy glom user mar +qy glom ruser mar +qy glom list test +qy glom rlist test +qy glom user no-such-user +qy glom list no-such-list +qy glom string "a random string (with * stars)" +qy glom bad-type foo +qy glom user * + +qy _help cmol +qy cmol test +qy cmol testl +qy cmol no-such-list +qy cmol default +qy cmol * diff --git a/clients/mrtest/scripts/mach.sc b/clients/mrtest/scripts/mach.sc new file mode 100644 index 00000000..ad7eaa4c --- /dev/null +++ b/clients/mrtest/scripts/mach.sc @@ -0,0 +1,115 @@ +% Machines + +qy dmac test.mit.edu +qy dmac testing.mit.edu + +query _help gmac +%qy gmac * +qy gmac no-such-host +qy gmac toto.mit.edu +qy gmac TOTO.MIT.EDU + +query _help amac +qy amac test.mit.edu vax +qy amac test.mit.edu vax +qy amac testing.mit.edu no-type +qy gmac test* + +query _help umac +qy umac test.mit.edu test.mit.edu rt +qy gmac test.mit.edu +qy umac test.mit.edu test.mit.edu no-type +qy umac test.mit.edu testing.mit.edu rt +qy umac testing.mit.edu toto.mit.edu rt +qy umac no-such-host newhost vax +qy gmac test* + +query _help dmac +qy dmac testing.mit.edu +qy gmac testing.mit.edu +qy dmac toto.mit.edu +qy dmac no-such-host + + +% clusters + +qy dclu testclu +qy dclu testing + +query _help gclu +%qy gclu * +qy gclu no-such-clu +qy gclu bldge40-vs + +query _help aclu +qy aclu testclu desc loc +qy aclu testclu desc loc +qy gclu testclu + +query _help uclu +qy uclu testclu testclu newdesc newloc +qy gclu testclu +qy uclu testclu testing desc loc +qy uclu testing bldge40-vs desc loc +qy gclu test* + +query _help dclu +qy dclu testing +qy dclu testing +qy dclu bldge40-vs + + +% Mappings + +qy aclu testclu desc loc +qy amac test.mit.edu vax + +qy _help gmcm +%qy gmcm * * +qy gmcm toto.mit.edu * +qy gmcm * bldge40-vs +qy gmcm no-such-host no-such-clu +qy gmcm toto.mit.edu bldge40-rt + +qy _help amtc +qy amtc test.mit.edu testclu +qy amtc test.mit.edu testclu +qy amtc test.mit.edu no-such-clu +qy amtc no-such-host testclu +qy gmcm test* test* +qy amtc test.mit.edu bldge40-vs +qy amtc toto.mit.edu testclu +qy gmcm test* * +qy gmcm * test* + +qy _help dmfc +qy dmfc * * +qy dmfc test.mit.edu * +qy dmfc * testclu +qy dmfc test.mit.edu bldge40-rt +qy dmfc test.mit.edu testclu + +% Cluster data + +qy _help gcld +%qy gcld * * +qy gcld testclu * +qy gcld no-such-clu * +qy gclu bldge40-vs * + +qy _help acld +qy acld testclu LPR data +qy acld testclu LPR data1 +qy acld testclu LPR data +qy acld testclu no-label data +qy acld no-such-clu LPR data + +qy _help dcld +qy dcld * lpr data +qy dcld testclu * data +qy dcld testclu lpr * +qy dcld testclu LPR data +qy dcld testclu LPR data +qy dcld no-such-clu FOO data +qy dcld testclu no-label data + diff --git a/clients/mrtest/scripts/misc.sc b/clients/mrtest/scripts/misc.sc new file mode 100644 index 00000000..98059e20 --- /dev/null +++ b/clients/mrtest/scripts/misc.sc @@ -0,0 +1,106 @@ +% Miscellaneous stuff + +qy _help gsha +#qy gsha * +qy gsha toto.mit.edu +qy gsha no-such-mach + +qy _help asha +qy asha e40-po.mit.edu list dbadmin +qy asha e40-po.mit.edu list dbadmin +qy asha kiwi.mit.edu user mar +qy asha soup.mit.edu none none +qy asha * list dbadmin +qy asha soup.mit.edu bad-type foo + +qy _help usha +qy usha e40-po.mit.edu user qjb +qy gsha e40-po.mit.edu +qy usha e40-po.mit.edu bad-type foo + +qy _help dsha +qy dsha e40-po.mit.edu +qy dsha * +qy dsha no-such-mach + +qy _help gpcp +#qy gpcp * +qy gpcp nil +qy gpcp no-such-printer + +qy _help apcp +qy apcp test test:rm=foo.mit.edu:rp=test: +qy apcp test test:rm=foo.mit.edu:rp=test: +qy apcp nil duplicate +qy apcp testing "this one has spaces * and stars" +qy gpcp test* + +qy _help dpcp +qy dpcp testing +qy gpcp test +qy dpcp * +qy dpcp no-such-printer + +qy _help gpdm +qy gpdm * +qy gpdm dexter +qy gpdm no-such-printer + +qy _help apdm +qy apdm test 123 PARIS.MIT.EDU +qy gpdm test +qy apdm test 456 MINOS.MIT.EDU +qy apdm testing 123 no-machine + +qy _help dpdm +qy dpdm test +qy gpdm test +qy dpdm no-such-printer + +qy _help gali +#qy gali * * * +qy gali * TYPEDATA * +qy gali filesys TYPE * +qy gali filesys TYPE NFS +qy gali foo * * + +qy _help aali +qy aali foo TYPE baz +qy aali alias TYPE foo +qy aali foo TYPE baz +qy aali foo TYPE baz +qy aali foo TYPE bar +qy gali foo TYPE * + +qy _help dali +qy dali foo TYPE * +qy dali foo TYPE baz +qy dali foo TYPE bar +qy dali alias TYPE foo +qy dali foo foo foo + +qy _help gval +qy gval * +qy gval users_id +qy gval no-such-value + +qy _help aval +qy aval testval 5 +qy aval users_id 3 +qy aval * 1 +qy aval newval asdf +qy gval testval + +qy _help uval +qy uval testval 7 +qy uval * 8 +qy uval no-such-val 9 +qy gval testval + +qy _help dval +qy dval testval +qy dval * +qy dval no-such-val + +qy _help gats +qy gats diff --git a/clients/mrtest/scripts/queries.sc b/clients/mrtest/scripts/queries.sc new file mode 100644 index 00000000..ae1d377f --- /dev/null +++ b/clients/mrtest/scripts/queries.sc @@ -0,0 +1,16 @@ +% tests all queries + +query _list_queries +query _list_users +query _help get_user_by_name +query none + +script users.sc +script mach.sc +script list.sc +script dcm.sc +script filesys.sc +script zephyr.sc +script misc.sc + +% Done! diff --git a/clients/mrtest/scripts/users.sc b/clients/mrtest/scripts/users.sc new file mode 100644 index 00000000..c44090e3 --- /dev/null +++ b/clients/mrtest/scripts/users.sc @@ -0,0 +1,142 @@ +% test user queries + +qy _help galo +%qy galo +qy _help gaal +%qy gaal + +qy _help gubl +%qy gubl * +qy gubl root +qy gubl no-one +qy gubl mar + +qy _help gubu +qy gubu 17822 +qy gubu 0 +qy gubu 32777 + +qy _help gubn +%qy gubn * * +qy gubn Jesus * +qy gubn * Rosenstein +qy gubn Mark Rosenstein +qy gubn No One + +qy _help gubc +qy gubc guest +qy gubc none +%qy gubc * + +qy _help gubm +%qy gubm * +qy gubm mitid +qy gubm qwerty + +qy _help ausr +qy dusr testing +qy dusr tested +qy ausr testing 4321 /bin/csh Last First M 0 mitid staff +qy ausr testing 1234 /bin/csh Last First M 0 mitid staff +qy ausr tested 1234 /bin/csh Last First M 0 mitid notone +qy ausr tested 1234 /bin/csh Last First M 0 mitid staff +qy ausr "create unique login ID" "create unique UID" /bin/sh TestL TestF TestM 0 mitid staff +qy gubn TestF TestL + +qy _help rusr +qy rusr 1234 root 1 +qy rusr 1234 tested 1 +qy gubu 1234 + +qy _help uusr +qy uusr tested tested 4321 /bin/csh Last First MI 0 MITID guest +qy gubl tested +qy uusr tested root 4321 /bin/csh Last First MI 0 MITID guest +qy uusr tested testnew 4321 /bin/csh Last First MI 0 MITID guest +qy gubl tested +qy gubl testnew +qy uusr testnew tested 1234 /bin/csh Last First MI 0 MITID guest +qy gubl tested + +qy _help uush +qy gubl tested +qy uush tested /bin/tcsh +qy gubl tested + +qy _help uust +qy uust tested 1 +qy gubl tested + +qy _help dusr +qy dusr * +qy dusr testing +qy dusr mar +qy dusr no-one + +qy _help dubu +qy dubu 1234 +qy dubu 32777 + +qy _help gkum +qy gkum * * +qy gkum no-one * +qy gkum * no-kerberos +qy gkum mar * +qy gkum * mar@ATHENA.MIT.EDU + +qy _help akum +qy akum testuser testuser@ATHENA.MIT.EDU +qy akum testuser testuser.root@ATHENA.MIT.EDU +qy akum root testuser@ATHENA.MIT.EDU +qy akum no-one foo.bar@ATHENA.MIT.EDU +qy akum * * + +qy _help dkum +qy dkum testuser testuser@ATHENA.MIT.EDU +qy dkum mar foo.bar@ATHENA.MIT.EDU +qy dkum no-one foo.bar@ATHENA.MIT.EDU + +% finger +qy ausr testing 4321 /bin/csh Last First M 0 mitid staff +qy _help gfbl +qy gfbl testing +%qy gfbl * +qy gfbl no-one + +qy _help ufbl +qy ufbl testing "Mr. Testing" nn ha hp oa op d STAFF +qy gfbl testing + +% PoBoxes +qy _help gpob +qy gpob mar +qy gpob testing +%qy gpob * +qy gpob no-one + +qy _help gapo +%qy gapo +qy _help gpop +%qy gpop +qy _help gpos +%qy gpos + +qy _help spob +qy spob testing no-type box +qy spob testing pop no-mach +qy spob testing pop e40-po.mit.edu +qy gpob testing +qy spob testing smtp "a random string (with * wildcards)" +qy gpob testing +qy spob testing none foo +qy gpob testing + +qy _help spop +qy spop testing +qy gpob testing + +qy _help dpob +qy dpob testing +qy gpob testing +qy dpob testing + diff --git a/clients/mrtest/scripts/zephyr.sc b/clients/mrtest/scripts/zephyr.sc new file mode 100644 index 00000000..ca989bd1 --- /dev/null +++ b/clients/mrtest/scripts/zephyr.sc @@ -0,0 +1,33 @@ +% Zephyr queries +qy dzcl test + +qy _help gzcl +#qy gzcl * +qy gzcl login +qy gzcl no-such-class + +qy _help azcl +qy azcl test user mar list mar none none list test +qy azcl test user mar list mar none none list test +qy azcl testing user bad-user list mar none none list test +qy azcl testing user mar list bad-list none none list test +qy azcl testing user mar list mar none random-none list test +qy azcl testing user mar list mar none none bad-type test +qy azcl name*star user mar list mar none none list test + +qy _help uzcl +qy gzcl test* +qy uzcl test test list test list dbadmin list poto list kit +qy gzcl test* +qy uzcl test testing user mar user qjb user kit user poto +qy gzcl test* +qy uzcl testing login user mar user qjb user kit none poto +qy uzcl testing tested user no-such-user user qjb user kit user poto +qy uzcl testing tested user mar list no-such-list user kit user poto +qy uzcl testing tested user mar user qjb none none bad-type poto + +qy _help dzcl +qy dzcl testing +qy dzcl test +qy dzcl * + diff --git a/clients/userreg/login.info b/clients/userreg/login.info new file mode 100644 index 00000000..f9be0ea7 --- /dev/null +++ b/clients/userreg/login.info @@ -0,0 +1,2 @@ +register +athena diff --git a/clients/xregister/Makefile b/clients/xregister/Makefile new file mode 100644 index 00000000..6b71c81c --- /dev/null +++ b/clients/xregister/Makefile @@ -0,0 +1,13 @@ +# $Header$ + +CFLAGS = -I/mit/x11 -I/mit/motif/include +XLIBS = -L/mit/x11/$${HOSTTYPE}lib /mit/motif/`machtype`lib/libWc.a -lXaw -lXmu -lXt -lX11 \ + -L/usr/athena/lib -lkrb -ldes -lhesiod -lm + +OBJS = register.o AriRegAll.o + +all: register + +register: $(OBJS) + cc -o register $(OBJS) $(XLIBS) + diff --git a/clients/xregister/help b/clients/xregister/help new file mode 100644 index 00000000..12420224 --- /dev/null +++ b/clients/xregister/help @@ -0,0 +1 @@ +This is some context-sensitive help text. diff --git a/clients/xregister/welcome b/clients/xregister/welcome new file mode 100644 index 00000000..32d7a4d7 --- /dev/null +++ b/clients/xregister/welcome @@ -0,0 +1,10 @@ +Welcome to Project Athena user registration. To begin registering for +your account, please type your first name as it appears on your MIT ID +card, then press the key marked ``Return''. If you make a mistake while +typing, use the key above the Return key to erase what you just typed. + +** NOTE: You must respond to each question within 90 seconds, or you + will have to start over. (This is to prevent accident + and/or vandalism.) + +** If you have trouble, please call the account administrator at x3-1325. diff --git a/gen/report.dc b/gen/report.dc new file mode 100644 index 00000000..d9cded24 --- /dev/null +++ b/gen/report.dc @@ -0,0 +1,286 @@ +/* $Header$ + * + * This generates some useful reports. + * + * (c) Copyright 1993 by the Massachusetts Institute of Technology. + * For copying and distribution information, please see the file + * . + */ + +#include +#include +#include +#include +#include +#include +EXEC SQL INCLUDE sqlca; + +extern int errno; +char *whoami = "report.gen"; +FILE *out = stdout; + +struct user { + char name[9]; + int uid; + int status; +}; +struct hash *users = NULL; +struct hash *kmaps = NULL; + +main(argc, argv) +int argc; +char **argv; +{ + char *outf = NULL, outft[64], *p, buf[256]; + struct stat sb; + struct timeval now; + int flag1, flag2, i; + struct hash *aliases = NULL; + struct hash *nets = NULL; + struct user *u; + + EXEC SQL BEGIN DECLARE SECTION; + int id, sid, status, uid, ustatus, owner, creator, modby; + char login[9]; + char name[65], vendor[33], model[33], os[33], addr[17]; + char location[17], owner_type[16]; + char schange[25], modtime[25], modwith[33], created[25]; + EXEC SQL END DECLARE SECTION; + +#ifsql INGRES + EXEC SQL CONNECT moira; + EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED; +#endsql +#ifsql INFORMIX + EXEC SQL DATABASE moira; +#endsql + + if (argc == 2) + { + if (stat(argv[1], &sb) == 0) + { + if (ModDiff(&flag1, "machine", sb.st_mtime) || + ModDiff(&flag2, "subnet", sb.st_mtime)) + exit(MR_DATE); + if (flag1 < 0 && flag2 < 0) + { + fprintf(stderr, "File %s does not need to be rebuilt.\n", + argv[1]); + exit(MR_NO_CHANGE); + } + } + outf = argv[1]; + sprintf(outft, "%s~", outf); + if ((out = fopen(outft, "w")) == NULL) + { + fprintf(stderr, "unable to open %s for output\n", outf); + exit(MR_OCONFIG); + } + } else if (argc != 1) + { + fprintf(stderr, "usage: %s [outfile]\n", argv[0]); + exit(MR_ARGS); + } else + { + outf = NULL; + } + + EXEC SQL WHENEVER SQLERROR GOTO sqlerr; + + users = create_hash(12001); + + /* + * suck in user table + */ + + EXEC SQL SELECT modtime INTO :name FROM users WHERE users_id = 0; + + EXEC SQL DECLARE u_cursor CURSOR FOR + SELECT login, uid, users_id, status + FROM users; + EXEC SQL OPEN u_cursor; + + while (1) + { + EXEC SQL FETCH u_cursor INTO :login, :uid, :id, :ustatus; + if (sqlca.sqlcode != 0) break; + strtrim(login); + u = (struct user *) malloc(sizeof(struct user)); + strcpy(u->name, login); + u->uid = uid; + u->status = ustatus; + hash_store(users, id, u); + } + + EXEC SQL CLOSE u_cursor; + + /* + * suck in host alias table + */ + + EXEC SQL SELECT modtime INTO :name FROM machine WHERE mach_id = 0; + + gettimeofday(&now, NULL); + + fprintf(out, "# Moira host table dump generated at %s\n", + ctime(&now.tv_sec)); + + EXEC SQL DECLARE y CURSOR FOR SELECT + mach_id, name FROM hostalias; + EXEC SQL OPEN y; + + aliases = create_hash(1001); + while (1) + { + EXEC SQL FETCH y INTO :id, :name; + + if (sqlca.sqlcode != 0) break; + if (id == 0) continue; + if (p = hash_lookup(aliases, id)) + { + sprintf(buf, "%s,%s", p, name); + hash_update(aliases, id, strsave(buf)); + free(p); + } else + hash_store(aliases, id, strsave(name)); + } + + EXEC SQL CLOSE y; + + + /* + * suck in network table + */ + + EXEC SQL SELECT modtime INTO :name FROM subnet WHERE snet_id = 0; + + EXEC SQL DECLARE n_cursor CURSOR FOR SELECT + snet_id, name FROM subnet; + EXEC SQL OPEN n_cursor; + + nets = create_hash(301); + while (1) + { + EXEC SQL FETCH n_cursor INTO :id, :name; + + if (sqlca.sqlcode != 0) break; + if (id == 0) continue; + hash_store(nets, id, strsave(name)); + } + + EXEC SQL CLOSE n_cursor; + + /* + * dump machine table + */ + + + EXEC SQL DECLARE x CURSOR FOR SELECT + name, mach_id, status, statuschange, vendor, model, os, address, location, snet_id, owner_type, owner_id, modby, modtime, modwith, created, creator + FROM machine; + EXEC SQL OPEN x; + + while (1) + { + EXEC SQL FETCH x INTO :name, :id, :status, :schange, :vendor, :model, :os, :addr, :location, :sid, :owner_type, :owner, :modby, :modtime, :modwith, :created, :creator; + + if (sqlca.sqlcode != 0) break; + if (id == 0) continue; + + if (p = hash_lookup(aliases, id)) + sprintf(buf, "%s,%s", name, p); + else + strcpy(buf, name); + + fprintf(out, "HOST|%s|", buf); + if(p = hash_lookup(nets, sid)) + fprintf(out, "%s|", strtrim(p)); + else + if(sid == 0) + fprintf(out, "NONE|"); + else + fprintf(out, "%d|", sid); + + fprintf(out, "%s|%s|", strtrim(addr), + status == 3 ? "deleted" : + status == 2 ? "none" : status == 1 ? "active" : status == 0 ? + "reserved" : "unknown"); + + fprintf(out, "%s|", strtrim(schange)); + fprintf(out, "%s|", strtrim(location)); + fprintf(out, "%s|", strtrim(vendor)); + fprintf(out, "%s|", strtrim(model)); + fprintf(out, "%s|", strtrim(os)); + + print_user(strtrim(owner_type), owner); + print_user("STRING", creator); + fprintf(out, "%s|", strtrim(created)); + print_user("STRING", modby < 0 ? -modby : modby); + + fprintf(out, "%s|", strtrim(modtime)); + fprintf(out, "%s|", strtrim(modwith)); + fprintf(out, "\n"); + } + + EXEC SQL CLOSE x; +#ifsql INGRES + EXEC SQL DISCONNECT; +#endsql +#ifsql INFORMIX + EXEC SQL CLOSE DATABASE; +#endsql + + fprintf(out, "# End of Report\n"); + if (fclose(out)) { + perror("close failed"); + exit(MR_CCONFIG); + } + if (outf) + fix_file(outf); + exit(MR_SUCCESS); + + sqlerr: + com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode); +#ifsql INGRES + if (sqlca.sqlcode == 17700 || sqlca.sqlcode == -37000) + exit(MR_DEADLOCK); +#endsql + critical_alert("DCM", "Report build encountered INGRES ERROR %d", + sqlca.sqlcode); + exit(MR_INGRES_ERR); +} + + +print_user(type, user) + char *type; + unsigned int user; +{ + struct user *u; + char *c; + EXEC SQL BEGIN DECLARE SECTION; + int id; + char name[128]; + EXEC SQL END DECLARE SECTION; + + if(strcmp(type, "USER") == 0) + { + if(u = (struct user *) hash_lookup(users, user)) + fprintf(out, "USER %s|", u->name); + else + fprintf(out, "USER %d|", user); + } + else + if(id == 0) + fprintf(out, "smsuser|"); + else + { + id = user; + EXEC SQL SELECT string INTO :name FROM strings WHERE string_id = :id; + if (sqlca.sqlcode == 0) + fprintf(out, "%s|", strtrim(name)); + else + fprintf(out, "UNKNOWN|"); + } + sqlerr: + return; +} diff --git a/include/afs/auth.h b/include/afs/auth.h new file mode 100644 index 00000000..6f06fbc5 --- /dev/null +++ b/include/afs/auth.h @@ -0,0 +1,57 @@ +/* + * auth.h: + * This file is automatically generated; please do not edit it. + */ +/* Including auth.p.h at beginning of auth.h file. */ + +#ifndef __AUTH_AFS_INCL_ +#define __AUTH_AFS_INCL_ 1 + + /* no ticket good for longer than 30 days */ +#define MAXKTCTICKETLIFETIME (30*24*3600) +#define MINKTCTICKETLEN 32 +#define MAXKTCTICKETLEN 344 +#define MAXKTCNAMELEN 64 /* name & inst should be 256 */ +#define MAXKTCREALMLEN 64 /* should be 256 */ +#define KTC_TIME_UNCERTAINTY (15*60) /* max skew separating machines' clocks */ + +struct ktc_encryptionKey { + char data[8]; +}; + +struct ktc_token { + long startTime; + long endTime; + struct ktc_encryptionKey sessionKey; + short kvno; + int ticketLen; + char ticket[MAXKTCTICKETLEN]; +}; + +struct ktc_principal { + char name[MAXKTCNAMELEN]; + char instance[MAXKTCNAMELEN]; + char cell[MAXKTCREALMLEN]; +}; + +#if 0 +#define KTC_ERROR 1 /* an unexpected error was encountered */ +#define KTC_TOOBIG 2 /* a buffer was too small for the response */ +#define KTC_INVAL 3 /* an invalid argument was passed in */ +#define KTC_NOENT 4 /* no such entry */ +#endif + +#endif __AUTH_AFS_INCL_ + +/* End of prolog file auth.p.h. */ + +#define KTC_ERROR (11862784L) +#define KTC_TOOBIG (11862785L) +#define KTC_INVAL (11862786L) +#define KTC_NOENT (11862787L) +extern void initialize_ktc_error_table (); +#define ERROR_TABLE_BASE_ktc (11862784L) + +/* for compatibility with older versions... */ +#define init_ktc_err_tbl initialize_ktc_error_table +#define ktc_err_base ERROR_TABLE_BASE_ktc diff --git a/include/des.h b/include/des.h new file mode 100644 index 00000000..74bf2792 --- /dev/null +++ b/include/des.h @@ -0,0 +1,48 @@ +/* + * $Source$ + * $Author$ + * $Header$ + * + * Copyright 1987, 1988 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * Include file for the Data Encryption Standard library. + */ + +/* only do the whole thing once */ +#ifndef DES_DEFS +#define DES_DEFS + +#include + +typedef unsigned char des_cblock[8]; /* crypto-block size */ +/* Key schedule */ +typedef struct des_ks_struct { des_cblock _; } des_key_schedule[16]; + +#define DES_KEY_SZ (sizeof(des_cblock)) +#define DES_ENCRYPT 1 +#define DES_DECRYPT 0 + +#ifndef NCOMPAT +#define C_Block des_cblock +#define Key_schedule des_key_schedule +#define ENCRYPT DES_ENCRYPT +#define DECRYPT DES_DECRYPT +#define KEY_SZ DES_KEY_SZ +#define string_to_key des_string_to_key +#define read_pw_string des_read_pw_string +#define random_key des_random_key +#define pcbc_encrypt des_pcbc_encrypt +#define key_sched des_key_sched +#define cbc_encrypt des_cbc_encrypt +#define cbc_cksum des_cbc_cksum +#define C_Block_print des_cblock_print +#define quad_cksum des_quad_cksum +typedef struct des_ks_struct bit_64; +#endif + +#define des_cblock_print(x) des_cblock_print_file(x, stdout) + +#endif DES_DEFS diff --git a/include/kadm.h b/include/kadm.h new file mode 100644 index 00000000..f1393402 --- /dev/null +++ b/include/kadm.h @@ -0,0 +1,141 @@ +/* + * $Source$ + * $Author$ + * $Header$ + * + * Copyright 1988 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * Definitions for Kerberos administration server & client + */ + +#ifndef KADM_DEFS +#define KADM_DEFS + +#include +/* + * kadm.h + * Header file for the fourth attempt at an admin server + * Doug Church, December 28, 1989, MIT Project Athena + */ + +/* for those broken Unixes without this defined... should be in sys/param.h */ +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif + +#include +#include +#include +#include + +/* The global structures for the client and server */ +typedef struct { + struct sockaddr_in admin_addr; + struct sockaddr_in my_addr; + int my_addr_len; + int admin_fd; /* file descriptor for link to admin server */ + char sname[ANAME_SZ]; /* the service name */ + char sinst[INST_SZ]; /* the services instance */ + char krbrlm[REALM_SZ]; +} Kadm_Client; + +typedef struct { /* status of the server, i.e the parameters */ + int inter; /* Space for command line flags */ + char *sysfile; /* filename of server */ +} admin_params; /* Well... it's the admin's parameters */ + +/* Largest password length to be supported */ +#define MAX_KPW_LEN 128 + +/* Largest packet the admin server will ever allow itself to return */ +#define KADM_RET_MAX 2048 + +/* That's right, versions are 8 byte strings */ +#define KADM_VERSTR "KADM0.0A" +#define KADM_ULOSE "KYOULOSE" /* sent back when server can't + decrypt client's msg */ +#define KADM_VERSIZE strlen(KADM_VERSTR) + +/* the lookups for the server instances */ +#define PWSERV_NAME "changepw" +#define KADM_SNAME "kerberos_master" +#define KADM_SINST "kerberos" + +/* Attributes fields constants and macros */ +#define ALLOC 2 +#define RESERVED 3 +#define DEALLOC 4 +#define DEACTIVATED 5 +#define ACTIVE 6 + +/* Kadm_vals structure for passing db fields into the server routines */ +#define FLDSZ 4 + +typedef struct { + u_char fields[FLDSZ]; /* The active fields in this struct */ + char name[ANAME_SZ]; + char instance[INST_SZ]; + unsigned long key_low; + unsigned long key_high; + unsigned long exp_date; + unsigned short attributes; + unsigned char max_life; +} Kadm_vals; /* The basic values structure in Kadm */ + +/* Kadm_vals structure for passing db fields into the server routines */ +#define FLDSZ 4 + +/* Need to define fields types here */ +#define KADM_NAME 31 +#define KADM_INST 30 +#define KADM_EXPDATE 29 +#define KADM_ATTR 28 +#define KADM_MAXLIFE 27 +#define KADM_DESKEY 26 + +/* To set a field entry f in a fields structure d */ +#define SET_FIELD(f,d) (d[3-(f/8)]|=(1<<(f%8))) + +/* To set a field entry f in a fields structure d */ +#define CLEAR_FIELD(f,d) (d[3-(f/8)]&=(~(1<<(f%8)))) + +/* Is field f in fields structure d */ +#define IS_FIELD(f,d) (d[3-(f/8)]&(1<<(f%8))) + +/* Various return codes */ +#define KADM_SUCCESS 0 + +#define WILDCARD_STR "*" + +enum acl_types { +ADDACL, +GETACL, +MODACL +}; + +/* Various opcodes for the admin server's functions */ +#define CHANGE_PW 2 +#define ADD_ENT 3 +#define MOD_ENT 4 +#define GET_ENT 5 + +extern long kdb_get_master_key(); /* XXX should be in krb_db.h */ +extern long kdb_verify_master_key(); /* XXX ditto */ + +extern long krb_mk_priv(), krb_rd_priv(); /* XXX should be in krb.h */ +extern void krb_set_tkt_string(); /* XXX ditto */ + +extern unsigned long quad_cksum(); /* XXX should be in des.h */ + +/* XXX This doesn't belong here!!! */ +char *malloc(), *realloc(); +#ifdef POSIX +typedef void sigtype; +#else +typedef int sigtype; +#endif + +#endif KADM_DEFS diff --git a/include/mit-sipb-copyright.h b/include/mit-sipb-copyright.h new file mode 100644 index 00000000..ffcfc380 --- /dev/null +++ b/include/mit-sipb-copyright.h @@ -0,0 +1,19 @@ +/* + +Copyright 1987 by the Student Information Processing Board + of the Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is +hereby granted, provided that the above copyright notice +appear in all copies and that both that copyright notice and +this permission notice appear in supporting documentation, +and that the names of M.I.T. and the M.I.T. S.I.P.B. not be +used in advertising or publicity pertaining to distribution +of the software without specific, written prior permission. +M.I.T. and the M.I.T. S.I.P.B. make no representations about +the suitability of this software for any purpose. It is +provided "as is" without express or implied warranty. + +*/ + diff --git a/include/prot.h b/include/prot.h new file mode 100644 index 00000000..5f8fc282 --- /dev/null +++ b/include/prot.h @@ -0,0 +1,87 @@ +/* + * $Source$ + * $Author$ + * $Locker$ + * + * Copyright 1985,1986 by the Massachusetts Institute of Technology + * + */ + + +#define KRB_PORT 750 /* PC's don't have /etc/services */ +#define KRB_PROT_VERSION 4 +#define MAX_PKT_LEN 1000 +#define MAX_TXT_LEN 1000 +#define TICKET_GRANTING_TICKET "krbtgt" + +/* Macro's to obtain various fields from a packet */ + +#define pkt_version(packet) (unsigned int) *(packet->dat) +#define pkt_msg_type(packet) (unsigned int) *(packet->dat+1) +#define pkt_a_name(packet) (packet->dat+2) +#define pkt_a_inst(packet) (packet->dat+3+strlen(pkt_a_name(packet))) +#define pkt_a_realm(packet) (pkt_a_inst(packet)+1+strlen(pkt_a_inst(packet))) + + +/* Macro to obtain realm from application request */ +#define apreq_realm(auth) (auth->dat + 3) + + +/* If there are long alignment problems, these */ +/* will have to be rewritten */ + +#define pkt_time_ws(packet) (unsigned long *) \ + (packet->dat+5+strlen(pkt_a_name(packet))+strlen(pkt_a_inst(packet)) \ + +strlen(pkt_a_realm(packet))) +#define pkt_no_req(packet) (unsigned short) \ + *(packet->dat+9+strlen(pkt_a_name(packet))+ \ + strlen(pkt_a_inst(packet))+strlen(pkt_a_realm(packet))) + +#define pkt_x_date(packet) (unsigned long *) \ + (packet->dat+10+strlen(pkt_a_name(packet))+strlen(pkt_a_inst(packet)) \ + +strlen(pkt_a_realm(packet))) + +#define pkt_err_code(packet) ( (unsigned long *) \ + (packet->dat+9+strlen(pkt_a_name(packet))+strlen(pkt_a_inst(packet)) \ + +strlen(pkt_a_realm(packet)))) +#define pkt_err_text(packet) \ + (packet->dat+13+strlen(pkt_a_name(packet))+ \ + strlen(pkt_a_inst(packet))+strlen(pkt_a_realm(packet))) + +/* Routines to create and read packets may be found in prot.c */ + +struct ktext *create_packet_to_kdc(); +struct ktext *create_auth_reply(); +struct ktext *create_death_packet(); +struct ktext *pkt_cipher(); + +/* Message types , always leave lsb for byte order */ + +#define AUTH_MSG_KDC_REQUEST 1<<1 +#define AUTH_MSG_KDC_REPLY 2<<1 +#define AUTH_MSG_APPL_REQUEST 3<<1 +#define AUTH_MSG_APPL_REQUEST_MUTUAL 4<<1 +#define AUTH_MSG_ERR_REPLY 5<<1 +#define AUTH_MSG_PRIVATE 6<<1 +#define AUTH_MSG_SAFE 7<<1 +#define AUTH_MSG_APPL_ERR 8<<1 +#define AUTH_MSG_DIE 63<<1 + +/* values for kerb error codes */ +#define KERB_ERR_OK 0 +#define KERB_ERR_NAME_EXP 1 +#define KERB_ERR_SERVICE_EXP 2 +#define KERB_ERR_AUTH_EXP 3 +#define KERB_ERR_PKT_VER 4 +#define KERB_ERR_NAME_MAST_KEY_VER 5 +#define KERB_ERR_SERV_MAST_KEY_VER 6 +#define KERB_ERR_BYTE_ORDER 7 +#define KERB_ERR_PRINCIPAL_UNKNOWN 8 +#define KERB_ERR_PRINCIPAL_NOT_UNIQUE 9 +#define KERB_ERR_NULL_KEY 10 + +/* Byte ordering */ +static int ONE = 1; +#define HOST_BYTE_ORDER (* (char *) &ONE) +#define MSB_FIRST 0 /* 68000 */ +#define LSB_FIRST 1 /* Vax, PC8086 */ diff --git a/man/canonicalize_hostname.3 b/man/canonicalize_hostname.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/canonicalize_hostname.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/format_filesys_type.3 b/man/format_filesys_type.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/format_filesys_type.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_auth.3 b/man/mr_auth.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_auth.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_connect.3 b/man/mr_connect.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_connect.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_disconnect.3 b/man/mr_disconnect.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_disconnect.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_do_update.3 b/man/mr_do_update.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_do_update.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_host.3 b/man/mr_host.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_host.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_motd.3 b/man/mr_motd.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_motd.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_noop.3 b/man/mr_noop.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_noop.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_query.3 b/man/mr_query.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_query.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/mr_set_alternate_input.3 b/man/mr_set_alternate_input.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/mr_set_alternate_input.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/parse_filesys_type.3 b/man/parse_filesys_type.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/parse_filesys_type.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_create.3 b/man/sq_create.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_create.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_destroy.3 b/man/sq_destroy.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_destroy.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_empty.3 b/man/sq_empty.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_empty.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_get_data.3 b/man/sq_get_data.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_get_data.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_remove_data.3 b/man/sq_remove_data.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_remove_data.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_save_args.3 b/man/sq_save_args.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_save_args.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_save_data.3 b/man/sq_save_data.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_save_data.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_save_unique_data.3 b/man/sq_save_unique_data.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_save_unique_data.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/sq_save_unique_string.3 b/man/sq_save_unique_string.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/sq_save_unique_string.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/strsave.3 b/man/strsave.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/strsave.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/man/strtrim.3 b/man/strtrim.3 new file mode 100644 index 00000000..1e8ebeca --- /dev/null +++ b/man/strtrim.3 @@ -0,0 +1 @@ +.so man3/moira.3 diff --git a/reg_svr/regtest/create b/reg_svr/regtest/create new file mode 100755 index 00000000..9939c59a --- /dev/null +++ b/reg_svr/regtest/create @@ -0,0 +1,12 @@ +awk ' \ +{ \ + if (NF == 4) \ + { \ + printf("qy ausr \"create unique login ID\" \"create unique UID\" /bin/csh %s %s \"\" 0 %s TEST\n",$1,$2,$NF); \ + } \ + else \ + { \ + printf("qy ausr \"create unique login ID\" \"create unique UID\" /bin/csh %s %s %s 0 %s TEST\n",$1,$2,$3,$NF); \ + } \ +}' names | sed 's.,..' +exit 0 diff --git a/reg_svr/regtest/message b/reg_svr/regtest/message new file mode 100644 index 00000000..91e714f7 --- /dev/null +++ b/reg_svr/regtest/message @@ -0,0 +1,50 @@ + Welcome to the Fall '89 Project Athena Registration Test. + +If you can find a free workstation, please use the "Click here to +register for an account" button on xlogin. If you are already logged +in to your workstation, in an xterm that is at least 24x80 characters +large, first do "access_on", then enter the command "rlogin [your +workstation] -l register", then the password "athena" when it prompts +for it (please use rlogin and not telnet so that the TERMCAP +environment variable gets set). + +Please note the time when you start. Follow the screen prompts for +the registration. You should be registering as: + + + +Choose whatever username and password you like. Please answer the +following questions when you are done, and return the form to E40-331. +If you did "access_on" earlier, you will want to execute "access_off" +now. + +Thank you, + -Mark Rosenstein + +------------------------------------------------------------------------- +1. What time did you start registration: + +2. What time did you complete registration: + +3. What username did you pick: + +4. What password did you choose: + +5. Please note any changes you think should be made in the messages +displayed by register. + + + + + + + + + + + + +6. Please note any problems or bugs encountered while registering. + + + diff --git a/reg_svr/regtest/message.head b/reg_svr/regtest/message.head new file mode 100644 index 00000000..ffcb3473 --- /dev/null +++ b/reg_svr/regtest/message.head @@ -0,0 +1,13 @@ + Welcome to the Fall '89 Project Athena Registration Test. + +If you can find a free workstation, please use the "Click here to +register for an account" button on xlogin. If you are already logged +in to your workstation, in an xterm that is at least 24x80 characters +large, first do "access_on", then enter the command "rlogin [your +workstation] -l register", then the password "athena" when it prompts +for it (please use rlogin and not telnet so that the TERMCAP +environment variable gets set). + +Please note the time when you start. Follow the screen prompts for +the registration. You should be registering as: + diff --git a/reg_svr/regtest/message.tail b/reg_svr/regtest/message.tail new file mode 100644 index 00000000..4e309dcb --- /dev/null +++ b/reg_svr/regtest/message.tail @@ -0,0 +1,37 @@ + + +Choose whatever username and password you like. Please answer the +following questions when you are done, and return the form to E40-331. +If you did "access_on" earlier, you will want to execute "access_off" +now. + +Thank you, + -Mark Rosenstein + +------------------------------------------------------------------------- +1. What time did you start registration: + +2. What time did you complete registration: + +3. What username did you pick: + +4. What password did you choose: + +5. Please note any changes you think should be made in the messages +displayed by register. + + + + + + + + + + + + +6. Please note any problems or bugs encountered while registering. + + + diff --git a/reg_svr/regtest/names b/reg_svr/regtest/names new file mode 100644 index 00000000..467ff09a --- /dev/null +++ b/reg_svr/regtest/names @@ -0,0 +1,39 @@ +Bond, James D 007-00-7007 +Claus, Santa N 012-25-1988 +Reagan, Ronald W 842-48-4832 +Fonebone, Andrew T 617-25-3130 +Bestertester, Fester G 482-67-4583 +Tishan, Mat E 314-15-9265 +Rodriguez, Jose' J 564-43-4427 +Doe, John Q 123-45-6789 +Sample, Mr 000-00-0000 +Normal, Edgar J 637-00-1212 +Raker, Watch B 253-67-4261 +Backwards, Count I 987-65-4321 +Base, Natural L 271-82-8183 +Technology, Mass I 021-39-0770 +Two, Power F 512-64-1024 +Lee, Susan C 888-00-0001 +Lee, Susan C 888-00-0002 +Lee, Susan C 888-00-0003 +Lee, Susan C 888-00-0004 +Password, Forgot M 253-00-1325 +Bright, Miss L 000-18-6000 +It, Whattime S 637-99-1212 +Source, Master V 018-71-0012 +Source, Master R 018-71-0037 +Can, Trash T 839-99-1100 +Airlines, Eastern 262-00-3700 +Toolkit, The X 110-11-0110 +Engineer, Release C 987-65-4321 +Mctrouble, Have U 000-00-0000 +Dover, Ilean D 123-98-4756 +Phatt, Cuttov T 888-77-6666 +Telephone, New E 873-00-1000 +Information, Long D 005-55-1212 +Fonumber, Forgot M 411-41-1411 +Kong, King 999-99-9999 +Zzzzz, Zzzzzz Z 999-99-9999 +Salad, Potato R 443-22-3412 +Us, Toys R 111-22-3333 +Last, First Middle 872-23-1231 diff --git a/reg_svr/regtest/names.crypt b/reg_svr/regtest/names.crypt new file mode 100644 index 00000000..2fe44156 --- /dev/null +++ b/reg_svr/regtest/names.crypt @@ -0,0 +1,39 @@ +Bond, James D 007-00-7007 bjoFETcM/iECE +Claus, Santa N 012-25-1988 csR5P3kxbAIqY +Reagan, Ronald W 842-48-4832 rrUxVK4G1mdmM +Fonebone, Andrew T 617-25-3130 faSozRn8h1syk +Bestertester, Fester G 482-67-4583 bfPDJls8hgpyU +Tishan, Mat E 314-15-9265 tmBrvq8rkWJFQ +Rodriguez, Jose' J 564-43-4427 rjeEUcajIziuk +Doe, John Q 123-45-6789 dj6yQFw.efB1. +Sample, Mr 000-00-0000 smuivEIKvUwzQ +Normal, Edgar J 637-00-1212 nePq.paPtHO0k +Raker, Watch B 253-67-4261 rwJxqWDVOVFEw +Backwards, Count I 987-65-4321 bcLs0PYq8642U +Base, Natural L 271-82-8183 bnTWstl/Yb2bQ +Technology, Mass I 021-39-0770 tmZLQwPijCjWs +Two, Power F 512-64-1024 tppGScOhli9/w +Lee, Susan C 888-00-0001 lsrayObeTeBo. +Lee, Susan C 888-00-0002 lsETwfGqsHbf2 +Lee, Susan C 888-00-0003 lsKSOR21t9QH6 +Lee, Susan C 888-00-0004 lsBgtJ2zL8Lkk +Password, Forgot M 253-00-1325 pf.wPS3Uq4QsE +Bright, Miss L 000-18-6000 bm6T/hThvblUY +It, Whattime S 637-99-1212 iw95GTPl9KSOk +Source, Master V 018-71-0012 smZBfEDBysN9s +Source, Master R 018-71-0037 smAAyQgx7Hln. +Can, Trash T 839-99-1100 ctLeqlq5fGULM +Airlines, Eastern 262-00-3700 aeipxaUaJD5Sc +Toolkit, The X 110-11-0110 tt0pFaRJbbt5Y +Engineer, Release C 987-65-4321 eryVuJArxQ6T6 +Mctrouble, Have U 000-00-0000 mh1UtJt6JsbeM +Dover, Ilean D 123-98-4756 diCmwWNJMGov. +Phatt, Cuttov T 888-77-6666 pcHR3IRp5gC0c +Telephone, New E 873-00-1000 tneoaYUP61yX6 +Information, Long D 005-55-1212 ilKjqzfXv3ZeY +Fonumber, Forgot M 411-41-1411 fflJjvDhb2AuQ +Kong, King 999-99-9999 kkTb.KfG4uhTA +Zzzzz, Zzzzzz Z 999-99-9999 zzdorTtAcPS4E +Salad, Potato R 443-22-3412 sp9Jtl8zQ9CWo +Us, Toys R 111-22-3333 ut9tdpLN4L6t6 +Last, First Middle 872-23-1231 fV4re5kaIrIg diff --git a/reg_svr/regtest/printit b/reg_svr/regtest/printit new file mode 100755 index 00000000..5f71a24c --- /dev/null +++ b/reg_svr/regtest/printit @@ -0,0 +1,11 @@ +#!/bin/csh -f + +while (1) + set input = `echo $<` + if ($#input < 2) break + + echo $input | cat message.head - message.tail >> lpr.out + echo " " >> lpr.out +end + +lpr lpr.out diff --git a/reg_svr/regtest/script b/reg_svr/regtest/script new file mode 100644 index 00000000..5342227b --- /dev/null +++ b/reg_svr/regtest/script @@ -0,0 +1,39 @@ +qy ausr "create unique login ID" "create unique UID" /bin/csh Bond James D 0 bjoFETcM/iECE TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Claus Santa N 0 csR5P3kxbAIqY TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Reagan Ronald W 0 rrUxVK4G1mdmM TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Fonebone Andrew T 0 faSozRn8h1syk TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Bestertester Fester G 0 bfPDJls8hgpyU TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Tishan Mat E 0 tmBrvq8rkWJFQ TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Rodriguez Jose' J 0 rjeEUcajIziuk TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Doe John Q 0 dj6yQFw.efB1. TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Sample Mr "" 0 smuivEIKvUwzQ TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Normal Edgar J 0 nePq.paPtHO0k TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Raker Watch B 0 rwJxqWDVOVFEw TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Backwards Count I 0 bcLs0PYq8642U TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Base Natural L 0 bnTWstl/Yb2bQ TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Technology Mass I 0 tmZLQwPijCjWs TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Two Power F 0 tppGScOhli9/w TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsrayObeTeBo. TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsETwfGqsHbf2 TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsKSOR21t9QH6 TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Lee Susan C 0 lsBgtJ2zL8Lkk TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Password Forgot M 0 pf.wPS3Uq4QsE TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Bright Miss L 0 bm6T/hThvblUY TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh It Whattime S 0 iw95GTPl9KSOk TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Source Master V 0 smZBfEDBysN9s TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Source Master R 0 smAAyQgx7Hln. TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Can Trash T 0 ctLeqlq5fGULM TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Airlines Eastern "" 0 aeipxaUaJD5Sc TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Toolkit The X 0 tt0pFaRJbbt5Y TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Engineer Release C 0 eryVuJArxQ6T6 TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Mctrouble Have U 0 mh1UtJt6JsbeM TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Dover Ilean D 0 diCmwWNJMGov. TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Phatt Cuttov T 0 pcHR3IRp5gC0c TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Telephone New E 0 tneoaYUP61yX6 TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Information Long D 0 ilKjqzfXv3ZeY TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Fonumber Forgot M 0 fflJjvDhb2AuQ TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Kong King "" 0 kkTb.KfG4uhTA TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Zzzzz Zzzzzz Z 0 zzdorTtAcPS4E TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Salad Potato R 0 sp9Jtl8zQ9CWo TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Us Toys R 0 ut9tdpLN4L6t6 TEST +qy ausr "create unique login ID" "create unique UID" /bin/csh Last First Middle 0 fV4re5kaIrIg TEST diff --git a/server/TODO b/server/TODO new file mode 100644 index 00000000..1470b287 --- /dev/null +++ b/server/TODO @@ -0,0 +1,34 @@ +Bugs +---- + +"Query complete." is printed twice after alis, dlis, and others. +fflush() before the vfork(), strangely, does not fix this. + +The _exit() in next_incremental() may allow memory leakage from the +incremental updates, as well as leaving other things (?) not cleaned up. +Maybe this should be investigated. + +Timeouts may sometimes be other errors. Need to parse the error message +string when the error number is 39100 to figure out if it is a timeout or not. + +gnfq/gqot do not handle wildcards in /. (Could they? +Do they need it?) They do handle wildcards for filesystem names. + + +Try to improve performance: +--------------------------- +gqot/dqot + + +Improvements +------------ + +Add case insensitivity: List names, others(?) + +Abstraction for string retrieval + + +Other +----- + +rsve, dsin, sshi have range variable problems -- 2.45.1