[24138] in Source-Commits

home help back first fref pref prev next nref lref last post

/svn/athena r23740 - in trunk/third/moira: . afssync backup clients clients/addusr clients/blanche clients/chfn clients/chpobox clients/chsh clients/lib clients/mailmaint clients/mitch clients/moira clients/moira/Doc clients/mrcheck clients/mrtest clients/mrtest/scripts clients/regapplet clients/regapplet/mit/cipher clients/regapplet/mit/random clients/stanley clients/stella db dbck dcm

daemon@ATHENA.MIT.EDU (Evan Broder)
Sun Apr 12 14:06:47 2009

X-Barracuda-Envelope-From: broder@mit.edu
Date: Sun, 12 Apr 2009 14:05:57 -0400
From: Evan Broder <broder@MIT.EDU>
Message-Id: <200904121805.n3CI5vWK005870@drugstore.mit.edu>
To: source-commits@mit.edu
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Author: broder
Date: 2009-04-12 14:05:09 -0400 (Sun, 12 Apr 2009)
New Revision: 23740

Added:
   trunk/third/moira/debian/patches/
   trunk/third/moira/gen/confluence.sh
   trunk/third/moira/gen/cups-print.pc
   trunk/third/moira/gen/cups-print.sh
   trunk/third/moira/gen/lpcaccess.pc
   trunk/third/moira/gen/lpcaccess.sh
   trunk/third/moira/gen/nagios-cluster.gen
   trunk/third/moira/gen/nagios-cluster.sh
   trunk/third/moira/gen/warehouse-lists.pc
   trunk/third/moira/incremental/ldap/
   trunk/third/moira/incremental/ldap/Makefile.in
   trunk/third/moira/incremental/ldap/auth_con.h
   trunk/third/moira/incremental/ldap/gssldap-int.h
   trunk/third/moira/incremental/ldap/gssldap.h
   trunk/third/moira/incremental/ldap/gsssasl.h
   trunk/third/moira/incremental/ldap/kpasswd.h
   trunk/third/moira/incremental/ldap/krb5_utils.c
   trunk/third/moira/incremental/ldap/ldap-int.h
   trunk/third/moira/incremental/ldap/ldap_adgssapi_bind.c
   trunk/third/moira/incremental/ldap/setpw.c
   trunk/third/moira/incremental/ldap/winad.c
Removed:
   trunk/third/moira/debian/patches/
Modified:
   trunk/third/moira/Makefile.in
   trunk/third/moira/afssync/Makefile.in
   trunk/third/moira/afssync/sync.pc
   trunk/third/moira/afssync/ubik.c
   trunk/third/moira/afssync/utils.c
   trunk/third/moira/afssync/vis.c
   trunk/third/moira/afssync/vis.h
   trunk/third/moira/backup/Makefile.in
   trunk/third/moira/backup/db2bkup.awk
   trunk/third/moira/backup/db2rest.awk
   trunk/third/moira/backup/dump_db.h
   trunk/third/moira/backup/dump_db.pc
   trunk/third/moira/backup/dumprest.pc
   trunk/third/moira/backup/report.pl
   trunk/third/moira/backup/rest_db.pc
   trunk/third/moira/clients/Makefile.in
   trunk/third/moira/clients/addusr/Makefile.in
   trunk/third/moira/clients/addusr/addusr.c
   trunk/third/moira/clients/blanche/Makefile.in
   trunk/third/moira/clients/blanche/blanche.c
   trunk/third/moira/clients/chfn/Makefile.in
   trunk/third/moira/clients/chfn/chfn.c
   trunk/third/moira/clients/chpobox/Makefile.in
   trunk/third/moira/clients/chpobox/chpobox.c
   trunk/third/moira/clients/chsh/Makefile.in
   trunk/third/moira/clients/chsh/chsh.c
   trunk/third/moira/clients/lib/Makefile.in
   trunk/third/moira/clients/lib/error.c
   trunk/third/moira/clients/lib/mail.c
   trunk/third/moira/clients/lib/member.c
   trunk/third/moira/clients/lib/mrclient-internal.h
   trunk/third/moira/clients/lib/pobox.c
   trunk/third/moira/clients/lib/utils.c
   trunk/third/moira/clients/mailmaint/Makefile.in
   trunk/third/moira/clients/mailmaint/mailmaint.c
   trunk/third/moira/clients/mitch/Makefile.in
   trunk/third/moira/clients/mitch/mitch.c
   trunk/third/moira/clients/moira/Doc/Makefile
   trunk/third/moira/clients/moira/Doc/internal.mss
   trunk/third/moira/clients/moira/Makefile.in
   trunk/third/moira/clients/moira/acl.c
   trunk/third/moira/clients/moira/attach.c
   trunk/third/moira/clients/moira/cluster.c
   trunk/third/moira/clients/moira/dcmmaint.c
   trunk/third/moira/clients/moira/defs.h
   trunk/third/moira/clients/moira/delete.c
   trunk/third/moira/clients/moira/f_defs.h
   trunk/third/moira/clients/moira/globals.c
   trunk/third/moira/clients/moira/globals.h
   trunk/third/moira/clients/moira/lists.c
   trunk/third/moira/clients/moira/main.c
   trunk/third/moira/clients/moira/menu.c
   trunk/third/moira/clients/moira/menu.h
   trunk/third/moira/clients/moira/menus.c
   trunk/third/moira/clients/moira/misc.c
   trunk/third/moira/clients/moira/namespace.c
   trunk/third/moira/clients/moira/nfs.c
   trunk/third/moira/clients/moira/pobox.c
   trunk/third/moira/clients/moira/printer.c
   trunk/third/moira/clients/moira/quota.c
   trunk/third/moira/clients/moira/user.c
   trunk/third/moira/clients/moira/utils.c
   trunk/third/moira/clients/moira/zephyr.c
   trunk/third/moira/clients/mrcheck/Makefile.in
   trunk/third/moira/clients/mrcheck/mrcheck.c
   trunk/third/moira/clients/mrtest/Makefile.in
   trunk/third/moira/clients/mrtest/mrtest.c
   trunk/third/moira/clients/mrtest/scripts/users.sc
   trunk/third/moira/clients/regapplet/Makefile
   trunk/third/moira/clients/regapplet/mit/cipher/ArrayUtil.java
   trunk/third/moira/clients/regapplet/mit/cipher/BI.java
   trunk/third/moira/clients/regapplet/mit/cipher/DES.java
   trunk/third/moira/clients/regapplet/mit/cipher/Hex.java
   trunk/third/moira/clients/regapplet/mit/cipher/RSAAlgorithm.java
   trunk/third/moira/clients/regapplet/mit/random/SHA1.java
   trunk/third/moira/clients/stanley/Makefile.in
   trunk/third/moira/clients/stanley/stanley.c
   trunk/third/moira/clients/stella/Makefile.in
   trunk/third/moira/clients/stella/stella.c
   trunk/third/moira/configure
   trunk/third/moira/configure.in
   trunk/third/moira/db/Makefile.in
   trunk/third/moira/db/doschema.awk
   trunk/third/moira/dbck/Makefile.in
   trunk/third/moira/dbck/dbck.h
   trunk/third/moira/dbck/dbck.pc
   trunk/third/moira/dbck/fix.pc
   trunk/third/moira/dbck/members.pc
   trunk/third/moira/dbck/phase1.pc
   trunk/third/moira/dbck/phase2.pc
   trunk/third/moira/dbck/phase3.pc
   trunk/third/moira/dbck/phase4.pc
   trunk/third/moira/dcm/Makefile.in
   trunk/third/moira/dcm/dcm.pc
   trunk/third/moira/dcm/startdcm.c
   trunk/third/moira/debian/changelog
   trunk/third/moira/debian/rules
   trunk/third/moira/gen/Makefile.in
   trunk/third/moira/gen/access.gen
   trunk/third/moira/gen/access.sh
   trunk/third/moira/gen/acl.pc
   trunk/third/moira/gen/acl.sh
   trunk/third/moira/gen/aliases.sh
   trunk/third/moira/gen/boot.pc
   trunk/third/moira/gen/boot.sh
   trunk/third/moira/gen/ca.gen
   trunk/third/moira/gen/calendar.gen
   trunk/third/moira/gen/confluence.pc
   trunk/third/moira/gen/dhcp.pc
   trunk/third/moira/gen/dhcp.sh
   trunk/third/moira/gen/directory.pc
   trunk/third/moira/gen/events.pc
   trunk/third/moira/gen/events.sh
   trunk/third/moira/gen/genacl.pc
   trunk/third/moira/gen/hesiod.pc
   trunk/third/moira/gen/hesiod.sh
   trunk/third/moira/gen/hosts.pc
   trunk/third/moira/gen/install_dirs
   trunk/third/moira/gen/install_quotas
   trunk/third/moira/gen/ip-billing.gen
   trunk/third/moira/gen/ip-billing.sh
   trunk/third/moira/gen/ldap.gen
   trunk/third/moira/gen/longjobs.gen
   trunk/third/moira/gen/longjobs.sh
   trunk/third/moira/gen/mailhosts.gen
   trunk/third/moira/gen/mailhub.pc
   trunk/third/moira/gen/mailhub.sh
   trunk/third/moira/gen/mailman.gen
   trunk/third/moira/gen/mailman.sh
   trunk/third/moira/gen/nagios-colo.gen
   trunk/third/moira/gen/nagios-colo.sh
   trunk/third/moira/gen/nagios-printers.gen
   trunk/third/moira/gen/nagios-printers.sh
   trunk/third/moira/gen/nagios-wsh.gen
   trunk/third/moira/gen/nagios-wsh.sh
   trunk/third/moira/gen/ndb.pc
   trunk/third/moira/gen/ndb.sh
   trunk/third/moira/gen/network.pc
   trunk/third/moira/gen/nfs.pc
   trunk/third/moira/gen/nfs.sh
   trunk/third/moira/gen/pobox.pc
   trunk/third/moira/gen/postoffice.pc
   trunk/third/moira/gen/postoffice.sh
   trunk/third/moira/gen/print.pc
   trunk/third/moira/gen/print.sh
   trunk/third/moira/gen/rt.sh
   trunk/third/moira/gen/sapprint.gen
   trunk/third/moira/gen/sapprint.sh
   trunk/third/moira/gen/setquota.c
   trunk/third/moira/gen/spwatch.gen
   trunk/third/moira/gen/tar.c
   trunk/third/moira/gen/tsm.gen
   trunk/third/moira/gen/tsm.sh
   trunk/third/moira/gen/util.c
   trunk/third/moira/gen/warehouse.gen
   trunk/third/moira/gen/warehouse.sh
   trunk/third/moira/gen/winad.pc
   trunk/third/moira/gen/winstats.gen
   trunk/third/moira/gen/winstats.sh
   trunk/third/moira/gen/www.pc
   trunk/third/moira/gen/www.sh
   trunk/third/moira/gen/zephyr.pc
   trunk/third/moira/gen/zephyr.sh
   trunk/third/moira/gen/zero_quotas
   trunk/third/moira/include/Makefile.in
   trunk/third/moira/include/mit-copyright.h
   trunk/third/moira/include/moira.h
   trunk/third/moira/include/moira_site.h
   trunk/third/moira/include/mrclient.h
   trunk/third/moira/include/ureg_proto.h
   trunk/third/moira/incremental/Makefile.in
   trunk/third/moira/incremental/afs/Makefile.in
   trunk/third/moira/incremental/afs/afs.c
   trunk/third/moira/incremental/afs/afs_utils.pl
   trunk/third/moira/incremental/ksrvtgt.c
   trunk/third/moira/incremental/mailman/Makefile.in
   trunk/third/moira/incremental/winad/Makefile.in
   trunk/third/moira/incremental/winad/gssldap-int.h
   trunk/third/moira/incremental/winad/gssldap.h
   trunk/third/moira/incremental/winad/gsssasl.h
   trunk/third/moira/incremental/winad/krb5_utils.c
   trunk/third/moira/incremental/winad/ldap_adgssapi_bind.c
   trunk/third/moira/incremental/winad/setpw.c
   trunk/third/moira/incremental/winad/winad.c
   trunk/third/moira/lib/Makefile.in
   trunk/third/moira/lib/critical.c
   trunk/third/moira/lib/fixhost.c
   trunk/third/moira/lib/fixname.c
   trunk/third/moira/lib/hash.c
   trunk/third/moira/lib/kname_unparse.c
   trunk/third/moira/lib/mr_access.c
   trunk/third/moira/lib/mr_auth.c
   trunk/third/moira/lib/mr_call.c
   trunk/third/moira/lib/mr_connect.c
   trunk/third/moira/lib/mr_et.et
   trunk/third/moira/lib/mr_init.c
   trunk/third/moira/lib/mr_ops.c
   trunk/third/moira/lib/mr_private.h
   trunk/third/moira/lib/mr_query.c
   trunk/third/moira/lib/nfsparttype.c
   trunk/third/moira/lib/sq.c
   trunk/third/moira/lib/strs.c
   trunk/third/moira/man/Makefile.in
   trunk/third/moira/man/addusr.1
   trunk/third/moira/man/blanche.1
   trunk/third/moira/man/chfn.1
   trunk/third/moira/man/chpobox.1
   trunk/third/moira/man/chsh.1
   trunk/third/moira/man/dcm.8
   trunk/third/moira/man/mailmaint.1
   trunk/third/moira/man/mitch.1
   trunk/third/moira/man/moira.1
   trunk/third/moira/man/moirad.8
   trunk/third/moira/man/mrcheck.1
   trunk/third/moira/man/mrtest.8
   trunk/third/moira/man/reg_svr.8
   trunk/third/moira/man/setquota.8
   trunk/third/moira/man/stanley.1
   trunk/third/moira/man/stella.1
   trunk/third/moira/man/update_server.8
   trunk/third/moira/man/userreg.1
   trunk/third/moira/mkinstalldirs
   trunk/third/moira/reg_svr/Makefile.in
   trunk/third/moira/reg_svr/coupons/INSTRUCTIONS
   trunk/third/moira/reg_svr/genkey.c
   trunk/third/moira/reg_svr/genwords.pc
   trunk/third/moira/reg_svr/kerberos.c
   trunk/third/moira/reg_svr/protocol.c
   trunk/third/moira/reg_svr/reg_svr.pc
   trunk/third/moira/reg_svr/startreg.c
   trunk/third/moira/reg_svr/words.c
   trunk/third/moira/regtape/Makefile.in
   trunk/third/moira/regtape/common.h
   trunk/third/moira/regtape/common.pc
   trunk/third/moira/regtape/grouper.pl
   trunk/third/moira/regtape/staff.pc
   trunk/third/moira/regtape/student.pc
   trunk/third/moira/regtape/vote.pc
   trunk/third/moira/server/Makefile.in
   trunk/third/moira/server/increment.pc
   trunk/third/moira/server/mr_main.c
   trunk/third/moira/server/mr_sauth.c
   trunk/third/moira/server/mr_scall.c
   trunk/third/moira/server/mr_server.h
   trunk/third/moira/server/mr_shutdown.c
   trunk/third/moira/server/mr_util.c
   trunk/third/moira/server/qaccess.pc
   trunk/third/moira/server/qfollow.pc
   trunk/third/moira/server/qrtn.h
   trunk/third/moira/server/qrtn.pc
   trunk/third/moira/server/qsetup.pc
   trunk/third/moira/server/qsubs.c
   trunk/third/moira/server/qsupport.pc
   trunk/third/moira/server/queries2.c
   trunk/third/moira/server/query.h
   trunk/third/moira/server/qvalidate.pc
   trunk/third/moira/server/startmoira.c
   trunk/third/moira/update/Makefile.in
   trunk/third/moira/update/auth_002.c
   trunk/third/moira/update/auth_003.c
   trunk/third/moira/update/checksum.c
   trunk/third/moira/update/client.c
   trunk/third/moira/update/config.c
   trunk/third/moira/update/exec_002.c
   trunk/third/moira/update/get_file.c
   trunk/third/moira/update/send_file.c
   trunk/third/moira/update/sendrecv.c
   trunk/third/moira/update/smskey.c
   trunk/third/moira/update/ticket.c
   trunk/third/moira/update/update_server.c
   trunk/third/moira/update/update_test.c
   trunk/third/moira/update/xfer_002.c
   trunk/third/moira/update/xfer_003.c
   trunk/third/moira/util/et/Makefile.in
   trunk/third/moira/util/et/com_err.3
   trunk/third/moira/util/et/com_err.c
   trunk/third/moira/util/et/compile_et.1
   trunk/third/moira/util/et/compile_et.c
   trunk/third/moira/util/et/error_message.c
   trunk/third/moira/util/et/error_table.y
   trunk/third/moira/util/et/et_lex.lex.l
   trunk/third/moira/util/et/et_name.c
   trunk/third/moira/util/et/init_et.c
   trunk/third/moira/util/rsaref/Makefile.in
   trunk/third/moira/webmoira/Makefile.in
   trunk/third/moira/webmoira/moirai.c
Log:
In moira:
  * New CVS snapshot (Trac: #195)
  * Drop patches that have been incorporated upstream.
  * Update to build without krb4 on systems that no longer have it.

This doesn't build yet on squeeze, which lacks a krb4 library, but I'm
committing now before I start hacking away at a patch to fix that.


Modified: trunk/third/moira/Makefile.in
===================================================================
--- trunk/third/moira/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.12 2009-01-05 22:25:07 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -35,11 +35,11 @@
 	@for d in $(SUBDIRS); do (echo "### Making $@ in $$d"; cd $$d; $(MAKE) $@) || exit 1; done
 
 install:
-	$(srcdir)/mkinstalldirs $(bindir) $(sbindir) $(mrbindir) $(mandir)
+	$(srcdir)/mkinstalldirs $(DESTDIR)$(bindir) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)
 	@for d in $(SUBDIRS); do (echo "### Making $@ in $$d"; cd $$d; $(MAKE) $@) || exit 1; done
 
 svrinstall:
-	$(srcdir)/mkinstalldirs $(mrbindir)
+	$(srcdir)/mkinstalldirs $(DESTDIR)$(mrbindir)
 	@for d in $(SVRDIRS); do (echo "### Making install in $$d"; cd $$d; $(MAKE) install) || exit 1; done
 
 world: depend all

Modified: trunk/third/moira/afssync/Makefile.in
===================================================================
--- trunk/third/moira/afssync/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/afssync/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.9 2009-01-05 22:25:10 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -56,9 +56,9 @@
 depend: $(CFILES)
 
 install:
-	$(INSTALL_PROGRAM) afssync $(mrbindir)
-	$(INSTALL_PROGRAM) pt_util $(mrbindir)
-	$(INSTALL_PROGRAM) $(srcdir)/pt_util.pl $(mrbindir)
+	$(INSTALL_PROGRAM) afssync $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) pt_util $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) $(srcdir)/pt_util.pl $(DESTDIR)$(mrbindir)
 
 afssync: $(SYNC_OBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(SYNC_OBJS) $(AFS_LIBS) -llwp -lprot $(SQL_LIBS) $(LIBS)

Modified: trunk/third/moira/afssync/sync.pc
===================================================================
--- trunk/third/moira/afssync/sync.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/afssync/sync.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Header$
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/afssync/sync.pc,v 1.7 2007-05-16 19:42:00 zacheiss Exp $
  *
  *
  *  (c) Copyright 1989 by the Massachusetts Institute of Technology.

Modified: trunk/third/moira/afssync/ubik.c
===================================================================
--- trunk/third/moira/afssync/ubik.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/afssync/ubik.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$ */
+/* $Id: ubik.c,v 1.6 2006-05-12 20:20:08 zacheiss Exp $ */
 
 #include <sys/types.h>
 #include <netinet/in.h>

Modified: trunk/third/moira/afssync/utils.c
===================================================================
--- trunk/third/moira/afssync/utils.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/afssync/utils.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -6,7 +6,7 @@
  */
 
 #ifndef lint
-static char rcsid[] = "$Header$";
+static char rcsid[] = "$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/afssync/utils.c,v 1.7 1992-07-05 13:03:50 probe Exp $";
 #endif
 
 /*	

Modified: trunk/third/moira/afssync/vis.c
===================================================================
--- trunk/third/moira/afssync/vis.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/afssync/vis.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: vis.c,v 1.1 2001-10-23 19:35:56 zacheiss Exp $
  * vis functions - visually encode characters
  * Originally from OpenBSD
  */

Modified: trunk/third/moira/afssync/vis.h
===================================================================
--- trunk/third/moira/afssync/vis.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/afssync/vis.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: vis.h,v 1.1 2001-10-23 19:35:56 zacheiss Exp $
  * vis functions - visually encode characters
  * Originally from OpenBSD
  */

Modified: trunk/third/moira/backup/Makefile.in
===================================================================
--- trunk/third/moira/backup/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.9 2009-01-05 22:25:12 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -52,9 +52,9 @@
 depend: $(GENFILES) $(CFILES)
 
 install:
-	$(INSTALL_PROGRAM) mrbackup $(mrbindir)
-	$(INSTALL_PROGRAM) mrrestore $(mrbindir)
-	$(INSTALL_PROGRAM) $(srcdir)/report.pl $(mrbindir)
+	$(INSTALL_PROGRAM) mrbackup $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) mrrestore $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) $(srcdir)/report.pl $(DESTDIR)$(mrbindir)
 
 mrbackup: $(BOBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(BOBJS) $(LIBS)

Modified: trunk/third/moira/backup/db2bkup.awk
===================================================================
--- trunk/third/moira/backup/db2bkup.awk	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/db2bkup.awk	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-#	$Id$
+#	$Id: db2bkup.awk,v 1.16 2004-10-19 03:43:59 zacheiss Exp $
 #
 #	This converts the file used to originally create the database
 #	into a program to back it up.

Modified: trunk/third/moira/backup/db2rest.awk
===================================================================
--- trunk/third/moira/backup/db2rest.awk	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/db2rest.awk	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-#	$Id$
+#	$Id: db2rest.awk,v 1.11 2004-10-19 03:43:59 zacheiss Exp $
 #
 #	This converts the file used to originally create the database
 #	into a program to restore it from a backup.

Modified: trunk/third/moira/backup/dump_db.h
===================================================================
--- trunk/third/moira/backup/dump_db.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/dump_db.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$ */
+/* $Id: dump_db.h,v 1.6 2000-03-10 20:55:04 zacheiss Exp $ */
 
 #include <stdio.h>
 #include <moira.h>

Modified: trunk/third/moira/backup/dump_db.pc
===================================================================
--- trunk/third/moira/backup/dump_db.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/dump_db.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: dump_db.pc,v 1.9 2000-03-10 20:55:04 zacheiss Exp $
  *
  * 	This program dumps the Moira database to a series of output files
  * which can be later read back into Moira in the event of a crash.
@@ -19,7 +19,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/backup/dump_db.pc,v 1.9 2000-03-10 20:55:04 zacheiss Exp $");
 
 EXEC SQL BEGIN DECLARE SECTION;
 char *db = "moira";

Modified: trunk/third/moira/backup/dumprest.pc
===================================================================
--- trunk/third/moira/backup/dumprest.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/dumprest.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: dumprest.pc,v 1.4 1998-02-05 22:50:23 danw Exp $
  *
  * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -11,7 +11,7 @@
 
 #include <stdio.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/backup/dumprest.pc,v 1.4 1998-02-05 22:50:23 danw Exp $");
 
 extern void sqlglm(char *, unsigned int *, unsigned int *);
 

Modified: trunk/third/moira/backup/report.pl
===================================================================
--- trunk/third/moira/backup/report.pl	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/report.pl	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/moira/bin/perl
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/backup/report.pl,v 1.2 2003-04-05 07:24:04 jweiss Exp $
 
 chdir($ARGV[0]);
 

Modified: trunk/third/moira/backup/rest_db.pc
===================================================================
--- trunk/third/moira/backup/rest_db.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/backup/rest_db.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: rest_db.pc,v 1.6 2002-05-01 04:38:03 zacheiss Exp $
  *
  * 	This program restores the Moira database from an mrbackup.
  *
@@ -19,7 +19,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/backup/rest_db.pc,v 1.6 2002-05-01 04:38:03 zacheiss Exp $");
 
 int yes_or_no(char *prompt);
 

Modified: trunk/third/moira/clients/Makefile.in
===================================================================
--- trunk/third/moira/clients/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.9 2003-02-04 04:42:04 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@

Modified: trunk/third/moira/clients/addusr/Makefile.in
===================================================================
--- trunk/third/moira/clients/addusr/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/addusr/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.7 2009-01-05 22:25:14 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) -m 755 addusr $(bindir)
+	$(INSTALL_PROGRAM) -m 755 addusr $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/addusr/addusr.c
===================================================================
--- trunk/third/moira/clients/addusr/addusr.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/addusr/addusr.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: addusr.c,v 1.24 2009-03-31 19:13:09 zacheiss Exp $
  *
  * Program to add users en masse to the moira database
  *
@@ -19,7 +19,7 @@
 #include <stdio.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/addusr/addusr.c,v 1.24 2009-03-31 19:13:09 zacheiss Exp $");
 
 struct owner_type {
   int type;
@@ -33,9 +33,9 @@
 #define M_NONE		4
 
 #ifdef ATHENA
-#define DEFAULT_SHELL "/bin/athena/tcsh"
+#define DEFAULT_SHELL "/bin/athena/bash"
 #else
-#define DEFAULT_SHELL "/bin/csh"
+#define DEFAULT_SHELL "/bin/bash"
 #endif
 
 #define DEFAULT_WINCONSOLESHELL "cmd"

Modified: trunk/third/moira/clients/blanche/Makefile.in
===================================================================
--- trunk/third/moira/clients/blanche/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/blanche/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.6 2009-01-05 22:25:16 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) blanche $(bindir)
+	$(INSTALL_PROGRAM) blanche $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/blanche/blanche.c
===================================================================
--- trunk/third/moira/clients/blanche/blanche.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/blanche/blanche.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: blanche.c,v 1.62 2007-05-14 16:05:43 zacheiss Exp $
  *
  * Command line oriented Moira List tool.
  *
@@ -20,7 +20,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/blanche/blanche.c,v 1.62 2007-05-14 16:05:43 zacheiss Exp $");
 
 struct member {
   int type;

Modified: trunk/third/moira/clients/chfn/Makefile.in
===================================================================
--- trunk/third/moira/clients/chfn/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/chfn/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 2009-01-05 22:25:17 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) $(TARGET) $(bindir)
+	$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $@.o $(LIBS)

Modified: trunk/third/moira/clients/chfn/chfn.c
===================================================================
--- trunk/third/moira/clients/chfn/chfn.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/chfn/chfn.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: chfn.c,v 1.3 2006-08-23 20:33:33 zacheiss Exp $
  *
  * Talk to the Moira database to change a person's GECOS information.
  *
@@ -22,7 +22,7 @@
 #include <stdio.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/chfn/chfn.c,v 1.3 2006-08-23 20:33:33 zacheiss Exp $");
 
 #define FALSE 0
 #define TRUE 1

Modified: trunk/third/moira/clients/chpobox/Makefile.in
===================================================================
--- trunk/third/moira/clients/chpobox/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/chpobox/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 2009-01-05 22:25:19 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) $(TARGET) $(bindir)
+	$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $@.o $(LIBS)

Modified: trunk/third/moira/clients/chpobox/chpobox.c
===================================================================
--- trunk/third/moira/clients/chpobox/chpobox.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/chpobox/chpobox.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: chpobox.c,v 1.6 2008-05-16 16:49:38 zacheiss Exp $
  *
  * Talk to the Moira database to change a person's home mail machine. This may
  * be an Athena machine, or a completely arbitrary address.
@@ -38,7 +38,7 @@
 
 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/chpobox/chpobox.c,v 1.6 2008-05-16 16:49:38 zacheiss Exp $");
 
 int get_pobox(int argc, char **argv, void *callarg);
 void usage(void);

Modified: trunk/third/moira/clients/chsh/Makefile.in
===================================================================
--- trunk/third/moira/clients/chsh/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/chsh/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 2009-01-05 22:25:20 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) $(TARGET) $(bindir)
+	$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $@.o $(LIBS)

Modified: trunk/third/moira/clients/chsh/chsh.c
===================================================================
--- trunk/third/moira/clients/chsh/chsh.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/chsh/chsh.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: chsh.c,v 1.5 2008-03-04 20:36:30 zacheiss Exp $
  *
  * Talk to the Moira database to change a person's login shell.  The chosen
  * shell must exist.  A warning will be issued if the shell is not in
@@ -26,7 +26,7 @@
 
 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/chsh/chsh.c,v 1.5 2008-03-04 20:36:30 zacheiss Exp $");
 
 void usage(void);
 int get_shell(int argc, char **argv, void *username);

Modified: trunk/third/moira/clients/lib/Makefile.in
===================================================================
--- trunk/third/moira/clients/lib/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/lib/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.3 2000-08-10 02:05:35 zacheiss Exp $
 
 SHELL=/bin/sh
 

Modified: trunk/third/moira/clients/lib/error.c
===================================================================
--- trunk/third/moira/clients/lib/error.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/lib/error.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: error.c,v 1.2 2002-08-15 20:38:33 zacheiss Exp $
  *
  * mrcl error interface
  *
@@ -19,7 +19,7 @@
 
 #include <com_err.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/lib/error.c,v 1.2 2002-08-15 20:38:33 zacheiss Exp $");
 
 static char *mrcl_message = NULL;
 

Modified: trunk/third/moira/clients/lib/mail.c
===================================================================
--- trunk/third/moira/clients/lib/mail.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/lib/mail.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mail.c,v 1.3 2008-08-22 17:49:10 zacheiss Exp $
  *
  * Library-internal routines for categorizing machines in terms
  * of email.
@@ -17,7 +17,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/lib/mail.c,v 1.3 2008-08-22 17:49:10 zacheiss Exp $");
 
 static int save_sloc_machine(int argc, char **argv, void *sq);
 static int save_alias_value(int argc, char **argv, void *sq);

Modified: trunk/third/moira/clients/lib/member.c
===================================================================
--- trunk/third/moira/clients/lib/member.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/lib/member.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: member.c,v 1.5 2002-09-25 20:44:54 zacheiss Exp $
  *
  * Shared routines for playing with list membership.
  *
@@ -19,7 +19,7 @@
 
 #include <krb.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/lib/member.c,v 1.5 2002-09-25 20:44:54 zacheiss Exp $");
 
 static char default_realm[REALM_SZ];
 

Modified: trunk/third/moira/clients/lib/mrclient-internal.h
===================================================================
--- trunk/third/moira/clients/lib/mrclient-internal.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/lib/mrclient-internal.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mrclient-internal.h,v 1.2 2008-08-22 17:49:11 zacheiss Exp $
  *
  * Copyright (C) 1999 by the Massachusetts Institute of Technology
  *

Modified: trunk/third/moira/clients/lib/pobox.c
===================================================================
--- trunk/third/moira/clients/lib/pobox.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/lib/pobox.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: pobox.c,v 1.8 2008-08-22 17:49:11 zacheiss Exp $
  *
  * Shared routines for pobox changing.
  *
@@ -18,7 +18,7 @@
 
 #include <com_err.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/lib/pobox.c,v 1.8 2008-08-22 17:49:11 zacheiss Exp $");
 
 static int save_sloc_machine(int argc, char **argv, void *sq);
 static int save_alias_value(int argc, char **argv, void *sq);

Modified: trunk/third/moira/clients/lib/utils.c
===================================================================
--- trunk/third/moira/clients/lib/utils.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/lib/utils.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: utils.c,v 1.7 2006-08-23 19:01:05 zacheiss Exp $
  *
  * Random client utilities.
  *
@@ -32,7 +32,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/lib/utils.c,v 1.7 2006-08-23 19:01:05 zacheiss Exp $");
 
 extern char *whoami;
 extern krb5_context context;

Modified: trunk/third/moira/clients/mailmaint/Makefile.in
===================================================================
--- trunk/third/moira/clients/mailmaint/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mailmaint/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.6 2009-01-05 22:25:22 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) mailmaint $(bindir)
+	$(INSTALL_PROGRAM) mailmaint $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/mailmaint/mailmaint.c
===================================================================
--- trunk/third/moira/clients/mailmaint/mailmaint.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mailmaint/mailmaint.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mailmaint.c,v 1.47 2006-08-23 20:07:17 zacheiss Exp $
  *
  * Simple add-me-to/remove-me-from list client
  *
@@ -54,7 +54,7 @@
 #define DELETE_A_CHAR() printf("\b \b");
 #endif /* !_WIN32 */
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/mailmaint/mailmaint.c,v 1.47 2006-08-23 20:07:17 zacheiss Exp $");
 
 #define STARTCOL 0
 #define STARTROW 3

Modified: trunk/third/moira/clients/mitch/Makefile.in
===================================================================
--- trunk/third/moira/clients/mitch/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mitch/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 2009-01-05 22:25:23 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) mitch $(bindir)
+	$(INSTALL_PROGRAM) mitch $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/mitch/mitch.c
===================================================================
--- trunk/third/moira/clients/mitch/mitch.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mitch/mitch.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -21,7 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Id$");
+RCSID("$Id: mitch.c,v 1.1 2003-02-04 04:44:41 zacheiss Exp $");
 
 struct owner_type {
   int type;

Modified: trunk/third/moira/clients/moira/Doc/Makefile
===================================================================
--- trunk/third/moira/clients/moira/Doc/Makefile	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/Doc/Makefile	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/Doc/Makefile,v 1.1 1996-07-02 02:01:45 danw Exp $
 
 all: internal.PS
 

Modified: trunk/third/moira/clients/moira/Doc/internal.mss
===================================================================
--- trunk/third/moira/clients/moira/Doc/internal.mss	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/Doc/internal.mss	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-@Comment($Header$)
+@Comment($Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/Doc/internal.mss,v 1.1 1996-07-02 02:01:45 danw Exp $)
 @Make(Manual)
 @Device(PostScript)
 @PageFooting(center "Draft of @value(date)")

Modified: trunk/third/moira/clients/moira/Makefile.in
===================================================================
--- trunk/third/moira/clients/moira/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.10 2009-01-05 22:25:24 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -44,14 +44,14 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) namespace $(bindir)
-	$(INSTALL_PROGRAM) moira $(bindir)
-	rm -f $(bindir)/listmaint	
-	ln -s moira $(bindir)/listmaint
-	rm -f $(bindir)/dcmmaint
-	ln -s moira $(bindir)/dcmmaint
-	rm -f $(bindir)/usermaint
-	ln -s moira $(bindir)/usermaint
+	$(INSTALL_PROGRAM) namespace $(DESTDIR)$(bindir)
+	$(INSTALL_PROGRAM) moira $(DESTDIR)$(bindir)
+	rm -f $(DESTDIR)$(bindir)/listmaint
+	ln -s moira $(DESTDIR)$(bindir)/listmaint
+	rm -f $(DESTDIR)$(bindir)/dcmmaint
+	ln -s moira $(DESTDIR)$(bindir)/dcmmaint
+	rm -f $(DESTDIR)$(bindir)/usermaint
+	ln -s moira $(DESTDIR)$(bindir)/usermaint
 
 moira: $(MOBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(MOBJS) $(LIBS)

Modified: trunk/third/moira/clients/moira/acl.c
===================================================================
--- trunk/third/moira/clients/moira/acl.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/acl.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: acl.c,v 1.2 2000-03-15 22:44:01 rbasch Exp $
  *
  *	This is the file acl.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -20,7 +20,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/acl.c,v 1.2 2000-03-15 22:44:01 rbasch Exp $");
 
 void RealDeleteACL(char **info, Bool one_item);
 void ChangeACL(char **info, Bool one_item);

Modified: trunk/third/moira/clients/moira/attach.c
===================================================================
--- trunk/third/moira/clients/moira/attach.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/attach.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: attach.c,v 1.50 2000-08-03 21:49:13 zacheiss Exp $
  *
  *	This is the file attach.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -32,7 +32,7 @@
 #include <unistd.h>
 #endif /* HAVE_UNISTD_H */
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/attach.c,v 1.50 2000-08-03 21:49:13 zacheiss Exp $");
 
 char *canonicalize_cell(char *c);
 int GetAliasValue(int argc, char **argv, void *retval);

Modified: trunk/third/moira/clients/moira/cluster.c
===================================================================
--- trunk/third/moira/clients/moira/cluster.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/cluster.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: cluster.c,v 1.69 2008-04-22 17:44:37 zacheiss Exp $
  *
  *	This is the file cluster.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.

Modified: trunk/third/moira/clients/moira/dcmmaint.c
===================================================================
--- trunk/third/moira/clients/moira/dcmmaint.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/dcmmaint.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: dcmmaint.c,v 1.18 1998-03-10 21:09:34 danw Exp $
  *
  * DCM-related functions for Moira client
  *
@@ -18,7 +18,7 @@
 #include <string.h>
 #include <stdlib.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/dcmmaint.c,v 1.18 1998-03-10 21:09:34 danw Exp $");
 
 extern char *whoami;
 static char buf[BUFSIZ];

Modified: trunk/third/moira/clients/moira/defs.h
===================================================================
--- trunk/third/moira/clients/moira/defs.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/defs.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: defs.h,v 1.27 2007-12-03 20:40:56 zacheiss Exp $
  *
  *	This is the file defs.h for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.

Modified: trunk/third/moira/clients/moira/delete.c
===================================================================
--- trunk/third/moira/clients/moira/delete.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/delete.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: delete.c,v 1.29 1998-07-09 19:03:43 danw Exp $
  *
  *	This is the file delete.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -23,7 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/delete.c,v 1.29 1998-07-09 19:03:43 danw Exp $");
 
 int CheckListForDeletion(char *name, Bool verbose);
 void CheckAce(char *type, char *name, Bool verbose);

Modified: trunk/third/moira/clients/moira/f_defs.h
===================================================================
--- trunk/third/moira/clients/moira/f_defs.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/f_defs.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: f_defs.h,v 1.38 2007-11-29 18:09:07 zacheiss Exp $
  *
  *	This is the file f_defs.h for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.

Modified: trunk/third/moira/clients/moira/globals.c
===================================================================
--- trunk/third/moira/clients/moira/globals.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/globals.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: globals.c,v 1.11 1998-03-10 21:09:36 danw Exp $
  *
  *	This is the file globals.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -16,7 +16,7 @@
 #include <moira.h>
 #include "defs.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/globals.c,v 1.11 1998-03-10 21:09:36 danw Exp $");
 
 Bool verbose;			/* TRUE if verbose mode is active (default). */
 Bool found_some;		/* used by lists.c for determining if there

Modified: trunk/third/moira/clients/moira/globals.h
===================================================================
--- trunk/third/moira/clients/moira/globals.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/globals.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: globals.h,v 1.9 1998-03-10 21:09:36 danw Exp $
  *
  *	This is the file globals.h for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.

Modified: trunk/third/moira/clients/moira/lists.c
===================================================================
--- trunk/third/moira/clients/moira/lists.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/lists.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: lists.c,v 1.54 2004-11-22 19:24:18 zacheiss Exp $
  *
  *	This is the file lists.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -24,7 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/lists.c,v 1.54 2004-11-22 19:24:18 zacheiss Exp $");
 
 struct mqelem *GetListInfo(int type, char *name1, char *name2);
 char **AskListInfo(char **info, Bool name);

Modified: trunk/third/moira/clients/moira/main.c
===================================================================
--- trunk/third/moira/clients/moira/main.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/main.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: main.c,v 1.43 2006-08-23 19:02:27 zacheiss Exp $
  *
  *	This is the file main.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -26,7 +26,7 @@
 #include <unistd.h>
 #endif /* HAVE_UNISTD_H */
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/main.c,v 1.43 2006-08-23 19:02:27 zacheiss Exp $");
 
 static void ErrorExit(char *buf, int status);
 static void Usage(void);

Modified: trunk/third/moira/clients/moira/menu.c
===================================================================
--- trunk/third/moira/clients/moira/menu.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/menu.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: menu.c,v 1.59 2000-03-16 22:23:49 zacheiss Exp $
  *
  * Generic menu system module.
  *
@@ -34,7 +34,7 @@
 #define getpid _getpid
 #endif /* _WIN32 */
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/menu.c,v 1.59 2000-03-16 22:23:49 zacheiss Exp $");
 
 #ifdef MAX
 #undef MAX

Modified: trunk/third/moira/clients/moira/menu.h
===================================================================
--- trunk/third/moira/clients/moira/menu.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/menu.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$ */
+/* $Id: menu.h,v 1.5 1998-03-10 21:09:39 danw Exp $ */
 
 #define MAX_ARGC 16		/* Maximum argument count per line */
 #define MAX_ARGLEN 128		/* Maximum length of an argument */

Modified: trunk/third/moira/clients/moira/menus.c
===================================================================
--- trunk/third/moira/clients/moira/menus.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/menus.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: menus.c,v 1.47 2007-11-29 18:09:07 zacheiss Exp $
  *
  *	This is the file menus.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -22,7 +22,7 @@
 
 #include <stdio.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/menus.c,v 1.47 2007-11-29 18:09:07 zacheiss Exp $");
 
 /* ------------------------- Second Tier Menus ------------------------- */
 

Modified: trunk/third/moira/clients/moira/misc.c
===================================================================
--- trunk/third/moira/clients/moira/misc.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/misc.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: misc.c,v 1.12 2000-03-15 22:44:04 rbasch Exp $
  *
  *	This is the file misc.c for the Moira Client, which allows a naieve
  *      to quickly and easily maintain most parts of the Moira database.
@@ -34,7 +34,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/misc.c,v 1.12 2000-03-15 22:44:04 rbasch Exp $");
 
 void PrintStats(char **info);
 void PrintClients(char **info);

Modified: trunk/third/moira/clients/moira/namespace.c
===================================================================
--- trunk/third/moira/clients/moira/namespace.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/namespace.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: namespace.c,v 1.16 2006-08-23 19:02:27 zacheiss Exp $
  *
  *	This is the file main.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -25,7 +25,7 @@
 
 #include <krb.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/namespace.c,v 1.16 2006-08-23 19:02:27 zacheiss Exp $");
 
 static void ErrorExit(char *buf, int status);
 static void Usage(void);

Modified: trunk/third/moira/clients/moira/nfs.c
===================================================================
--- trunk/third/moira/clients/moira/nfs.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/nfs.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: nfs.c,v 1.26 1999-04-30 17:41:08 danw Exp $
  *
  *	This is the file nfs.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -23,7 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/nfs.c,v 1.26 1999-04-30 17:41:08 danw Exp $");
 
 char **AskNFSInfo(char **info);
 

Modified: trunk/third/moira/clients/moira/pobox.c
===================================================================
--- trunk/third/moira/clients/moira/pobox.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/pobox.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: pobox.c,v 1.39 2008-09-10 13:48:40 zacheiss Exp $
  *
  *	This is the file pobox.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -24,7 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/pobox.c,v 1.39 2008-09-10 13:48:40 zacheiss Exp $");
 
 /*	Function Name: PrintPOBox
  *	Description: Yet another specialized print function.
@@ -476,6 +476,12 @@
 		  return DM_NORMAL;
 		}
 	    }
+	  else if (!strcasecmp(type, "EXCHANGE"))
+	    {
+	      free(type);
+	      type = "EXCHANGE";
+	      box = "EXCHANGE.MIT.EDU";
+	    }
 	  else
 	    {
 	      sprintf(temp_buf, "Unknown local PO Box type %s", type);

Modified: trunk/third/moira/clients/moira/printer.c
===================================================================
--- trunk/third/moira/clients/moira/printer.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/printer.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: printer.c,v 1.28 2007-03-27 15:07:36 zacheiss Exp $
  *
  *	This is the file printer.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -23,7 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/printer.c,v 1.28 2007-03-27 15:07:36 zacheiss Exp $");
 
 void RealDeletePrn(char **info, Bool one_item);
 void ChangePrn(char **info, Bool one_item);

Modified: trunk/third/moira/clients/moira/quota.c
===================================================================
--- trunk/third/moira/clients/moira/quota.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/quota.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: quota.c,v 1.31 2003-09-22 20:44:16 zacheiss Exp $
  *
  *	This is the file quota.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.

Modified: trunk/third/moira/clients/moira/user.c
===================================================================
--- trunk/third/moira/clients/moira/user.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/user.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: user.c,v 1.74 2009-03-31 19:13:09 zacheiss Exp $
  *
  *	This is the file user.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -27,7 +27,7 @@
 
 #include <krb.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/user.c,v 1.74 2009-03-31 19:13:09 zacheiss Exp $");
 
 void CorrectCapitalization(char **name);
 char **AskUserInfo(char **info, Bool name);
@@ -42,9 +42,9 @@
 #define ID 4
 
 #ifdef ATHENA
-#define DEFAULT_SHELL "/bin/athena/tcsh"
+#define DEFAULT_SHELL "/bin/athena/bash"
 #else
-#define DEFAULT_SHELL "/bin/csh"
+#define DEFAULT_SHELL "/bin/bash"
 #endif
 #define DEFAULT_CLASS "?"
 
@@ -643,7 +643,7 @@
       FreeInfo(args);
       return DM_NORMAL;
     }
-  if (strcmp(potype, "POP") && strcmp(potype, "IMAP"))
+  if (strcmp(potype, "POP") && strcmp(potype, "IMAP") && strcmp(potype, "EXCHANGE"))
     {
       sprintf(temp_buf, "Unknown P.O. Box type.");
       Put_message(temp_buf);

Modified: trunk/third/moira/clients/moira/utils.c
===================================================================
--- trunk/third/moira/clients/moira/utils.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/utils.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: utils.c,v 1.51 2006-08-23 19:02:27 zacheiss Exp $
  *
  *	This is the file utils.c for the Moira Client, which allows users
  *      to quickly and easily maintain most parts of the Moira database.
@@ -34,7 +34,7 @@
 #include <string.h>
 #include <time.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/utils.c,v 1.51 2006-08-23 19:02:27 zacheiss Exp $");
 
 /*	Function Name: AddQueue
  *	Description: Adds an element to a queue

Modified: trunk/third/moira/clients/moira/zephyr.c
===================================================================
--- trunk/third/moira/clients/moira/zephyr.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/moira/zephyr.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: zephyr.c,v 1.13 2000-09-27 08:54:17 zacheiss Exp $
  *
  * Zephyr ACL routines for the Moira client
  *
@@ -18,7 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/zephyr.c,v 1.13 2000-09-27 08:54:17 zacheiss Exp $");
 
 void RealDeleteZephyr(char **info, Bool one_item);
 

Modified: trunk/third/moira/clients/mrcheck/Makefile.in
===================================================================
--- trunk/third/moira/clients/mrcheck/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mrcheck/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.6 2009-01-05 22:25:26 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) mrcheck $(bindir)
+	$(INSTALL_PROGRAM) mrcheck $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/mrcheck/mrcheck.c
===================================================================
--- trunk/third/moira/clients/mrcheck/mrcheck.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mrcheck/mrcheck.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mrcheck.c,v 1.22 2006-08-23 19:01:50 zacheiss Exp $
  *
  * Verify that all Moira updates are successful
  *
@@ -19,7 +19,7 @@
 
 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/mrcheck/mrcheck.c,v 1.22 2006-08-23 19:01:50 zacheiss Exp $");
 
 char *atot(char *itime);
 int process_server(int argc, char **argv, void *sqv);

Modified: trunk/third/moira/clients/mrtest/Makefile.in
===================================================================
--- trunk/third/moira/clients/mrtest/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mrtest/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.6 2009-01-05 22:25:28 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) mrtest $(bindir)
+	$(INSTALL_PROGRAM) mrtest $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/mrtest/mrtest.c
===================================================================
--- trunk/third/moira/clients/mrtest/mrtest.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mrtest/mrtest.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mrtest.c,v 1.52 2007-08-27 15:22:15 zacheiss Exp $
  *
  * Bare-bones Moira client
  *
@@ -43,7 +43,7 @@
 #include "readline/history.h"
 #endif
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/mrtest/mrtest.c,v 1.52 2007-08-27 15:22:15 zacheiss Exp $");
 
 int recursion = 0, quote_output = 0, interactive;
 int count, quit = 0, cancel = 0;

Modified: trunk/third/moira/clients/mrtest/scripts/users.sc
===================================================================
--- trunk/third/moira/clients/mrtest/scripts/users.sc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/mrtest/scripts/users.sc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -60,7 +60,7 @@
 
 qy _help uush
 qy gubl tested
-qy uush tested /bin/tcsh
+qy uush tested /bin/bash
 qy gubl tested
 
 qy _help uust

Modified: trunk/third/moira/clients/regapplet/Makefile
===================================================================
--- trunk/third/moira/clients/regapplet/Makefile	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/regapplet/Makefile	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile,v 1.1 2005-06-22 06:03:38 zacheiss Exp $
 
 SHELL=/bin/sh
 TARGET=regclasses.zip

Modified: trunk/third/moira/clients/regapplet/mit/cipher/ArrayUtil.java
===================================================================
--- trunk/third/moira/clients/regapplet/mit/cipher/ArrayUtil.java	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/regapplet/mit/cipher/ArrayUtil.java	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 // crib'd from cryptix
 
-// $Id$
+// $Id: ArrayUtil.java,v 1.1 1998-08-01 18:25:15 danw Exp $
 
 /*
  * Copyright (c) 1997 Systemics Ltd
@@ -21,7 +21,7 @@
  * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>.
  * <br>All rights reserved.
  * <p>
- * <b>$Revision$</b>
+ * <b>$Revision: 1.1 $</b>
  * @since   Cryptix 2.2.2
  * @author  Raif Naffah
  * @author  David Hopwood

Modified: trunk/third/moira/clients/regapplet/mit/cipher/BI.java
===================================================================
--- trunk/third/moira/clients/regapplet/mit/cipher/BI.java	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/regapplet/mit/cipher/BI.java	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-// $Id$
+// $Id: BI.java,v 1.1 1998-08-01 18:25:15 danw Exp $
 
 /*
  * Copyright (c) 1997 Systemics Ltd
@@ -20,7 +20,7 @@
  * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>.
  * <br>All rights reserved.
  * <p>
- * <b>$Revision$</b>
+ * <b>$Revision: 1.1 $</b>
  * @since   Cryptix 2.2.2
  * @author  Raif S. Naffah
  */

Modified: trunk/third/moira/clients/regapplet/mit/cipher/DES.java
===================================================================
--- trunk/third/moira/clients/regapplet/mit/cipher/DES.java	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/regapplet/mit/cipher/DES.java	2009-04-12 18:05:09 UTC (rev 23740)
@@ -61,7 +61,7 @@
  * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>.
  * <br>All rights reserved.
  * <p>
- * <b>$Revision$</b>
+ * <b>$Revision: 1.1 $</b>
  * @author  Systemics Ltd
  * @author  Geoffrey Keating (this Java implementation)
  * @author  Eric Young

Modified: trunk/third/moira/clients/regapplet/mit/cipher/Hex.java
===================================================================
--- trunk/third/moira/clients/regapplet/mit/cipher/Hex.java	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/regapplet/mit/cipher/Hex.java	2009-04-12 18:05:09 UTC (rev 23740)
@@ -21,7 +21,7 @@
  * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>.
  * <br>All rights reserved.
  *
- * <p><b>$Revision$</b>
+ * <p><b>$Revision: 1.1 $</b>
  * @author  David Hopwood
  * @author  Raif Naffah
  * @author  Systemics Ltd

Modified: trunk/third/moira/clients/regapplet/mit/cipher/RSAAlgorithm.java
===================================================================
--- trunk/third/moira/clients/regapplet/mit/cipher/RSAAlgorithm.java	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/regapplet/mit/cipher/RSAAlgorithm.java	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 // Crib'd from cryptix by JIS
 
-// $Id$
+// $Id: RSAAlgorithm.java,v 1.1 1998-08-01 18:25:19 danw Exp $
 
 /*
  * Copyright (c) 1997 Systemics Ltd
@@ -39,7 +39,7 @@
  * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>.
  * <br>All rights reserved.
  * <p>
- * <b>$Revision$</b>
+ * <b>$Revision: 1.1 $</b>
  * @author  Raif S. Naffah
  * @author  David Hopwood
  * @since   Cryptix 2.2.2

Modified: trunk/third/moira/clients/regapplet/mit/random/SHA1.java
===================================================================
--- trunk/third/moira/clients/regapplet/mit/random/SHA1.java	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/regapplet/mit/random/SHA1.java	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-// $Id$
+// $Id: SHA1.java,v 1.1 1998-08-01 18:25:30 danw Exp $
 
 /*
  * Copyright (c) 1995-1997 Systemics Ltd
@@ -35,7 +35,7 @@
  * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>.
  * <br>All rights reserved.
  * <p>
- * <b>$Revision$</b>
+ * <b>$Revision: 1.1 $</b>
  * @author Systemics Ltd
  * @author David Hopwood
  * @since  Cryptix 2.2.2

Modified: trunk/third/moira/clients/stanley/Makefile.in
===================================================================
--- trunk/third/moira/clients/stanley/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/stanley/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 2009-01-05 22:25:29 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) stanley $(bindir)
+	$(INSTALL_PROGRAM) stanley $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/stanley/stanley.c
===================================================================
--- trunk/third/moira/clients/stanley/stanley.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/stanley/stanley.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -21,7 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/stanley/stanley.c,v 1.16 2009-03-31 19:13:10 zacheiss Exp $");
 
 struct owner_type {
   int type;
@@ -342,7 +342,7 @@
       if (shell)
 	argv[U_SHELL] = shell;
       else
-	argv[U_SHELL] = "/bin/athena/tcsh";
+	argv[U_SHELL] = "/bin/athena/bash";
       if (winshell)
 	argv[U_WINCONSOLESHELL] = winshell;
       else

Modified: trunk/third/moira/clients/stella/Makefile.in
===================================================================
--- trunk/third/moira/clients/stella/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/stella/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 2009-01-05 22:25:31 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -40,7 +40,7 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) stella $(bindir)
+	$(INSTALL_PROGRAM) stella $(DESTDIR)$(bindir)
 
 $(TARGET): $(OBJS) ../lib/libmrclient.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)

Modified: trunk/third/moira/clients/stella/stella.c
===================================================================
--- trunk/third/moira/clients/stella/stella.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/clients/stella/stella.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -31,7 +31,7 @@
 #include <arpa/inet.h>
 #endif
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/stella/stella.c,v 1.20 2003-12-20 02:55:49 zacheiss Exp $");
 
 struct owner_type {
   int type;

Modified: trunk/third/moira/configure
===================================================================
--- trunk/third/moira/configure	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/configure	2009-04-12 18:05:09 UTC (rev 23740)
@@ -4119,8 +4119,8 @@
 
 
 
-    WINAD_SUBDIRS="winad"
-    WINAD_OUTPUT_FILES="incremental/winad/Makefile"
+    WINAD_SUBDIRS="winad ldap"
+    WINAD_OUTPUT_FILES="incremental/winad/Makefile incremental/ldap/Makefile"
 fi
 
 

Modified: trunk/third/moira/configure.in
===================================================================
--- trunk/third/moira/configure.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/configure.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -307,8 +307,8 @@
     fi
     MR_DEFINE(HAVE_LDAP)
 
-    WINAD_SUBDIRS="winad"
-    WINAD_OUTPUT_FILES="incremental/winad/Makefile"
+    WINAD_SUBDIRS="winad ldap"
+    WINAD_OUTPUT_FILES="incremental/winad/Makefile incremental/ldap/Makefile"
 fi
 AC_SUBST(LDAP_CPPFLAGS)
 AC_SUBST(LDAP_LIBS)

Modified: trunk/third/moira/db/Makefile.in
===================================================================
--- trunk/third/moira/db/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/db/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 1999-07-12 16:21:01 danw Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@

Modified: trunk/third/moira/db/doschema.awk
===================================================================
--- trunk/third/moira/db/doschema.awk	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/db/doschema.awk	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: doschema.awk,v 1.2 1998-04-15 03:00:15 danw Exp $
 #
 # Build moira_schema.c and .h from the schema.sql file
 # It knows which one to build cased on whether or not its input is

Modified: trunk/third/moira/dbck/Makefile.in
===================================================================
--- trunk/third/moira/dbck/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.8 2009-01-05 22:25:33 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -52,8 +52,8 @@
 depend: $(CFILES)
 
 install:
-	$(INSTALL_PROGRAM) dbck $(mrbindir)
-	$(INSTALL_PROGRAM) members $(mrbindir)
+	$(INSTALL_PROGRAM) dbck $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) members $(DESTDIR)$(mrbindir)
 
 dbck: $(DBCK_OBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(DBCK_OBJS) $(LIBS)

Modified: trunk/third/moira/dbck/dbck.h
===================================================================
--- trunk/third/moira/dbck/dbck.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/dbck.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Header$
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/dbck.h,v 1.17 2007-12-03 21:22:59 zacheiss Exp $
  *
  * Declarations for Moira database consistancy checker
  *

Modified: trunk/third/moira/dbck/dbck.pc
===================================================================
--- trunk/third/moira/dbck/dbck.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/dbck.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: dbck.pc,v 1.8 2005-09-20 22:03:18 zacheiss Exp $
  *
  * Moira database consistency checker
  *
@@ -18,7 +18,7 @@
 EXEC SQL INCLUDE sqlca;
 EXEC SQL INCLUDE sqlda;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/dbck.pc,v 1.8 2005-09-20 22:03:18 zacheiss Exp $");
 
 int debug = 0;
 int mode = MODE_ASK;

Modified: trunk/third/moira/dbck/fix.pc
===================================================================
--- trunk/third/moira/dbck/fix.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/fix.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: fix.pc,v 1.3 1998-02-05 22:51:02 danw Exp $
  *
  * User interface routines for dbck (Moira database consistency checker)
  *
@@ -16,7 +16,7 @@
 EXEC SQL INCLUDE sqlca;  /* SQL Communications Area */
 EXEC SQL INCLUDE sqlda;  /* SQL Descriptor Area */
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/fix.pc,v 1.3 1998-02-05 22:51:02 danw Exp $");
 
 EXEC SQL BEGIN DECLARE SECTION;
 char *_table;

Modified: trunk/third/moira/dbck/members.pc
===================================================================
--- trunk/third/moira/dbck/members.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/members.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Header$
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/members.pc,v 1.4 2002-08-14 14:01:21 zacheiss Exp $
  */
 
 #include <stdio.h>

Modified: trunk/third/moira/dbck/phase1.pc
===================================================================
--- trunk/third/moira/dbck/phase1.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/phase1.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: phase1.pc,v 1.16 2008-08-22 17:49:11 zacheiss Exp $
  *
  * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -14,7 +14,7 @@
 #include <string.h>
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/phase1.pc,v 1.16 2008-08-22 17:49:11 zacheiss Exp $");
 
 EXEC SQL WHENEVER SQLERROR DO dbmserr();
 int show_user_id(void *user);

Modified: trunk/third/moira/dbck/phase2.pc
===================================================================
--- trunk/third/moira/dbck/phase2.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/phase2.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: phase2.pc,v 1.24 2008-08-22 17:49:11 zacheiss Exp $
  *
  * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -15,7 +15,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/phase2.pc,v 1.24 2008-08-22 17:49:11 zacheiss Exp $");
 
 EXEC SQL WHENEVER SQLERROR DO dbmserr();
 

Modified: trunk/third/moira/dbck/phase3.pc
===================================================================
--- trunk/third/moira/dbck/phase3.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/phase3.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: phase3.pc,v 1.4 1998-02-05 22:51:05 danw Exp $
  *
  * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -11,7 +11,7 @@
 
 #include <stdio.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/phase3.pc,v 1.4 1998-02-05 22:51:05 danw Exp $");
 
 void empty_list_check(int id, void *list, void *hint);
 void unref_string_check(int id, void *string, void *hint);

Modified: trunk/third/moira/dbck/phase4.pc
===================================================================
--- trunk/third/moira/dbck/phase4.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dbck/phase4.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: phase4.pc,v 1.6 2005-09-20 22:03:19 zacheiss Exp $
  *
  * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -15,7 +15,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dbck/phase4.pc,v 1.6 2005-09-20 22:03:19 zacheiss Exp $");
 
 EXEC SQL WHENEVER SQLERROR DO dbmserr();
 

Modified: trunk/third/moira/dcm/Makefile.in
===================================================================
--- trunk/third/moira/dcm/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dcm/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.8 2009-01-05 22:25:34 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -54,8 +54,8 @@
 depend: $(CFILES)
 
 install:
-	$(INSTALL_PROGRAM) dcm $(mrbindir)
-	$(INSTALL_PROGRAM) startdcm $(mrbindir)
+	$(INSTALL_PROGRAM) dcm $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) startdcm $(DESTDIR)$(mrbindir)
 
 dcm: $(DCM_OBJS) $(UPDATE_OBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(DCM_OBJS) $(UPDATE_OBJS) $(SQL_LIBS) $(LIBS)

Modified: trunk/third/moira/dcm/dcm.pc
===================================================================
--- trunk/third/moira/dcm/dcm.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dcm/dcm.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: dcm.pc,v 1.17 2006-08-22 17:36:24 zacheiss Exp $
  *
  * The Data Control Manager for Moira.
  *
@@ -27,7 +27,7 @@
 EXEC SQL INCLUDE sqlca;
 void sqlglm(char *, unsigned int *, unsigned int *);
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dcm/dcm.pc,v 1.17 2006-08-22 17:36:24 zacheiss Exp $");
 
 int generate_service(char *name, int force);
 void do_hosts(char *service);

Modified: trunk/third/moira/dcm/startdcm.c
===================================================================
--- trunk/third/moira/dcm/startdcm.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/dcm/startdcm.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: startdcm.c,v 1.12 1998-02-05 22:51:07 danw Exp $
  *
  * This program starts the DCM in a "clean" environment.
  * and then waits for it to exit.
@@ -22,7 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/dcm/startdcm.c,v 1.12 1998-02-05 22:51:07 danw Exp $");
 
 #define PROG 	"dcm"
 

Modified: trunk/third/moira/debian/changelog
===================================================================
--- trunk/third/moira/debian/changelog	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/debian/changelog	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,3 +1,11 @@
+debathena-moira (4.0.0+cvs20090409-0debathena1) unstable; urgency=low
+
+  * New CVS snapshot (Trac: #195)
+  * Drop patches that have been incorporated upstream.
+  * Update to build without krb4 on systems that no longer have it.
+
+ -- Evan Broder <broder@mit.edu>  Sun, 12 Apr 2009 14:03:22 -0400
+
 debathena-moira (4.0.0+cvs20080830-0debathena2) unstable; urgency=low
 
   * Remove DEB_AUTO_UPDATE_DEBIAN_CONTROL.

Modified: trunk/third/moira/debian/rules
===================================================================
--- trunk/third/moira/debian/rules	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/debian/rules	2009-04-12 18:05:09 UTC (rev 23740)
@@ -2,9 +2,15 @@
 
 include /usr/share/cdbs/1/rules/debhelper.mk
 include /usr/share/cdbs/1/class/autotools.mk
-include /usr/share/cdbs/1/rules/patchsys-quilt.mk
 
-DEB_CONFIGURE_EXTRA_FLAGS += --with-krb4=$(shell krb5-config --prefix krb4) --with-krb5 --with-hesiod --with-zephyr --with-com_err=/usr --without-oracle --without-afs
+KRB5_VERSION=$(shell dpkg-query -W -f '$${Version}\n' libkrb5-dev)
+ifeq (yes,$(shell dpkg --compare-versions '$KRB5_VERSION' lt '1.6.dfsg.4~beta1-7' && echo yes))
+    DEB_CONFIGURE_EXTRA_FLAGS += --with-krb4=$(shell krb5-config --prefix krb4)
+else
+    DEB_CONFIGURE_EXTRA_FLAGS += --without-krb4
+endif
+
+DEB_CONFIGURE_EXTRA_FLAGS += --with-krb5 --with-hesiod --with-zephyr --with-com_err=/usr --without-oracle --without-afs
 DEB_DH_INSTALL_SOURCEDIR = $(DEB_DESTDIR)
 
 common-install-impl::

Modified: trunk/third/moira/gen/Makefile.in
===================================================================
--- trunk/third/moira/gen/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.54 2009-02-18 00:55:00 jweiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -30,22 +30,24 @@
 LIB_CFILES=genacl.c
 LIB_TARGET=libdcm.a
 
-OBJS=	acl.o boot.o confluence.o dhcp.o directory.o events.o hesiod.o \
-	hosts.o lpcaccess.o mailhub.o ndb.o network.o nfs.o pobox.o \
-	postoffice.o print.o winad.o www.o zephyr.o
+OBJS=	acl.o boot.o confluence.o cups-print.o dhcp.o directory.o events.o \
+	hesiod.o hosts.o lpcaccess.o mailhub.o ndb.o network.o nfs.o pobox.o \
+	postoffice.o print.o warehouse-lists.o winad.o www.o zephyr.o
 
-CFILES= acl.c boot.c confluence.c dhcp.c directory.c events.c hesiod.c \
-	hosts.c lpcaccess.c mailhub.c ndb.c network.c nfs.c pobox.c \
-	 postoffice.c print.c winad.c www.c zephyr.c
+CFILES= acl.c boot.c confluence.c cups-print.c dhcp.c directory.c events.c \
+	hesiod.c hosts.c lpcaccess.c mailhub.c ndb.c network.c nfs.c pobox.c \
+	postoffice.c print.c warehouse-lists.c winad.c www.c zephyr.c
 
-TARGET=	acl.gen boot.gen confluence.gen dhcp.gen directory.gen events.gen \
-	hesiod.gen hosts.gen lpcaccess.gen mailhub.gen ndb.gen network.gen \
-	nfs.gen pobox.gen postoffice.gen print.gen winad.gen www.gen zephyr.gen
+TARGET=	acl.gen boot.gen confluence.gen cups-print.gen dhcp.gen directory.gen \
+	events.gen hesiod.gen hosts.gen lpcaccess.gen mailhub.gen ndb.gen \
+	network.gen nfs.gen pobox.gen postoffice.gen print.gen \
+	warehouse-lists.gen winad.gen www.gen zephyr.gen
 
 SCRIPTS=access.gen access.sh acl.sh aliases.sh boot.sh ca.gen calendar.gen \
-	dhcp.sh events.sh hesiod.sh ip-billing.gen \
+	cups-print.sh dhcp.sh events.sh hesiod.sh ip-billing.gen \
 	ip-billing.sh ldap.gen longjobs.gen longjobs.sh mailhosts.gen \
-	mailhub.sh mailman.gen mailman.sh nagios-colo.gen nagios-colo.sh \
+	mailhub.sh mailman.gen mailman.sh nagios-cluster.gen \
+	nagios-cluster.sh nagios-colo.gen nagios-colo.sh \
 	nagios-printers.gen nagios-printers.sh nagios-wsh.gen nagios-wsh.sh \
 	ndb.sh nfs.sh null.sh postoffice.sh print.sh rt.sh sapprint.gen \
 	sapprint.sh spwatch.gen tsm.gen tsm.sh warehouse.gen warehouse.sh \
@@ -71,8 +73,8 @@
 depend: $(LIB_CFILES) $(CFILES)
 
 install:
-	@set -x; for p in $(TARGET); do $(INSTALL_PROGRAM) $$p $(mrbindir); done
-	@set -x; for p in $(SCRIPTS); do $(INSTALL) -m 755 $$p $(mrbindir); done
+	@set -x; for p in $(TARGET); do $(INSTALL_PROGRAM) $$p $(DESTDIR)$(mrbindir); done
+	@set -x; for p in $(SCRIPTS); do $(INSTALL) -m 755 $$p $(DESTDIR)$(mrbindir); done
 
 libdcm.a: $(LIB_OBJS)
 	ar cru $@ $(LIB_OBJS)
@@ -140,3 +142,9 @@
 
 lpcaccess.gen: lpcaccess.o libdcm.a $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) lpcaccess.o libdcm.a $(SQL_LIBS) $(LIBS)
+
+warehouse-lists.gen: warehouse-lists.o libdcm.a $(MR_LIBDEP)
+	$(CC) -o $@ $(LDFLAGS) warehouse-lists.o libdcm.a $(SQL_LIBS) $(LIBS)
+
+cups-print.gen: cups-print.o libdcm.a $(MR_LIBDEP)
+	$(CC) -o $@ $(LDFLAGS) cups-print.o libdcm.a $(SQL_LIBS) $(LIBS)

Modified: trunk/third/moira/gen/access.gen
===================================================================
--- trunk/third/moira/gen/access.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/access.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: access.gen,v 1.1 2003-10-21 18:35:48 zacheiss Exp $
 
 use DBI;
 

Modified: trunk/third/moira/gen/access.sh
===================================================================
--- trunk/third/moira/gen/access.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/access.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/access.sh,v 1.1 2003-10-21 18:35:48 zacheiss Exp $
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/etc:/usr/etc:/usr/athena/bin:/usr/local/bin
 export PATH

Modified: trunk/third/moira/gen/acl.pc
===================================================================
--- trunk/third/moira/gen/acl.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/acl.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: acl.pc,v 1.5 2005-12-28 21:38:00 zacheiss Exp $
  *
  * This generates acl files for various servers.
  *
@@ -23,7 +23,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/acl.pc,v 1.5 2005-12-28 21:38:00 zacheiss Exp $");
 
 char *whoami = "acl.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/acl.sh
===================================================================
--- trunk/third/moira/gen/acl.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/acl.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: acl.sh,v 1.6 2005-12-28 21:42:14 zacheiss Exp $
 if [ -d /var/athena ] && [ -w /var/athena ]; then
     exec >/var/athena/moira_update.log 2>&1
 else 

Modified: trunk/third/moira/gen/aliases.sh
===================================================================
--- trunk/third/moira/gen/aliases.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/aliases.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -24,4 +24,4 @@
 rm -f $0
 exit 0
 
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/aliases.sh,v 1.8 2000-05-29 22:17:58 zacheiss Exp $

Modified: trunk/third/moira/gen/boot.pc
===================================================================
--- trunk/third/moira/gen/boot.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/boot.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: boot.pc,v 1.8 2008-11-20 16:30:06 zacheiss Exp $
  *
  * This generates the bootptab and associated files.
  *
@@ -22,7 +22,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/boot.pc,v 1.8 2008-11-20 16:30:06 zacheiss Exp $");
 
 char *whoami = "boot.gen";
 char *db = "moira/moira";
@@ -58,13 +58,14 @@
   EXEC SQL WHENEVER SQLERROR DO sqlerr();
 
   /* Get print spoolers for allow lists. */
-  EXEC SQL SELECT COUNT(service) INTO :alcount FROM serverhosts
-    WHERE service = 'PRINT';
+  EXEC SQL SELECT COUNT(service) INTO :alcount FROM serverhosts sh
+    WHERE sh.service = 'PRINT' or sh.service = 'CUPS-PRINT';
   allowlist = malloc(alcount * sizeof(*allowlist));
 
   EXEC SQL DECLARE csr_spool CURSOR FOR
     SELECT m.address, sh.value3 FROM machine m, serverhosts sh
-    WHERE m.mach_id = sh.mach_id AND sh.service = 'PRINT';
+    WHERE m.mach_id = sh.mach_id AND 
+    (sh.service = 'PRINT' OR sh.service = 'CUPS-PRINT');
   EXEC SQL OPEN csr_spool;
   for (i = 0; i < alcount; i++)
     {

Modified: trunk/third/moira/gen/boot.sh
===================================================================
--- trunk/third/moira/gen/boot.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/boot.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# $Id$
+# $Id: boot.sh,v 1.3 2000-05-08 18:30:30 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/ca.gen
===================================================================
--- trunk/third/moira/gen/ca.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/ca.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: ca.gen,v 1.3 2006-05-11 16:55:28 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/calendar.gen
===================================================================
--- trunk/third/moira/gen/calendar.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/calendar.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: calendar.gen,v 1.3 2002-08-22 20:45:30 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT withh the
 # error codes the library uses:

Modified: trunk/third/moira/gen/confluence.pc
===================================================================
--- trunk/third/moira/gen/confluence.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/confluence.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: confluence.pc,v 1.1 2007-11-15 22:09:20 zacheiss Exp $
  *
  * (c) Copyright 2007 by the Massachusetts Institute of Technology.
  */

Added: trunk/third/moira/gen/confluence.sh
===================================================================
--- trunk/third/moira/gen/confluence.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/confluence.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,27 @@
+#!/bin/sh
+# $Id: confluence.sh,v 1.1 2009-03-12 21:17:25 zacheiss Exp $
+
+if [ -d /var/athena ] && [ -w /var/athena ]; then
+    exec >/var/athena/moira_update.log 2>&1
+else 
+    exec >/tmp/moira_update.log 2>&1
+fi
+
+# The following exit codes are defined and MUST BE CONSISTENT with the
+# error codes the library uses:
+MR_MISSINGFILE=47836473
+
+PATH="/etc:/bin:/usr/bin:/usr/etc:/usr/athena/etc"
+OUTFILE=/var/local/moira-feed/groups
+
+# Alert if the output file doesn't exist
+test -r $OUTFILE || exit $MR_MISSINGFILE
+
+# Set the perms usefully
+chgrp www $OUTFILE
+chmod g+r $OUTFILE
+
+# cleanup
+test -f $0 && rm -f $0
+
+exit 0


Property changes on: trunk/third/moira/gen/confluence.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/third/moira/gen/cups-print.pc
===================================================================
--- trunk/third/moira/gen/cups-print.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/cups-print.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,494 @@
+/* $Id: cups-print.pc,v 1.7 2008-12-10 20:48:48 zacheiss Exp $
+ *
+ * This generates printcaps and other files for Athena print servers
+ *
+ * Copyright (C) 1992-1998 by the Massachusetts Institute of Technology.
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
+ */
+
+#include <mit-copyright.h>
+#include <moira.h>
+#include <moira_site.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <time.h>
+#include <krb.h>
+#include <krb5.h>
+
+#include "util.h"
+
+
+
+EXEC SQL INCLUDE sqlca;
+
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/cups-print.pc,v 1.7 2008-12-10 20:48:48 zacheiss Exp $");
+
+char *whoami = "cups-print.gen";
+char *db = "moira/moira";
+
+/* OMG, I hate this, but it's cleaner, I guess? */
+
+const char *alterjob = "<Limit Hold-Job Release-Job\
+ Restart-Job Purge-Jobs Reprocess-Job Set-Job-Attributes\
+ Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>";
+const char *submitjob = "<Limit Create-Job Print-Job Print-URI Send-Document\
+ Set-Job-Attributes Send-URI Create-Job-Subscription Renew-Subscription\
+ Cancel-Subscription Get-Notifications CUPS-Move-Job>";
+const char *alterpntr = "<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer\
+ CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>";
+const char *lpcpntr = "<Limit Pause-Printer Resume-Printer Enable-Printer\
+ Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs\
+ Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer\
+ Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After\
+ CUPS-Accept-Jobs CUPS-Reject-Jobs>";
+const char *canceljob = "<Limit Cancel-Job CUPS-Authenticate-Job>";
+const char *catchall = "<Limit All>";
+
+void do_host(char *host);
+void sqlerr(void);
+#ifndef MAX
+#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
+#endif
+
+int main(int argc, char **argv)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  char name[MACHINE_NAME_SIZE];
+  EXEC SQL END DECLARE SECTION;
+
+  init_acls();
+
+  EXEC SQL CONNECT :db;
+
+  EXEC SQL WHENEVER SQLERROR DO sqlerr();
+
+  EXEC SQL DECLARE csr_hosts CURSOR FOR
+    SELECT m.name FROM machine m, serverhosts sh
+    WHERE m.mach_id = sh.mach_id AND sh.service = 'CUPS-PRINT' AND sh.enable = 1;
+  EXEC SQL OPEN csr_hosts;
+  while (1)
+    {
+      EXEC SQL FETCH csr_hosts INTO :name;
+      if (sqlca.sqlcode)
+	break;
+
+      strtrim(name);
+      do_host(name);
+    }
+  EXEC SQL CLOSE csr_hosts;
+
+  exit(MR_SUCCESS);
+}
+
+void printer_user_list(FILE *out, char *type, int id, char *str)
+{
+  struct save_queue *sq;
+  struct imember *m;
+
+  sq = get_acl(type, id, NULL);
+  while (sq_remove_data(sq, &m))
+    {
+      if (m->type == 'U')
+        fprintf(out, "%s %s\n", str, m->name);
+      freeimember(m);
+    }
+  sq_destroy(sq);
+}
+
+
+
+void do_host(char *host)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  char rp[PRINTERS_RP_SIZE], name[PRINTERS_NAME_SIZE];
+  char duplexname[PRINTERS_DUPLEXNAME_SIZE], location[PRINTERS_LOCATION_SIZE];
+  char hwtype[PRINTERS_HWTYPE_SIZE], lowerhwtype[PRINTERS_HWTYPE_SIZE];
+  char modtime[PRINTERS_MODTIME_SIZE], lmodtime[LIST_MODTIME_SIZE];
+  char contact[PRINTERS_CONTACT_SIZE], hostname[MACHINE_NAME_SIZE];
+  char cupshosts[MACHINE_NAME_SIZE], prtype [PRINTERS_TYPE_SIZE];
+  char *spoolhost = host, *unixtime_fmt = UNIXTIME_FMT, *p;
+  char *lhost;
+  int ka, pc, ac, lpc_acl, top_lpc_acl, banner, rm;
+  EXEC SQL END DECLARE SECTION;
+  TARFILE *tf;
+  FILE *out;
+  char filename[MAXPATHLEN], *duptc;
+  time_t mtime, now = time(NULL);
+
+  lhost = (char *) strdup (host);
+  for (p = lhost; *p; p++)
+     *p = tolower(*p);
+
+  EXEC SQL SELECT mach_id INTO :rm FROM machine
+    WHERE name = :spoolhost;
+
+  sprintf(filename, "%s/cups-print/%s", DCM_DIR, host);
+  tf = tarfile_open(filename);
+
+  /* printers.conf */
+  out = tarfile_start(tf, "/etc/cups/printers.conf", 0644, 0, 0,
+		      "root", "lp", now);
+
+  EXEC SQL DECLARE csr_printers CURSOR FOR
+    SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype,
+    m.name, pr.banner, pr.location, pr.contact, pr.ka,
+    pr.ac
+    FROM printers pr, machine m
+    WHERE pr.rm = :rm AND m.mach_id = pr.mach_id
+    AND pr.type != 'ALIAS';
+  EXEC SQL OPEN csr_printers;
+  while (1)
+    {
+      EXEC SQL FETCH csr_printers INTO :rp, :name, :duplexname,
+	:hwtype, :hostname, :banner, :location, :contact, :ka, :ac;
+      if (sqlca.sqlcode)
+	break;
+
+      strtrim(rp);
+      strtrim(name);
+      strtrim(duplexname);
+      strtrim(hwtype);
+      strtrim(hostname);
+      strtrim(location);
+      strtrim(contact);
+      strcpy(lowerhwtype, hwtype);
+      for (p = lowerhwtype; *p; p++)
+	*p = tolower(*p);
+
+      fprintf(out, "<Printer %s>\n",rp);
+      fprintf(out, "Info %s:%s\n", rp, hwtype);
+      /* Note the use of "beh" to keep the CUPS from disabling print queues
+       * should they not respond versus discarding the job.  
+       * See the "beh" page for details.  
+       * The 1/0/60 says "don't disable/try 20 times/try every 60s */
+      if (!strncmp(hwtype, "HP", 2)) 
+	  fprintf(out, "DeviceURI beh:/1/20/60/socket://%s:9100\n", hostname);
+      else
+	  fprintf(out, "DeviceURI beh:/1/20/60/socket://%s\n", hostname);
+      fprintf(out, "State Idle\n");	// Always with the Idle
+      fprintf(out, "StateTime %ld\n", (long)time(NULL));
+      fprintf(out, "Accepting Yes\n");
+      fprintf(out, "Shared Yes\n");
+      fprintf(out, "QuotaPeriod 0\n");
+      fprintf(out, "PageLimit 0\n");
+      fprintf(out, "Klimit 0\n");
+      fprintf(out, "Option sides one-sided\n");
+      if (location[0])
+        fprintf(out, "Location %s\n", location);
+      fprintf(out, "ErrorPolicy abort-job\n");
+      if (! ka || ! lpc_acl)
+        fprintf(out, "OpPolicy default\n");
+      else
+   	fprintf(out, "OpPolicy %s-policy\n", rp);
+
+      /* Access-control list. */
+      if (ac)
+        {
+          if (ka)
+   	    fprintf(out, "AuthType Negotiate\n");
+	  else
+   	    fprintf(out, "AuthType Negotiate\n");
+          printer_user_list(out, "LIST", ac, "AllowUser");
+        }
+
+      if (banner == PRN_BANNER_NONE)
+	fprintf(out, "JobSheets none none\n");
+      else 
+	fprintf(out, "JobSheets athena none\n");
+      fprintf(out, "</Printer>\n");
+
+    }
+  EXEC SQL CLOSE csr_printers;
+  tarfile_end(tf);
+
+
+  /* aliases are in classes.conf */
+  out = tarfile_start(tf, "/etc/cups/classes.conf", 0644, 0, 0,
+		      "root", "root", now);
+  EXEC SQL DECLARE csr_duplexqs CURSOR FOR
+    SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype,
+    m.name, pr.banner, pr.location, pr.contact, pr.ka, 
+    pr.type as prtype, pr.ac
+    FROM printers pr, machine m
+    WHERE pr.rm = :rm AND m.mach_id = pr.mach_id;
+  EXEC SQL OPEN csr_duplexqs;
+  while (1)
+    {
+      EXEC SQL FETCH csr_duplexqs INTO :rp, :name, :duplexname,
+	:hwtype, :hostname, :banner, :location, :contact, :ka, :prtype, :ac;
+      if (sqlca.sqlcode)
+	break;
+
+      strtrim(hwtype);
+      strtrim(rp);
+      strtrim(location);
+      strtrim(contact);
+      strtrim(prtype);
+
+      /* Define alias queues as classes to the regular queues for
+       * accounting reasons.  Annoyingly, classes don't always inherit
+       * their printer definitions.
+      */
+      if (!strcmp(prtype,"ALIAS")) 
+	{
+          strtrim(name);
+          fprintf(out, "<Class %s>\n",name);
+          fprintf(out, "Info Alias Queue to %s:%s\n", rp, hwtype);
+          fprintf(out, "Printer %s\n", rp);
+          fprintf(out, "Option sides one-sided\n");
+          fprintf(out, "State Idle\n");     // Always with the Idle
+          fprintf(out, "StateTime %ld\n", (long)time(NULL));
+          fprintf(out, "Accepting Yes\n");
+          fprintf(out, "Shared Yes\n");
+          fprintf(out, "QuotaPeriod 0\n");
+          fprintf(out, "PageLimit 0\n");
+          if (location[0])
+            fprintf(out, "Location %s\n", location);
+          fprintf(out, "ErrorPolicy abort-job\n");
+          if (! ka || ! lpc_acl)
+            fprintf(out, "OpPolicy default\n");
+          else
+       	    fprintf(out, "OpPolicy %s-policy\n", rp);
+    
+          /* Access-control list. */
+          if (ac)
+            {
+              if (ka)
+       	        fprintf(out, "AuthType Negotiate\n");
+    	      else
+       	        fprintf(out, "AuthType Negotiate\n");
+              printer_user_list(out, "LIST", ac, "AllowUser");
+            }
+    
+          if (banner == PRN_BANNER_NONE)
+    	    fprintf(out, "JobSheets none none\n");
+          else 
+    	    fprintf(out, "JobSheets athena none\n");
+          fprintf(out, "</Class>\n");
+      }
+
+      /* Define duplex queues as aliases to the regular queues for
+       * accounting reasons.  Annoyingly, classes don't always inherit
+       * their printer definitions.
+      */
+      if (*duplexname)
+	{
+          strtrim(duplexname);
+          fprintf(out, "<Class %s>\n",duplexname);
+          if (!strcmp(prtype,"ALIAS")) 
+            fprintf(out, "Info Duplex Alias Queue to %s:%s\n", rp, hwtype);
+	  else
+            fprintf(out, "Info Duplex Queue for %s:%s\n", rp, hwtype);
+	  fprintf(out, "Option sides two-sided-long-edge\n");	// duplex
+          fprintf(out, "Printer %s\n", rp);
+          fprintf(out, "State Idle\n");     // Always with the Idle
+          fprintf(out, "StateTime %ld\n", (long)time(NULL));
+          fprintf(out, "Accepting Yes\n");
+          fprintf(out, "Shared Yes\n");
+          fprintf(out, "QuotaPeriod 0\n");
+          fprintf(out, "PageLimit 0\n");
+          if (location[0])
+            fprintf(out, "Location %s\n", location);
+          fprintf(out, "ErrorPolicy abort-job\n");
+          if (! ka || ! lpc_acl)
+            fprintf(out, "OpPolicy default\n");
+          else
+       	    fprintf(out, "OpPolicy %s-policy\n", rp);
+    
+          /* Access-control list. */
+          if (ac)
+            {
+              if (ka)
+       	        fprintf(out, "AuthType Negotiate\n");
+    	      else
+       	        fprintf(out, "AuthType Negotiate\n");
+              printer_user_list(out, "LIST", ac, "AllowUser");
+            }
+    
+          if (banner == PRN_BANNER_NONE)
+    	    fprintf(out, "JobSheets none none\n");
+          else if (banner == PRN_BANNER_LAST)
+    	    fprintf(out, "JobSheets athena none\n");
+          fprintf(out, "</Class>\n");
+	}
+    }
+  EXEC SQL CLOSE csr_duplexqs;
+  tarfile_end(tf);
+
+  /* cups.conf */
+  out = tarfile_start(tf, "/etc/cups/cupsd.conf", 0755, 1, 1,
+		      "root", "lp", now);
+
+  fprintf(out, "LogLevel info\n");
+  fprintf(out, "SystemGroup sys root ops-group\n");
+  fprintf(out, "Port 631\n");
+  fprintf(out, "Listen /var/run/cups/cups.sock\n");
+  fprintf(out, "Browsing On\n");
+  fprintf(out, "BrowseOrder allow,deny\n");
+  fprintf(out, "BrowseAllow all\n");
+  fprintf(out, "BrowseAddress @LOCAL\n");
+  fprintf(out, "DefaultAuthType Negotiate\n");
+  fprintf(out, "ServerCertificate /etc/cups/ssl/%s-ipp-crt.pem\n", lhost);
+  fprintf(out, "ServerKey /etc/cups/ssl/%s-ipp-key.pem\n", lhost);
+  fprintf(out, "ServerName %s\n", lhost);
+  fprintf(out, "Krb5Keytab /etc/krb5-ipp.keytab\n");
+  fprintf(out, "Browsing On\n");
+  fprintf(out, "BrowseProtocols cups\n");
+
+  /* The other CUPS servers should be aware of the other hosts'
+     queues, so we'll let them browse each other. */
+
+  EXEC SQL DECLARE csr_cupshosts CURSOR FOR
+    SELECT m.name AS cupshosts FROM machine m, printservers ps
+    WHERE m.mach_id = ps.mach_id AND ps.kind = 'CUPS';
+  EXEC SQL OPEN csr_cupshosts;
+  while (1)
+    {
+      EXEC SQL FETCH csr_cupshosts INTO :cupshosts;
+      if (sqlca.sqlcode)
+	break;
+
+      strtrim(cupshosts);
+
+      /* Don't poll yourself looking for answers! */
+      if (strcmp(cupshosts,host))
+         fprintf(out, "BrowsePoll %s\n", cupshosts);
+    }
+  EXEC SQL CLOSE csr_cupshosts;
+  fprintf(out, "Include cups.locations.conf\n");
+  fprintf(out, "Include cups.policies.conf\n");
+
+  tarfile_end(tf);
+
+  /* cups.policies.conf */
+  out = tarfile_start(tf, "/etc/cups/cups.policies.conf", 0755, 1, 1,
+		      "root", "lp", now);
+  fprintf(out, "# Printer-specific LPC and LPR ACLs\n");
+  /* lpcaccess.top */
+  EXEC SQL SELECT ps.lpc_acl INTO :top_lpc_acl
+    FROM printservers ps, machine m
+    WHERE m.name = :spoolhost AND m.mach_id = ps.mach_id;
+  if (!sqlca.sqlcode && lpc_acl)
+    {
+      fprintf (out, "<Policy default>\n");
+      fprintf (out, "%s\n", alterjob);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @OWNER @SYSTEM\n");
+      printer_user_list(out, "LIST", top_lpc_acl, "Require user");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", submitjob);
+      fprintf (out, "AuthType None\n");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "Allow from all\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", alterpntr);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @SYSTEM\n");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", lpcpntr);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @SYSTEM\n");
+      printer_user_list(out, "LIST", top_lpc_acl, "Require user");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", canceljob);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @OWNER @SYSTEM\n");
+      printer_user_list(out, "LIST", top_lpc_acl, "Require user");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "Allow from all\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", catchall);
+      fprintf (out, "AuthType None\n");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "Allow from all\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "</Policy>\n");
+    }
+
+  /* restrict lists and lpcaccess policies.  Sadly, we have to put the
+     top level for each new policy since CUPS doesn't have a way of 
+     doing it otherwise (well, Unix groups, but not moira) */
+  EXEC SQL DECLARE csr_lpc CURSOR FOR
+    SELECT UNIQUE rp, ka, ac, lpc_acl
+    FROM printers
+    WHERE rm = :rm AND ( ac != 0 OR lpc_acl != 0);
+  EXEC SQL OPEN csr_lpc;
+  while (1)
+    {
+      EXEC SQL FETCH csr_lpc INTO :name, :ka, :ac, :lpc_acl;
+      if (sqlca.sqlcode)
+        break;
+
+      strtrim(name);
+
+      fprintf (out, "<Policy %s-policy>\n", name);
+      fprintf (out, "%s\n", alterjob);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @OWNER @SYSTEM\n");
+      printer_user_list(out, "LIST", lpc_acl, "Require user");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "Allow from all\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", submitjob);
+      /* If the printer is Kerberized? */
+      if (ka)
+        fprintf (out, "AuthType Negotiate\n");
+      else
+        fprintf (out, "AuthType None\n");
+      /* Access-control list. */
+      if (ac)
+        printer_user_list(out, "LIST", ac, "Require user");
+      else if (ka)
+        fprintf (out, "Require valid-user\n");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "Allow from all\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", alterpntr);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @SYSTEM\n");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", lpcpntr);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @SYSTEM\n");
+      /* printer-specific lpc access. */
+      if (lpc_acl)
+          printer_user_list(out, "LIST", lpc_acl, "Require user");
+      printer_user_list(out, "LIST", top_lpc_acl, "Require user");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", canceljob);
+      fprintf (out, "AuthType Default\n");
+      fprintf (out, "Require user @OWNER @SYSTEM\n");
+      printer_user_list(out, "LIST", lpc_acl, "Require user");
+      printer_user_list(out, "LIST", top_lpc_acl, "Require user");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "Allow from all\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "%s\n", catchall);
+      fprintf (out, "AuthType None\n");
+      fprintf (out, "Order deny,allow\n");
+      fprintf (out, "Allow from all\n");
+      fprintf (out, "</Limit>\n");
+      fprintf (out, "</Policy>\n");
+    }
+  EXEC SQL CLOSE csr_lpc;
+  fprintf(out, "\n");
+  tarfile_end(tf);
+  tarfile_close(tf);
+}
+
+void sqlerr(void)
+{
+  db_error(sqlca.sqlcode);
+}

Added: trunk/third/moira/gen/cups-print.sh
===================================================================
--- trunk/third/moira/gen/cups-print.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/cups-print.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,42 @@
+#! /bin/sh
+# $Id: cups-print.sh,v 1.2 2008-10-31 20:46:11 zacheiss Exp $
+
+if [ -d /var/athena ] && [ -w /var/athena ]; then
+    exec >/var/athena/moira_update.log 2>&1
+else 
+    exec >/tmp/moira_update.log 2>&1
+fi
+
+# The following exit codes are defined and MUST BE CONSISTENT with the
+# error codes the library uses:
+MR_MISSINGFILE=47836473
+MR_MKCRED=47836474
+MR_TARERR=47836476
+
+PATH=/bin
+TARFILE=/var/tmp/cups-print.out
+CUPSLOCAL=/etc/cups
+
+# Alert if the tar file or other needed files do not exist
+test -r $TARFILE || exit $MR_MISSINGFILE
+test -d $CUPSLOCAL || exit $MR_MISSINGFILE
+
+# Unpack the tar file, getting only files that are newer than the
+# on-disk copies (-u).
+cd /
+tar xf $TARFILE || exit $MR_TARERR
+
+# Now, make a stab at the PPD file.
+/etc/cups/bin/gen-ppd.pl
+
+/etc/init.d/cups restart
+if [ $? != 0 ]; then
+    exit $MR_MKCRED
+fi
+
+# cleanup
+test -f $TARFILE && rm -f $TARFILE
+test -f $0 && rm -f $0
+
+exit 0
+


Property changes on: trunk/third/moira/gen/cups-print.sh
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/third/moira/gen/dhcp.pc
===================================================================
--- trunk/third/moira/gen/dhcp.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/dhcp.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: dhcp.pc,v 1.7 2008-11-20 16:30:06 zacheiss Exp $
  *
  * This generates the dhcpd.conf.print and associated files.
  *
@@ -24,7 +24,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/dhcp.pc,v 1.7 2008-11-20 16:30:06 zacheiss Exp $");
 
 char *whoami = "dhcp.gen";
 char *db = "moira/moira";
@@ -70,13 +70,15 @@
 
   /* Get print spoolers for allow lists. */
   EXEC SQL SELECT COUNT(service) INTO :alcount FROM serverhosts sh, machine m
-    WHERE sh.service = 'PRINT' AND sh.mach_id = m.mach_id 
+    WHERE (sh.service = 'PRINT' OR sh.service = 'CUPS-PRINT') 
+    AND sh.mach_id = m.mach_id 
     AND m.status = 1 AND m.address != 'unassigned';
   allowlist = malloc(alcount * sizeof(*allowlist));
 
   EXEC SQL DECLARE csr_spool CURSOR FOR
     SELECT m.address, sh.value3 FROM machine m, serverhosts sh
-    WHERE m.mach_id = sh.mach_id AND sh.service = 'PRINT'
+    WHERE m.mach_id = sh.mach_id AND 
+    (sh.service = 'PRINT' OR sh.service = 'CUPS-PRINT')
     AND m.status = 1 AND m.address != 'unassigned';
   EXEC SQL OPEN csr_spool;
   for (i = 0; i < alcount; i++)

Modified: trunk/third/moira/gen/dhcp.sh
===================================================================
--- trunk/third/moira/gen/dhcp.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/dhcp.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# $Id$
+# $Id: dhcp.sh,v 1.3 2001-01-16 18:37:27 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/directory.pc
===================================================================
--- trunk/third/moira/gen/directory.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/directory.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: directory.pc,v 1.5 2007-06-15 14:48:14 zacheiss Exp $
  *
  * This generates a master /etc/passwd containing all active (status != 0)
  * accounts.
@@ -20,7 +20,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/directory.pc,v 1.5 2007-06-15 14:48:14 zacheiss Exp $");
 
 char *whoami = "directory.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/events.pc
===================================================================
--- trunk/third/moira/gen/events.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/events.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: events.pc,v 1.1 2007-03-26 18:14:41 zacheiss Exp $
  *
  * (c) Copyright 2007 by the Massachusetts Institute of Technology.
  */

Modified: trunk/third/moira/gen/events.sh
===================================================================
--- trunk/third/moira/gen/events.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/events.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: events.sh,v 1.2 2005-09-19 21:37:47 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then 
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/genacl.pc
===================================================================
--- trunk/third/moira/gen/genacl.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/genacl.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: genacl.pc,v 1.5 2008-07-10 16:59:11 zacheiss Exp $
  *
  * Utility functions for outputting ACLs
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/genacl.pc,v 1.5 2008-07-10 16:59:11 zacheiss Exp $");
 
 static char defaultrealm[REALM_SZ];
 

Modified: trunk/third/moira/gen/hesiod.pc
===================================================================
--- trunk/third/moira/gen/hesiod.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/hesiod.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: hesiod.pc,v 1.23 2008-10-22 16:12:33 zacheiss Exp $
  *
  * This generates the zone files necessary to load a hesiod server.
  * The following zones are generated: passwd, uid, pobox, group,
@@ -23,7 +23,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/hesiod.pc,v 1.23 2008-10-22 16:12:33 zacheiss Exp $");
 
 #ifndef HTYPE
 #define HTYPE "TXT"
@@ -176,6 +176,8 @@
 
   for (sawdot = 1; *name; name++)
     {
+      if (*name == '$')
+	return 0;
       if (*name == '.')
 	{
 	  if (sawdot)

Modified: trunk/third/moira/gen/hesiod.sh
===================================================================
--- trunk/third/moira/gen/hesiod.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/hesiod.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/bin/sh
 # This script performs updates of hesiod files on hesiod servers.
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/hesiod.sh,v 1.23 2009-03-09 22:58:23 jweiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then
     exec >/var/athena/moira_update.log 2>&1
@@ -29,7 +29,7 @@
 # Directory into which we will put the final product
 DEST_DIR=/etc/athena/nameserver
 
-NAMED=/etc/athena/named
+INIT=/etc/init.d/athena-bind
 NAMED_PID=/var/athena/named.pid
 
 # Create the destination directory if it doesn't exist
@@ -78,6 +78,7 @@
    # Make sure the file is not zero-length
    if test ! -z $file
    then
+      chmod o+r $file
       mv -f $file $DEST_DIR
       if test $? -ne 0
       then
@@ -96,13 +97,11 @@
 # First, get statistics
 /usr/athena/etc/rndc stats
 sleep 1
-kill -KILL `cat $NAMED_PID`
+$INIT stop
 rm -f $NAMED_PID
 
 # Restart named.
-$NAMED
-echo named started
-
+$INIT start
 sleep 1
 # This timeout is implemented by having the shell check TIMEOUT times
 # for the existance of $NAMED_PID and to sleep INTERVAL seconds

Modified: trunk/third/moira/gen/hosts.pc
===================================================================
--- trunk/third/moira/gen/hosts.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/hosts.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: hosts.pc,v 1.8 2000-11-30 23:27:40 zacheiss Exp $
  *
  * This generates the hstath.txt hosttable.
  *
@@ -24,7 +24,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/hosts.pc,v 1.8 2000-11-30 23:27:40 zacheiss Exp $");
 
 char *whoami = "hosts.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/install_dirs
===================================================================
--- trunk/third/moira/gen/install_dirs	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/install_dirs	2009-04-12 18:05:09 UTC (rev 23740)
@@ -74,6 +74,6 @@
 exit 0
 
 #
-# 	$Source$
-#	$Header$
+# 	$Source: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/install_dirs,v $
+#	$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/install_dirs,v 1.12 1998-01-07 17:13:18 danw Exp $
 #

Modified: trunk/third/moira/gen/install_quotas
===================================================================
--- trunk/third/moira/gen/install_quotas	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/install_quotas	2009-04-12 18:05:09 UTC (rev 23740)
@@ -24,6 +24,6 @@
 exit 0
 
 #
-# 	$Source$
-#	$Header$
+# 	$Source: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/install_quotas,v $
+#	$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/install_quotas,v 1.4 1998-01-07 17:13:18 danw Exp $
 #

Modified: trunk/third/moira/gen/ip-billing.gen
===================================================================
--- trunk/third/moira/gen/ip-billing.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/ip-billing.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: ip-billing.gen,v 1.7 2002-03-27 14:51:56 zacheiss Exp $
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:
 $MR_DBMS_ERR = 47836421;

Modified: trunk/third/moira/gen/ip-billing.sh
===================================================================
--- trunk/third/moira/gen/ip-billing.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/ip-billing.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/bin/sh
 # 
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/ip-billing.sh,v 1.2 2002-03-19 22:07:06 zacheiss Exp $
 
 PATH=/usr/bin:/bin:/usr/sbin:/sbin
 

Modified: trunk/third/moira/gen/ldap.gen
===================================================================
--- trunk/third/moira/gen/ldap.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/ldap.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: ldap.gen,v 1.8 2007-11-13 17:37:31 zacheiss Exp $
 
 use DBI;
 

Modified: trunk/third/moira/gen/longjobs.gen
===================================================================
--- trunk/third/moira/gen/longjobs.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/longjobs.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: longjobs.gen,v 1.1 2001-08-02 17:21:11 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/longjobs.sh
===================================================================
--- trunk/third/moira/gen/longjobs.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/longjobs.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# $Id$
+# $Id: longjobs.sh,v 1.1 2001-08-25 12:06:37 zacheiss Exp $
 
 # Wrapper script to install the groups file output by moira, and update
 # the quota database for current group membership.

Added: trunk/third/moira/gen/lpcaccess.pc
===================================================================
--- trunk/third/moira/gen/lpcaccess.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/lpcaccess.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,99 @@
+/* $Id: lpcaccess.pc,v 1.1 2008-07-10 16:58:40 zacheiss Exp $ */
+
+#include <mit-copyright.h>
+#include <moira.h>
+#include <moira_site.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "util.h"
+
+EXEC SQL INCLUDE sqlca;
+
+char *whoami = "lpcaccess.gen";
+char *db = "moira/moira";
+
+void sqlerr(void);
+
+int main(int argc, char **argv)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  char name[PRINTERS_RP_SIZE], duplexname[PRINTERS_DUPLEXNAME_SIZE];
+  int lpc_acl, list_id;
+  EXEC SQL END DECLARE SECTION;
+  TARFILE *tf;
+  FILE *out;
+  char filename[MAXPATHLEN];
+  time_t mtime, now = time(NULL);
+
+  init_acls();
+
+  EXEC SQL CONNECT :db;
+
+  EXEC SQL WHENEVER SQLERROR DO sqlerr();
+
+  sprintf(filename, "%s/lpcaccess.out", DCM_DIR);
+  tf = tarfile_open(filename);
+
+  EXEC SQL SELECT list_id INTO :list_id FROM list
+    WHERE name = 'ops-lpcaccess-top';
+
+  out = tarfile_start(tf, "lpcaccess.top", 0755, 1, 1, "daemon", "daemon", 
+		      now);
+  dump_krb_acl(out, "LIST", list_id, 5);
+  tarfile_end(tf);
+
+  EXEC SQL SELECT list_id INTO :list_id FROM LIST
+    WHERE name = 'sap-lpcaccess-top';
+
+  out = tarfile_start(tf, "sap-lpcaccess.top", 0755, 1, 1, "daemon", "daemon",
+		      now);
+  dump_krb_acl(out, "LIST", list_id, 5);
+  tarfile_end(tf);
+
+  EXEC SQL DECLARE csr_lpc CURSOR FOR SELECT UNIQUE rp, duplexname, lpc_acl
+    FROM printers WHERE lpc_acl != 0;
+  EXEC SQL OPEN csr_lpc;
+  while (1)
+    {
+      EXEC SQL FETCH csr_lpc INTO :name, :duplexname, :lpc_acl;
+      if (sqlca.sqlcode)
+	break;
+
+      strtrim(name);
+
+      tarfile_mkdir(tf, name, 0755, 1, 1, "daemon", "daemon", now);
+      sprintf(filename, "%s/lpcaccess", name);
+      out = tarfile_start(tf, filename, 0755, 1, 1, "daemon", "daemon", now);
+      dump_krb_acl(out, "LIST", lpc_acl, 5);
+      tarfile_end(tf);
+
+      if (*duplexname)
+	{
+	  strtrim(duplexname);
+
+	  tarfile_mkdir(tf, duplexname, 0755, 1, 1, "daemon", "daemon", now);
+	  sprintf(filename, "%s/lpcaccess", duplexname);
+	  out = tarfile_start(tf, filename, 0755, 1, 1, "daemon", "daemon", now);
+	  dump_krb_acl(out, "LIST", lpc_acl, 5);
+	  tarfile_end(tf);
+	}
+
+    }
+  EXEC SQL CLOSE csr_lpc;
+
+  tarfile_close(tf);
+
+  exit(MR_SUCCESS);
+}
+
+void sqlerr(void)
+{
+  db_error(sqlca.sqlcode);
+}
+

Added: trunk/third/moira/gen/lpcaccess.sh
===================================================================
--- trunk/third/moira/gen/lpcaccess.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/lpcaccess.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,35 @@
+#!/bin/sh
+# $Id: lpcaccess.sh,v 1.1 2008-07-10 16:58:41 zacheiss Exp $
+
+outfile=/home/cups/lpcaccess.out
+loadprog=/home/cups/update_acls
+
+PATH="/etc:/bin:/usr/bin:/usr/etc:/usr/athena/etc"
+
+if [ -d /var/athena ] && [ -w /var/athena ]; then
+    exec >/var/athena/moira_update.log 2>&1
+else
+    exec >/tmp/moira_update.log 2>&1
+fi
+
+# The following exit codes are defined and MUST BE CONSISTENT with the
+# error codes the library uses:
+MR_MISSINGFILE=47836473
+MR_MKCRED=47836474
+
+if [ ! -f $outfile ]; then
+    exit $MR_MISSINGFILE
+fi
+
+if [ ! -x $loadprog ]; then
+    exit $MR_MISSINGFILE
+fi
+
+$loadprog
+
+# Ignore exit status from $loadprog for now.
+#if [ $? != 0 ]; then
+#    exit $MR_MKCRED
+#fi
+
+exit 0


Property changes on: trunk/third/moira/gen/lpcaccess.sh
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/third/moira/gen/mailhosts.gen
===================================================================
--- trunk/third/moira/gen/mailhosts.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/mailhosts.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: mailhosts.gen,v 1.5 2007-07-18 19:38:27 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/mailhub.pc
===================================================================
--- trunk/third/moira/gen/mailhub.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/mailhub.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mailhub.pc,v 1.21 2008-08-22 17:49:11 zacheiss Exp $
  *
  * This generates the /usr/lib/aliases file for the mailhub.
  *
@@ -22,7 +22,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/mailhub.pc,v 1.21 2008-08-22 17:49:11 zacheiss Exp $");
 
 char *whoami = "mailhub.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/mailhub.sh
===================================================================
--- trunk/third/moira/gen/mailhub.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/mailhub.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/mailhub.sh,v 1.13 2003-04-18 22:06:03 jweiss Exp $
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/etc:/usr/etc:/usr/athena/bin:/usr/local/bin
 export PATH

Modified: trunk/third/moira/gen/mailman.gen
===================================================================
--- trunk/third/moira/gen/mailman.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/mailman.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: mailman.gen,v 1.1 2003-01-02 01:05:05 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/mailman.sh
===================================================================
--- trunk/third/moira/gen/mailman.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/mailman.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,3 +1,3 @@
 #!/bin/sh
-# $Id$
+# $Id: mailman.sh,v 1.1 2003-03-31 14:27:24 zacheiss Exp $
 exec /home/mailman/moiraupdate

Added: trunk/third/moira/gen/nagios-cluster.gen
===================================================================
--- trunk/third/moira/gen/nagios-cluster.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-cluster.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,155 @@
+#!/moira/bin/perl -Tw
+
+# $Id: nagios-cluster.gen,v 1.1 2009-02-18 00:55:01 jweiss Exp $
+# The following exit codes are defined and MUST BE CONSISTENT with the
+# error codes the library uses:
+$MR_DBMS_ERR = 47836421;
+$MR_OCONFIG = 47836460;
+
+$outfile = '/moira/dcm/nagios-cluster.out';
+
+use DBI;
+
+umask 022;
+open(OUT, ">$outfile") || exit $MR_OCONFIG;
+print OUT "# This File is automatically generated by Moira.  Do not edit.\n\n";
+
+
+$dbh = DBI->connect("dbi:Oracle:moira", "moira", "moira")
+  || exit $MR_DBMS_ERR;
+
+
+$sth1 = $dbh->prepare("SELECT m.name FROM machine m, clusters c, mcmap p " .
+		     "WHERE m.status=1 AND c.name='cluster' AND " .
+		     "(m.mach_id=p.mach_id AND p.clu_id=c.clu_id)")
+    || exit $MR_DBMS_ERR;
+$sth1->execute || exit $MR_DBMS_ERR;
+
+my %clusters;
+while (($name) = $sth1->fetchrow_array) {
+    next if $name eq "[NONE]";
+    $name = lc($name);
+    my $cluster = $name;
+    $cluster =~ s/\..*$//;
+    $cluster =~ s/\-[^\-]*$//;
+#    print "$name\t$cluster\n";
+    push @$cluster, $name;
+    $clusters{$cluster}++;
+
+
+    print OUT <<"END";
+define host{
+	host_name		$name
+	alias			$name
+	address			$name
+	contact_groups		noone
+	use			generic-host
+	}
+
+define service{
+	host_name		$name
+	contact_groups		noone
+	use			ping-service
+	}
+
+define service{
+	host_name		$name
+	contact_groups		noone
+	use			no-ssh-service
+	}
+
+define service{
+	host_name		$name
+	contact_groups		noone
+	use			no-telnet-service
+	}
+
+define service{
+	host_name		$name
+	contact_groups		noone
+	use			no-ftp-service
+	}
+
+define service{
+	host_name		$name
+	contact_groups		noone
+	use			public-service
+	}
+
+END
+}
+
+foreach $key (sort (keys %clusters)) {
+    print OUT <<END;
+define hostgroup {
+	hostgroup_name          $key
+	alias                   $key
+END
+    print OUT "\tmembers\t\t";
+    $maybecomma = "";
+    foreach $machine (@$key) {
+	print OUT "$maybecomma$machine";
+	$maybecomma = ",";
+    }
+    print OUT "\n\t}\n\n";
+}
+
+
+print OUT "\n### Printers\n\n";
+
+$sth0 = $dbh->prepare("SELECT m.name FROM machine m, printers p " .
+		     "WHERE (p.type = 'DORM' OR p.type ='CLUSTER') " .
+		     "AND p.mach_id = m.mach_id AND m.status=1")
+    || exit $MR_DBMS_ERR;
+
+$sth0->execute || exit $MR_DBMS_ERR;
+
+while (($name) = $sth0->fetchrow_array) {
+    next if $name eq "[NONE]";
+    $name = lc($name);
+    push(@allprinters, $name);
+    print OUT <<"END";
+define host{
+	host_name		$name
+	alias			$name
+	address			$name
+	contact_groups		noone
+	use			generic-host
+	}
+
+define service{
+	host_name		$name
+	contact_groups		noone
+	use			ping-service
+	}
+
+define service{
+	host_name		$name
+	contact_groups		noone
+	use			hpjd-service
+	}
+
+END
+
+}
+
+print OUT <<END;
+define hostgroup{
+	hostgroup_name          printers
+	alias                   printers
+END
+
+print OUT "\tmembers\t\t";
+
+$maybecomma = "";
+foreach $printer (@allprinters) {
+    print OUT "$maybecomma$printer";
+    $maybecomma = ",";
+}
+
+print OUT "\n\t}\n\n";
+
+close(OUT);
+$dbh->disconnect;
+
+exit 0;


Property changes on: trunk/third/moira/gen/nagios-cluster.gen
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/third/moira/gen/nagios-cluster.sh
===================================================================
--- trunk/third/moira/gen/nagios-cluster.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-cluster.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,34 @@
+#!/bin/sh
+# $Id: nagios-cluster.sh,v 1.1 2009-02-18 00:55:01 jweiss Exp $
+
+# The following exit codes are defined and MUST BE CONSISTENT with
+# error codes the library uses:
+MR_MKCRED=47836474
+
+file=/var/nagios-cluster/etc/moira-cluster.cfg
+newfile=$file.new
+initscript=/etc/init.d/nagios-cluster
+
+if [ -d /var/athena ] && [ -w /var/athena ]; then
+    exec >/var/athena/moira_update.log 2>&1
+else 
+    exec >/tmp/moira_update.log 2>&1
+fi
+
+chmod 644 $file.new
+diff -q $file $newfile
+status=$?
+if [ $status -eq 0 ]; then
+    echo "No changes"
+    exit 0
+elif [ $status -eq 1 ]; then
+    mv $newfile $file
+    $initscript restart
+    if [ $? -eq 0 ]; then 
+	exit 0
+    else
+	exit $MR_MKCRED
+    fi
+else
+    exit $MR_MKCRED
+fi

Modified: trunk/third/moira/gen/nagios-colo.gen
===================================================================
--- trunk/third/moira/gen/nagios-colo.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-colo.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: nagios-colo.gen,v 1.6 2008-04-17 17:24:36 zacheiss Exp $
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:
 $MR_DBMS_ERR = 47836421;

Modified: trunk/third/moira/gen/nagios-colo.sh
===================================================================
--- trunk/third/moira/gen/nagios-colo.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-colo.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: nagios-colo.sh,v 1.1 2007-08-17 15:26:40 zacheiss Exp $
 
 file=/var/nagios/etc/moira-colo-hosts.cfg
 

Modified: trunk/third/moira/gen/nagios-printers.gen
===================================================================
--- trunk/third/moira/gen/nagios-printers.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-printers.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: nagios-printers.gen,v 1.3 2008-04-17 17:24:36 zacheiss Exp $
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:
 $MR_DBMS_ERR = 47836421;

Modified: trunk/third/moira/gen/nagios-printers.sh
===================================================================
--- trunk/third/moira/gen/nagios-printers.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-printers.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: nagios-printers.sh,v 1.1 2006-01-31 21:50:25 zacheiss Exp $
 
 file=/var/nagios/etc/moira-printers.cfg
 

Modified: trunk/third/moira/gen/nagios-wsh.gen
===================================================================
--- trunk/third/moira/gen/nagios-wsh.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-wsh.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: nagios-wsh.gen,v 1.5 2008-04-17 17:24:37 zacheiss Exp $
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:
 $MR_DBMS_ERR = 47836421;

Modified: trunk/third/moira/gen/nagios-wsh.sh
===================================================================
--- trunk/third/moira/gen/nagios-wsh.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nagios-wsh.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: nagios-wsh.sh,v 1.1 2008-01-16 16:56:09 zacheiss Exp $
 
 file=/var/nagios/etc/moira-wsh-hosts.cfg
 

Modified: trunk/third/moira/gen/ndb.pc
===================================================================
--- trunk/third/moira/gen/ndb.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/ndb.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: ndb.pc,v 1.5 2000-07-17 17:52:43 zacheiss Exp $
  *
  * This generates the msql database for the network tables.
  *
@@ -19,7 +19,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/ndb.pc,v 1.5 2000-07-17 17:52:43 zacheiss Exp $");
 
 char *whoami = "ndb.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/ndb.sh
===================================================================
--- trunk/third/moira/gen/ndb.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/ndb.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -23,4 +23,4 @@
 rm -f $0
 exit 0 
 
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/ndb.sh,v 1.2 2000-05-08 18:30:30 zacheiss Exp $

Modified: trunk/third/moira/gen/network.pc
===================================================================
--- trunk/third/moira/gen/network.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/network.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: network.pc,v 1.6 2001-05-23 21:31:03 zacheiss Exp $
  *
  * This generates the network table.
  *
@@ -22,7 +22,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/network.pc,v 1.6 2001-05-23 21:31:03 zacheiss Exp $");
 
 char *whoami = "network.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/nfs.pc
===================================================================
--- trunk/third/moira/gen/nfs.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nfs.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: nfs.pc,v 1.12 2002-08-13 15:49:31 zacheiss Exp $
  *
  * This generates the files necessary to load an nfs server.
  *
@@ -23,7 +23,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/nfs.pc,v 1.12 2002-08-13 15:49:31 zacheiss Exp $");
 
 #define min(x, y)	((x) < (y) ? (x) : (y))
 

Modified: trunk/third/moira/gen/nfs.sh
===================================================================
--- trunk/third/moira/gen/nfs.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/nfs.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # This script performs nfs updates on servers.
 #
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/nfs.sh,v 1.25 2000-05-25 05:43:22 zacheiss Exp $
 
 # redirect output, and find the credentials directory (not robust, but
 # works for now).

Modified: trunk/third/moira/gen/pobox.pc
===================================================================
--- trunk/third/moira/gen/pobox.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/pobox.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: pobox.pc,v 1.8 2002-03-15 18:11:19 zacheiss Exp $
  *
  * This generates a list of everyone's poboxes for the mitdir.
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/pobox.pc,v 1.8 2002-03-15 18:11:19 zacheiss Exp $");
 
 char *whoami = "pobox.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/postoffice.pc
===================================================================
--- trunk/third/moira/gen/postoffice.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/postoffice.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: postoffice.pc,v 1.2 2000-11-30 23:27:48 zacheiss Exp $
  *
  * This generates the post office location data.
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/postoffice.pc,v 1.2 2000-11-30 23:27:48 zacheiss Exp $");
 
 
 #ifndef PO_SUBDIR

Modified: trunk/third/moira/gen/postoffice.sh
===================================================================
--- trunk/third/moira/gen/postoffice.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/postoffice.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 #!/bin/sh 
 # This script performs postoffice updates.
 #
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/postoffice.sh,v 1.3 2000-05-08 18:30:30 zacheiss Exp $
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/etc:/usr/etc:/usr/athena/bin:/usr/local/bin
 export PATH

Modified: trunk/third/moira/gen/print.pc
===================================================================
--- trunk/third/moira/gen/print.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/print.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: print.pc,v 1.10 2004-06-22 18:26:27 zacheiss Exp $
  *
  * This generates printcaps and other files for Athena print servers
  *
@@ -22,7 +22,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/print.pc,v 1.10 2004-06-22 18:26:27 zacheiss Exp $");
 
 char *whoami = "print.gen";
 char *db = "moira/moira";

Modified: trunk/third/moira/gen/print.sh
===================================================================
--- trunk/third/moira/gen/print.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/print.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# $Id$
+# $Id: print.sh,v 1.5 2002-02-23 03:53:49 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/rt.sh
===================================================================
--- trunk/third/moira/gen/rt.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/rt.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: rt.sh,v 1.1 2007-10-25 14:47:54 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then 
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/sapprint.gen
===================================================================
--- trunk/third/moira/gen/sapprint.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/sapprint.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: sapprint.gen,v 1.3 2000-12-22 20:22:34 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/sapprint.sh
===================================================================
--- trunk/third/moira/gen/sapprint.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/sapprint.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# $Id$
+# $Id: sapprint.sh,v 1.3 2007-04-03 15:36:01 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then 
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/setquota.c
===================================================================
--- trunk/third/moira/gen/setquota.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/setquota.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 /*
- *      $Source$
- *      $Author$
- *      $Header$
+ *      $Source: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/setquota.c,v $
+ *      $Author: danw $
+ *      $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/setquota.c,v 1.8 1998-01-06 20:39:51 danw Exp $
  *
  *      Copyright (C) 1987 by the Massachusetts Institute of Technology
  *
@@ -13,7 +13,7 @@
  */
 
 #ifndef lint
-static char *rcsid_setquota_c = "$Header$";
+static char *rcsid_setquota_c = "$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/setquota.c,v 1.8 1998-01-06 20:39:51 danw Exp $";
 #endif lint
 
 #include <stdio.h>

Modified: trunk/third/moira/gen/spwatch.gen
===================================================================
--- trunk/third/moira/gen/spwatch.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/spwatch.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/moira/bin/perl -Tw
-# $Id$
+# $Id: spwatch.gen,v 1.2 2001-08-28 02:38:20 jweiss Exp $
 #
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/tar.c
===================================================================
--- trunk/third/moira/gen/tar.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/tar.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: tar.c,v 1.2 1999-07-12 16:27:56 danw Exp $
  *
  * Utility routines for writing tar files.
  *
@@ -16,7 +16,7 @@
 
 #include "util.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/tar.c,v 1.2 1999-07-12 16:27:56 danw Exp $");
 
 static char tar_zeros[512];
 

Modified: trunk/third/moira/gen/tsm.gen
===================================================================
--- trunk/third/moira/gen/tsm.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/tsm.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: tsm.gen,v 1.2 2007-05-29 18:49:15 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/tsm.sh
===================================================================
--- trunk/third/moira/gen/tsm.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/tsm.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: tsm.sh,v 1.2 2007-07-03 19:22:09 zacheiss Exp $
 
 outfile=/tsm-mit/data/tsmlists
 loadprog=/tsm-mit/bin/loadAdminTable.pl

Modified: trunk/third/moira/gen/util.c
===================================================================
--- trunk/third/moira/gen/util.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/util.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: util.c,v 1.14 2000-11-30 23:27:48 zacheiss Exp $
  *
  * Utility routines used by the MOIRA extraction programs.
  *
@@ -16,7 +16,7 @@
 
 #include "util.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/util.c,v 1.14 2000-11-30 23:27:48 zacheiss Exp $");
 
 /* Julian day of the UNIX epoch (January 1, 1970) */
 #define UNIX_EPOCH 2440588

Added: trunk/third/moira/gen/warehouse-lists.pc
===================================================================
--- trunk/third/moira/gen/warehouse-lists.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/warehouse-lists.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,153 @@
+/* $Id: warehouse-lists.pc,v 1.1 2009-01-12 21:44:07 zacheiss Exp $
+ *
+ * (c) Copyright 2008 by the Massachusetts Institute of Technology.
+ */
+
+#include <mit-copyright.h>
+#include <moira.h>
+#include <moira_site.h>
+
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "util.h"
+
+EXEC SQL INCLUDE sqlca;
+
+char *whoami = "warehouse-lists.gen";
+char *db = "moira/moira";
+
+struct hash *lists;
+
+void output_list(int id, void *list, void *out);
+
+int main(int argc, char **argv)
+{
+  char filename[MAXPATHLEN], *targetfile, *l;
+  FILE *out = stdout;
+  int cnt = 0;
+  EXEC SQL BEGIN DECLARE SECTION;
+  int lid;
+  char lname[LIST_NAME_SIZE];
+  EXEC SQL END DECLARE SECTION;
+
+  EXEC SQL CONNECT :db;
+
+  if (argc == 2)
+    {
+      targetfile = argv[1];
+      sprintf(filename, "%s~", targetfile);
+      if (!(out = fopen(filename, "w")))
+        {
+          fprintf(stderr, "unable to open %s for output\n", filename);
+          exit(MR_OCONFIG);
+        }
+    }
+  else if (argc != 1)
+    {
+      fprintf(stderr, "usage: %s [outfile]\n", argv[0]);
+      exit(MR_ARGS);
+    }
+  
+  lists = create_hash(15000);
+
+  EXEC SQL DECLARE l_cursor CURSOR FOR
+    SELECT l.list_id, l.name FROM list l
+    WHERE l.active = 1 and l.hidden = 0;
+  EXEC SQL OPEN l_cursor;
+  while (1)
+    {
+       EXEC SQL FETCH l_cursor INTO :lid, :lname;
+       if (sqlca.sqlcode)
+	 break;
+       l = strdup(strtrim(lname));
+       if (hash_store(lists, lid, l) < 0)
+	 {
+	   fprintf(stderr, "Out of memory!\n");
+	   exit(MR_NO_MEM);
+	 }
+       cnt++;
+    }
+  EXEC SQL CLOSE l_cursor;
+  fprintf(stderr, "Loaded %d lists\n", cnt);
+
+  hash_step(lists, output_list, out);
+  
+  if (fclose(out))
+    {
+      perror("close failed");
+      exit(MR_CCONFIG);
+    }
+  
+  if (argc == 2)
+    fix_file(targetfile);
+  exit(MR_SUCCESS);
+}
+
+void output_list(int id, void *list, void *out)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  char *l = list;
+  int lid = id;
+  char acl_type[LIST_ACL_TYPE_SIZE], modtime[LIST_MODTIME_SIZE];
+  char acl_name[STRINGS_STRING_SIZE], login[USERS_LOGIN_SIZE];
+  char principal[STRINGS_STRING_SIZE];
+  int acl_id;
+  EXEC SQL END DECLARE SECTION;
+  char *maybecomma = "";
+
+  EXEC SQL SELECT acl_type, acl_id, modtime INTO :acl_type, :acl_id, :modtime
+    FROM list WHERE list_id = :lid;
+
+  strtrim(acl_type);
+  strtrim(modtime);
+  
+  strcpy(acl_name, "NONE");
+  if (strcmp(acl_type, "LIST") == 0)
+    EXEC SQL SELECT name into :acl_name FROM list WHERE list_id = :acl_id;
+  else if (strcmp(acl_type, "USER") == 0)
+    EXEC SQL SELECT login into :acl_name FROM users WHERE users_id = :acl_id;
+  else if (strcmp(acl_type, "KERBEROS") == 0)
+    EXEC SQL SELECT string into :acl_name FROM strings WHERE string_id = :acl_id;
+  strtrim(acl_name);
+
+  fprintf(out, "%s|%s|%s|", list, acl_type, acl_name);
+
+  EXEC SQL DECLARE u_cursor CURSOR FOR
+    SELECT UNIQUE u.login FROM users u, imembers i, list l
+    WHERE l.list_id = :lid AND l.list_id = i.list_id AND
+    i.member_type = 'USER' AND i.member_id = u.users_id;
+  EXEC SQL OPEN u_cursor;
+  while (1)
+    {
+      EXEC SQL FETCH u_cursor INTO :login;
+      if (sqlca.sqlcode)
+        break;
+      fprintf(out, "%s%s", maybecomma, strtrim(login));
+      maybecomma = ",";
+    }
+  EXEC SQL CLOSE u_cursor;
+
+  EXEC SQL DECLARE k_cursor CURSOR FOR
+    SELECT UNIQUE s.string FROM strings s, imembers i, list l
+    WHERE l.list_id = :lid AND l.list_id = i.list_id AND
+    (i.member_type = 'KERBEROS' OR i.member_type = 'STRING')
+    and i.member_id = s.string_id;
+  EXEC SQL OPEN k_cursor;
+  while (1)
+    {
+      EXEC SQL FETCH k_cursor INTO :principal;
+      if (sqlca.sqlcode)
+	break;
+       fprintf(out, "%s%s", maybecomma, strtrim(principal));
+       maybecomma = ",";
+    }
+  EXEC SQL CLOSE k_cursor;
+
+  fprintf(out, "|%s\n", modtime);
+}
+

Modified: trunk/third/moira/gen/warehouse.gen
===================================================================
--- trunk/third/moira/gen/warehouse.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/warehouse.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/usr/athena/bin/perl -Tw
 #
-# $Id$
+# $Id: warehouse.gen,v 1.1 2007-01-03 20:31:58 zacheiss Exp $
 # Generate a database extract from the users table for the MIT Data Warehouse.
 $MR_DBMS_ERR = 47836421;
 $MR_OCONFIG = 47836460;

Modified: trunk/third/moira/gen/warehouse.sh
===================================================================
--- trunk/third/moira/gen/warehouse.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/warehouse.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: warehouse.sh,v 1.5 2007-01-03 20:31:59 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/winad.pc
===================================================================
--- trunk/third/moira/gen/winad.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/winad.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: winad.pc,v 1.6 2004-07-26 20:17:10 zacheiss Exp $
  *
  * This generates the user, list, list membership, filesys data
  * for windows active directory update

Modified: trunk/third/moira/gen/winstats.gen
===================================================================
--- trunk/third/moira/gen/winstats.gen	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/winstats.gen	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/moira/bin/perl -Tw
 
-# $Id$
+# $Id: winstats.gen,v 1.1 2003-12-15 20:16:23 zacheiss Exp $
 
 # The following exit codes are defined and MUST BE CONSISTENT with the
 # error codes the library uses:

Modified: trunk/third/moira/gen/winstats.sh
===================================================================
--- trunk/third/moira/gen/winstats.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/winstats.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: winstats.sh,v 1.4 2003-12-16 20:51:00 zacheiss Exp $
 
 dir=/var/ops/populate/stats
 tarfile=/var/tmp/winstats.out

Modified: trunk/third/moira/gen/www.pc
===================================================================
--- trunk/third/moira/gen/www.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/www.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: www.pc,v 1.8 2002-04-05 22:53:50 zacheiss Exp $
  *
  * This generates the web server user & group data.
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/www.pc,v 1.8 2002-04-05 22:53:50 zacheiss Exp $");
 
 
 #ifndef WWW_SUBDIR

Modified: trunk/third/moira/gen/www.sh
===================================================================
--- trunk/third/moira/gen/www.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/www.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/bin/sh
 # This script performs updates of the web server.
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/www.sh,v 1.3 2000-05-24 04:29:03 danw Exp $
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/etc:/usr/etc:/usr/athena/bin:/usr/local/bin
 export PATH

Modified: trunk/third/moira/gen/zephyr.pc
===================================================================
--- trunk/third/moira/gen/zephyr.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/zephyr.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: zephyr.pc,v 1.2 2000-01-10 23:09:15 danw Exp $
  *
  * This generates zephyr acl files
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/zephyr.pc,v 1.2 2000-01-10 23:09:15 danw Exp $");
 
 void do_class(TARFILE *tf, char *class);
 void dump_zacl(FILE *out, char *type, int id);

Modified: trunk/third/moira/gen/zephyr.sh
===================================================================
--- trunk/third/moira/gen/zephyr.sh	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/zephyr.sh	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# $Id$
+# $Id: zephyr.sh,v 1.4 2000-05-08 18:30:31 zacheiss Exp $
 
 if [ -d /var/athena ] && [ -w /var/athena ]; then
     exec >/var/athena/moira_update.log 2>&1

Modified: trunk/third/moira/gen/zero_quotas
===================================================================
--- trunk/third/moira/gen/zero_quotas	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/gen/zero_quotas	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 #!/bin/csh -f
 #
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/gen/zero_quotas,v 1.4 1998-01-05 19:52:53 danw Exp $
 #
 # This script zeros quotas for uid's which are not in standard input
 # Note that the input must be sorted in increasing order by uid.

Modified: trunk/third/moira/include/Makefile.in
===================================================================
--- trunk/third/moira/include/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/include/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 1999-07-12 16:21:05 danw Exp $
 
 SHELL=/bin/sh
 

Modified: trunk/third/moira/include/mit-copyright.h
===================================================================
--- trunk/third/moira/include/mit-copyright.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/include/mit-copyright.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mit-copyright.h,v 1.3 1998-02-05 22:51:16 danw Exp $
 
 Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
 

Modified: trunk/third/moira/include/moira.h
===================================================================
--- trunk/third/moira/include/moira.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/include/moira.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: moira.h,v 1.34 2008-04-17 20:51:16 zacheiss Exp $
  *
  * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
  *

Modified: trunk/third/moira/include/moira_site.h
===================================================================
--- trunk/third/moira/include/moira_site.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/include/moira_site.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: moira_site.h,v 1.51 2007-11-29 21:09:02 zacheiss Exp $
  *
  * This file contains all definitions that allow easy access to
  * elements returned by most of the @i[Moira] queries.  It also defines

Modified: trunk/third/moira/include/mrclient.h
===================================================================
--- trunk/third/moira/include/mrclient.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/include/mrclient.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mrclient.h,v 1.4 2000-08-25 23:06:36 zacheiss Exp $
  *
  * Copyright (C) 1999 by the Massachusetts Institute of Technology
  *

Modified: trunk/third/moira/include/ureg_proto.h
===================================================================
--- trunk/third/moira/include/ureg_proto.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/include/ureg_proto.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: ureg_proto.h,v 1.5 1998-02-05 22:51:18 danw Exp $
  *
  * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
  *

Modified: trunk/third/moira/incremental/Makefile.in
===================================================================
--- trunk/third/moira/incremental/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.11 2009-01-05 22:25:37 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -48,7 +48,7 @@
 	@for d in $(SUBDIRS); do (echo "### Making $@ in incremental/$$d"; cd $$d; $(MAKE) $@) || exit 1; done
 
 install:
-	$(INSTALL_PROGRAM) ksrvtgt $(mrbindir)
+	$(INSTALL_PROGRAM) ksrvtgt $(DESTDIR)$(mrbindir)
 	@for d in $(SUBDIRS); do (echo "### Making $@ in incremental/$$d"; cd $$d; $(MAKE) $@) || exit 1; done
 
 ksrvtgt: $(KSRVTGT_OBJS)

Modified: trunk/third/moira/incremental/afs/Makefile.in
===================================================================
--- trunk/third/moira/incremental/afs/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/afs/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.3 2009-01-05 22:25:39 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -46,8 +46,8 @@
 depend:
 
 install:
-	$(INSTALL_PROGRAM) afs.incr $(mrbindir)
-	@set -x; for p in afs_create.pl afs_nightly.pl afs_quota.pl afs_rename.pl afs_utils.pl; do $(INSTALL_PROGRAM) $$p $(mrbindir); done
+	$(INSTALL_PROGRAM) afs.incr $(DESTDIR)$(mrbindir)
+	@set -x; for p in afs_create.pl afs_nightly.pl afs_quota.pl afs_rename.pl afs_utils.pl; do $(INSTALL_PROGRAM) $$p $(DESTDIR)$(mrbindir); done
 
 afs.incr: $(AFS_OBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(AFS_OBJS) $(AFS_LIBS) -lprot -lauth \

Modified: trunk/third/moira/incremental/afs/afs.c
===================================================================
--- trunk/third/moira/incremental/afs/afs.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/afs/afs.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Header$
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/incremental/afs/afs.c,v 1.3 2006-08-22 17:36:25 zacheiss Exp $
  *
  * Do AFS incremental updates
  *

Modified: trunk/third/moira/incremental/afs/afs_utils.pl
===================================================================
--- trunk/third/moira/incremental/afs/afs_utils.pl	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/afs/afs_utils.pl	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Header$
+# $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/incremental/afs/afs_utils.pl,v 1.5 2004-06-11 21:07:44 zacheiss Exp $
 
 use Fcntl;
 

Modified: trunk/third/moira/incremental/ksrvtgt.c
===================================================================
--- trunk/third/moira/incremental/ksrvtgt.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ksrvtgt.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,6 +1,6 @@
 /*
- * $Source$
- * $Author$
+ * $Source: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/incremental/ksrvtgt.c,v $
+ * $Author: danw $
  *
  * Copyright 1988 by the Massachusetts Institute of Technology.
  *
@@ -21,7 +21,7 @@
 /*#include <conf.h>*/
 
 char rcsid[] =
-    "$Header$";
+    "$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/incremental/ksrvtgt.c,v 1.7 1998-02-05 22:51:20 danw Exp $";
 
 void usage(char **argv);
 

Added: trunk/third/moira/incremental/ldap/Makefile.in
===================================================================
--- trunk/third/moira/incremental/ldap/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,52 @@
+# $Id: Makefile.in,v 1.1 2009-02-25 22:29:50 zacheiss Exp $
+
+SHELL=/bin/sh
+@SET_MAKE@
+
+CC=@CC@
+CPPFLAGS=@CPPFLAGS@
+LDAP_CPPFLAGS=@LDAP_CPPFLAGS@
+CFLAGS=@CFLAGS@
+DEFS=@DEFS@
+ALL_CFLAGS=$(LDAP_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $(DEFS)
+LDFLAGS=@LDFLAGS@
+LDAP_LIBS=@LDAP_LIBS@
+LIBS=@LIBS@
+MR_LIBDEP=@MR_LIBDEP@
+INSTALL=@INSTALL@
+INSTALL_PROGRAM=@INSTALL_PROGRAM@
+
+srcdir=@srcdir@
+VPATH=@srcdir@
+SRCTOP=@top_srcdir@
+BUILDTOP=../..
+mrbindir=@mrbindir@
+
+WINAD_OBJS=winad.o ldap_adgssapi_bind.o krb5_utils.o setpw.o
+
+TARGET=ldap.incr
+
+.SUFFIXES: .pc
+
+.pc.c:
+	$(PRO_C) $(PRO_C_FLAGS) INAME=$<
+
+.c.o:
+	$(CC) -c $(ALL_CFLAGS) $<
+
+all: $(TARGET)
+
+clean:
+	rm -f $(WINAD_OBJS) $(TARGET)
+
+cleandir distclean: clean
+	rm -f Makefile
+
+depend:
+
+install:
+	$(INSTALL_PROGRAM) ldap.incr $(mrbindir)
+
+ldap.incr: $(WINAD_OBJS) $(MR_LIBDEP)
+	$(CC) -o $@ $(LDAP_LIBS) $(LDFLAGS) $(WINAD_OBJS) -lldap -llber \
+	-lgssapi_krb5 $(LIBS)

Added: trunk/third/moira/incremental/ldap/auth_con.h
===================================================================
--- trunk/third/moira/incremental/ldap/auth_con.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/auth_con.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,36 @@
+
+#ifndef KRB5_AUTH_CONTEXT
+#define KRB5_AUTH_CONTEXT
+
+struct _krb5_auth_context {
+    krb5_magic		magic;
+    krb5_address      *	remote_addr;
+    krb5_address      *	remote_port;
+    krb5_address      *	local_addr;
+    krb5_address      *	local_port;
+    krb5_keyblock     * keyblock;
+    krb5_keyblock     * send_subkey;
+    krb5_keyblock     * recv_subkey;
+
+    krb5_int32		auth_context_flags;
+    krb5_ui_4		remote_seq_number;
+    krb5_ui_4		local_seq_number;
+    krb5_authenticator *authentp;		/* mk_req, rd_req, mk_rep, ...*/
+    krb5_cksumtype	req_cksumtype;		/* mk_safe, ... */
+    krb5_cksumtype	safe_cksumtype;		/* mk_safe, ... */
+    krb5_pointer	i_vector;		/* mk_priv, rd_priv only */
+    krb5_rcache		rcache;
+    krb5_enctype      * permitted_etypes;	/* rd_req */
+  krb5_mk_req_checksum_func checksum_func;
+  void *checksum_func_data;
+};
+
+
+/* Internal auth_context_flags */
+#define KRB5_AUTH_CONN_INITIALIZED	0x00010000
+#define KRB5_AUTH_CONN_USED_W_MK_REQ	0x00020000
+#define KRB5_AUTH_CONN_USED_W_RD_REQ	0x00040000
+#define KRB5_AUTH_CONN_SANE_SEQ		0x00080000
+#define KRB5_AUTH_CONN_HEIMDAL_SEQ	0x00100000
+
+#endif

Added: trunk/third/moira/incremental/ldap/gssldap-int.h
===================================================================
--- trunk/third/moira/incremental/ldap/gssldap-int.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/gssldap-int.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
+ * CONFIDENTIAL
+ * $Id: gssldap-int.h,v 1.1 2009-02-25 22:29:50 zacheiss Exp $
+ *
+ * Structures for handling GSS-API binds within LDAP client
+ * and server libraries. This isn't entirely SASL specific,
+ * apart from the negotiation state.
+ */
+
+#ifndef _GSSLDAP_INT_H_
+#define _GSSLDAP_INT_H_
+
+#define GSSAPI_LDAP_PRINCIPAL_ATTRIBUTE	"krbName"
+#define GSSAPI_LDAP_SERVICE_NAME	"ldap"
+#define GSSAPI_LDAP_DN_PREFIX		"dn:"
+#define GSSAPI_LDAP_DN_PREFIX_LEN	(sizeof(GSSAPI_LDAP_DN_PREFIX) - 1)
+
+#include "gsssasl.h"
+#include "gssldap.h"
+
+/*
+ * GSS-API SASL negotiation state for the client library
+ */
+typedef struct gssldap_client_state_desc {
+    /* LDAP handle */
+    LDAP *ld;
+
+    /* dn passed to ldap_gssapi_bind() */
+    const char *binddn;
+
+    /* msgid for bind conversation */
+    int msgid;
+
+    /* GSS-API context */
+    gss_ctx_id_t context;
+
+    /* result code to return from ldap_gssapi_bind() */
+    int rc;
+} gssldap_client_state_desc, *gssldap_client_state_t;
+
+/*
+ * Plugin (server side) state
+ */
+typedef struct gssldap_server_state_desc {
+    /* The LDAP connection */
+    int conn;
+
+    /* Where in the negotiation we are */
+    gsssasl_server_negotiation_desc state;
+
+    /* The GSS-API context */
+    gss_ctx_id_t context;
+
+    /* The client name */
+    gss_buffer_desc client_name;
+
+    /* SASL authorization identity (with dn: prefix chopped) */
+    char *identity;
+
+    /* The next entry in the list */
+    struct gssldap_server_state_desc *next;
+} gssldap_server_state_desc, *gssldap_server_state_t;
+
+#endif				/* _GSSLDAP_INT_H_ */


Property changes on: trunk/third/moira/incremental/ldap/gssldap-int.h
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/third/moira/incremental/ldap/gssldap.h
===================================================================
--- trunk/third/moira/incremental/ldap/gssldap.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/gssldap.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
+ * CONFIDENTIAL
+ * $Id: gssldap.h,v 1.1 2009-02-25 22:29:51 zacheiss Exp $
+ *
+ * Public client API for GSS-API LDAP SASL mechanism.
+ */
+
+#ifndef _GSSLDAP_H_
+#define _GSSLDAP_H_
+
+#include <lber.h>
+#include <ldap.h>
+
+LDAP_API(int)
+LDAP_CALL ldap_adgssapi_bind(LDAP * ld, const char *who, int layer, 
+			     char *ldap_domain_name, char *ldap_realm_name,
+			     char *server);
+LDAP_API(int)
+LDAP_CALL ldap_gssapi_debug(int on);
+
+#endif				/* _GSSLDAP_H_ */


Property changes on: trunk/third/moira/incremental/ldap/gssldap.h
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/third/moira/incremental/ldap/gsssasl.h
===================================================================
--- trunk/third/moira/incremental/ldap/gsssasl.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/gsssasl.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
+ * CONFIDENTIAL
+ * $Id: gsssasl.h,v 1.1 2009-02-25 22:29:51 zacheiss Exp $
+ *
+ * General GSS-API SASL (not LDAP specific) stuff.
+ */
+
+#ifndef _GSSSASL_H_
+#define _GSSSASL_H_
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#ifdef HEIMDAL
+#include <gssapi.h>
+#else
+#include <gssapi/gssapi_generic.h>
+#endif
+#ifndef _WIN32
+#include <netinet/in.h>
+#endif
+
+#define OM_uint32 ULONG
+
+#define GSSAPI_SASL_NAME                  "GSSAPI"
+
+/* GSS_Accept_Context */
+#define GSSSASL_NEGOTIATE_CONTEXT         0x01
+/* Section 7.2.2 of RFC 2222 */
+#define GSSSASL_SEND_SECURITY_OPTIONS     0x02
+/* Section 7.2.1 of RFC 2222 */
+#define GSSSASL_RECEIVE_SECURITY_OPTIONS  0x03
+#define GSSSASL_COMPLETED                 0x04
+
+/* Section 7.3 of RFC 2222 */
+#define GSSSASL_NO_SECURITY_LAYER         0x01
+#define GSSSASL_INTEGRITY_PROTECTION      0x02
+#define GSSSASL_PRIVACY_PROTECTION        0x04
+
+/* Token for security negotiation (after GSS-API nego) */
+typedef struct gsssasl_security_negotiation_desc {
+    /* Section 7.2.3 of RFC 2222 */
+    int security_layer:8;
+    /* Section 7.2.[12] of RFC 2222 */
+    int token_size:24;
+    /* Section 7.2.1 of RFC 2222 */
+    char identity[1];
+} gsssasl_security_negotiation_desc, *gsssasl_security_negotiation_t;
+
+typedef int gsssasl_server_negotiation_desc, *gsssasl_server_negotiation_t;
+
+#endif				/* _GSSSASL_H_ */


Property changes on: trunk/third/moira/incremental/ldap/gsssasl.h
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/third/moira/incremental/ldap/kpasswd.h
===================================================================
--- trunk/third/moira/incremental/ldap/kpasswd.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/kpasswd.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,46 @@
+/*--
+Module Name:
+
+    kpasswd.h
+
+--*/
+
+
+typedef struct _krb5_setpw {
+  krb5_magic      magic;
+  krb5_data       newpasswd;
+  krb5_principal  targprinc;
+} krb5_setpw;
+
+
+#define MAX_SERVER_NAMES 32
+#ifndef T_SRV
+#define T_SRV 33
+#endif
+#define LDAP_SERVICE  "_ldap"
+#define TCP_PROTOCOL  "_tcp"
+
+#define KDC_RECEIVE_TIMEOUT       10
+#define KDC_RECEIVE_ERROR         11
+#define KDC_SEND_ERROR            12
+#define KDC_GETSOCKNAME_ERROR     13
+#define KDC_GETPEERNAME_ERROR     14
+
+#ifndef KRB5_KPASSWD_SUCCESS
+#define KRB5_KPASSWD_SUCCESS              0
+#define KRB5_KPASSWD_MALFORMED            1
+#define KRB5_KPASSWD_HARDERROR            2
+#define KRB5_KPASSWD_AUTHERROR            3
+#define KRB5_KPASSWD_SOFTERROR            4
+#endif
+#define KRB5_KPASSWD_ACCESSDENIED         5
+#define KRB5_KPASSWD_BAD_VERSION          6
+#define KRB5_KPASSWD_INITIAL_FLAG_NEEDED  7
+
+#define KRB5_KPASSWD_VERS_CHANGEPW        1
+#define KRB5_KPASSWD_VERS_SETPW           0xff80
+
+#ifndef DEFAULT_KPASSWD_PORT
+#define DEFAULT_KPASSWD_PORT 464
+#endif
+

Added: trunk/third/moira/incremental/ldap/krb5_utils.c
===================================================================
--- trunk/third/moira/incremental/ldap/krb5_utils.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/krb5_utils.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,134 @@
+/*--
+    krb5_utils.c
+
+Abstract:
+
+    ASN.1 encoder for the
+    Kerberos Change Password Protocol (I-D) variant for Windows 2000
+
+--*/
+
+#include <krb5.h>
+#include <ldap.h>
+#ifdef _WIN32
+#include "asn1_make.h"
+#endif
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#define NEED_SOCKETS
+#ifndef _WIN32
+#include <netdb.h>
+#include <sys/socket.h>
+#endif
+#include <stdio.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include "kpasswd.h"
+
+#ifndef KRB5_USE_INET
+#ifdef HAVE_NETINET_IN_H
+#define KRB5_USE_INET 1
+#endif
+#endif
+
+#ifndef _WIN32
+typedef krb5_octet asn1_octet;
+typedef krb5_error_code asn1_error_code;
+typedef struct code_buffer_rep {
+  char *base, *bound, *next;
+} asn1buf;
+typedef enum { UNIVERSAL = 0x00, APPLICATION = 0x40,
+               CONTEXT_SPECIFIC = 0x80, PRIVATE = 0xC0 } asn1_class;
+#endif
+
+static const char rcsid[] = "$Id: krb5_utils.c,v 1.1 2009-02-25 22:29:51 zacheiss Exp $";
+
+asn1_error_code asn1_encode_realm(asn1buf *buf, const krb5_principal val, 
+                                  int *retlen);
+asn1_error_code asn1_encode_principal_name(asn1buf *buf, 
+                                           const krb5_principal val, 
+                                           int *retlen);
+asn1_error_code asn1_encode_octetstring(asn1buf *buf, const int len, 
+                                        const asn1_octet *val, int *retlen);
+
+/* From src/lib/krb5/asn.1/krb5_encode.c */
+
+/* setup() -- create and initialize bookkeeping variables
+     retval: stores error codes returned from subroutines
+     buf: the coding buffer
+     length: length of the most-recently produced encoding
+     sum: cumulative length of the entire encoding */
+#define krb5_setup()\
+  asn1_error_code retval;\
+  asn1buf *buf=NULL;\
+  int length, sum=0;\
+\
+  if(rep == NULL) return ASN1_MISSING_FIELD;\
+\
+  retval = asn1buf_create(&buf);\
+  if(retval) return retval
+
+
+/* krb5_addfield -- add a field, or component, to the encoding */
+#define krb5_addfield(value,tag,encoder)\
+{ retval = encoder(buf,value,&length);\
+  if(retval){\
+    asn1buf_destroy(&buf);\
+    return retval; }\
+  sum += length;\
+  retval = asn1_make_etag(buf,CONTEXT_SPECIFIC,tag,length,&length);\
+  if(retval){\
+    asn1buf_destroy(&buf);\
+    return retval; }\
+  sum += length; }
+
+/* krb5_addlenfield -- add a field whose length must be separately specified */
+#define krb5_addlenfield(len,value,tag,encoder)\
+{ retval = encoder(buf,len,value,&length);\
+  if(retval){\
+    asn1buf_destroy(&buf);\
+    return retval; }\
+  sum += length;\
+  retval = asn1_make_etag(buf,CONTEXT_SPECIFIC,tag,length,&length);\
+  if(retval){\
+    asn1buf_destroy(&buf);\
+    return retval; }\
+  sum += length; }
+
+/* form a sequence (by adding a sequence header to the current encoding) */
+#define krb5_makeseq()\
+  retval = asn1_make_sequence(buf,sum,&length);\
+  if(retval){\
+    asn1buf_destroy(&buf);\
+    return retval; }\
+  sum += length
+
+/* produce the final output and clean up the workspace */
+#define krb5_cleanup()\
+  retval = asn12krb5_buf(buf,code);\
+  if(retval){\
+    asn1buf_destroy(&buf);\
+    return retval; }\
+  retval = asn1buf_destroy(&buf);\
+  if(retval){\
+    return retval; }\
+\
+  return(0)
+
+krb5_error_code encode_krb5_setpw(const krb5_setpw *rep,
+                                  krb5_data ** code)
+{
+  krb5_setup();
+
+  if (rep->targprinc != NULL)
+    {  /* target principal name is OPTIONAL */
+      krb5_addfield(rep->targprinc,2,asn1_encode_realm);
+      krb5_addfield(rep->targprinc,1,asn1_encode_principal_name);
+    }
+  krb5_addlenfield(rep->newpasswd.length, rep->newpasswd.data, 
+                   0, asn1_encode_octetstring);
+  krb5_makeseq();
+  krb5_cleanup();
+}
+

Added: trunk/third/moira/incremental/ldap/ldap-int.h
===================================================================
--- trunk/third/moira/incremental/ldap/ldap-int.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/ldap-int.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,707 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ *
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.0 (the "NPL"); you may not use this file except in
+ * compliance with the NPL.  You may obtain a copy of the NPL at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the NPL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
+ * for the specific language governing rights and limitations under the
+ * NPL.
+ *
+ * The Initial Developer of this code under the NPL is Netscape
+ * Communications Corporation.  Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
+ * Reserved.
+ */
+#ifndef _LDAPINT_H
+#define _LDAPINT_H
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#ifdef hpux
+#include <strings.h>
+#include <time.h>
+#endif /* hpux */
+
+#ifdef _WINDOWS
+#ifndef FD_SETSIZE
+#  define FD_SETSIZE		256	/* number of connections we support */
+#endif
+#  define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include <time.h>
+#elif defined(macintosh)
+#include "ldap-macos.h"
+# include <time.h>
+#elif defined(XP_OS2)
+#include <os2sock.h>
+#else /* _WINDOWS */
+# include <sys/time.h>
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <netdb.h>
+#if !defined(hpux) && !defined(SUNOS4) && !defined(LINUX1_2) && !defined(LINUX2_0)
+# include <sys/select.h>
+#endif /* !defined(hpux) and others */
+#endif /* _WINDOWS */
+
+#if defined(BSDI) || defined(LINUX1_2) || defined(SNI) || defined(IRIX)
+#include <arpa/inet.h>
+#endif /* BSDI */
+
+#if defined(IRIX)
+#include <bstring.h>
+#endif /* IRIX */
+
+#include "lber-int.h"
+#include "ldap.h"
+#include "ldaprot.h"
+#include "ldaplog.h"
+#include "portable.h"
+
+#ifdef LDAP_ASYNC_IO
+#ifdef NEED_FILIO
+#include <sys/filio.h>		/* to get FIONBIO for ioctl() call */
+#else /* NEED_FILIO */
+#include <sys/ioctl.h>		/* to get FIONBIO for ioctl() call */
+#endif /* NEED_FILIO */
+#endif /* LDAP_ASYNC_IO */
+
+#ifdef USE_SYSCONF
+#  include <unistd.h>
+#endif /* USE_SYSCONF */
+
+#if !defined(_WINDOWS) && !defined(macintosh) && !defined(LINUX2_0)
+#define NSLDAPI_HAVE_POLL	1
+#endif
+
+/* SSL version, or 0 if not built with SSL */
+#if defined(NET_SSL)
+#  define SSL_VERSION 3
+#else
+#  define SSL_VERSION 0
+#endif
+
+#define LDAP_URL_URLCOLON	"URL:"
+#define LDAP_URL_URLCOLON_LEN	4
+
+#define LDAP_LDAP_REF_STR	LDAP_URL_PREFIX
+#define LDAP_LDAP_REF_STR_LEN	LDAP_URL_PREFIX_LEN
+#define LDAP_LDAPS_REF_STR	LDAPS_URL_PREFIX
+#define LDAP_LDAPS_REF_STR_LEN	LDAPS_URL_PREFIX_LEN
+
+/* default limit on nesting of referrals */
+#define LDAP_DEFAULT_REFHOPLIMIT	5
+#ifdef LDAP_DNS
+#define LDAP_DX_REF_STR		"dx://"
+#define LDAP_DX_REF_STR_LEN	5
+#endif /* LDAP_DNS */
+
+typedef enum { LDAP_CACHE_LOCK, LDAP_MEMCACHE_LOCK, LDAP_MSGID_LOCK,
+LDAP_REQ_LOCK, LDAP_RESP_LOCK, LDAP_ABANDON_LOCK, LDAP_CTRL_LOCK,
+LDAP_OPTION_LOCK, LDAP_ERR_LOCK, LDAP_CONN_LOCK, LDAP_SELECT_LOCK,
+LDAP_RESULT_LOCK, LDAP_PEND_LOCK, LDAP_MAX_LOCK } LDAPLock;
+
+/*
+ * This structure represents both ldap messages and ldap responses.
+ * These are really the same, except in the case of search responses,
+ * where a response has multiple messages.
+ */
+
+struct ldapmsg {
+	int		lm_msgid;	/* the message id */
+	int		lm_msgtype;	/* the message type */
+	BerElement	*lm_ber;	/* the ber encoded message contents */
+	struct ldapmsg	*lm_chain;	/* for search - next msg in the resp */
+	struct ldapmsg	*lm_next;	/* next response */
+	int		lm_fromcache;	/* memcache: origin of message */
+};
+
+/*
+ * structure for tracking LDAP server host, ports, DNs, etc.
+ */
+typedef struct ldap_server {
+	char			*lsrv_host;
+	char			*lsrv_dn;	/* if NULL, use default */
+	int			lsrv_port;
+	unsigned long		lsrv_options;	/* boolean options */
+#define LDAP_SRV_OPT_SECURE	0x01
+	struct ldap_server	*lsrv_next;
+} LDAPServer;
+
+/*
+ * structure for representing an LDAP server connection
+ */
+typedef struct ldap_conn {
+	Sockbuf			*lconn_sb;
+	BerElement		*lconn_ber;  /* non-NULL if in midst of msg. */
+	int			lconn_version;	/* LDAP protocol version */
+	int			lconn_refcnt;
+	unsigned long		lconn_lastused;	/* time */
+	int			lconn_status;
+#define LDAP_CONNST_NEEDSOCKET		1
+#define LDAP_CONNST_CONNECTING		2
+#define LDAP_CONNST_CONNECTED		3
+#define LDAP_CONNST_DEAD		4
+	LDAPServer		*lconn_server;
+	char			*lconn_binddn;	/* DN of last successful bind */
+	int			lconn_bound;	/* has a bind been done? */
+	char			*lconn_krbinstance;
+	struct ldap_conn	*lconn_next;
+} LDAPConn;
+
+
+/*
+ * structure used to track outstanding requests
+ */
+typedef struct ldapreq {
+	int		lr_msgid;	/* the message id */
+	int		lr_status;	/* status of request */
+#define LDAP_REQST_INPROGRESS	1
+#define LDAP_REQST_CHASINGREFS	2
+#define LDAP_REQST_NOTCONNECTED	3
+#define LDAP_REQST_WRITING	4
+#define LDAP_REQST_CONNDEAD	5	/* associated conn. has failed */
+	int		lr_outrefcnt;	/* count of outstanding referrals */
+	int		lr_origid;	/* original request's message id */
+	int		lr_parentcnt;	/* count of parent requests */
+	int		lr_res_msgtype;	/* result message type */
+	int		lr_res_errno;	/* result LDAP errno */
+	char		*lr_res_error;	/* result error string */
+	char		*lr_res_matched;/* result matched DN string */
+	BerElement	*lr_ber;	/* ber encoded request contents */
+	LDAPConn	*lr_conn;	/* connection used to send request */
+	char		*lr_binddn;	/* request is a bind for this DN */
+	struct ldapreq	*lr_parent;	/* request that spawned this referral */
+	struct ldapreq	*lr_refnext;	/* next referral spawned */
+	struct ldapreq	*lr_prev;	/* previous request */
+	struct ldapreq	*lr_next;	/* next request */
+} LDAPRequest;
+
+typedef struct ldappend {
+	void		*lp_sema;	/* semaphore to post */
+	int		lp_msgid;	/* message id */
+	LDAPMessage	*lp_result;	/* result storage */
+	struct ldappend	*lp_prev;	/* previous pending */
+	struct ldappend	*lp_next;	/* next pending */
+} LDAPPend;
+
+/*
+ * structure representing an ldap connection
+ */
+struct ldap {
+	struct sockbuf	*ld_sbp;	/* pointer to socket desc. & buffer */
+	char		*ld_host;
+	int		ld_version;	/* LDAP protocol version */
+	char		ld_lberoptions;
+	int		ld_deref;
+
+	int		ld_timelimit;
+	int		ld_sizelimit;
+
+	struct ldap_filt_desc	*ld_filtd;	/* from getfilter for ufn searches */
+	char		*ld_ufnprefix;	/* for incomplete ufn's */
+
+	int		ld_errno;
+	char		*ld_error;
+	char		*ld_matched;
+	int		ld_msgid;
+
+	/* do not mess with these */
+	LDAPRequest	*ld_requests;	/* list of outstanding requests */
+	LDAPMessage	*ld_responses;	/* list of outstanding responses */
+	int		*ld_abandoned;	/* array of abandoned requests */
+	char		*ld_cldapdn;	/* DN used in connectionless search */
+
+	/* it is OK to change these next four values directly */
+	int		ld_cldaptries;	/* connectionless search retry count */
+	int		ld_cldaptimeout;/* time between retries */
+	int		ld_refhoplimit;	/* limit on referral nesting */
+	unsigned long	ld_options;	/* boolean options */
+#define LDAP_BITOPT_REFERRALS	0x80000000
+#define LDAP_BITOPT_SSL		0x40000000
+#define LDAP_BITOPT_DNS		0x20000000
+#define LDAP_BITOPT_RESTART	0x10000000
+#define LDAP_BITOPT_RECONNECT	0x08000000
+#define LDAP_BITOPT_ASYNC       0x04000000
+
+	/* do not mess with the rest though */
+	char		*ld_defhost;	/* full name of default server */
+	int		ld_defport;	/* port of default server */
+	BERTranslateProc ld_lber_encode_translate_proc;
+	BERTranslateProc ld_lber_decode_translate_proc;
+	LDAPConn	*ld_defconn;	/* default connection */
+	LDAPConn	*ld_conns;	/* list of all server connections */
+	void		*ld_selectinfo;	/* platform specifics for select */
+	int		ld_selectreadcnt;  /* count of read sockets */
+	int		ld_selectwritecnt; /* count of write sockets */
+	LDAP_REBINDPROC_CALLBACK *ld_rebind_fn;
+	void		*ld_rebind_arg;
+
+	/* function pointers, etc. for io */
+	struct ldap_io_fns	ld_io;
+#define ld_read_fn		ld_io.liof_read
+#define ld_write_fn		ld_io.liof_write
+#define ld_select_fn		ld_io.liof_select
+#define ld_socket_fn		ld_io.liof_socket
+#define ld_ioctl_fn		ld_io.liof_ioctl
+#define ld_connect_fn		ld_io.liof_connect
+#define ld_close_fn		ld_io.liof_close
+#define ld_ssl_enable_fn	ld_io.liof_ssl_enable
+
+	/* function pointers, etc. for DNS */
+	struct ldap_dns_fns	ld_dnsfn;
+#define ld_dns_extradata	ld_dnsfn.lddnsfn_extradata
+#define ld_dns_bufsize		ld_dnsfn.lddnsfn_bufsize
+#define ld_dns_gethostbyname_fn	ld_dnsfn.lddnsfn_gethostbyname
+#define ld_dns_gethostbyaddr_fn	ld_dnsfn.lddnsfn_gethostbyaddr
+
+	/* function pointers, etc. for threading */
+	struct ldap_thread_fns	ld_thread;
+#define ld_mutex_alloc_fn	ld_thread.ltf_mutex_alloc
+#define ld_mutex_free_fn	ld_thread.ltf_mutex_free
+#define ld_mutex_lock_fn	ld_thread.ltf_mutex_lock
+#define ld_mutex_unlock_fn	ld_thread.ltf_mutex_unlock
+#define ld_get_errno_fn		ld_thread.ltf_get_errno
+#define ld_set_errno_fn		ld_thread.ltf_set_errno
+#define ld_get_lderrno_fn	ld_thread.ltf_get_lderrno
+#define ld_set_lderrno_fn	ld_thread.ltf_set_lderrno
+#define ld_lderrno_arg		ld_thread.ltf_lderrno_arg
+	void			**ld_mutex;
+
+	/* function pointers, etc. for caching */
+	int			ld_cache_on;
+	int			ld_cache_strategy;
+	struct ldap_cache_fns	ld_cache;
+#define ld_cache_config		ld_cache.lcf_config
+#define ld_cache_bind		ld_cache.lcf_bind
+#define ld_cache_unbind		ld_cache.lcf_unbind
+#define ld_cache_search		ld_cache.lcf_search
+#define ld_cache_compare	ld_cache.lcf_compare
+#define ld_cache_add		ld_cache.lcf_add
+#define ld_cache_delete		ld_cache.lcf_delete
+#if 0
+#define ld_cache_rename		ld_cache.lcf_rename
+#endif
+#define ld_cache_modify		ld_cache.lcf_modify
+#define ld_cache_modrdn		ld_cache.lcf_modrdn
+#define ld_cache_abandon	ld_cache.lcf_abandon
+#define ld_cache_result		ld_cache.lcf_result
+#define ld_cache_flush		ld_cache.lcf_flush
+#define ld_cache_arg		ld_cache.lcf_arg
+
+	/* ldapv3 controls */
+	LDAPControl		**ld_servercontrols;
+	LDAPControl		**ld_clientcontrols;
+
+	/* Preferred language */
+	char            *ld_preferred_language;
+
+	/* MemCache */
+	LDAPMemCache	*ld_memcache;
+
+	/* Pending results */
+	LDAPPend	*ld_pend;	/* list of pending results */
+
+	/* extra thread function pointers */
+	struct ldap_extra_thread_fns	ld_thread2;
+#define ld_mutex_trylock_fn		ld_thread2.ltf_mutex_trylock
+#define ld_sema_alloc_fn		ld_thread2.ltf_sema_alloc
+#define ld_sema_free_fn			ld_thread2.ltf_sema_free
+#define ld_sema_wait_fn			ld_thread2.ltf_sema_wait
+#define ld_sema_post_fn			ld_thread2.ltf_sema_post
+};
+
+/* allocate/free mutex */
+#define LDAP_MUTEX_ALLOC( ld ) \
+	(((ld)->ld_mutex_alloc_fn != NULL) ? (ld)->ld_mutex_alloc_fn() : NULL)
+
+/* allocate/free mutex */
+#define LDAP_MUTEX_FREE( ld, m ) \
+	if ( (ld)->ld_mutex_free_fn != NULL && m != NULL ) { \
+		(ld)->ld_mutex_free_fn( m ); \
+	}
+
+/* enter/exit critical sections */
+#define LDAP_MUTEX_TRYLOCK( ld, i ) \
+	( (ld)->ld_mutex_trylock_fn == NULL ) ? 0 : \
+		(ld)->ld_mutex_trylock_fn( (ld)->ld_mutex[i] )
+#define LDAP_MUTEX_LOCK( ld, i ) \
+	if ( (ld)->ld_mutex_lock_fn != NULL ) { \
+		(ld)->ld_mutex_lock_fn( (ld)->ld_mutex[i] ); \
+	}
+#define LDAP_MUTEX_UNLOCK( ld, i ) \
+	if ( (ld)->ld_mutex_unlock_fn != NULL ) { \
+		(ld)->ld_mutex_unlock_fn( (ld)->ld_mutex[i] ); \
+	}
+
+/* Backword compatibility locks */
+#define LDAP_MUTEX_BC_LOCK( ld, i ) \
+	if( (ld)->ld_mutex_trylock_fn == NULL ) { \
+		if ( (ld)->ld_mutex_lock_fn != NULL ) { \
+			(ld)->ld_mutex_lock_fn( (ld)->ld_mutex[i] ); \
+		} \
+	}
+#define LDAP_MUTEX_BC_UNLOCK( ld, i ) \
+	if( (ld)->ld_mutex_trylock_fn == NULL ) { \
+		if ( (ld)->ld_mutex_unlock_fn != NULL ) { \
+			(ld)->ld_mutex_unlock_fn( (ld)->ld_mutex[i] ); \
+		} \
+	}
+
+/* allocate/free semaphore */
+#define LDAP_SEMA_ALLOC( ld ) \
+	(((ld)->ld_sema_alloc_fn != NULL) ? (ld)->ld_sema_alloc_fn() : NULL)
+#define LDAP_SEMA_FREE( ld, m ) \
+	if ( (ld)->ld_sema_free_fn != NULL && m != NULL ) { \
+		(ld)->ld_sema_free_fn( m ); \
+	}
+
+/* wait/post binary semaphore */
+#define LDAP_SEMA_WAIT( ld, lp ) \
+	if ( (ld)->ld_sema_wait_fn != NULL ) { \
+		(ld)->ld_sema_wait_fn( lp->lp_sema ); \
+	}
+#define LDAP_SEMA_POST( ld, lp ) \
+	if ( (ld)->ld_sema_post_fn != NULL ) { \
+		(ld)->ld_sema_post_fn( lp->lp_sema ); \
+	}
+#define POST( ld, y, z ) \
+	if( (ld)->ld_mutex_trylock_fn != NULL ) { \
+		nsldapi_post_result( ld, y, z ); \
+	}
+
+/* get/set errno */
+#ifndef macintosh
+#define LDAP_SET_ERRNO( ld, e ) \
+	if ( (ld)->ld_set_errno_fn != NULL ) { \
+		(ld)->ld_set_errno_fn( e ); \
+	} else { \
+		errno = e; \
+	}
+#define LDAP_GET_ERRNO( ld ) \
+	(((ld)->ld_get_errno_fn != NULL) ? \
+		(ld)->ld_get_errno_fn() : errno)
+#else /* macintosh */
+#define LDAP_SET_ERRNO( ld, e ) \
+	if ( (ld)->ld_set_errno_fn != NULL ) { \
+		(ld)->ld_set_errno_fn( e ); \
+	}
+#define LDAP_GET_ERRNO( ld ) \
+	(((ld)->ld_get_errno_fn != NULL) ? \
+		(ld)->ld_get_errno_fn() : 0)
+#endif
+
+
+/* get/set ldap-specific errno */
+#define LDAP_SET_LDERRNO( ld, e, m, s )	ldap_set_lderrno( ld, e, m, s )
+#define LDAP_GET_LDERRNO( ld, m, s ) ldap_get_lderrno( ld, m, s )
+
+/*
+ * your standard "mimimum of two values" macro
+ */
+#define NSLDAPI_MIN(a, b)	(((a) < (b)) ? (a) : (b))
+
+/*
+ * handy macro to check whether LDAP struct is set up for CLDAP or not
+ */
+#define LDAP_IS_CLDAP( ld )	( ld->ld_sbp->sb_naddr > 0 )
+
+/*
+ * handy macro to check errno "e" for an "in progress" sort of error
+ */
+#if defined(macintosh) || defined(_WINDOWS)
+#define NSLDAPI_ERRNO_IO_INPROGRESS( e )  ((e) == EWOULDBLOCK || (e) == EAGAIN)
+#else
+#ifdef EAGAIN
+#define NSLDAPI_ERRNO_IO_INPROGRESS( e )  ((e) == EWOULDBLOCK || (e) == EINPROGRESS || (e) == EAGAIN)
+#else /* EAGAIN */
+#define NSLDAPI_ERRNO_IO_INPROGRESS( e )  ((e) == EWOULDBLOCK || (e) == EINPROGRESS) 
+#endif /* EAGAIN */
+#endif /* macintosh || _WINDOWS*/
+
+/*
+ * macro to return the LDAP protocol version we are using
+ */
+#define NSLDAPI_LDAP_VERSION( ld )	( (ld)->ld_defconn == NULL ? \
+					(ld)->ld_version : \
+					(ld)->ld_defconn->lconn_version )
+
+/*
+ * Structures used for handling client filter lists.
+ */
+#define LDAP_FILT_MAXSIZ	1024
+
+struct ldap_filt_list {
+    char			*lfl_tag;
+    char			*lfl_pattern;
+    char			*lfl_delims;
+    struct ldap_filt_info	*lfl_ilist;
+    struct ldap_filt_list	*lfl_next;
+};
+
+struct ldap_filt_desc {
+	LDAPFiltList		*lfd_filtlist;
+	LDAPFiltInfo		*lfd_curfip;
+	LDAPFiltInfo		lfd_retfi;
+	char			lfd_filter[ LDAP_FILT_MAXSIZ ];
+	char			*lfd_curval;
+	char			*lfd_curvalcopy;
+	char			**lfd_curvalwords;
+	char			*lfd_filtprefix;
+	char			*lfd_filtsuffix;
+};
+
+/*
+ * "internal" globals used to track defaults and memory allocation callbacks:
+ *    (the actual definitions are in open.c)
+ */
+extern struct ldap			nsldapi_ld_defaults;
+extern struct ldap_memalloc_fns		nsldapi_memalloc_fns;
+extern int				nsldapi_initialized;
+
+
+/*
+ * Memory allocation done in liblber should all go through one of the
+ * following macros. This is so we can plug-in alternative memory
+ * allocators, etc. as the need arises.
+ */
+#define NSLDAPI_MALLOC( size )		ldap_x_malloc( size )
+#define NSLDAPI_CALLOC( nelem, elsize )	nsldapi_calloc( nelem, elsize )
+#define NSLDAPI_REALLOC( ptr, size )	nsldapi_realloc( ptr, size )
+#define NSLDAPI_FREE( ptr )		ldap_x_free( ptr )
+
+
+/*
+ * macros used to check validity of data structures and parameters
+ */
+#define NSLDAPI_VALID_LDAP_POINTER( ld ) \
+	( (ld) != NULL )
+
+#define NSLDAPI_VALID_LDAPMESSAGE_POINTER( lm ) \
+	( (lm) != NULL )
+
+#define NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( lm ) \
+	( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_SEARCH_ENTRY )
+
+#define NSLDAPI_VALID_LDAPMESSAGE_REFERENCE_POINTER( lm ) \
+	( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_SEARCH_REFERENCE )
+
+#define NSLDAPI_VALID_LDAPMESSAGE_BINDRESULT_POINTER( lm ) \
+	( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_BIND )
+
+#define NSLDAPI_VALID_LDAPMESSAGE_EXRESULT_POINTER( lm ) \
+	( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_EXTENDED )
+
+#define NSLDAPI_VALID_LDAPMOD_ARRAY( mods ) \
+	( (mods) != NULL )
+
+#define NSLDAPI_VALID_NONEMPTY_LDAPMOD_ARRAY( mods ) \
+	( (mods) != NULL && (mods)[0] != NULL )
+
+#define NSLDAPI_IS_SEARCH_ENTRY( code ) \
+	((code) == LDAP_RES_SEARCH_ENTRY)
+
+#define NSLDAPI_IS_SEARCH_RESULT( code ) \
+	((code) == LDAP_RES_SEARCH_RESULT)
+
+#define NSLDAPI_SEARCH_RELATED_RESULT( code ) \
+	(NSLDAPI_IS_SEARCH_RESULT( code ) || NSLDAPI_IS_SEARCH_ENTRY( code ))
+
+/*
+ * in bind.c
+ */
+char *nsldapi_get_binddn( LDAP *ld );
+
+/*
+ * in cache.c
+ */
+void nsldapi_add_result_to_cache( LDAP *ld, LDAPMessage *result );
+
+/*
+ * in dsparse.c
+ */
+int nsldapi_next_line_tokens( char **bufp, long *blenp, char ***toksp );
+void nsldapi_free_strarray( char **sap );
+
+/*
+ * in error.c
+ */
+int nsldapi_parse_result( LDAP *ld, int msgtype, BerElement *rber,
+    int *errcodep, char **matchednp, char **errmsgp, char ***referralsp,
+    LDAPControl ***serverctrlsp );
+
+/*
+ * in open.c
+ */
+void nsldapi_initialize_defaults( void );
+int nsldapi_open_ldap_connection( LDAP *ld, Sockbuf *sb, char *host,
+	int defport, char **krbinstancep, int async, int secure );
+int nsldapi_open_ldap_defconn( LDAP *ld );
+void *nsldapi_malloc( size_t size );
+void *nsldapi_calloc( size_t nelem, size_t elsize );
+void *nsldapi_realloc( void *ptr, size_t size );
+void nsldapi_free( void *ptr );
+char *nsldapi_strdup( const char *s );
+
+/*
+ * in os-ip.c
+ */
+int nsldapi_connect_to_host( LDAP *ld, Sockbuf *sb, char *host,
+	unsigned long address, int port, int async, int secure );
+void nsldapi_close_connection( LDAP *ld, Sockbuf *sb );
+
+int nsldapi_do_ldap_select( LDAP *ld, struct timeval *timeout );
+void *nsldapi_new_select_info( void );
+void nsldapi_free_select_info( void *vsip );
+void nsldapi_mark_select_write( LDAP *ld, Sockbuf *sb );
+void nsldapi_mark_select_read( LDAP *ld, Sockbuf *sb );
+void nsldapi_mark_select_clear( LDAP *ld, Sockbuf *sb );
+int nsldapi_is_read_ready( LDAP *ld, Sockbuf *sb );
+int nsldapi_is_write_ready( LDAP *ld, Sockbuf *sb );
+
+/*
+ * if referral.c
+ */
+int nsldapi_parse_reference( LDAP *ld, BerElement *rber, char ***referralsp,
+	LDAPControl ***serverctrlsp );
+
+
+/*
+ * in result.c
+ */
+int ldap_msgdelete( LDAP *ld, int msgid );
+int nsldapi_result_nolock( LDAP *ld, int msgid, int all, int unlock_permitted,
+    struct timeval *timeout, LDAPMessage **result );
+int nsldapi_wait_result( LDAP *ld, int msgid, int all, struct timeval *timeout,
+    LDAPMessage **result );
+int nsldapi_post_result( LDAP *ld, int msgid, LDAPMessage *result );
+
+/*
+ * in request.c
+ */
+int nsldapi_send_initial_request( LDAP *ld, int msgid, unsigned long msgtype,
+	char *dn, BerElement *ber );
+int nsldapi_alloc_ber_with_options( LDAP *ld, BerElement **berp );
+void nsldapi_set_ber_options( LDAP *ld, BerElement *ber );
+int nsldapi_ber_flush( LDAP *ld, Sockbuf *sb, BerElement *ber, int freeit,
+	int async );
+int nsldapi_send_server_request( LDAP *ld, BerElement *ber, int msgid,
+	LDAPRequest *parentreq, LDAPServer *srvlist, LDAPConn *lc,
+	char *bindreqdn, int bind );
+LDAPConn *nsldapi_new_connection( LDAP *ld, LDAPServer **srvlistp, int use_ldsb,
+	int connect, int bind );
+LDAPRequest *nsldapi_find_request_by_msgid( LDAP *ld, int msgid );
+void nsldapi_free_request( LDAP *ld, LDAPRequest *lr, int free_conn );
+void nsldapi_free_connection( LDAP *ld, LDAPConn *lc, int force, int unbind );
+void nsldapi_dump_connection( LDAP *ld, LDAPConn *lconns, int all );
+void nsldapi_dump_requests_and_responses( LDAP *ld );
+int nsldapi_chase_v2_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp,
+	int *totalcountp, int *chasingcountp );
+int nsldapi_chase_v3_refs( LDAP *ld, LDAPRequest *lr, char **refs,
+	int is_reference, int *totalcountp, int *chasingcountp );
+int nsldapi_append_referral( LDAP *ld, char **referralsp, char *s );
+void nsldapi_connection_lost_nolock( LDAP *ld, Sockbuf *sb );
+
+/*
+ * in search.c
+ */
+int ldap_build_search_req( LDAP *ld, char *base, int scope,
+	char *filter, char **attrs, int attrsonly, LDAPControl **serverctrls,
+	LDAPControl **clientctrls, struct timeval *timeoutp, int sizelimit,
+	int msgid, BerElement **berp );
+
+/*
+ * in unbind.c
+ */
+int ldap_ld_free( LDAP *ld, int close );
+int nsldapi_send_unbind( LDAP *ld, Sockbuf *sb );
+
+#ifdef LDAP_DNS
+/*
+ * in getdxbyname.c
+ */
+char **nsldapi_getdxbyname( char *domain );
+
+#endif /* LDAP_DNS */
+
+/*
+ * in unescape.c
+ */
+void nsldapi_hex_unescape( char *s );
+
+/*
+ * in reslist.c
+ */
+LDAPMessage *ldap_delete_result_entry( LDAPMessage **list, LDAPMessage *e );
+void ldap_add_result_entry( LDAPMessage **list, LDAPMessage *e );
+
+/*
+ * in compat.c
+ */
+#ifdef hpux
+char *nsldapi_compat_ctime_r( const time_t *clock, char *buf, int buflen );
+struct hostent *nsldapi_compat_gethostbyname_r( const char *name,
+	struct hostent *result, char *buffer, int buflen, int *h_errnop );
+#endif /* hpux */
+
+/*
+ * in control.c
+ */
+int nsldapi_put_controls( LDAP *ld, LDAPControl **ctrls, int closeseq,
+	BerElement *ber );
+int nsldapi_get_controls( BerElement *ber, LDAPControl ***controlsp );
+int nsldapi_dup_controls( LDAP *ld, LDAPControl ***ldctrls,
+	LDAPControl **newctrls );
+int nsldapi_build_control( char *oid, BerElement *ber, int freeber,
+    char iscritical, LDAPControl **ctrlp );
+
+
+/*
+ * in url.c
+ */
+int nsldapi_url_parse( char *url, LDAPURLDesc **ludpp, int dn_required );
+
+
+/*
+ * in charset.c
+ *
+ * If we ever want to expose character set translation functionality to
+ * users of libldap, all of these prototypes will need to be moved to ldap.h
+ */
+#ifdef STR_TRANSLATION
+void ldap_set_string_translators( LDAP *ld,
+        BERTranslateProc encode_proc, BERTranslateProc decode_proc );
+int ldap_translate_from_t61( LDAP *ld, char **bufp,
+        unsigned long *lenp, int free_input );
+int ldap_translate_to_t61( LDAP *ld, char **bufp,
+        unsigned long *lenp, int free_input );
+void ldap_enable_translation( LDAP *ld, LDAPMessage *entry,
+        int enable );
+#ifdef LDAP_CHARSET_8859
+int ldap_t61_to_8859( char **bufp, unsigned long *buflenp,
+        int free_input );
+int ldap_8859_to_t61( char **bufp, unsigned long *buflenp,
+        int free_input );
+#endif /* LDAP_CHARSET_8859 */
+#endif /* STR_TRANSLATION */
+
+/*
+ * in memcache.h
+ */
+int ldap_memcache_createkey( LDAP *ld, const char *base, int scope,
+	const char *filter, char **attrs, int attrsonly,
+	LDAPControl **serverctrls, LDAPControl **clientctrls,
+	unsigned long *keyp );
+int ldap_memcache_result( LDAP *ld, int msgid, unsigned long key );
+int ldap_memcache_new( LDAP *ld, int msgid, unsigned long key,
+	const char *basedn );
+int ldap_memcache_append( LDAP *ld, int msgid, int bLast, LDAPMessage *result );
+int ldap_memcache_abandon( LDAP *ld, int msgid );
+
+#endif /* _LDAPINT_H */


Property changes on: trunk/third/moira/incremental/ldap/ldap-int.h
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/third/moira/incremental/ldap/ldap_adgssapi_bind.c
===================================================================
--- trunk/third/moira/incremental/ldap/ldap_adgssapi_bind.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/ldap_adgssapi_bind.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,1001 @@
+/*
+ * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
+ * CONFIDENTIAL
+ * $Id: ldap_adgssapi_bind.c,v 1.1 2009-02-25 22:29:51 zacheiss Exp $
+ *
+ * Implementation of GSS-API client side binding for SASL
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#ifndef _WIN32
+#include <sys/uio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#endif
+
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include <lber.h>
+#include <krb5.h>
+#include "ldap-int.h"
+#include "gssldap-int.h"
+
+#ifndef _WIN32
+typedef gss_uint32  OM_uint32;
+#endif
+
+#ifndef T_SRV
+#define T_SRV 33
+#endif
+#define LDAP_SERVICE	"_ldap"
+#define TCP_PROTOCOL	"_tcp"
+
+int locate_ldap_server(char *domain, char **server_name);
+int ldap_delete_tickets(LDAP *ld, char *service_name);
+static int negotiate_security_options(gssldap_client_state_t state, 
+                                      int layer);
+int ldap_reset_principal(LDAP *ld, char *service_name, gss_name_t target_name, 
+			 char *ldap_realm_name);
+unsigned long gsssasl_pack_security_token(OM_uint32 *min_stat, gss_ctx_id_t context,
+                                          gsssasl_security_negotiation_t inmask,
+                                          size_t masklength, gss_buffer_t wrapped_tok);
+
+int gsssasl_unpack_security_token(OM_uint32 *min_stat, gss_ctx_id_t context,
+                                  gss_buffer_t wrapped_tok,
+                                  gsssasl_security_negotiation_t *outmask,
+                                  size_t *masklength);
+
+#ifdef GSSSASL_DEBUG
+static int debug_ = 1;
+#define TRACE(x) do { if (debug_) fprintf(stderr, "%s\n", x); fflush(stderr); } while (0);
+#define LDAP_PERROR(ld, x) do { if (debug_) ldap_perror(ld, x); } while (0);
+#define LOG_STATUS(msg, min, maj) log_status(msg, min, maj)
+#else
+#define TRACE(x)
+#define LDAP_PERROR(ld, x)
+#define LOG_STATUS(msg, min, maj)
+#endif  /* GSSSASL_DEBUG */
+
+#ifdef HACK_SERVICE_NAME
+char *__service = NULL;
+#endif
+
+/*
+ * The read and write fns need to access the context in here and
+ * there doesn't appear to be a way to pass this info to them.
+ */
+static gss_ctx_id_t security_context;
+static int security_layer = 0;
+static unsigned long security_token_size = 0;
+
+LDAP_CALLBACK int LDAP_C ldap_gssapi_read(LBER_SOCKET sock, void *data,
+                                          int len)
+{
+  OM_uint32   maj_stat;
+  OM_uint32   min_stat;
+  OM_uint32   rc;
+  OM_uint32   pdulen;
+  gss_buffer_desc recv_tok;
+  gss_buffer_desc wrapped_tok;
+  int         count;
+
+  if (security_layer & 
+    (GSSSASL_INTEGRITY_PROTECTION | GSSSASL_PRIVACY_PROTECTION))
+    {
+      if (recv(sock, (char *)&pdulen, sizeof(pdulen), 0) != sizeof(pdulen))
+        return (0);
+      wrapped_tok.length = ntohl(pdulen);
+#ifdef GSSSASL_DEBUG
+      if (debug_)
+        {
+          fprintf(stderr, "Reading data of %d octets\n",
+                  wrapped_tok.length);
+        }
+#endif  /* GSSSASL_DEBUG */
+      if ((int)wrapped_tok.length > security_token_size)
+        return (0);
+      wrapped_tok.value = malloc(wrapped_tok.length);
+      if (wrapped_tok.value == NULL)
+        return (0);
+      count = recv(sock, wrapped_tok.value, wrapped_tok.length, 0);
+      if (count != (int)wrapped_tok.length)
+        {
+          gss_release_buffer(&rc, &wrapped_tok);
+          return (0);
+        }
+      maj_stat = gss_unwrap(&min_stat,
+                            security_context,
+                            &wrapped_tok,
+                            &recv_tok,
+                            &rc,
+                            (gss_qop_t *) NULL);
+      if (maj_stat != GSS_S_COMPLETE)
+        {
+          gss_release_buffer(&rc, &wrapped_tok);
+          return maj_stat;
+        }
+#ifdef GSSSASL_DEBUG
+      if (debug_)
+        {
+          fprintf(stderr, "Got %d bytes of %s data\n",
+                  recv_tok.length, rc ? "private" : "signed");
+        }
+#endif  /* GSSSASL_DEBUG */
+      if ((int)recv_tok.length > len)
+        {
+          gss_release_buffer(&rc, &recv_tok);
+          gss_release_buffer(&rc, &wrapped_tok);
+          return GSS_S_FAILURE;
+        }
+      memcpy(data, recv_tok.value, recv_tok.length);
+      pdulen = recv_tok.length;
+      gss_release_buffer(&rc, &recv_tok);
+      gss_release_buffer(&rc, &wrapped_tok);
+
+      return pdulen;
+    } 
+  else
+    return read(sock, data, len);
+}
+
+LDAP_CALLBACK int LDAP_C ldap_gssapi_write(LBER_SOCKET sock, const void  *data,
+                                           int len)
+{
+  OM_uint32   maj_stat;
+  OM_uint32   min_stat;
+  OM_uint32   pdulen;
+  OM_uint32   rc;
+  gss_buffer_desc send_tok;
+  gss_buffer_desc wrapped_tok;
+  unsigned char   *ptr;
+
+  if (security_layer & 
+      (GSSSASL_INTEGRITY_PROTECTION | GSSSASL_PRIVACY_PROTECTION))
+    {
+      send_tok.length = len;
+      send_tok.value = (void *) data;
+#ifdef GSSSASL_DEBUG
+      if (debug_)
+        {
+          fprintf(stderr, "Sending %d bytes of data\n",
+                  len);
+        }
+#endif  /* GSSSASL_DEBUG */
+      maj_stat = gss_wrap(&min_stat,
+                          security_context,
+                          (security_layer & GSSSASL_PRIVACY_PROTECTION) ? 1 : 0,
+                          GSS_C_QOP_DEFAULT,
+                          &send_tok,
+                          &rc,
+                          &wrapped_tok);
+      if (maj_stat != GSS_S_COMPLETE)
+        return maj_stat;
+#ifdef GSSSASL_DEBUG
+      if (debug_)
+        {
+          fprintf(stderr, "Sent %d bytes of %s data\n",
+                  wrapped_tok.length, rc ? "private" : "signed");
+        }
+#endif  /* GSSSASL_DEBUG */
+      pdulen = htonl(wrapped_tok.length);
+      ptr = calloc(1, sizeof(pdulen) + wrapped_tok.length);
+      memcpy(ptr, &pdulen, sizeof(pdulen));
+      memcpy(&ptr[sizeof(pdulen)], wrapped_tok.value, wrapped_tok.length);
+      rc = send(sock, ptr, sizeof(pdulen) + wrapped_tok.length, 0);
+      free(ptr);
+      if (rc == (wrapped_tok.length + sizeof(pdulen)))
+        rc = len;
+      gss_release_buffer(&maj_stat, &wrapped_tok);
+      return rc;
+    } 
+  else
+    return send(sock, data, len, 0);
+}
+
+#ifdef GSSSASL_DEBUG
+/*
+ * Dump the token to stderr
+ */
+static void print_token(gss_buffer_t tok)
+{
+  int i;
+  unsigned char *p = tok->value;
+
+  for (i = 0; i < (int)tok->length; i++, p++)
+    {
+      fprintf(stderr, "%02x ", *p);
+      if ((i % 16) == 15)
+        {
+          fprintf(stderr, "\n");
+        }
+    }
+  fprintf(stderr, "\n");
+  fflush(stderr);
+  return;
+}
+
+/*
+ * Handle a GSS-API error
+ */
+static void log_status_impl(const char *reason, OM_uint32 res, int type)
+{
+  OM_uint32 maj_stat, min_stat;
+  gss_buffer_desc msg;
+  OM_uint32 msg_ctx;
+
+  msg_ctx = 0;
+  while (1)
+    {
+      maj_stat = gss_display_status(&min_stat,
+                                    res,
+                                    type,
+                                    GSS_C_NULL_OID,
+                                    &msg_ctx,
+                                    &msg);
+
+      if (debug_)
+        {
+          fprintf(stderr, "ldap_adgssapi_bind: %s: %s\n",
+                  (char *) msg.value,
+                  reason);
+        }
+      (void) gss_release_buffer(&min_stat, &msg);
+      if (!msg_ctx)
+        break;
+    }
+  return;
+}
+
+/*
+ * Cover function to handle a GSS-API error
+ */
+static void log_status(const char *reason, OM_uint32 maj_stat,
+                       OM_uint32 min_stat)
+{
+  log_status_impl(reason, maj_stat, GSS_C_GSS_CODE);
+  log_status_impl(reason, min_stat, GSS_C_MECH_CODE);
+  return;
+}
+#endif  /* GSSSASL_DEBUG */
+
+/*
+ * Send a GSS-API token as part of a SASL BindRequest
+ */
+static int send_token(gssldap_client_state_t state, gss_buffer_t send_tok)
+{
+  struct berval cred;
+
+  TRACE("==> send_token");
+
+  cred.bv_val = send_tok->value;
+  cred.bv_len = send_tok->length;
+
+  if (ldap_sasl_bind(state->ld,
+                     state->binddn,
+                     GSSAPI_SASL_NAME,
+                     &cred,
+                     NULL,
+                     NULL,
+                     &state->msgid) != LDAP_SUCCESS)
+        {
+      LDAP_PERROR(state->ld, "send_token");
+      TRACE("<== send_token");
+      return -1;
+    }
+  TRACE("<== send_token");
+  return 0;
+}
+
+/*
+ * Parse the final result sent back from the server.
+ */
+static int parse_bind_result(gssldap_client_state_t state)
+{
+  LDAPMessage *res = NULL, *msg = NULL;
+  int rc;
+
+  TRACE("==> parse_bind_result");
+
+  if (ldap_result(state->ld,
+                  state->msgid,
+                  LDAP_MSG_ALL,
+                  NULL,
+                  &res) <= 0) 
+    {
+      LDAP_PERROR(state->ld, "ldap_result");
+      TRACE("<== parse_bind_result");
+      return -1;
+    }
+  for (msg = ldap_first_message(state->ld, res);
+  msg != NULL;
+  msg = ldap_next_message(state->ld, msg)) 
+    {
+      if (ldap_msgtype(msg) == LDAP_RES_BIND)
+        {
+          ldap_parse_result(state->ld, msg, &rc, NULL, NULL, NULL, NULL, 0);
+          break;
+        }
+     }
+
+  ldap_msgfree(res);
+  state->msgid = -1;
+
+  TRACE("<== parse_bind_result");
+
+  if (rc == LDAP_SUCCESS) 
+    {
+      return 0;
+    }
+  state->rc = rc;
+  return -1;
+}
+
+/*
+ * Receive a GSS-API token from a SASL BindResponse
+ * The contents of recv_tok must be freed by the 
+ * caller.
+ */
+static int recv_token(gssldap_client_state_t state, gss_buffer_t recv_tok)
+{
+  struct berval *servercred = NULL;
+  LDAPMessage *res = NULL, *msg = NULL;
+  int rc;
+
+  TRACE("==> recv_token");
+
+  if (ldap_result(state->ld, state->msgid, LDAP_MSG_ALL, NULL, &res) <= 0) 
+    {
+      LDAP_PERROR(state->ld, "ldap_result");
+      TRACE("<== recv_token");
+      return -1;
+    }
+  recv_tok->value = NULL;
+  recv_tok->length = 0;
+
+  for (msg = ldap_first_message(state->ld, res);
+  msg != NULL;
+  msg = ldap_next_message(state->ld, msg)) 
+    {
+    if (ldap_msgtype(msg) == LDAP_RES_BIND && servercred == NULL) 
+      {
+        rc = ldap_parse_sasl_bind_result(state->ld,
+                                         msg,
+                                         &servercred,
+                                         0);
+        if (rc == LDAP_SUCCESS && servercred != NULL) 
+          {
+            recv_tok->value = malloc(servercred->bv_len);
+            if (recv_tok->value != NULL) 
+              {
+                memcpy(recv_tok->value, servercred->bv_val, servercred->bv_len);
+                recv_tok->length = servercred->bv_len;
+              }
+            break;
+          } 
+        else 
+          {
+            state->rc = rc;
+          }
+      }
+  }
+
+  ldap_msgfree(res);
+  state->msgid = -1;
+  TRACE("<== recv_token");
+  if (servercred != NULL) 
+    {
+       nslberi_free(servercred);
+      TRACE("<== recv_token");
+      return 0;
+      }
+  if (state->rc == LDAP_SUCCESS) 
+    {
+      state->rc = LDAP_OPERATIONS_ERROR;
+    } 
+  else 
+    {
+      LDAP_PERROR(state->ld, "recv_token");
+    }
+
+  TRACE("<== recv_token");
+  return -1;
+}
+
+/*
+ * The client calls GSS_Init_sec_context, passing in 0 for
+ * input_context_handle (initially) and a targ_name equal to output_name
+ * from GSS_Import_Name called with input_name_type of
+ * GSS_C_NT_HOSTBASED_SERVICE and input_name_string of
+ * "service@hostname" where "service" is the service name specified in
+ * the protocol's profile, and "hostname" is the fully qualified host
+ * name of the server.  The client then responds with the resulting
+ * output_token.  If GSS_Init_sec_context returns GSS_S_CONTINUE_NEEDED,
+ * then the client should expect the server to issue a token in a
+ * subsequent challenge.  The client must pass the token to another call
+ * to GSS_Init_sec_context, repeating the actions in this paragraph.
+ */
+static int client_establish_context(LDAP *ld, gssldap_client_state_t state, 
+                                    char *service_name, char *ldap_realm_name)
+{
+  gss_buffer_desc send_tok;
+  gss_buffer_desc recv_tok;
+  gss_buffer_desc *token_ptr;
+  gss_name_t      target_name;
+  OM_uint32       maj_stat;
+  OM_uint32       min_stat;
+  gss_OID         oid = GSS_C_NULL_OID;
+  OM_uint32       ret_flags;
+
+  TRACE("==> client_establish_context");
+
+  memset(&recv_tok, '\0', sizeof(recv_tok));
+  send_tok.value = service_name;
+  send_tok.length = strlen(send_tok.value) + 1;
+
+  maj_stat = gss_import_name(&min_stat,
+                             &send_tok,
+                             (gss_OID) gss_nt_service_name,
+                             &target_name);
+  if (maj_stat)
+    return -1;
+  if (ldap_reset_principal(ld, service_name, target_name, ldap_realm_name))
+    {
+      TRACE("<== client_establish_context");
+      return -1;
+    }
+
+  token_ptr = GSS_C_NO_BUFFER;
+  state->context = GSS_C_NO_CONTEXT;
+
+  do 
+    {
+      maj_stat = gss_init_sec_context(&min_stat,
+                                        GSS_C_NO_CREDENTIAL,
+                                        &state->context,
+                                        target_name,
+                                        oid,
+                                        GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG,
+                                        0,
+                                        NULL,
+                                        token_ptr,
+                                        NULL,
+                                        &send_tok,
+                                        &ret_flags,
+                                        NULL);
+
+      if (token_ptr != GSS_C_NO_BUFFER)
+        (void) gss_release_buffer(&min_stat, &recv_tok);
+
+      if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED)
+        {
+          LOG_STATUS("initializing context", maj_stat, min_stat);
+          (void) gss_release_name(&min_stat, &target_name);
+          TRACE("<== client_establish_context");
+          return -1;
+        }
+#ifdef GSSSASL_DEBUG
+      if (debug_) 
+        {
+          fprintf(stderr, "Sending init_sec_context token (size=%d)...\n",
+          send_tok.length);
+          fflush(stderr);
+          print_token(&send_tok);
+        }
+#endif
+      if (send_token(state, &send_tok) < 0)
+        {
+          TRACE("Send_token failed");
+          (void) gss_release_buffer(&min_stat, &send_tok);
+          (void) gss_release_name(&min_stat, &target_name);
+          TRACE("<== client_establish_context");
+          return -1;
+        }
+      (void) gss_release_buffer(&min_stat, &send_tok);
+      if (maj_stat == GSS_S_CONTINUE_NEEDED) 
+        {
+          TRACE("continue needed...");
+          if (recv_token(state, &recv_tok) < 0) 
+            {
+              TRACE("recv_token failed");
+              (void) gss_release_name(&min_stat, &target_name);
+              TRACE("<== client_establish_context");
+              return -1;
+            }
+#ifdef GSSSASL_DEBUG
+          if (debug_)
+            {
+              fprintf(stderr, "Received token (size=%d)...\n",
+              recv_tok.length);
+              fflush(stderr);
+              print_token(&recv_tok);
+            }
+#endif
+          token_ptr = &recv_tok;
+        }
+    } while (maj_stat == GSS_S_CONTINUE_NEEDED);
+
+  (void) gss_release_name(&min_stat, &target_name);
+
+  TRACE("<== client_establish_context");
+  return 0;
+}
+
+/*
+ * When GSS_Init_sec_context returns GSS_S_COMPLETE, the client takes
+ * the following actions: If the last call to GSS_Init_sec_context
+ * returned an output_token, then the client responds with the
+ * output_token, otherwise the client responds with no data.  The client
+ * should then expect the server to issue a token in a subsequent
+ * challenge.  The client passes this token to GSS_Unwrap and interprets
+ * the first octet of resulting cleartext as a bit-mask specifying the
+ * security layers supported by the server and the second through fourth
+ * octets as the maximum size output_message to send to the server.  The
+ * client then constructs data, with the first octet containing the
+ * bit-mask specifying the selected security layer, the second through
+ * fourth octets containing in network byte order the maximum size
+ * output_message the client is able to receive, and the remaining
+ * octets containing the authorization identity.  The client passes the
+ * data to GSS_Wrap with conf_flag set to FALSE, and responds with the
+ * generated output_message.  The client can then consider the server
+ * authenticated.
+ */
+static int negotiate_security_options(gssldap_client_state_t state, 
+                                      int layer)
+{
+  OM_uint32       maj_stat;
+  OM_uint32       min_stat;
+  gss_buffer_desc recv_tok;
+  gss_buffer_desc send_tok;
+  OM_uint32       rc;
+  OM_uint32       ret;
+  size_t          mask_length;
+  gsssasl_security_negotiation_t  send_mask;
+  gsssasl_security_negotiation_t  recv_mask;
+
+  TRACE("==> negotiate_security_options");
+
+  memset(&send_tok, '\0', sizeof(send_tok));
+  memset(&recv_tok, '\0', sizeof(recv_tok));
+  if ((rc = recv_token(state, &recv_tok)) < 0)
+    {
+      TRACE("<== negotiate_security_options (recv_token failed)");
+      return rc;
+    }
+#ifdef GSSSASL_DEBUG
+  if (debug_)
+    {
+      fprintf(stderr, "Received token (size=%d)...\n",
+      recv_tok.length);
+      fflush(stderr);
+      print_token(&recv_tok);
+      }
+#endif  /* GSSSASL_DEBUG */
+
+  maj_stat = gsssasl_unpack_security_token(&min_stat,
+                                           state->context,
+                                           &recv_tok,
+                                           &recv_mask,
+                                           &mask_length);
+
+  if (maj_stat != GSS_S_COMPLETE)
+    {
+      LOG_STATUS("unpacking security negotiation token",
+                 maj_stat,
+                 min_stat);
+      TRACE("<== negotiate_security_options (unpack failed)");
+      return -1;
+    }
+#ifdef GSSSASL_DEBUG
+  if (debug_) 
+    {
+      fprintf(stderr, "Received security token level %d size %d\n",
+      recv_mask->security_layer,
+      recv_mask->token_size);
+      }
+#endif
+  if ((~recv_mask->security_layer) & layer) 
+    {
+      free(recv_mask);
+      TRACE("<== negotiate_security_options (unsupported security layer)");
+      return -1;
+      }
+  mask_length = sizeof(recv_mask);
+  send_mask = NSLDAPI_MALLOC(mask_length);
+  if (send_mask == NULL) 
+    {
+      free(recv_mask);
+      TRACE("<== negotiate_security_options (malloc failed)");
+      return -1;
+    }
+  memset(send_mask, '\0', mask_length);
+  send_mask->security_layer = layer;
+  send_mask->token_size = recv_mask->token_size;
+  memcpy(send_mask->identity, "", strlen(""));
+  free(recv_mask);
+
+#ifdef GSSSASL_DEBUG
+  if (debug_) 
+    {
+      fprintf(stderr, "Sending security token level %d size %d\n",
+      send_mask->security_layer,
+      send_mask->token_size);
+    }
+#endif
+  maj_stat = gsssasl_pack_security_token(&min_stat,
+                                         state->context,
+                                         send_mask,
+                                         mask_length,
+                                         &send_tok);
+  if (maj_stat != GSS_S_COMPLETE)
+    {
+      LOG_STATUS("packing security negotiation token", maj_stat, min_stat);
+      NSLDAPI_FREE(send_mask);
+      TRACE("<== negotiate_security_options (pack failed)");
+      return -1;
+    }
+  if ((rc = send_token(state, &send_tok)) < 0)
+    {
+      NSLDAPI_FREE(send_mask);
+      TRACE("<== negotiate_security_options (send_token failed)");
+      return rc;
+    }
+  rc = parse_bind_result(state);
+
+  ret = rc;
+  if (rc == 0) 
+    {
+      security_context = state->context;
+      security_layer = layer;
+      security_token_size = ntohl(send_mask->token_size);
+#ifdef _WIN32
+      security_token_size >>= 8;
+#endif
+      }
+
+  NSLDAPI_FREE(send_mask);
+  if (send_tok.value != NULL)
+    gss_release_buffer(&rc, &send_tok);
+  if (recv_tok.value != NULL)
+    gss_release_buffer(&rc, &recv_tok);
+  TRACE("<== negotiate_security_options");
+  return ret;
+}
+
+#ifdef GSSSASL_DEBUG
+/*
+ * Temporary function to enable debugging
+ */
+LDAP_API(int)
+LDAP_CALL ldap_gssapi_debug(int on)
+{
+  int old = debug_;
+  debug_ = on;
+  return old;
+}
+#endif  /* GSSSASL_DEBUG */
+
+/*
+ * Public function for doing a GSS-API SASL bind
+ */
+LDAP_API(int)
+     LDAP_CALL ldap_adgssapi_bind(LDAP *ld, const char *who, int layer, 
+				  char *ldap_domain_name, 
+				  char *ldap_realm_name, char *server)
+{
+  gssldap_client_state_desc state;
+  char        *service_name;
+  OM_uint32   min_stat;
+  int         rc;
+  int         i;
+  struct ldap_io_fns iofns;
+  char        *realm;
+
+  if (!NSLDAPI_VALID_LDAP_POINTER(ld) || ld->ld_defhost == NULL) 
+    {
+      return -1;
+    }
+
+  for (i = 0; i < (int)strlen(ld->ld_defhost); i++)
+    ld->ld_defhost[i] = toupper(ld->ld_defhost[i]);
+
+  service_name = 
+    NSLDAPI_MALLOC(sizeof(GSSAPI_LDAP_SERVICE_NAME "@") + 
+		   strlen(server));
+  if (service_name == NULL) 
+    {
+      return -1;
+    }
+  strcpy(service_name, GSSAPI_LDAP_SERVICE_NAME "@");
+  strcat(service_name, lowercase(server));
+  free(realm);
+
+#ifdef GSSSASL_DEBUG
+  if (debug_) 
+    {
+      fprintf(stderr, "LDAP service name: %s\n", service_name);
+      fflush(stderr);
+    }
+#endif
+
+  state.msgid = -1;
+  state.ld = ld;
+  state.binddn = who;
+  state.context = GSS_C_NO_CONTEXT;
+  state.rc = LDAP_OPERATIONS_ERROR;
+
+  rc = client_establish_context(ld, &state, service_name, ldap_realm_name);
+  if (rc == 0) 
+    {
+      rc = negotiate_security_options(&state, layer);
+    }
+  if (rc == 0) 
+    {
+#ifdef GSSSASL_DEBUG
+      gss_buffer_desc tname;
+      gss_buffer_desc sname;
+      gss_name_t      targ_name;
+      gss_name_t      src_name;
+      OM_uint32       context_flags;
+      OM_uint32       lifetime;
+      OM_uint32       maj_stat;
+      int             is_open;
+      int             is_local;
+      gss_OID         mechanism;
+      gss_OID         name_type;
+
+      maj_stat = gss_inquire_context(&min_stat,
+                                      state.context,
+                                      &src_name,
+                                      &targ_name,
+                                      &lifetime,
+                                      &mechanism,
+                                      &context_flags,
+                                      &is_local,
+                                      &is_open);
+      if (maj_stat != GSS_S_COMPLETE) 
+        {
+          LOG_STATUS("inquiring context", maj_stat, min_stat);
+          return LDAP_OPERATIONS_ERROR;
+        }
+      maj_stat = gss_display_name(&min_stat,
+                                  src_name,
+                                  &sname,
+                                  &name_type);
+      if (maj_stat != GSS_S_COMPLETE) 
+        {
+          LOG_STATUS("displaying source name", maj_stat, min_stat);
+          return LDAP_OPERATIONS_ERROR;
+        }
+      maj_stat = gss_display_name(&min_stat,
+                                  targ_name,
+                                  &tname,
+                                  (gss_OID *) NULL);
+      if (maj_stat != GSS_S_COMPLETE) 
+        {
+          LOG_STATUS("displaying target name", maj_stat, min_stat);
+          return LDAP_OPERATIONS_ERROR;
+        }
+      if (debug_) 
+        {
+          fprintf(stderr, 
+                  "\"%.*s\" to \"%.*s\", lifetime %d, flags %x, %s, %s\n",
+                  (int) sname.length, (char *) sname.value,
+                  (int) tname.length, (char *) tname.value, lifetime,
+                  context_flags,
+                  (is_local) ? "locally initiated" : "remotely initiated",
+                  (is_open) ? "open" : "closed");
+          fflush(stderr);
+        }
+      (void) gss_release_name(&min_stat, &src_name);
+      (void) gss_release_name(&min_stat, &targ_name);
+      (void) gss_release_buffer(&min_stat, &sname);
+      (void) gss_release_buffer(&min_stat, &tname);
+#endif
+      state.rc = LDAP_SUCCESS;
+    }
+
+  if (state.rc == LDAP_SUCCESS)
+    {
+      if (layer == GSSSASL_PRIVACY_PROTECTION)
+        {
+          memset(&iofns, 0, sizeof(iofns));
+          iofns.liof_read = ldap_gssapi_read;
+          iofns.liof_write = ldap_gssapi_write;
+          state.rc = ldap_set_option(ld, LDAP_OPT_IO_FN_PTRS, &iofns);
+        }
+    }
+
+  NSLDAPI_FREE(service_name);
+  LDAP_SET_LDERRNO(ld, state.rc, NULL, NULL);
+
+  return state.rc;
+}
+
+/* Wrap and encode a security negotiation token */
+unsigned long gsssasl_pack_security_token(OM_uint32 *min_stat, 
+                             gss_ctx_id_t context,
+                             gsssasl_security_negotiation_t inmask,
+                             size_t masklength, gss_buffer_t wrapped_tok)
+{
+  OM_uint32       maj_stat;
+  OM_uint32       rc;
+  gss_buffer_desc send_tok;
+
+  wrapped_tok->length = 0;
+  wrapped_tok->value = NULL;
+
+/*
+  if (masklength < sizeof(gsssasl_security_negotiation_desc))
+    return GSS_S_FAILURE;
+*/
+
+  inmask->token_size = inmask->token_size;
+
+  send_tok.length = masklength;
+  send_tok.value = inmask;
+
+  maj_stat = gss_wrap(min_stat,
+                      context,
+                      0,
+                      GSS_C_QOP_DEFAULT,
+                      &send_tok,
+                      (int *)&rc,
+                      wrapped_tok);
+
+/*  inmask->token_size = ntohl(inmask->token_size);*/
+
+  return maj_stat;
+}
+
+/* Unwrap and decode a security negotiation token. */
+int gsssasl_unpack_security_token(OM_uint32 *min_stat, gss_ctx_id_t context, 
+                                  gss_buffer_t wrapped_tok,
+                                  gsssasl_security_negotiation_t *outmask, 
+                                  size_t *masklength)
+{
+  OM_uint32       maj_stat;
+  OM_uint32       rc;
+  gss_buffer_desc recv_tok;
+
+  *masklength = 0;
+  *outmask = NULL;
+  memset(&recv_tok, '\0', sizeof(recv_tok));
+
+  maj_stat = gss_unwrap(min_stat,
+                        context,
+                        wrapped_tok,
+                        &recv_tok,
+                        (int *)&rc,
+                        (gss_qop_t *) NULL);
+  if (maj_stat != GSS_S_COMPLETE)
+    return maj_stat;
+
+/*
+#ifdef _WIN32
+  if (recv_tok.length < sizeof(gsssasl_security_negotiation_desc)) 
+    {
+      gss_release_buffer(&rc, &recv_tok);
+      return GSS_S_FAILURE;
+    }
+#endif
+*/
+
+  /*
+   * we're lazy and don't copy the token. This could cause
+   * problems if libgssapi uses a different malloc!
+   */
+  *masklength = recv_tok.length;
+  *outmask = (gsssasl_security_negotiation_t) recv_tok.value;
+  if (*outmask == NULL) 
+    {
+      gss_release_buffer(&rc, &recv_tok);
+      return GSS_S_FAILURE;
+    }
+  return GSS_S_COMPLETE;
+}
+
+int ldap_reset_principal(LDAP *ld, char *service_name, gss_name_t target_name, 
+			 char *ldap_realm_name)
+{
+  krb5_context    context = NULL;
+  krb5_principal  princ;
+  krb5_principal  princ1;
+  krb5_principal  temp_princ;
+  char            *realm;
+  char            *server_name = NULL;
+  int             i;
+
+  princ = (krb5_principal)(target_name);
+
+  if (krb5_init_context(&context))
+    return(-1);
+
+  realm = strdup(ldap_realm_name);
+  for (i = 0; i < (int)strlen(realm); i++)
+    realm[i] = toupper(realm[i]);
+  server_name = strdup(ld->ld_defhost);
+  for (i = 0; i < (int)strlen(server_name); i++)
+    server_name[i] = tolower(server_name[i]);
+
+  temp_princ = malloc(sizeof(*princ));
+  memcpy(temp_princ, princ, sizeof(*princ));
+
+  krb5_build_principal(context, &princ1, strlen(realm), realm, "ldap", 
+                       server_name, NULL);
+
+  memcpy(princ, princ1, sizeof(*princ1));
+  free(princ1);
+  krb5_free_principal(context, temp_princ);
+
+  if (realm != NULL)
+    free(realm);
+  if (server_name != NULL)
+    free(server_name);
+  if (context != NULL)
+    krb5_free_context(context);
+  return(0);
+}
+
+int ldap_delete_tickets(LDAP *ld, char *service_name)
+{
+  int             i;
+  int             rc;
+  krb5_context    context = NULL;
+  krb5_ccache     v5Cache = NULL;
+  krb5_creds      creds;
+  krb5_cc_cursor  v5Cursor;
+  krb5_error_code code;
+  char            *sServerName;
+
+  if (!NSLDAPI_VALID_LDAP_POINTER(ld) || ld->ld_defhost == NULL) 
+    {
+      return -1;
+    }
+
+  for (i = 0; i < (int)strlen(ld->ld_defhost); i++)
+    ld->ld_defhost[i] = toupper(ld->ld_defhost[i]);
+
+  rc = -1;
+
+  if (krb5_init_context(&context))
+    return(rc);
+
+  if (krb5_cc_default(context, &v5Cache))
+    goto cleanup;
+  if (krb5_cc_start_seq_get(context, v5Cache, &v5Cursor))
+    goto cleanup;
+
+  memset(&creds, '\0', sizeof(creds));
+
+  while (!(code = krb5_cc_next_cred(context, v5Cache, &v5Cursor, &creds))) 
+    {
+      if (krb5_unparse_name(context, creds.server, &sServerName))
+        {
+          krb5_free_cred_contents(context, &creds);
+          continue;
+        }
+      if (!memcmp(sServerName, service_name, strlen(service_name)))
+        {
+          krb5_cc_remove_cred(context, v5Cache, 0, &creds);
+        }
+      continue;
+    }
+
+  if ((code == KRB5_CC_END) || (code == KRB5_CC_NOTFOUND))
+    {
+      krb5_cc_end_seq_get(context, v5Cache, &v5Cursor);
+    }
+  rc = 0;
+
+cleanup:
+  if ((v5Cache != NULL) && (context != NULL))
+    krb5_cc_close(context, v5Cache);
+  if (context != NULL)
+    krb5_free_context(context);
+  return(rc);
+}


Property changes on: trunk/third/moira/incremental/ldap/ldap_adgssapi_bind.c
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/third/moira/incremental/ldap/setpw.c
===================================================================
--- trunk/third/moira/incremental/ldap/setpw.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/setpw.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,897 @@
+#define LDAP_AUTH_OTHERKIND             0x86L
+#define LDAP_AUTH_NEGOTIATE             (LDAP_AUTH_OTHERKIND | 0x0400)
+/*--
+
+THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+PARTICULAR PURPOSE.
+
+Copyright (C) 1999  Microsoft Corporation.  All rights reserved.
+
+Module Name:
+
+    setpw.c
+
+Abstract:
+
+    Set a user's password using the
+    Kerberos Change Password Protocol (I-D) variant for Windows 2000
+
+--*/
+/*
+ * lib/krb5/os/changepw.c
+ *
+ * Copyright 1990 by the Massachusetts Institute of Technology.
+ * All Rights Reserved.
+ *
+ * Export of this software from the United States of America may 
+ *   require a specific license from the United States Government.
+ *   It is the responsibility of any person or organization contemplating
+ *   export to obtain such a license before exporting.
+ * 
+ * WITHIN THAT CONSTRAINT, 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 name of M.I.T. not be used in advertising or publicity pertaining
+ * to distribution of the software without specific, written prior
+ * permission.  M.I.T. makes no representations about the suitability of
+ * this software for any purpose.  It is provided "as is" without express
+ * or implied warranty.
+ * 
+ */
+
+
+#define NEED_SOCKETS
+#ifndef _WIN32
+#include "port-sockets.h"
+#endif
+#include <krb5.h>
+#include <krb.h>
+#include <ldap.h>
+#ifdef _WIN32
+#include <wshelper.h>
+#include "krb5_err.h"
+#else
+#include <sys/socket.h>
+#include <netdb.h>
+#include <sys/select.h>
+#endif
+#include <auth_con.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/timeb.h>
+#include <errno.h>
+#include "kpasswd.h"
+#include "gsssasl.h"
+#include "gssldap.h"
+
+#define PW_LENGTH 25
+#define KDC_PORT  464
+#define ULONG     unsigned long
+
+#ifndef krb5_is_krb_error
+#define krb5_is_krb_error(dat)\
+            ((dat) && (dat)->length && ((dat)->data[0] == 0x7e ||\
+            (dat)->data[0] == 0x5e))
+#endif
+
+#ifdef _WIN32
+extern krb5_error_code decode_krb5_error
+	(const krb5_data *output, krb5_error **rep);
+#define sleep(Seconds) Sleep(Seconds * 1000)
+#define gethostbyname(Server) rgethostbyname(Server)
+#endif
+
+/* Win32 defines. */
+#if defined(_WIN32) && !defined(__CYGWIN32__)
+#ifndef ECONNABORTED
+#define ECONNABORTED WSAECONNABORTED
+#endif
+#ifndef ECONNREFUSED
+#define ECONNREFUSED WSAECONNREFUSED
+#endif
+#ifndef EHOSTUNREACH
+#define EHOSTUNREACH WSAEHOSTUNREACH
+#endif
+#endif /* _WIN32 && !__CYGWIN32__ */
+
+static const char rcsid[] = "$Id: setpw.c,v 1.1 2009-02-25 22:29:51 zacheiss Exp $";
+
+static int frequency[26][26] =
+{ {4, 20, 28, 52, 2, 11, 28, 4, 32, 4, 6, 62, 23, 167, 2, 14, 0, 83, 76, 
+127, 7, 25, 8, 1, 9, 1}, /* aa - az */
+   {13, 0, 0, 0, 55, 0, 0, 0, 8, 2, 0, 22, 0, 0, 11, 0, 0, 15, 4, 2, 13, 0, 
+0, 0, 15, 0}, /* ba - bz */
+   {32, 0, 7, 1, 69, 0, 0, 33, 17, 0, 10, 9, 1, 0, 50, 3, 0, 10, 0, 28, 11, 
+0, 0, 0, 3, 0}, /* ca - cz */
+   {40, 16, 9, 5, 65, 18, 3, 9, 56, 0, 1, 4, 15, 6, 16, 4, 0, 21, 18, 53, 
+19, 5, 15, 0, 3, 0}, /* da - dz */
+   {84, 20, 55, 125, 51, 40, 19, 16, 50, 1, 4, 55, 54, 146, 35, 37, 6, 191, 
+149, 65, 9, 26, 21, 12, 5, 0}, /* ea - ez */
+   {19, 3, 5, 1, 19, 21, 1, 3, 30, 2, 0, 11, 1, 0, 51, 0, 0, 26, 8, 47, 6, 
+3, 3, 0, 2, 0}, /* fa - fz */
+   {20, 4, 3, 2, 35, 1, 3, 15, 18, 0, 0, 5, 1, 4, 21, 1, 1, 20, 9, 21, 9, 
+0, 5, 0, 1, 0}, /* ga - gz */
+   {101, 1, 3, 0, 270, 5, 1, 6, 57, 0, 0, 0, 3, 2, 44, 1, 0, 3, 10, 18, 6, 
+0, 5, 0, 3, 0}, /* ha - hz */
+   {40, 7, 51, 23, 25, 9, 11, 3, 0, 0, 2, 38, 25, 202, 56, 12, 1, 46, 79, 
+117, 1, 22, 0, 4, 0, 3}, /* ia - iz */
+   {3, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 3, 0, 0, 0, 
+0, 0}, /* ja - jz */
+   {1, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 2, 0, 0, 0, 0, 6, 2, 1, 0, 2, 
+0, 1, 0}, /* ka - kz */
+   {44, 2, 5, 12, 62, 7, 5, 2, 42, 1, 1, 53, 2, 2, 25, 1, 1, 2, 16, 23, 9, 
+0, 1, 0, 33, 0}, /* la - lz */
+   {52, 14, 1, 0, 64, 0, 0, 3, 37, 0, 0, 0, 7, 1, 17, 18, 1, 2, 12, 3, 8, 
+0, 1, 0, 2, 0}, /* ma - mz */
+   {42, 10, 47, 122, 63, 19, 106, 12, 30, 1, 6, 6, 9, 7, 54, 7, 1, 7, 44, 
+124, 6, 1, 15, 0, 12, 0}, /* na - nz */
+   {7, 12, 14, 17, 5, 95, 3, 5, 14, 0, 0, 19, 41, 134, 13, 23, 0, 91, 23, 
+42, 55, 16, 28, 0, 4, 1}, /* oa - oz */
+   {19, 1, 0, 0, 37, 0, 0, 4, 8, 0, 0, 15, 1, 0, 27, 9, 0, 33, 14, 7, 6, 0, 
+0, 0, 0, 0}, /* pa - pz */
+   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 
+0, 0, 0}, /* qa - qz */
+   {83, 8, 16, 23, 169, 4, 8, 8, 77, 1, 10, 5, 26, 16, 60, 4, 0, 24, 37, 
+55, 6, 11, 4, 0, 28, 0}, /* ra - rz */
+   {65, 9, 17, 9, 73, 13, 1, 47, 75, 3, 0, 7, 11, 12, 56, 17, 6, 9, 48, 
+116, 35, 1, 28, 0, 4, 0}, /* sa - sz */
+   {57, 22, 3, 1, 76, 5, 2, 330, 126, 1, 0, 14, 10, 6, 79, 7, 0, 49, 50, 
+56, 21, 2, 27, 0, 24, 0}, /* ta - tz */
+   {11, 5, 9, 6, 9, 1, 6, 0, 9, 0, 1, 19, 5, 31, 1, 15, 0, 47, 39, 31, 0, 
+3, 0, 0, 0, 0}, /* ua - uz */
+   {7, 0, 0, 0, 72, 0, 0, 0, 28, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 
+0, 3, 0}, /* va - vz */
+   {36, 1, 1, 0, 38, 0, 0, 33, 36, 0, 0, 4, 1, 8, 15, 0, 0, 0, 4, 2, 0, 0, 
+1, 0, 0, 0}, /* wa - wz */
+   {1, 0, 2, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 3, 0, 0, 1, 0, 
+0, 0}, /* xa - xz */
+   {14, 5, 4, 2, 7, 12, 12, 6, 10, 0, 0, 3, 7, 5, 17, 3, 0, 4, 16, 30, 0, 
+0, 5, 0, 0, 0}, /* ya - yz */
+   {1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+0, 0}}; /* za - zz */
+
+/*
+ * This MUST be equal to the sum of the equivalent rows above.
+ */
+
+static int row_sums[26] =
+{796,160,284,401,1276,262,199,539,777,	
+  16,39,351,243,751,662,181,17,683,	
+  662,968,248,115,180,17,162,5};
+
+/*
+ * Frequencies of starting characters
+ */
+
+static int start_freq [26] =
+{1299,425,725,271,375,470,93,223,1009,
+ 24,20,355,379,319,823,618,21,317,
+ 962,1991,271,104,516,6,16,14};
+
+/*
+ * This MUST be equal to the sum of all elements in the above array.
+ */
+
+struct sockaddr_in  kdc_server;
+SOCKET              kdc_socket;
+krb5_context        context;
+krb5_ccache         ccache;
+krb5_auth_context   auth_context = NULL;
+krb5_data           ap_req;
+krb5_creds          *credsp = NULL;
+krb5_creds          creds;
+char                connected_server[128];
+
+static int total_sum = 11646;
+
+int get_krb5_error(krb5_error_code rc, char *in, char *out);
+int ad_connect(LDAP **ldap_handle, char *ldap_domain, char *dn_path, 
+               char *Win2kPassword, char *Win2kUser, char *default_server, 
+               int connect_to_kdc, char **ServerList, char *ldap_realm,
+	       char *ldap_port);
+int ad_kdc_connect(char *connectedServer);
+int ad_server_connect(char *connectedServer, char *domain);
+void ad_kdc_disconnect();
+int compare_elements(const void *arg1, const void *arg2);
+int convert_domain_to_dn(char *domain, char *dnp);
+int set_password(char *user, char *password, char *domain);
+
+int locate_ldap_server(char *domain, char **server_name);
+
+long myrandom();
+void generate_password(char *password);
+
+#ifdef WIN32
+krb5_error_code encode_krb5_setpw
+        PROTOTYPE((const krb5_setpw *rep, krb5_data ** code));
+#endif
+
+krb5_error_code make_setpw_req(krb5_context context,  krb5_auth_context auth_context,
+                                  krb5_data *ap_req, krb5_principal targprinc,
+                                  char *passwd, krb5_data *packet)
+{
+  krb5_error_code  ret;
+  krb5_setpw       setpw;
+  krb5_data        cipherpw;
+  krb5_data        *encoded_setpw;
+  krb5_replay_data replay;
+  char             *ptr;
+  register int     count = 2;
+
+  memset(&setpw, 0, sizeof(krb5_setpw));
+  if (ret = krb5_auth_con_setflags(context, auth_context,
+                                   KRB5_AUTH_CONTEXT_DO_SEQUENCE))
+    return(ret);
+  setpw.targprinc = targprinc;
+  setpw.newpasswd.length = strlen(passwd);
+  setpw.newpasswd.data = passwd;
+  if ((ret = encode_krb5_setpw(&setpw, &encoded_setpw)))
+    return( ret );
+  if (ret = krb5_mk_priv(context, auth_context,
+                         encoded_setpw, &cipherpw, &replay))
+    return(ret);
+  packet->length = 6 + ap_req->length + cipherpw.length;
+  packet->data = (char *) malloc(packet->length);
+  ptr = packet->data;
+  /* Length */
+  *ptr++ = (packet->length>>8) & 0xff;
+  *ptr++ = packet->length & 0xff;
+  /* version */
+  *ptr++ = (char)0xff;
+  *ptr++ = (char)0x80;
+  /* ap_req length, big-endian */
+  *ptr++ = (ap_req->length>>8) & 0xff;
+  *ptr++ = ap_req->length & 0xff;
+  /* ap-req data */
+  memcpy(ptr, ap_req->data, ap_req->length);
+  ptr += ap_req->length;
+  /* krb-priv of password */
+  memcpy(ptr, cipherpw.data, cipherpw.length);
+  free(cipherpw.data);
+/*  krb5_free_data_contents(context, &cipherpw);*/
+  krb5_free_data(context, encoded_setpw);
+  return(0);
+}
+
+krb5_error_code get_setpw_rep(krb5_context context, krb5_auth_context auth_context,
+                              krb5_data *packet, int *result_code,
+                              krb5_data *result_data)
+{
+  char             *ptr;
+  int              plen;
+  int              vno;
+  krb5_data        ap_rep;
+  krb5_error_code  ret;
+  krb5_data        cipherresult;
+  krb5_data        clearresult;
+  krb5_error       *krberror;
+  krb5_replay_data replay;
+  krb5_ap_rep_enc_part *ap_rep_enc;
+
+  if (packet->length < 4)
+    return(KRB5KRB_AP_ERR_MODIFIED);
+  ptr = packet->data;
+  if (krb5_is_krb_error(packet))
+    {
+      ret = decode_krb5_error(packet, &krberror);
+      if (ret)
+        return(ret);
+      ret = krberror->error;
+      krb5_free_error(context, krberror);
+      return(ret);
+    }
+  /* verify length */
+  plen = (*ptr++ & 0xff);
+  plen = (plen<<8) | (*ptr++ & 0xff);
+  if (plen != (int)packet->length)
+    return(KRB5KRB_AP_ERR_MODIFIED);
+  vno = (*ptr++ & 0xff);
+  vno = (vno<<8) | (*ptr++ & 0xff);
+  if (vno != KRB5_KPASSWD_VERS_SETPW && vno != KRB5_KPASSWD_VERS_CHANGEPW)
+    return(KRB5KDC_ERR_BAD_PVNO);
+  /* read, check ap-rep length */
+  ap_rep.length = (*ptr++ & 0xff);
+  ap_rep.length = (ap_rep.length<<8) | (*ptr++ & 0xff);
+  if (ptr + ap_rep.length >= packet->data + packet->length)
+    return(KRB5KRB_AP_ERR_MODIFIED);
+  if (ap_rep.length)
+    {
+      /* verify ap_rep */
+      ap_rep.data = ptr;
+      ptr += ap_rep.length;
+      if (ret = krb5_rd_rep(context, auth_context, &ap_rep, &ap_rep_enc))
+        return(ret);
+      krb5_free_ap_rep_enc_part(context, ap_rep_enc);
+      /* extract and decrypt the result */
+      cipherresult.data = ptr;
+      cipherresult.length = (packet->data + packet->length) - ptr;
+      /* XXX there's no api to do this right. The problem is that
+         if there's a remote subkey, it will be used.  This is
+         not what the spec requires */
+      ret = krb5_rd_priv(context, auth_context, &cipherresult, &clearresult,
+                         &replay);
+      if (ret)
+        return(ret);
+    }
+  else
+    {
+      cipherresult.data = ptr;
+      cipherresult.length = (packet->data + packet->length) - ptr;
+
+      if (ret = krb5_rd_error(context, &cipherresult, &krberror))
+        return(ret);
+
+      clearresult = krberror->e_data;
+    }
+  if (clearresult.length < 2)
+    {
+      ret = KRB5KRB_AP_ERR_MODIFIED;
+      goto cleanup;
+    }
+  ptr = clearresult.data;
+  *result_code = (*ptr++ & 0xff);
+  *result_code = (*result_code<<8) | (*ptr++ & 0xff);
+  if ((*result_code < KRB5_KPASSWD_SUCCESS) ||
+      (*result_code > KRB5_KPASSWD_ACCESSDENIED))
+    {
+      ret = KRB5KRB_AP_ERR_MODIFIED;
+        goto cleanup;
+    }
+  /* all success replies should be authenticated/encrypted */
+  if ((ap_rep.length == 0) && (*result_code == KRB5_KPASSWD_SUCCESS))
+    {
+      ret = KRB5KRB_AP_ERR_MODIFIED;
+        goto cleanup;
+    }
+  result_data->length = (clearresult.data + clearresult.length) - ptr;
+  if (result_data->length)
+    {
+      result_data->data = (char *) malloc(result_data->length);
+      memcpy(result_data->data, ptr, result_data->length);
+    }
+  else
+      result_data->data = NULL;
+  ret = 0;
+cleanup:
+  if (ap_rep.length)
+    free(clearresult.data);
+  else
+      krb5_free_error(context, krberror);
+  return(ret);
+}
+
+krb5_error_code kdc_set_password(krb5_context context, krb5_ccache ccache,
+                                  char *newpw, char *user, char *domain,
+                                  int *result_code)
+{
+  krb5_data         chpw_snd;
+  krb5_data         chpw_rcv;
+  krb5_data         result_string;
+  krb5_address      local_kaddr;
+  krb5_address      remote_kaddr;
+  char              userrealm[256];
+  char              temp[256];
+  krb5_error_code   code;
+  struct sockaddr   local_addr;
+  struct sockaddr   remote_addr;
+  int               i;
+  int               addrlen;
+  int               cc;
+  int               local_result_code;
+  int               nfds;
+  krb5_principal    targprinc;
+  struct timeval    TimeVal;
+  fd_set            readfds;
+
+  memset(&local_addr, 0, sizeof(local_addr));
+  memset(&local_kaddr, 0, sizeof(local_kaddr));
+  memset(&result_string, 0, sizeof(result_string));
+  memset(&remote_kaddr, 0, sizeof(remote_kaddr));
+  memset(&chpw_snd, 0, sizeof(krb5_data));
+  memset(&chpw_rcv, 0, sizeof(krb5_data));
+  memset(userrealm, '\0', sizeof(userrealm));
+  targprinc = NULL;
+
+  chpw_rcv.length = 1500;
+  chpw_rcv.data = (char *) calloc(1, chpw_rcv.length);
+
+  for (i = 0; i < (int)strlen(domain); i++)
+    userrealm[i] = toupper(domain[i]);
+
+  sprintf(temp, "%s@%s", user, userrealm);
+  krb5_parse_name(context, temp, &targprinc);
+
+  if (credsp == NULL)
+    {
+      memset(&creds, 0, sizeof(creds));
+      memset(&ap_req, 0, sizeof(krb5_data));
+      sprintf(temp, "%s@%s", "kadmin/changepw", userrealm);
+      if (code = krb5_parse_name(context, temp, &creds.server))
+        goto cleanup;
+      if (code = krb5_cc_get_principal(context, ccache, &creds.client))
+        goto cleanup;
+      if (code = krb5_get_credentials(context, 0, ccache, &creds, &credsp))
+        goto cleanup;
+      if (code = krb5_mk_req_extended(context, &auth_context, AP_OPTS_USE_SUBKEY,
+                                      NULL, credsp, &ap_req))
+        goto cleanup;
+    }
+
+  addrlen = sizeof(local_addr);
+  if (getsockname(kdc_socket, &local_addr, &addrlen) < 0)
+    {
+      code = KDC_GETSOCKNAME_ERROR;
+      goto cleanup;
+    }
+  if (((struct sockaddr_in *)&local_addr)->sin_addr.s_addr != 0)
+    {
+      local_kaddr.addrtype = ADDRTYPE_INET;
+      local_kaddr.length =
+        sizeof(((struct sockaddr_in *) &local_addr)->sin_addr);
+      local_kaddr.contents = 
+        (char *) &(((struct sockaddr_in *) &local_addr)->sin_addr);
+    }
+  else
+    {
+      krb5_address **addrs;
+      krb5_os_localaddr(context, &addrs);
+      local_kaddr.magic = addrs[0]->magic;
+      local_kaddr.addrtype = addrs[0]->addrtype;
+      local_kaddr.length = addrs[0]->length;
+      local_kaddr.contents = calloc(1, addrs[0]->length);
+      memcpy(local_kaddr.contents, addrs[0]->contents, addrs[0]->length);
+      krb5_free_addresses(context, addrs);
+    }
+
+  addrlen = sizeof(remote_addr);
+  if (getpeername(kdc_socket, &remote_addr, &addrlen) < 0)
+    {
+      code = KDC_GETPEERNAME_ERROR;
+      goto cleanup;
+    }
+  remote_kaddr.addrtype = ADDRTYPE_INET;
+  remote_kaddr.length = sizeof(((struct sockaddr_in *) &remote_addr)->sin_addr);
+  remote_kaddr.contents = (char *) &(((struct sockaddr_in *) &remote_addr)->sin_addr);
+
+  if (code = krb5_auth_con_setaddrs(context, auth_context, &local_kaddr, NULL))
+    goto cleanup;
+  if (code = make_setpw_req(context, auth_context, &ap_req,
+                               targprinc, newpw, &chpw_snd))
+    goto cleanup;
+
+  for (i = 0; i < 3; i++)
+    {
+      if ((cc = sendto(kdc_socket, chpw_snd.data, chpw_snd.length, 0,
+                       NULL,
+                       0)) != (int)chpw_snd.length)
+        {
+          code = KDC_SEND_ERROR;
+          sleep(1);
+          continue;
+        }
+
+      TimeVal.tv_sec = 3;
+      TimeVal.tv_usec = 0;
+      FD_ZERO(&readfds);
+      FD_SET(kdc_socket, &readfds);
+      nfds = kdc_socket + 1;
+      code = select(nfds, &readfds, NULL, NULL, &TimeVal);
+      if ((code == 0) || (code == SOCKET_ERROR))
+        {
+          code = KDC_RECEIVE_TIMEOUT;
+          sleep(1);
+          continue;
+        }
+
+      if ((cc = recvfrom(kdc_socket, chpw_rcv.data, chpw_rcv.length, 0, 
+                         NULL, NULL)) < 0)
+        {
+          code = KDC_RECEIVE_TIMEOUT;
+          sleep(1);
+          continue;
+        }
+      chpw_rcv.length = cc;
+      if (code = krb5_auth_con_setaddrs(context, auth_context, NULL, &remote_kaddr))
+        {
+          sleep(1);
+          continue;
+        }
+      local_result_code = 0;
+      code = get_setpw_rep(context, auth_context, &chpw_rcv,
+                           &local_result_code, &result_string);
+
+      if (local_result_code)
+        {
+          if (local_result_code == KRB5_KPASSWD_SOFTERROR)
+            local_result_code = KRB5_KPASSWD_SUCCESS;
+          *result_code = local_result_code;
+        }
+      if ((code == 0) && (local_result_code == 0))
+        break;
+      sleep(1);
+    }
+
+cleanup:
+  if (chpw_snd.data != NULL)
+    free(chpw_snd.data);
+  if (chpw_rcv.data != NULL)
+    free(chpw_rcv.data);
+  if (targprinc != NULL)
+    krb5_free_principal(context, targprinc);
+  return(code);
+}
+
+int set_password(char *user, char *password, char *domain)
+{
+  int             res_code;
+  krb5_error_code retval;
+  char            pw[PW_LENGTH+1];
+
+  memset(pw, '\0', sizeof(pw));
+  if (strlen(password) != 0)
+    strcpy(pw, password);
+  else
+    generate_password(pw);
+  res_code = 0;
+  retval = kdc_set_password(context, ccache, pw, user, domain, &res_code);
+
+  if (res_code)
+    return(res_code);
+  return(retval);
+}
+
+void generate_password(char *password)
+{
+  int   i;
+  int   j;
+  int   row_position;
+  int   nchars;
+  int   position;
+  int   word;
+  int   line;
+  char  *pwp;
+
+  for (line = 22; line; --line)
+    {
+      for (word = 7; word; --word)
+        {
+          position = myrandom()%total_sum;
+          for(row_position = 0, j = 0; position >= row_position; row_position += start_freq[j], j++)
+            continue;
+          *(pwp = password) = j + 'a' - 1;
+          for (nchars = PW_LENGTH-1; nchars; --nchars)
+            {
+              i = *pwp - 'a';
+              pwp++;
+              position = myrandom()%row_sums[i];
+              for (row_position = 0, j = 0; position >= row_position; row_position += frequency[i][j], j++)
+                continue;
+              *pwp = j + 'a' - 1;
+            }
+          *(++pwp)='\0';
+          return;
+        }
+      putchar('\n');
+    }
+}
+
+long myrandom()
+{
+  static int init = 0;
+  int pid;
+#ifdef _WIN32
+  struct _timeb timebuffer;
+#else
+  struct timeval tv;
+#endif
+
+  if (!init)
+    {
+      init = 1;
+      pid = getpid();
+#ifdef _WIN32
+      _ftime(&timebuffer);
+      srand(timebuffer.time ^ timebuffer.millitm ^ pid);
+#else
+      gettimeofday(&tv, (struct timezone *) NULL);
+      srandom(tv.tv_sec ^ tv.tv_usec ^ pid);
+#endif
+    }
+  return (rand());
+}
+
+int get_krb5_error(krb5_error_code rc, char *in, char *out)
+{
+  int krb5Error;
+  int retval;
+
+  retval = 1;
+
+  if (rc < 0)
+    {
+      krb5Error = ((int)(rc & 255));
+      sprintf(out, "%s: %s(%ld)", in, error_message(rc), krb5Error);
+    }
+  else
+    {
+      switch (rc)
+        {
+          case KDC_RECEIVE_TIMEOUT:
+            {
+              retval = 0;
+              sprintf(out, "%s: %s(%d)", in, "Receive timeout", rc);
+              break;
+            }
+          case KDC_RECEIVE_ERROR:
+            {
+              retval = 0;
+              sprintf(out, "%s: %s(%d)", in, "Receive error", rc);
+              break;
+            }
+          case KRB5_KPASSWD_MALFORMED:
+            {
+              sprintf(out, "%s: %s(%d)", in, "malformed password", rc);
+              break;
+            }
+          case KRB5_KPASSWD_HARDERROR:
+            {
+              sprintf(out, "%s: %s(%d)", in, "hard error", rc);
+              break;
+            }
+          case KRB5_KPASSWD_AUTHERROR:
+            {
+              retval = 0;
+              sprintf(out, "%s: %s(%d)", in, "authentication error", rc);
+              break;
+            }
+          case KRB5_KPASSWD_SOFTERROR:
+            {
+              retval = 0;
+              sprintf(out, "%s: %s(%d)", in, "soft error", rc);
+              break;
+            }
+          case KRB5_KPASSWD_ACCESSDENIED:
+            {
+              sprintf(out, "%s: %s(%d)", in, "Access denied", rc);
+              break;
+            }
+          case KDC_SEND_ERROR:
+            {
+              retval = 0;
+              sprintf(out, "%s: %s(%d)", in, "Send error", rc);
+              break;
+            }
+          case KDC_GETSOCKNAME_ERROR:
+            {
+              retval = 0;
+              sprintf(out, "%s: %s(%d)", in, "Socket error - getsockname", rc);
+              break;
+            }
+          case KDC_GETPEERNAME_ERROR:
+            {
+              retval = 0;
+              sprintf(out, "%s: %s(%d)", in, "Socket error - getpeername", rc);
+              break;
+            }
+          default:
+            {
+              sprintf(out, "%s: %s(%d)", in, "unknown error", rc);
+              break;
+            }
+        }
+    }
+  return(retval);
+}
+
+int ad_connect(LDAP **ldap_handle, char *ldap_domain, char *dn_path, 
+               char *Win2kPassword, char *Win2kUser, char *default_server,
+               int connect_to_kdc, char **ServerList, char *ldap_realm,
+	       char *ldap_port)
+{
+  int         i;
+  int         k;
+  int         Count;
+  char        *server_name[MAX_SERVER_NAMES];
+  static char temp[128];
+  ULONG       version = LDAP_VERSION3;
+  ULONG       rc;
+  int         Max_wait_time = 1000;
+  int         Max_size_limit = LDAP_NO_LIMIT;
+
+  if (strlen(ldap_domain) == 0)
+      return(1);
+
+  if (strlen(ldap_port) == 0)
+    return(1);
+
+  convert_domain_to_dn(ldap_domain, dn_path);
+  if (strlen(dn_path) == 0)
+      return(1);
+
+  Count = 0;
+  while (ServerList[Count] != NULL)
+      ++Count;
+
+  if ((Count == 0) && (connect_to_kdc))
+      return(1);
+
+  for (i = 0; i < Count; i++)
+    {
+      if (ServerList[i] == NULL)
+          continue;
+
+      if (((*ldap_handle) = ldap_open(ServerList[i], atoi(ldap_port))) != NULL)
+        {
+          rc = ldap_set_option((*ldap_handle), LDAP_OPT_PROTOCOL_VERSION, 
+			       &version);
+          rc = ldap_set_option((*ldap_handle), LDAP_OPT_TIMELIMIT, 
+                               (void *)&Max_wait_time);
+          rc = ldap_set_option((*ldap_handle), LDAP_OPT_SIZELIMIT, 
+                               (void *)&Max_size_limit);
+          rc = ldap_set_option((*ldap_handle), LDAP_OPT_REFERRALS, 
+			       LDAP_OPT_OFF);
+          rc = ldap_adgssapi_bind((*ldap_handle), "", 
+				  GSSSASL_NO_SECURITY_LAYER, ldap_domain, 
+				  ldap_realm, ServerList[i]);
+          if (rc == LDAP_SUCCESS)
+            {
+              if (connect_to_kdc)
+                {
+                  if (!ad_server_connect(ServerList[i], ldap_domain))
+                    {
+                      ldap_unbind_s((*ldap_handle));
+                      (*ldap_handle) = NULL;
+                      continue;
+                    }
+                }
+              if (strlen(default_server) == 0)
+                  strcpy(default_server, ServerList[i]);
+              strcpy(connected_server, ServerList[i]);
+              break;
+            }
+          else
+            {
+              (*ldap_handle) = NULL;
+            }
+        }
+    }
+  if ((*ldap_handle) == NULL)
+    return(1);
+  return(0);
+}
+
+int ad_server_connect(char *connectedServer, char *domain)
+{
+  krb5_error_code   rc;
+  krb5_creds        creds;
+  krb5_creds        *credsp;
+  char              temp[256];
+  char              userrealm[256];
+  int               i;
+  unsigned short    port = KDC_PORT;
+
+  context = NULL;
+  credsp = NULL;
+  memset(&ccache, 0, sizeof(ccache));
+  memset(&creds, 0, sizeof(creds));
+  memset(userrealm, '\0', sizeof(userrealm));
+
+  rc = 0;
+  if (krb5_init_context(&context))
+    goto cleanup;
+  if (krb5_cc_default(context, &ccache))
+    goto cleanup;
+
+  for (i = 0; i < (int)strlen(domain); i++)
+    userrealm[i] = toupper(domain[i]);
+  sprintf(temp, "%s@%s", "kadmin/changepw", userrealm);
+  if (krb5_parse_name(context, temp, &creds.server))
+    goto cleanup;
+  if (krb5_cc_get_principal(context, ccache, &creds.client))
+    goto cleanup;
+  if (krb5_get_credentials(context, 0, ccache, &creds, &credsp))
+    goto cleanup;
+
+  rc = ad_kdc_connect(connectedServer);
+
+
+cleanup:
+  if (!rc)
+    {
+      krb5_cc_close(context, ccache);
+      krb5_free_context(context);
+    }
+  krb5_free_cred_contents(context, &creds);
+  if (credsp != NULL)
+    krb5_free_creds(context, credsp);
+  return(rc);
+}
+
+
+int ad_kdc_connect(char *connectedServer)
+{
+  struct hostent  *hp;
+  int             rc;
+
+  rc = 0;
+  hp = gethostbyname(connectedServer);
+  if (hp == NULL)
+    goto cleanup;
+  memset(&kdc_server, 0, sizeof(kdc_server));
+  memcpy(&(kdc_server.sin_addr),hp->h_addr_list[0],hp->h_length);
+  kdc_server.sin_family = hp->h_addrtype;
+  kdc_server.sin_port = htons(KDC_PORT);
+
+  if ((kdc_socket = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
+    goto cleanup;
+  if (connect(kdc_socket, (struct sockaddr*)&kdc_server, sizeof(kdc_server)) == SOCKET_ERROR)
+    goto cleanup;
+  rc = 1;
+
+cleanup:
+  return(rc);
+}
+
+void ad_kdc_disconnect()
+{
+
+  if (auth_context != NULL)
+    {
+      krb5_auth_con_free(context, auth_context);
+      if (ap_req.data != NULL)
+        free(ap_req.data);
+      krb5_free_cred_contents(context, &creds);
+      if (credsp != NULL)
+        krb5_free_creds(context, credsp);
+    }
+  credsp = NULL;
+  auth_context = NULL;
+  if (context != NULL)
+    {
+      krb5_cc_close(context, ccache);
+      krb5_free_context(context);
+    }
+  closesocket(kdc_socket);
+
+}
+
+int convert_domain_to_dn(char *domain, char *dnp)
+{
+  char    *fp;
+  char    *dp;
+  char    dn[512];
+
+  memset(dn, '\0', sizeof(dn));    
+  strcpy(dn, "dc=");
+  dp = dn+3;
+  for (fp = domain; *fp; fp++)
+    {
+      if (*fp == '.') 
+        {
+          strcpy(dp, ",dc=");
+          dp += 4;
+        }
+      else
+        *dp++ = *fp;
+    }
+
+  strcpy(dnp, dn);
+  return 0;
+}
+
+int compare_elements(const void *arg1, const void *arg2)
+{
+  int rc;
+
+  rc = strcmp((char*)arg1, (char*)arg2);
+  if (rc < 0)
+    return(1);
+  if (rc > 0)
+    return(-1);
+  return(rc);
+}

Added: trunk/third/moira/incremental/ldap/winad.c
===================================================================
--- trunk/third/moira/incremental/ldap/winad.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/ldap/winad.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -0,0 +1,9063 @@
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/incremental/ldap/winad.c,v 1.19 2009-04-05 18:09:05 zacheiss Exp $
+/* ldap.incr arguments example
+ *
+ * arguments when moira creates the account - ignored by ldap.incr since the 
+ * account is unusable. users 0 11 #45198 45198 /bin/cmd cmd Last First Middle
+ * 0 950000001 2000 121049
+ *
+ * login, unix_uid, shell, winconsoleshell, last, 
+ * first, middle, status, mitid, type, moiraid
+ *
+ * arguments for creating or updating a user account 
+ * users 11 11 username 45206 /bin/cmd cmd Last First Middle 2 950000001 STAFF
+ * 121058  PathToHomeDir PathToProfileDir username 45206 /bin/cmd cmd Last
+ * First Middle 1 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
+ * users 11 11 #45206 45206 /bin/cmd cmd Last First Middle 0 950000001 STAFF
+ * 121058  PathToHomeDir PathToProfileDir newuser 45206 /bin/cmd cmd Last
+ * First Middle 2 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
+ *
+ * login, unix_uid, shell, winconsoleshell, last, first, middle, status, 
+ * mitid, type, moiraid
+ *
+ * arguments for deactivating/deleting a user account
+ * users 11 11 username 45206 /bin/cmd cmd Last First Middle 1 950000001 STAFF
+ * 121058  PathToHomeDir PathToProfileDir username 45206 /bin/cmd cmd Last
+ * First Middle 3 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
+ * users 11 11 username 45206 /bin/cmd cmd Last First Middle 2 950000001 STAFF
+ * 121058  PathToHomeDir PathToProfileDir username 45206 /bin/cmd cmd Last
+ * First Middle 3 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
+ * 
+ * login, unix_uid, shell, winconsoleshell, last, first, middle, status,
+ * mitid, type, moiraid
+ *
+ * arguments for reactivating a user account
+ * users 11 11 username 45206 /bin/cmd cmd Last First Middle 3 950000001 STAFF
+ * 121058 username 45206 /bin/cmd cmd Last First Middle 1 950000001 STAFF
+ * 121058
+ * users 11 11 username 45206 /bin/cmd cmd Last First Middle 3 950000001 STAFF
+ * 121058 username 45206 /bin/cmd cmd Last First Middle 2 950000001 STAFF 12105
+ *
+ * login, unix_uid, shell, winconsoleshell, last, first, middle, status, 
+ * mitid, type, moiraid
+ *
+ * arguments for changing user name
+ * users 11 11 oldusername 45206 /bin/cmd cmd Last First Middle 1 950000001 
+ * STAFF 121058 PathToHomeDir PathToProfileDir newusername 45206 /bin/cmd cmd 
+ * Last First Middle 1 950000001 STAFF 121058 PathToHomeDir PathToProfileDir
+ *
+ * login, unix_uid, shell, winconsoleshell, last, first, middle, status, 
+ * mitid, type, moiraid
+ *
+ * arguments for expunging a user
+ * users 11 0 username 45198 /bin/cmd cmd Last First Middle 0 950000001 2000
+ * 121049
+ *
+ * login, unix_uid, shell, winconsoleshell, last, first, middle, status, 
+ * mitid, type, moiraid
+ *
+ * arguments for creating a "special" group/list
+ * list 0 11 listname 1 1 0 0 0 -1 NONE 0 description 92616
+ *
+ * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type, 
+ * acl_id, description, moiraid
+ * 
+ * arguments for creating a "mail" group/list
+ * list 0 11 listname 1 1 0 1 0 -1 NONE 0 description 92616
+ *
+ * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type, 
+ * acl_id, description, moiraid
+ *
+ * arguments for creating a "group" group/list
+ * list 0 11 listname 1 1 0 0 1 -1 NONE 0 description 92616
+ * 
+ * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type, 
+ * acl_id, description, moiraid
+ *
+ * arguments for creating a "group/mail" group/list
+ * list 0 11 listname 1 1 0 1 1 -1 NONE 0 description 92616
+ *
+ * listname, active, publicflg, hidden, maillist, grouplist, gid, acl_type, 
+ * acl_id, description, moiraid
+ *
+ * arguments to add a USER member to group/list
+ * imembers 0 12 listname USER userName 1 1 0 0 0 -1 1 92616 121047
+ *
+ * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
+ * gid, userStatus, moiraListId, moiraUserId
+ *
+ * arguments to add a STRING or KERBEROS member to group/list
+ * imembers 0 10 listname STRING stringName 1 1 0 0 0 -1 92616
+ * imembers 0 10 listlistnameName KERBEROS kerberosName 1 1 0 0 0 -1 92616
+ *
+ * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
+ * gid, moiraListId
+ *
+ * NOTE: group members of type LIST are ignored.
+ *
+ * arguments to remove a USER member to group/list
+ * imembers 12 0 listname USER userName 1 1 0 0 0 -1 1 92616 121047
+ * 
+ * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
+ * gid, userStatus, moiraListId, moiraUserId
+ *
+ * arguments to remove a STRING or KERBEROS member to group/list
+ * imembers 10 0 listname STRING stringName 1 1 0 0 0 -1 92616
+ * imembers 10 0 listname KERBEROS kerberosName 1 1 0 0 0 -1 92616
+ *
+ * list_name, user_type, name, active, publicflg, hidden, maillist, grouplist,
+ * gid, moiraListId
+ *
+ * NOTE: group members of type LIST are ignored.
+ *
+ * arguments for renaming a group/list
+ * list 11 11 oldlistname 1 1 0 0 0 -1 NONE 0 description 92616 newlistname 1
+ * 1 0 0 0 -1 description 0 92616
+ * 
+ * name, active, publicflg, hidden, maillist, grouplist, gid, acl_type, 
+ * acl_id, description, moiraListId
+ *
+ * arguments for deleting a group/list
+ * list 11 0 listname 1 1 0 0 0 -1 NONE 0 description 92616
+ *
+ * name, active, publicflg, hidden, maillist, grouplist, gid, acl_type, 
+ * acl_id, description, moiraListId
+ *
+ * arguments for adding a file system
+ * filesys 0 12 username AFS ATHENA.MIT.EDU 
+ * /afs/athena.mit.edu/user/n/e/username /mit/username w descripton username
+ * wheel 1 HOMEDIR 101727
+ *
+ * arguments for deleting a file system
+ * filesys 12 0 username AFS ATHENA.MIT.EDU 
+ * /afs/athena.mit.edu/user/n/e/username /mit/username w descripton username
+ * wheel 1 HOMEDIR 101727
+ *
+ * arguments when moira creates a container (OU).
+ * containers 0 8 machines/test/bottom description location contact USER
+ * 105316 2222 [none]
+ *
+ * arguments when moira deletes a container (OU).
+ * containers 8 0 machines/test/bottom description location contact USER 
+ * 105316 2222 groupname
+ *
+ * arguments when moira modifies a container information (OU).
+ * containers 8 8 machines/test/bottom description location contact USER 
+ * 105316 2222 groupname machines/test/bottom description1 location contact 
+ * USER 105316 2222 groupname
+ *
+ * arguments when moira adds a machine from an OU
+ * table name, beforec, afterc, machine_name, container_name, mach_id, cnt_id
+ * mcntmap 0 5 DAVIDT.MIT.EDU dttest/dttest1 76767 46 groupname
+ *
+ * arguments when moira removes a machine from an OU
+ * table name, beforec, afterc, machine_name, container_name, mach_id, cnt_id
+ * mcntmap 0 5 DAVIDT.MIT.EDU dttest/dttest1 76767 46 groupname
+ *
+*/
+
+#include <mit-copyright.h>
+
+#ifdef _WIN32
+#include <winsock2.h>
+#include <windows.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <lmaccess.h>
+#endif
+
+#include <hesiod.h>
+#include <string.h>
+#include <ldap.h>
+#include <stdio.h>
+#include <moira.h>
+#include <moira_site.h>
+#include <mrclient.h>
+#include <krb5.h>
+#include <gsssasl.h>
+#include <gssldap.h> 
+#include "kpasswd.h"
+
+#ifdef _WIN32
+#ifndef ECONNABORTED
+#define ECONNABORTED WSAECONNABORTED
+#endif
+#ifndef ECONNREFUSED
+#define ECONNREFUSED WSAECONNREFUSED
+#endif
+#ifndef EHOSTUNREACH
+#define EHOSTUNREACH WSAEHOSTUNREACH
+#endif
+#define krb5_xfree free
+#define F_OK 0
+#define sleep(A) Sleep(A * 1000);
+#endif /* _WIN32 */
+
+#ifndef _WIN32
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include <sys/utsname.h>
+#include <unistd.h>
+
+#define CFG_PATH "/moira/ldap/"
+#define WINADCFG "ldap.cfg"
+#define strnicmp(A,B,C) strncasecmp(A,B,C)
+#define UCHAR unsigned char
+
+#define UF_SCRIPT               0x0001
+#define UF_ACCOUNTDISABLE       0x0002
+#define UF_HOMEDIR_REQUIRED     0x0008
+#define UF_LOCKOUT              0x0010
+#define UF_PASSWD_NOTREQD       0x0020
+#define UF_PASSWD_CANT_CHANGE   0x0040
+#define UF_DONT_EXPIRE_PASSWD   0x10000
+
+#define UF_TEMP_DUPLICATE_ACCOUNT       0x0100
+#define UF_NORMAL_ACCOUNT               0x0200
+#define UF_INTERDOMAIN_TRUST_ACCOUNT    0x0800
+#define UF_WORKSTATION_TRUST_ACCOUNT    0x1000
+#define UF_SERVER_TRUST_ACCOUNT         0x2000
+
+#define OWNER_SECURITY_INFORMATION       (0x00000001L)
+#define GROUP_SECURITY_INFORMATION       (0x00000002L)
+#define DACL_SECURITY_INFORMATION        (0x00000004L)
+#define SACL_SECURITY_INFORMATION        (0x00000008L)
+
+#ifndef BYTE
+#define BYTE unsigned char
+#endif
+typedef unsigned int DWORD;
+typedef unsigned long ULONG;
+
+typedef struct _GUID
+{
+  unsigned long Data1;
+  unsigned short Data2;
+  unsigned short Data3;
+  unsigned char Data4[8];
+} GUID;
+
+typedef struct _SID_IDENTIFIER_AUTHORITY { 
+  BYTE Value[6]; 
+} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY; 
+
+typedef struct _SID {
+  BYTE  Revision;
+  BYTE  SubAuthorityCount;
+  SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+  DWORD SubAuthority[512];
+} SID;
+#endif/*!WIN32*/
+
+#ifndef WINADCFG
+#define WINADCFG "ldap.cfg"
+#endif
+
+#ifndef CFG_PATH
+#define CFG_PATH ""
+#endif 
+
+#define AFS "/afs/"
+#define WINAFS "\\\\afs\\all\\"
+
+#define ADS_GROUP_TYPE_GLOBAL_GROUP         0x00000002
+#define ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP   0x00000004
+#define ADS_GROUP_TYPE_LOCAL_GROUP          0x00000004
+#define ADS_GROUP_TYPE_UNIVERSAL_GROUP      0x00000008
+#define ADS_GROUP_TYPE_SECURITY_ENABLED     0x80000000
+
+#define QUERY_VERSION   -1
+#define PRIMARY_REALM   "ATHENA.MIT.EDU"
+#define PRIMARY_DOMAIN  "win.mit.edu"
+#define PRODUCTION_PRINCIPAL "sms"
+#define TEST_PRINCIPAL       "smstest"
+
+#define SUBSTITUTE  1
+#define REPLACE     2
+
+#define USERS         0
+#define GROUPS        1
+
+#define MEMBER_ADD          1
+#define MEMBER_REMOVE       2
+#define MEMBER_CHANGE_NAME  3
+#define MEMBER_ACTIVATE     4
+#define MEMBER_DEACTIVATE   5
+#define MEMBER_CREATE       6
+
+#define MOIRA_ALL       0x0
+#define MOIRA_USERS     0x1
+#define MOIRA_KERBEROS  0x2
+#define MOIRA_STRINGS   0x4
+#define MOIRA_LISTS     0x8
+#define MOIRA_MACHINE   0x16
+
+#define CHECK_GROUPS    1
+#define CLEANUP_GROUPS  2
+
+#define AD_NO_GROUPS_FOUND        -1
+#define AD_WRONG_GROUP_DN_FOUND   -2
+#define AD_MULTIPLE_GROUPS_FOUND  -3
+#define AD_INVALID_NAME           -4
+#define AD_LDAP_FAILURE           -5
+#define AD_INVALID_FILESYS        -6
+#define AD_NO_ATTRIBUTE_FOUND     -7
+#define AD_NO_OU_FOUND            -8
+#define AD_NO_USER_FOUND          -9
+
+/* container arguments */
+#define CONTAINER_NAME       0
+#define CONTAINER_DESC       1
+#define CONTAINER_LOCATION   2
+#define CONTAINER_CONTACT    3
+#define CONTAINER_TYPE       4
+#define CONTAINER_ID         5
+#define CONTAINER_ROWID      6
+#define CONTAINER_GROUP_NAME 7
+
+/*mcntmap arguments*/
+#define OU_MACHINE_NAME        0
+#define OU_CONTAINER_NAME      1
+#define OU_MACHINE_ID          2
+#define OU_CONTAINER_ID        3
+#define OU_CONTAINER_GROUP     4
+
+typedef struct lk_entry {
+  int     op;
+  int     length;
+  int     ber_value;
+  char    *dn;
+  char    *attribute;
+  char    *value;
+  char    *member;
+  char    *type;
+  char    *list;
+  struct  lk_entry *next;
+} LK_ENTRY;
+
+#define STOP_FILE "/moira/ldap/noldap"
+#define file_exists(file) (access((file), F_OK) == 0)
+
+#define N_SD_BER_BYTES   5
+#define LDAP_BERVAL struct berval
+#define MAX_SERVER_NAMES 32
+
+#define HIDDEN_GROUP                "HiddenGroup.g"
+#define HIDDEN_GROUP_WITH_ADMIN     "HiddenGroupWithAdmin.g"
+#define NOT_HIDDEN_GROUP            "NotHiddenGroup.g"
+#define NOT_HIDDEN_GROUP_WITH_ADMIN "NotHiddenGroupWithAdmin.g"
+
+#define ADDRESS_LIST_PREFIX "CN=MIT Directory,CN=All Address Lists,\
+CN=Address Lists Container,CN=Massachusetts Institute of Technology,\
+CN=Microsoft Exchange,CN=Services,CN=Configuration,"
+
+#define ADD_ATTR(t, v, o) 		\
+  mods[n] = malloc(sizeof(LDAPMod));	\
+  mods[n]->mod_op = o;	                \
+  mods[n]->mod_type = t; 		\
+  mods[n++]->mod_values = v
+
+#define DEL_ATTR(t, o) 		        \
+  DelMods[i] = malloc(sizeof(LDAPMod));	\
+  DelMods[i]->mod_op = o;	        \
+  DelMods[i]->mod_type = t; 		\
+  DelMods[i++]->mod_values = NULL
+
+#define DOMAIN_SUFFIX   "MIT.EDU"
+#define DOMAIN  "DOMAIN:"
+#define PRINCIPALNAME  "PRINCIPAL:"
+#define SERVER  "SERVER:"
+#define MSSFU   "SFU:"
+#define SFUTYPE "30"
+#define GROUP_SUFFIX "GROUP_SUFFIX:"
+#define GROUP_TYPE   "GROUP_TYPE:"
+#define SET_GROUP_ACE    "SET_GROUP_ACE:"
+#define SET_PASSWORD "SET_PASSWORD:"
+#define EXCHANGE "EXCHANGE:"
+#define REALM "REALM:"
+#define ACTIVE_DIRECTORY "ACTIVE_DIRECTORY:"
+#define PORT "PORT:"
+#define PROCESS_MACHINE_CONTAINER "PROCESS_MACHINE_CONTAINER:"
+#define GROUP_POPULATE_MEMBERS "GROUP_POPULATE_MEMBERS:"
+#define MAX_DOMAINS 10
+char DomainNames[MAX_DOMAINS][128];
+
+LK_ENTRY *member_base = NULL;
+
+char   PrincipalName[128];
+static char tbl_buf[1024];
+char  kerberos_ou[] = "OU=kerberos,OU=moira";
+char  contact_ou[] = "OU=strings,OU=moira";
+char  user_ou[] = "OU=users,OU=moira";
+char  group_ou_distribution[1024];
+char  group_ou_root[1024];
+char  group_ou_security[1024];
+char  group_ou_neither[1024];
+char  group_ou_both[1024]; 
+char  orphans_machines_ou[] = "OU=Machines,OU=Orphans";
+char  orphans_other_ou[] = "OU=Other,OU=Orphans";
+char  security_template_ou[] = "OU=security_templates";
+char *whoami;
+char ldap_domain[256];
+char ldap_realm[256];
+char ldap_port[256];
+char *ServerList[MAX_SERVER_NAMES];
+char default_server[256];
+static char tbl_buf[1024];
+char group_suffix[256];
+char exchange_acl[256];
+int  mr_connections = 0;
+int  callback_rc;
+int  UseSFU30 = 0;
+int  UseGroupSuffix = 1;
+int  UseGroupUniversal = 0;
+int  SetGroupAce = 1;
+int  SetPassword = 1;
+int  Exchange = 0;
+int  ProcessMachineContainer = 1;
+int  ActiveDirectory = 1;
+int  UpdateDomainList;
+int  fsgCount;
+int  GroupPopulateDelete = 0;
+
+extern int set_password(char *user, char *password, char *domain);
+
+int ad_get_group(LDAP *ldap_handle, char *dn_path, char *group_name, 
+		 char *group_membership, char *MoiraId, char *attribute,
+		 LK_ENTRY **linklist_base, int *linklist_count,
+		 char *rFilter);
+void AfsToWinAfs(char* path, char* winPath);
+int ad_connect(LDAP **ldap_handle, char *ldap_domain, char *dn_path, 
+               char *Win2kPassword, char *Win2kUser, char *default_server,
+               int connect_to_kdc, char **ServerList, char *ldap_realm,
+	       char *ldap_port);
+void ad_kdc_disconnect();
+int ad_server_connect(char *connectedServer, char *domain);
+int attribute_update(LDAP *ldap_handle, char *distinguished_name, 
+		     char *attribute_value, char *attribute, char *user_name);
+int BEREncodeSecurityBits(ULONG uBits, char *pBuffer);
+int checkADname(LDAP *ldap_handle, char *dn_path, char *Name);
+int check_winad(void);
+int check_user(LDAP *ldap_handle, char *dn_path, char *UserName, 
+	       char *MoiraId);
+/* containers */
+int container_adupdate(LDAP *ldap_handle, char *dn_path, char *dName, 
+                       char *distinguishedName, int count, char **av);
+void container_check(LDAP *ldap_handle, char *dn_path, char *name);
+int container_create(LDAP *ldap_handle, char *dn_path, int count, char **av);
+int container_delete(LDAP *ldap_handle, char *dn_path, int count, char **av);
+int container_get_distinguishedName(LDAP *ldap_handle, char *dn_path, 
+				    char *distinguishedName, int count, 
+				    char **av);
+void container_get_dn(char *src, char *dest);
+void container_get_name(char *src, char *dest);
+int container_move_objects(LDAP *ldap_handle, char *dn_path, char *dName);
+int container_rename(LDAP *ldap_handle, char *dn_path, int beforec, 
+		     char **before, int afterc, char **after);
+int container_update(LDAP *ldap_handle, char *dn_path, int beforec, 
+		     char **before, int afterc, char **after);
+
+int GetAceInfo(int ac, char **av, void *ptr);
+int get_group_membership(char *group_membership, char *group_ou, 
+                         int *security_flag, char **av);
+int get_machine_ou(LDAP *ldap_handle, char *dn_path, char *member, 
+		   char *machine_ou, char *pPtr);
+int Moira_container_group_create(char **after);
+int Moira_container_group_delete(char **before);
+int Moira_groupname_create(char *GroupName, char *ContainerName,
+			   char *ContainerRowID);
+int Moira_container_group_update(char **before, char **after);
+int Moira_process_machine_container_group(char *MachineName, char* groupName,
+					  int DeleteMachine);
+int Moira_addGroupToParent(char *origContainerName, char *GroupName);
+int Moira_getContainerGroup(int ac, char **av, void *ptr);
+int Moira_getGroupName(char *origContainerName, char *GroupName,
+		       int ParentFlag);
+int Moira_setContainerGroup(char *ContainerName, char *GroupName);
+int ProcessAce(LDAP *ldap_handle, char *dn_path, char *group_name, char *Type,
+               int UpdateGroup, int *ProcessGroup, char *maillist);
+int process_group(LDAP *ldap_handle, char *dn_path, char *MoiraId, 
+                  char *group_name, char *group_ou, char *group_membership, 
+                  int group_security_flag, int type, char *maillist);
+int process_lists(int ac, char **av, void *ptr);
+int ProcessGroupSecurity(LDAP *ldap_handle, char *dn_path, 
+			 char *TargetGroupName, int HiddenGroup, 
+			 char *AceType, char *AceName);
+int ProcessMachineName(int ac, char **av, void *ptr);
+int ReadConfigFile(char *DomainName);
+int ReadDomainList();
+void StringTrim(char *StringToTrim);
+char *escape_string(char *s);
+int save_query_info(int argc, char **argv, void *hint);
+int save_fsgroup_info(int argc, char **argv, void *hint);
+int user_create(int ac, char **av, void *ptr);
+int user_change_status(LDAP *ldap_handle, char *dn_path, 
+                       char *user_name, char *MoiraId, int operation);
+int user_delete(LDAP *ldap_handle, char *dn_path, 
+                char *u_name, char *MoiraId);
+int user_rename(LDAP *ldap_handle, char *dn_path, char *before_user_name, 
+                char *user_name);
+int user_update(LDAP *ldap_handle, char *dn_path, char *user_name,
+                char *uid, char *MitId, char *MoiraId, int State,
+                char *WinHomeDir, char *WinProfileDir, char *first,
+		char *middle, char *last, char *shell, char *class);
+void change_to_lower_case(char *ptr);
+int contact_create(LDAP *ld, char *bind_path, char *user, char *group_ou);
+int contact_remove_email(LDAP *ld, char *bind_path,
+			 LK_ENTRY **linklist_entry, int linklist_current);
+int group_create(int ac, char **av, void *ptr);
+int group_delete(LDAP *ldap_handle, char *dn_path, 
+                 char *group_name, char *group_membership, char *MoiraId);
+int group_rename(LDAP *ldap_handle, char *dn_path, 
+                 char *before_group_name, char *before_group_membership, 
+                 char *before_group_ou, int before_security_flag, 
+		 char *before_desc, char *after_group_name, 
+		 char *after_group_membership, char *after_group_ou, 
+		 int after_security_flag, char *after_desc,
+                 char *MoiraId, char *filter, char *maillist);
+int machine_check(LDAP *ldap_handle, char *dn_path, char *machine_name);
+int machine_GetMoiraContainer(int ac, char **av, void *ptr);
+int machine_get_moira_container(LDAP *ldap_handle, char *dn_path, 
+				char *machine_name, char *container_name);
+int machine_move_to_ou(LDAP *ldap_handle, char *dn_path, 
+		       char *MoiraMachineName, char *DestinationOu);
+int make_new_group(LDAP *ldap_handle, char *dn_path, char *MoiraId, 
+                   char *group_name, char *group_ou, char *group_membership, 
+                   int group_security_flag, int updateGroup, char *maillist);
+int member_list_build(int ac, char **av, void *ptr);
+int member_add(LDAP *ldap_handle, char *dn_path, char *group_name, 
+	       char *group_ou, char *group_membership, 
+	       char *user_name, char *pUserOu, char *MoiraId);
+int member_remove(LDAP *ldap_handle, char *dn_path, char *group_name, 
+                  char *group_ou, char *group_membership, char *user_name,
+                  char *pUserOu, char *MoiraId);
+int populate_group(LDAP *ldap_handle, char *dn_path, char *group_name, 
+                   char *group_ou, char *group_membership, 
+                   int group_security_flag, char *MoiraId);
+int SetHomeDirectory(LDAP *ldap_handle, char *user_name, 
+		     char *DistinguishedName,
+                     char *WinHomeDir, char *WinProfileDir,
+                     char **homedir_v, char **winProfile_v,
+                     char **drives_v, LDAPMod **mods, 
+                     int OpType, int n);
+int sid_update(LDAP *ldap_handle, char *dn_path);
+void SwitchSFU(LDAPMod **mods, int *UseSFU30, int n);
+int check_string(char *s);
+int check_container_name(char* s);
+
+int mr_connect_cl(char *server, char *client, int version, int auth);
+void do_container(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+		  char **before, int beforec, char **after, int afterc);
+void do_filesys(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+		char **before, int beforec, char **after, int afterc);
+void do_list(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+             char **before, int beforec, char **after, int afterc);
+void do_user(LDAP *ldap_handle, char *dn_path, char *ldap_hostname, 
+             char **before, int beforec, char **after, int afterc);
+void do_member(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+               char **before, int beforec, char **after, int afterc);
+void do_mcntmap(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+                char **before, int beforec, char **after, int afterc);
+int linklist_create_entry(char *attribute, char *value,
+                          LK_ENTRY **linklist_entry);
+int linklist_build(LDAP *ldap_handle, char *dn_path, char *search_exp, 
+                   char **attr_array, LK_ENTRY **linklist_base, 
+                   int *linklist_count, unsigned long ScopeType);
+void linklist_free(LK_ENTRY *linklist_base);
+
+int retrieve_attributes(LDAP *ldap_handle, LDAPMessage *ldap_entry, 
+                        char *distinguished_name, LK_ENTRY **linklist_current);
+int retrieve_entries(LDAP *ldap_handle, LDAPMessage *ldap_entry, 
+                     LK_ENTRY **linklist_base, int *linklist_count);
+int retrieve_values(LDAP *ldap_handle, LDAPMessage *ldap_entry, 
+                    char *Attribute, char *distinguished_name, 
+                    LK_ENTRY **linklist_current);
+
+int construct_newvalues(LK_ENTRY *linklist_base, int modvalue_count, 
+                        char *oldValue, char *newValue,
+                        char ***modvalues, int type);
+void free_values(char **modvalues);
+
+int convert_domain_to_dn(char *domain, char **bind_path);
+void get_distinguished_name(LDAP *ldap_handle, LDAPMessage *ldap_entry, 
+                            char *distinguished_name);
+int moira_disconnect(void);
+int moira_connect(void);
+void print_to_screen(const char *fmt, ...);
+int GetMachineName(char *MachineName);
+int tickets_get_k5();
+int destroy_cache(void);
+int dest_tkt(void);
+
+int find_homeMDB(LDAP *ldap_handle, char *dn_path, char **homeMDB,
+		 char **homeServerName);
+
+int main(int argc, char **argv)
+{
+  unsigned long   rc;
+  int             beforec;
+  int             afterc;
+  int             i;
+  int             j;
+  int		  k;
+  int             OldUseSFU30;
+  char            *table;
+  char            **before;
+  char            **after;
+  LDAP            *ldap_handle;
+  char            dn_path[256];
+  char            *orig_argv[64];
+  
+  whoami = ((whoami = (char *)strrchr(argv[0], '/')) ? whoami+1 : argv[0]);
+  
+  if (argc < 4)
+    {
+      com_err(whoami, 0, "Unable to process %s", "argc < 4");
+      exit(1);
+    }
+  
+  if (argc < (4 + atoi(argv[2]) + atoi(argv[3])))
+    {
+      com_err(whoami, 0, "Unable to process %s", 
+	      "argc < (4 + beforec + afterc)");
+      exit(1);
+    }
+
+  if (!strcmp(argv[1], "filesys"))
+    exit(0);
+
+  for (i = 1; i < argc; i++)
+    {
+      strcat(tbl_buf, argv[i]);
+      strcat(tbl_buf, " ");
+    }
+
+  com_err(whoami, 0, "%s", tbl_buf);
+
+  if (check_winad())
+    {
+      com_err(whoami, 0, "%s failed", "check_winad()");
+      exit(1);
+    }
+
+  initialize_sms_error_table();
+  initialize_krb_error_table();
+
+  UpdateDomainList = 0;
+  memset(DomainNames, '\0', sizeof(DomainNames[0]) * MAX_DOMAINS);
+
+  if (ReadDomainList())
+    {
+      com_err(whoami, 0, "%s failed", "ReadDomainList()");
+      exit(1);
+    }
+
+  for (i = 0; i < argc; i++)
+     orig_argv[i] = NULL;
+
+  for (k = 0; k < MAX_DOMAINS; k++)
+    {
+      if (strlen(DomainNames[k]) == 0)
+	continue;
+      for (i = 0; i < argc; i++)
+	{
+	  if (orig_argv[i] != NULL)
+	    free(orig_argv[i]);
+	  orig_argv[i] = strdup(argv[i]);
+	}
+
+      memset(PrincipalName, '\0', sizeof(PrincipalName));
+      memset(ldap_domain, '\0', sizeof(ldap_domain));
+      memset(ServerList, '\0', sizeof(ServerList[0]) * MAX_SERVER_NAMES);
+      memset(default_server, '\0', sizeof(default_server));
+      memset(dn_path, '\0', sizeof(dn_path));
+      memset(group_suffix, '\0', sizeof(group_suffix));
+      memset(exchange_acl, '\0', sizeof(exchange_acl));
+
+      UseSFU30 = 0;
+      UseGroupSuffix = 1;
+      UseGroupUniversal = 0;
+      SetGroupAce = 1;
+      SetPassword = 1;
+      Exchange = 0;
+      ProcessMachineContainer = 1;
+      ActiveDirectory = 1;
+
+      sprintf(group_suffix, "%s", "_group");
+      sprintf(exchange_acl, "%s", "exchange-acl");
+
+      beforec = atoi(orig_argv[2]);
+      afterc = atoi(orig_argv[3]);
+      table = orig_argv[1];
+      before = &orig_argv[4];
+      after = &orig_argv[4 + beforec];
+
+      if (afterc == 0)
+	after = NULL;
+
+      if (beforec == 0)
+	before = NULL;
+
+      if (ReadConfigFile(DomainNames[k]))
+	continue;
+
+      if(ActiveDirectory)
+	{
+	  sprintf(group_ou_distribution, "OU=mail,OU=lists,OU=moira");
+	  sprintf(group_ou_root, "OU=lists,OU=moira");
+	  sprintf(group_ou_security, "OU=group,OU=lists,OU=moira");
+	  sprintf(group_ou_neither, "OU=special,OU=lists,OU=moira");
+	  sprintf(group_ou_both, "OU=mail,OU=group,OU=lists,OU=moira");
+	}
+      else
+	{
+	  sprintf(group_ou_distribution, "OU=lists,OU=moira");
+	  sprintf(group_ou_root, "OU=lists,OU=moira");
+	  sprintf(group_ou_security, "OU=lists,OU=moira");
+	  sprintf(group_ou_neither, "OU=lists,OU=moira");
+	  sprintf(group_ou_both, "OU=lists,OU=moira");
+	}
+
+      OldUseSFU30 = UseSFU30;
+
+      for (i = 0; i < 5; i++)
+	{
+	  ldap_handle = (LDAP *)NULL;
+	  if (!(rc = ad_connect(&ldap_handle, ldap_domain, dn_path, "", "", 
+				default_server, SetPassword, ServerList, 
+				ldap_realm, ldap_port)))
+	    {
+	      com_err(whoami, 0, "connected to domain %s", DomainNames[k]);
+	      break;
+	    }
+	}
+
+      if ((rc) || (ldap_handle == NULL))
+	{
+  	  critical_alert("incremental",
+			 "ldap.incr cannot connect to any server in "
+			 "domain %s", DomainNames[k]);
+	  continue;
+	}
+
+      for (i = 0; i < (int)strlen(table); i++)
+	table[i] = tolower(table[i]);
+
+      if (!strcmp(table, "users"))
+	do_user(ldap_handle, dn_path, ldap_domain, before, beforec, after,
+		afterc);
+      else if (!strcmp(table, "list"))
+	do_list(ldap_handle, dn_path, ldap_domain, before, beforec, after,
+		afterc);
+      else if (!strcmp(table, "imembers"))
+	do_member(ldap_handle, dn_path, ldap_domain, before, beforec, after,
+		  afterc);
+      else if (!strcmp(table, "containers"))
+	do_container(ldap_handle, dn_path, ldap_domain, before, beforec, after,
+		     afterc);
+      else if (!strcmp(table, "mcntmap"))
+	do_mcntmap(ldap_handle, dn_path, ldap_domain, before, beforec, after,
+		   afterc);
+
+      if(SetPassword) 
+	ad_kdc_disconnect();
+
+      for (i = 0; i < MAX_SERVER_NAMES; i++)
+	{
+	  if (ServerList[i] != NULL)
+	    {
+	      free(ServerList[i]);
+	      ServerList[i] = NULL;
+	    }
+	}
+      
+      rc = ldap_unbind_s(ldap_handle);
+    }
+  
+  exit(0);
+}
+
+void do_mcntmap(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+                char **before, int beforec, char **after, int afterc)
+{
+  char    MoiraContainerName[128];
+  char    ADContainerName[128];
+  char    MachineName[1024];
+  char    OriginalMachineName[1024];
+  long    rc;
+  int     DeleteMachine;
+  char    MoiraContainerGroup[64];
+
+  if (!ProcessMachineContainer)
+    {
+      com_err(whoami, 0, "Process machines and containers disabled, skipping");
+      return;
+    }
+  
+  DeleteMachine = 0;
+  memset(ADContainerName, '\0', sizeof(ADContainerName));
+  memset(MoiraContainerName, '\0', sizeof(MoiraContainerName));
+  
+  if ((beforec == 0) && (afterc == 0))
+    return;
+  
+  if (rc = moira_connect())
+    {
+      critical_alert("Ldap incremental",
+		     "Error contacting Moira server : %s",
+		     error_message(rc));
+      return;
+    }
+  
+  if ((beforec != 0) && (afterc == 0)) /*remove a machine*/
+    {
+      strcpy(OriginalMachineName, before[OU_MACHINE_NAME]);
+      strcpy(MachineName, before[OU_MACHINE_NAME]);
+      strcpy(MoiraContainerGroup, before[OU_CONTAINER_GROUP]);
+      DeleteMachine = 1;
+      com_err(whoami, 0, "removing machine %s from %s", 
+	      OriginalMachineName, before[OU_CONTAINER_NAME]);
+    }
+  else if ((beforec == 0) && (afterc != 0)) /*add a machine*/
+    {
+      strcpy(OriginalMachineName, after[OU_MACHINE_NAME]);
+      strcpy(MachineName, after[OU_MACHINE_NAME]);
+      strcpy(MoiraContainerGroup, after[OU_CONTAINER_GROUP]);
+      com_err(whoami, 0, "adding machine %s to container %s", 
+	      OriginalMachineName, after[OU_CONTAINER_NAME]);
+    }
+  else
+    {
+      moira_disconnect();
+      return;
+    }
+  
+  rc = GetMachineName(MachineName);
+
+  if (strlen(MachineName) == 0)
+    {
+      moira_disconnect();
+      com_err(whoami, 0, "Unable to find alais for machine %s in Moira", 
+	      OriginalMachineName);
+      return;
+    }
+
+  Moira_process_machine_container_group(MachineName, MoiraContainerGroup,
+					DeleteMachine);
+
+  if (machine_check(ldap_handle, dn_path, MachineName))
+    {
+      com_err(whoami, 0, "Unable to find machine %s (alias %s) in directory.", 
+	      OriginalMachineName, MachineName);
+      moira_disconnect();
+      return;
+    }
+
+  memset(MoiraContainerName, '\0', sizeof(MoiraContainerName));
+  machine_get_moira_container(ldap_handle, dn_path, MachineName, 
+			      MoiraContainerName);
+
+  if (strlen(MoiraContainerName) == 0)
+    {
+      com_err(whoami, 0, "Unable to fine machine %s (alias %s) container "
+	      "in Moira - moving to orphans OU.",
+	      OriginalMachineName, MachineName);
+      machine_move_to_ou(ldap_handle, dn_path, MachineName, 
+			 orphans_machines_ou);
+      moira_disconnect();
+      return;
+    }
+
+  container_get_dn(MoiraContainerName, ADContainerName);
+
+  if (MoiraContainerName[strlen(MoiraContainerName) - 1] != '/')
+    strcat(MoiraContainerName, "/");
+
+  container_check(ldap_handle, dn_path, MoiraContainerName);
+  machine_move_to_ou(ldap_handle, dn_path, MachineName, ADContainerName);
+  moira_disconnect();
+  return;
+}
+
+void do_container(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+		  char **before, int beforec, char **after, int afterc)
+{
+  long rc;
+
+  if (!ProcessMachineContainer)
+    {
+      com_err(whoami, 0, "Process machines and containers disabled, skipping");
+      return;
+    }
+
+  if ((beforec == 0) && (afterc == 0))
+    return;
+
+  if (rc = moira_connect())
+    {
+      critical_alert("Ldap incremental", "Error contacting Moira server : %s",
+		     error_message(rc));
+      return;
+    }
+
+  if ((beforec != 0) && (afterc == 0)) /*delete a new container*/
+    {
+      com_err(whoami, 0, "deleting container %s", before[CONTAINER_NAME]);
+      container_delete(ldap_handle, dn_path, beforec, before);
+      Moira_container_group_delete(before);
+      moira_disconnect();
+      return;
+    }
+
+  if ((beforec == 0) && (afterc != 0)) /*create a container*/
+    {
+      com_err(whoami, 0, "creating container %s", after[CONTAINER_NAME]);
+      container_check(ldap_handle, dn_path, after[CONTAINER_NAME]);
+      container_create(ldap_handle, dn_path, afterc, after);
+      Moira_container_group_create(after);
+      moira_disconnect();
+      return;
+    }
+
+  if (strcasecmp(before[CONTAINER_NAME], after[CONTAINER_NAME]))
+    {
+      com_err(whoami, 0, "renaming container %s to %s", 
+	      before[CONTAINER_NAME], after[CONTAINER_NAME]);
+      container_rename(ldap_handle, dn_path, beforec, before, afterc, after);
+      Moira_container_group_update(before, after);
+      moira_disconnect();
+      return;
+    }
+
+  com_err(whoami, 0, "updating container %s information", 
+	  after[CONTAINER_NAME]);
+  container_update(ldap_handle, dn_path, beforec, before, afterc, after);
+  Moira_container_group_update(before, after);
+  moira_disconnect();
+  return;
+}
+
+#define L_LIST_DESC 9
+#define L_LIST_ID   10
+
+void do_list(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+             char **before, int beforec, char **after, int afterc)
+{
+  int   updateGroup;
+  int   ProcessGroup;
+  long  rc;
+  char  group_membership[6];
+  char  list_id[32];
+  int   security_flag;
+  char  filter[128];
+  char  group_ou[256];
+  char  before_list_id[32];
+  char  before_group_membership[1];
+  int   before_security_flag;
+  char  before_group_ou[256];
+  LK_ENTRY *ptr = NULL;
+
+  if (beforec == 0 && afterc == 0)
+    return;
+
+  memset(list_id, '\0', sizeof(list_id));
+  memset(before_list_id, '\0', sizeof(before_list_id));
+  memset(before_group_ou, '\0', sizeof(before_group_ou));
+  memset(before_group_membership, '\0', sizeof(before_group_membership));
+  memset(group_ou, '\0', sizeof(group_ou));
+  memset(group_membership, '\0', sizeof(group_membership));
+  updateGroup = 0;
+
+  if (beforec > L_GID)
+    {
+      if (beforec < L_LIST_ID)
+        return;
+      if (beforec > L_LIST_DESC)
+        {
+          strcpy(before_list_id, before[L_LIST_ID]);
+        }
+      before_security_flag = 0;
+      get_group_membership(before_group_membership, before_group_ou, 
+			   &before_security_flag, before);
+    }
+
+  if (afterc > L_GID)
+    {
+      if (afterc < L_LIST_ID)
+        return;
+      if (afterc > L_LIST_DESC)
+        {
+          strcpy(list_id, after[L_LIST_ID]);
+        }
+      security_flag = 0;
+      get_group_membership(group_membership, group_ou, &security_flag, after);
+    }
+  
+  if ((beforec == 0) && (afterc == 0)) /*this case should never happen*/
+    return;
+
+  updateGroup = 0;
+  
+  if (beforec)
+    {
+      updateGroup = 1;
+
+      if ((rc = process_group(ldap_handle, dn_path, before_list_id, 
+			      before[L_NAME], before_group_ou, 
+			      before_group_membership, 
+                              before_security_flag, CHECK_GROUPS,
+			      before[L_MAILLIST])))
+        {
+          if (rc == AD_NO_GROUPS_FOUND)
+            updateGroup = 0;
+          else
+            {
+              if ((rc == AD_WRONG_GROUP_DN_FOUND) || 
+		  (rc == AD_MULTIPLE_GROUPS_FOUND))
+                {
+                  rc = process_group(ldap_handle, dn_path, before_list_id, 
+				     before[L_NAME], before_group_ou, 
+				     before_group_membership, 
+                                     before_security_flag, CLEANUP_GROUPS,
+				     before[L_MAILLIST]);
+                }
+              if ((rc != AD_NO_GROUPS_FOUND) && (rc != 0))
+                {
+                  com_err(whoami, 0, "Unable to process list %s",
+                          before[L_NAME]);
+                  return;
+                }
+              if (rc == AD_NO_GROUPS_FOUND)
+                updateGroup = 0;
+            }
+        }
+    }
+
+  if ((beforec != 0) && (afterc != 0))
+    {
+      if (((strcmp(after[L_NAME], before[L_NAME])) || 
+	   ((!strcmp(after[L_NAME], before[L_NAME])) && 
+	    (strcmp(before_group_ou, group_ou)))) &&
+          (updateGroup == 1))
+        {
+          com_err(whoami, 0, "Changing list name from %s to %s",
+                  before[L_NAME], after[L_NAME]);
+
+          if ((strlen(before_group_ou) == 0) || 
+	      (strlen(before_group_membership) == 0) ||
+              (strlen(group_ou) == 0) || (strlen(group_membership) == 0))
+            {
+              com_err(whoami, 0, "%s", "Unable to find the group OU's");
+              return;
+            }
+
+          memset(filter, '\0', sizeof(filter));
+
+          if ((rc = group_rename(ldap_handle, dn_path, 
+                                 before[L_NAME], before_group_membership, 
+                                 before_group_ou, before_security_flag, 
+				 before[L_LIST_DESC], after[L_NAME], 
+				 group_membership, group_ou, security_flag, 
+				 after[L_LIST_DESC],
+                                 list_id, filter, after[L_MAILLIST])))
+            {
+              if (rc != AD_NO_GROUPS_FOUND)
+                {
+                  com_err(whoami, 0, 
+			  "Unable to change list name from %s to %s",
+                          before[L_NAME], after[L_NAME]);
+                  return;
+                }
+              updateGroup = 0;
+            }
+          beforec = 0;
+        }
+      else
+        beforec = 0;
+    }
+  
+  if (beforec)
+    {
+      if ((strlen(before_group_ou) == 0) || 
+	  (strlen(before_group_membership) == 0))
+        {
+          com_err(whoami, 0, 
+		  "Unable to find the group OU for group %s", before[L_NAME]);
+          return;
+        }
+
+      com_err(whoami, 0, "Deleting group %s", before[L_NAME]);
+      rc = group_delete(ldap_handle, dn_path, before[L_NAME], 
+                        before_group_membership, before_list_id);
+      return;
+    }
+
+  if (afterc)
+    {
+      if (!updateGroup)
+        {
+          com_err(whoami, 0, "Creating group %s", after[L_NAME]);
+
+          if (rc = process_group(ldap_handle, dn_path, list_id, after[L_NAME], 
+                                  group_ou, group_membership, 
+                                  security_flag, CHECK_GROUPS,
+				 after[L_MAILLIST]))
+            {
+              if (rc != AD_NO_GROUPS_FOUND)
+                {
+                  if ((rc == AD_WRONG_GROUP_DN_FOUND) || 
+		      (rc == AD_MULTIPLE_GROUPS_FOUND))
+                    {
+                      rc = process_group(ldap_handle, dn_path, list_id, 
+					 after[L_NAME], 
+                                         group_ou, group_membership, 
+                                         security_flag, CLEANUP_GROUPS,
+					 after[L_MAILLIST]);
+                    }
+
+                  if (rc)
+                    {
+                      com_err(whoami, 0, 
+			      "Unable to create list %s", after[L_NAME]);
+                      return;
+                    }
+                }
+            }
+        }
+      else
+        com_err(whoami, 0, "Updating group %s information", after[L_NAME]);
+
+      if (rc = moira_connect())
+        {
+          critical_alert("Ldap incremental",
+                         "Error contacting Moira server : %s",
+                         error_message(rc));
+          return;
+        }
+
+      ProcessGroup = 0;
+
+      if (ProcessAce(ldap_handle, dn_path, after[L_NAME], "LIST", 0, 
+		     &ProcessGroup, after[L_MAILLIST]))
+        return;
+
+      if (ProcessGroup)
+        {
+          if (ProcessAce(ldap_handle, dn_path, after[L_NAME], "LIST", 1, 
+			 &ProcessGroup, after[L_MAILLIST]))
+            return;
+        }
+
+      if (make_new_group(ldap_handle, dn_path, list_id, after[L_NAME], 
+                         group_ou, group_membership, security_flag, 
+			 updateGroup, after[L_MAILLIST]))
+        {
+          moira_disconnect();
+          return;
+        }
+    
+      if (atoi(after[L_ACTIVE]))
+        {
+          populate_group(ldap_handle, dn_path, after[L_NAME], group_ou, 
+                         group_membership, security_flag, list_id);
+        }
+
+      moira_disconnect();
+    }
+  return;
+}
+
+#define LM_EXTRA_ACTIVE	  (LM_END)
+#define LM_EXTRA_PUBLIC   (LM_END+1)
+#define LM_EXTRA_HIDDEN   (LM_END+2)
+#define LM_EXTRA_MAILLIST (LM_END+3)
+#define LM_EXTRA_GROUP    (LM_END+4)
+#define LM_EXTRA_GID      (LM_END+5)
+#define LMN_LIST_ID       (LM_END+6)
+#define LM_LIST_ID        (LM_END+7)
+#define LM_USER_ID        (LM_END+8)
+#define LM_EXTRA_END      (LM_END+9)
+
+void do_member(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
+               char **before, int beforec, char **after, int afterc)
+{
+  LK_ENTRY *group_base;
+  int group_count;
+  char  filter[128];
+  char *attr_array[3];
+  char  group_name[128];
+  char  user_name[128];
+  char  user_type[128];
+  char  moira_list_id[32];
+  char  moira_user_id[32];
+  char  group_membership[1];
+  char  group_ou[256];
+  char  machine_ou[256];
+  char  member[256];
+  char  *args[16];
+  char  **ptr;
+  char  *av[7];
+  char  *call_args[7];
+  char  *pUserOu;
+  char  *s;
+  char  NewMachineName[1024];
+  int   security_flag;
+  int   rc;
+  int   ProcessGroup;
+  char  *save_argv[U_END];
+
+  pUserOu = NULL;
+  ptr = NULL;
+  memset(moira_list_id, '\0', sizeof(moira_list_id));
+  memset(moira_user_id, '\0', sizeof(moira_user_id));
+
+  if (afterc)
+    {
+      if (afterc < LM_EXTRA_GID)
+        return;
+
+      if (!atoi(after[LM_EXTRA_ACTIVE]))
+        {
+	  com_err(whoami, 0, 
+		  "Unable to add %s to group %s : group not active", 
+		  after[2], after[0]);
+	  return;
+        }
+
+      ptr = after;
+
+      if (!strcasecmp(ptr[LM_TYPE], "LIST"))
+	return;
+
+      strcpy(user_name, after[LM_MEMBER]);
+      strcpy(group_name, after[LM_LIST]);
+      strcpy(user_type, after[LM_TYPE]);
+
+      if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
+        {
+          if (afterc > LM_EXTRA_GROUP)
+            {
+              strcpy(moira_list_id, after[LMN_LIST_ID]);
+              strcpy(moira_user_id, after[LM_LIST_ID]);
+            }
+        }
+      else if (!strcasecmp(ptr[LM_TYPE], "USER"))
+        {
+          if (afterc > LMN_LIST_ID)
+            {
+              strcpy(moira_list_id, after[LM_LIST_ID]);
+              strcpy(moira_user_id, after[LM_USER_ID]);
+            }
+        }
+      else
+        {
+          if (afterc > LM_EXTRA_GID)
+            strcpy(moira_list_id, after[LMN_LIST_ID]);
+        }
+    }
+  else if (beforec)
+    {
+      if (beforec < LM_EXTRA_GID)
+        return;
+      if (!atoi(before[LM_EXTRA_ACTIVE]))
+        {
+          com_err(whoami, 0, 
+		  "Unable to remove %s from group %s : group not active", 
+		  before[2], before[0]);
+          return;
+        }
+
+      ptr = before;
+
+      if (!strcasecmp(ptr[LM_TYPE], "LIST"))
+	return;
+
+      strcpy(user_name, before[LM_MEMBER]);
+      strcpy(group_name, before[LM_LIST]);
+      strcpy(user_type, before[LM_TYPE]);
+
+      if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
+        {
+          if (beforec > LM_EXTRA_GROUP)
+            {
+              strcpy(moira_list_id, before[LMN_LIST_ID]);
+              strcpy(moira_user_id, before[LM_LIST_ID]);
+            }
+        }
+      else if (!strcasecmp(ptr[LM_TYPE], "USER"))
+        {
+          if (beforec > LMN_LIST_ID)
+            {
+              strcpy(moira_list_id, before[LM_LIST_ID]);
+              strcpy(moira_user_id, before[LM_USER_ID]);
+            }
+        }
+      else
+        {
+          if (beforec > LM_EXTRA_GID)
+            strcpy(moira_list_id, before[LMN_LIST_ID]);
+        }
+    }
+
+  if (ptr == NULL)
+    {
+      com_err(whoami, 0, 
+	      "Unable to process group : beforec = %d, afterc = %d", 
+	      beforec, afterc);
+      return;
+    }
+
+  args[L_NAME] = ptr[LM_LIST];
+  args[L_ACTIVE] = ptr[LM_EXTRA_ACTIVE];
+  args[L_PUBLIC] = ptr[LM_EXTRA_PUBLIC];
+  args[L_HIDDEN] = ptr[LM_EXTRA_HIDDEN];
+  args[L_MAILLIST] = ptr[LM_EXTRA_MAILLIST];
+  args[L_GROUP] = ptr[LM_EXTRA_GROUP];
+  args[L_GID] = ptr[LM_EXTRA_GID];
+
+  security_flag = 0;
+  memset(group_ou, '\0', sizeof(group_ou));
+  get_group_membership(group_membership, group_ou, &security_flag, args);
+
+  if (strlen(group_ou) == 0)
+    {
+      com_err(whoami, 0, "Unable to find the group OU for group %s", 
+	      group_name);
+      return;
+    }
+
+  if (rc = process_group(ldap_handle, dn_path, moira_list_id, group_name, 
+			 group_ou, group_membership, security_flag, 
+			 CHECK_GROUPS, args[L_MAILLIST]))
+    {
+      if (rc != AD_NO_GROUPS_FOUND)
+        {
+          if (rc = process_group(ldap_handle, dn_path, moira_list_id, 
+				 group_name, group_ou, group_membership, 
+				 security_flag, CLEANUP_GROUPS,
+				 args[L_MAILLIST]))
+            {
+              if (rc != AD_NO_GROUPS_FOUND)
+                {
+                  if (afterc)
+                    com_err(whoami, 0, "Unable to add %s to group %s - " 
+			    "unable to process group", user_name, group_name);
+                  else
+                    com_err(whoami, 0, "Unable to remove %s from group %s - "
+			    "unable to process group", user_name, group_name);
+                  return;
+                }
+            }
+        }
+    }
+
+  if (rc == AD_NO_GROUPS_FOUND)
+    {
+      if (rc = moira_connect())
+        {
+          critical_alert("Ldap incremental",
+                         "Error contacting Moira server : %s",
+                         error_message(rc));
+          return;
+        }
+      
+      com_err(whoami, 0, "creating group %s", group_name);
+      ProcessGroup = 0;
+
+      if (ProcessAce(ldap_handle, dn_path, ptr[LM_LIST], "LIST", 0, 
+		     &ProcessGroup, ptr[LM_EXTRA_MAILLIST]))
+        return;
+
+      if (ProcessGroup)
+        {
+          if (ProcessAce(ldap_handle, dn_path, ptr[LM_LIST], "LIST", 1, 
+			 &ProcessGroup, ptr[LM_EXTRA_MAILLIST]))
+            return;
+        }
+
+      if (make_new_group(ldap_handle, dn_path, moira_list_id, ptr[LM_LIST], 
+                         group_ou, group_membership, security_flag, 0,
+			 ptr[LM_EXTRA_MAILLIST]))
+        {
+          moira_disconnect();
+          return;
+        }
+    
+      if (atoi(ptr[LM_EXTRA_ACTIVE]))
+        {
+          populate_group(ldap_handle, dn_path, ptr[LM_LIST], group_ou, 
+                         group_membership, security_flag, moira_list_id);
+        }
+
+      moira_disconnect();
+    }
+
+  rc = 0;
+
+  if (beforec)
+    {
+      com_err(whoami, 0, "removing user %s from list %s", user_name, 
+	      group_name);
+      pUserOu = user_ou;
+ 
+      if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
+        {
+	  if (!ProcessMachineContainer)
+	    {
+	      com_err(whoami, 0, "Process machines and containers disabled, "
+		      "skipping");
+	      return;
+	    }
+
+          memset(machine_ou, '\0', sizeof(machine_ou));
+	  memset(NewMachineName, '\0', sizeof(NewMachineName));
+          if (get_machine_ou(ldap_handle, dn_path, ptr[LM_MEMBER], 
+			     machine_ou, NewMachineName))
+            return;
+	  if (ptr[LM_MEMBER] != NULL)	  
+	    free(ptr[LM_MEMBER]);
+	  ptr[LM_MEMBER] = strdup(NewMachineName);
+          pUserOu = machine_ou;
+        }
+
+      if (!strcasecmp(ptr[LM_TYPE], "STRING"))
+        {
+	  strcpy(member, ptr[LM_MEMBER]);
+
+	  if (Exchange) 
+	    {
+	      if((s = strchr(member, '@')) == (char *) NULL)
+		{ 
+		  strcat(member, "@mit.edu");
+		  
+		  if (ptr[LM_MEMBER] != NULL)
+		    free(ptr[LM_MEMBER]);
+		  ptr[LM_MEMBER] = strdup(member);
+		}
+	  
+	      if(!strncasecmp(&member[strlen(member) - 6], ".LOCAL", 6)) 
+		{
+		  s = strrchr(member, '.');
+		  *s = '\0';
+		  strcat(s, ".mit.edu");
+		  
+		  if (ptr[LM_MEMBER] != NULL)
+		    free(ptr[LM_MEMBER]);
+		  ptr[LM_MEMBER] = strdup(member);
+		}
+	    }
+
+	  if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER], 
+			     contact_ou))
+		return;
+
+          pUserOu = contact_ou;
+        }
+      else if (!strcasecmp(ptr[LM_TYPE], "KERBEROS"))
+	{
+	  if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER], 
+			     kerberos_ou))
+	    return;
+
+	  pUserOu = kerberos_ou;
+	}
+
+      if (rc = moira_connect()) {
+	critical_alert("Ldap incremental",
+		       "Error contacting Moira server : %s",
+		       error_message(rc));              
+	return;
+      }
+      
+      if (rc = populate_group(ldap_handle, dn_path, group_name,
+			      group_ou, group_membership, 
+			      security_flag, moira_list_id))
+	com_err(whoami, 0, "Unable to remove %s from group %s", user_name, 
+		group_name);
+      
+      moira_disconnect();
+      
+      if (!strcasecmp(ptr[LM_TYPE], "STRING"))
+	{
+	  if (rc = moira_connect())
+	    {
+	      critical_alert("Ldap incremental",
+			     "Error contacting Moira server : %s",
+			     error_message(rc));
+	      return;
+	    }
+	  
+	  if (rc = populate_group(ldap_handle, dn_path, group_name,
+				  group_ou, group_membership, security_flag,
+				  moira_list_id))
+	    com_err(whoami, 0, "Unable to remove %s from group %s",
+		    user_name, group_name);
+
+	  moira_disconnect();
+	}
+      return;
+    }
+  
+  com_err(whoami, 0, "Adding %s to list %s", user_name, group_name);
+  pUserOu = user_ou;
+  
+  if (!strcasecmp(ptr[LM_TYPE], "MACHINE"))
+    {
+      memset(machine_ou, '\0', sizeof(machine_ou));
+      memset(NewMachineName, '\0', sizeof(NewMachineName));
+
+      if (get_machine_ou(ldap_handle, dn_path, ptr[LM_MEMBER], machine_ou, 
+			 NewMachineName))
+        return;
+
+      if (ptr[LM_MEMBER] != NULL)
+	free(ptr[LM_MEMBER]);
+
+      ptr[LM_MEMBER] = strdup(NewMachineName);
+      pUserOu = machine_ou;
+    }
+  else if (!strcasecmp(ptr[LM_TYPE], "STRING"))
+    {
+      strcpy(member, ptr[LM_MEMBER]);
+
+      if (Exchange) 
+	{
+	  if((s = strchr(member, '@')) == (char *) NULL)
+	    { 
+	      strcat(member, "@mit.edu");
+	      
+	      if (ptr[LM_MEMBER] != NULL)
+		free(ptr[LM_MEMBER]);
+	      ptr[LM_MEMBER] = strdup(member);
+	    }
+	  
+	  if(!strncasecmp(&member[strlen(member) - 6], ".LOCAL", 6)) 
+	    {
+	      s = strrchr(member, '.');
+	      *s = '\0';
+	      strcat(s, ".mit.edu");
+	      
+	      if (ptr[LM_MEMBER] != NULL)
+		free(ptr[LM_MEMBER]);
+	      ptr[LM_MEMBER] = strdup(member);
+	    }
+	}
+      
+      if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER], 
+			 contact_ou))
+        return;
+
+      pUserOu = contact_ou;
+    }
+  else if (!strcasecmp(ptr[LM_TYPE], "KERBEROS"))
+    {
+      if (contact_create(ldap_handle, dn_path, ptr[LM_MEMBER], 
+			 kerberos_ou))
+        return;
+
+      pUserOu = kerberos_ou;
+    }
+  else if (!strcasecmp(ptr[LM_TYPE], "USER"))
+    {
+      if ((rc = check_user(ldap_handle, dn_path, ptr[LM_MEMBER], 
+                           moira_user_id)) == AD_NO_USER_FOUND)
+        {
+          if (rc = moira_connect())
+            {
+              critical_alert("Ldap incremental", 
+                             "Error connection to Moira : %s",
+                             error_message(rc));
+              return;
+            }
+
+          com_err(whoami, 0, "creating user %s", ptr[LM_MEMBER]);
+          av[0] = ptr[LM_MEMBER];
+          call_args[0] = (char *)ldap_handle;
+          call_args[1] = dn_path;
+          call_args[2] = moira_user_id;
+          call_args[3] = NULL;
+	  
+          callback_rc = 0;
+
+	  if (Exchange)
+	    {
+	      group_count = 0;
+	      group_base = NULL;
+	  
+	      sprintf(filter, "(&(objectClass=group)(cn=%s))", ptr[LM_MEMBER]);
+	      attr_array[0] = "cn";
+	      attr_array[1] = NULL;
+	      if ((rc = linklist_build(ldap_handle, dn_path, filter, 
+				       attr_array, &group_base, &group_count,
+				       LDAP_SCOPE_SUBTREE)) != 0)
+		{
+		  com_err(whoami, 0, "Unable to process user %s : %s",
+			  ptr[LM_MEMBER], ldap_err2string(rc));
+		  return;
+		}
+	      
+	      if (group_count)
+		{
+		  com_err(whoami, 0, "Object already exists with name %s",
+			  ptr[LM_MEMBER]);
+		  return;
+		}
+	  
+	      linklist_free(group_base);
+	      group_count = 0;
+	      group_base = NULL;
+	    }
+
+          if (rc = mr_query("get_user_account_by_login", 1, av, 
+                            save_query_info, save_argv))
+            {
+              moira_disconnect();
+              com_err(whoami, 0, "Unable to create user %s : %s",
+                      ptr[LM_MEMBER], error_message(rc));
+              return;
+            }
+	
+	  if (rc = user_create(U_END, save_argv, call_args)) 
+	    {
+              moira_disconnect();
+              com_err(whoami, 0, "Unable to create user %s", ptr[LM_MEMBER]);
+              return;
+	    }
+
+          if (callback_rc)
+            {
+              moira_disconnect();
+              com_err(whoami, 0, "Unable to create user %s", ptr[LM_MEMBER]);
+              return;
+            }
+        }
+      else
+        {
+          if (rc != 0)
+            return;
+        }
+      pUserOu = user_ou;
+    }
+
+  if (rc = moira_connect()) {
+    critical_alert("Ldap incremental",
+		   "Error contacting Moira server : %s",
+		   error_message(rc));              
+    return;
+  }
+
+  if (rc = populate_group(ldap_handle, dn_path, group_name,
+			  group_ou, group_membership, security_flag,
+			  moira_list_id))
+    com_err(whoami, 0, "Unable to add %s to group %s", user_name, 
+	    group_name);
+  
+  moira_disconnect();
+
+  if (!strcasecmp(ptr[LM_TYPE], "STRING"))
+    {
+      if (rc = moira_connect())
+	{
+	  critical_alert("Ldap incremental",
+			 "Error contacting Moira server : %s",
+			 error_message(rc));
+	  return;
+	}
+      
+      if (rc = populate_group(ldap_handle, dn_path, group_name,
+			      group_ou, group_membership, security_flag,
+			      moira_list_id))
+	com_err(whoami, 0, "Unable to add %s to group %s",
+		user_name, group_name);
+      
+      moira_disconnect();
+    }
+
+  return;
+}
+
+
+#define U_USER_ID    10
+#define U_HOMEDIR    11
+#define U_PROFILEDIR 12
+
+void do_user(LDAP *ldap_handle, char *dn_path, char *ldap_hostname, 
+             char **before, int beforec, char **after, 
+             int afterc)
+{
+  LK_ENTRY *group_base;
+  int   group_count;
+  char  filter[128];
+  char  *attr_array[3];
+  int   rc;
+  char  *av[7];
+  char  after_user_id[32];
+  char  before_user_id[32];
+  char  *call_args[7];
+  char  *save_argv[U_END];
+
+  if ((beforec == 0) && (afterc == 0))
+    return;
+
+  memset(after_user_id, '\0', sizeof(after_user_id));
+  memset(before_user_id, '\0', sizeof(before_user_id));
+
+  if (beforec > U_USER_ID)
+    strcpy(before_user_id, before[U_USER_ID]);
+
+  if (afterc > U_USER_ID)
+    strcpy(after_user_id, after[U_USER_ID]);
+
+  if ((beforec == 0) && (afterc == 0)) /*this case should never happen */
+    return;
+
+  if ((beforec == 0) && (afterc != 0)) 
+    {
+      /*this case only happens when the account*/
+      /*account is first created but not usable*/
+
+      com_err(whoami, 0, "Unable to process user %s because the user account "
+	      "is not yet usable", after[U_NAME]);
+      return;
+    }
+
+  /*this case only happens when the account is expunged */
+
+  if ((beforec != 0) && (afterc == 0)) 
+    {                                 
+      if (atoi(before[U_STATE]) == 0)
+        {
+          com_err(whoami, 0, "expunging user %s from directory", 
+		  before[U_NAME]);
+          user_delete(ldap_handle, dn_path, before[U_NAME], before_user_id);
+        }
+      else
+        {
+          com_err(whoami, 0, "Unable to process because user %s has been "
+		  "previously expungeded", before[U_NAME]);
+        }
+      return;
+    }
+
+  /*process anything that gets here*/
+
+  if ((rc = check_user(ldap_handle, dn_path, before[U_NAME], 
+                       before_user_id)) == AD_NO_USER_FOUND)
+    {
+      if (!check_string(after[U_NAME]))
+        return;
+
+      if (rc = moira_connect())
+        {
+          critical_alert("Ldap incremental", 
+                         "Error connection to Moira : %s",
+                         error_message(rc));
+          return;
+        }
+
+      com_err(whoami, 0, "creating user %s", after[U_NAME]);
+      
+      av[0] = after[U_NAME];
+      call_args[0] = (char *)ldap_handle;
+      call_args[1] = dn_path;
+      call_args[2] = after_user_id;
+      call_args[3] = NULL;
+      callback_rc = 0;
+
+      if (Exchange) 
+	{
+	  group_count = 0;
+	  group_base = NULL;
+	  
+	  sprintf(filter, "(&(objectClass=group)(cn=%s))", after[U_NAME]);
+	  attr_array[0] = "cn";
+	  attr_array[1] = NULL;
+	  
+	  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
+				   &group_base, &group_count,
+				   LDAP_SCOPE_SUBTREE)) != 0)
+	    {
+	      com_err(whoami, 0, "Unable to process user %s : %s",
+		      after[U_NAME], ldap_err2string(rc));
+	      return;
+	    }
+	  
+	  if (group_count >= 1)
+	    {
+	      com_err(whoami, 0, "Object already exists with name %s",
+		      after[U_NAME]);
+	      return;
+	    }
+      
+	  linklist_free(group_base);
+	  group_count = 0;
+	  group_base = NULL;
+	}
+
+      if (rc = mr_query("get_user_account_by_login", 1, av,
+                        save_query_info, save_argv))
+        {
+          moira_disconnect();
+          com_err(whoami, 0, "Unable to create user %s : %s",
+                  after[U_NAME], error_message(rc));
+          return;
+        }
+
+      if (rc = user_create(U_END, save_argv, call_args)) 
+	{
+          com_err(whoami, 0, "Unable to create user %s : %s",
+                  after[U_NAME], error_message(rc));
+	  return;
+	}
+      
+      if (callback_rc)
+        {
+          moira_disconnect();
+          com_err(whoami, 0, "Unable to create user %s", after[U_NAME]);
+          return;
+        }
+
+      return;
+    }
+  else
+    {
+      if (rc != 0)
+        return;
+    }
+
+  if (strcmp(before[U_NAME], after[U_NAME]))
+    {
+      if ((check_string(before[U_NAME])) && (check_string(after[U_NAME])))
+        {
+          com_err(whoami, 0, "changing user %s to %s", 
+                  before[U_NAME], after[U_NAME]);
+
+          if ((rc = user_rename(ldap_handle, dn_path, before[U_NAME], 
+                                after[U_NAME])) != LDAP_SUCCESS)
+            {
+              return;
+            }
+        }
+    }
+
+  com_err(whoami, 0, "updating user %s information", after[U_NAME]);
+  rc = user_update(ldap_handle, dn_path, after[U_NAME],
+                   after[U_UID], after[U_MITID], 
+		   after_user_id, atoi(after[U_STATE]),
+                   after[U_HOMEDIR], after[U_PROFILEDIR],
+		   after[U_FIRST], after[U_MIDDLE], after[U_LAST], 
+		   after[U_SHELL], after[U_CLASS]);
+
+  return;
+}
+
+int construct_newvalues(LK_ENTRY *linklist_base, int modvalue_count, 
+                        char *oldValue, char *newValue,
+                        char ***modvalues, int type)
+{
+  LK_ENTRY    *linklist_ptr;
+  int         i;
+  char        *cPtr;
+  
+  if (((*modvalues) = calloc(1, 
+			     (modvalue_count + 1) * sizeof(char *))) == NULL)
+    {
+      return(1);
+    }
+
+  for (i = 0; i < (modvalue_count + 1); i++)
+    (*modvalues)[i] = NULL;
+
+  if (modvalue_count != 0)
+    {
+      linklist_ptr = linklist_base;
+      for (i = 0; i < modvalue_count; i++)
+        {
+          if ((oldValue != NULL) && (newValue != NULL))
+            {
+              if ((cPtr = (char *)strstr(linklist_ptr->value, oldValue))
+		  != (char *)NULL)
+                {
+                  if (type == REPLACE)
+                    {
+                      if (((*modvalues)[i] = calloc(1, strlen(newValue) + 1))
+                          == NULL)
+                        return(1);
+                      memset((*modvalues)[i], '\0', strlen(newValue) + 1);
+                      strcpy((*modvalues)[i], newValue);
+                    }
+                  else
+                    {
+                      if (((*modvalues)[i] = calloc(1, 
+                                        (int)(cPtr - linklist_ptr->value) + 
+					       (linklist_ptr->length - 
+					       strlen(oldValue)) + 
+					       strlen(newValue) + 1)) == NULL)
+                        return(1);
+                      memset((*modvalues)[i], '\0', 
+                             (int)(cPtr - linklist_ptr->value) + 
+                             (linklist_ptr->length - strlen(oldValue)) + 
+                             strlen(newValue) + 1);
+                      memcpy((*modvalues)[i], linklist_ptr->value, 
+                             (int)(cPtr - linklist_ptr->value));
+                      strcat((*modvalues)[i], newValue);
+                      strcat((*modvalues)[i], 
+			     &linklist_ptr->value[(int)(cPtr - 
+				     linklist_ptr->value) + strlen(oldValue)]);
+                    }
+                }
+              else
+                {
+                  (*modvalues)[i] = calloc(1, linklist_ptr->length + 1);
+                  memset((*modvalues)[i], '\0', linklist_ptr->length + 1);
+                  memcpy((*modvalues)[i], linklist_ptr->value,
+                         linklist_ptr->length);
+                }
+            }
+        else
+            {
+              (*modvalues)[i] = calloc(1, linklist_ptr->length + 1);
+              memset((*modvalues)[i], '\0', linklist_ptr->length + 1);
+              memcpy((*modvalues)[i], linklist_ptr->value,
+                     linklist_ptr->length);
+            }
+          linklist_ptr = linklist_ptr->next;
+        }
+      (*modvalues)[i] = NULL;
+    }
+  return(0);
+}
+
+
+int linklist_build(LDAP *ldap_handle, char *dn_path, char *search_exp, 
+                   char **attr_array, LK_ENTRY **linklist_base,
+                   int *linklist_count, unsigned long ScopeType)
+{
+  ULONG       rc;
+  LDAPMessage *ldap_entry;
+
+  rc = 0;
+  ldap_entry = NULL;
+  (*linklist_base) = NULL;
+  (*linklist_count) = 0;
+
+  if ((rc = ldap_search_s(ldap_handle, dn_path, ScopeType, 
+                          search_exp, attr_array, 0, 
+			  &ldap_entry)) != LDAP_SUCCESS)
+      {
+        if (rc != LDAP_SIZELIMIT_EXCEEDED)
+          return(0);
+      }
+
+  rc = retrieve_entries(ldap_handle, ldap_entry, linklist_base, 
+			linklist_count);
+
+  ldap_msgfree(ldap_entry);
+  return(rc);
+}
+
+int retrieve_entries(LDAP *ldap_handle, LDAPMessage *ldap_entry, 
+                     LK_ENTRY **linklist_base, int *linklist_count)
+{
+  char        distinguished_name[1024];
+  LK_ENTRY    *linklist_ptr;
+  int         rc;
+
+  if ((ldap_entry = ldap_first_entry(ldap_handle, ldap_entry)) == NULL)
+    return(0);
+  
+  memset(distinguished_name, '\0', sizeof(distinguished_name));
+  get_distinguished_name(ldap_handle, ldap_entry, distinguished_name);
+
+  if ((rc = retrieve_attributes(ldap_handle, ldap_entry, distinguished_name,
+                                linklist_base)) != 0)
+    return(rc);
+
+  while ((ldap_entry = ldap_next_entry(ldap_handle, ldap_entry)) != NULL)
+    {
+      memset(distinguished_name, '\0', sizeof(distinguished_name));
+      get_distinguished_name(ldap_handle, ldap_entry, distinguished_name);
+      
+      if ((rc = retrieve_attributes(ldap_handle, ldap_entry, 
+				    distinguished_name, linklist_base)) != 0)
+        return(rc);
+    }
+
+  linklist_ptr = (*linklist_base);
+  (*linklist_count) = 0;
+
+  while (linklist_ptr != NULL)
+    {
+      ++(*linklist_count);
+      linklist_ptr = linklist_ptr->next;
+    }
+
+  return(0);
+}
+
+int retrieve_attributes(LDAP *ldap_handle, LDAPMessage *ldap_entry, 
+                        char *distinguished_name, LK_ENTRY **linklist_current)
+{
+  char        *Attribute;
+  BerElement  *ptr;
+
+  ptr = NULL;
+
+  if ((Attribute = ldap_first_attribute(ldap_handle, ldap_entry, 
+					&ptr)) != NULL)
+    {
+      retrieve_values(ldap_handle, ldap_entry, Attribute, distinguished_name,
+                      linklist_current);
+      ldap_memfree(Attribute);
+      while ((Attribute = ldap_next_attribute(ldap_handle, ldap_entry, 
+                                              ptr)) != NULL)
+        {
+          retrieve_values(ldap_handle, ldap_entry, Attribute,
+                          distinguished_name, linklist_current);
+          ldap_memfree(Attribute);
+        }
+    }
+
+  ldap_ber_free(ptr, 0);
+
+  return(0);
+}
+
+int retrieve_values(LDAP *ldap_handle, LDAPMessage *ldap_entry,
+                    char *Attribute, char *distinguished_name,
+                    LK_ENTRY **linklist_current)
+{
+  char        **str_value;
+  char        temp[256];
+  void        **Ptr;
+  int         use_bervalue;
+  LK_ENTRY    *linklist_previous;
+  LDAP_BERVAL **ber_value;
+  DWORD       ber_length;
+
+#ifdef LDAP_DEBUG
+  SID         *sid;
+  GUID        *guid;
+  int         i;
+  int         intValue;
+  DWORD       *subauth;
+  SID_IDENTIFIER_AUTHORITY    *sid_auth;
+  unsigned char   *subauth_count;
+#endif /*LDAP_BEGUG*/
+
+  use_bervalue = 0;
+  memset(temp, '\0', sizeof(temp));
+
+  if ((!strcmp(Attribute, "objectSid")) ||
+      (!strcmp(Attribute, "objectGUID")))
+    use_bervalue = 1;
+  
+  if (use_bervalue)
+    {
+      ber_value = ldap_get_values_len(ldap_handle, ldap_entry, Attribute);
+      Ptr = (void **)ber_value;
+      str_value = NULL;
+    }
+  else
+    {
+      str_value = ldap_get_values(ldap_handle, ldap_entry, Attribute);
+      Ptr = (void **)str_value;
+      ber_value = NULL;
+    }
+
+  if (Ptr != NULL)
+    {
+      for (; *Ptr; Ptr++) 
+        {
+          if ((linklist_previous = calloc(1, sizeof(LK_ENTRY))) == NULL)
+            return(1);
+
+          memset(linklist_previous, '\0', sizeof(LK_ENTRY));
+          linklist_previous->next = (*linklist_current);
+          (*linklist_current) = linklist_previous;
+	  
+          if (((*linklist_current)->attribute = calloc(1, 
+					      strlen(Attribute) + 1)) == NULL)
+            return(1);
+
+          memset((*linklist_current)->attribute, '\0', strlen(Attribute) + 1);
+          strcpy((*linklist_current)->attribute, Attribute);
+
+          if (use_bervalue)
+            {
+              ber_length = (*(LDAP_BERVAL **)Ptr)->bv_len;
+
+              if (((*linklist_current)->value = calloc(1, ber_length)) == NULL)
+                return(1);
+
+              memset((*linklist_current)->value, '\0', ber_length);
+              memcpy((*linklist_current)->value, 
+		     (*(LDAP_BERVAL **)Ptr)->bv_val, ber_length);
+              (*linklist_current)->length = ber_length;
+            }
+          else
+            {
+              if (((*linklist_current)->value = calloc(1, 
+						    strlen(*Ptr) + 1)) == NULL)
+                return(1);
+
+              memset((*linklist_current)->value, '\0', strlen(*Ptr) + 1);
+              (*linklist_current)->length = strlen(*Ptr);
+              strcpy((*linklist_current)->value, *Ptr);
+            }
+
+          (*linklist_current)->ber_value = use_bervalue;
+
+          if (((*linklist_current)->dn = calloc(1, 
+				      strlen(distinguished_name) + 1)) == NULL)
+            return(1);
+
+          memset((*linklist_current)->dn, '\0', 
+		 strlen(distinguished_name) + 1);
+          strcpy((*linklist_current)->dn, distinguished_name);
+
+#ifdef LDAP_DEBUG
+          if (!strcmp(Attribute, "objectGUID"))
+            {
+              guid = (GUID *)((*linklist_current)->value);
+              sprintf(temp, 
+		      "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", 
+                      guid->Data1, guid->Data2, guid->Data3, 
+                      guid->Data4[0], guid->Data4[1], guid->Data4[2], 
+                      guid->Data4[3], guid->Data4[4], guid->Data4[5], 
+                      guid->Data4[6], guid->Data4[7]);
+              print_to_screen("     %20s : {%s}\n", Attribute, temp);
+            }
+          else if (!strcmp(Attribute, "objectSid"))
+            {
+              sid = (SID *)((*(LDAP_BERVAL **)Ptr)->bv_val);
+
+#ifdef _WIN32
+              print_to_screen("        Revision = %d\n", sid->Revision);
+              print_to_screen("        SID Identifier Authority:\n");
+              sid_auth = &sid->IdentifierAuthority;
+              if (sid_auth->Value[0])
+                print_to_screen("            SECURITY_NULL_SID_AUTHORITY\n");
+              else if (sid_auth->Value[1])
+                print_to_screen("            SECURITY_WORLD_SID_AUTHORITY\n");
+              else if (sid_auth->Value[2])
+                print_to_screen("            SECURITY_LOCAL_SID_AUTHORITY\n");
+              else if (sid_auth->Value[3])
+                print_to_screen("           SECURITY_CREATOR_SID_AUTHORITY\n");
+              else if (sid_auth->Value[5])
+                print_to_screen("            SECURITY_NT_AUTHORITY\n");
+              else
+                print_to_screen("            UNKNOWN SID AUTHORITY\n");
+              subauth_count = GetSidSubAuthorityCount(sid);
+              print_to_screen("        SidSubAuthorityCount = %d\n", 
+                              *subauth_count);
+              print_to_screen("        SidSubAuthority:\n");
+              for (i = 0; i < *subauth_count; i++)
+                {
+                  if ((subauth = GetSidSubAuthority(sid, i)) != NULL)
+                    print_to_screen("            %u\n", *subauth);
+                }
+#endif
+            }
+          else if ((!memcmp(Attribute, "userAccountControl", 
+                            strlen("userAccountControl"))) ||
+                   (!memcmp(Attribute, "sAMAccountType", 
+                            strlen("sAmAccountType"))))
+            {
+              intValue = atoi(*Ptr);
+              print_to_screen("     %20s : %ld\n",Attribute, intValue);
+
+              if (!memcmp(Attribute, "userAccountControl", 
+                          strlen("userAccountControl")))
+                {
+                  if (intValue & UF_ACCOUNTDISABLE)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Account disabled");
+                  else
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Account active");
+                  if (intValue & UF_HOMEDIR_REQUIRED)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Home directory required");
+                  if (intValue & UF_LOCKOUT)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Account locked out");
+                  if (intValue & UF_PASSWD_NOTREQD)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "No password required");
+                  if (intValue & UF_PASSWD_CANT_CHANGE)
+                    print_to_screen("     %20s :    %s\n",
+                                    "", "Cannot change password");
+                  if (intValue & UF_TEMP_DUPLICATE_ACCOUNT)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Temp duplicate account");
+                  if (intValue & UF_NORMAL_ACCOUNT)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Normal account");
+                  if (intValue & UF_INTERDOMAIN_TRUST_ACCOUNT)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Interdomain trust account");
+                  if (intValue & UF_WORKSTATION_TRUST_ACCOUNT)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Workstation trust account");
+                  if (intValue & UF_SERVER_TRUST_ACCOUNT)
+                    print_to_screen("     %20s :    %s\n", 
+                                    "", "Server trust account");
+                }
+            }
+          else
+            {
+              print_to_screen("     %20s : %s\n",Attribute, *Ptr);
+            }
+#endif /*LDAP_DEBUG*/
+        }
+
+      if (str_value != NULL)
+        ldap_value_free(str_value);
+
+      if (ber_value != NULL)
+        ldap_value_free_len(ber_value);
+    }
+
+  (*linklist_current) = linklist_previous;
+
+  return(0);
+}
+
+int moira_connect(void)
+{
+  long    rc;
+  char    HostName[64];
+
+  if (!mr_connections++)
+    {
+
+#ifdef _WIN32
+      memset(HostName, '\0', sizeof(HostName));
+      strcpy(HostName, "ttsp");
+      rc = mr_connect_cl(HostName, "ldap.incr", QUERY_VERSION, 1);
+#else
+      struct utsname uts;
+      uname(&uts);
+      rc = mr_connect_cl(uts.nodename, "ldap.incr", QUERY_VERSION, 1);
+#endif /*WIN32*/
+
+      return rc;
+    }
+
+  return 0;
+}
+
+int check_winad(void)
+{
+  int i;
+  
+  for (i = 0; file_exists(STOP_FILE); i++)
+    {
+      if (i > 30)
+        {
+          critical_alert("Ldap incremental",
+                         "Ldap incremental failed (%s exists): %s",
+                         STOP_FILE, tbl_buf);
+          return(1);
+        }
+
+      sleep(60);
+    }
+
+  return(0);
+}
+
+int moira_disconnect(void)
+{
+
+  if (!--mr_connections)
+    {
+      mr_disconnect();
+    }
+
+  return 0;
+}
+
+void get_distinguished_name(LDAP *ldap_handle, LDAPMessage *ldap_entry, 
+                            char *distinguished_name)
+{
+  char    *CName;
+  
+  CName = ldap_get_dn(ldap_handle, ldap_entry);
+
+  if (CName == NULL)
+    return;
+
+  strcpy(distinguished_name, CName);
+  ldap_memfree(CName);
+}
+
+int linklist_create_entry(char *attribute, char *value, 
+                          LK_ENTRY **linklist_entry)
+{
+  (*linklist_entry) = calloc(1, sizeof(LK_ENTRY));
+
+  if (!(*linklist_entry))
+    {
+      return(1);
+    }
+
+  memset((*linklist_entry), '\0', sizeof(LK_ENTRY));
+  (*linklist_entry)->attribute = calloc(1, strlen(attribute) + 1);
+  memset((*linklist_entry)->attribute, '\0', strlen(attribute) + 1);
+  strcpy((*linklist_entry)->attribute, attribute);
+  (*linklist_entry)->value = calloc(1, strlen(value) + 1);
+  memset((*linklist_entry)->value, '\0', strlen(value) + 1);
+  strcpy((*linklist_entry)->value, value);
+  (*linklist_entry)->length = strlen(value);
+  (*linklist_entry)->next = NULL;
+
+  return(0);
+}
+
+void print_to_screen(const char *fmt, ...)
+{
+  va_list pvar;
+
+  va_start(pvar, fmt);
+  vfprintf(stderr, fmt, pvar);
+  fflush(stderr);
+  va_end(pvar);
+}
+
+int get_group_membership(char *group_membership, char *group_ou, 
+                         int *security_flag, char **av)
+{
+  int  maillist_flag;
+  int  group_flag;
+  
+  maillist_flag = atoi(av[L_MAILLIST]);
+  group_flag = atoi(av[L_GROUP]);
+
+  if (security_flag != NULL)
+    (*security_flag) = 0;
+  
+  if ((maillist_flag) && (group_flag))
+    {
+      if (group_membership != NULL)
+        group_membership[0] = 'B';
+
+      if (security_flag != NULL)
+        (*security_flag) = 1;
+
+      if (group_ou != NULL)
+        strcpy(group_ou, group_ou_both);
+    }
+  else if ((!maillist_flag) && (group_flag))
+    {
+      if (group_membership != NULL)
+        group_membership[0] = 'S';
+
+      if (security_flag != NULL)
+        (*security_flag) = 1;
+
+      if (group_ou != NULL)
+        strcpy(group_ou, group_ou_security);
+    }
+  else if ((maillist_flag) && (!group_flag))
+    {
+      if (group_membership != NULL)
+        group_membership[0] = 'D';
+
+      if (group_ou != NULL)
+        strcpy(group_ou, group_ou_distribution);
+    }
+  else
+    {
+      if (group_membership != NULL)
+        group_membership[0] = 'N';
+
+      if (group_ou != NULL)
+        strcpy(group_ou, group_ou_neither);
+    }
+
+  return(0);
+}
+
+int group_rename(LDAP *ldap_handle, char *dn_path, 
+                 char *before_group_name, char *before_group_membership, 
+                 char *before_group_ou, int before_security_flag, 
+		 char *before_desc, char *after_group_name, 
+		 char *after_group_membership, char *after_group_ou, 
+		 int after_security_flag, char *after_desc,
+                 char *MoiraId, char *filter, char *maillist)
+{
+  LDAPMod   *mods[20];
+  char      old_dn[512];
+  char      new_dn[512];
+  char      new_dn_path[512];
+  char      sam_name[256];
+  char      mail[256];
+  char      mail_nickname[256];
+  char      proxy_address[256];
+  char      address_book[256];
+  char      *attr_array[3];
+  char      *mitMoiraId_v[] = {NULL, NULL};
+  char      *name_v[] = {NULL, NULL};
+  char      *samAccountName_v[] = {NULL, NULL};
+  char      *groupTypeControl_v[] = {NULL, NULL};
+  char      *mail_v[] = {NULL, NULL};
+  char      *proxy_address_v[] = {NULL, NULL};
+  char      *mail_nickname_v[] = {NULL, NULL};
+  char      *report_to_originator_v[] = {NULL, NULL};
+  char      *address_book_v[] = {NULL, NULL};
+  char      *legacy_exchange_dn_v[] = {NULL, NULL};
+  char      *null_v[] = {NULL, NULL};
+  u_int     groupTypeControl;
+  char      groupTypeControlStr[80];
+  char      contact_mail[256];
+  int       n;
+  int       i;
+  int       rc;
+  LK_ENTRY  *group_base;
+  int       group_count;
+  int       MailDisabled = 0;
+  char      search_filter[1024];
+
+  if(UseGroupUniversal)
+    groupTypeControl = ADS_GROUP_TYPE_UNIVERSAL_GROUP;
+  else
+    groupTypeControl = ADS_GROUP_TYPE_GLOBAL_GROUP;
+     
+  if (!check_string(before_group_name))
+    {
+      com_err(whoami, 0, 
+	      "Unable to process invalid LDAP list name %s", 
+	      before_group_name);
+      return(AD_INVALID_NAME);
+    }
+
+  if (!check_string(after_group_name))
+    {
+      com_err(whoami, 0, 
+	      "Unable to process invalid LDAP list name %s", after_group_name);
+      return(AD_INVALID_NAME);
+    }
+
+  if (Exchange) 
+    {
+      if(atoi(maillist)) 
+	{
+	  group_count = 0;
+	  group_base = NULL;
+	  
+	  sprintf(search_filter, "(&(objectClass=user)(cn=%s))", 
+		  after_group_name);
+	  attr_array[0] = "cn";
+	  attr_array[1] = NULL;
+
+	  if ((rc = linklist_build(ldap_handle, dn_path, search_filter, 
+				   attr_array, &group_base, &group_count,
+				   LDAP_SCOPE_SUBTREE)) != 0)
+	  {
+	    com_err(whoami, 0, "Unable to process group %s : %s",
+		    after_group_name, ldap_err2string(rc));
+	    return(rc);
+	  }
+	  
+	  if (group_count)
+	    {
+	      com_err(whoami, 0, "Object already exists with name %s",
+		      after_group_name);
+	      MailDisabled++;
+	    }
+	
+	  linklist_free(group_base);
+	  group_base = NULL;
+	  group_count = 0;
+	}
+    }
+
+  group_count = 0;
+  group_base = NULL;
+
+  if (rc = ad_get_group(ldap_handle, dn_path, before_group_name, 
+                        before_group_membership, 
+                        MoiraId, "samAccountName", &group_base, 
+                        &group_count, filter))
+    return(rc);
+
+  if (group_count == 0)
+    {
+      return(AD_NO_GROUPS_FOUND);
+    }
+
+  if (group_count != 1)
+    {
+      com_err(whoami, 0, "Unable to process multiple groups with "
+	      "MoiraId = %s exist in the directory", MoiraId);
+      return(AD_MULTIPLE_GROUPS_FOUND);
+    }
+
+  strcpy(old_dn, group_base->dn);
+
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+  attr_array[0] = "sAMAccountName";
+  attr_array[1] = NULL;
+
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                           &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, "Unable to get list %s dn : %s",
+              after_group_name, ldap_err2string(rc));
+      return(rc);
+    }
+
+  if (group_count != 1)
+    {
+      com_err(whoami, 0,
+              "Unable to get sAMAccountName for group %s", 
+              before_group_name);
+      return(AD_LDAP_FAILURE);
+    }
+  
+  strcpy(sam_name, group_base->value);
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+  
+  sprintf(new_dn_path, "%s,%s", after_group_ou, dn_path);
+  sprintf(new_dn, "cn=%s", after_group_name);
+  sprintf(mail, "%s@%s", after_group_name, lowercase(ldap_domain));
+  sprintf(contact_mail, "%s@mit.edu", after_group_name); 
+  sprintf(proxy_address, "SMTP:%s@%s", after_group_name, 
+	  lowercase(ldap_domain));
+  sprintf(mail_nickname, "%s", after_group_name);
+
+  com_err(whoami, 0, "Old %s New %s,%s", old_dn, new_dn, new_dn_path);
+
+  if ((rc = ldap_rename_s(ldap_handle, old_dn, new_dn, new_dn_path,
+			      TRUE, NULL, NULL)) != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to rename list from %s to %s : %s",
+	      before_group_name, after_group_name, ldap_err2string(rc));
+      return(rc);
+    }
+  
+  name_v[0] = after_group_name;
+
+  if (!strncmp(&sam_name[strlen(sam_name) - strlen(group_suffix)], 
+	       group_suffix, strlen(group_suffix)))
+    {
+      sprintf(sam_name, "%s%s", after_group_name, group_suffix);
+    }
+  else
+    {
+      com_err(whoami, 0, 
+	      "Unable to rename list from %s to %s : sAMAccountName not found",
+              before_group_name, after_group_name);
+      return(rc);
+    }
+
+  samAccountName_v[0] = sam_name;
+
+  if (after_security_flag)
+    groupTypeControl |= ADS_GROUP_TYPE_SECURITY_ENABLED;
+
+  sprintf(groupTypeControlStr, "%ld", groupTypeControl);
+  groupTypeControl_v[0] = groupTypeControlStr;
+  mitMoiraId_v[0] = MoiraId;
+
+  sprintf(new_dn, "cn=%s,%s,%s", after_group_name, after_group_ou, dn_path);
+  rc = attribute_update(ldap_handle, new_dn, after_desc, "description", 
+			after_group_name);
+  n = 0;
+  ADD_ATTR("samAccountName", samAccountName_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("displayName", name_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("groupType", groupTypeControl_v, LDAP_MOD_REPLACE);
+
+  if (Exchange)
+    {
+      if(atoi(maillist) && !MailDisabled && email_isvalid(mail)) 
+	{
+	  mail_nickname_v[0] = mail_nickname;
+	  proxy_address_v[0] = proxy_address;
+	  mail_v[0] = mail;
+	  report_to_originator_v[0] = "TRUE";
+
+	  ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		   LDAP_MOD_REPLACE);
+	} 
+      else 
+	{
+	  mail_nickname_v[0] = NULL;
+	  proxy_address_v[0] = NULL;
+	  mail_v[0] = NULL;
+	  legacy_exchange_dn_v[0] = NULL;
+	  address_book_v[0] = NULL;
+	  report_to_originator_v[0] = NULL;
+
+	  ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("legacyExchangeDN", legacy_exchange_dn_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		   LDAP_MOD_REPLACE);
+	}
+    }
+  else
+    {
+      if(atoi(maillist) && email_isvalid(contact_mail)) 
+	{
+	  mail_v[0] = contact_mail;
+	  ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+
+	  if(!ActiveDirectory)
+	    {
+	      null_v[0] = "/dev/null";
+	      ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_REPLACE);
+	    }
+	}
+    }
+
+  mods[n] = NULL;
+
+  if ((rc = ldap_modify_s(ldap_handle, new_dn, mods)) != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, 
+	      "Unable to modify list data for %s after renaming: %s",
+              after_group_name, ldap_err2string(rc));
+    }
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  return(rc);
+}
+
+int group_create(int ac, char **av, void *ptr)
+{
+  LDAPMod *mods[20];
+  char new_dn[256];
+  char group_ou[256];
+  char new_group_name[256];
+  char sam_group_name[256];
+  char cn_group_name[256];
+  char mail[256];
+  char contact_mail[256];
+  char mail_nickname[256];
+  char proxy_address[256];
+  char address_book[256];
+  char *cn_v[] = {NULL, NULL};
+  char *objectClass_v[] = {"top", "group", NULL};
+  char *objectClass_ldap_v[] = {"top", "microsoftComTop", "securityPrincipal",
+				"group", "mailRecipient", NULL};
+  char info[256];
+  char *samAccountName_v[] = {NULL, NULL};
+  char *altSecurityIdentities_v[] = {NULL, NULL};
+  char *member_v[] = {NULL, NULL};
+  char *name_v[] = {NULL, NULL};
+  char *desc_v[] = {NULL, NULL};
+  char *info_v[] = {NULL, NULL};
+  char *mitMoiraId_v[] = {NULL, NULL};
+  char *mitMoiraPublic_v[] = {NULL, NULL};
+  char *mitMoiraHidden_v[] = {NULL, NULL};
+  char *groupTypeControl_v[] = {NULL, NULL};
+  char *mail_v[] = {NULL, NULL};
+  char *proxy_address_v[] = {NULL, NULL};
+  char *mail_nickname_v[] = {NULL, NULL};
+  char *report_to_originator_v[] = {NULL, NULL};
+  char *address_book_v[] = {NULL, NULL};
+  char *legacy_exchange_dn_v[] = {NULL, NULL};
+  char *gidNumber_v[] = {NULL, NULL};
+  char *null_v[] = {NULL, NULL};
+  char groupTypeControlStr[80];
+  char group_membership[1];
+  int  i;
+  int  security_flag;
+  u_int groupTypeControl;
+  int  n;
+  int  rc;
+  int  updateGroup;
+  int  MailDisabled = 0;
+  char **call_args;
+  LK_ENTRY *group_base;
+  int  group_count;
+  char filter[1024];
+  char *attr_array[3];
+  
+  call_args = ptr;
+
+  if(UseGroupUniversal)
+    groupTypeControl = ADS_GROUP_TYPE_UNIVERSAL_GROUP;
+  else 
+    groupTypeControl = ADS_GROUP_TYPE_GLOBAL_GROUP;
+
+  if (!check_string(av[L_NAME]))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP list name %s", 
+	      av[L_NAME]);
+      return(AD_INVALID_NAME);
+    }
+
+  updateGroup = (int)call_args[4];
+  memset(group_ou, 0, sizeof(group_ou));
+  memset(group_membership, 0, sizeof(group_membership));
+  security_flag = 0;
+
+  get_group_membership(group_membership, group_ou, &security_flag, av);
+
+  strcpy(new_group_name, av[L_NAME]);
+  sprintf(new_dn, "cn=%s,%s,%s", new_group_name, group_ou, call_args[1]);
+  sprintf(contact_mail, "%s@mit.edu", av[L_NAME]);
+  sprintf(mail, "%s@%s", av[L_NAME], lowercase(ldap_domain));
+  sprintf(mail_nickname, "%s", av[L_NAME]);
+
+  if (security_flag)
+    groupTypeControl |= ADS_GROUP_TYPE_SECURITY_ENABLED;
+  
+  sprintf(sam_group_name, "%s%s", av[L_NAME], group_suffix);
+
+  if (!updateGroup)
+    {
+      sprintf(groupTypeControlStr, "%ld", groupTypeControl);
+      groupTypeControl_v[0] = groupTypeControlStr;
+
+      strcpy(cn_group_name, av[L_NAME]);
+      
+      samAccountName_v[0] = sam_group_name;
+      name_v[0] = new_group_name;
+      cn_v[0] = new_group_name;
+
+      n = 0;
+      ADD_ATTR("cn", cn_v, LDAP_MOD_ADD);
+
+      if(ActiveDirectory)
+	{
+	  ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
+	} 
+      else
+	{
+	  mitMoiraPublic_v[0] = av[L_PUBLIC];
+	  mitMoiraHidden_v[0] = av[L_HIDDEN];
+	  ADD_ATTR("objectClass", objectClass_ldap_v, LDAP_MOD_ADD);
+	  ADD_ATTR("mitMoiraPublic", mitMoiraPublic_v, LDAP_MOD_ADD);
+	  ADD_ATTR("mitMoiraHidden", mitMoiraHidden_v, LDAP_MOD_ADD);
+	  
+	  if(atoi(av[L_GROUP])) 
+	    {
+	      gidNumber_v[0] = av[L_GID];
+	      ADD_ATTR("gidNumber", gidNumber_v, LDAP_MOD_ADD);
+	    }
+	}
+
+      ADD_ATTR("sAMAccountName", samAccountName_v, LDAP_MOD_ADD);
+      ADD_ATTR("displayName", name_v, LDAP_MOD_ADD);
+      ADD_ATTR("name", name_v, LDAP_MOD_ADD);
+
+      if (Exchange)
+	{
+	  if(atoi(av[L_MAILLIST])) 
+	    {
+	      group_count = 0;
+	      group_base = NULL;
+	      
+	      sprintf(filter, "(&(objectClass=user)(cn=%s))", av[L_NAME]);
+	      attr_array[0] = "cn";
+	      attr_array[1] = NULL;
+	      
+	      if ((rc = linklist_build((LDAP *)call_args[0], call_args[1], 
+				       filter, attr_array, &group_base, 
+				       &group_count,
+				       LDAP_SCOPE_SUBTREE)) != 0)
+		{
+		  com_err(whoami, 0, "Unable to process group %s : %s",
+			  av[L_NAME], ldap_err2string(rc));
+		  return(rc);
+		}
+	      
+	      if (group_count)
+		{
+		  com_err(whoami, 0, "Object already exists with name %s",
+			  av[L_NAME]);
+		  MailDisabled++;
+		}
+	
+	      linklist_free(group_base);
+	      group_base = NULL;
+	      group_count = 0;
+	    }
+	  
+	  if(atoi(av[L_MAILLIST]) && !MailDisabled && email_isvalid(mail)) 
+	    {
+	      mail_nickname_v[0] = mail_nickname;
+	      report_to_originator_v[0] = "TRUE";
+
+	      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_ADD);
+	      ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		       LDAP_MOD_ADD);
+	    }
+	}
+      else
+	{
+	  if(atoi(av[L_MAILLIST]) && email_isvalid(contact_mail)) 
+	    {
+	      mail_v[0] = contact_mail;
+	      ADD_ATTR("mail", mail_v, LDAP_MOD_ADD);
+
+	      if(!ActiveDirectory)
+		{
+		  null_v[0] = "/dev/null";
+		  ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_ADD);
+		}
+	    }
+	}
+      
+      if (strlen(av[L_DESC]) != 0)
+	{
+	  desc_v[0] = av[L_DESC];
+	  ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
+	}
+      
+      ADD_ATTR("groupType", groupTypeControl_v, LDAP_MOD_ADD);
+
+      if (strlen(av[L_ACE_NAME]) != 0)
+	{
+	  sprintf(info, "The Administrator of this list is: %s", 
+		  av[L_ACE_NAME]);
+	  info_v[0] = info;
+	  ADD_ATTR("info", info_v, LDAP_MOD_ADD);
+	}
+
+      if (strlen(call_args[5]) != 0)
+	{
+	  mitMoiraId_v[0] = call_args[5];
+	  ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_ADD);
+	}
+	  
+      mods[n] = NULL;
+      
+      rc = ldap_add_ext_s((LDAP *)call_args[0], new_dn, mods, NULL, NULL);
+      
+      for (i = 0; i < n; i++)
+        free(mods[i]);
+
+      if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
+        {
+          com_err(whoami, 0, "Unable to create list %s in directory : %s",
+                  av[L_NAME], ldap_err2string(rc));
+          callback_rc = rc;
+          return(rc);
+        }
+    }
+
+  if ((rc == LDAP_ALREADY_EXISTS) || (updateGroup))
+    {
+      rc = attribute_update((LDAP *)call_args[0], new_dn, av[L_DESC], 
+			    "description", av[L_NAME]);
+      sprintf(info, "The Administrator of this list is: %s", av[L_ACE_NAME]);
+
+      rc = attribute_update((LDAP *)call_args[0], new_dn, info, "info", 
+				av[L_NAME]);
+
+      n = 0;
+
+      if (strlen(call_args[5]) != 0)
+	{
+	  mitMoiraId_v[0] = call_args[5];
+	  ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_REPLACE);
+	}
+
+      if (!(atoi(av[L_ACTIVE])))
+        {
+          member_v[0] = NULL;
+          ADD_ATTR("member", member_v, LDAP_MOD_REPLACE);
+        }
+   
+      if (!ActiveDirectory) 
+	{
+          mitMoiraPublic_v[0] = av[L_PUBLIC];
+          mitMoiraHidden_v[0] = av[L_HIDDEN];
+          ADD_ATTR("mitMoiraPublic", mitMoiraPublic_v, LDAP_MOD_REPLACE);
+          ADD_ATTR("mitMoiraHidden", mitMoiraHidden_v, LDAP_MOD_REPLACE);
+
+	  if(atoi(av[L_GROUP])) 
+	    {
+	      gidNumber_v[0] = av[L_GID];
+	      ADD_ATTR("gidNumber", gidNumber_v, LDAP_MOD_REPLACE);
+	    }
+	  else
+	    {
+	      ADD_ATTR("gidNumber", gidNumber_v, LDAP_MOD_REPLACE);
+	    }
+	}
+
+      if (Exchange)
+	{
+	  if(atoi(av[L_MAILLIST])) 
+	    {
+	      group_count = 0;
+	      group_base = NULL;
+	      
+	      sprintf(filter, "(&(objectClass=user)(cn=%s))", av[L_NAME]);
+	      attr_array[0] = "cn";
+	      attr_array[1] = NULL;
+	      
+	      if ((rc = linklist_build((LDAP *)call_args[0], call_args[1], 
+				       filter, attr_array, &group_base, 
+				       &group_count,
+				       LDAP_SCOPE_SUBTREE)) != 0)
+		{
+		  com_err(whoami, 0, "Unable to process group %s : %s",
+			  av[L_NAME], ldap_err2string(rc));
+		  return(rc);
+		}
+	      
+	      if (group_count)
+		{
+		  com_err(whoami, 0, "Object already exists with name %s",
+			  av[L_NAME]);
+		  MailDisabled++;
+		}
+	      
+	      linklist_free(group_base);
+	      group_base = NULL;
+	      group_count = 0;
+	    }
+
+	  if (atoi(av[L_MAILLIST]) && !MailDisabled && email_isvalid(mail)) 
+	    {
+	      mail_nickname_v[0] = mail_nickname;
+	      report_to_originator_v[0] = "TRUE";
+
+	      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
+	      ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		       LDAP_MOD_REPLACE);
+	    }
+	  else 
+	    {
+	      mail_v[0] = NULL;
+	      mail_nickname_v[0] = NULL;
+	      proxy_address_v[0] = NULL;
+	      legacy_exchange_dn_v[0] = NULL;
+	      address_book_v[0] = NULL;
+	      report_to_originator_v[0] = NULL;
+
+	      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
+	      ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
+	      ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+	      ADD_ATTR("legacyExchangeDN", legacy_exchange_dn_v, 
+		       LDAP_MOD_REPLACE);
+	      ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
+	      ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		       LDAP_MOD_REPLACE);
+	    }
+	}
+      else
+	{
+	  if (atoi(av[L_MAILLIST]) && email_isvalid(contact_mail)) 
+	    {
+	      mail_v[0] = contact_mail;
+	      ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+
+	      if(!ActiveDirectory)
+		{
+		  null_v[0] = "/dev/null";
+		  ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_REPLACE);
+		}
+	    }
+	  else
+	    {
+	      mail_v[0] = NULL;
+	      ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+
+	      if(!ActiveDirectory)
+		{
+		  null_v[0] = NULL;
+		  ADD_ATTR("mailRoutingAddress", null_v, LDAP_MOD_REPLACE);
+		}
+	    }
+	}
+   
+      mods[n] = NULL;
+      rc = LDAP_SUCCESS;
+
+      if (n != 0)
+        {
+          rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
+
+          for (i = 0; i < n; i++)
+              free(mods[i]);
+
+          if (rc != LDAP_SUCCESS)
+            {
+              com_err(whoami, 0, "Unable to update list %s in directory : %s",
+                      av[L_NAME], ldap_err2string(rc));
+              callback_rc = rc;
+              return(rc);
+            }
+        }
+    }
+
+  ProcessGroupSecurity((LDAP *)call_args[0], call_args[1], av[L_NAME], 
+                       atoi(av[L_HIDDEN]),  av[L_ACE_TYPE], av[L_ACE_NAME]);
+
+  return(LDAP_SUCCESS);
+}
+
+int ProcessGroupSecurity(LDAP *ldap_handle, char *dn_path, 
+			 char *TargetGroupName, int HiddenGroup, 
+			 char *AceType, char *AceName)
+{
+  char          filter_exp[1024];
+  char          *attr_array[5];
+  char          search_path[512];
+  char          root_ou[128];
+  char          TemplateDn[512];
+  char          TemplateSamName[128];
+  char          TargetDn[512];
+  char          TargetSamName[128];
+  char          AceSamAccountName[128];
+  char          AceDn[256];
+  unsigned char AceSid[128];
+  unsigned char UserTemplateSid[128];
+  char          acBERBuf[N_SD_BER_BYTES];
+  char          GroupSecurityTemplate[256];
+  char          hide_addres_lists[256];
+  char          address_book[256];
+  char          *hide_address_lists_v[] = {NULL, NULL};
+  char          *address_book_v[] = {NULL, NULL};
+  char          *owner_v[] = {NULL, NULL};
+  int           AceSidCount;
+  int           UserTemplateSidCount;
+  int           group_count;
+  int           n;
+  int           i;
+  int           rc;
+  int           nVal;
+  ULONG         dwInfo;
+  int           array_count = 0;
+  LDAPMod       *mods[20];
+  LK_ENTRY      *group_base;
+  LDAP_BERVAL   **ppsValues;
+  LDAPControl sControl = {"1.2.840.113556.1.4.801",
+                          { N_SD_BER_BYTES, acBERBuf },
+                          TRUE
+                         };
+  LDAPControl *apsServerControls[] = {&sControl, NULL};
+  LDAPMessage *psMsg;
+
+  dwInfo = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | 
+    DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
+  BEREncodeSecurityBits(dwInfo, acBERBuf);
+
+  sprintf(search_path, "%s,%s", group_ou_root, dn_path);
+  sprintf(filter_exp, "(sAMAccountName=%s%s)", TargetGroupName, group_suffix);
+  attr_array[0] = "sAMAccountName";
+  attr_array[1] = NULL;
+  group_count = 0;
+  group_base = NULL;
+
+  if ((rc = linklist_build(ldap_handle, search_path, filter_exp, attr_array, 
+			   &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE) != 0))
+    return(1);
+
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      return(1);
+    }
+
+  strcpy(TargetDn, group_base->dn);
+  strcpy(TargetSamName, group_base->value);
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+
+  UserTemplateSidCount = 0;
+  memset(UserTemplateSid, '\0', sizeof(UserTemplateSid));
+  memset(AceSamAccountName, '\0', sizeof(AceSamAccountName));
+  memset(AceSid, '\0', sizeof(AceSid));
+  AceSidCount = 0;
+  group_base = NULL;
+  group_count = 0;
+
+  if (strlen(AceName) != 0)
+    {
+      if (!strcmp(AceType, "LIST"))
+        {
+          sprintf(AceSamAccountName, "%s%s", AceName, group_suffix);
+          strcpy(root_ou, group_ou_root);
+        }
+      else if (!strcmp(AceType, "USER"))
+        {
+          sprintf(AceSamAccountName, "%s", AceName);
+          strcpy(root_ou, user_ou);
+        }
+
+      if (ActiveDirectory)
+	{
+	  if (strlen(AceSamAccountName) != 0)
+	    {
+	      sprintf(search_path, "%s", dn_path);
+	      sprintf(filter_exp, "(sAMAccountName=%s)", AceSamAccountName);
+	      attr_array[0] = "objectSid";
+	      attr_array[1] = NULL;
+	      group_count = 0;
+	      group_base = NULL;
+	      
+	      if ((rc = linklist_build(ldap_handle, search_path, filter_exp, 
+				       attr_array, &group_base, &group_count, 
+				       LDAP_SCOPE_SUBTREE) != 0))
+		return(1);
+	      if (group_count == 1)
+		{
+		  strcpy(AceDn, group_base->dn);
+		  AceSidCount = group_base->length;
+		  memcpy(AceSid, group_base->value, AceSidCount);
+		}
+	      linklist_free(group_base);
+	      group_base = NULL;
+	      group_count = 0;
+	    }
+	}
+      else
+	{
+	  if (strlen(AceSamAccountName) != 0)
+	    {
+	      sprintf(search_path, "%s", dn_path);
+	      sprintf(filter_exp, "(sAMAccountName=%s)", AceSamAccountName);
+	      attr_array[0] = "samAccountName";
+	      attr_array[1] = NULL;
+	      group_count = 0;
+	      group_base = NULL;
+	      
+	      if ((rc = linklist_build(ldap_handle, search_path, filter_exp, 
+				       attr_array, &group_base, &group_count, 
+				       LDAP_SCOPE_SUBTREE) != 0))
+		return(1);
+	      if (group_count == 1)
+		{
+		  strcpy(AceDn, group_base->dn);
+		}
+	      linklist_free(group_base);
+	      group_base = NULL;
+	      group_count = 0;
+	    }
+	}
+    }
+
+  if (!ActiveDirectory) 
+    {
+      if (strlen(AceDn) != 0) 
+	{
+	  owner_v[0] = strdup(AceDn);
+	  n = 0;
+	  ADD_ATTR("owner", owner_v, LDAP_MOD_REPLACE);
+
+	  mods[n] = NULL;
+
+	  rc = ldap_modify_s(ldap_handle, TargetDn, mods);
+	  
+	  for (i = 0; i < n; i++)
+	    free(mods[i]);
+
+	  if (rc != LDAP_SUCCESS)
+	    com_err(whoami, 0, "Unable to set owner for group %s : %s",
+              TargetGroupName, ldap_err2string(rc));
+	}
+
+      return(rc);
+    }
+  
+  if (AceSidCount == 0)
+    {
+      com_err(whoami, 0, "Group %s: Administrator: %s, Type: %s - does not "
+	      "have a directory SID.", TargetGroupName, AceName, AceType);
+      com_err(whoami, 0, "   Non-admin security group template will be used.");
+    }
+  else
+    {
+      sprintf(search_path, "%s,%s", security_template_ou, dn_path);
+      sprintf(filter_exp, "(sAMAccountName=%s)", "UserTemplate.u");
+      attr_array[0] = "objectSid";
+      attr_array[1] = NULL;
+
+      group_count = 0;
+      group_base = NULL;
+
+      if ((rc = linklist_build(ldap_handle, search_path, filter_exp, 
+			       attr_array, &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE) != 0))
+        return(1);
+
+      if ((rc != 0) || (group_count != 1))
+        {
+          com_err(whoami, 0, "Unable to process user security template: %s", 
+		  "UserTemplate");
+          AceSidCount = 0;
+        }
+      else
+        {
+          UserTemplateSidCount = group_base->length;
+          memcpy(UserTemplateSid, group_base->value, UserTemplateSidCount);
+        }
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+    }
+
+  if (HiddenGroup)
+    {
+      if (AceSidCount == 0)
+        {
+          strcpy(GroupSecurityTemplate, HIDDEN_GROUP);
+          sprintf(filter_exp, "(sAMAccountName=%s)", HIDDEN_GROUP);
+        }
+      else
+        {
+          strcpy(GroupSecurityTemplate, HIDDEN_GROUP_WITH_ADMIN);
+          sprintf(filter_exp, "(sAMAccountName=%s)", HIDDEN_GROUP_WITH_ADMIN);
+        }
+    }
+  else
+    {
+      if (AceSidCount == 0)
+        {
+          strcpy(GroupSecurityTemplate, NOT_HIDDEN_GROUP);
+          sprintf(filter_exp, "(sAMAccountName=%s)", NOT_HIDDEN_GROUP);
+        }
+      else
+        {
+          strcpy(GroupSecurityTemplate, NOT_HIDDEN_GROUP_WITH_ADMIN);
+          sprintf(filter_exp, "(sAMAccountName=%s)", 
+		  NOT_HIDDEN_GROUP_WITH_ADMIN);
+        }
+    }
+
+  sprintf(search_path, "%s,%s", security_template_ou, dn_path);
+  attr_array[0] = "sAMAccountName";
+  attr_array[1] = NULL;
+  group_count = 0;
+  group_base = NULL;
+
+  if ((rc = linklist_build(ldap_handle, search_path, filter_exp, attr_array, 
+			   &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE) != 0))
+    return(1);
+
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      com_err(whoami, 0, "Unable to process group security template: %s - "
+	      "security not set", GroupSecurityTemplate);
+      return(1);
+    }
+
+  strcpy(TemplateDn, group_base->dn);
+  strcpy(TemplateSamName, group_base->value);
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+  
+  sprintf(filter_exp, "(sAMAccountName=%s)", TemplateSamName);
+  rc = ldap_search_ext_s(ldap_handle,
+                         TemplateDn,
+                         LDAP_SCOPE_SUBTREE,
+                         filter_exp,
+                         NULL,
+                         0,
+                         apsServerControls,
+                         NULL,
+                         NULL,
+                         0,
+                         &psMsg);
+
+  if ((psMsg = ldap_first_entry(ldap_handle, psMsg)) == NULL)
+    {
+      com_err(whoami, 0, "Unable to find group security template: %s - "
+	      "security not set", GroupSecurityTemplate);
+      return(1);
+    }
+
+  ppsValues = ldap_get_values_len(ldap_handle, psMsg, "ntSecurityDescriptor");
+
+  if (ppsValues == NULL)
+    {
+      com_err(whoami, 0, "Unable to find group security descriptor for group "
+	      "%s - security not set", GroupSecurityTemplate);
+      return(1);
+    }
+  
+  if (AceSidCount != 0)
+    {
+      for (nVal = 0; ppsValues[nVal] != NULL; nVal++)
+        {
+          for (i = 0; 
+	       i < (int)(ppsValues[nVal]->bv_len - UserTemplateSidCount); i++)
+            {
+              if (!memcmp(&ppsValues[nVal]->bv_val[i], UserTemplateSid, 
+			  UserTemplateSidCount))
+                {
+                  memcpy(&ppsValues[nVal]->bv_val[i], AceSid, AceSidCount);
+                  break;
+                }
+            }
+        }
+    }
+
+  n = 0;
+  ADD_ATTR("ntSecurityDescriptor", (char **)ppsValues, 
+	   LDAP_MOD_REPLACE | LDAP_MOD_BVALUES);
+
+  if (Exchange)
+    {
+      if(HiddenGroup) 
+	{
+	  hide_address_lists_v[0] = "TRUE";
+	  address_book_v[0] = NULL;
+	  ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v, 
+		   LDAP_MOD_REPLACE);
+	  ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
+	} else {
+	  hide_address_lists_v[0] = NULL;
+	  ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v, 
+		   LDAP_MOD_REPLACE);
+	}
+    }
+
+  mods[n] = NULL;
+
+  rc = ldap_modify_s(ldap_handle, TargetDn, mods);
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  ldap_value_free_len(ppsValues);
+  ldap_msgfree(psMsg);
+
+  if (rc != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to set security settings for group %s : %s",
+              TargetGroupName, ldap_err2string(rc));
+
+      if (AceSidCount != 0)
+        {
+          com_err(whoami, 0, 
+		  "Trying to set security for group %s without admin.",
+                  TargetGroupName);
+
+          if (rc = ProcessGroupSecurity(ldap_handle, dn_path, TargetGroupName, 
+                                        HiddenGroup, "", ""))
+            {
+              com_err(whoami, 0, "Unable to set security for group %s.",
+                      TargetGroupName);
+              return(rc);
+            }
+        }
+      return(rc);
+    }
+
+  return(rc);
+}
+
+int group_delete(LDAP *ldap_handle, char *dn_path, char *group_name, 
+                 char *group_membership, char *MoiraId)
+{
+  LK_ENTRY  *group_base;
+  char      temp[512];
+  char      filter[128];
+  int       group_count;
+  int       rc;
+
+  if (!check_string(group_name))
+    {
+      com_err(whoami, 0, 
+	      "Unable to process invalid LDAP list name %s", group_name);
+      return(AD_INVALID_NAME);
+    }
+
+  memset(filter, '\0', sizeof(filter));
+  group_count = 0;
+  group_base = NULL;
+  sprintf(temp, "%s,%s", group_ou_root, dn_path);
+
+  if (rc = ad_get_group(ldap_handle, temp, group_name, 
+                        group_membership, MoiraId, 
+                        "samAccountName", &group_base, 
+                        &group_count, filter))
+    return(rc);
+
+  if (group_count == 1)
+    {
+      if ((rc = ldap_delete_s(ldap_handle, group_base->dn)) != LDAP_SUCCESS)
+        {
+          linklist_free(group_base);
+          com_err(whoami, 0, "Unable to delete list %s from directory : %s",
+                  group_name, ldap_err2string(rc));
+          return(rc);
+        }
+      linklist_free(group_base);
+    }
+  else
+    {
+      linklist_free(group_base);
+      com_err(whoami, 0, "Unable to find list %s in directory.", group_name);
+      return(AD_NO_GROUPS_FOUND);
+    }
+  
+  return(0);
+}
+
+int BEREncodeSecurityBits(ULONG uBits, char *pBuffer)
+{
+    *pBuffer++ = 0x30;
+    *pBuffer++ = 0x03;
+    *pBuffer++ = 0x02;
+    *pBuffer++ = 0x00;
+    return(N_SD_BER_BYTES);
+}
+
+int process_lists(int ac, char **av, void *ptr)
+{
+  int   rc;
+  int   security_flag;
+  char  group_ou[256];
+  char  group_membership[2];
+  char  **call_args;
+
+  call_args = ptr;
+
+  security_flag = 0;
+  memset(group_ou, '\0', sizeof(group_ou));
+  memset(group_membership, '\0', sizeof(group_membership));
+  get_group_membership(group_membership, group_ou, &security_flag, av);
+  rc = populate_group((LDAP *)call_args[0], (char *)call_args[1], 
+		      av[L_NAME], group_ou, group_membership, 
+		      security_flag, "");
+
+  return(0);
+}
+
+int member_list_build(int ac, char **av, void *ptr)
+{
+  LK_ENTRY  *linklist;
+  char      temp[1024];
+  char      **call_args;
+  char      *s;
+  call_args = ptr;
+
+  strcpy(temp, av[ACE_NAME]);
+  StringTrim(temp);
+  
+  if (!check_string(temp))
+    return(0);
+
+  if (!strcmp(av[ACE_TYPE], "USER"))
+    {
+      if (!((int)call_args[3] & MOIRA_USERS))
+        return(0);
+    }
+  else if (!strcmp(av[ACE_TYPE], "STRING"))
+    {
+      if (Exchange)
+	{
+	  if((s = strchr(temp, '@')) == (char *) NULL) 
+	    {
+	      strcat(temp, "@mit.edu");
+	    }
+	  
+	  if(!strncasecmp(&temp[strlen(temp) - 6], ".LOCAL", 6))
+	    {
+	      s = strrchr(temp, '.');
+	      *s = '\0';
+	      strcat(s, ".mit.edu");
+	    }
+	}
+
+      if (!((int)call_args[3] & MOIRA_STRINGS))
+        return(0);
+	
+      if (contact_create((LDAP *)call_args[0], call_args[1], temp, contact_ou))
+        return(0);
+    }
+  else if (!strcmp(av[ACE_TYPE], "LIST"))
+    {
+      if (!((int)call_args[3] & MOIRA_LISTS))
+        return(0);
+    }
+  else if (!strcmp(av[ACE_TYPE], "KERBEROS"))
+    {
+      if (!((int)call_args[3] & MOIRA_KERBEROS))
+        return(0);
+
+      if (contact_create((LDAP *)call_args[0], call_args[1], temp, 
+			 kerberos_ou))
+        return(0);
+
+    }
+  else if (!strcmp(av[ACE_TYPE], "MACHINE"))
+    {
+      if (!((int)call_args[3] & MOIRA_MACHINE))
+	return(0);
+    }
+  else
+    return(0);
+
+  linklist = member_base;
+
+  while (linklist)
+    {
+    if (!strcasecmp(temp, linklist->member) &&
+	!strcasecmp(av[ACE_TYPE], linklist->type))
+      return(0);
+
+    linklist = linklist->next;
+    }
+
+  linklist = calloc(1, sizeof(LK_ENTRY));
+  linklist->op = 1;
+  linklist->dn = NULL;
+  linklist->list = calloc(1, strlen(call_args[2]) + 1);
+  strcpy(linklist->list, call_args[2]);
+  linklist->type = calloc(1, strlen(av[ACE_TYPE]) + 1);
+  strcpy(linklist->type, av[ACE_TYPE]);
+  linklist->member = calloc(1, strlen(temp) + 1);
+  strcpy(linklist->member, temp);
+  linklist->next = member_base;
+  member_base = linklist;
+
+  return(0);
+}
+
+int member_remove(LDAP *ldap_handle, char *dn_path, char *group_name, 
+                  char *group_ou, char *group_membership, char *user_name,
+                  char *UserOu, char *MoiraId)
+{
+  char        distinguished_name[1024];
+  char        *modvalues[2];
+  char        temp[256];
+  char        filter[128];
+  char        *attr_array[3];
+  int         group_count;
+  int         i;
+  int         n;
+  LDAPMod     *mods[20];
+  LK_ENTRY    *group_base;
+  ULONG       rc;
+  char        *s;
+
+  if (!check_string(group_name))
+    return(AD_INVALID_NAME);
+
+  memset(filter, '\0', sizeof(filter));
+  group_base = NULL;
+  group_count = 0;
+
+  if (rc = ad_get_group(ldap_handle, dn_path, group_name, 
+                        group_membership, MoiraId, 
+                        "samAccountName", &group_base, 
+                        &group_count, filter))
+    return(rc);
+
+  if (group_count != 1)
+    {
+      com_err(whoami, 0, "Unable to find list %s in directory",
+              group_name);
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+      goto cleanup;
+    }
+
+  strcpy(distinguished_name, group_base->dn);
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+
+  if(ActiveDirectory)
+    {
+      sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
+    }
+  else
+    {
+      if(!strcmp(UserOu, user_ou))
+	sprintf(temp, "uid=%s,%s,%s", user_name, UserOu, dn_path);
+      else
+	sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
+    }
+
+  modvalues[0] = temp;
+  modvalues[1] = NULL;
+
+  n = 0;
+  ADD_ATTR("member", modvalues, LDAP_MOD_DELETE);
+  mods[n] = NULL;
+  rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  if (rc == LDAP_UNWILLING_TO_PERFORM)
+    rc = LDAP_SUCCESS;
+
+  if (rc != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to modify list %s members : %s",
+              group_name, ldap_err2string(rc));
+      goto cleanup;
+    }
+
+  if ((!strcmp(UserOu, contact_ou)) || (!strcmp(UserOu, kerberos_ou))) 
+    {
+      if (Exchange)
+	{
+	  if(!strcmp(UserOu, contact_ou) && 
+	     ((s = strstr(user_name, "@mit.edu")) != (char *) NULL))
+	    {
+	      memset(temp, '\0', sizeof(temp));
+	      strcpy(temp, user_name);
+	      s = strchr(temp, '@');
+	      *s = '\0';
+	      
+	      sprintf(filter, "(&(objectClass=user)(mailNickName=%s))", temp);
+	  
+	      if ((rc = linklist_build(ldap_handle, dn_path, filter, NULL,
+				       &group_base, &group_count, 
+				       LDAP_SCOPE_SUBTREE) != 0))
+		return(rc);	  
+	      
+	      if(group_count)
+		goto cleanup;
+	      
+	      linklist_free(group_base);
+	      group_base = NULL;
+	      group_count = 0;
+	    }
+	  
+	  sprintf(filter, "(distinguishedName=%s)", temp);
+	  attr_array[0] = "memberOf";
+	  attr_array[1] = NULL;
+	  
+	  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
+				   &group_base, &group_count, 
+				   LDAP_SCOPE_SUBTREE) != 0))
+	    return(rc);
+	  
+
+	  if(!group_count) 
+	    {
+	      com_err(whoami, 0, "Removing unreferenced object %s", temp);
+	  
+	      if ((rc = ldap_delete_s(ldap_handle, temp)) != 0) 
+		return(rc);
+	    }
+	}
+    }
+
+ cleanup:
+  return(rc);
+}
+
+int member_add(LDAP *ldap_handle, char *dn_path, char *group_name, 
+               char *group_ou, char *group_membership, char *user_name, 
+               char *UserOu, char *MoiraId)
+{
+  char        distinguished_name[1024];
+  char        *modvalues[2];
+  char        temp[256];
+  char        filter[128];
+  int         group_count;
+  int         n;
+  int         i;
+  LDAPMod     *mods[20];
+  LK_ENTRY    *group_base;
+  ULONG       rc;
+
+  if (!check_string(group_name))
+    return(AD_INVALID_NAME);
+
+  rc = 0;
+  memset(filter, '\0', sizeof(filter));
+  group_base = NULL;
+  group_count = 0;
+
+  if (rc = ad_get_group(ldap_handle, dn_path, group_name, 
+                        group_membership, MoiraId, 
+                        "samAccountName", &group_base, 
+                        &group_count, filter))
+    return(rc);
+
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+      com_err(whoami, 0, "Unable to find list %s %d in directory",
+              group_name, group_count);
+      return(AD_MULTIPLE_GROUPS_FOUND);
+    }
+
+  strcpy(distinguished_name, group_base->dn);
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+
+  if(ActiveDirectory)
+    {
+      sprintf(temp, "CN=%s,%s,%s", user_name, UserOu, dn_path);
+    }
+  else 
+    {
+      if(!strcmp(UserOu, user_ou))
+	sprintf(temp, "uid=%s,%s,%s", user_name, UserOu, dn_path);
+      else
+	sprintf(temp, "cn=%s,%s,%s", user_name, UserOu, dn_path);
+    }
+
+  modvalues[0] = temp;
+  modvalues[1] = NULL;
+
+  n = 0;
+  ADD_ATTR("member", modvalues, LDAP_MOD_ADD);
+  mods[n] = NULL;
+  rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+
+  if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
+    rc = LDAP_SUCCESS;
+
+  if ((!strcmp(UserOu, contact_ou)) || (!strcmp(UserOu, kerberos_ou)))
+    {
+      if (rc == LDAP_UNWILLING_TO_PERFORM)
+        rc = LDAP_SUCCESS;
+    }
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  if (rc != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to add %s to list %s as a member : %s",
+              user_name, group_name, ldap_err2string(rc));
+    }
+
+  return(rc);
+}
+
+int contact_remove_email(LDAP *ld, char *bind_path,
+			 LK_ENTRY **linklist_base, int linklist_current)
+{
+  LK_ENTRY  *gPtr;
+  int       rc;
+  char      *mail_v[] = {NULL, NULL};
+  LDAPMod   *mods[20];
+  int n;
+  int i;
+
+  mail_v[0] = NULL;
+
+  n = 0;
+  ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("mailNickName", mail_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("proxyAddresses", mail_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("targetAddress", mail_v, LDAP_MOD_REPLACE);
+  mods[n] = NULL;
+
+  gPtr = (*linklist_base);
+  
+  while(gPtr) {
+    rc = ldap_modify_s(ld, gPtr->dn, mods);
+    
+    if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
+      {
+	com_err(whoami, 0, "Unable to modify contact %s in directory : %s",
+		gPtr->dn, ldap_err2string(rc));
+	return(rc);
+      }
+
+    gPtr = gPtr->next;
+  }
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+  
+    return(rc);
+}
+
+int contact_create(LDAP *ld, char *bind_path, char *user, char *group_ou)
+{
+  LDAPMod *mods[20];
+  LK_ENTRY  *group_base;
+  int  group_count;
+  char new_dn[256];
+  char cn_user_name[256];
+  char contact_name[256];
+  char mail_nickname[256];
+  char proxy_address_internal[256];
+  char proxy_address_external[256];
+  char target_address[256];
+  char internal_contact_name[256];
+  char filter[128];
+  char mail[256];
+  char principal[256];
+  char mit_address_book[256];
+  char default_address_book[256];
+  char contact_address_book[256];
+  char uid[256];
+  char *email_v[] = {NULL, NULL};
+  char *cn_v[] = {NULL, NULL};
+  char *contact_v[] = {NULL, NULL};
+  char *uid_v[] = {NULL, NULL};
+  char *mail_nickname_v[] = {NULL, NULL};
+  char *proxy_address_internal_v[] = {NULL, NULL};
+  char *proxy_address_external_v[] = {NULL, NULL};
+  char *target_address_v[] = {NULL, NULL};
+  char *mit_address_book_v[] = {NULL, NULL};
+  char *default_address_book_v[] = {NULL, NULL};
+  char *contact_address_book_v[] = {NULL, NULL};
+  char *hide_address_lists_v[] = {NULL, NULL};
+  char *attr_array[3];
+  char *objectClass_v[] = {"top", "person", 
+                           "organizationalPerson", 
+                           "contact", NULL};
+  char *objectClass_ldap_v[] = {"top", "person", "microsoftComTop", 
+				"inetOrgPerson", "organizationalPerson",
+				"contact", "mailRecipient", "eduPerson",
+				NULL};
+  char *name_v[] = {NULL, NULL};
+  char *desc_v[] = {NULL, NULL};
+  char *s;
+  int  n;
+  int  rc;
+  int  i;
+  char temp[256];
+  char *c;
+  char *mail_routing_v[] = {NULL, NULL};
+  char *principal_v[] = {NULL, NULL};
+
+  if (!check_string(user))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP name %s", user);
+      return(AD_INVALID_NAME);
+    }
+
+  strcpy(mail, user);
+  strcpy(contact_name, mail);
+  strcpy(internal_contact_name, mail);
+  
+  if((s = strchr(internal_contact_name, '@')) != NULL) {
+    *s = '?';
+  }
+
+  sprintf(cn_user_name,"CN=%s,%s,%s", escape_string(contact_name), group_ou, 
+	  bind_path);
+
+  sprintf(target_address, "SMTP:%s", contact_name);
+  sprintf(proxy_address_external, "SMTP:%s", contact_name);
+  sprintf(mail_nickname, "%s", internal_contact_name);
+ 
+  cn_v[0] = cn_user_name;
+  contact_v[0] = contact_name;
+  uid_v[0] = uid;
+  name_v[0] = user;
+  desc_v[0] = "Auto account created by Moira";
+  email_v[0] = mail;
+  proxy_address_internal_v[0] = proxy_address_internal;
+  proxy_address_external_v[0] = proxy_address_external;
+  mail_nickname_v[0] = mail_nickname;
+  target_address_v[0] = target_address;
+  mit_address_book_v[0] = mit_address_book;
+  default_address_book_v[0] = default_address_book;
+  contact_address_book_v[0] = contact_address_book;
+  strcpy(new_dn, cn_user_name);
+  n = 0;
+
+  ADD_ATTR("cn", contact_v, LDAP_MOD_ADD);
+
+  if(!ActiveDirectory)
+    {
+      if(!strcmp(group_ou, contact_ou))
+	sprintf(uid, "%s%s", contact_name, "_strings");
+      
+      if(!strcmp(group_ou, kerberos_ou))
+	sprintf(uid, "%s%s", contact_name, "_kerberos");
+
+      uid_v[0] = uid;
+
+      ADD_ATTR("sn", contact_v, LDAP_MOD_ADD);
+      ADD_ATTR("uid", uid_v, LDAP_MOD_ADD);
+    }
+
+  if(ActiveDirectory)
+    {
+      ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
+    }
+  else
+    {
+      ADD_ATTR("objectClass", objectClass_ldap_v, LDAP_MOD_ADD);
+    }
+
+  ADD_ATTR("name", name_v, LDAP_MOD_ADD);
+  ADD_ATTR("displayName", name_v, LDAP_MOD_ADD);
+  ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
+
+  if (Exchange)
+    {
+      if (!strcmp(group_ou, contact_ou) && email_isvalid(mail))
+	{
+	  group_count = 0;
+	  group_base = NULL;
+	  
+	  sprintf(filter, "(&(objectClass=user)(cn=%s))", mail);
+	  attr_array[0] = "cn";
+	  attr_array[1] = NULL;
+
+	  if ((rc = linklist_build(ld, bind_path, filter, attr_array,
+				   &group_base, &group_count, 
+				   LDAP_SCOPE_SUBTREE)) != 0) 
+	    {
+	      com_err(whoami, 0, "Unable to process contact %s : %s", 
+		      user, ldap_err2string(rc));
+	      return(rc);
+	    }
+      
+	  if (group_count) 
+	    {
+	      com_err(whoami, 0, "Object already exists with name %s",
+		      user);
+	      return(1);
+	    }
+
+	  linklist_free(group_base);
+	  group_base = NULL;
+	  group_count = 0;
+      
+	  sprintf(filter, "(&(objectClass=group)(cn=%s))", mail);
+	  attr_array[0] = "cn";
+	  attr_array[1] = NULL;
+
+	  if ((rc = linklist_build(ld, bind_path, filter, attr_array,
+				   &group_base, &group_count, 
+				   LDAP_SCOPE_SUBTREE)) != 0) 
+	    {
+	      com_err(whoami, 0, "Unable to process contact %s : %s", 
+		      user, ldap_err2string(rc));
+	      return(rc);
+	    }
+	  
+	  if (group_count) 
+	    {
+	      com_err(whoami, 0, "Object already exists with name %s",
+		      user);
+	      return(1);
+	    }
+  
+	  linklist_free(group_base);
+	  group_count = 0;
+	  group_base = NULL;
+	  
+	  sprintf(filter, "(&(objectClass=user)(mail=%s))", mail);
+	  attr_array[0] = "cn";
+	  attr_array[1] = NULL;
+
+	  if ((rc = linklist_build(ld, bind_path, filter, attr_array,
+				   &group_base, &group_count, 
+				   LDAP_SCOPE_SUBTREE)) != 0) 
+	    {
+	      com_err(whoami, 0, "Unable to process contact %s : %s", 
+		      user, ldap_err2string(rc));
+	      return(rc);
+	    }
+	  
+	  if (group_count) 
+	    {
+	      com_err(whoami, 0, "Object already exists with name %s",
+		      user);
+	      return(1);
+	    }
+
+	  linklist_free(group_base);
+	  group_base = NULL;
+	  group_count = 0;
+
+	  sprintf(filter, "(&(objectClass=group)(mail=%s))", mail);
+	  attr_array[0] = "cn";
+	  attr_array[1] = NULL;
+
+	  if ((rc = linklist_build(ld, bind_path, filter, attr_array,
+				   &group_base, &group_count, 
+				   LDAP_SCOPE_SUBTREE)) != 0) 
+	    {
+	      com_err(whoami, 0, "Unable to process contact %s : %s", 
+		      user, ldap_err2string(rc));
+	      return(rc);
+	    }
+      
+	  if (group_count) 
+	    {
+	      com_err(whoami, 0, "Object already exists with name %s",
+		      user);
+	      return(1);
+	    }
+	  
+	  linklist_free(group_base);
+	  group_base = NULL;
+	  group_count = 0;
+	  
+	  ADD_ATTR("mail", email_v, LDAP_MOD_ADD);
+	  ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_ADD);
+	  ADD_ATTR("proxyAddresses", proxy_address_external_v, LDAP_MOD_ADD);
+	  ADD_ATTR("targetAddress", target_address_v, LDAP_MOD_ADD);
+	  
+	  hide_address_lists_v[0] = "TRUE";
+	  ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
+		   LDAP_MOD_ADD);
+	}
+    }
+
+  if(!ActiveDirectory) 
+    {
+      if((c = strchr(mail, '@')) == NULL)
+	  sprintf(temp, "%s@mit.edu", mail);
+      else
+	  sprintf(temp, "%s", mail);
+
+      mail_routing_v[0] = temp;
+      email_v[0] = temp;
+      principal_v[0] = principal;
+
+      if(!strcmp(group_ou, contact_ou))
+	{
+	  ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
+	  ADD_ATTR("eduPersonPrincipalName", mail_routing_v, LDAP_MOD_ADD);
+	}
+    }
+
+  mods[n] = NULL;
+
+  rc = ldap_add_ext_s(ld, new_dn, mods, NULL, NULL);
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+  
+  if (Exchange)
+    {
+      if ((rc != LDAP_SUCCESS) && (rc == LDAP_ALREADY_EXISTS) &&
+	  !strcmp(group_ou, contact_ou) && email_isvalid(mail))
+	{
+	  n = 0;
+	  
+	  ADD_ATTR("mail", email_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("proxyAddresses", proxy_address_external_v, 
+		   LDAP_MOD_REPLACE);
+	  ADD_ATTR("targetAddress", target_address_v, LDAP_MOD_REPLACE);
+
+	  hide_address_lists_v[0] = "TRUE";
+	  ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
+		   LDAP_MOD_REPLACE);
+    
+	  mods[n] = NULL;
+	  rc = ldap_modify_s(ld, new_dn, mods);
+      
+	  if (rc) 
+	    {
+	      com_err(whoami, 0, "Unable to update contact %s", mail);
+	    }
+      
+	  for (i = 0; i < n; i++)
+	    free(mods[i]);
+	}
+    }
+
+  if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
+    {
+      com_err(whoami, 0, "Unable to create contact %s : %s",
+              user, ldap_err2string(rc));
+      return(rc);
+    }
+
+  return(0);
+}
+
+int user_update(LDAP *ldap_handle, char *dn_path, char *user_name,
+                char *Uid, char *MitId, char *MoiraId, int State,
+                char *WinHomeDir, char *WinProfileDir, char *first,
+		char *middle, char *last, char *shell, char *class)
+{
+  LDAPMod   *mods[20];
+  LK_ENTRY  *group_base;
+  int  group_count;
+  char distinguished_name[512];
+  char displayName[256];
+  char *mitMoiraId_v[] = {NULL, NULL};
+  char *mitMoiraClass_v[] = {NULL, NULL};
+  char *mitMoiraStatus_v[] = {NULL, NULL};
+  char *uid_v[] = {NULL, NULL};
+  char *mitid_v[] = {NULL, NULL};
+  char *homedir_v[] = {NULL, NULL};
+  char *winProfile_v[] = {NULL, NULL};
+  char *drives_v[] = {NULL, NULL};
+  char *userAccountControl_v[] = {NULL, NULL};
+  char *alt_recipient_v[] = {NULL, NULL};
+  char *hide_address_lists_v[] = {NULL, NULL};
+  char *mail_v[] = {NULL, NULL};
+  char *gid_v[] = {NULL, NULL};
+  char *loginshell_v[] = {NULL, NULL};
+  char *principal_v[] = {NULL, NULL};
+  char userAccountControlStr[80];
+  int  n;
+  int  rc;
+  int  i;
+  int  OldUseSFU30;
+  u_int userAccountControl = UF_NORMAL_ACCOUNT | UF_DONT_EXPIRE_PASSWD | 
+    UF_PASSWD_CANT_CHANGE;
+  char filter[128];
+  char *attr_array[3];
+  char temp[1024];
+  char mail[256];
+  char contact_mail[256];
+  char filter_exp[1024];
+  char search_path[512];
+  char TemplateDn[512];
+  char TemplateSamName[128];
+  char alt_recipient[256];
+  char principal[256];
+  char status[256];
+  char acBERBuf[N_SD_BER_BYTES];
+  LDAPControl sControl = {"1.2.840.113556.1.4.801",
+                          { N_SD_BER_BYTES, acBERBuf },
+                          TRUE};
+  LDAPControl *apsServerControls[] = {&sControl, NULL};
+  LDAPMessage *psMsg;
+  LDAP_BERVAL   **ppsValues;
+  ULONG dwInfo;
+  char *argv[3];
+  char *homeMDB;
+  char *homeServerName;
+  char *save_argv[7];
+  char search_string[256];
+  char *p, *q;
+  char *mail_routing_v[] = {NULL, NULL};
+  char *c;
+
+  dwInfo = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
+    DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
+  BEREncodeSecurityBits(dwInfo, acBERBuf);
+
+  if (!check_string(user_name))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP user name %s", 
+	      user_name);
+      return(AD_INVALID_NAME);
+    }
+  
+  memset(contact_mail, '\0', sizeof(contact_mail));
+  sprintf(contact_mail, "%s@mit.edu", user_name);
+  memset(mail, '\0', sizeof(mail));
+  sprintf(mail, "%s@%s", user_name, lowercase(ldap_domain));
+  memset(alt_recipient, '\0', sizeof(alt_recipient));
+  sprintf(alt_recipient, "cn=%s@mit.edu,%s,%s", user_name, contact_ou, 
+	  dn_path);
+  sprintf(search_string, "@%s", uppercase(ldap_domain));
+
+  if (Exchange)
+    {
+      if(contact_create(ldap_handle, dn_path, contact_mail, contact_ou))
+	{
+	  com_err(whoami, 0, "Unable to create user contact %s", contact_mail);
+	}
+    }
+
+  group_count = 0;
+  group_base = NULL;
+
+  memset(displayName, '\0', sizeof(displayName));
+
+  if (strlen(MoiraId) != 0)
+    {
+      if(ActiveDirectory)
+	{
+	  sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
+	}
+      else
+	{
+	  sprintf(filter, 
+		  "(&(objectClass=mitPerson)(mitMoiraId=%s))", MoiraId);
+	}
+
+      attr_array[0] = "cn";
+      attr_array[1] = NULL;
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  user_name, ldap_err2string(rc));
+          return(rc);
+        }
+    }
+
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+      sprintf(filter, "(sAMAccountName=%s)", user_name);
+      attr_array[0] = "cn";
+      attr_array[1] = NULL;
+      sprintf(temp, "%s,%s", user_ou, dn_path);
+      if ((rc = linklist_build(ldap_handle, temp, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  user_name, ldap_err2string(rc));
+          return(rc);
+        }
+    }
+
+  if (group_count != 1)
+    {
+      com_err(whoami, 0, "Unable to find user %s in directory",
+              user_name);
+      linklist_free(group_base);
+      return(AD_NO_USER_FOUND);
+    }
+
+  strcpy(distinguished_name, group_base->dn);
+
+  linklist_free(group_base);
+  group_count = 0;
+
+  if(!ActiveDirectory) 
+    {
+      if (rc = moira_connect())
+	{
+	  critical_alert("Ldap incremental", 
+			 "Error contacting Moira server : %s",
+			 error_message(rc));
+	  return;
+	}
+  
+      argv[0] = user_name;
+      
+      if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
+	{
+	  n = 0;
+	  ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_REPLACE);
+	  mods[n] = NULL;
+	  rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+	  
+	  if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
+	    rc = LDAP_SUCCESS;
+
+	  if(rc)
+	    com_err(whoami, 0, 
+		    "Unable to set the mailRoutingAddress for %s : %s",
+		    user_name, ldap_err2string(rc));
+	  
+	  p = strdup(save_argv[3]);
+	  
+	  if((c = strchr(p, ',')) != NULL) 
+	    {
+	      q = strtok(p, ",");
+	      StringTrim(q);
+
+	      if ((c = strchr(q, '@')) == NULL)
+		sprintf(temp, "%s@mit.edu", q);
+	      else
+		sprintf(temp, "%s", q);
+	      
+	      if(email_isvalid(temp) && State != US_DELETED) 
+		{
+		  mail_routing_v[0]  = temp;
+		  
+		  n = 0;
+		  ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
+		  mods[n] = NULL;
+		  rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+
+		  if (rc == LDAP_ALREADY_EXISTS || 
+		      rc == LDAP_TYPE_OR_VALUE_EXISTS)
+		    rc = LDAP_SUCCESS;
+    
+		  if(rc)
+		    com_err(whoami, 0, 
+			    "Unable to set the mailRoutingAddress for %s : %s",
+			    user_name, ldap_err2string(rc));
+		}
+
+	      while((q = strtok(NULL, ",")) != NULL) {
+		StringTrim(q);
+		
+		if((c = strchr(q, '@')) == NULL) 
+		  sprintf(temp, "%s@mit.edu", q);
+		else
+		  sprintf(temp, "%s", q);
+
+		if(email_isvalid(temp) && State != US_DELETED) 
+		  {
+		    mail_routing_v[0]  = temp;
+		
+		    n = 0;
+		    ADD_ATTR("mailRoutingAddress", mail_routing_v, 
+			     LDAP_MOD_ADD);
+		    mods[n] = NULL;
+		    rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+		    
+		    if (rc == LDAP_ALREADY_EXISTS || 
+			rc == LDAP_TYPE_OR_VALUE_EXISTS)
+		      rc = LDAP_SUCCESS;
+		    
+		    if(rc)
+		      com_err(whoami, 0, 
+			      "Unable to set the mailRoutingAddress for " 
+			      "%s : %s",
+			      user_name, ldap_err2string(rc));
+		  }
+	      }
+	    } else {
+	      StringTrim(p);
+
+	    if((c = strchr(p, '@')) == NULL)
+	      sprintf(temp, "%s@mit.edu", p);
+	    else
+	      sprintf(temp, "%s", p);
+	    
+	    if(email_isvalid(temp) && State != US_DELETED) 
+	      {
+		mail_routing_v[0]  = temp;
+		
+		n = 0;
+		ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
+		mods[n] = NULL;
+		rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+		
+		if (rc == LDAP_ALREADY_EXISTS || 
+		    rc == LDAP_TYPE_OR_VALUE_EXISTS)
+		  rc = LDAP_SUCCESS;
+		
+		if(rc)
+		  com_err(whoami, 0, 
+			  "Unable to set the mailRoutingAddress for %s : %s",
+			  user_name, ldap_err2string(rc));
+	      }
+	    }
+	}
+      moira_disconnect();
+    }
+
+  if ((strlen(MitId) != 0) && (MitId[0] == '9'))
+    rc = attribute_update(ldap_handle, distinguished_name, MitId, 
+			  "employeeID", user_name);
+  else
+    rc = attribute_update(ldap_handle, distinguished_name, "none", 
+			  "employeeID", user_name);
+
+  if(strlen(first)) {
+    strcat(displayName, first);
+  }
+
+  if(strlen(middle)) {
+    if(strlen(first)) 
+      strcat(displayName, " ");
+
+    strcat(displayName, middle);
+  }
+
+  if(strlen(last)) {
+    if(strlen(middle) || strlen(first))
+      strcat(displayName, " ");
+
+    strcat(displayName, last);
+  }
+
+  if(strlen(displayName))
+    rc = attribute_update(ldap_handle, distinguished_name, displayName, 
+			  "displayName", user_name);
+  else
+    rc = attribute_update(ldap_handle, distinguished_name, user_name,
+			  "displayName", user_name);
+
+  if(!ActiveDirectory)
+    {
+      if(strlen(displayName))
+	rc = attribute_update(ldap_handle, distinguished_name, displayName, 
+			      "cn", user_name);
+      else
+	rc = attribute_update(ldap_handle, distinguished_name, user_name,
+			      "cn", user_name);
+    }
+
+  if(!ActiveDirectory)
+    {
+      rc = attribute_update(ldap_handle, distinguished_name, displayName, 
+			    "eduPersonNickname", user_name);
+    }
+
+  if(strlen(first))
+    rc = attribute_update(ldap_handle, distinguished_name, first, 
+			  "givenName", user_name);
+  else
+    rc = attribute_update(ldap_handle, distinguished_name, "",
+			  "givenName", user_name);
+
+  if(strlen(middle) == 1) 
+    rc = attribute_update(ldap_handle, distinguished_name, middle,
+			  "initials", user_name);
+  else 
+    rc = attribute_update(ldap_handle, distinguished_name, "",
+			  "initials", user_name);
+  
+  if(strlen(last))
+    rc = attribute_update(ldap_handle, distinguished_name, last,
+			  "sn", user_name);
+  else 
+    rc = attribute_update(ldap_handle, distinguished_name, "",
+			  "sn", user_name);
+
+  if(ActiveDirectory)
+    {
+      rc = attribute_update(ldap_handle, distinguished_name, Uid, "uid", 
+			    user_name);
+    }
+  else
+    {
+      rc = attribute_update(ldap_handle, distinguished_name, user_name, "uid", 
+			    user_name);
+    }
+    
+  rc = attribute_update(ldap_handle, distinguished_name, MoiraId, 
+			"mitMoiraId", user_name);
+
+  n = 0;
+  uid_v[0] = Uid;
+
+  if(ActiveDirectory)
+    {
+      if (!UseSFU30)
+	{
+	  ADD_ATTR("uidNumber", uid_v, LDAP_MOD_REPLACE);
+	}
+      else
+	{
+	  ADD_ATTR("msSFU30UidNumber", uid_v, LDAP_MOD_REPLACE);
+	}
+    }
+  else
+    {
+      sprintf(principal, "%s@%s", user_name, PRIMARY_REALM);
+      sprintf(status, "%d", State);
+      principal_v[0] = principal;
+      loginshell_v[0] = shell;
+      mitMoiraClass_v[0] = class;
+      mitMoiraStatus_v[0] = status;
+      gid_v[0] = "101";
+      ADD_ATTR("uidNumber", uid_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("gidNumber", gid_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("loginShell", loginshell_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("eduPersonPrincipalName", mail_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("mitMoiraClass", mitMoiraClass_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("mitMoiraStatus", mitMoiraStatus_v, LDAP_MOD_REPLACE);
+    }
+
+  if ((State != US_NO_PASSWD) && (State != US_REGISTERED))
+    {
+      userAccountControl |= UF_ACCOUNTDISABLE;
+
+      if (Exchange)
+	{
+	  hide_address_lists_v[0] = "TRUE";
+	  ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
+		   LDAP_MOD_REPLACE);
+	}
+    }
+  else
+    {
+      if (Exchange)
+	{
+	  hide_address_lists_v[0] = NULL;
+	  ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
+		   LDAP_MOD_REPLACE);
+	}
+    }
+
+  sprintf(userAccountControlStr, "%ld", userAccountControl);
+  userAccountControl_v[0] = userAccountControlStr;
+  ADD_ATTR("userAccountControl", userAccountControl_v, LDAP_MOD_REPLACE);
+
+  if (Exchange)
+    {
+      if (rc = moira_connect())
+	{
+	  critical_alert("Ldap incremental", 
+			 "Error contacting Moira server : %s",
+			 error_message(rc));
+	  return;
+	}
+ 
+      argv[0] = user_name;
+
+      if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
+	{
+	  if(!strcmp(save_argv[1], "EXCHANGE") || 
+	     (strstr(save_argv[3], search_string) != NULL))
+	    {
+	      alt_recipient_v[0] = NULL;
+	      ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_REPLACE);
+
+	      argv[0] = exchange_acl;
+	      argv[1] = "USER";
+	      argv[2] = user_name;
+	      
+	      rc = mr_query("add_member_to_list", 3, argv, NULL, NULL);
+	      
+	      if ((rc) && (rc != MR_EXISTS))
+		{
+		  com_err(whoami, 0, "Unable to add user %s to %s: %s",
+			  user_name, exchange_acl, error_message(rc));
+		}
+	    }
+	  else 
+	    {
+	      alt_recipient_v[0] = alt_recipient;
+	      ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_REPLACE);
+	      
+	      argv[0] = exchange_acl;
+	      argv[1] = "USER";
+	      argv[2] = user_name;
+	      
+	      rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL);
+	      
+	      if ((rc) && (rc != MR_NO_MATCH))
+		{  
+		  com_err(whoami, 0,
+			  "Unable to remove user %s from %s: %s, %d",
+			  user_name, exchange_acl, error_message(rc), rc);
+		}  
+	    }
+	}
+      else
+	{
+	  alt_recipient_v[0] = alt_recipient;
+	  ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_REPLACE);
+	  
+	  argv[0] = exchange_acl;
+	  argv[1] = "USER";
+	  argv[2] = user_name;
+	  
+	  rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL);
+	  
+	  if ((rc) && (rc != MR_NO_MATCH))
+	    {  
+	      com_err(whoami, 0,
+		      "Unable to remove user %s from %s: %s, %d",
+		      user_name, exchange_acl, error_message(rc), rc);
+	    }  
+	}
+      
+      moira_disconnect();
+    }
+  else
+    {
+      mail_v[0] = contact_mail;
+      ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
+
+      if(!ActiveDirectory)
+	{
+	  ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_REPLACE);
+	}
+    }
+
+  n = SetHomeDirectory(ldap_handle, user_name, distinguished_name, WinHomeDir, 
+                       WinProfileDir, homedir_v, winProfile_v,
+                       drives_v, mods, LDAP_MOD_REPLACE, n);
+
+  if(ActiveDirectory)
+    {
+      sprintf(filter_exp, "(sAMAccountName=%s)", "UserTemplate.u");
+      sprintf(search_path, "%s,%s", security_template_ou, dn_path);
+      attr_array[0] = "sAMAccountName";
+      attr_array[1] = NULL;
+      group_count = 0;
+      group_base = NULL;
+    
+      if ((rc = linklist_build(ldap_handle, search_path, filter_exp, 
+			       attr_array,
+			       &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE) != 0))
+	return(1);
+      
+      if (group_count != 1)
+	{
+	  com_err(whoami, 0, "Unable to process user security template: %s - "
+		  "security not set", "UserTemplate.u");
+	  return(1);
+	}
+
+      strcpy(TemplateDn, group_base->dn);
+      strcpy(TemplateSamName, group_base->value);
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+      
+      rc = ldap_search_ext_s(ldap_handle, search_path, LDAP_SCOPE_SUBTREE,
+			     filter_exp, NULL, 0, apsServerControls, NULL,
+			     NULL, 0, &psMsg);
+
+      if ((psMsg = ldap_first_entry(ldap_handle, psMsg)) == NULL)
+	{
+	  com_err(whoami, 0, "Unable to find user security template: %s - "
+		  "security not set", "UserTemplate.u");
+	  return(1);
+	}
+      
+      ppsValues = ldap_get_values_len(ldap_handle, psMsg, 
+				      "ntSecurityDescriptor");
+
+      if (ppsValues == NULL)
+	{
+	  com_err(whoami, 0, "Unable to find user security template: %s - "
+		  "security not set", "UserTemplate.u");
+	  return(1);
+	}
+      
+      ADD_ATTR("ntSecurityDescriptor", (char **)ppsValues,
+	       LDAP_MOD_REPLACE | LDAP_MOD_BVALUES);
+    }
+
+  mods[n] = NULL;
+
+  if ((rc = ldap_modify_s(ldap_handle, distinguished_name, 
+			  mods)) != LDAP_SUCCESS)
+    {
+      OldUseSFU30 = UseSFU30;
+      SwitchSFU(mods, &UseSFU30, n);
+      if (OldUseSFU30 != UseSFU30)
+	rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+      if (rc)
+        {
+	  com_err(whoami, 0, "Unable to modify user data for %s : %s",
+		  user_name, ldap_err2string(rc));
+        }
+    }
+  
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  return(rc);
+}
+
+int user_rename(LDAP *ldap_handle, char *dn_path, char *before_user_name, 
+                char *user_name)
+{
+  LDAPMod *mods[20];
+  char new_dn[256];
+  char old_dn[256];
+  char upn[256];
+  char mail[256];
+  char contact_mail[256];
+  char proxy_address[256];
+  char query_base_dn[256];
+  char temp[256];
+  char *userPrincipalName_v[] = {NULL, NULL};
+  char *altSecurityIdentities_v[] = {NULL, NULL};
+  char *name_v[] = {NULL, NULL};
+  char *samAccountName_v[] = {NULL, NULL};
+  char *mail_v[] = {NULL, NULL};
+  char *mail_nickname_v[] = {NULL, NULL};
+  char *proxy_address_v[] = {NULL, NULL};
+  char *query_base_dn_v[] = {NULL, NULL};
+  char *principal_v[] = {NULL, NULL};
+  char principal[256];
+  int  n;
+  int  rc;
+  int  i;
+
+  if (!check_string(before_user_name))
+    {
+      com_err(whoami, 0, 
+	      "Unable to process invalid LDAP user name %s", before_user_name);
+      return(AD_INVALID_NAME);
+    }
+
+  if (!check_string(user_name))
+    {
+      com_err(whoami, 0, 
+	      "Unable to process invalid LDAP user name %s", user_name);
+      return(AD_INVALID_NAME);
+    }
+
+  strcpy(user_name, user_name);
+ 
+  if(ActiveDirectory)
+    sprintf(old_dn, "cn=%s,%s,%s", before_user_name, user_ou, dn_path);
+  else
+    sprintf(old_dn, "uid=%s,%s,%s", before_user_name, user_ou, dn_path);
+
+  if(ActiveDirectory)
+    sprintf(new_dn, "cn=%s", user_name);
+  else
+    sprintf(new_dn, "uid=%s", user_name);
+
+  sprintf(mail, "%s@%s", user_name, lowercase(ldap_domain));
+  sprintf(contact_mail, "%s@mit.edu", user_name);
+  sprintf(proxy_address, "SMTP:%s@%s", user_name, lowercase(ldap_domain)); 
+  sprintf(principal, "%s@%s", user_name, PRIMARY_REALM);
+
+  if ((rc = ldap_rename_s(ldap_handle, old_dn, new_dn, NULL, TRUE, 
+                           NULL, NULL)) != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to rename user from %s to %s : %s",
+              before_user_name, user_name, ldap_err2string(rc));
+      return(rc);
+    }
+
+  if (Exchange)
+    {
+      sprintf(temp, "cn=%s@mit.edu,%s,%s", before_user_name, contact_ou, 
+	      dn_path);
+
+      if(rc = ldap_delete_s(ldap_handle, temp))
+	{
+	  com_err(whoami, 0, "Unable to delete user contact for %s",
+		  user_name);
+	}
+      
+      if(contact_create(ldap_handle, dn_path, contact_mail, contact_ou))
+	{
+	  com_err(whoami, 0, "Unable to create user contact %s", contact_mail);
+	}
+    }
+
+  name_v[0] = user_name;
+  sprintf(upn, "%s@%s", user_name, ldap_domain);
+  userPrincipalName_v[0] = upn;
+  principal_v[0] = principal;
+  sprintf(temp, "Kerberos:%s@%s", user_name, PRIMARY_REALM);
+  sprintf(query_base_dn, "%s%s", ADDRESS_LIST_PREFIX, dn_path);
+  altSecurityIdentities_v[0] = temp;
+  samAccountName_v[0] = user_name;
+  mail_v[0] = mail;
+  mail_nickname_v[0] = user_name;
+  proxy_address_v[0] = proxy_address; 
+  query_base_dn_v[0] = query_base_dn;
+
+  n = 0;
+  ADD_ATTR("altSecurityIdentities", altSecurityIdentities_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("userPrincipalName", userPrincipalName_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("displayName", name_v, LDAP_MOD_REPLACE);
+  ADD_ATTR("sAMAccountName", samAccountName_v, LDAP_MOD_REPLACE);
+
+  if(!ActiveDirectory)
+    {
+      ADD_ATTR("uid", samAccountName_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("eduPersonPrincipalName", mail_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("displayName", name_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("eduPersonNickname", name_v, LDAP_MOD_REPLACE);
+    }
+
+  if (Exchange)
+    {
+      ADD_ATTR("msExchQueryBaseDN", query_base_dn_v, LDAP_MOD_REPLACE);
+      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE); 
+      ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE); 
+      ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
+    }
+  else
+    {
+      mail_v[0] = contact_mail;
+      ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE); 
+
+      if(!ActiveDirectory)
+	{
+	  ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_REPLACE);
+	}
+    }
+
+  mods[n] = NULL;
+  
+  if(ActiveDirectory)
+    sprintf(new_dn, "cn=%s,%s,%s", user_name, user_ou, dn_path);
+  else
+    sprintf(new_dn, "uid=%s,%s,%s", user_name, user_ou, dn_path);
+
+  if ((rc = ldap_modify_s(ldap_handle, new_dn, mods)) != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, 
+	      "Unable to modify user data for %s after renaming : %s",
+              user_name, ldap_err2string(rc));
+    }
+  
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  return(rc);
+}
+
+int user_create(int ac, char **av, void *ptr)
+{
+  LDAPMod *mods[20];
+  char new_dn[256];
+  char user_name[256];
+  char sam_name[256];
+  char upn[256];
+  char mail[256];
+  char contact_mail[256];
+  char proxy_address[256];
+  char mail_nickname[256];
+  char query_base_dn[256];
+  char displayName[256];
+  char address_book[256];
+  char alt_recipient[256];
+  char *cn_v[] = {NULL, NULL};
+  char *objectClass_v[] = {"top", "person", "organizationalPerson",
+                           "user", NULL};
+  char *objectClass_ldap_v[] = {"top", 
+				"eduPerson", "posixAccount", 
+				"apple-user", "shadowAccount",
+				"microsoftComTop", "securityPrincipal",
+				"inetOrgPerson", "user", 
+				"organizationalPerson", "person",
+				"mailRecipient", NULL};
+
+  char *samAccountName_v[] = {NULL, NULL};
+  char *altSecurityIdentities_v[] = {NULL, NULL};
+  char *mitMoiraId_v[] = {NULL, NULL};
+  char *mitMoiraClass_v[] = {NULL, NULL};
+  char *mitMoiraStatus_v[] = {NULL, NULL};
+  char *name_v[] = {NULL, NULL};
+  char *desc_v[] = {NULL, NULL};
+  char *userPrincipalName_v[] = {NULL, NULL};
+  char *userAccountControl_v[] = {NULL, NULL};
+  char *uid_v[] = {NULL, NULL};
+  char *gid_v[] = {NULL, NULL};
+  char *mitid_v[] = {NULL, NULL};
+  char *homedir_v[] = {NULL, NULL};
+  char *winProfile_v[] = {NULL, NULL};
+  char *drives_v[] = {NULL, NULL};
+  char *mail_v[] = {NULL, NULL};
+  char *givenName_v[] = {NULL, NULL};
+  char *sn_v[] = {NULL, NULL};
+  char *initials_v[] = {NULL, NULL};
+  char *displayName_v[] = {NULL, NULL};
+  char *proxy_address_v[] = {NULL, NULL};
+  char *mail_nickname_v[] = {NULL, NULL};
+  char *query_base_dn_v[] = {NULL, NULL};
+  char *address_book_v[] = {NULL, NULL};
+  char *homeMDB_v[] = {NULL, NULL};
+  char *homeServerName_v[] = {NULL, NULL};
+  char *mdbUseDefaults_v[] = {NULL, NULL};
+  char *mailbox_guid_v[] = {NULL, NULL};
+  char *user_culture_v[] = {NULL, NULL};
+  char *user_account_control_v[] = {NULL, NULL};
+  char *msexch_version_v[] = {NULL, NULL};
+  char *alt_recipient_v[] = {NULL, NULL};
+  char *hide_address_lists_v[] = {NULL, NULL};
+  char *principal_v[] = {NULL, NULL};
+  char *loginshell_v[] = {NULL, NULL};
+  char userAccountControlStr[80];
+  char temp[1024];
+  char principal[256];
+  char filter_exp[1024];
+  char search_path[512];
+  char *attr_array[3];
+  u_int userAccountControl = UF_NORMAL_ACCOUNT | UF_DONT_EXPIRE_PASSWD | 
+    UF_PASSWD_CANT_CHANGE; 
+  int  n;
+  int  rc;
+  int  i;
+  int  OldUseSFU30;
+  char **call_args;
+  char WinHomeDir[1024];
+  char WinProfileDir[1024];
+  char *homeMDB;
+  char *homeServerName;
+  ULONG dwInfo;
+  char acBERBuf[N_SD_BER_BYTES];
+  LK_ENTRY  *group_base;
+  int    group_count;
+  char TemplateDn[512];
+  char TemplateSamName[128];
+  LDAP_BERVAL **ppsValues;
+  LDAPControl sControl = {"1.2.840.113556.1.4.801",
+                          { N_SD_BER_BYTES, acBERBuf },
+                          TRUE};
+  LDAPControl *apsServerControls[] = {&sControl, NULL};
+  LDAPMessage *psMsg;
+  char *argv[3];
+  char *save_argv[7];
+  char search_string[256];
+  char *o_v[] = {NULL, NULL};
+  char *p, *q;
+  char *mail_routing_v[] = {NULL, NULL};
+  char *c;
+
+  call_args = ptr;
+
+  dwInfo = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
+    DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION;
+  BEREncodeSecurityBits(dwInfo, acBERBuf);
+
+  if (!check_string(av[U_NAME]))
+    {
+      callback_rc = AD_INVALID_NAME;
+      com_err(whoami, 0, "Unable to process invalid LDAP user name %s", 
+	      av[U_NAME]);
+      return(AD_INVALID_NAME);
+    }
+
+  memset(WinHomeDir, '\0', sizeof(WinHomeDir));
+  memset(WinProfileDir, '\0', sizeof(WinProfileDir));
+  memset(displayName, '\0', sizeof(displayName));
+  memset(query_base_dn, '\0', sizeof(query_base_dn));
+  strcpy(WinHomeDir, av[U_WINHOMEDIR]);
+  strcpy(WinProfileDir, av[U_WINPROFILEDIR]);
+  strcpy(user_name, av[U_NAME]);
+  sprintf(upn, "%s@%s", user_name, ldap_domain);
+  sprintf(sam_name, "%s", av[U_NAME]);
+
+  if(strlen(av[U_FIRST])) {
+    strcat(displayName, av[U_FIRST]);
+  }
+
+  if(strlen(av[U_MIDDLE])) {
+    if(strlen(av[U_FIRST]))
+       strcat(displayName, " "); 
+  
+    strcat(displayName, av[U_MIDDLE]);
+  }
+
+  if(strlen(av[U_LAST])) {
+    if(strlen(av[U_FIRST]) || strlen(av[U_MIDDLE]))
+      strcat(displayName, " ");
+
+    strcat(displayName, av[U_LAST]);
+  }
+
+  samAccountName_v[0] = sam_name;
+  if ((atoi(av[U_STATE]) != US_NO_PASSWD) && 
+      (atoi(av[U_STATE]) != US_REGISTERED))
+    {
+      userAccountControl |= UF_ACCOUNTDISABLE;
+
+      if (Exchange)
+	{
+	  hide_address_lists_v[0] = "TRUE";
+	  ADD_ATTR("msExchHideFromAddressLists", hide_address_lists_v,
+		   LDAP_MOD_ADD);
+	}
+    }
+
+  sprintf(userAccountControlStr, "%ld", userAccountControl);
+  userAccountControl_v[0] = userAccountControlStr;
+  userPrincipalName_v[0] = upn;
+  
+  if(ActiveDirectory)
+    cn_v[0] = user_name;
+  else
+    cn_v[0] = displayName;
+    
+  name_v[0] = user_name;
+  desc_v[0] = "Auto account created by Moira";
+  mail_v[0] = mail;
+  givenName_v[0] = av[U_FIRST];
+
+  if(ActiveDirectory)
+    sn_v[0] = av[U_LAST];
+  else
+    if(strlen(av[U_LAST]))
+      sn_v[0] = av[U_LAST];
+    else
+      sn_v[0] = av[U_NAME];
+
+  displayName_v[0] = displayName;
+  mail_nickname_v[0] = user_name;
+  o_v[0] = "Massachusetts Institute of Technology";
+
+  sprintf(temp, "Kerberos:%s@%s", user_name, PRIMARY_REALM);
+  sprintf(principal, "%s@%s", user_name, PRIMARY_REALM);
+  altSecurityIdentities_v[0] = temp;    
+  principal_v[0] = principal;
+
+  if(ActiveDirectory)
+    sprintf(new_dn, "cn=%s,%s,%s", user_name, user_ou, call_args[1]);
+  else
+    sprintf(new_dn, "uid=%s,%s,%s", user_name, user_ou, call_args[1]);
+
+  sprintf(mail,"%s@%s", user_name, lowercase(ldap_domain));
+  sprintf(contact_mail, "%s@mit.edu", user_name);
+  sprintf(query_base_dn, "%s%s", ADDRESS_LIST_PREFIX, call_args[1]);
+  query_base_dn_v[0] = query_base_dn;
+  sprintf(alt_recipient, "cn=%s@mit.edu,%s,%s", user_name, contact_ou, 
+	  call_args[1]);
+  sprintf(search_string, "@%s", uppercase(ldap_domain));
+
+  if (Exchange)
+    {
+      if(contact_create((LDAP *)call_args[0], call_args[1], contact_mail, 
+			contact_ou))
+	{
+	  com_err(whoami, 0, "Unable to create user contact %s", 
+		  contact_mail);
+	}
+      
+      if(find_homeMDB((LDAP *)call_args[0], call_args[1], &homeMDB, 
+		      &homeServerName)) 
+	{
+	  com_err(whoami, 0, "Unable to locate homeMB and homeServerName");
+	  return(1);
+	}
+      
+      com_err(whoami, 0, "homeMDB:%s", homeMDB);
+      com_err(whoami, 0, "homeServerName:%s", homeServerName);
+  
+      homeMDB_v[0] = homeMDB;
+      homeServerName_v[0] = homeServerName; 
+    }
+
+  n = 0;
+
+  ADD_ATTR("cn", cn_v, LDAP_MOD_ADD);
+  
+  if(ActiveDirectory) 
+    {
+      ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
+    }
+  else
+    {
+      ADD_ATTR("objectClass", objectClass_ldap_v, LDAP_MOD_ADD);
+    }
+
+  ADD_ATTR("sAMAccountName", samAccountName_v, LDAP_MOD_ADD);
+  ADD_ATTR("userPrincipalName", userPrincipalName_v, LDAP_MOD_ADD);
+  ADD_ATTR("userAccountControl", userAccountControl_v, LDAP_MOD_ADD);
+  ADD_ATTR("name", name_v, LDAP_MOD_ADD);
+  ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
+
+  if (Exchange)
+    {
+      ADD_ATTR("msExchQueryBaseDN", query_base_dn_v, LDAP_MOD_ADD);
+      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_ADD);
+      ADD_ATTR("homeMDB", homeMDB_v, LDAP_MOD_ADD);
+      mdbUseDefaults_v[0] = "TRUE";
+      ADD_ATTR("mdbUseDefaults", mdbUseDefaults_v, LDAP_MOD_ADD);
+      ADD_ATTR("msExchHomeServerName", homeServerName_v, LDAP_MOD_ADD); 
+      
+      argv[0] = user_name;
+    
+      if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
+	{
+	  if(!strcmp(save_argv[1], "EXCHANGE") || 
+	     (strstr(save_argv[3], search_string) != NULL))
+	    {
+	      argv[0] = exchange_acl;
+	      argv[1] = "USER";
+	      argv[2] = user_name;
+	      
+	      rc = mr_query("add_member_to_list", 3, argv, NULL, NULL);
+	      
+	      if ((rc) && (rc != MR_EXISTS))
+		{
+		  com_err(whoami, 0, "Unable to add user %s to %s: %s",
+			  user_name, exchange_acl, error_message(rc));
+		}
+	    } 
+	  else 
+	    {
+	      alt_recipient_v[0] = alt_recipient;
+	      ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_ADD);
+	    }
+	}
+      else
+	{
+	  alt_recipient_v[0] = alt_recipient;
+	  ADD_ATTR("altRecipient", alt_recipient_v, LDAP_MOD_ADD);
+	  
+	  com_err(whoami, 0, "Unable to fetch pobox for %s", user_name);
+	}
+    }
+  else
+    {
+      mail_v[0] = contact_mail;
+      ADD_ATTR("mail", mail_v, LDAP_MOD_ADD);
+
+      if(!ActiveDirectory)
+	{
+	  ADD_ATTR("mitMoiraMail", mail_v, LDAP_MOD_ADD);
+	}
+    }
+
+  if(strlen(av[U_FIRST])) {
+    ADD_ATTR("givenName", givenName_v, LDAP_MOD_ADD);
+  }
+
+  if(strlen(av[U_LAST]) || strlen(av[U_NAME])) {
+    ADD_ATTR("sn", sn_v, LDAP_MOD_ADD);
+  }
+
+  if(strlen(av[U_FIRST]) || strlen(av[U_MIDDLE]) || strlen(av[U_LAST])) {
+    ADD_ATTR("displayName", displayName_v, LDAP_MOD_ADD);
+
+    if(!ActiveDirectory)
+      {
+	ADD_ATTR("eduPersonNickname", displayName_v, LDAP_MOD_ADD);      
+      }
+  } else {
+    ADD_ATTR("displayName", name_v, LDAP_MOD_ADD);
+
+    if(!ActiveDirectory)
+      {
+	ADD_ATTR("eduPersonNickname", name_v, LDAP_MOD_ADD);            
+      }
+  }
+
+  if (strlen(av[U_MIDDLE]) == 1) {
+    initials_v[0] = av[U_MIDDLE];
+    ADD_ATTR("initials", initials_v, LDAP_MOD_ADD);
+  }
+
+  if (strlen(call_args[2]) != 0)    
+    {
+      mitMoiraId_v[0] = call_args[2];
+      ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_ADD); 
+    }
+
+  ADD_ATTR("altSecurityIdentities", altSecurityIdentities_v, LDAP_MOD_ADD);
+
+  if(!ActiveDirectory)
+    {
+      loginshell_v[0] = av[U_SHELL];
+      mitMoiraClass_v[0] = av[U_CLASS];
+      mitMoiraStatus_v[0] = av[U_STATE];
+      ADD_ATTR("loginShell", loginshell_v, LDAP_MOD_ADD);
+      ADD_ATTR("uid", samAccountName_v, LDAP_MOD_ADD);
+      ADD_ATTR("eduPersonPrincipalName", mail_v, LDAP_MOD_ADD);
+      ADD_ATTR("o", o_v, LDAP_MOD_ADD);
+      ADD_ATTR("mitMoiraClass", mitMoiraClass_v, LDAP_MOD_ADD);
+      ADD_ATTR("mitMoiraStatus", mitMoiraStatus_v, LDAP_MOD_ADD);
+    }
+
+  if (strlen(av[U_UID]) != 0)
+    {
+      uid_v[0] = av[U_UID];
+
+      if(ActiveDirectory) 
+	{
+	  ADD_ATTR("uid", uid_v, LDAP_MOD_ADD);
+	}
+      else
+	{
+	  gid_v[0] = "101";
+	  ADD_ATTR("uidNumber", uid_v, LDAP_MOD_ADD);
+	  ADD_ATTR("gidNumber", gid_v, LDAP_MOD_ADD);
+	}
+
+      if(ActiveDirectory)
+	{
+	  if (!UseSFU30)
+	    {
+	      ADD_ATTR("uidNumber", uid_v, LDAP_MOD_ADD);
+	    }
+	  else
+	    {
+	      ADD_ATTR("msSFU30UidNumber", uid_v, LDAP_MOD_ADD);
+	    }
+	}
+    }
+
+  if ((strlen(av[U_MITID]) != 0) && (av[U_MITID][0] == '9'))
+      mitid_v[0] = av[U_MITID];
+  else
+      mitid_v[0] = "none";
+
+  ADD_ATTR("employeeID", mitid_v, LDAP_MOD_ADD);
+
+  n = SetHomeDirectory((LDAP *)call_args[0], user_name, new_dn, 
+		       WinHomeDir, WinProfileDir, homedir_v, winProfile_v,
+		       drives_v, mods, LDAP_MOD_ADD, n);
+  
+  if(ActiveDirectory) 
+    {
+      sprintf(filter_exp, "(sAMAccountName=%s)", "UserTemplate.u");
+      sprintf(search_path, "%s,%s", security_template_ou, call_args[1]);
+      attr_array[0] = "sAMAccountName";
+      attr_array[1] = NULL;
+      group_count = 0;
+      group_base = NULL;
+      
+      if ((rc = linklist_build((LDAP *)call_args[0], search_path, filter_exp, 
+			       attr_array, &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE) != 0))
+	return(1);
+      
+      if (group_count != 1)
+	{
+	  com_err(whoami, 0, "Unable to process user security template: %s - "
+		  "security not set", "UserTemplate.u");
+	  return(1);
+	}
+      
+      strcpy(TemplateDn, group_base->dn);
+      strcpy(TemplateSamName, group_base->value);
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+      
+      rc = ldap_search_ext_s((LDAP *)call_args[0], search_path, 
+			     LDAP_SCOPE_SUBTREE, filter_exp, NULL, 0, 
+			     apsServerControls, NULL,
+			     NULL, 0, &psMsg);
+      
+      if ((psMsg = ldap_first_entry((LDAP *)call_args[0], psMsg)) == NULL)
+	{
+	  com_err(whoami, 0, "Unable to find user security template: %s - "
+		  "security not set", "UserTemplate.u");
+	  return(1);
+	}
+      
+      ppsValues = ldap_get_values_len((LDAP *)call_args[0], psMsg, 
+				      "ntSecurityDescriptor");
+      if (ppsValues == NULL)
+	{
+	  com_err(whoami, 0, "Unable to find user security template: %s - "
+		  "security not set", "UserTemplate.u");
+	  return(1);
+	}
+      
+      ADD_ATTR("ntSecurityDescriptor", (char **)ppsValues,
+	       LDAP_MOD_REPLACE | LDAP_MOD_BVALUES); 
+    }
+
+  mods[n] = NULL;
+
+  rc = ldap_add_ext_s((LDAP *)call_args[0], new_dn, mods, NULL, NULL);
+
+  if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
+    {
+      OldUseSFU30 = UseSFU30;
+      SwitchSFU(mods, &UseSFU30, n);
+      if (OldUseSFU30 != UseSFU30)
+	rc = ldap_add_ext_s((LDAP *)call_args[0], new_dn, mods, NULL, NULL);
+    }
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
+    {
+      com_err(whoami, 0, "Unable to create user %s : %s",
+              user_name, ldap_err2string(rc));
+      callback_rc = rc;
+      return(rc);
+    }
+
+  if ((rc == LDAP_SUCCESS) && (SetPassword))
+    {
+      if ((rc = set_password(sam_name, "", ldap_domain)) != 0)
+        {
+          ad_kdc_disconnect();
+          if (!ad_server_connect(default_server, ldap_domain))
+            {
+              com_err(whoami, 0, "Unable to set password for user %s : %s",
+                      user_name, 
+		      "cannot get changepw ticket from windows domain");
+            }
+          else
+            {
+              if ((rc = set_password(sam_name, "", ldap_domain)) != 0)
+                {
+                  com_err(whoami, 0, "Unable to set password for user %s "
+			  ": %ld", user_name, rc);
+                }
+            }
+        }
+    }
+
+  if(!ActiveDirectory) 
+    {
+      if (rc = moira_connect())
+	{
+	  critical_alert("Ldap incremental", 
+			 "Error contacting Moira server : %s",
+			 error_message(rc));
+	  return;
+	}
+  
+      argv[0] = user_name;
+      
+      if (!(rc = mr_query("get_pobox", 1, argv, save_query_info, save_argv)))
+	{
+          n = 0;
+	  ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_REPLACE);
+	  mods[n] = NULL;
+	  rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
+	   
+	  if (rc == LDAP_ALREADY_EXISTS || rc == LDAP_TYPE_OR_VALUE_EXISTS)
+            rc = LDAP_SUCCESS;
+
+	  if(rc)
+            com_err(whoami, 0,
+                    "Unable to set the mailRoutingAddress for %s : %s",
+                    user_name, ldap_err2string(rc));
+
+	  p = strdup(save_argv[3]);
+	  
+	  if((c = strchr(p, ',')) != NULL) {
+	    q = strtok(p, ",");
+	    StringTrim(q);
+
+	    if ((c = strchr(q, '@')) == NULL)
+	      sprintf(temp, "%s@mit.edu", q);
+	    else
+	      sprintf(temp, "%s", q);
+
+	    if(email_isvalid(temp) && atoi(av[U_STATE]) != US_DELETED) 
+	      {
+		mail_routing_v[0]  = temp;
+
+		n = 0;
+		ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
+		mods[n] = NULL;
+		rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
+		
+		if (rc == LDAP_ALREADY_EXISTS || 
+		    rc == LDAP_TYPE_OR_VALUE_EXISTS)
+		  rc = LDAP_SUCCESS;
+		
+		if(rc)
+		  com_err(whoami, 0, 
+			  "Unable to set the mailRoutingAddress for %s : %s",
+			  user_name, ldap_err2string(rc));
+	      }
+
+	    while((q = strtok(NULL, ",")) != NULL) {
+	      StringTrim(q);
+
+	      if((c = strchr(q, '@')) == NULL)
+		sprintf(temp, "%s@mit.edu", q);
+	      else
+		sprintf(temp, "%s", q);
+
+	      if(email_isvalid(temp) && atoi(av[U_STATE]) != US_DELETED)
+		{
+		  mail_routing_v[0]  = temp;
+		  
+		  n = 0;
+		  ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
+		  mods[n] = NULL;
+		  rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
+		  
+		  if (rc == LDAP_ALREADY_EXISTS || 
+		      rc == LDAP_TYPE_OR_VALUE_EXISTS)
+		    rc = LDAP_SUCCESS;
+		  
+		  if(rc)
+		    com_err(whoami, 0, 
+			    "Unable to set the mailRoutingAddress for %s : %s",
+			    user_name, ldap_err2string(rc));
+		}
+	    }
+	  } else {
+	    StringTrim(p);
+
+	    if((c = strchr(p, '@')) == NULL)
+	      sprintf(temp, "%s@mit.edu", p);
+	    else
+	      sprintf(temp, "%s", p);
+
+	    if(email_isvalid(temp) && atoi(av[U_STATE]) != US_DELETED) 
+	      {
+		mail_routing_v[0]  = temp;
+		
+		n = 0;
+		ADD_ATTR("mailRoutingAddress", mail_routing_v, LDAP_MOD_ADD);
+		mods[n] = NULL;
+		rc = ldap_modify_s((LDAP *)call_args[0], new_dn, mods);
+		
+		if (rc == LDAP_ALREADY_EXISTS || 
+		    rc == LDAP_TYPE_OR_VALUE_EXISTS)
+		  rc = LDAP_SUCCESS;
+		
+		if(rc)
+		  com_err(whoami, 0, 
+			  "Unable to set the mailRoutingAddress for %s : %s",
+			  user_name, ldap_err2string(rc));
+	      }
+	  }
+	}
+      moira_disconnect();
+    }
+
+  return(0);
+}
+
+int user_change_status(LDAP *ldap_handle, char *dn_path, 
+                       char *user_name, char *MoiraId,
+                       int operation)
+{
+  char      filter[128];
+  char      *attr_array[3];
+  char      temp[256];
+  char      distinguished_name[1024];
+  char      **modvalues;
+  char      *mitMoiraId_v[] = {NULL, NULL};
+  LDAPMod   *mods[20];
+  LK_ENTRY  *group_base;
+  int       group_count;
+  int       rc;
+  int       i;
+  int       n;
+  ULONG     ulongValue;
+
+  if (!check_string(user_name))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP user name %s", 
+	      user_name);
+      return(AD_INVALID_NAME);
+    }
+
+  group_count = 0;
+  group_base = NULL;
+
+  if (strlen(MoiraId) != 0)
+    {
+      sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
+      attr_array[0] = "UserAccountControl";
+      attr_array[1] = NULL;
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  user_name, ldap_err2string(rc));
+          return(rc);
+        }
+    }
+
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      group_count = 0;
+      group_base = NULL;
+      sprintf(filter, "(sAMAccountName=%s)", user_name);
+      attr_array[0] = "UserAccountControl";
+      attr_array[1] = NULL;
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  user_name, ldap_err2string(rc));
+          return(rc);
+        }
+    }
+  
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      com_err(whoami, 0, "Unable to find user %s in directory",
+              user_name);
+      return(LDAP_NO_SUCH_OBJECT);
+    }
+
+  strcpy(distinguished_name, group_base->dn);
+  ulongValue = atoi((*group_base).value);
+
+  if (operation == MEMBER_DEACTIVATE)
+    ulongValue |= UF_ACCOUNTDISABLE;
+  else    
+    ulongValue &= ~UF_ACCOUNTDISABLE;
+
+  sprintf(temp, "%ld", ulongValue);
+
+  if ((rc = construct_newvalues(group_base, group_count, (*group_base).value, 
+                                temp, &modvalues, REPLACE)) == 1)
+    goto cleanup;
+
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+  n = 0;
+  ADD_ATTR("UserAccountControl", modvalues, LDAP_MOD_REPLACE);
+
+  if (strlen(MoiraId) != 0)
+    {
+    mitMoiraId_v[0] = MoiraId;
+    ADD_ATTR("mitMoiraId", mitMoiraId_v, LDAP_MOD_REPLACE);
+    }
+
+  mods[n] = NULL;
+  rc = ldap_modify_s(ldap_handle, distinguished_name, mods);
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  free_values(modvalues);
+
+  if (rc != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to change status of user %s : %s",
+              user_name, ldap_err2string(rc));
+    }
+  
+ cleanup:
+  return(rc);
+}
+
+int user_delete(LDAP *ldap_handle, char *dn_path, 
+                char *u_name, char *MoiraId)
+{
+  char      filter[128];
+  char      *attr_array[3];
+  char      distinguished_name[1024];
+  char      user_name[512];
+  LK_ENTRY  *group_base;
+  int       group_count;
+  int       rc;
+  char      temp[256];
+
+  if (!check_string(u_name))
+    return(AD_INVALID_NAME);
+
+  strcpy(user_name, u_name);
+  group_count = 0;
+  group_base = NULL;
+
+  if (strlen(MoiraId) != 0)
+    {
+      sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
+      attr_array[0] = "name";
+      attr_array[1] = NULL;
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  user_name, ldap_err2string(rc));
+          goto cleanup;
+        }
+    }
+  
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      group_count = 0;
+      group_base = NULL;
+      sprintf(filter, "(sAMAccountName=%s)", user_name);
+      attr_array[0] = "name";
+      attr_array[1] = NULL;
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  user_name, ldap_err2string(rc));
+          goto cleanup;
+        }
+    }
+
+  if (group_count != 1)
+    {
+      goto cleanup;
+    }
+  
+  strcpy(distinguished_name, group_base->dn);
+
+  if (rc = ldap_delete_s(ldap_handle, distinguished_name))
+    {
+      com_err(whoami, 0, "Unable to process user %s : %s",
+              user_name, ldap_err2string(rc));
+    }
+
+  /* Need to add code to delete mit.edu contact */
+  
+  if (Exchange)
+    {
+      sprintf(temp, "cn=%s@mit.edu,%s,%s", user_name, contact_ou, dn_path);
+
+      if(rc = ldap_delete_s(ldap_handle, temp))
+	{
+	  com_err(whoami, 0, "Unable to delete user contact for %s",
+		  user_name);
+	}
+    }
+
+ cleanup:
+  linklist_free(group_base);
+
+  return(0);
+}
+
+void linklist_free(LK_ENTRY *linklist_base)
+{
+  LK_ENTRY *linklist_previous;
+
+  while (linklist_base != NULL)
+    {
+      if (linklist_base->dn != NULL)
+        free(linklist_base->dn);
+
+      if (linklist_base->attribute != NULL)
+        free(linklist_base->attribute);
+
+      if (linklist_base->value != NULL)
+        free(linklist_base->value);
+
+      if (linklist_base->member != NULL)
+        free(linklist_base->member);
+
+      if (linklist_base->type != NULL)
+        free(linklist_base->type);
+
+      if (linklist_base->list != NULL)
+        free(linklist_base->list);
+
+      linklist_previous = linklist_base;
+      linklist_base = linklist_previous->next;
+      free(linklist_previous);
+    }
+}
+
+void free_values(char **modvalues)
+{
+  int i;
+
+  i = 0;
+
+  if (modvalues != NULL)
+    {
+    while (modvalues[i] != NULL)
+      {
+        free(modvalues[i]);
+        modvalues[i] = NULL;
+        ++i;
+      }
+    free(modvalues);
+  }
+}
+
+static int illegalchars[] = {
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */
+  1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, /* SPACE - / */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, /* 0 - ? */
+  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ - O */
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* P - _ */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` - o */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, /* p - ^? */
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
+
+static int illegalchars_ldap[] = {
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */
+  0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, /* SPACE - / */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, /* 0 - ? */
+  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ - O */
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, /* P - _ */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` - o */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, /* p - ^? */
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
+
+int check_string(char *s)
+{
+  char  character;
+  char  *string;
+
+  string = s;
+
+  for (; *s; s++)
+    {
+      character = *s;
+
+      if (isupper(character))
+        character = tolower(character);
+
+      if(ActiveDirectory)
+	{
+	  if (illegalchars[(unsigned) character])
+	    {
+	      com_err(whoami, 0, "Found illegal char '%c' (%d) in string %s",
+		      character, (unsigned) character, string);
+	      return 0;
+	    }
+	}
+      else
+	{
+	  if (illegalchars_ldap[(unsigned) character])
+	    {
+	      com_err(whoami, 0, "Found illegal char '%c' (%d) in string %s",
+		      character, (unsigned) character, string);
+	      return 0;
+	    }
+	}
+    }
+
+  return(1);
+}
+
+int check_container_name(char *s)
+{
+  char  character;
+
+  for (; *s; s++)
+    {
+      character = *s;
+
+      if (isupper(character))
+        character = tolower(character);
+
+      if (character == ' ')
+	continue;
+
+      if (illegalchars[(unsigned) character])
+        return 0;
+    }
+
+  return(1);
+}
+
+int mr_connect_cl(char *server, char *client, int version, int auth)
+{
+  int   status;
+  char  *motd;
+  char  temp[128];
+
+  status = mr_connect(server);
+
+  if (status)
+    {
+      com_err(whoami, status, "while connecting to Moira");
+      return status;
+    }
+
+  status = mr_motd(&motd);
+
+  if (status)
+    {
+      mr_disconnect();
+      com_err(whoami, status, "while checking server status");
+      return status;
+    }
+
+  if (motd)
+    {
+      sprintf(temp, "The Moira server is currently unavailable: %s", motd);
+      com_err(whoami, status, temp);
+      mr_disconnect();
+      return status;
+    }
+
+  status = mr_version(version);
+
+  if (status)
+    {
+      if (status == MR_UNKNOWN_PROC)
+        {
+          if (version > 2)
+            status = MR_VERSION_HIGH;
+          else
+            status = MR_SUCCESS;
+        }
+
+      if (status == MR_VERSION_HIGH)
+        {
+          com_err(whoami, 0, "Warning: This client is running newer code "
+		  "than the server.");
+                  com_err(whoami, 0, "Some operations may not work.");
+        }
+      else if (status && status != MR_VERSION_LOW)
+        {
+          com_err(whoami, status, "while setting query version number.");
+          mr_disconnect();
+          return status;
+        }
+    }
+
+  if (auth)
+    {
+      status = mr_krb5_auth(client);
+      if (status)
+        {
+          com_err(whoami, status, "while authenticating to Moira.");
+          mr_disconnect();
+          return status;
+        }
+    }
+  
+  return MR_SUCCESS;
+}
+
+void AfsToWinAfs(char* path, char* winPath)
+{
+  char* pathPtr;
+  char* winPathPtr;
+  strcpy(winPath, WINAFS);
+  pathPtr = path + strlen(AFS);
+  winPathPtr = winPath + strlen(WINAFS);
+  
+  while (*pathPtr)
+    {
+      if (*pathPtr == '/')
+	*winPathPtr = '\\';
+      else
+	*winPathPtr = *pathPtr;
+      
+      pathPtr++;
+      winPathPtr++;
+    }
+}
+
+int GetAceInfo(int ac, char **av, void *ptr)
+{
+  char **call_args;
+  int   security_flag;
+
+  call_args = ptr;
+  
+  strcpy(call_args[0], av[L_ACE_TYPE]);
+  strcpy(call_args[1], av[L_ACE_NAME]);
+  security_flag = 0;
+  get_group_membership(call_args[2], call_args[3], &security_flag, av);
+  return(LDAP_SUCCESS);  
+}
+
+int checkADname(LDAP *ldap_handle, char *dn_path, char *Name)
+{
+  char filter[128];
+  char *attr_array[3];
+  int  group_count;
+  int  rc;
+  LK_ENTRY  *group_base;
+  
+  group_count = 0;
+  group_base = NULL;
+  
+  sprintf(filter, "(sAMAccountName=%s)", Name);
+  attr_array[0] = "sAMAccountName";
+  attr_array[1] = NULL;
+
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                           &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, "Unable to process ACE name %s : %s",
+              Name, ldap_err2string(rc));
+      return(1);
+    }
+
+  linklist_free(group_base);
+  group_base = NULL;
+
+  if (group_count == 0)
+    return(0);
+  
+  return(1);
+}
+
+#define MAX_ACE 7
+
+int ProcessAce(LDAP *ldap_handle, char *dn_path, char *Name, char *Type, 
+	       int UpdateGroup, int *ProcessGroup, char *maillist)
+{
+  char  *av[2];
+  char  GroupName[256];
+  char  *call_args[7];
+  int   rc;
+  char  *AceInfo[4];
+  char  AceType[32];
+  char  AceName[128];
+  char  AceMembership[2];
+  char  AceOu[256];
+  char  temp[128];
+  char  *save_argv[U_END];
+
+  if (!SetGroupAce)
+    {
+      com_err(whoami, 0, "ProcessAce disabled, skipping");
+      return(0);
+    }
+
+  strcpy(GroupName, Name);
+  
+  if (strcasecmp(Type, "LIST"))
+    return(1);
+
+  while (1)
+    {
+      av[0] = GroupName;
+      AceInfo[0] = AceType;
+      AceInfo[1] = AceName;
+      AceInfo[2] = AceMembership;
+      AceInfo[3] = AceOu;
+      memset(AceType, '\0', sizeof(AceType));
+      memset(AceName, '\0', sizeof(AceName));
+      memset(AceMembership, '\0', sizeof(AceMembership));
+      memset(AceOu, '\0', sizeof(AceOu));
+      callback_rc = 0;
+    
+      if (rc = mr_query("get_list_info", 1, av, GetAceInfo, AceInfo))
+        { 
+	  if(rc != MR_NO_MATCH)
+	    com_err(whoami, 0, "Unable to get ACE info for list %s : %s", 
+		    GroupName, error_message(rc));
+
+          return(1);
+        }
+
+      if (callback_rc)
+        {
+          com_err(whoami, 0, "Unable to get ACE info for list %s", GroupName);
+          return(1);
+        }
+
+      if ((strcasecmp(AceType, "USER")) && (strcasecmp(AceType, "LIST")))
+        return(0);
+
+      strcpy(temp, AceName);
+
+      if (!strcasecmp(AceType, "LIST"))
+        sprintf(temp, "%s%s", AceName, group_suffix);
+
+      if (!UpdateGroup)
+        {
+          if (checkADname(ldap_handle, dn_path, temp))
+	      return(0);
+
+          (*ProcessGroup) = 1;
+	}
+
+      if (!strcasecmp(AceInfo[0], "LIST"))
+        {
+          if (make_new_group(ldap_handle, dn_path, "", AceName, AceOu, 
+			     AceMembership, 0, UpdateGroup, maillist))
+            return(1);
+
+	  populate_group(ldap_handle, dn_path, AceName, AceOu, AceMembership,
+			 0, "");
+        }
+      else if (!strcasecmp(AceInfo[0], "USER"))
+        {
+          av[0] = AceName;
+          call_args[0] = (char *)ldap_handle;
+          call_args[1] = dn_path;
+          call_args[2] = "";
+          call_args[3] = NULL;
+          callback_rc = 0;
+
+	  if(!strcasecmp(AceName, PRODUCTION_PRINCIPAL) ||
+	     !strcasecmp(AceName, TEST_PRINCIPAL))
+	    {
+	      return(1);
+	    }
+
+          if (rc = mr_query("get_user_account_by_login", 1, av, 
+			    save_query_info, save_argv))
+            {
+              com_err(whoami, 0, "Unable to process user ACE %s for group %s.",
+		      AceName, Name);
+              return(1);
+            }
+
+	  if (rc = user_create(U_END, save_argv, call_args)) 
+	    {
+              com_err(whoami, 0, "Unable to process user ACE %s for group %s.",
+		      AceName, Name);
+              return(1);
+	    }
+	  
+          if (callback_rc)
+            {
+              com_err(whoami, 0, "Unable to process user Ace %s for group %s",
+		      AceName, Name);
+              return(1);
+            }
+
+          return(0);
+        }
+      else
+        return(1);
+
+      if (!strcasecmp(AceType, "LIST"))
+        {
+          if (!strcasecmp(GroupName, AceName))
+            return(0);
+        }
+
+      strcpy(GroupName, AceName);
+    }
+  
+  return(1);
+}
+
+int make_new_group(LDAP *ldap_handle, char *dn_path, char *MoiraId, 
+                   char *group_name, char *group_ou, char *group_membership, 
+                   int group_security_flag, int updateGroup, char *maillist)
+{
+  char  *av[3];
+  char  *call_args[8];
+  int   rc;
+  LK_ENTRY  *group_base;
+  int  group_count;
+  char filter[128];
+  char *attr_array[3];
+
+  av[0] = group_name;
+  call_args[0] = (char *)ldap_handle;
+  call_args[1] = dn_path;
+  call_args[2] = group_name;
+  call_args[3] = (char *)(MOIRA_USERS | MOIRA_KERBEROS | MOIRA_STRINGS);
+  call_args[4] = (char *)updateGroup;
+  call_args[5] = MoiraId;
+  call_args[6] = "0";
+  call_args[7] = NULL;
+  callback_rc = 0;
+
+  group_count = 0;
+  group_base = NULL;
+
+  if (rc = mr_query("get_list_info", 1, av, group_create, call_args))
+    {
+      moira_disconnect();
+      com_err(whoami, 0, "Unable to create list %s : %s", group_name, 
+	      error_message(rc));
+      return(rc);
+    }
+
+  if (callback_rc)
+    {
+      moira_disconnect();
+      com_err(whoami, 0, "Unable to create list %s", group_name);
+      return(callback_rc);
+    }
+
+  return(0);
+}
+
+int populate_group(LDAP *ldap_handle, char *dn_path, char *group_name, 
+                   char *group_ou, char *group_membership, 
+                   int group_security_flag, char *MoiraId)
+{
+  char      *av[3];
+  char      *call_args[7];
+  char      *pUserOu;
+  LK_ENTRY  *ptr;
+  int       rc;
+  char      member[512];
+  char      *s;
+  char      **members;
+  int       i = 0;
+  int       j = 0;
+  int       n = 0;
+  char      group_dn[512];
+  LDAPMod   *mods[20];
+  char      *member_v[] = {NULL, NULL};
+  char      *save_argv[U_END];
+  char      machine_ou[256];
+  char      NewMachineName[1024];
+
+  com_err(whoami, 0, "Populating group %s", group_name);
+  av[0] = group_name;
+  call_args[0] = (char *)ldap_handle;
+  call_args[1] = dn_path;
+  call_args[2] = group_name;
+  call_args[3] = (char *)(MOIRA_USERS | MOIRA_KERBEROS | MOIRA_STRINGS | 
+			  MOIRA_MACHINE);
+  call_args[4] = NULL;
+  member_base = NULL;
+
+  if (rc = mr_query("get_end_members_of_list", 1, av,
+                    member_list_build, call_args))
+    {
+      if(rc == MR_LIST)
+	return(0);
+      
+      com_err(whoami, 0, "Unable to populate list %s : %s", 
+              group_name, error_message(rc));
+      return(3);
+    }
+
+  members = (char **)malloc(sizeof(char *) * 2);
+
+  if (member_base != NULL)
+    {
+      ptr = member_base;
+
+      while (ptr != NULL)
+        {
+          if (!strcasecmp(ptr->type, "LIST"))
+            {
+              ptr = ptr->next;
+              continue;
+            }
+	  
+	  if (!strcasecmp(ptr->type, "MACHINE") && !ProcessMachineContainer)
+	    {
+	      ptr = ptr->next;
+	      continue;
+	    }
+	    
+	  if(!strcasecmp(ptr->type, "USER"))
+	    {
+	      if(!strcasecmp(ptr->member, PRODUCTION_PRINCIPAL) ||
+		 !strcasecmp(ptr->member, TEST_PRINCIPAL))
+		{
+		  ptr = ptr->next;
+		  continue;
+		}
+
+	      if ((rc = check_user(ldap_handle, dn_path, ptr->member,
+				   "")) == AD_NO_USER_FOUND)
+		{
+		  com_err(whoami, 0, "creating user %s", ptr->member);
+
+		  av[0] = ptr->member;
+		  call_args[0] = (char *)ldap_handle;
+		  call_args[1] = dn_path;
+		  call_args[2] = "";
+		  call_args[3] = NULL;
+		  callback_rc = 0;
+		  
+		  if (rc = mr_query("get_user_account_by_login", 1, av, 
+				    save_query_info, save_argv))
+		    {
+		      com_err(whoami, 0, "Unable to create user %s " 
+			      "while populating group %s.", ptr->member,
+			      group_name);
+
+		      return(3);
+		    }
+
+		  if (rc = user_create(U_END, save_argv, call_args)) 
+		    {
+		      com_err(whoami, 0, "Unable to create user %s "
+			      "while populating group %s.", ptr->member,
+			      group_name);
+		      
+		      return(3);
+		    }
+	  
+		  if (callback_rc)
+		    {
+		      com_err(whoami, 0, "Unable to create user %s "
+			      "while populating group %s", ptr->member, 
+			      group_name);
+
+		      return(3);
+		    }
+		}
+
+	      pUserOu = user_ou;
+		  
+	      if(ActiveDirectory) 
+		{
+		  sprintf(member, "cn=%s,%s,%s", ptr->member, pUserOu, 
+			  dn_path);
+		}
+	      else 
+		{
+		  sprintf(member, "uid=%s,%s,%s", ptr->member, pUserOu, 
+			  dn_path);
+		}
+	    }
+          else if (!strcasecmp(ptr->type, "STRING"))
+            {
+              if (contact_create(ldap_handle, dn_path, ptr->member,
+				 contact_ou))
+                return(3);
+
+              pUserOu = contact_ou;
+	      sprintf(member, "cn=%s,%s,%s", escape_string(ptr->member), 
+		      pUserOu, dn_path);
+            }
+          else if (!strcasecmp(ptr->type, "KERBEROS"))
+            {
+              if (contact_create(ldap_handle, dn_path, ptr->member, 
+				 kerberos_ou))
+                return(3);
+
+              pUserOu = kerberos_ou;
+	      sprintf(member, "cn=%s,%s,%s", escape_string(ptr->member), 
+		      pUserOu, dn_path);
+            }
+	  else if (!strcasecmp(ptr->type, "MACHINE"))
+	    {
+	      memset(machine_ou, '\0', sizeof(machine_ou));
+	      memset(NewMachineName, '\0', sizeof(NewMachineName));
+
+	      if (!get_machine_ou(ldap_handle, dn_path, ptr->member,
+				 machine_ou, NewMachineName))
+		{
+		  pUserOu = machine_ou;
+		  sprintf(member, "cn=%s,%s,%s", NewMachineName, pUserOu,
+			  dn_path);
+		}
+	      else
+		{
+		  ptr = ptr->next;                  
+		  continue;
+		}
+	    }
+
+	  if(i > 1) 
+	    members = (char **)realloc(members, ((i + 2) * sizeof(char *)));
+	  members[i++] = strdup(member);
+
+          ptr = ptr->next;
+        }
+    
+      linklist_free(member_base);
+      member_base = NULL;
+    }
+
+  members[i] = NULL;
+
+  sprintf(group_dn, "cn=%s,%s,%s", group_name, group_ou, dn_path);
+
+  if(GroupPopulateDelete)
+    {
+      n = 0;
+      ADD_ATTR("member", member_v, LDAP_MOD_REPLACE);
+      mods[n] = NULL;
+      
+      if ((rc = ldap_modify_s(ldap_handle, group_dn, 
+			      mods)) != LDAP_SUCCESS)
+	{
+	  com_err(whoami, 0,
+		  "Unable to populate group membership for %s: %s",
+		  group_dn, ldap_err2string(rc));
+	}
+  
+      for (i = 0; i < n; i++)
+	free(mods[i]);
+    }
+
+  n = 0;
+  ADD_ATTR("member", members, LDAP_MOD_REPLACE);
+  mods[n] = NULL;
+
+  if ((rc = ldap_modify_s(ldap_handle, group_dn, 
+			  mods)) != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0,
+	      "Unable to populate group membership for %s: %s",
+	      group_dn, ldap_err2string(rc));
+    }
+  
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+    
+  free(members);
+
+  return(0);
+}
+
+int process_group(LDAP *ldap_handle, char *dn_path, char *MoiraId, 
+                  char *group_name, char *group_ou, char *group_membership, 
+                  int group_security_flag, int type, char *maillist)
+{
+  char      before_desc[512];
+  char      before_name[256];
+  char      before_group_ou[256];
+  char      before_group_membership[2];
+  char      distinguishedName[256];
+  char      ad_distinguishedName[256];
+  char      filter[128];
+  char      *attr_array[3];
+  int       before_security_flag;
+  int       group_count;
+  int       rc;
+  LK_ENTRY  *group_base;
+  LK_ENTRY  *ptr;
+  char      ou_both[512];
+  char      ou_security[512];
+  char      ou_distribution[512];
+  char      ou_neither[512];
+  char      group_dn[512];
+
+  memset(ad_distinguishedName, '\0', sizeof(ad_distinguishedName));
+  sprintf(distinguishedName, "CN=%s,%s,%s", group_name, group_ou, dn_path);
+
+  memset(filter, '\0', sizeof(filter));
+  group_base = NULL;
+  group_count = 0;
+
+  if (rc = ad_get_group(ldap_handle, dn_path, group_name, 
+                        "*", MoiraId, 
+                        "samAccountName", &group_base, 
+                        &group_count, filter))
+    return(rc);
+
+  if (type == CHECK_GROUPS)
+    {
+      if (group_count == 1)
+        {
+	  strcpy(group_dn, group_base->dn);
+
+          if (!strcasecmp(group_dn, distinguishedName))
+            {
+              linklist_free(group_base);
+              return(0);
+            }
+        }
+
+      linklist_free(group_base);
+
+      if (group_count == 0)
+        return(AD_NO_GROUPS_FOUND);
+
+      if (group_count == 1)
+        return(AD_WRONG_GROUP_DN_FOUND);
+
+      return(AD_MULTIPLE_GROUPS_FOUND);
+    }
+
+  if (group_count == 0)
+    {
+      return(AD_NO_GROUPS_FOUND);
+    }
+
+  if (group_count > 1)
+    {
+      ptr = group_base;
+
+      strcpy(group_dn, ptr->dn);
+
+      while (ptr != NULL)
+        {
+          if (!strcasecmp(group_dn, ptr->value))
+            break;
+
+          ptr = ptr->next;
+        }
+
+      if (ptr == NULL)
+        {
+          com_err(whoami, 0, "%d groups with moira id = %s", group_count, 
+		  MoiraId);
+          ptr = group_base;
+
+          while (ptr != NULL)
+            {
+              com_err(whoami, 0, "%s with moira id = %s", ptr->value, MoiraId);
+              ptr = ptr->next;
+            }
+
+          linklist_free(group_base);
+          return(AD_MULTIPLE_GROUPS_FOUND);
+        }
+
+      ptr = group_base;
+
+      while (ptr != NULL)
+        {
+	  strcpy(group_dn, ptr->dn);
+
+          if (strcasecmp(group_dn, ptr->value))
+            rc = ldap_delete_s(ldap_handle, ptr->value);
+
+          ptr = ptr->next;
+        }
+
+      linklist_free(group_base);
+      memset(filter, '\0', sizeof(filter));
+      group_base = NULL;
+      group_count = 0;
+
+      if (rc = ad_get_group(ldap_handle, dn_path, group_name, 
+                            "*", MoiraId, 
+                            "samAccountName", &group_base, 
+                            &group_count, filter))
+        return(rc);
+
+      if (group_count == 0)
+        return(AD_NO_GROUPS_FOUND);
+
+      if (group_count > 1)
+        return(AD_MULTIPLE_GROUPS_FOUND);
+    }
+
+  strcpy(ad_distinguishedName, group_base->dn);
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+
+  attr_array[0] = "sAMAccountName";
+  attr_array[1] = NULL;
+  
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+			   &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
+	      MoiraId, ldap_err2string(rc));
+      return(rc);
+    }
+  
+  sprintf(filter, "(sAMAccountName=%s)", group_base->value);
+
+  if (!strcasecmp(ad_distinguishedName, distinguishedName))
+    {
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+      return(0);
+    }
+
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+  memset(ou_both, '\0', sizeof(ou_both));
+  memset(ou_security, '\0', sizeof(ou_security));
+  memset(ou_distribution, '\0', sizeof(ou_distribution));
+  memset(ou_neither, '\0', sizeof(ou_neither));
+  memset(before_name, '\0', sizeof(before_name));
+  memset(before_desc, '\0', sizeof(before_desc));
+  memset(before_group_membership, '\0', sizeof(before_group_membership));
+  
+  attr_array[0] = "name";
+  attr_array[1] = NULL;
+
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                           &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, "Unable to get list name with MoiraId = %s: %s",
+              MoiraId, ldap_err2string(rc));
+      return(rc);
+    }
+
+  strcpy(before_name, group_base->value);
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+
+  attr_array[0] = "description";
+  attr_array[1] = NULL;
+  
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+			   &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, 
+	      "Unable to get list description with MoiraId = %s: %s",
+	      MoiraId, ldap_err2string(rc));
+      return(rc);
+    }
+
+  if (group_count != 0)
+    {
+      strcpy(before_desc, group_base->value);
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+    }
+ 
+  change_to_lower_case(ad_distinguishedName);  
+  strcpy(ou_both, group_ou_both);
+  change_to_lower_case(ou_both);
+  strcpy(ou_security, group_ou_security);
+  change_to_lower_case(ou_security);
+  strcpy(ou_distribution, group_ou_distribution);
+  change_to_lower_case(ou_distribution);
+  strcpy(ou_neither, group_ou_neither);
+  change_to_lower_case(ou_neither);
+
+  if (strstr(ad_distinguishedName, ou_both))
+    {
+      strcpy(before_group_ou, group_ou_both);
+      before_group_membership[0] = 'B';
+      before_security_flag = 1;
+    }
+  else if (strstr(ad_distinguishedName, ou_security))
+    {
+      strcpy(before_group_ou, group_ou_security);
+      before_group_membership[0] = 'S';
+      before_security_flag = 1;
+    }
+  else if (strstr(ad_distinguishedName, ou_distribution))
+    {
+      strcpy(before_group_ou, group_ou_distribution);
+      before_group_membership[0] = 'D';
+      before_security_flag = 0;
+    }
+  else if (strstr(ad_distinguishedName, ou_neither))
+    {
+      strcpy(before_group_ou, group_ou_neither);
+      before_group_membership[0] = 'N';
+      before_security_flag = 0;
+    }
+  else
+    return(AD_NO_OU_FOUND);
+
+  rc = group_rename(ldap_handle, dn_path, before_name, 
+		    before_group_membership, 
+                    before_group_ou, before_security_flag, before_desc,
+                    group_name, group_membership, group_ou, 
+		    group_security_flag,
+                    before_desc, MoiraId, filter, maillist);
+
+  return(rc);
+}
+
+void change_to_lower_case(char *ptr)
+{
+  int i;
+
+  for (i = 0; i < (int)strlen(ptr); i++)
+    {
+      ptr[i] = tolower(ptr[i]);
+    }
+}
+
+int ad_get_group(LDAP *ldap_handle, char *dn_path, 
+                 char *group_name, char *group_membership, 
+                 char *MoiraId, char *attribute,
+                 LK_ENTRY **linklist_base, int *linklist_count,
+                 char *rFilter)
+{
+  LK_ENTRY  *pPtr;
+  char  filter[128];
+  char  *attr_array[3];
+  char  *dn;
+  int   rc;
+
+  (*linklist_base) = NULL;
+  (*linklist_count) = 0;
+
+  if (strlen(rFilter) != 0)
+    {
+      strcpy(filter, rFilter);
+      attr_array[0] = attribute;
+      attr_array[1] = NULL;
+      
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               linklist_base, linklist_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
+                  MoiraId, ldap_err2string(rc));
+         return(rc);
+       }
+
+    if ((*linklist_count) == 1)
+      {
+        strcpy(rFilter, filter);
+        return(0);
+      }
+    }
+
+  linklist_free((*linklist_base));
+  (*linklist_base) = NULL;
+  (*linklist_count) = 0;
+
+  if (strlen(MoiraId) != 0)
+    {
+      sprintf(filter, "(&(objectClass=group)(mitMoiraId=%s))", MoiraId);
+
+      attr_array[0] = attribute;
+      attr_array[1] = NULL;
+
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               linklist_base, linklist_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
+                  MoiraId, ldap_err2string(rc));
+         return(rc);
+       }
+    }
+
+  if ((*linklist_count) > 1)
+    {
+      com_err(whoami, 0, "multiple groups with mitMoiraId = %s", MoiraId);
+      pPtr = (*linklist_base);
+
+      while (pPtr)
+        {
+          com_err(whoami, 0, "groups %s has mitMoiraId = %s", pPtr->value, 
+		  MoiraId);
+          pPtr = pPtr->next;
+        }
+
+      linklist_free((*linklist_base));
+      (*linklist_base) = NULL;
+      (*linklist_count) = 0;
+    }
+
+  if ((*linklist_count) == 1)
+    {
+
+      pPtr = (*linklist_base);
+      dn = strdup(pPtr->dn);
+      dn += 3;
+
+      if (!memcmp(dn, group_name, strlen(group_name)))
+        {
+          strcpy(rFilter, filter);
+          return(0);
+        }
+    }
+
+  linklist_free((*linklist_base));
+  (*linklist_base) = NULL;
+  (*linklist_count) = 0;
+  sprintf(filter, "(sAMAccountName=%s%s)", group_name, group_suffix);
+
+  attr_array[0] = attribute;
+  attr_array[1] = NULL;
+
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                           linklist_base, linklist_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, "Unable to get list info with MoiraId = %s: %s",
+              MoiraId, ldap_err2string(rc));
+      return(rc);
+    }
+
+  if ((*linklist_count) == 1)
+    {
+      strcpy(rFilter, filter);
+      return(0);
+    }
+
+  return(0);
+}
+
+int check_user(LDAP *ldap_handle, char *dn_path, char *UserName, char *MoiraId)
+{
+  char filter[128];
+  char *attr_array[3];
+  char SamAccountName[64];
+  int  group_count;
+  int  rc;
+  LK_ENTRY  *group_base;
+  LK_ENTRY  *gPtr;
+
+  group_count = 0;
+  group_base = NULL;
+
+  if (strlen(MoiraId) != 0)
+    {
+      sprintf(filter, "(&(objectClass=user)(mitMoiraId=%s))", MoiraId);
+
+      attr_array[0] = "sAMAccountName";
+      attr_array[1] = NULL;
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  UserName, ldap_err2string(rc));
+          return(rc);
+        }
+
+      if (group_count > 1)
+        {
+          com_err(whoami, 0, "multiple users exist with MoiraId = %s",
+                  MoiraId);
+          gPtr = group_base;
+
+          while (gPtr)
+            {
+              com_err(whoami, 0, "user %s exist with MoiraId = %s",
+                      gPtr->value, MoiraId);
+              gPtr = gPtr->next;
+            }
+        }
+    }
+
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      group_count = 0;
+      group_base = NULL;
+      sprintf(filter, "(sAMAccountName=%s)", UserName);
+      attr_array[0] = "sAMAccountName";
+      attr_array[1] = NULL;
+
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) != 0)
+        {
+          com_err(whoami, 0, "Unable to process user %s : %s",
+                  UserName, ldap_err2string(rc));
+          return(rc);
+        }
+    }
+
+  if (group_count != 1)
+    {
+      linklist_free(group_base);
+      return(AD_NO_USER_FOUND);
+    }
+
+  strcpy(SamAccountName, group_base->value);
+  linklist_free(group_base);
+  group_count = 0;
+  rc = 0;
+
+  if (strcmp(SamAccountName, UserName))
+    {
+      com_err(whoami, 0, 
+	      "User object %s with MoiraId %s has mismatched usernames " 
+	      "(LDAP username %s, Moira username %s)", SamAccountName,
+	      MoiraId, SamAccountName, UserName);
+    }
+
+  return(0);
+}
+
+void container_get_dn(char *src, char *dest)
+{
+  char *sPtr;
+  char *array[20];
+  char name[256];
+  int  n;
+
+  memset(array, '\0', 20 * sizeof(array[0]));
+
+  if (strlen(src) == 0)
+    return;
+
+  strcpy(name, src);
+  sPtr = name;
+  n = 0;
+  array[n] = name;
+  ++n;
+
+  while (*sPtr)
+    {
+      if ((*sPtr) == '/')
+        {
+          (*sPtr) = '\0';
+          ++sPtr;
+          array[n] = sPtr;
+          ++n;
+        }
+      else
+        ++sPtr;
+    }
+
+  strcpy(dest, "OU=");
+
+  while (n != 0)
+    {
+      strcat(dest, array[n-1]);
+      --n;
+      if (n > 0)
+        {
+          strcat(dest, ",OU=");
+        }
+    }
+
+  return;
+}
+
+void container_get_name(char *src, char *dest)
+{
+  char *sPtr;
+  char *dPtr;
+
+  if (strlen(src) == 0)
+    return;
+
+  sPtr = src;
+  dPtr = src;
+
+  while (*sPtr)
+    {
+      if ((*sPtr) == '/')
+        {
+          dPtr = sPtr;
+          ++dPtr;
+        }
+      ++sPtr;
+    }
+
+  strcpy(dest, dPtr);
+  return;
+}
+
+void container_check(LDAP *ldap_handle, char *dn_path, char *name)
+{
+  char cName[256];
+  char *av[7];
+  int  i;
+  int  rc;
+
+  strcpy(cName, name);
+
+  for (i = 0; i < (int)strlen(cName); i++)
+    {
+      if (cName[i] == '/')
+        {
+          cName[i] = '\0';
+          av[CONTAINER_NAME] = cName;
+          av[CONTAINER_DESC] = "";
+          av[CONTAINER_LOCATION] = "";
+          av[CONTAINER_CONTACT] = "";
+          av[CONTAINER_TYPE] = "";
+          av[CONTAINER_ID] = "";
+          av[CONTAINER_ROWID] = "";
+          rc = container_create(ldap_handle, dn_path, 7, av);
+
+          if (rc == LDAP_SUCCESS)
+            {
+              com_err(whoami, 0, "container %s created without a mitMoiraId", 
+		      cName);
+            }
+
+          cName[i] = '/';
+        }
+    }
+}
+
+int container_rename(LDAP *ldap_handle, char *dn_path, int beforec, 
+		     char **before, int afterc, char **after)
+{
+  char      dName[256];
+  char      cName[256];
+  char      new_cn[128];
+  char      new_dn_path[256];
+  char      temp[256];
+  char      distinguishedName[256];
+  char      *pPtr;
+  int       rc;
+  int       i;
+
+  memset(cName, '\0', sizeof(cName));
+  container_get_name(after[CONTAINER_NAME], cName);
+
+  if (!check_container_name(cName))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP container name %s", 
+	      cName);
+      return(AD_INVALID_NAME);
+    }
+
+  memset(distinguishedName, '\0', sizeof(distinguishedName));
+
+  if (rc = container_get_distinguishedName(ldap_handle, dn_path, 
+					   distinguishedName, beforec, before))
+    return(rc);
+
+  if (strlen(distinguishedName) == 0)
+    {
+      rc = container_create(ldap_handle, dn_path, afterc, after);
+      return(rc);
+    }
+
+  strcpy(temp, after[CONTAINER_NAME]);
+  pPtr = temp;
+
+  for (i = 0; i < (int)strlen(temp); i++)
+    {
+      if (temp[i] == '/')
+        {
+          pPtr = &temp[i];
+        }
+    }
+
+  (*pPtr) = '\0';
+
+  container_get_dn(temp, dName);
+
+  if (strlen(temp) != 0)
+    sprintf(new_dn_path, "%s,%s", dName, dn_path);
+  else
+    sprintf(new_dn_path, "%s", dn_path);
+
+  sprintf(new_cn, "OU=%s", cName);
+
+  container_check(ldap_handle, dn_path, after[CONTAINER_NAME]);
+
+  if ((rc = ldap_rename_s(ldap_handle, distinguishedName, new_cn, new_dn_path,
+                          TRUE, NULL, NULL)) != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to rename container from %s to %s : %s",
+              before[CONTAINER_NAME], after[CONTAINER_NAME], 
+	      ldap_err2string(rc));
+      return(rc);
+    }
+
+  memset(dName, '\0', sizeof(dName));
+  container_get_dn(after[CONTAINER_NAME], dName);
+  rc = container_adupdate(ldap_handle, dn_path, dName, "", afterc, after);
+
+  return(rc);
+}
+
+int container_delete(LDAP *ldap_handle, char *dn_path, int count, char **av)
+{
+  char      distinguishedName[256];
+  int       rc;
+
+  memset(distinguishedName, '\0', sizeof(distinguishedName));
+
+  if (rc = container_get_distinguishedName(ldap_handle, dn_path, 
+					   distinguishedName, count, av))
+    return(rc);
+
+  if (strlen(distinguishedName) == 0)
+    return(0);
+
+  if ((rc = ldap_delete_s(ldap_handle, distinguishedName)) != LDAP_SUCCESS)
+    {
+      if (rc == LDAP_NOT_ALLOWED_ON_NONLEAF)
+        container_move_objects(ldap_handle, dn_path, distinguishedName);
+      else
+        com_err(whoami, 0, "Unable to delete container %s from directory : %s",
+                av[CONTAINER_NAME], ldap_err2string(rc));
+    }
+
+  return(rc);
+}
+
+int container_create(LDAP *ldap_handle, char *dn_path, int count, char **av)
+{
+  char      *attr_array[3];
+  LK_ENTRY  *group_base;
+  int       group_count;
+  LDAPMod   *mods[20];
+  char      *objectClass_v[] = {"top", 
+                           "organizationalUnit", 
+                           NULL};
+
+  char *ou_v[] = {NULL, NULL};
+  char *name_v[] = {NULL, NULL};
+  char *moiraId_v[] = {NULL, NULL};
+  char *desc_v[] = {NULL, NULL};
+  char *managedBy_v[] = {NULL, NULL};
+  char dName[256];
+  char cName[256];
+  char managedByDN[256];
+  char filter[256];
+  char temp[256];
+  int  n;
+  int  i;
+  int  rc;
+    
+  memset(filter, '\0', sizeof(filter));
+  memset(dName, '\0', sizeof(dName));
+  memset(cName, '\0', sizeof(cName));
+  memset(managedByDN, '\0', sizeof(managedByDN));
+  container_get_dn(av[CONTAINER_NAME], dName);
+  container_get_name(av[CONTAINER_NAME], cName);
+
+  if ((strlen(cName) == 0) || (strlen(dName) == 0))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP container name %s", 
+	      cName);
+      return(AD_INVALID_NAME);
+    }
+
+  if (!check_container_name(cName))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP container name %s", 
+	      cName);
+      return(AD_INVALID_NAME);
+    }
+
+  n = 0;
+  ADD_ATTR("objectClass", objectClass_v, LDAP_MOD_ADD);
+  name_v[0] = cName;
+  ADD_ATTR("name", name_v, LDAP_MOD_ADD);
+  ou_v[0] = cName;
+  ADD_ATTR("ou", ou_v, LDAP_MOD_ADD);
+
+  if (strlen(av[CONTAINER_ROWID]) != 0)
+    {
+      moiraId_v[0] = av[CONTAINER_ROWID];
+      ADD_ATTR("mitMoiraId", moiraId_v, LDAP_MOD_ADD);
+    }
+
+  if (strlen(av[CONTAINER_DESC]) != 0)
+    {
+      desc_v[0] = av[CONTAINER_DESC];
+      ADD_ATTR("description", desc_v, LDAP_MOD_ADD);
+    }
+
+  if ((strlen(av[CONTAINER_TYPE]) != 0) && (strlen(av[CONTAINER_ID]) != 0))
+    {
+      if (!strcasecmp(av[CONTAINER_TYPE], "KERBEROS"))
+	{
+	  if (!contact_create(ldap_handle, dn_path, av[CONTAINER_ID], 
+			      kerberos_ou))
+	    {
+	      sprintf(managedByDN, "CN=%s,%s,%s", av[CONTAINER_ID], 
+		      kerberos_ou, dn_path);
+	      managedBy_v[0] = managedByDN;
+	      ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_ADD);
+	    }
+	}
+      else
+	{
+	  if (!strcasecmp(av[CONTAINER_TYPE], "USER"))
+	    {
+	      sprintf(filter, "(&(cn=%s)(&(objectCategory=person)"
+		      "(objectClass=user)))", av[CONTAINER_ID]);
+	    }
+
+	  if (!strcasecmp(av[CONTAINER_TYPE], "LIST"))
+	    {
+	      sprintf(filter, "(&(objectClass=group)(cn=%s))", 
+		      av[CONTAINER_ID]);
+	    }
+
+	  if (strlen(filter) != 0)
+	    {
+	      attr_array[0] = "distinguishedName";
+	      attr_array[1] = NULL;
+	      group_count = 0;
+	      group_base = NULL;
+	      if ((rc = linklist_build(ldap_handle, dn_path, filter, 
+				       attr_array, 
+				       &group_base, &group_count, 
+				       LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
+		{
+		  if (group_count == 1)
+		    {
+		      strcpy(managedByDN, group_base->value);
+		      managedBy_v[0] = managedByDN;
+		      ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_ADD);
+		    }
+		  linklist_free(group_base);
+		  group_base = NULL;
+		  group_count = 0;
+		}
+	    }
+	}
+    }
+  
+  mods[n] = NULL;
+
+  sprintf(temp, "%s,%s", dName, dn_path);
+  rc = ldap_add_ext_s(ldap_handle, temp, mods, NULL, NULL);
+  
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+  
+  if ((rc != LDAP_SUCCESS) && (rc != LDAP_ALREADY_EXISTS))
+    {
+      com_err(whoami, 0, "Unable to create container %s : %s",
+              cName, ldap_err2string(rc));
+      return(rc);
+    }
+
+  if (rc == LDAP_ALREADY_EXISTS)
+    {
+      if (strlen(av[CONTAINER_ROWID]) != 0)
+        rc = container_adupdate(ldap_handle, dn_path, dName, "", count, av);
+    }
+
+  return(rc);
+}
+
+int container_update(LDAP *ldap_handle, char *dn_path, int beforec, 
+		     char **before, int afterc, char **after)
+{
+  char distinguishedName[256];
+  int  rc;
+
+  memset(distinguishedName, '\0', sizeof(distinguishedName));
+
+  if (rc = container_get_distinguishedName(ldap_handle, dn_path, 
+					   distinguishedName, afterc, after))
+    return(rc);
+
+  if (strlen(distinguishedName) == 0)
+    {
+      rc = container_create(ldap_handle, dn_path, afterc, after);
+      return(rc);
+    }
+  
+  container_check(ldap_handle, dn_path, after[CONTAINER_NAME]);
+  rc = container_adupdate(ldap_handle, dn_path, "", distinguishedName, afterc,
+			  after);
+
+  return(rc);
+}
+
+int container_get_distinguishedName(LDAP *ldap_handle, char *dn_path, 
+				    char *distinguishedName, int count, 
+				    char **av)
+{
+  char      *attr_array[3];
+  LK_ENTRY  *group_base;
+  int       group_count;
+  char      dName[256];
+  char      cName[256];
+  char      filter[512];
+  int       rc;
+
+  memset(filter, '\0', sizeof(filter));
+  memset(dName, '\0', sizeof(dName));
+  memset(cName, '\0', sizeof(cName));
+  container_get_dn(av[CONTAINER_NAME], dName);
+  container_get_name(av[CONTAINER_NAME], cName);
+
+  if (strlen(dName) == 0)
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP container name %s", 
+	      av[CONTAINER_NAME]);
+      return(AD_INVALID_NAME);
+    }
+
+  if (!check_container_name(cName))
+    {
+      com_err(whoami, 0, "Unable to process invalid LDAP container name %s", 
+	      cName);
+      return(AD_INVALID_NAME);
+    }
+  
+  sprintf(filter, "(&(objectClass=organizationalUnit)(mitMoiraId=%s))", 
+	  av[CONTAINER_ROWID]);
+  attr_array[0] = "distinguishedName";
+  attr_array[1] = NULL;
+  group_count = 0;
+  group_base = NULL;
+
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                           &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
+    {
+      if (group_count == 1)
+        {
+          strcpy(distinguishedName, group_base->value);
+        }
+
+      linklist_free(group_base);
+      group_base = NULL;
+      group_count = 0;
+    }
+
+  if (strlen(distinguishedName) == 0)
+    {
+      sprintf(filter, "(&(objectClass=organizationalUnit)"
+	      "(distinguishedName=%s,%s))", dName, dn_path);
+      attr_array[0] = "distinguishedName";
+      attr_array[1] = NULL;
+      group_count = 0;
+      group_base = NULL;
+
+      if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                               &group_base, &group_count, 
+			       LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
+        {
+          if (group_count == 1)
+            {
+              strcpy(distinguishedName, group_base->value);
+            }
+
+          linklist_free(group_base);
+          group_base = NULL;
+          group_count = 0;
+        }
+    }
+
+  return(0);
+}
+
+int container_adupdate(LDAP *ldap_handle, char *dn_path, char *dName, 
+                       char *distinguishedName, int count, char **av)
+{
+  char      *attr_array[5];
+  LK_ENTRY  *group_base;
+  LK_ENTRY  *pPtr;
+  LDAPMod   *mods[20];
+  int       group_count;
+  char      filter[512];
+  char      *moiraId_v[] = {NULL, NULL};
+  char      *desc_v[] = {NULL, NULL};
+  char      *managedBy_v[] = {NULL, NULL};
+  char      managedByDN[256];
+  char      moiraId[64];
+  char      desc[256];
+  char      ad_path[512];
+  int       rc;
+  int       i;
+  int       n;
+
+
+  strcpy(ad_path, distinguishedName);
+
+  if (strlen(dName) != 0)
+    sprintf(ad_path, "%s,%s", dName, dn_path);
+
+  sprintf(filter, "(&(objectClass=organizationalUnit)(distinguishedName=%s))",
+	  ad_path);
+
+  if (strlen(av[CONTAINER_ID]) != 0)
+    sprintf(filter, "(&(objectClass=organizationalUnit)(mitMoiraId=%s))", 
+	    av[CONTAINER_ROWID]);
+
+  attr_array[0] = "mitMoiraId";
+  attr_array[1] = "description";
+  attr_array[2] = "managedBy";
+  attr_array[3] = NULL;
+  group_count = 0;
+  group_base = NULL;
+
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+                           &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to retreive container info for %s : %s",
+              av[CONTAINER_NAME], ldap_err2string(rc));
+      return(rc);
+    }
+
+  memset(managedByDN, '\0', sizeof(managedByDN));
+  memset(moiraId, '\0', sizeof(moiraId));
+  memset(desc, '\0', sizeof(desc));
+  pPtr = group_base;
+
+  while (pPtr)
+    {
+      if (!strcasecmp(pPtr->attribute, "description"))
+        strcpy(desc, pPtr->value);
+      else if (!strcasecmp(pPtr->attribute, "managedBy"))
+        strcpy(managedByDN, pPtr->value);
+      else if (!strcasecmp(pPtr->attribute, "mitMoiraId"))
+        strcpy(moiraId, pPtr->value);
+      pPtr = pPtr->next;
+    }
+
+  linklist_free(group_base);
+  group_base = NULL;
+  group_count = 0;
+
+  n = 0;
+  if (strlen(av[CONTAINER_ROWID]) != 0)
+    {
+      moiraId_v[0] = av[CONTAINER_ROWID];
+      ADD_ATTR("mitMoiraId", moiraId_v, LDAP_MOD_REPLACE);
+    }
+
+  if (strlen(av[CONTAINER_DESC]) != 0)
+    {
+      attribute_update(ldap_handle, ad_path, av[CONTAINER_DESC], "description",
+		       dName);
+    }
+  else
+    {
+      if (strlen(desc) != 0)
+        {
+          attribute_update(ldap_handle, ad_path, "", "description", dName);
+        }
+    }
+
+  if ((strlen(av[CONTAINER_TYPE]) != 0) && (strlen(av[CONTAINER_ID]) != 0))
+    {
+      if (!strcasecmp(av[CONTAINER_TYPE], "KERBEROS"))
+	{
+	  if (!contact_create(ldap_handle, dn_path, av[CONTAINER_ID], 
+			      kerberos_ou))
+	    {
+	      sprintf(managedByDN, "CN=%s,%s,%s", av[CONTAINER_ID], 
+		      kerberos_ou, dn_path);
+	      managedBy_v[0] = managedByDN;
+	      ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_REPLACE);
+	    }
+	  else
+	    {
+	      if (strlen(managedByDN) != 0)
+		{
+		  attribute_update(ldap_handle, ad_path, "", "managedBy", 
+				   dName);
+		}
+	    }
+	}
+      else
+	{
+	  memset(filter, '\0', sizeof(filter));
+
+	  if (!strcasecmp(av[CONTAINER_TYPE], "USER"))
+	    {
+	      sprintf(filter, "(&(cn=%s)(&(objectCategory=person)"
+		      "(objectClass=user)))", av[CONTAINER_ID]);
+	    }
+
+	  if (!strcasecmp(av[CONTAINER_TYPE], "LIST"))
+	    {
+	      sprintf(filter, "(&(objectClass=group)(cn=%s))", 
+		      av[CONTAINER_ID]);
+	    }
+
+	  if (strlen(filter) != 0)
+	    {
+	      attr_array[0] = "distinguishedName";
+	      attr_array[1] = NULL;
+	      group_count = 0;
+	      group_base = NULL;
+	      if ((rc = linklist_build(ldap_handle, dn_path, filter, 
+				       attr_array, &group_base, &group_count, 
+				       LDAP_SCOPE_SUBTREE)) == LDAP_SUCCESS)
+		{
+		  if (group_count == 1)
+		    {
+		      strcpy(managedByDN, group_base->value);
+		      managedBy_v[0] = managedByDN;
+		      ADD_ATTR("managedBy", managedBy_v, LDAP_MOD_REPLACE);
+		    }
+		  else
+		    {
+		      if (strlen(managedByDN) != 0)
+			{
+			  attribute_update(ldap_handle, ad_path, "", 
+					   "managedBy", dName);
+			}
+		    }
+
+		  linklist_free(group_base);
+		  group_base = NULL;
+		  group_count = 0;
+		}
+	    }
+	  else
+	    {
+	      if (strlen(managedByDN) != 0)
+		{
+		  attribute_update(ldap_handle, ad_path, "", "managedBy", 
+				   dName);
+		}
+	    }
+	}
+    }
+
+  mods[n] = NULL;
+
+  if (n == 0)
+    return(LDAP_SUCCESS);
+
+  rc = ldap_modify_s(ldap_handle, ad_path, mods);
+
+  for (i = 0; i < n; i++)
+    free(mods[i]);
+
+  if (rc != LDAP_SUCCESS)
+    {
+      com_err(whoami, 0, "Unable to modify container info for %s : %s",
+	      av[CONTAINER_NAME], ldap_err2string(rc));
+      return(rc);
+    }
+  
+  return(rc);
+}
+
+int container_move_objects(LDAP *ldap_handle, char *dn_path, char *dName)
+{
+  char      *attr_array[3];
+  LK_ENTRY  *group_base;
+  LK_ENTRY  *pPtr;
+  int       group_count;
+  char      filter[512];
+  char      new_cn[128];
+  char      temp[256];
+  int       rc;
+  int       NumberOfEntries = 10;
+  int       i;
+  int       count;
+
+  rc = ldap_set_option(ldap_handle, LDAP_OPT_SIZELIMIT, &NumberOfEntries);
+
+  for (i = 0; i < 3; i++)
+    {
+      memset(filter, '\0', sizeof(filter));
+
+      if (i == 0)
+        {
+          strcpy(filter, "(!(|(objectClass=computer)"
+		 "(objectClass=organizationalUnit)))");
+          attr_array[0] = "cn";
+          attr_array[1] = NULL;
+        }
+      else if (i == 1)
+        {
+          strcpy(filter, "(objectClass=computer)");
+          attr_array[0] = "cn";
+          attr_array[1] = NULL;
+        }
+      else
+        {
+          strcpy(filter, "(objectClass=organizationalUnit)");
+          attr_array[0] = "ou";
+          attr_array[1] = NULL;
+        }
+
+      while (1)
+        {
+          if ((rc = linklist_build(ldap_handle, dName, filter, attr_array, 
+                                   &group_base, &group_count, 
+				   LDAP_SCOPE_SUBTREE)) != LDAP_SUCCESS)
+            {
+              break;
+            }
+
+          if (group_count == 0)
+            break;
+
+          pPtr = group_base;
+
+          while(pPtr)
+            {
+              if (!strcasecmp(pPtr->attribute, "cn"))
+                {
+                  sprintf(new_cn, "cn=%s", pPtr->value);
+                  if (i == 0)
+                    sprintf(temp, "%s,%s", orphans_other_ou, dn_path);
+                  if (i == 1)
+                    sprintf(temp, "%s,%s", orphans_machines_ou, dn_path);
+                  count = 1;
+
+                  while (1)
+                    {
+                      rc = ldap_rename_s(ldap_handle, pPtr->dn, new_cn, temp,
+                                         TRUE, NULL, NULL);
+                      if (rc == LDAP_ALREADY_EXISTS)
+                        {
+                          sprintf(new_cn, "cn=%s_%d", pPtr->value, count);
+                          ++count;
+                        }
+                      else
+                        break;
+                    }
+                }
+              else if (!strcasecmp(pPtr->attribute, "ou"))
+                {
+                  rc = ldap_delete_s(ldap_handle, pPtr->dn);
+                }
+
+              pPtr = pPtr->next;
+            }
+
+          linklist_free(group_base);
+          group_base = NULL;
+          group_count = 0;
+        }
+    }
+
+  return(0);
+}
+
+int get_machine_ou(LDAP *ldap_handle, char *dn_path, char *member, 
+		   char *machine_ou, char *NewMachineName)
+{
+  LK_ENTRY  *group_base;
+  int  group_count;
+  int  i;
+  char filter[128];
+  char *attr_array[3];
+  char cn[256];
+  char dn[256];
+  char temp[256];
+  char *pPtr;
+  int   rc;
+
+  strcpy(NewMachineName, member);
+  rc = moira_connect();
+  rc = GetMachineName(NewMachineName);
+  moira_disconnect();
+
+  if (strlen(NewMachineName) == 0)
+    {
+      com_err(whoami, 0, "Unable to find alais for machine %s in Moira", 
+	      member);
+      return(1);
+    }
+
+  pPtr = NULL;
+  pPtr = strchr(NewMachineName, '.');
+
+  if (pPtr != NULL)
+    (*pPtr) = '\0';
+
+  group_base = NULL;
+  group_count = 0;
+  sprintf(filter, "(sAMAccountName=%s$)", NewMachineName);
+  attr_array[0] = "cn";
+  attr_array[1] = NULL;
+  sprintf(temp, "%s", dn_path);
+
+  if ((rc = linklist_build(ldap_handle, temp, filter, attr_array, 
+			   &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, "Unable to process machine %s : %s",
+              member, ldap_err2string(rc));
+      return(1);
+    }
+
+  if (group_count != 1)
+    {
+      return(1);
+    }
+
+  strcpy(dn, group_base->dn);
+  strcpy(cn, group_base->value);
+
+  for (i = 0; i < (int)strlen(dn); i++)
+    dn[i] = tolower(dn[i]);
+
+  for (i = 0; i < (int)strlen(cn); i++)
+    cn[i] = tolower(cn[i]);
+
+  linklist_free(group_base);
+  pPtr = NULL;
+  pPtr = strstr(dn, cn);
+
+  if (pPtr == NULL)
+    {
+      com_err(whoami, 0, "Unable to process machine %s",
+              member);
+      return(1);
+    }
+
+  pPtr += strlen(cn) + 1;
+  strcpy(machine_ou, pPtr);
+  pPtr = NULL;
+  pPtr = strstr(machine_ou, "dc=");
+
+  if (pPtr == NULL)
+    {
+      com_err(whoami, 0, "Unable to process machine %s",
+              member);
+      return(1);
+    }
+
+  --pPtr;
+  (*pPtr) = '\0';
+
+  return(0);
+}
+
+int machine_move_to_ou(LDAP *ldap_handle, char * dn_path, 
+		       char *MoiraMachineName, char *DestinationOu)
+{
+  char        NewCn[128];
+  char        OldDn[512];
+  char        MachineName[128];
+  char        filter[128];
+  char        *attr_array[3];
+  char        NewOu[256];
+  char        *cPtr = NULL;
+  int         group_count;
+  long        rc;
+  LK_ENTRY    *group_base;
+
+  group_count = 0;
+  group_base = NULL;
+  
+  strcpy(MachineName, MoiraMachineName);
+  rc = GetMachineName(MachineName);
+
+  if (strlen(MachineName) == 0)
+    {
+      com_err(whoami, 0, "Unable to find alais for machine %s in Moira", 
+	      MoiraMachineName);
+      return(1);
+    }
+  
+  cPtr = strchr(MachineName, '.');
+
+  if (cPtr != NULL)
+    (*cPtr) = '\0';
+
+  sprintf(filter, "(sAMAccountName=%s$)", MachineName);
+  attr_array[0] = "sAMAccountName";
+  attr_array[1] = NULL;
+
+  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array, 
+			   &group_base, 
+			   &group_count, LDAP_SCOPE_SUBTREE)) != 0)
+    {
+      com_err(whoami, 0, "Unable to process machine %s : %s",
+	      MoiraMachineName, ldap_err2string(rc));
+      return(1);
+    }
+  
+  if (group_count == 1)
+    strcpy(OldDn, group_base->dn);
+
+  linklist_free(group_base);
+  group_base = NULL;
+
+  if (group_count != 1)
+    {
+      com_err(whoami, 0, "Unable to find machine %s in directory: %s", 
+	      MoiraMachineName);
+      return(1);
+    }
+
+  sprintf(NewOu, "%s,%s", DestinationOu, dn_path);
+  cPtr = strchr(OldDn, ',');
+
+  if (cPtr != NULL)
+    {
+      ++cPtr;
+      if (!strcasecmp(cPtr, NewOu))
+	return(0);
+    }
+
+  sprintf(NewCn, "CN=%s", MachineName);
+  rc = ldap_rename_s(ldap_handle, OldDn, NewCn, NewOu, TRUE, NULL, NULL);
+
+  return(rc);
+}
+
+int machine_check(LDAP *ldap_handle, char *dn_path, char *machine_name)
+{
+  char    Name[128];
+  char    *pPtr;
+  int     rc;
+  
+  memset(Name, '\0', sizeof(Name));
+  strcpy(Name, machine_name);
+  pPtr = NULL;
+  pPtr = strchr(Name, '.');
+
+  if (pPtr != NULL)
+    (*pPtr) = '\0';
+
+  strcat(Name, "$");
+  return(!(rc = checkADname(ldap_handle, dn_path, Name)));
+}
+
+int machine_get_moira_container(LDAP *ldap_handle, char *dn_path, 
+				char *machine_name, char *container_name)
+{
+  int     rc;
+  char    *av[2];
+  char    *call_args[2];
+  
+  av[0] = machine_name;
+  call_args[0] = (char *)container_name;
+  rc = mr_query("get_machine_to_container_map", 1, av, 
+		machine_GetMoiraContainer, call_args);
+  return(rc);
+}
+
+int machine_GetMoiraContainer(int ac, char **av, void *ptr)
+{
+  char **call_args;
+  
+  call_args = ptr;
+  strcpy(call_args[0], av[1]);
+  return(0);
+}
+
+int Moira_container_group_create(char **after)
+{
+  long rc;
+  char GroupName[64];
+  char *argv[20];
+  
+  memset(GroupName, '\0', sizeof(GroupName));
+  rc = Moira_groupname_create(GroupName, after[CONTAINER_NAME], 
+			      after[CONTAINER_ROWID]);
+  if (rc)
+    return rc;
+  
+  argv[L_NAME] = GroupName;
+  argv[L_ACTIVE] = "1";
+  argv[L_PUBLIC] = "0";
+  argv[L_HIDDEN] = "0";
+  argv[L_MAILLIST] = "0";
+  argv[L_GROUP] = "1";
+  argv[L_GID] = UNIQUE_GID;
+  argv[L_NFSGROUP] = "0";
+  argv[L_MAILMAN] = "0";
+  argv[L_MAILMAN_SERVER] = "[NONE]";
+  argv[L_DESC] = "auto created container group";
+  argv[L_ACE_TYPE] = "USER";
+  argv[L_MEMACE_TYPE] = "USER";
+  argv[L_ACE_NAME] = "sms";
+  argv[L_MEMACE_NAME] = "sms";
+
+  if (rc = mr_query("add_list", 15, argv, NULL, NULL))
+    {
+      com_err(whoami, 0, 
+	      "Unable to create container group %s for container %s: %s",
+	      GroupName, after[CONTAINER_NAME], error_message(rc));
+    }
+
+  Moira_setContainerGroup(after[CONTAINER_NAME], GroupName);
+  Moira_addGroupToParent(after[CONTAINER_NAME], GroupName);
+  
+  return(rc);
+}
+
+int Moira_container_group_update(char **before, char **after)
+{
+  long rc;
+  char BeforeGroupName[64];
+  char AfterGroupName[64];
+  char *argv[20];
+  
+  if (!strcasecmp(after[CONTAINER_NAME], before[CONTAINER_NAME]))
+    return(0);
+
+  memset(BeforeGroupName, '\0', sizeof(BeforeGroupName));
+  Moira_getGroupName(after[CONTAINER_NAME], BeforeGroupName, 0);
+  if (strlen(BeforeGroupName) == 0)
+    return(0);
+
+  memset(AfterGroupName, '\0', sizeof(AfterGroupName));
+  rc = Moira_groupname_create(AfterGroupName, after[CONTAINER_NAME], 
+			      after[CONTAINER_ROWID]);
+  if (rc)
+    return rc;
+
+  if (strcasecmp(BeforeGroupName, AfterGroupName))
+    {
+      argv[L_NAME] = BeforeGroupName;
+      argv[L_NAME + 1] = AfterGroupName;
+      argv[L_ACTIVE + 1] = "1";
+      argv[L_PUBLIC + 1] = "0";
+      argv[L_HIDDEN + 1] = "0";
+      argv[L_MAILLIST + 1] = "0";
+      argv[L_GROUP + 1] = "1";
+      argv[L_GID + 1] = UNIQUE_GID;
+      argv[L_NFSGROUP + 1] = "0";
+      argv[L_MAILMAN + 1] = "0";
+      argv[L_MAILMAN_SERVER + 1] = "[NONE]";
+      argv[L_DESC + 1] = "auto created container group";
+      argv[L_ACE_TYPE + 1] = "USER";
+      argv[L_MEMACE_TYPE + 1] = "USER";
+      argv[L_ACE_NAME + 1] = "sms";
+      argv[L_MEMACE_NAME + 1] = "sms";
+      
+      if (rc = mr_query("update_list", 16, argv, NULL, NULL))
+	{
+	  com_err(whoami, 0, 
+		  "Unable to rename container group from %s to %s: %s",
+		  BeforeGroupName, AfterGroupName, error_message(rc));
+	}
+    }
+  
+  return(rc);
+}
+
+int Moira_container_group_delete(char **before)
+{
+  long rc = 0;
+  char *argv[13];
+  char GroupName[64];
+  char ParentGroupName[64];
+  
+  memset(ParentGroupName, '\0', sizeof(ParentGroupName));
+  Moira_getGroupName(before[CONTAINER_NAME], ParentGroupName, 1);
+
+  memset(GroupName, '\0', sizeof(GroupName));
+
+  if (strcmp(before[CONTAINER_GROUP_NAME], "[none]"))
+    strcpy(GroupName, before[CONTAINER_GROUP_NAME]);
+  
+  if ((strlen(ParentGroupName) != 0) && (strlen(GroupName) != 0))
+    {
+      argv[0] = ParentGroupName;
+      argv[1] = "LIST";
+      argv[2] = GroupName;
+
+      if (rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL))
+	{
+	  com_err(whoami, 0, 
+		  "Unable to delete container group %s from list: %s",
+		  GroupName, ParentGroupName, error_message(rc));
+	}
+    }
+  
+  if (strlen(GroupName) != 0)
+    {
+      argv[0] = GroupName;
+
+      if (rc = mr_query("delete_list", 1, argv, NULL, NULL))
+	{
+	  com_err(whoami, 0, "Unable to delete container group %s : %s",
+		  GroupName, error_message(rc));
+	}
+    }
+  
+  return(rc);
+}
+
+int Moira_groupname_create(char *GroupName, char *ContainerName,
+			   char *ContainerRowID)
+{
+  char *ptr;
+  char *ptr1;
+  char temp[64];
+  char newGroupName[64];
+  char tempGroupName[64];
+  char tempgname[64];
+  char *argv[1];
+  int  i;
+  long rc;
+
+  strcpy(temp, ContainerName);
+  
+  ptr1 = strrchr(temp, '/');
+
+  if (ptr1 != NULL)
+  {
+    *ptr1 = '\0';
+    ptr = ++ptr1;
+    ptr1 = strrchr(temp, '/');
+
+    if (ptr1 != NULL)
+    {
+        sprintf(tempgname, "%s-%s", ++ptr1, ptr);
+    }
+    else
+        strcpy(tempgname, ptr);
+  }
+  else
+    strcpy(tempgname, temp);
+
+  if (strlen(tempgname) > 25)
+    tempgname[25] ='\0';
+
+  sprintf(newGroupName, "cnt-%s", tempgname);
+
+  /* change everything to lower case */
+  ptr = newGroupName;
+
+  while (*ptr)
+    {
+      if (isupper(*ptr))
+	*ptr = tolower(*ptr);
+
+      if (*ptr == ' ')
+	*ptr = '-';
+
+      ptr++;
+    }
+
+  strcpy(tempGroupName, newGroupName);
+  i = (int)'0';
+
+  /* append 0-9 then a-z if a duplicate is found */
+  while(1)
+    {
+      argv[0] = newGroupName;
+
+      if (rc = mr_query("get_list_info", 1, argv, NULL, NULL))
+	{
+	  if (rc == MR_NO_MATCH)
+	    break;
+	  com_err(whoami, 0, "Moira error while creating group name for "
+		  "container %s : %s", ContainerName, error_message(rc));
+	  return rc;
+	}
+
+      sprintf(newGroupName, "%s-%c", tempGroupName, i);
+
+      if (i == (int)'z')
+	{
+	  com_err(whoami, 0, "Unable to find a unique group name for "
+		  "container %s: too many duplicate container names",
+		  ContainerName);
+	  return 1;
+	}
+
+      if (i == '9')
+	i = 'a';
+      else
+	i++;
+    }
+
+  strcpy(GroupName, newGroupName);
+  return(0);
+}
+
+int Moira_setContainerGroup(char *origContainerName, char *GroupName)
+{
+  long rc;
+  char *argv[3];
+  
+  argv[0] = origContainerName;
+  argv[1] = GroupName;
+  
+  if ((rc = mr_query("set_container_list", 2, argv, NULL, NULL)))
+    {
+      com_err(whoami, 0, 
+	      "Unable to set container group %s in container %s: %s",
+	      GroupName, origContainerName, error_message(rc));
+    }
+  
+  return(0);
+}
+
+int Moira_addGroupToParent(char *origContainerName, char *GroupName)
+ {
+   char ContainerName[64];
+   char ParentGroupName[64];
+   char *argv[3];
+   long rc;
+
+   strcpy(ContainerName, origContainerName);
+   
+   Moira_getGroupName(ContainerName, ParentGroupName, 1);
+
+   /* top-level container */
+   if (strlen(ParentGroupName) == 0)
+     return(0);
+   
+   argv[0] = ParentGroupName;
+   argv[1] = "LIST";
+   argv[2] = GroupName;
+
+   if ((rc = mr_query("add_member_to_list", 3, argv, NULL, NULL)))
+     {
+       com_err(whoami, 0, 
+	       "Unable to add container group %s to parent group %s: %s",
+	       GroupName, ParentGroupName, error_message(rc));
+     }
+   
+   return(0);
+ }
+
+int Moira_getContainerGroup(int ac, char **av, void *ptr)
+{
+  char **call_args;
+  
+  call_args = ptr;
+  strcpy(call_args[0], av[1]);
+
+  return(0);
+}
+
+int Moira_getGroupName(char *origContainerName, char *GroupName,
+		       int ParentFlag)
+{
+  char ContainerName[64];
+  char *argv[3];
+  char *call_args[3];
+  char *ptr;
+  long rc;
+
+  strcpy(ContainerName, origContainerName);
+
+  if (ParentFlag)
+    {
+      ptr = strrchr(ContainerName, '/');
+
+      if (ptr != NULL)
+	(*ptr) = '\0';
+      else
+	return(0);
+    }
+
+  argv[0] = ContainerName;
+  argv[1] = NULL;
+  call_args[0] = GroupName;
+  call_args[1] = NULL;
+
+  if (!(rc = mr_query("get_container_list", 1, argv, Moira_getContainerGroup,
+		      call_args)))
+    {
+      if (strlen(GroupName) != 0)
+	return(0);
+    }
+
+  if (rc)
+    com_err(whoami, 0, "Unable to get container group from container %s: %s",
+	    ContainerName, error_message(rc));
+  else
+    com_err(whoami, 0, "Unable to get container group from container %s",
+	    ContainerName);
+  
+  return(0);
+}
+
+int Moira_process_machine_container_group(char *MachineName, char* GroupName, 
+					  int DeleteMachine)
+{
+  char *argv[3];
+  long rc;
+  
+  if (strcmp(GroupName, "[none]") == 0)
+    return 0;
+
+  argv[0] = GroupName;
+  argv[1] = "MACHINE";
+  argv[2] = MachineName;
+
+  if (!DeleteMachine)
+    rc = mr_query("add_member_to_list", 3, argv, NULL, NULL);
+  else
+    rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL);
+
+  if (rc)
+    {
+      com_err(whoami, 0, "Unable to add machine %s to container group%s: %s",
+	      MachineName, GroupName, error_message(rc));
+    }
+
+  return(0);
+}
+
+int GetMachineName(char *MachineName)
+{
+  char    *args[2];
+  char    NewMachineName[1024];
+  char    *szDot;
+  int     rc = 0;
+  int     i;
+  DWORD   dwLen = 0;
+  char    *call_args[2];
+  
+  // If the address happens to be in the top-level MIT domain, great!
+  strcpy(NewMachineName, MachineName);
+
+  for (i = 0; i < (int)strlen(NewMachineName); i++)
+    NewMachineName[i] = toupper(NewMachineName[i]);
+
+  szDot = strchr(NewMachineName,'.');
+
+  if ((szDot) && (!strcasecmp(szDot+1, DOMAIN_SUFFIX)))
+    {
+      return(0);
+    }
+  
+  // If not, see if it has a Moira alias in the top-level MIT domain.
+  memset(NewMachineName, '\0', sizeof(NewMachineName));
+  args[0] = "*";
+  args[1] = MachineName;
+  call_args[0] = NewMachineName;
+  call_args[1] = NULL;
+
+  if (rc = mr_query("get_hostalias", 2, args, ProcessMachineName, call_args))
+    {
+      com_err(whoami, 0, "Unable to resolve machine name %s : %s",
+	      MachineName, error_message(rc));
+      strcpy(MachineName, "");
+      return(0);
+    }
+  
+  if (strlen(NewMachineName) != 0)
+    strcpy(MachineName, NewMachineName);
+  else
+    strcpy(MachineName, "");
+
+  return(0);
+}
+
+int ProcessMachineName(int ac, char **av, void *ptr)
+{
+  char    **call_args;
+  char    MachineName[1024];
+  char    *szDot;
+  int     i;
+  
+  call_args = ptr;
+
+  if (strlen(call_args[0]) == 0)
+    {
+      strcpy(MachineName, av[0]);
+
+      for (i = 0; i < (int)strlen(MachineName); i++)
+	MachineName[i] = toupper(MachineName[i]);
+
+      szDot = strchr(MachineName,'.');
+
+        if ((szDot) && (!strcasecmp(szDot+1,DOMAIN_SUFFIX)))
+	  {
+            strcpy(call_args[0], MachineName);
+	  }
+    }
+
+  return(0);
+}
+
+void SwitchSFU(LDAPMod **mods, int *UseSFU30, int n)
+{
+  int i;
+  
+  if (*UseSFU30)
+    {
+      for (i = 0; i < n; i++)
+        {
+	  if (!strcmp(mods[i]->mod_type, "msSFU30UidNumber"))
+	    mods[i]->mod_type = "uidNumber";
+        }
+
+      (*UseSFU30) = 0;
+    }
+  else
+    {
+      for (i = 0; i < n; i++)
+        {
+	  if (!strcmp(mods[i]->mod_type, "uidNumber"))
+	    mods[i]->mod_type = "msSFU30UidNumber";
+        }
+
+      (*UseSFU30) = 1;
+    }
+}
+
+int SetHomeDirectory(LDAP *ldap_handle, char *user_name, 
+		     char *DistinguishedName,
+                     char *WinHomeDir, char *WinProfileDir,
+                     char **homedir_v, char **winProfile_v,
+                     char **drives_v, LDAPMod **mods, 
+                     int OpType, int n)
+{
+  char cWeight[3];
+  char cPath[1024];
+  char path[1024];
+  char winPath[1024];
+  char winProfile[1024];
+  char homeDrive[8];
+  char homedir[1024];
+  char apple_homedir[1024];
+  char *apple_homedir_v[] = {NULL, NULL};
+  int  last_weight;
+  int  i;
+  int  rc;
+  LDAPMod *DelMods[20];
+  char *argv[3];
+  char *save_argv[FS_END];
+  char *fsgroup_save_argv[2];
+
+  memset(homeDrive, '\0', sizeof(homeDrive));
+  memset(path, '\0', sizeof(path));
+  memset(winPath, '\0', sizeof(winPath));
+  memset(winProfile, '\0', sizeof(winProfile));
+
+  if(!ActiveDirectory) 
+    {
+      if (rc = moira_connect())
+	{
+          critical_alert("Ldap incremental",
+			 "Error contacting Moira server : %s",
+			 error_message(rc));
+	  return;
+	}
+      
+      argv[0] = user_name;
+
+      if (!(rc = mr_query("get_filesys_by_label", 1, argv, save_query_info, 
+			  save_argv)))
+	{
+	  if(!strcmp(save_argv[FS_TYPE], "FSGROUP") ||
+	     !strcmp(save_argv[FS_TYPE], "MUL"))
+	    {
+	
+	      argv[0] = save_argv[FS_NAME];
+	      fsgCount = 0;
+	      
+	      if (!(rc = mr_query("get_fsgroup_members", 1, argv, 
+				  save_fsgroup_info, fsgroup_save_argv)))
+		{
+		  if(fsgCount)
+		    {
+		      argv[0] = fsgroup_save_argv[0];
+		      
+		      if (!(rc = mr_query("get_filesys_by_label", 1, argv, 
+					  save_query_info, save_argv)))
+			{
+			  strcpy(path, save_argv[FS_PACK]);
+			}
+		    }
+		}
+	    }
+	  else
+	    {
+	      strcpy(path, save_argv[FS_PACK]);
+	    }
+	}
+      
+      moira_disconnect();
+
+      if (strlen(path))
+	{
+	  if (!strnicmp(path, AFS, strlen(AFS)))
+	    {
+	      sprintf(homedir, "%s", path);
+	      sprintf(apple_homedir, "%s/MacData", path);
+	      homedir_v[0] = homedir;
+	      apple_homedir_v[0] = apple_homedir;
+	      ADD_ATTR("homeDirectory", homedir_v, OpType);
+	      ADD_ATTR("apple-user-homeDirectory", apple_homedir_v, 
+		       OpType);
+	    }
+	}
+      else
+	{
+	  homedir_v[0] = "NONE";
+	  apple_homedir_v[0] = "NONE";
+	  ADD_ATTR("homeDirectory", homedir_v, OpType);
+	  ADD_ATTR("apple-user-homeDirectory", apple_homedir_v, 
+		   OpType);
+	}
+
+      return(n);
+    }
+ 
+  if ((!strcasecmp(WinHomeDir, "[afs]")) || 
+      (!strcasecmp(WinProfileDir, "[afs]")))
+    {
+      if (rc = moira_connect())
+	{
+          critical_alert("Ldap incremental",
+			 "Error contacting Moira server : %s",
+			 error_message(rc));
+	  return;
+	}
+      
+      argv[0] = user_name;
+
+      if (!(rc = mr_query("get_filesys_by_label", 1, argv, save_query_info, 
+			  save_argv)))
+	{
+	  if(!strcmp(save_argv[FS_TYPE], "FSGROUP") ||
+	     !strcmp(save_argv[FS_TYPE], "MUL"))
+	    {
+	
+	      argv[0] = save_argv[FS_NAME];
+	      fsgCount = 0;
+	      
+	      if (!(rc = mr_query("get_fsgroup_members", 1, argv, 
+				  save_fsgroup_info, fsgroup_save_argv)))
+		{
+		  if(fsgCount)
+		    {
+		      argv[0] = fsgroup_save_argv[0];
+		      
+		      if (!(rc = mr_query("get_filesys_by_label", 1, argv, 
+					  save_query_info, save_argv)))
+			{
+			  strcpy(path, save_argv[FS_PACK]);
+			}
+		    }
+		}
+	    }
+	  else
+	    {
+	      strcpy(path, save_argv[FS_PACK]);
+	    }
+	}
+     
+      moira_disconnect();
+
+      if (strlen(path))
+	{
+	  if (!strnicmp(path, AFS, strlen(AFS)))
+	    {
+	      AfsToWinAfs(path, winPath);
+	      strcpy(winProfile, winPath);
+	      strcat(winProfile, "\\.winprofile");
+	    }
+	}
+      else
+	return(n);
+    }
+
+    if ((!strcasecmp(WinHomeDir, "[dfs]")) || 
+	(!strcasecmp(WinProfileDir, "[dfs]")))
+    {
+      sprintf(path, "\\\\%s\\dfs\\profiles\\%c\\%s", ldap_domain, 
+	      user_name[0], user_name);
+
+      if (!strcasecmp(WinProfileDir, "[dfs]"))
+	{
+	  strcpy(winProfile, path);
+	  strcat(winProfile, "\\.winprofile");
+	}
+
+      if (!strcasecmp(WinHomeDir, "[dfs]"))
+	strcpy(winPath, path);
+    }
+    
+    if (!strcasecmp(WinHomeDir, "[local]"))
+      memset(winPath, '\0', sizeof(winPath));
+    else if (!strcasecmp(WinHomeDir, "[afs]") || 
+	     !strcasecmp(WinHomeDir, "[dfs]"))
+      {
+        strcpy(homeDrive, "H:");
+      }
+    else
+      {
+        strcpy(winPath, WinHomeDir);
+        if (!strncmp(WinHomeDir, "\\\\", 2))
+	  {
+            strcpy(homeDrive, "H:");
+	  }        
+      }
+    
+    // nothing needs to be done if WinProfileDir is [afs].
+    if (!strcasecmp(WinProfileDir, "[local]"))
+      memset(winProfile, '\0', sizeof(winProfile));
+    else if (strcasecmp(WinProfileDir, "[afs]") && 
+	     strcasecmp(WinProfileDir, "[dfs]"))
+      {
+        strcpy(winProfile, WinProfileDir);
+      }
+    
+    if (strlen(winProfile) != 0)
+      {
+        if (winProfile[strlen(winProfile) - 1] == '\\')
+	  winProfile[strlen(winProfile) - 1] = '\0';
+      }
+
+    if (strlen(winPath) != 0)
+      {
+        if (winPath[strlen(winPath) - 1] == '\\')
+	  winPath[strlen(winPath) - 1] = '\0';
+      }
+    
+    if ((winProfile[1] == ':') && (strlen(winProfile) == 2))
+      strcat(winProfile, "\\");
+
+    if ((winPath[1] == ':') && (strlen(winPath) == 2))
+      strcat(winPath, "\\");
+    
+    if (strlen(winPath) == 0)
+      {
+	if (OpType == LDAP_MOD_REPLACE)
+	  {
+	    i = 0;
+	    DEL_ATTR("homeDirectory", LDAP_MOD_DELETE);
+	    DelMods[i] = NULL;
+	    //unset homeDirectory attribute for user.
+	    rc = ldap_modify_s(ldap_handle, DistinguishedName, DelMods);
+	    free(DelMods[0]);
+	  }
+      }
+    else
+      {
+	homedir_v[0] = strdup(winPath);
+	ADD_ATTR("homeDirectory", homedir_v, OpType);
+      }
+    
+    if (strlen(winProfile) == 0)
+      {
+        if (OpType == LDAP_MOD_REPLACE)
+	  {
+            i = 0;
+            DEL_ATTR("profilePath", LDAP_MOD_DELETE);
+            DelMods[i] = NULL;
+            //unset profilePate attribute for user.
+            rc = ldap_modify_s(ldap_handle, DistinguishedName, DelMods);
+            free(DelMods[0]);
+	  }
+      }
+    else
+      {
+        winProfile_v[0] = strdup(winProfile);
+        ADD_ATTR("profilePath", winProfile_v, OpType);
+      }
+    
+    if (strlen(homeDrive) == 0)
+      {
+        if (OpType == LDAP_MOD_REPLACE)
+	  {
+            i = 0;
+            DEL_ATTR("homeDrive", LDAP_MOD_DELETE);
+            DelMods[i] = NULL;
+            //unset homeDrive attribute for user
+            rc = ldap_modify_s(ldap_handle, DistinguishedName, DelMods);
+            free(DelMods[0]);
+	  }
+      }
+    else
+      {
+        drives_v[0] = strdup(homeDrive);
+        ADD_ATTR("homeDrive", drives_v, OpType);
+      }
+
+    return(n);
+}
+
+int attribute_update(LDAP *ldap_handle, char *distinguished_name, 
+		     char *attribute_value, char *attribute, char *user_name)
+{
+  char      *mod_v[] = {NULL, NULL};
+  LDAPMod   *DelMods[20];
+  LDAPMod   *mods[20];
+  int       n;
+  int       i;
+  int       rc;
+  
+  if (strlen(attribute_value) == 0)
+    {
+      i = 0;
+      DEL_ATTR(attribute, LDAP_MOD_DELETE);
+      DelMods[i] = NULL;
+      rc = ldap_modify_s(ldap_handle, distinguished_name, DelMods);
+      free(DelMods[0]);
+    }
+  else
+    {
+      n = 0;
+      mod_v[0] = attribute_value;
+      ADD_ATTR(attribute, mod_v, LDAP_MOD_REPLACE);
+      mods[n] = NULL;
+
+      if ((rc = ldap_modify_s(ldap_handle, distinguished_name, 
+			      mods)) != LDAP_SUCCESS)
+        {
+          free(mods[0]);
+          n = 0;
+          mod_v[0] = attribute_value;
+          ADD_ATTR(attribute, mod_v, LDAP_MOD_ADD);
+          mods[n] = NULL;
+
+          if ((rc = ldap_modify_s(ldap_handle, distinguished_name, 
+				  mods)) != LDAP_SUCCESS)
+            {
+              com_err(whoami, 0, "Unable to change the %s attribute for %s "
+		      "in the directory : %s",
+                      attribute, user_name, ldap_err2string(rc));
+            }
+        }
+
+      free(mods[0]);
+    }
+  
+  return(rc);
+}
+
+void StringTrim(char *StringToTrim)
+{
+  char *t, *s;
+  char *save;
+
+  save = strdup(StringToTrim);
+
+  s = save;
+
+  while (isspace(*s))
+    s++;
+
+  /* skip to end of string */
+  if (*s == '\0')
+    {
+      if (*save)
+	*save = '\0';
+      strcpy(StringToTrim, save);
+      return;
+    }
+  
+  for (t = s; *t; t++)
+    continue;
+
+  while (t > s)
+    {
+      --t;
+      if (!isspace(*t))
+	{
+	  t++;
+	  break;
+	}
+    }
+
+  if (*t)
+    *t = '\0';
+  
+  strcpy(StringToTrim, s);
+  return;
+}
+
+int ReadConfigFile(char *DomainName)
+{
+    int     Count;
+    int     i;
+    int     k;
+    char    temp[256];
+    char    temp1[256];
+    FILE    *fptr;
+
+    Count = 0;
+
+    sprintf(temp, "%s%s.cfg", CFG_PATH, DomainName);
+
+    if ((fptr = fopen(temp, "r")) != NULL)
+      {
+        while (fgets(temp, sizeof(temp), fptr) != 0)
+	  {
+            for (i = 0; i < (int)strlen(temp); i++)
+	      temp[i] = toupper(temp[i]);
+
+            if (temp[strlen(temp) - 1] == '\n')
+	      temp[strlen(temp) - 1] = '\0';
+
+            StringTrim(temp);
+
+            if (strlen(temp) == 0)
+	      continue;
+
+            if (!strncmp(temp, DOMAIN, strlen(DOMAIN)))
+	      {
+                if (strlen(temp) > (strlen(DOMAIN)))
+		  {
+                    strcpy(ldap_domain, &temp[strlen(DOMAIN)]);
+                    StringTrim(ldap_domain);
+		  }
+	      }
+            else if (!strncmp(temp, REALM, strlen(REALM)))
+              {
+                if (strlen(temp) > (strlen(REALM)))
+                  {
+                    strcpy(ldap_realm, &temp[strlen(REALM)]);
+                    StringTrim(ldap_realm);
+                  }
+              }
+            else if (!strncmp(temp, PORT, strlen(PORT)))
+              {
+                if (strlen(temp) > (strlen(PORT)))
+                  {
+                    strcpy(ldap_port, &temp[strlen(PORT)]);
+                    StringTrim(ldap_port);
+                  }
+              }
+            else if (!strncmp(temp, PRINCIPALNAME, strlen(PRINCIPALNAME)))
+	      {
+                if (strlen(temp) > (strlen(PRINCIPALNAME)))
+		  {
+                    strcpy(PrincipalName, &temp[strlen(PRINCIPALNAME)]);
+                    StringTrim(PrincipalName);
+		  }
+	      }
+            else if (!strncmp(temp, SERVER, strlen(SERVER)))
+	      {
+                if (strlen(temp) > (strlen(SERVER)))
+		  {
+                    ServerList[Count] = calloc(1, 256);
+                    strcpy(ServerList[Count], &temp[strlen(SERVER)]);
+                    StringTrim(ServerList[Count]);
+                    ++Count;
+		  }
+	      }
+            else if (!strncmp(temp, MSSFU, strlen(MSSFU)))
+	      {
+                if (strlen(temp) > (strlen(MSSFU)))
+		  {
+                    strcpy(temp1, &temp[strlen(MSSFU)]);
+                    StringTrim(temp1);
+                    if (!strcmp(temp1, SFUTYPE))
+		      UseSFU30 = 1;
+		  }
+	      }
+	    else if (!strncmp(temp, GROUP_SUFFIX, strlen(GROUP_SUFFIX)))
+	      {
+		if (strlen(temp) > (strlen(GROUP_SUFFIX)))
+		  {
+		    strcpy(temp1, &temp[strlen(GROUP_SUFFIX)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "NO")) 
+		      {
+			UseGroupSuffix = 0;
+			memset(group_suffix, '\0', sizeof(group_suffix));
+		      }
+		  }
+	      }
+	    else if (!strncmp(temp, GROUP_TYPE, strlen(GROUP_TYPE)))
+	      {
+		if (strlen(temp) > (strlen(GROUP_TYPE)))
+		  {
+		    strcpy(temp1, &temp[strlen(GROUP_TYPE)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "UNIVERSAL")) 
+		      UseGroupUniversal = 1;
+		  }
+	      }
+	    else if (!strncmp(temp, SET_GROUP_ACE, strlen(SET_GROUP_ACE)))
+	      {
+		if (strlen(temp) > (strlen(SET_GROUP_ACE)))
+		  {
+		    strcpy(temp1, &temp[strlen(SET_GROUP_ACE)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "NO"))
+		      SetGroupAce = 0;
+		  }
+	      }
+	    else if (!strncmp(temp, SET_PASSWORD, strlen(SET_PASSWORD)))
+	      {
+		if (strlen(temp) > (strlen(SET_PASSWORD)))
+		  {
+		    strcpy(temp1, &temp[strlen(SET_PASSWORD)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "NO"))
+		      SetPassword = 0;
+		  }
+	      }
+	    else if (!strncmp(temp, EXCHANGE, strlen(EXCHANGE)))
+	      {
+		if (strlen(temp) > (strlen(EXCHANGE)))
+		  {
+		    strcpy(temp1, &temp[strlen(EXCHANGE)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "YES"))
+		      Exchange = 1;
+		  }
+	      }
+	    else if (!strncmp(temp, PROCESS_MACHINE_CONTAINER, 
+			      strlen(PROCESS_MACHINE_CONTAINER)))
+	      {
+		if (strlen(temp) > (strlen(PROCESS_MACHINE_CONTAINER)))
+		  {
+		    strcpy(temp1, &temp[strlen(PROCESS_MACHINE_CONTAINER)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "NO"))
+		      ProcessMachineContainer = 0;
+		  }
+	      }
+	    else if (!strncmp(temp, ACTIVE_DIRECTORY, 
+			      strlen(ACTIVE_DIRECTORY)))
+	      {
+		if (strlen(temp) > (strlen(ACTIVE_DIRECTORY)))
+		  {
+		    strcpy(temp1, &temp[strlen(ACTIVE_DIRECTORY)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "NO"))
+		      ActiveDirectory = 0;
+		  }
+	      }
+	    else if (!strncmp(temp, GROUP_POPULATE_MEMBERS, 
+			      strlen(GROUP_POPULATE_MEMBERS)))
+	      {
+		if (strlen(temp) > (strlen(GROUP_POPULATE_MEMBERS)))
+		  {
+		    strcpy(temp1, &temp[strlen(GROUP_POPULATE_MEMBERS)]);
+		    StringTrim(temp1);
+		    if (!strcasecmp(temp1, "DELETE")) 
+		      {
+			GroupPopulateDelete = 1;
+		      }
+		  }
+	      }
+            else
+	      {
+                if (strlen(ldap_domain) != 0)
+		  {
+                    memset(ldap_domain, '\0', sizeof(ldap_domain));
+                    break;
+		  }
+
+                if (strlen(temp) != 0)
+		  strcpy(ldap_domain, temp);
+	      }
+	  }
+        fclose(fptr);
+      }
+    
+    if (strlen(ldap_domain) == 0)
+      {
+      strcpy(ldap_domain, DomainName);
+      }
+
+    if (Count == 0)
+        return(0);
+
+    for (i = 0; i < Count; i++)
+      {
+        if (ServerList[i] != 0)
+	  {
+            for (k = 0; k < (int)strlen(ServerList[i]); k++)
+	      ServerList[i][k] = toupper(ServerList[i][k]);
+	  }
+      }
+    
+    return(0);
+}
+
+int ReadDomainList()
+{
+  int     Count;
+  int     i;
+  char    temp[128];
+  char    temp1[128];
+  FILE    *fptr;
+  unsigned char c[11];
+  unsigned char stuff[256];
+  int     rc;
+  int     ok;
+
+  Count = 0;
+  sprintf(temp, "%s%s", CFG_PATH, WINADCFG);
+
+  if ((fptr = fopen(temp, "r")) != NULL)
+    {
+      while (fgets(temp, sizeof(temp), fptr) != 0)
+	{
+	  for (i = 0; i < (int)strlen(temp); i++)
+	    temp[i] = toupper(temp[i]);
+
+	  if (temp[strlen(temp) - 1] == '\n')
+	    temp[strlen(temp) - 1] = '\0';
+
+	  StringTrim(temp);
+
+	  if (strlen(temp) == 0)
+	    continue;
+
+	  if (!strncmp(temp, DOMAIN, strlen(DOMAIN)))
+	    {
+	      if (strlen(temp) > (strlen(DOMAIN)))
+		{
+		  strcpy(temp1, &temp[strlen(DOMAIN)]);
+		  StringTrim(temp1);
+		  strcpy(temp, temp1);
+		}
+	    }
+	  
+	  strcpy(DomainNames[Count], temp);
+	  StringTrim(DomainNames[Count]);
+	  ++Count;
+	}
+
+      fclose(fptr);
+    }
+
+  if (Count == 0)
+    {
+      critical_alert("incremental", "%s", "ldap.incr cannot run due to a "
+		     "configuration error in ldap.cfg");
+      return(1);
+    }
+  
+  return(0);
+}
+
+int email_isvalid(const char *address) {
+  int        count = 0;
+  const char *c, *domain;
+  static char *rfc822_specials = "()<>@,;:\\\"[]";
+
+  if(address[strlen(address) - 1] == '.') 
+    return 0;
+    
+  /* first we validate the name portion (name@domain) */
+  for (c = address;  *c;  c++) {
+    if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) == 
+		       '\"')) {
+      while (*++c) {
+        if (*c == '\"') 
+	  break;
+        if (*c == '\\' && (*++c == ' ')) 
+	  continue;
+        if (*c <= ' ' || *c >= 127) 
+	  return 0;
+      }
+
+      if (!*c++) 
+	return 0;
+      if (*c == '@') 
+	break;
+      if (*c != '.') 
+	return 0;
+      continue;
+    }
+
+    if (*c == '@') 
+      break;
+    if (*c <= ' ' || *c >= 127) 
+      return 0;
+    if (strchr(rfc822_specials, *c)) 
+      return 0;
+  }
+
+  if (c == address || *(c - 1) == '.') 
+    return 0;
+
+  /* next we validate the domain portion (name@domain) */
+  if (!*(domain = ++c)) return 0;
+  do {
+    if (*c == '.') {
+      if (c == domain || *(c - 1) == '.') 
+	return 0;
+      count++;
+    }
+    if (*c <= ' ' || *c >= 127) 
+      return 0;
+    if (strchr(rfc822_specials, *c)) 
+      return 0;
+  } while (*++c);
+
+  return (count >= 1);
+}
+
+int find_homeMDB(LDAP *ldap_handle, char *dn_path, char **homeMDB, 
+	     char **homeServerName) 
+{
+  LK_ENTRY *group_base;
+  LK_ENTRY *sub_group_base;
+  LK_ENTRY *gPtr;
+  LK_ENTRY *sub_gPtr;
+  int      group_count;
+  int      sub_group_count;
+  char     filter[1024];
+  char     sub_filter[1024];
+  char     search_path[1024];
+  char     range[1024];
+  char     *attr_array[3];
+  char     *s;
+  int      homeMDB_count = -1;
+  int      rc;
+  int      i;
+  int      mdbbl_count;
+  int      rangeStep = 1500;
+  int      rangeLow = 0;
+  int      rangeHigh = rangeLow + (rangeStep - 1);
+  int      isLast = 0;
+
+  /* Grumble..... microsoft not making it searchable from the root *grr* */
+
+  memset(filter, '\0', sizeof(filter));
+  memset(search_path, '\0', sizeof(search_path));
+  
+  sprintf(filter, "(objectClass=msExchMDB)");
+  sprintf(search_path, "CN=Configuration,%s", dn_path);
+  attr_array[0] = "distinguishedName";
+  attr_array[1] = NULL;
+  
+  group_base = NULL;
+  group_count = 0;
+  
+  if ((rc = linklist_build(ldap_handle, search_path, filter, attr_array,
+			   &group_base, &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0) 
+    {
+      com_err(whoami, 0, "Unable to find msExchMDB %s",
+	      ldap_err2string(rc));
+      return(rc);
+    }
+  
+  if (group_count) 
+    {
+      gPtr = group_base;
+      
+      while(gPtr) {
+	if (((s = strstr(gPtr->dn, "Public")) != (char *) NULL) ||
+	    ((s = strstr(gPtr->dn, "Recover")) != (char *) NULL) || 
+	    ((s = strstr(gPtr->dn, "Reserve")) != (char *) NULL))
+	  {
+	    gPtr = gPtr->next;
+	    continue;
+	  }
+
+	/* 
+	 * Due to limits in active directory we need to use the LDAP
+	 * range semantics to query and return all the values in 
+	 * large lists, we will stop increasing the range when
+	 * the result count is 0.
+         */
+
+	i = 0;	
+	mdbbl_count = 0;
+
+	for(;;) 
+	  {
+	    memset(sub_filter, '\0', sizeof(sub_filter));
+	    memset(range, '\0', sizeof(range));
+	    sprintf(sub_filter, "(objectClass=msExchMDB)");
+
+	    if(isLast)
+	      sprintf(range, "homeMDBBL;Range=%d-*", rangeLow);
+	    else 
+	      sprintf(range, "homeMDBBL;Range=%d-%d", rangeLow, rangeHigh);
+
+	    attr_array[0] = range;
+	    attr_array[1] = NULL;
+	    
+	    sub_group_base = NULL;
+	    sub_group_count = 0;
+	    
+	    if ((rc = linklist_build(ldap_handle, gPtr->dn, sub_filter, 
+				     attr_array, &sub_group_base, 
+				     &sub_group_count, 
+				     LDAP_SCOPE_SUBTREE)) != 0) 
+	      {
+		com_err(whoami, 0, "Unable to find homeMDBBL %s",
+			ldap_err2string(rc));
+		return(rc);
+	      }
+
+	    if(!sub_group_count)
+	      {
+		if(isLast) 
+		  {
+		    isLast = 0;
+		    rangeLow = 0;
+		    rangeHigh = rangeLow + (rangeStep - 1);
+		    break;
+		  }
+		else
+		  isLast++;
+	      }
+
+	    mdbbl_count += sub_group_count;
+	    rangeLow = rangeHigh + 1;
+	    rangeHigh = rangeLow + (rangeStep - 1);
+	  }
+
+	/* First time through, need to initialize or update the least used */
+	
+	com_err(whoami, 0, "Mail store %s, count %d", gPtr->dn, 
+		mdbbl_count);
+
+	if(mdbbl_count < homeMDB_count || homeMDB_count == -1) 
+	  {
+	    homeMDB_count = mdbbl_count; 
+	    *homeMDB = strdup(gPtr->dn);
+	  }
+
+	gPtr = gPtr->next;
+	linklist_free(sub_group_base);
+      }
+    }
+
+  linklist_free(group_base);
+  
+  /* 
+   * Ok found the server least allocated need to now query to get its
+   * msExchHomeServerName so we can set it as a user attribute
+   */
+  
+  attr_array[0] = "legacyExchangeDN";
+  attr_array[1] = NULL;	
+  
+  group_count = 0;
+  group_base = NULL;
+  
+  if ((rc = linklist_build(ldap_handle, *homeMDB, filter, 
+			   attr_array, &group_base, 
+			   &group_count, 
+			   LDAP_SCOPE_SUBTREE)) != 0) 
+    {
+      com_err(whoami, 0, "Unable to find msExchHomeServerName %s",
+	      ldap_err2string(rc));
+      return(rc);
+    }  
+  
+  if(group_count) 
+    {
+      *homeServerName = strdup(group_base->value);
+      if((s = strrchr(*homeServerName, '/')) != (char *) NULL) 
+	{
+	  *s = '\0';
+	}
+    } 
+
+  linklist_free(group_base);
+  
+  return(rc);
+}
+      
+char *lowercase(char *s)
+{
+  char *p;
+
+  for (p = s; *p; p++)
+    {
+      if (isupper(*p))
+	*p = tolower(*p);
+    }
+  return s;
+}
+
+char *uppercase(char *s)
+{
+  char *p;
+
+  for (p = s; *p; p++)
+    {
+      if (islower(*p))
+	*p = toupper(*p);
+    }
+  return s;
+}
+
+char *escape_string(char *s)
+{
+  char *p, *q;
+  char string[1024];
+  char temp[1024];
+  int i = 0;
+  int spaces = 0;
+
+  memset(string, '\0', sizeof(string));
+
+  q = s;
+
+  /* Escape any special characters */
+
+  for(; *q != '\0'; q++) {
+    if(*q == ',')
+      string[i++] = '\\';
+    if(*q == '+') 
+      string[i++] = '\\';
+    if(*q == '"') 
+      string[i++] = '\\';
+    if(*q == '\\') 
+      string[i++] = '\\';
+    if(*q == '<') 
+      string[i++] = '\\';
+    if(*q == '>') 
+      string[i++] = '\\';
+    if(*q == ';')
+      string[i++] = '\\';
+    if(*q == '#')
+      string[i++] = '\\';
+    if(*q == '=')
+      string[i++] = '\\';
+
+    string[i++] = *q;
+  }
+
+  return strdup(string);
+}
+
+int save_query_info(int argc, char **argv, void *hint)
+{
+  int i;
+  char **nargv = hint;
+
+  for(i = 0; i < argc; i++)
+    nargv[i] = strdup(argv[i]);
+
+  return MR_CONT;
+}
+
+int save_fsgroup_info(int argc, char **argv, void *hint)
+{
+  int i;
+  char **nargv = hint;
+
+  if(!fsgCount) 
+    {
+      for(i = 0; i < argc; i++)
+	nargv[i] = strdup(argv[i]);
+
+      fsgCount++;
+    }
+
+  return MR_CONT;
+}


Property changes on: trunk/third/moira/incremental/ldap/winad.c
___________________________________________________________________
Name: svn:executable
   + *

Modified: trunk/third/moira/incremental/mailman/Makefile.in
===================================================================
--- trunk/third/moira/incremental/mailman/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/mailman/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 2009-01-05 22:25:41 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -19,4 +19,4 @@
 clean:
 
 install:
-	${INSTALL_PROGRAM} ${TARGET} ${mrbindir}
+	${INSTALL_PROGRAM} ${TARGET} $(DESTDIR)${mrbindir}

Modified: trunk/third/moira/incremental/winad/Makefile.in
===================================================================
--- trunk/third/moira/incremental/winad/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.4 2009-01-05 22:25:43 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -45,7 +45,7 @@
 depend:
 
 install:
-	$(INSTALL_PROGRAM) winad.incr $(mrbindir)
+	$(INSTALL_PROGRAM) winad.incr $(DESTDIR)$(mrbindir)
 
 winad.incr: $(WINAD_OBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDAP_LIBS) $(LDFLAGS) $(WINAD_OBJS) -lldap -llber \

Modified: trunk/third/moira/incremental/winad/gssldap-int.h
===================================================================
--- trunk/third/moira/incremental/winad/gssldap-int.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/gssldap-int.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
  * CONFIDENTIAL
- * $Id$
+ * $Id: gssldap-int.h,v 1.1 2000-06-06 04:38:34 zacheiss Exp $
  *
  * Structures for handling GSS-API binds within LDAP client
  * and server libraries. This isn't entirely SASL specific,

Modified: trunk/third/moira/incremental/winad/gssldap.h
===================================================================
--- trunk/third/moira/incremental/winad/gssldap.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/gssldap.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
  * CONFIDENTIAL
- * $Id$
+ * $Id: gssldap.h,v 1.1 2000-06-06 04:38:34 zacheiss Exp $
  *
  * Public client API for GSS-API LDAP SASL mechanism.
  */

Modified: trunk/third/moira/incremental/winad/gsssasl.h
===================================================================
--- trunk/third/moira/incremental/winad/gsssasl.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/gsssasl.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
  * CONFIDENTIAL
- * $Id$
+ * $Id: gsssasl.h,v 1.1 2000-06-06 04:38:34 zacheiss Exp $
  *
  * General GSS-API SASL (not LDAP specific) stuff.
  */

Modified: trunk/third/moira/incremental/winad/krb5_utils.c
===================================================================
--- trunk/third/moira/incremental/winad/krb5_utils.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/krb5_utils.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -42,7 +42,7 @@
                CONTEXT_SPECIFIC = 0x80, PRIVATE = 0xC0 } asn1_class;
 #endif
 
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$Id: krb5_utils.c,v 1.3 2001-04-23 02:11:22 zacheiss Exp $";
 
 asn1_error_code asn1_encode_realm(asn1buf *buf, const krb5_principal val, 
                                   int *retlen);

Modified: trunk/third/moira/incremental/winad/ldap_adgssapi_bind.c
===================================================================
--- trunk/third/moira/incremental/winad/ldap_adgssapi_bind.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/ldap_adgssapi_bind.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1998-2000 Luke Howard. All rights reserved.
  * CONFIDENTIAL
- * $Id$
+ * $Id: ldap_adgssapi_bind.c,v 1.5 2003-07-29 20:22:33 zacheiss Exp $
  *
  * Implementation of GSS-API client side binding for SASL
  */

Modified: trunk/third/moira/incremental/winad/setpw.c
===================================================================
--- trunk/third/moira/incremental/winad/setpw.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/setpw.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -99,7 +99,7 @@
 #endif
 #endif /* _WIN32 && !__CYGWIN32__ */
 
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$Id: setpw.c,v 1.8 2008-08-25 16:52:54 zacheiss Exp $";
 
 static int frequency[26][26] =
 { {4, 20, 28, 52, 2, 11, 28, 4, 32, 4, 6, 62, 23, 167, 2, 14, 0, 83, 76, 

Modified: trunk/third/moira/incremental/winad/winad.c
===================================================================
--- trunk/third/moira/incremental/winad/winad.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/incremental/winad/winad.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Header$
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/incremental/winad/winad.c,v 1.59 2009-04-05 18:55:09 zacheiss Exp $
 /* winad.incr arguments example
  *
  * arguments when moira creates the account - ignored by winad.incr since the 
@@ -2340,7 +2340,7 @@
   char      *mail_v[] = {NULL, NULL};
   char      *proxy_address_v[] = {NULL, NULL};
   char      *mail_nickname_v[] = {NULL, NULL};
-  char      *reportToOriginator_v[] = {NULL, NULL};
+  char      *report_to_originator_v[] = {NULL, NULL};
   char      *address_book_v[] = {NULL, NULL};
   char      *legacy_exchange_dn_v[] = {NULL, NULL};
   u_int     groupTypeControl;
@@ -2352,6 +2352,7 @@
   LK_ENTRY  *group_base;
   int       group_count;
   int       MailDisabled = 0;
+  char      search_filter[1024];
 
   if(UseGroupUniversal)
     groupTypeControl = ADS_GROUP_TYPE_UNIVERSAL_GROUP;
@@ -2380,12 +2381,13 @@
 	  group_count = 0;
 	  group_base = NULL;
 	  
-	  sprintf(filter, "(&(objectClass=user)(cn=%s))", after_group_name);
+	  sprintf(search_filter, "(&(objectClass=user)(cn=%s))", 
+		  after_group_name);
 	  attr_array[0] = "cn";
 	  attr_array[1] = NULL;
 
-	  if ((rc = linklist_build(ldap_handle, dn_path, filter, attr_array,
-				   &group_base, &group_count,
+	  if ((rc = linklist_build(ldap_handle, dn_path, search_filter, 
+				   attr_array, &group_base, &group_count,
 				   LDAP_SCOPE_SUBTREE)) != 0)
 	  {
 	    com_err(whoami, 0, "Unable to process group %s : %s",
@@ -2513,9 +2515,13 @@
 	  mail_nickname_v[0] = mail_nickname;
 	  proxy_address_v[0] = proxy_address;
 	  mail_v[0] = mail;
+	  report_to_originator_v[0] = "TRUE";
+
 	  ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
 	  ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
 	  ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		   LDAP_MOD_REPLACE);
 	} 
       else 
 	{
@@ -2524,12 +2530,15 @@
 	  mail_v[0] = NULL;
 	  legacy_exchange_dn_v[0] = NULL;
 	  address_book_v[0] = NULL;
+	  report_to_originator_v[0] = NULL;
 
 	  ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
 	  ADD_ATTR("mail", mail_v, LDAP_MOD_REPLACE);
 	  ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
 	  ADD_ATTR("legacyExchangeDN", legacy_exchange_dn_v, LDAP_MOD_REPLACE);
 	  ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
+	  ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		   LDAP_MOD_REPLACE);
 	}
     }
   else
@@ -2583,7 +2592,7 @@
   char *mail_v[] = {NULL, NULL};
   char *proxy_address_v[] = {NULL, NULL};
   char *mail_nickname_v[] = {NULL, NULL};
-  char *reportToOriginator_v[] = {NULL, NULL};
+  char *report_to_originator_v[] = {NULL, NULL};
   char *address_book_v[] = {NULL, NULL};
   char *legacy_exchange_dn_v[] = {NULL, NULL};
   char groupTypeControlStr[80];
@@ -2687,7 +2696,11 @@
 	  if(atoi(av[L_MAILLIST]) && !MailDisabled && email_isvalid(mail)) 
 	    {
 	      mail_nickname_v[0] = mail_nickname;
+	      report_to_originator_v[0] = "TRUE";
+
 	      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_ADD);
+	      ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		       LDAP_MOD_ADD);
 	    }
 	}
       else
@@ -2794,7 +2807,11 @@
 	  if (atoi(av[L_MAILLIST]) && !MailDisabled && email_isvalid(mail)) 
 	    {
 	      mail_nickname_v[0] = mail_nickname;
+	      report_to_originator_v[0] = "TRUE";
+
 	      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
+	      ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		       LDAP_MOD_REPLACE);
 	    } 
 	  else 
 	    {
@@ -2803,6 +2820,7 @@
 	      proxy_address_v[0] = NULL;
 	      legacy_exchange_dn_v[0] = NULL;
 	      address_book_v[0] = NULL;
+	      report_to_originator_v[0] = NULL;
 
 	      ADD_ATTR("mailNickName", mail_nickname_v, LDAP_MOD_REPLACE);
 	      ADD_ATTR("proxyAddresses", proxy_address_v, LDAP_MOD_REPLACE);
@@ -2810,6 +2828,8 @@
 	      ADD_ATTR("legacyExchangeDN", legacy_exchange_dn_v, 
 		       LDAP_MOD_REPLACE);
 	      ADD_ATTR("showInAddressBook", address_book_v, LDAP_MOD_REPLACE);
+	      ADD_ATTR("reportToOriginator", report_to_originator_v, 
+		       LDAP_MOD_REPLACE);
 	    }
 	}
       else
@@ -3757,7 +3777,9 @@
 
   if (Exchange)
     {
-      if ((rc != LDAP_SUCCESS) && (rc == LDAP_ALREADY_EXISTS)) 
+
+      if ((rc != LDAP_SUCCESS) && (rc == LDAP_ALREADY_EXISTS) &&
+	  !strcmp(group_ou, contact_ou) && email_isvalid(mail))
 	{
 	  n = 0;
 	  
@@ -7826,7 +7848,8 @@
       gPtr = group_base;
       
       while(gPtr) {
-	if ((s = strstr(gPtr->dn, "Public")) != (char *) NULL)
+	if (((s = strstr(gPtr->dn, "Public")) != (char *) NULL) ||
+	    ((s = strstr(gPtr->dn, "Recovery")) != (char *) NULL))
 	  {
 	    gPtr = gPtr->next;
 	    continue;

Modified: trunk/third/moira/lib/Makefile.in
===================================================================
--- trunk/third/moira/lib/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.5 2000-01-28 00:03:28 danw Exp $
 
 SHELL=/bin/sh
 

Modified: trunk/third/moira/lib/critical.c
===================================================================
--- trunk/third/moira/lib/critical.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/critical.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: critical.c,v 1.21 2000-09-21 07:36:40 zacheiss Exp $
  *
  * Log and send a zephyrgram about any critical errors.
  *
@@ -28,7 +28,7 @@
 #endif
 #include <time.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/critical.c,v 1.21 2000-09-21 07:36:40 zacheiss Exp $");
 
 /* mode to create the file with */
 #define LOGFILEMODE	0644

Modified: trunk/third/moira/lib/fixhost.c
===================================================================
--- trunk/third/moira/lib/fixhost.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/fixhost.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: fixhost.c,v 1.23 2000-03-15 22:44:18 rbasch Exp $
  *
  * Canonicalize a hostname
  *
@@ -27,7 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/fixhost.c,v 1.23 2000-03-15 22:44:18 rbasch Exp $");
 
 static struct hostent *local_gethostbyname(void)
 {

Modified: trunk/third/moira/lib/fixname.c
===================================================================
--- trunk/third/moira/lib/fixname.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/fixname.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: fixname.c,v 1.16 2004-02-15 01:54:32 zacheiss Exp $
  *
  * Put a name into Moira-canonical form
  *
@@ -13,7 +13,7 @@
 #include <ctype.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/fixname.c,v 1.16 2004-02-15 01:54:32 zacheiss Exp $");
 
 #define LAST_LEN		100
 #define FIRST_LEN		100

Modified: trunk/third/moira/lib/hash.c
===================================================================
--- trunk/third/moira/lib/hash.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/hash.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: hash.c,v 1.15 1998-02-08 19:31:17 danw Exp $
  *
  * Generic hash table routines.  Uses integer keys to store char * values.
  *
@@ -13,7 +13,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/hash.c,v 1.15 1998-02-08 19:31:17 danw Exp $");
 
 #define hash_func(h, key) (key >= 0 ? (key % h->size) : (-key % h->size))
 

Modified: trunk/third/moira/lib/kname_unparse.c
===================================================================
--- trunk/third/moira/lib/kname_unparse.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/kname_unparse.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: kname_unparse.c,v 1.5 2004-07-20 06:47:46 zacheiss Exp $
  *
  * Don't know why this function is not in libkrb.a.  It's the inverse
  * of kname_parse() which is there.
@@ -16,7 +16,7 @@
 #include <des.h>
 #include <krb.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/kname_unparse.c,v 1.5 2004-07-20 06:47:46 zacheiss Exp $");
 
 /* Turn a principal, instance, realm triple into a single non-ambiguous
  * string.  This is the inverse of kname_parse().  It returns a pointer

Modified: trunk/third/moira/lib/mr_access.c
===================================================================
--- trunk/third/moira/lib/mr_access.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_access.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_access.c,v 1.14 1998-02-15 17:49:00 danw Exp $
  *
  * Check access to a Moira query
  *
@@ -15,7 +15,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/mr_access.c,v 1.14 1998-02-15 17:49:00 danw Exp $");
 
 /*
  * Check access to a named query.

Modified: trunk/third/moira/lib/mr_auth.c
===================================================================
--- trunk/third/moira/lib/mr_auth.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_auth.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_auth.c,v 1.28 2007-07-25 15:38:48 zacheiss Exp $
  *
  * Handles the client side of the sending of authenticators to the moira server
  *
@@ -21,7 +21,7 @@
 krb5_context context = NULL;
 krb5_auth_context auth_con = NULL;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/mr_auth.c,v 1.28 2007-07-25 15:38:48 zacheiss Exp $");
 
 /* Authenticate this client with the Moira server.  prog is the name of the
  * client program, and will be recorded in the database.

Modified: trunk/third/moira/lib/mr_call.c
===================================================================
--- trunk/third/moira/lib/mr_call.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_call.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_call.c,v 1.18 2000-03-15 22:44:19 rbasch Exp $
  *
  * Pass an mr_params off to the Moira server and get a reply
  *
@@ -22,7 +22,7 @@
 #include <unistd.h>
 #endif
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/mr_call.c,v 1.18 2000-03-15 22:44:19 rbasch Exp $");
 
 /* Moira RPC format:
 

Modified: trunk/third/moira/lib/mr_connect.c
===================================================================
--- trunk/third/moira/lib/mr_connect.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_connect.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_connect.c,v 1.37 2006-09-07 18:21:48 zacheiss Exp $
  *
  * This routine is part of the client library.  It handles
  * creating a connection to the moira server.
@@ -45,7 +45,7 @@
 #endif
 #endif
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/mr_connect.c,v 1.37 2006-09-07 18:21:48 zacheiss Exp $");
 
 #define DEFAULT_SERV "moira_db"
 #define DEFAULT_PORT 775

Modified: trunk/third/moira/lib/mr_et.et
===================================================================
--- trunk/third/moira/lib/mr_et.et	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_et.et	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: mr_et.et,v 1.31 2008-05-16 16:50:33 zacheiss Exp $
 	error_table sms
 
 ec	MR_NOT_CONNECTED,

Modified: trunk/third/moira/lib/mr_init.c
===================================================================
--- trunk/third/moira/lib/mr_init.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_init.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_init.c,v 1.12 2000-01-28 00:03:30 danw Exp $
  *
  * Initialize libmoira
  *
@@ -11,7 +11,7 @@
 #include <moira.h>
 #include "mr_private.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/mr_init.c,v 1.12 2000-01-28 00:03:30 danw Exp $");
 
 int mr_inited = 0;
 

Modified: trunk/third/moira/lib/mr_ops.c
===================================================================
--- trunk/third/moira/lib/mr_ops.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_ops.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_ops.c,v 1.17 1999-12-30 17:29:24 danw Exp $
  *
  * This routine is part of the client library.  It handles
  * the protocol operations: invoking an update and getting the
@@ -18,7 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/mr_ops.c,v 1.17 1999-12-30 17:29:24 danw Exp $");
 
 /* Invoke a DCM update. */
 

Modified: trunk/third/moira/lib/mr_private.h
===================================================================
--- trunk/third/moira/lib/mr_private.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_private.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_private.h,v 1.13 2000-03-15 22:44:20 rbasch Exp $
  *
  * Private declarations of the Moira library.
  *

Modified: trunk/third/moira/lib/mr_query.c
===================================================================
--- trunk/third/moira/lib/mr_query.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/mr_query.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_query.c,v 1.18 1998-02-19 21:22:25 danw Exp $
  *
  * Perform a Moira query
  *
@@ -16,7 +16,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/mr_query.c,v 1.18 1998-02-19 21:22:25 danw Exp $");
 
 /*
  * This routine is the primary external interface to the mr library.

Modified: trunk/third/moira/lib/nfsparttype.c
===================================================================
--- trunk/third/moira/lib/nfsparttype.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/nfsparttype.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: nfsparttype.c,v 1.10 1998-02-08 19:31:22 danw Exp $
  *
  * Deal with NFS partition types
  *
@@ -15,7 +15,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/nfsparttype.c,v 1.10 1998-02-08 19:31:22 danw Exp $");
 
 struct pair {
   int type;

Modified: trunk/third/moira/lib/sq.c
===================================================================
--- trunk/third/moira/lib/sq.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/sq.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: sq.c,v 1.14 1999-07-12 16:26:22 danw Exp $
  *
  * Generic Queue Routines
  *
@@ -13,7 +13,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/sq.c,v 1.14 1999-07-12 16:26:22 danw Exp $");
 
 struct save_queue *sq_create(void)
 {

Modified: trunk/third/moira/lib/strs.c
===================================================================
--- trunk/third/moira/lib/strs.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/lib/strs.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: strs.c,v 1.18 1999-10-06 03:04:02 danw Exp $
  *
  * Miscellaneous string functions.
  *
@@ -12,7 +12,7 @@
 
 #include <ctype.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/lib/strs.c,v 1.18 1999-10-06 03:04:02 danw Exp $");
 
 /*
  * Trim whitespace off both ends of a string.

Modified: trunk/third/moira/man/Makefile.in
===================================================================
--- trunk/third/moira/man/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.8 2009-01-05 22:25:44 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -32,6 +32,7 @@
 depend:
 
 install:
-	for m in $(MAN1); do $(INSTALL_DATA) $(srcdir)/$$m $(mandir)/man1; done
-	for m in $(MAN3); do $(INSTALL_DATA) $(srcdir)/$$m $(mandir)/man3; done
-	for m in $(MAN8); do $(INSTALL_DATA) $(srcdir)/$$m $(mandir)/man8; done
+	$(srcdir)/../mkinstalldirs $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man3 $(DESTDIR)$(mandir)/man8
+	for m in $(MAN1); do $(INSTALL_DATA) $(srcdir)/$$m $(DESTDIR)$(mandir)/man1; done
+	for m in $(MAN3); do $(INSTALL_DATA) $(srcdir)/$$m $(DESTDIR)$(mandir)/man3; done
+	for m in $(MAN8); do $(INSTALL_DATA) $(srcdir)/$$m $(DESTDIR)$(mandir)/man8; done

Modified: trunk/third/moira/man/addusr.1
===================================================================
--- trunk/third/moira/man/addusr.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/addusr.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH ADDUSR 1 "29 Nov 2007" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/addusr.1,v 1.8 2009-03-31 19:13:16 zacheiss Exp $
 .SH NAME
 addusr \- add and/or register users in Moira
 .SH SYNOPSIS
@@ -51,8 +51,8 @@
 .IP \fB-shell\ \fIshell\ \fRor\ \fB-h\ \fIshell\fR:
 This specifies the login shell that will be stored for all users added
 in this invocation.  If not specified, a default will be used.  At MIT
-Athena the default is \fI/bin/athena/tcsh\fR, elsewhere it is likely to be 
-\fI/bin/csh\fR.
+Athena the default is \fI/bin/athena/bash\fR, elsewhere it is likely to be 
+\fI/bin/bash\fR.
 .IP \fB-winshell\ \fIshell\ \fRor\ \fB-w\ \fIshell\fR:
 This specifies the Windows console shell that will be used for all users
 added in this invocation.  If not specified, a default value of

Modified: trunk/third/moira/man/blanche.1
===================================================================
--- trunk/third/moira/man/blanche.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/blanche.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH BLANCHE 1 "14 Sep 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/blanche.1,v 1.16 2002-06-17 18:47:12 zacheiss Exp $
 .SH NAME
 blanche \- examine and modify memberships in Moira lists
 .SH SYNOPSIS

Modified: trunk/third/moira/man/chfn.1
===================================================================
--- trunk/third/moira/man/chfn.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/chfn.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH CHFN 1 "1 Feb 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/chfn.1,v 1.7 1998-05-26 18:14:10 danw Exp $
 .SH NAME
 chfn \- change finger information
 .SH SYNOPSIS

Modified: trunk/third/moira/man/chpobox.1
===================================================================
--- trunk/third/moira/man/chpobox.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/chpobox.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH CHPOBOX 1 "5 Feb 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/chpobox.1,v 1.9 2001-03-05 16:27:58 zacheiss Exp $
 .SH NAME
 chpobox \- change address at which user receives mail
 .SH SYNOPSIS

Modified: trunk/third/moira/man/chsh.1
===================================================================
--- trunk/third/moira/man/chsh.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/chsh.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH CHSH 1 "1 Feb 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/chsh.1,v 1.7 2000-05-21 03:50:33 zacheiss Exp $
 .SH NAME
 chsh \- change user login shell
 .SH SYNOPSIS

Modified: trunk/third/moira/man/dcm.8
===================================================================
--- trunk/third/moira/man/dcm.8	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/dcm.8	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH DCM 8 "30 Nov 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/dcm.8,v 1.8 1998-05-26 18:14:11 danw Exp $
 .SH NAME
 dcm, startdcm \- build config files from Moira database and update servers
 .SH SYNOPSIS

Modified: trunk/third/moira/man/mailmaint.1
===================================================================
--- trunk/third/moira/man/mailmaint.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/mailmaint.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH MAILMAINT 1 "27 Apr 1994" "MIT Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/mailmaint.1,v 1.5 1994-04-27 14:10:20 jweiss Exp $
 .SH NAME
 mailmaint \- maintain mailing lists for a user
 .SH SYNOPSIS

Modified: trunk/third/moira/man/mitch.1
===================================================================
--- trunk/third/moira/man/mitch.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/mitch.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH MITCH 1 "22 Jan 2003" "MIT Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/mitch.1,v 1.2 2003-02-05 18:42:51 zacheiss Exp $
 .SH NAME
 mitch \- examine and modify informtion about containers in Moira
 .SH SYNOPSIS

Modified: trunk/third/moira/man/moira.1
===================================================================
--- trunk/third/moira/man/moira.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/moira.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH MOIRA 1 "29 Nov 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/moira.1,v 1.8 1998-01-07 17:09:39 danw Exp $
 .SH NAME
 moira, listmaint, usermaint, dcmmaint \- maintain information stored in moira
 .SH SYNOPSIS

Modified: trunk/third/moira/man/moirad.8
===================================================================
--- trunk/third/moira/man/moirad.8	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/moirad.8	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH MOIRAD 8 "30 Nov 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/moirad.8,v 1.7 1998-05-26 18:14:12 danw Exp $
 .SH NAME
 moirad, startmoira \- Moira query daemon
 .SH SYNOPSIS

Modified: trunk/third/moira/man/mrcheck.1
===================================================================
--- trunk/third/moira/man/mrcheck.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/mrcheck.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH MRCHECK 1 "7 Feb 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/mrcheck.1,v 1.6 1998-01-07 17:10:07 danw Exp $
 .UC 4
 .SH NAME
 mrcheck \- verify that Moira updates are successful

Modified: trunk/third/moira/man/mrtest.8
===================================================================
--- trunk/third/moira/man/mrtest.8	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/mrtest.8	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH MRTEST 8 "25 Jan 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/mrtest.8,v 1.9 1998-05-26 18:14:13 danw Exp $
 .SH NAME
 mrtest \- perform Moira operations manually
 .SH SYNOPSIS

Modified: trunk/third/moira/man/reg_svr.8
===================================================================
--- trunk/third/moira/man/reg_svr.8	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/reg_svr.8	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH REG_SVR 8 "30 Nov 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/reg_svr.8,v 1.7 1998-05-26 18:14:14 danw Exp $
 .SH NAME
 reg_svr, startreg \- Moira user account registration server
 .SH SYNOPSIS

Modified: trunk/third/moira/man/setquota.8
===================================================================
--- trunk/third/moira/man/setquota.8	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/setquota.8	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH SETQUOTA 8 "23 Jan 1989" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/setquota.8,v 1.2 1990-01-26 20:44:35 jnrees Exp $
 .UC 4
 .SH NAME
 setquota \- set the disk usage quotas for a given user and partition

Modified: trunk/third/moira/man/stanley.1
===================================================================
--- trunk/third/moira/man/stanley.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/stanley.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH STANLEY 1 "25 Sep 2001" "MIT Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/stanley.1,v 1.5 2007-11-29 22:17:58 zacheiss Exp $
 .SH NAME
 stanley \- examine and modify information about users in Moira
 .SH SYNOPSIS

Modified: trunk/third/moira/man/stella.1
===================================================================
--- trunk/third/moira/man/stella.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/stella.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH STELLA 1 "10 Feb 2000" "MIT Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/stella.1,v 1.7 2001-09-13 02:32:21 zacheiss Exp $
 .SH NAME
 stella \- examine and modify information about hosts in Moira
 .SH SYNOPSIS

Modified: trunk/third/moira/man/update_server.8
===================================================================
--- trunk/third/moira/man/update_server.8	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/update_server.8	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH UPDATE_SERVER 8 "30 Nov 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/update_server.8,v 1.4 1993-10-21 14:39:09 mar Exp $
 .SH NAME
 update_server \- daemon that accepts config files from Moira
 .SH SYNOPSIS

Modified: trunk/third/moira/man/userreg.1
===================================================================
--- trunk/third/moira/man/userreg.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/man/userreg.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 .TH USERREG 1 "30 Nov 1988" "Project Athena"
-\" RCSID: $Header$
+\" RCSID: $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/man/userreg.1,v 1.3 1990-03-19 12:45:22 mar Exp $
 .SH NAME
 userreg \- create an account for a person known to Moira
 .SH SYNOPSIS

Modified: trunk/third/moira/mkinstalldirs
===================================================================
--- trunk/third/moira/mkinstalldirs	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/mkinstalldirs	2009-04-12 18:05:09 UTC (rev 23740)
@@ -4,7 +4,7 @@
 # Created: 1993-05-16
 # Public domain
 
-# $Id$
+# $Id: mkinstalldirs,v 1.1 1998-05-26 18:13:25 danw Exp $
 
 errstatus=0
 

Modified: trunk/third/moira/reg_svr/Makefile.in
===================================================================
--- trunk/third/moira/reg_svr/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.13 2009-01-05 22:25:46 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -56,10 +56,10 @@
 depend: $(CFILES)
 
 install:
-	$(INSTALL_PROGRAM) reg_svr $(mrbindir)
-	$(INSTALL_PROGRAM) startreg $(mrbindir)
-	$(INSTALL_PROGRAM) genkey $(mrbindir)
-	$(INSTALL_PROGRAM) genwords $(mrbindir)
+	$(INSTALL_PROGRAM) reg_svr $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) startreg $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) genkey $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) genwords $(DESTDIR)$(mrbindir)
 
 reg_svr: $(REG_OBJS) $(MR_LIBDEP) $(RSAREF_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(REG_OBJS) $(LIBS) $(SQL_LIBS)

Modified: trunk/third/moira/reg_svr/coupons/INSTRUCTIONS
===================================================================
--- trunk/third/moira/reg_svr/coupons/INSTRUCTIONS	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/coupons/INSTRUCTIONS	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-$Id$
+$Id: INSTRUCTIONS,v 1.2 2000-08-28 20:15:54 zacheiss Exp $
 
 The executables are in /moira/bin/ on the moira server, with sources in
 /mit/moiradev/src/reg_svr/.  Most of the commands are run on the Moira

Modified: trunk/third/moira/reg_svr/genkey.c
===================================================================
--- trunk/third/moira/reg_svr/genkey.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/genkey.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: genkey.c,v 1.1 1998-07-22 14:55:24 danw Exp $
  *
  * Utility program to generate a public/private key pair
  *
@@ -25,7 +25,7 @@
 #include "global.h"
 #include "rsaref.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/genkey.c,v 1.1 1998-07-22 14:55:24 danw Exp $");
 
 void printhex(FILE *out, unsigned char *buf, int len);
 

Modified: trunk/third/moira/reg_svr/genwords.pc
===================================================================
--- trunk/third/moira/reg_svr/genwords.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/genwords.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: genwords.pc,v 1.2 2000-08-25 23:38:35 zacheiss Exp $
  *
  * Utility program to generate magic words for a given ID
  *
@@ -18,7 +18,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/genwords.pc,v 1.2 2000-08-25 23:38:35 zacheiss Exp $");
 
 int main(int argc, char **argv)
 {

Modified: trunk/third/moira/reg_svr/kerberos.c
===================================================================
--- trunk/third/moira/reg_svr/kerberos.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/kerberos.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: kerberos.c,v 1.8 2005-08-09 19:45:27 zacheiss Exp $
  *
  * Kerberos routines for registration server
  *
@@ -39,7 +39,7 @@
 krb5_context context;
 #endif
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/kerberos.c,v 1.8 2005-08-09 19:45:27 zacheiss Exp $");
 
 extern char *hostname, *shorthostname;
 

Modified: trunk/third/moira/reg_svr/protocol.c
===================================================================
--- trunk/third/moira/reg_svr/protocol.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/protocol.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: protocol.c,v 1.4 2005-06-29 06:39:35 zacheiss Exp $
  *
  * Reg_svr protocol and encryption/decryption routines
  *
@@ -28,7 +28,7 @@
 #include "global.h"
 #include "rsaref.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/protocol.c,v 1.4 2005-06-29 06:39:35 zacheiss Exp $");
 
 R_RSA_PRIVATE_KEY *rsa_key;
 char *emsg[NUM_REG_ERRORS], *ename[NUM_REG_ERRORS];

Modified: trunk/third/moira/reg_svr/reg_svr.pc
===================================================================
--- trunk/third/moira/reg_svr/reg_svr.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/reg_svr.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: reg_svr.pc,v 1.22 2009-04-09 20:25:54 zacheiss Exp $
  *
  * Server for user registration with Moira and Kerberos.
  *
@@ -37,7 +37,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/reg_svr.pc,v 1.22 2009-04-09 20:25:54 zacheiss Exp $");
 
 char *whoami, *hostname, *shorthostname;
 
@@ -788,6 +788,9 @@
 /* Register a user in Moira */
 int register_user(int uid, char *username)
 {
+  EXEC SQL BEGIN DECLARE SECTION;
+  char class[USERS_TYPE_SIZE];
+  EXEC SQL END DECLARE SECTION;
   char uidbuf[10], *qargv[3], *motd = NULL;
   long status;
 
@@ -816,10 +819,28 @@
       return MR_INTERNAL;
     }
 
+  EXEC SQL SELECT type INTO :class FROM users WHERE unix_uid = :uid;
+
   sprintf(uidbuf, "%d", uid);
   qargv[0] = uidbuf;
   qargv[1] = username;
-  qargv[2] = "IMAP";
+
+  /* Incoming students should be given Exchange poboxes.
+   * Doesn't work for undergrads in the class of 2100 or higher.
+   */ 
+  if (!strcmp(strtrim(class), "G") || !strncmp(class, "FALL", 4) ||
+      !strncmp(class, "SPRING", 5) || !strncmp(class, "SUMMER", 6) ||
+      !strncmp(class, "20", 2))
+    {
+      com_err(whoami, 0, "assigning EXCHANGE pobox to user %s, class %s", username, class);
+      qargv[2] = "EXCHANGE";
+    }
+  else 
+    {
+      com_err(whoami, 0, "assigning IMAP pobox to user %s, class %s", username, class);
+      qargv[2] = "IMAP";
+    }
+
   status = mr_query("register_user", 3, qargv, NULL, NULL);
   mr_disconnect();
   return status;
@@ -985,6 +1006,13 @@
   if (count != 0)
     return MR_IN_USE;
 
+  EXEC SQL SELECT COUNT(login) INTO :count FROM userhistory
+    WHERE login = :username;
+  if (sqlca.sqlcode)
+    return MR_DBMS_ERR;
+  if (count != 0)
+    return MR_IN_USE;
+
   return MR_SUCCESS;
 }
 

Modified: trunk/third/moira/reg_svr/startreg.c
===================================================================
--- trunk/third/moira/reg_svr/startreg.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/startreg.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: startreg.c,v 1.12 1998-02-05 22:51:35 danw Exp $
  *
  * This program starts the user registration server
  * in a "clean" environment, and then waits for it to exit.
@@ -22,7 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/startreg.c,v 1.12 1998-02-05 22:51:35 danw Exp $");
 
 #define PROG	"reg_svr"
 

Modified: trunk/third/moira/reg_svr/words.c
===================================================================
--- trunk/third/moira/reg_svr/words.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/reg_svr/words.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: words.c,v 1.1 1998-07-22 14:55:28 danw Exp $
  *
  * 6 Magic Words generation
  *
@@ -24,7 +24,7 @@
 #include "global.h"
 #include "rsaref.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/reg_svr/words.c,v 1.1 1998-07-22 14:55:28 danw Exp $");
 
 /* One-Time Password dictionary, as specified by RFC 1938 */
 

Modified: trunk/third/moira/regtape/Makefile.in
===================================================================
--- trunk/third/moira/regtape/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/regtape/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.13 2009-01-05 22:25:47 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -55,8 +55,8 @@
 depend: $(CFILES)
 
 install:
-	@set -x; for p in $(TARGET); do $(INSTALL_PROGRAM) $$p $(mrbindir); done
-	@set -x; for p in $(SCRIPTS); do $(INSTALL_PROGRAM) $$p $(mrbindir); done
+	@set -x; for p in $(TARGET); do $(INSTALL_PROGRAM) $$p $(DESTDIR)$(mrbindir); done
+	@set -x; for p in $(SCRIPTS); do $(INSTALL_PROGRAM) $$p $(DESTDIR)$(mrbindir); done
 student: $(STUDENT_OBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(STUDENT_OBJS) $(SQL_LIBS) $(LIBS)
 

Modified: trunk/third/moira/regtape/common.h
===================================================================
--- trunk/third/moira/regtape/common.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/regtape/common.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: common.h,v 1.1 2000-07-12 22:11:41 zacheiss Exp $
  *
  * Copyright (C) 1987-1999 by the Massachusetts Institute of Technology
  *

Modified: trunk/third/moira/regtape/common.pc
===================================================================
--- trunk/third/moira/regtape/common.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/regtape/common.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: common.pc,v 1.12 2009-03-31 19:13:20 zacheiss Exp $
  *
  * Staff/Student load common code
  *
@@ -19,7 +19,7 @@
 EXEC SQL INCLUDE sqlca;
 extern void sqlglm(char *, unsigned int *, unsigned int *);
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/regtape/common.pc,v 1.12 2009-03-31 19:13:20 zacheiss Exp $");
 
 EXEC SQL BEGIN DECLARE SECTION;
 extern char *prog;
@@ -282,7 +282,7 @@
      fmodby, fmodwith, potype, pmodtime, pmodby, pmodwith,
      xname, xdept, xtitle, xaddress, xphone1, xphone2, xmodtime, secure,
      created, creator, winhomedir, winprofiledir, sponsor_type, sponsor_id, expiration)
-    VALUES (:login, :users_id, :uid, '/bin/athena/tcsh', 'cmd',
+    VALUES (:login, :users_id, :uid, '/bin/athena/bash', 'cmd',
 	    NVL(:last, CHR(0)), NVL(:first, CHR(0)), NVL(:middle, CHR(0)),
 	    :st, NVL(:id, CHR(0)), NVL(:type, CHR(0)), SYSDATE, :who, :prog,
 	    NVL(:name, CHR(0)), NVL(:dept, CHR(0)), NVL(:haddr, CHR(0)),

Modified: trunk/third/moira/regtape/grouper.pl
===================================================================
--- trunk/third/moira/regtape/grouper.pl	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/regtape/grouper.pl	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,5 +1,5 @@
 #!/moira/bin/perl -Tw
-# $Id$
+# $Id: grouper.pl,v 1.10 2003-09-08 03:25:21 zacheiss Exp $
 
 die "Usage: $0 password\n" unless ($#ARGV == 0);
 $whpassword = $ARGV[0];

Modified: trunk/third/moira/regtape/staff.pc
===================================================================
--- trunk/third/moira/regtape/staff.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/regtape/staff.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: staff.pc,v 1.9 2008-03-31 21:00:43 zacheiss Exp $
  *
  * Load data into Moira from Personnel Office data file
  *
@@ -19,7 +19,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/regtape/staff.pc,v 1.9 2008-03-31 21:00:43 zacheiss Exp $");
 
 /* File format is:
  *

Modified: trunk/third/moira/regtape/student.pc
===================================================================
--- trunk/third/moira/regtape/student.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/regtape/student.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: student.pc,v 1.5 2001-06-13 05:40:08 zacheiss Exp $
  *
  * Load data into Moira from Registrar's Office data file
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/regtape/student.pc,v 1.5 2001-06-13 05:40:08 zacheiss Exp $");
 
 /* File format is:
 

Modified: trunk/third/moira/regtape/vote.pc
===================================================================
--- trunk/third/moira/regtape/vote.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/regtape/vote.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: vote.pc,v 1.3 1998-02-05 22:51:39 danw Exp $
  *
  * Copyright (C) 1993-1998 by the Massachusetts Institute of Technology
  * For copying and distribution information, please see the file
@@ -15,7 +15,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/regtape/vote.pc,v 1.3 1998-02-05 22:51:39 danw Exp $");
 
 struct entry {
   char *line;

Modified: trunk/third/moira/server/Makefile.in
===================================================================
--- trunk/third/moira/server/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 2.9 2009-01-05 22:25:48 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -56,8 +56,8 @@
 depend: $(CFILES)
 
 install:
-	$(INSTALL_PROGRAM) moirad $(mrbindir)
-	$(INSTALL_PROGRAM) startmoira $(mrbindir)
+	$(INSTALL_PROGRAM) moirad $(DESTDIR)$(mrbindir)
+	$(INSTALL_PROGRAM) startmoira $(DESTDIR)$(mrbindir)
 
 moirad: $(SERVER_OBJS) $(SCHEMA_OBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(SERVER_OBJS) $(SCHEMA_OBJS) $(SQL_LIBS) $(LIBS)

Modified: trunk/third/moira/server/increment.pc
===================================================================
--- trunk/third/moira/server/increment.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/increment.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: increment.pc,v 2.21 2008-08-22 17:49:12 zacheiss Exp $
  *
  * Deal with incremental updates
  *
@@ -20,7 +20,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/increment.pc,v 2.21 2008-08-22 17:49:12 zacheiss Exp $");
 
 extern char *whoami;
 extern char *table_name[];

Modified: trunk/third/moira/server/mr_main.c
===================================================================
--- trunk/third/moira/server/mr_main.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/mr_main.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_main.c,v 1.54 2006-08-22 17:36:26 zacheiss Exp $
  *
  * Moira server process.
  *
@@ -31,7 +31,7 @@
 #include <krb.h>
 #include <krb5.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/mr_main.c,v 1.54 2006-08-22 17:36:26 zacheiss Exp $");
 
 client *cur_client;
 

Modified: trunk/third/moira/server/mr_sauth.c
===================================================================
--- trunk/third/moira/server/mr_sauth.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/mr_sauth.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_sauth.c,v 1.32 2007-05-08 16:25:28 zacheiss Exp $
  *
  * Handle server side of authentication
  *
@@ -19,7 +19,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/mr_sauth.c,v 1.32 2007-05-08 16:25:28 zacheiss Exp $");
 
 extern char *whoami, *host;
 extern int proxy_acl;

Modified: trunk/third/moira/server/mr_scall.c
===================================================================
--- trunk/third/moira/server/mr_scall.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/mr_scall.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_scall.c,v 1.39 2006-08-22 17:36:26 zacheiss Exp $
  *
  * Do RPC
  *
@@ -24,7 +24,7 @@
 #include <string.h>
 #include <unistd.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/mr_scall.c,v 1.39 2006-08-22 17:36:26 zacheiss Exp $");
 
 extern int nclients;
 extern client **clients;

Modified: trunk/third/moira/server/mr_server.h
===================================================================
--- trunk/third/moira/server/mr_server.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/mr_server.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_server.h,v 1.67 2008-09-30 18:42:42 zacheiss Exp $
  *
  * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
  * For copying and distribution information, please see the file
@@ -254,6 +254,7 @@
 int setup_dcon(struct query *q, char *argv[], client *cl);
 int setup_acon(struct query *q, char *argv[], client *cl);
 int setup_scli(struct query *q, char *argv[], client *cl);
+int setup_aali(struct query *q, char *argv[], client *cl);
 
 /* prototypes from qsupport.pc */
 int set_pobox(struct query *q, char *argv[], client *cl);

Modified: trunk/third/moira/server/mr_shutdown.c
===================================================================
--- trunk/third/moira/server/mr_shutdown.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/mr_shutdown.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_shutdown.c,v 1.11 1998-02-15 17:49:15 danw Exp $
  *
  * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
  * For copying and distribution information, please see the file
@@ -10,7 +10,7 @@
 
 #include <errno.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/mr_shutdown.c,v 1.11 1998-02-15 17:49:15 danw Exp $");
 
 extern char *takedown;
 extern char *whoami;

Modified: trunk/third/moira/server/mr_util.c
===================================================================
--- trunk/third/moira/server/mr_util.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/mr_util.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: mr_util.c,v 1.33 2004-02-15 01:54:58 zacheiss Exp $
  *
  * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
  * For copying and distribution information, please see the file
@@ -13,7 +13,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/mr_util.c,v 1.33 2004-02-15 01:54:58 zacheiss Exp $");
 
 extern char *whoami;
 

Modified: trunk/third/moira/server/qaccess.pc
===================================================================
--- trunk/third/moira/server/qaccess.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qaccess.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: qaccess.pc,v 2.36 2008-08-29 14:50:07 zacheiss Exp $
  *
  * Check access to queries
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qaccess.pc,v 2.36 2008-08-29 14:50:07 zacheiss Exp $");
 
 extern char *whoami;
 extern int dbms_errno, mr_errcode;

Modified: trunk/third/moira/server/qfollow.pc
===================================================================
--- trunk/third/moira/server/qfollow.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qfollow.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: qfollow.pc,v 2.31 2008-08-29 14:50:07 zacheiss Exp $
  *
  * Query followup routines
  *
@@ -20,7 +20,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qfollow.pc,v 2.31 2008-08-29 14:50:07 zacheiss Exp $");
 
 extern char *whoami, *table_name[];
 extern int dbms_errno, mr_errcode;

Modified: trunk/third/moira/server/qrtn.h
===================================================================
--- trunk/third/moira/server/qrtn.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qrtn.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Header$
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qrtn.h,v 1.6 2000-01-28 00:03:36 danw Exp $
  *
  *  Used by the SQL query routines of the Moira server.
  */

Modified: trunk/third/moira/server/qrtn.pc
===================================================================
--- trunk/third/moira/server/qrtn.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qrtn.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: qrtn.pc,v 2.29 2008-08-29 14:50:07 zacheiss Exp $
  *
  * Query-processing routines
  *
@@ -20,7 +20,7 @@
 EXEC SQL INCLUDE sqlca;  /* SQL Communications Area */
 EXEC SQL INCLUDE sqlda;  /* SQL Descriptor Area */
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qrtn.pc,v 2.29 2008-08-29 14:50:07 zacheiss Exp $");
 
 SQLDA *mr_sqlda;
 EXEC SQL BEGIN DECLARE SECTION;

Modified: trunk/third/moira/server/qsetup.pc
===================================================================
--- trunk/third/moira/server/qsetup.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qsetup.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: qsetup.pc,v 2.62 2009-01-12 21:39:29 zacheiss Exp $
  *
  * Query setup routines
  *
@@ -21,7 +21,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qsetup.pc,v 2.62 2009-01-12 21:39:29 zacheiss Exp $");
 
 extern char *whoami;
 extern int dbms_errno, mr_errcode;
@@ -1579,6 +1579,27 @@
     return 1;
 }
 
+int setup_aali(struct query *q, char *argv[], client *cl)
+{
+  EXEC SQL BEGIN DECLARE SECTION;
+  int cnt;
+  char *name, *type, *trans;
+  EXEC SQL END DECLARE SECTION;
+  name = argv[0];
+  type = argv[1];
+  trans = argv[2];
+
+  if (strcmp(strtrim(type), "FILESYS"))
+    return MR_SUCCESS;
+
+  EXEC SQL SELECT count(label) INTO :cnt FROM filesys WHERE
+    label = :name;
+  if (cnt > 0)
+    return MR_EXISTS;
+
+  return MR_SUCCESS;
+}
+
 int setup_acon(struct query *q, char *argv[], client *cl)
 {
   EXEC SQL BEGIN DECLARE SECTION;

Modified: trunk/third/moira/server/qsubs.c
===================================================================
--- trunk/third/moira/server/qsubs.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qsubs.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: qsubs.c,v 1.20 2008-08-29 16:10:24 zacheiss Exp $
  *
  * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
  * For copying and distribution information, please see the file
@@ -11,7 +11,7 @@
 
 #include <stdlib.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qsubs.c,v 1.20 2008-08-29 16:10:24 zacheiss Exp $");
 
 extern struct query Queries[];
 extern int QueryCount;

Modified: trunk/third/moira/server/qsupport.pc
===================================================================
--- trunk/third/moira/server/qsupport.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qsupport.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: qsupport.pc,v 2.53 2008-08-22 17:49:13 zacheiss Exp $
  *
  * Special query routines
  *
@@ -18,7 +18,7 @@
 
 EXEC SQL INCLUDE sqlca;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qsupport.pc,v 2.53 2008-08-22 17:49:13 zacheiss Exp $");
 
 extern char *whoami, *table_name[];
 extern int dbms_errno, mr_errcode;

Modified: trunk/third/moira/server/queries2.c
===================================================================
--- trunk/third/moira/server/queries2.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/queries2.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: queries2.c,v 2.108 2008-09-30 18:42:42 zacheiss Exp $
  *
  * This file defines the query dispatch table
  *
@@ -3565,8 +3565,8 @@
   3,
   0,
   0,
+  setup_aali,
   0,
-  0,
 };
 
 static struct validate dali_validate =	/* DELETE_ALIAS */

Modified: trunk/third/moira/server/query.h
===================================================================
--- trunk/third/moira/server/query.h	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/query.h	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: query.h,v 2.15 2008-08-29 14:50:08 zacheiss Exp $
  *
  * Structures and constants used in the query dispatch table
  *

Modified: trunk/third/moira/server/qvalidate.pc
===================================================================
--- trunk/third/moira/server/qvalidate.pc	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/qvalidate.pc	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: qvalidate.pc,v 2.25 2008-08-29 14:50:08 zacheiss Exp $
  *
  * Argument validation routines
  *
@@ -20,7 +20,7 @@
 EXEC SQL INCLUDE sqlca;
 EXEC SQL INCLUDE sqlda;
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/qvalidate.pc,v 2.25 2008-08-29 14:50:08 zacheiss Exp $");
 
 extern char *whoami, *table_name[], *sqlbuffer[QMAXARGS];
 extern int dbms_errno, mr_errcode;

Modified: trunk/third/moira/server/startmoira.c
===================================================================
--- trunk/third/moira/server/startmoira.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/server/startmoira.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: startmoira.c,v 1.19 1998-02-05 22:51:55 danw Exp $
  *
  * This program starts the moira server in a "clean" environment.
  * and then waits for it to exit.
@@ -22,7 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/server/startmoira.c,v 1.19 1998-02-05 22:51:55 danw Exp $");
 
 #define PROG	"moirad"
 

Modified: trunk/third/moira/update/Makefile.in
===================================================================
--- trunk/third/moira/update/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.6 2009-01-05 22:25:50 zacheiss Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@
@@ -22,6 +22,7 @@
 exec_prefix=@exec_prefix@
 bindir=@bindir@
 sbindir=@sbindir@
+sysconfdir=@sysconfdir@
 
 SOBJS=	auth_002.o auth_003.o checksum.o config.o exec_002.o get_file.o \
 	update_server.o xfer_002.o xfer_003.o sendrecv.o
@@ -43,8 +44,10 @@
 depend:
 
 install: all
-	$(INSTALL_PROGRAM) update_test $(bindir)
-	$(INSTALL_PROGRAM) update_server $(sbindir)
+	$(INSTALL_PROGRAM) update_test $(DESTDIR)$(bindir)
+	$(INSTALL_PROGRAM) update_server $(DESTDIR)$(sbindir)
+	$(SRCTOP)/mkinstalldirs $(DESTDIR)$(sysconfdir)/athena
+	$(INSTALL) -m 644 moira.conf $(DESTDIR)$(sysconfdir)/athena/moira.conf
 
 update_test: $(COBJS) $(MR_LIBDEP)
 	$(CC) -o $@ $(LDFLAGS) $(COBJS) $(LIBS)

Modified: trunk/third/moira/update/auth_002.c
===================================================================
--- trunk/third/moira/update/auth_002.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/auth_002.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: auth_002.c,v 1.9 1998-10-21 19:27:29 danw Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -17,7 +17,7 @@
 
 #include <krb.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/auth_002.c,v 1.9 1998-10-21 19:27:29 danw Exp $");
 
 static char service[] = "rcmd";
 static char master[] = "sms";

Modified: trunk/third/moira/update/auth_003.c
===================================================================
--- trunk/third/moira/update/auth_003.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/auth_003.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: auth_003.c,v 1.2 2006-08-22 17:36:26 zacheiss Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -18,7 +18,7 @@
 #include <krb.h>
 #include <krb5.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/auth_003.c,v 1.2 2006-08-22 17:36:26 zacheiss Exp $");
 
 static char service[] = "host";
 static char master[] = "sms";

Modified: trunk/third/moira/update/checksum.c
===================================================================
--- trunk/third/moira/update/checksum.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/checksum.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: checksum.c,v 1.9 1998-02-15 17:49:26 danw Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -11,7 +11,7 @@
 
 #include <stdio.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/checksum.c,v 1.9 1998-02-15 17:49:26 danw Exp $");
 
 /*
  * checksum_fd(fd)

Modified: trunk/third/moira/update/client.c
===================================================================
--- trunk/third/moira/update/client.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/client.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: client.c,v 1.27 2006-08-22 17:36:26 zacheiss Exp $
  *
  * This code handles the actual distribution of data files
  * to servers in the Moira server-update program.
@@ -21,7 +21,7 @@
 #include <krb.h>
 #include <krb5.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/client.c,v 1.27 2006-08-22 17:36:26 zacheiss Exp $");
 
 extern des_cblock session;
 extern char *whoami;

Modified: trunk/third/moira/update/config.c
===================================================================
--- trunk/third/moira/update/config.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/config.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: config.c,v 1.7 1998-02-15 17:49:27 danw Exp $
  *
  * Routines to handle configuration file for Moira's update_server.
  * These routines must load the file into memory rather than parse
@@ -24,7 +24,7 @@
 #include <string.h>
 #include <unistd.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/config.c,v 1.7 1998-02-15 17:49:27 danw Exp $");
 
 #define CONFIG_FILE	"/etc/athena/moira.conf"
 

Modified: trunk/third/moira/update/exec_002.c
===================================================================
--- trunk/third/moira/update/exec_002.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/exec_002.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: exec_002.c,v 1.20 1998-02-15 17:49:27 danw Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -17,7 +17,7 @@
 #include <stdio.h>
 #include <unistd.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/exec_002.c,v 1.20 1998-02-15 17:49:27 danw Exp $");
 
 void exec_002(int conn, char *str)
 {

Modified: trunk/third/moira/update/get_file.c
===================================================================
--- trunk/third/moira/update/get_file.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/get_file.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: get_file.c,v 1.20 2007-07-11 16:06:31 zacheiss Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -19,7 +19,7 @@
 
 #include <des.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/get_file.c,v 1.20 2007-07-11 16:06:31 zacheiss Exp $");
 
 #ifndef MIN
 #define MIN(a, b)    (((a) < (b)) ? (a) : (b))

Modified: trunk/third/moira/update/send_file.c
===================================================================
--- trunk/third/moira/update/send_file.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/send_file.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: send_file.c,v 1.16 2001-09-04 19:46:21 zacheiss Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -20,7 +20,7 @@
 #include <des.h>
 #include <update.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/send_file.c,v 1.16 2001-09-04 19:46:21 zacheiss Exp $");
 
 extern des_cblock session;
 

Modified: trunk/third/moira/update/sendrecv.c
===================================================================
--- trunk/third/moira/update/sendrecv.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/sendrecv.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: sendrecv.c,v 1.5 1999-09-21 17:29:57 danw Exp $
  *
  * socket layer for update_server
  *
@@ -17,7 +17,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/sendrecv.c,v 1.5 1999-09-21 17:29:57 danw Exp $");
 
 #define putlong(cp, l) { ((unsigned char *)cp)[0] = l >> 24; ((unsigned char *)cp)[1] = l >> 16; ((unsigned char *)cp)[2] = l >> 8; ((unsigned char *)cp)[3] = l; }
 #define getlong(cp, l) l = ((((unsigned char *)cp)[0] * 256 + ((unsigned char *)cp)[1]) * 256 + ((unsigned char *)cp)[2]) * 256 + ((unsigned char *)cp)[3]

Modified: trunk/third/moira/update/smskey.c
===================================================================
--- trunk/third/moira/update/smskey.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/smskey.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: smskey.c,v 1.6 1998-02-15 17:49:29 danw Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -15,7 +15,7 @@
 
 #include <des.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/smskey.c,v 1.6 1998-02-15 17:49:29 danw Exp $");
 
 int debug = 0;			/* goddamn des library breakage */
 char string[] = "sms\0\0Athena\0\1";

Modified: trunk/third/moira/update/ticket.c
===================================================================
--- trunk/third/moira/update/ticket.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/ticket.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: ticket.c,v 1.23 2007-07-25 15:39:01 zacheiss Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -17,7 +17,7 @@
 #include <krb5.h>
 #include <update.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/ticket.c,v 1.23 2007-07-25 15:39:01 zacheiss Exp $");
 
 static char realm[REALM_SZ];
 static char master[INST_SZ] = "sms";

Modified: trunk/third/moira/update/update_server.c
===================================================================
--- trunk/third/moira/update/update_server.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/update_server.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: update_server.c,v 1.26 2006-08-22 17:36:26 zacheiss Exp $
  *
  * Copyright 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -28,7 +28,7 @@
 #include <des.h>
 #include "update.h"
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/update_server.c,v 1.26 2006-08-22 17:36:26 zacheiss Exp $");
 
 char *whoami, *hostname;
 

Modified: trunk/third/moira/update/update_test.c
===================================================================
--- trunk/third/moira/update/update_test.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/update_test.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: update_test.c,v 1.12 2006-08-22 17:36:26 zacheiss Exp $
  *
  * Test client for update_server protocol.
  *

Modified: trunk/third/moira/update/xfer_002.c
===================================================================
--- trunk/third/moira/update/xfer_002.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/xfer_002.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: xfer_002.c,v 1.13 1998-02-15 17:49:31 danw Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -14,7 +14,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/xfer_002.c,v 1.13 1998-02-15 17:49:31 danw Exp $");
 
 /*
  *

Modified: trunk/third/moira/update/xfer_003.c
===================================================================
--- trunk/third/moira/update/xfer_003.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/update/xfer_003.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Id$
+/* $Id: xfer_003.c,v 1.6 1998-02-15 17:49:31 danw Exp $
  *
  * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
  * For copying and distribution information, please see the file
@@ -14,7 +14,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-RCSID("$Header$");
+RCSID("$Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/update/xfer_003.c,v 1.6 1998-02-15 17:49:31 danw Exp $");
 
 /*
  *

Modified: trunk/third/moira/util/et/Makefile.in
===================================================================
--- trunk/third/moira/util/et/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 1998-05-26 18:14:24 danw Exp $
 
 SHELL=/bin/sh
 VPATH=@srcdir@

Modified: trunk/third/moira/util/et/com_err.3
===================================================================
--- trunk/third/moira/util/et/com_err.3	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/com_err.3	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 .\" Copyright (c) 1988 Massachusetts Institute of Technology,
 .\" Student Information Processing Board.  All rights reserved.
 .\"
-.\" $Header$
+.\" $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/util/et/com_err.3,v 1.2 1998-02-05 22:13:00 danw Exp $
 .\"
 .TH COM_ERR 3 "22 Nov 1988" SIPB
 .SH NAME

Modified: trunk/third/moira/util/et/com_err.c
===================================================================
--- trunk/third/moira/util/et/com_err.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/com_err.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -11,7 +11,7 @@
 #include "error_table.h"
 #include "com_err.h"
 
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$Id: com_err.c,v 1.2 1998-02-05 22:13:01 danw Exp $";
 
 static void default_com_err_proc(const char *progname, long code,
 				 const char *fmt, va_list args);

Modified: trunk/third/moira/util/et/compile_et.1
===================================================================
--- trunk/third/moira/util/et/compile_et.1	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/compile_et.1	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 .\" Copyright (c) 1988 Massachusetts Institute of Technology,
 .\" Student Information Processing Board.  All rights reserved.
 .\"
-.\" $Header$
+.\" $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/util/et/compile_et.1,v 1.2 1998-02-05 22:13:04 danw Exp $
 .\"
 .TH COMPILE_ET 1 "22 Nov 1988" SIPB
 .SH NAME

Modified: trunk/third/moira/util/et/compile_et.c
===================================================================
--- trunk/third/moira/util/et/compile_et.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/compile_et.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -20,7 +20,7 @@
 static const char copyright[] =
     "Copyright 1987,1988 by MIT Student Information Processing Board";
 
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$Id: compile_et.c,v 1.2 1998-02-05 22:13:04 danw Exp $";
 
 enum lang {
     lang_C,			/* ANSI C (default) */

Modified: trunk/third/moira/util/et/error_message.c
===================================================================
--- trunk/third/moira/util/et/error_message.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/error_message.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 /*
- * $Header$
- * $Source$
- * $Locker$
+ * $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/util/et/error_message.c,v 1.2 1998-02-05 22:13:07 danw Exp $
+ * $Source: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/util/et/error_message.c,v $
+ * $Locker:  $
  *
  * Copyright 1987 by the Student Information Processing Board
  * of the Massachusetts Institute of Technology
@@ -14,7 +14,7 @@
 #include "error_table.h"
 #include "mit-sipb-copyright.h"
 
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$Id: error_message.c,v 1.2 1998-02-05 22:13:07 danw Exp $";
 static const char copyright[] =
     "Copyright 1986, 1987, 1988 by the Student Information Processing Board\nand the department of Information Systems\nof the Massachusetts Institute of Technology";
 

Modified: trunk/third/moira/util/et/error_table.y
===================================================================
--- trunk/third/moira/util/et/error_table.y	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/error_table.y	2009-04-12 18:05:09 UTC (rev 23740)
@@ -85,7 +85,7 @@
 #include <sys/time.h>
 #include "error_table.h"
 
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$Id: error_table.y,v 1.3 1999-04-06 21:35:04 danw Exp $";
 
 #include "et_lex.lex.c"
 

Modified: trunk/third/moira/util/et/et_lex.lex.l
===================================================================
--- trunk/third/moira/util/et/et_lex.lex.l	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/et_lex.lex.l	2009-04-12 18:05:09 UTC (rev 23740)
@@ -28,7 +28,7 @@
 
 .		{ return (*yytext); }
 %%
-static const char l_rcsid[] = "$Id$";
+static const char l_rcsid[] = "$Id: et_lex.lex.l,v 1.2 1998-02-05 22:13:09 danw Exp $";
 
 int yywrap()
 {

Modified: trunk/third/moira/util/et/et_name.c
===================================================================
--- trunk/third/moira/util/et/et_name.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/et_name.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -9,7 +9,7 @@
 
 static const char copyright[] =
     "Copyright 1987,1988 by Student Information Processing Board, Massachusetts Institute of Technology";
-static const char rcsid_et[] = "$Id$";
+static const char rcsid_et[] = "$Id: et_name.c,v 1.2 1998-02-05 22:13:10 danw Exp $";
 
 static const char char_set[] =
 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";

Modified: trunk/third/moira/util/et/init_et.c
===================================================================
--- trunk/third/moira/util/et/init_et.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/et/init_et.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,7 +1,7 @@
 /*
- * $Header$
- * $Source$
- * $Locker$
+ * $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/util/et/init_et.c,v 1.2 1998-02-05 22:13:10 danw Exp $
+ * $Source: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/util/et/init_et.c,v $
+ * $Locker:  $
  *
  * Copyright 1986, 1987, 1988 by MIT Information Systems and
  *	the MIT Student Information Processing Board.
@@ -15,7 +15,7 @@
 #include "error_table.h"
 #include "mit-sipb-copyright.h"
 
-static const char rcsid[] = "$Id$";
+static const char rcsid[] = "$Id: init_et.c,v 1.2 1998-02-05 22:13:10 danw Exp $";
 
 struct foobar {
     struct et_list etl;

Modified: trunk/third/moira/util/rsaref/Makefile.in
===================================================================
--- trunk/third/moira/util/rsaref/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/util/rsaref/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.2 1999-07-12 16:21:15 danw Exp $
 
 SHELL=/bin/sh
 

Modified: trunk/third/moira/webmoira/Makefile.in
===================================================================
--- trunk/third/moira/webmoira/Makefile.in	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/webmoira/Makefile.in	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-# $Id$
+# $Id: Makefile.in,v 1.5 2001-10-21 18:43:58 jis Exp $
 
 SHELL=/bin/sh
 @SET_MAKE@

Modified: trunk/third/moira/webmoira/moirai.c
===================================================================
--- trunk/third/moira/webmoira/moirai.c	2009-04-12 06:06:39 UTC (rev 23739)
+++ trunk/third/moira/webmoira/moirai.c	2009-04-12 18:05:09 UTC (rev 23740)
@@ -1,4 +1,4 @@
-/* $Header$ */
+/* $Header: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/webmoira/moirai.c,v 1.3 2006-08-22 17:36:27 zacheiss Exp $ */
 #include "mit_moira_MoiraConnectInternal.h"
 #include <moira.h>
 #include <mr_et.h>


home help back first fref pref prev next nref lref last post