home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume28 / shadow / patch02 next >
Text File  |  1992-02-02  |  64KB  |  2,733 lines

  1. Newsgroups: comp.sources.misc
  2. From: jfh@rpp386.cactus.org (John F Haugh II)
  3. Subject:  v28i009:  shadow - Shadow Login Suite, Patch02
  4. Message-ID: <1992Feb2.041641.27504@sparky.imd.sterling.com>
  5. X-Md4-Signature: 8039136d4efa3407a9f66c0bd8a4f4cc
  6. Date: Sun, 2 Feb 1992 04:16:41 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: jfh@rpp386.cactus.org (John F Haugh II)
  10. Posting-number: Volume 28, Issue 9
  11. Archive-name: shadow/patch02
  12. Environment: UNIX
  13. Patch-To: shadow: Volume 26, Issue 54-64
  14.  
  15. This enclosed patch corrects a number of bugs which were found by various
  16. users.  All users should apply this patch immediately.  You must have the
  17. current Shadow Login Suite code at patchlevel 3.1.1.  Another patch will
  18. be following immediately for SunOS 4.1.1 related changes.  It will be bring
  19. you up to 3.1.3.  You may want to wait until then before applying this
  20. patch.
  21.  
  22. Patch and enjoy!
  23.  
  24. Prereq: "3.1.1"
  25. Index: patchlevel.h
  26. *** rel3/patchlevel.h    Sat Dec 28 19:42:22 1991
  27. --- patchlevel.h    Sat Dec 28 19:42:26 1991
  28. ***************
  29. *** 11,18 ****
  30.    * Revision History
  31.    *    11/25/91    3.1.1    patchlevel 14
  32.    *        Added "login.defs" to Makefile
  33.    */
  34.   
  35.   #define    RELEASE        3
  36. ! #define    PATCHLEVEL    14
  37. ! #define    VERSION        "3.1.1"
  38. --- 11,20 ----
  39.    * Revision History
  40.    *    11/25/91    3.1.1    patchlevel 14
  41.    *        Added "login.defs" to Makefile
  42. +  *    12/02/91    3.1.2    patchlevel 15
  43. +  *        Bugs found by users
  44.    */
  45.   
  46.   #define    RELEASE        3
  47. ! #define    PATCHLEVEL    15
  48. ! #define    VERSION        "3.1.2"
  49. Index: README
  50. *** rel3/README    Sat Dec 28 19:40:37 1991
  51. --- README    Sat Dec 28 19:42:33 1991
  52. ***************
  53. *** 1,7 ****
  54. ! [    @(#)README    3.6    08:27:47    10/31/91    ]
  55.   
  56.   This is the explanatory document for John F. Haugh II's login replacement,
  57. ! release 3.  This document was last updated 10/31/91.
  58.   
  59.   This software is copyright 1988, 1989, 1990, 1991, John F. Haugh II.  All
  60.   rights reserved.  Use, duplication and disclosure is permitted according
  61. --- 1,7 ----
  62. ! [    @(#)README    3.7    11:58:37    12/28/91    ]
  63.   
  64.   This is the explanatory document for John F. Haugh II's login replacement,
  65. ! release 3.  This document was last updated 12/28/91.
  66.   
  67.   This software is copyright 1988, 1989, 1990, 1991, John F. Haugh II.  All
  68.   rights reserved.  Use, duplication and disclosure is permitted according
  69. ***************
  70. *** 12,17 ****
  71. --- 12,21 ----
  72.   transmission costs.  You are free to copy this software provided you
  73.   do not restrict the rights of the recipients to further copy this software.
  74.   
  75. + This source code is currently archived on ftp.cs.widener.edu in the
  76. + directory pub/src/adm.  The file name is "shadow" followed by the
  77. + version number.
  78.   THIS SOFTWARE IS BEING DISTRIBUTED AS-IS.  THE AUTHORS DISCLAIM ALL
  79.   LIABILITY FOR ANY CONSEQUENCES OF USE.  THE USER IS SOLELY RESPONSIBLE
  80.   FOR THE MAINTENANCE OF THIS SOFTWARE PACKAGE.  THE AUTHORS ARE UNDER NO
  81. ***************
  82. *** 25,31 ****
  83.   Also, thanks for Dennis L. Mumaugh for the initial shadow password
  84.   information and to Tony Walton (olapw@olgb1.oliv.co.uk) for the System
  85.   V Release 4 changes.  Effort in porting to SunOS has been contributed
  86. ! by Dr. Michael Newberry (miken@cs.adfa.oz.au).
  87.   
  88.   New for Release 3:
  89.       The objects are being combined into libraries to make maintenance
  90. --- 29,36 ----
  91.   Also, thanks for Dennis L. Mumaugh for the initial shadow password
  92.   information and to Tony Walton (olapw@olgb1.oliv.co.uk) for the System
  93.   V Release 4 changes.  Effort in porting to SunOS has been contributed
  94. ! by Dr. Michael Newberry (miken@cs.adfa.oz.au) and Micheal J. Miller, Jr.
  95. ! (mke@kaberd.rain.com)
  96.   
  97.   New for Release 3:
  98.       The objects are being combined into libraries to make maintenance
  99. ***************
  100. *** 46,51 ****
  101. --- 51,60 ----
  102.       been added.  The man pages for these commands have been written
  103.       as well.
  104.   
  105. + Warning:
  106. +     The newuser command will be removed in a later release.
  107. +     The libsec.a library will be removed in a later release.
  108.   Begin by reading and editing the config.h file.  All options are selected
  109.   by using #define's.  A brief description for each available option appears
  110.   below.  You may want to print this file out as it is LONG and you will
  111. ***************
  112. *** 60,65 ****
  113. --- 69,81 ----
  114.   selected at run time.  You should refer to the login.5 manual page for
  115.   more information regarding these options.
  116.   
  117. + There are several files which you may have to replace.  If you system has
  118. + a lastlog.h file, you should replace the one which I provide with your
  119. + system version.  The pwd.h file that is produced by "make" must agree
  120. + exactly with the system supplied version.  You should re-arrange the
  121. + fields or #define's until they match.  The same is true for "shadow.h",
  122. + if you system provides one.
  123.   Login Defaults File -
  124.       This option selects the name of the file to read for the
  125.       run-time configurable options.  The default value for
  126. ***************
  127. *** 204,206 ****
  128. --- 220,253 ----
  129.   [ this is now possible using chfn and the -o option.  i would appreciate
  130.     anyone who is able to confirm that this code runs reasonably on some
  131.     BSD release. - jfh ]
  132. + SunOS 4.1.1 Notes: (mke@kaberd.rain.com) Michael J. Miller Jr.
  133. + [ These notes were edited from the original.  The standard Makefile
  134. +   and config.h have notes indicating the changes required for SunOS. ]
  135. + You'll need to do the following to get the shadow password dist to
  136. + compile on a sun 4.1.1 system.
  137. + If using csh, then type 'rehash'.  cd to the /etc directory and type
  138. + 'pwconv'.  This will create two files,  nshadow and npasswd.
  139. + now type 'mkpasswd -f nshadow' and 'mkpasswd -f npasswd'.  This will
  140. + create the shadow password file.
  141. + Note: The shadow group stuff does not work with sunos.  
  142. + Note: ftp will still use the old password file.
  143. + Note: if you run suns pcnfs, be aware that it will still be looking at the
  144. +       old password file as well.  I may work out a patch for this, as I am
  145. +       fairly certain the stuff on the sun side comes with source.
  146. + Note: I have compiled this package with the standard c compiler and
  147. +       suns unbundled c compiler at an optomization level of 2 in
  148. +       both casses.  Haven't tried gcc yet, so I don't know wether it
  149. +       works.  Same goes for suns C++ compiler.
  150. + Note: has been compiled on a sun 3/75 running sunos 4.1.1.  Should compile
  151. +       fine on sun 4's running 4.1.1, and may compile on suns running
  152. +       4.1.  Have no idea what sort of success people will have that
  153. +       are running 4.03 and older versions.
  154. Index: Makefile
  155. *** rel3/Makefile    Sat Dec 28 19:42:24 1991
  156. --- Makefile    Sat Dec 28 19:42:37 1991
  157. ***************
  158. *** 8,16 ****
  159.   # and conspicuously displayed on all copies of object code or
  160.   # distribution media.
  161.   #
  162. ! #    @(#)Makefile    3.25    09:47:59  - Shadow password system
  163.   #
  164. ! #    @(#)Makefile    3.25    09:47:59    11/25/91
  165.   #
  166.   SHELL = /bin/sh
  167.   
  168. --- 8,16 ----
  169.   # and conspicuously displayed on all copies of object code or
  170.   # distribution media.
  171.   #
  172. ! #    @(#)Makefile    3.25.1.3    19:39:43  - Shadow password system
  173.   #
  174. ! #    @(#)Makefile    3.25.1.3    19:39:43    12/28/91
  175.   #
  176.   SHELL = /bin/sh
  177.   
  178. ***************
  179. *** 22,47 ****
  180.   RELEASE = 3
  181.   GFLAGS = -t -r$(RELEASE)
  182.   
  183. ! # Define the directory login is copied to.  BE VERY CAREFUL!!!  BSD and SUN
  184. ! # seems to use /bin, USG seems to use /etc.  If you define SCOLOGIN, you
  185. ! # MUST use /etc as LOGINDIR.
  186.   # LOGINDIR = /bin
  187.   LOGINDIR = /etc
  188.   
  189.   # Define any special libraries required to access the directory routines.
  190.   # NDIR = -lndir
  191.   NDIR = -lx
  192.   
  193.   # Pick your favorite C compiler and tags command
  194.   CC = cc
  195.   TAGS = ctags
  196.   
  197. ! # OS.  Pick one of USG (AT&T, SYSV, SYS3), BSD, or SUN.
  198.   OS = -DUSG
  199.   # OS = -DBSD
  200.   # OS = -DSUN
  201.   
  202. ! # Do you have to do ranlib?  Sorry to hear that ...
  203.   RANLIB = ranlib
  204.   # RANLIB = echo
  205.   
  206. --- 22,54 ----
  207.   RELEASE = 3
  208.   GFLAGS = -t -r$(RELEASE)
  209.   
  210. ! # Define the directory login is copied to.  BE VERY CAREFUL!!!  BSD old SunOS
  211. ! # seems to use /bin, USG seems to use /etc, SunOS 4.1.1 seems to use /usr/bin.
  212. ! # If you define SCOLOGIN, you MUST use /etc as LOGINDIR.
  213.   # LOGINDIR = /bin
  214.   LOGINDIR = /etc
  215. + # LOGINDIR = /usr/bin
  216.   
  217.   # Define any special libraries required to access the directory routines.
  218. + # Some systems require -lndir for the directory routines.  SCO Xenix uses
  219. + # -lx for that.  Your system might need nothing.
  220.   # NDIR = -lndir
  221.   NDIR = -lx
  222. + # NDIR =
  223.   
  224.   # Pick your favorite C compiler and tags command
  225.   CC = cc
  226.   TAGS = ctags
  227.   
  228. ! # OS.  Pick one of USG (AT&T, SYSV, SYS3), BSD, SUN (SunOS 2 and 3),
  229. ! # or SUN4 (SunOS 4.1.1.).
  230. ! # OS = -DUSG -DSYS3
  231.   OS = -DUSG
  232.   # OS = -DBSD
  233.   # OS = -DSUN
  234. + # OS = -DSUN4
  235.   
  236. ! # Do you have to do ranlib (probably SUN, BSD and XENIX)?
  237.   RANLIB = ranlib
  238.   # RANLIB = echo
  239.   
  240. ***************
  241. *** 51,56 ****
  242. --- 58,64 ----
  243.   
  244.   # Configuration Flags
  245.   #
  246. + #    DEST_INCLUDE_DIR - local include files
  247.   #    LIBS - system libraries
  248.   #        -lsocket - needed for TCP/IP and possibly SYSLOG
  249.   #        -ldbm or -lndbm - needed for DBM support
  250. ***************
  251. *** 58,81 ****
  252.   #    CFLAGS - C compiler flags
  253.   #        -DLAI_TCP - needed for SCO Xenix Lachman TCP/IP
  254.   
  255.   # Flags for SCO Xenix/386
  256. ! CFLAGS = -O -M3 -g $(OS)
  257.   LIBS = -lcrypt -lndbm
  258.   # LIBS = -lcrypt -ldbm
  259.   LDFLAGS = -M3 -g
  260.   LTFLAGS = 
  261. - # This should be Slibsec.a for small model, or Llibsec.a for
  262. - # large model or whatever.  MUST AGREE WITH CFLAGS!!!
  263. - LIBSEC = Slibsec.a
  264.   
  265.   # Flags for normal machines
  266. ! # CFLAGS = -O -g $(OS)
  267.   # LIBS =
  268.   # LDFLAGS = -g
  269.   # LIBSEC = libsec.a
  270.   
  271.   # Names for root user and group, and bin user and group.  See your
  272. ! # /etc/passwd and /etc/group files.
  273.   RUID = root
  274.   RGID = root
  275.   # RGID = wheel
  276. --- 66,99 ----
  277.   #    CFLAGS - C compiler flags
  278.   #        -DLAI_TCP - needed for SCO Xenix Lachman TCP/IP
  279.   
  280. + DEST_INCLUDE_DIR = /usr/include
  281.   # Flags for SCO Xenix/386
  282. ! CFLAGS = -O -M3 -g $(OS) -I$(DEST_INCLUDE_DIR)
  283.   LIBS = -lcrypt -lndbm
  284.   # LIBS = -lcrypt -ldbm
  285.   LDFLAGS = -M3 -g
  286.   LTFLAGS = 
  287.   
  288.   # Flags for normal machines
  289. ! # CFLAGS = -O -g $(OS) -I$(DEST_INCLUDE_DIR)
  290.   # LIBS =
  291.   # LDFLAGS = -g
  292. + # Flags for SunOS 4.1.1
  293. + # CFLAGS = -O2 $(OS)
  294. + # LIBS =
  295. + # LDFLAGS = 
  296. + # This should be Slibsec.a for small model, or Llibsec.a for
  297. + # large model or whatever.  MUST AGREE WITH CFLAGS!!!  For non-Intel
  298. + # machines, just use libsec.a
  299. + LIBSEC = Slibsec.a
  300.   # LIBSEC = libsec.a
  301.   
  302.   # Names for root user and group, and bin user and group.  See your
  303. ! # /etc/passwd and /etc/group files.  BSD and SUN use "wheel", most
  304. ! # others use "root" for RGID.
  305.   RUID = root
  306.   RGID = root
  307.   # RGID = wheel
  308. ***************
  309. *** 82,87 ****
  310. --- 100,108 ----
  311.   BUID = bin
  312.   BGID = bin
  313.   
  314. + # Where the login.defs file will be copied.  Must agree with config.h
  315. + DEST_LOGIN_DEFS = /etc/login.defs
  316.   # Rules for .L (lint) files.
  317.   .SUFFIXES: .L
  318.   LINT = lint
  319. ***************
  320. *** 180,185 ****
  321. --- 201,208 ----
  322.   FILES9 = groupadd.c groupdel.c groupmod.c tz.c console.c hushed.c getdef.c \
  323.       scologin.c logoutd.c sulog.c getpass.c userdel.c
  324.   
  325. + FILES_SUN = Makefile.sun4 README.sun4 config.h.sun4
  326.   MAN_1 = chage.1 chfn.1 chsh.1 id.1 login.1 newgrp.1 passwd.1 su.1 \
  327.       useradd.1 userdel.1 usermod.1 groupadd.1 groupdel.1 groupmod.1 \
  328.       groups.1
  329. ***************
  330. *** 237,243 ****
  331.       cp mkpasswd pwconv pwunconv sulogin chpasswd newusers \
  332.           useradd userdel usermod groupadd groupdel groupmod logoutd /etc
  333.       cp su passwd gpasswd dpasswd faillog newgrp chfn chsh chage id /bin
  334. !     cp dialup.h shadow.h pwd.h /usr/include
  335.       chown $(RUID) $(LOGINDIR)/login /etc/pwconv /etc/pwunconv /etc/sulogin \
  336.           /bin/su /bin/passwd /bin/gpasswd /bin/newgrp /etc/mkpasswd \
  337.           /bin/dpasswd /bin/chsh /bin/chfn /bin/chage /etc/useradd \
  338. --- 260,266 ----
  339.       cp mkpasswd pwconv pwunconv sulogin chpasswd newusers \
  340.           useradd userdel usermod groupadd groupdel groupmod logoutd /etc
  341.       cp su passwd gpasswd dpasswd faillog newgrp chfn chsh chage id /bin
  342. !     cp dialup.h shadow.h pwd.h $(DEST_INCLUDE_DIR)
  343.       chown $(RUID) $(LOGINDIR)/login /etc/pwconv /etc/pwunconv /etc/sulogin \
  344.           /bin/su /bin/passwd /bin/gpasswd /bin/newgrp /etc/mkpasswd \
  345.           /bin/dpasswd /bin/chsh /bin/chfn /bin/chage /etc/useradd \
  346. ***************
  347. *** 248,257 ****
  348.           /bin/dpasswd /bin/chsh /bin/chfn /bin/chage /etc/useradd \
  349.           /etc/userdel /etc/usermod /etc/groupadd /etc/groupdel \
  350.           /etc/groupmod /etc/logoutd
  351. !     chown $(BUID) /bin/faillog /bin/id /usr/include/shadow.h \
  352. !         /usr/include/dialup.h /usr/include/pwd.h
  353. !     chgrp $(BGID) /bin/faillog /bin/id /usr/include/shadow.h \
  354. !         /usr/include/dialup.h /usr/include/pwd.h
  355.       chmod 700 /etc/pwconv /etc/pwunconv /etc/sulogin /etc/mkpasswd \
  356.           /etc/chpasswd /etc/newusers /bin/dpasswd /bin/chage \
  357.           /etc/useradd /etc/userdel /etc/usermod /etc/groupadd \
  358. --- 271,280 ----
  359.           /bin/dpasswd /bin/chsh /bin/chfn /bin/chage /etc/useradd \
  360.           /etc/userdel /etc/usermod /etc/groupadd /etc/groupdel \
  361.           /etc/groupmod /etc/logoutd
  362. !     chown $(BUID) /bin/faillog /bin/id $(DEST_INCLUDE_DIR)/shadow.h \
  363. !         $(DEST_INCLUDE_DIR)/dialup.h $(DEST_INCLUDE_DIR)/pwd.h
  364. !     chgrp $(BGID) /bin/faillog /bin/id $(DEST_INCLUDE_DIR)/shadow.h \
  365. !         $(DEST_INCLUDE_DIR)/dialup.h $(DEST_INCLUDE_DIR)/pwd.h
  366.       chmod 700 /etc/pwconv /etc/pwunconv /etc/sulogin /etc/mkpasswd \
  367.           /etc/chpasswd /etc/newusers /bin/dpasswd /bin/chage \
  368.           /etc/useradd /etc/userdel /etc/usermod /etc/groupadd \
  369. ***************
  370. *** 259,270 ****
  371.       chmod 4711 $(LOGINDIR)/login /bin/su /bin/passwd /bin/gpasswd \
  372.           /bin/newgrp /bin/chfn /bin/chsh
  373.       chmod 711 /bin/faillog /bin/id
  374. !     chmod 444 /usr/include/shadow.h /usr/include/dialup.h \
  375. !         /usr/include/pwd.h
  376. !     [ -f /etc/login.defs ] || (cp login.defs /etc ; \
  377. !         chown $(RUID) /etc/login.defs ; \
  378. !         chgrp $(RGID) /etc/login.defs ; \
  379. !         chmod 600 /etc/login.defs )
  380.       [ -z "$(SCOLOGIN)" ] || (cp scologin /bin/login ; \
  381.           chown $(RUID) /bin/login ; \
  382.           chgrp $(RGID) /bin/login ; \
  383. --- 282,293 ----
  384.       chmod 4711 $(LOGINDIR)/login /bin/su /bin/passwd /bin/gpasswd \
  385.           /bin/newgrp /bin/chfn /bin/chsh
  386.       chmod 711 /bin/faillog /bin/id
  387. !     chmod 444 $(DEST_INCLUDE_DIR)/shadow.h $(DEST_INCLUDE_DIR)/dialup.h \
  388. !         $(DEST_INCLUDE_DIR)/pwd.h
  389. !     [ -f $(DEST_LOGIN_DEFS) ] || (cp $(DEST_LOGIN_DEFS) /etc ; \
  390. !         chown $(RUID) $(DEST_LOGIN_DEFS) ; \
  391. !         chgrp $(RGID) $(DEST_LOGIN_DEFS) ; \
  392. !         chmod 600 $(DEST_LOGIN_DEFS) )
  393.       [ -z "$(SCOLOGIN)" ] || (cp scologin /bin/login ; \
  394.           chown $(RUID) /bin/login ; \
  395.           chgrp $(RGID) /bin/login ; \
  396. ***************
  397. *** 273,280 ****
  398.   lint:    su.lint login.lint pwconv.lint pwunconv.lint passwd.lint sulogin.lint \
  399.       faillog.lint newgrp.lint gpasswd.lint mkpasswd.lint chfn.lint \
  400.       chsh.lint chage.lint dpasswd.lint id.lint useradd.lint userdel.lint \
  401. !     usermod.lint groupadd.lint groupdel.lint groupmod.lint $(ALLSRCS:.c=.L)
  402. !     logoutd.lint
  403.   
  404.   tags:    $(ALLSRCS)
  405.       $(TAGS) $(ALLSRCS)
  406. --- 296,303 ----
  407.   lint:    su.lint login.lint pwconv.lint pwunconv.lint passwd.lint sulogin.lint \
  408.       faillog.lint newgrp.lint gpasswd.lint mkpasswd.lint chfn.lint \
  409.       chsh.lint chage.lint dpasswd.lint id.lint useradd.lint userdel.lint \
  410. !     usermod.lint groupadd.lint groupdel.lint groupmod.lint logoutd.lint \
  411. !     $(ALLSRCS:.c=.L)
  412.   
  413.   tags:    $(ALLSRCS)
  414.       $(TAGS) $(ALLSRCS)
  415. ***************
  416. *** 388,394 ****
  417.       $(LINT) $(LINTFLAGS) id.c > id.lint
  418.   
  419.   groups: groups.o libshadow.a
  420. !     $(CC) -c $(CFLAGS) groups.o libshadow.a $(LIBS)
  421.   
  422.   groups.lint: groups.c
  423.       $(LINT) $(LINTFLAGS) groups.c > groups.lint
  424. --- 411,417 ----
  425.       $(LINT) $(LINTFLAGS) id.c > id.lint
  426.   
  427.   groups: groups.o libshadow.a
  428. !     $(CC) -o groups $(LDFLAGS) groups.o libshadow.a $(LIBS)
  429.   
  430.   groups.lint: groups.c
  431.       $(LINT) $(LINTFLAGS) groups.c > groups.lint
  432. ***************
  433. *** 436,442 ****
  434.       [ -f s.pwd.h.m4 ] && get -t -r$(RELEASE) s.pwd.h.m4
  435.   
  436.   pwd.h: pwd.h.m4
  437. !     m4 $(OS) pwd.h.m4 >pwd.h
  438.   
  439.   logoutd: logoutd.o libshadow.a
  440.       $(CC) -o logoutd $(LDFLAGS) logoutd.o libshadow.a
  441. --- 459,465 ----
  442.       [ -f s.pwd.h.m4 ] && get -t -r$(RELEASE) s.pwd.h.m4
  443.   
  444.   pwd.h: pwd.h.m4
  445. !     m4 $(OS) < pwd.h.m4 > pwd.h
  446.   
  447.   logoutd: logoutd.o libshadow.a
  448.       $(CC) -o logoutd $(LDFLAGS) logoutd.o libshadow.a
  449. ***************
  450. *** 449,455 ****
  451.   susetup.c: setup.c
  452.       cp setup.c susetup.c
  453.   
  454. ! susetup.o: config.h setup.c pwd.h
  455.       $(CC) -c $(CFLAGS) -DSU susetup.c
  456.   
  457.   scologin: scologin.o
  458. --- 472,478 ----
  459.   susetup.c: setup.c
  460.       cp setup.c susetup.c
  461.   
  462. ! susetup.o: config.h susetup.c pwd.h
  463.       $(CC) -c $(CFLAGS) -DSU susetup.c
  464.   
  465.   scologin: scologin.o
  466. ***************
  467. *** 522,528 ****
  468.   
  469.   shar:    login.sh.01 login.sh.02 login.sh.03 login.sh.04 login.sh.05 \
  470.       login.sh.06 login.sh.07 login.sh.08 login.sh.09 login.sh.10 \
  471. !     login.sh.11
  472.   
  473.   login.sh.01: $(FILES1) Makefile
  474.       shar -a $(FILES1) > login.sh.01
  475. --- 545,551 ----
  476.   
  477.   shar:    login.sh.01 login.sh.02 login.sh.03 login.sh.04 login.sh.05 \
  478.       login.sh.06 login.sh.07 login.sh.08 login.sh.09 login.sh.10 \
  479. !     login.sh.11 login.sh.12
  480.   
  481.   login.sh.01: $(FILES1) Makefile
  482.       shar -a $(FILES1) > login.sh.01
  483. ***************
  484. *** 556,558 ****
  485. --- 579,584 ----
  486.   
  487.   login.sh.11: $(DOCS2) Makefile
  488.       shar -a $(DOCS2) > login.sh.11
  489. + login.sh.12: $(FILES_SUN) Makefile
  490. +     shar -a $(FILES_SUN) > login.sh.12
  491. Index: pwdbm.c
  492. *** rel3/pwdbm.c    Sat Dec 28 19:41:15 1991
  493. --- pwdbm.c    Sat Dec 28 19:42:39 1991
  494. ***************
  495. *** 10,16 ****
  496.    */
  497.   
  498.   #ifndef    lint
  499. ! static    char    sccsid[] = "@(#)pwdbm.c    3.5    09:29:30    6/6/91";
  500.   #endif
  501.   
  502.   #ifdef    BSD
  503. --- 10,16 ----
  504.    */
  505.   
  506.   #ifndef    lint
  507. ! static    char    sccsid[] = "@(#)pwdbm.c    3.6    12:10:31    12/28/91";
  508.   #endif
  509.   
  510.   #ifdef    BSD
  511. ***************
  512. *** 109,114 ****
  513. --- 109,115 ----
  514.   {
  515.       datum    key;
  516.       static    int    once;
  517. +     char    data[BUFSIZ];
  518.   
  519.       if (! once) {
  520.   #ifdef    NDBM
  521. Index: useradd.c
  522. *** rel3/useradd.c    Sat Dec 28 19:41:44 1991
  523. --- useradd.c    Sat Dec 28 19:42:41 1991
  524. ***************
  525. *** 10,18 ****
  526.    */
  527.   
  528.   #ifndef lint
  529. ! static    char    sccsid[] = "@(#)useradd.c    3.6    14:38:26    10/27/91";
  530.   #endif
  531.   
  532.   #include <sys/types.h>
  533.   #include <sys/stat.h>
  534.   #include <stdio.h>
  535. --- 10,19 ----
  536.    */
  537.   
  538.   #ifndef lint
  539. ! static    char    sccsid[] = "@(#)useradd.c    3.8    19:40:07    12/28/91";
  540.   #endif
  541.   
  542. + #include "config.h"
  543.   #include <sys/types.h>
  544.   #include <sys/stat.h>
  545.   #include <stdio.h>
  546. ***************
  547. *** 29,35 ****
  548.   #include <string.h>
  549.   #endif
  550.   
  551. - #include "config.h"
  552.   #include "shadow.h"
  553.   
  554.   #ifdef    USE_SYSLOG
  555. --- 30,35 ----
  556. ***************
  557. *** 547,553 ****
  558.           return -1;
  559.       }
  560.   #ifdef    USE_SYSLOG
  561. !     syslog (LOG_INFO, "defaults: group=%d, home=%s, inactive=%d, expire=%d",
  562.           def_group, def_home, def_inactive, def_expire);
  563.   #endif
  564.       return 0;
  565. --- 547,554 ----
  566.           return -1;
  567.       }
  568.   #ifdef    USE_SYSLOG
  569. !     syslog (LOG_INFO,
  570. !         "defaults: group=%d, home=%s, inactive=%d, expire=%d\n",
  571.           def_group, def_home, def_inactive, def_expire);
  572.   #endif
  573.       return 0;
  574. ***************
  575. *** 709,715 ****
  576. --- 710,718 ----
  577.   {
  578.       int    i;
  579.       struct    group    *grp;
  580. + #ifdef    SHADOWGRP
  581.       struct    sgrp    *sgrp;
  582. + #endif
  583.   
  584.       /*
  585.        * Lock and open the group file.  This will load all of the group
  586. ***************
  587. *** 969,975 ****
  588.                           Prog, optarg);
  589.                       exit (1);
  590.                   }
  591. !                 user_gid = grp->gr_gid;
  592.                   break;
  593.               case 'G':
  594.                   Gflg++;
  595. --- 972,981 ----
  596.                           Prog, optarg);
  597.                       exit (1);
  598.                   }
  599. !                 if (Dflg)
  600. !                     def_group = grp->gr_gid;
  601. !                 else
  602. !                     user_gid = grp->gr_gid;
  603.                   break;
  604.               case 'G':
  605.                   Gflg++;
  606. ***************
  607. *** 1192,1205 ****
  608.   #endif
  609.   
  610.       /*
  611. !      * The open routines for the DBM files don't use read-write
  612.        * as the mode, so we have to clue them in.
  613.        */
  614.   
  615. - #if defined(DBM) || defined(NDBM)
  616. -     pw_dbm_mode = O_RDWR;
  617. - #endif
  618.   #ifdef    NDBM
  619.       sp_dbm_mode = O_RDWR;
  620.       gr_dbm_mode = O_RDWR;
  621.   #ifdef    SHADOWGRP
  622. --- 1198,1209 ----
  623.   #endif
  624.   
  625.       /*
  626. !      * The open routines for the NDBM files don't use read-write
  627.        * as the mode, so we have to clue them in.
  628.        */
  629.   
  630.   #ifdef    NDBM
  631. +     pw_dbm_mode = O_RDWR;
  632.       sp_dbm_mode = O_RDWR;
  633.       gr_dbm_mode = O_RDWR;
  634.   #ifdef    SHADOWGRP
  635. Index: usermod.c
  636. *** rel3/usermod.c    Sat Dec 28 19:41:46 1991
  637. --- usermod.c    Sat Dec 28 19:42:44 1991
  638. ***************
  639. *** 10,16 ****
  640.    */
  641.   
  642.   #ifndef lint
  643. ! static    char    sccsid[] = "@(#)usermod.c    3.5    14:38:40    10/27/91";
  644.   #endif
  645.   
  646.   #include <sys/types.h>
  647. --- 10,16 ----
  648.    */
  649.   
  650.   #ifndef lint
  651. ! static    char    sccsid[] = "@(#)usermod.c    3.8    19:40:17    12/28/91";
  652.   #endif
  653.   
  654.   #include <sys/types.h>
  655. ***************
  656. *** 31,36 ****
  657. --- 31,38 ----
  658.   
  659.   #include "config.h"
  660.   #include "shadow.h"
  661. + #include <faillog.h>
  662. + #include <lastlog.h>
  663.   
  664.   #ifdef    USE_SYSLOG
  665.   #include <syslog.h>
  666. ***************
  667. *** 473,495 ****
  668.   new_pwent (pwent)
  669.   struct    passwd    *pwent;
  670.   {
  671. !     if (lflg)
  672.           pwent->pw_name = strdup (user_newname);
  673. !     if (uflg)
  674.           pwent->pw_uid = user_newid;
  675. !     if (gflg)
  676.           pwent->pw_gid = user_gid;
  677.       if (cflg)
  678.           pwent->pw_gecos = strdup (user_comment);
  679.   
  680. !     if (dflg)
  681.           pwent->pw_dir = strdup (user_newhome);
  682. !     if (sflg)
  683.           pwent->pw_shell = strdup (user_shell);
  684.   }
  685.   
  686.   /*
  687. --- 475,518 ----
  688.   new_pwent (pwent)
  689.   struct    passwd    *pwent;
  690.   {
  691. !     if (lflg) {
  692. ! #ifdef    USE_SYSLOG
  693. !         syslog (LOG_INFO, "change user name `%s' to `%s'\n",
  694. !             pwent->pw_name, user_newname);
  695. ! #endif
  696.           pwent->pw_name = strdup (user_newname);
  697. !     }
  698. !     if (uflg) {
  699. ! #ifdef    USE_SYSLOG
  700. !         syslog (LOG_INFO, "change user `%s' UID from `%d' to `%d'\n",
  701. !             pwent->pw_name, pwent->pw_uid, user_newid);
  702. ! #endif
  703.           pwent->pw_uid = user_newid;
  704. !     }
  705. !     if (gflg) {
  706. ! #ifdef    USE_SYSLOG
  707. !         syslog (LOG_INFO, "change user `%s' GID from `%d' to `%d'\n",
  708. !             pwent->pw_name, pwent->pw_gid, user_gid);
  709. ! #endif
  710.           pwent->pw_gid = user_gid;
  711. !     }
  712.       if (cflg)
  713.           pwent->pw_gecos = strdup (user_comment);
  714.   
  715. !     if (dflg) {
  716. ! #ifdef    USE_SYSLOG
  717. !         syslog (LOG_INFO, "change user `%s' home from `%s' to `%s'\n",
  718. !             pwent->pw_name, pwent->pw_dir, user_newhome);
  719. ! #endif
  720.           pwent->pw_dir = strdup (user_newhome);
  721. !     }
  722. !     if (sflg) {
  723. ! #ifdef    USE_SYSLOG
  724. !         syslog (LOG_INFO, "change user `%s' shell from `%s' to `%s'\n",
  725. !             pwent->pw_name, pwent->pw_shell, user_shell);
  726. ! #endif
  727.           pwent->pw_shell = strdup (user_shell);
  728. +     }
  729.   }
  730.   
  731.   /*
  732. ***************
  733. *** 506,513 ****
  734.       if (lflg)
  735.           spent->sp_namp = strdup (user_newname);
  736.   
  737. !     spent->sp_inact = user_inactive;
  738. !     spent->sp_expire = user_expire;
  739.   }
  740.   
  741.   /*
  742. --- 529,548 ----
  743.       if (lflg)
  744.           spent->sp_namp = strdup (user_newname);
  745.   
  746. !     if (fflg) {
  747. ! #ifdef    USE_SYSLOG
  748. !         syslog (LOG_INFO, "change user `%s' inactive from `%d' to `%d'\n",
  749. !             spent->sp_namp, spent->sp_inact, user_inactive);
  750. ! #endif
  751. !         spent->sp_inact = user_inactive;
  752. !     }
  753. !     if (eflg) {
  754. ! #ifdef    USE_SYSLOG
  755. !         syslog (LOG_INFO, "change user `%s' expiration from `%d' to `%d'\n",
  756. !             spent->sp_namp, spent->sp_expire, user_expire);
  757. ! #endif
  758. !         spent->sp_expire = user_expire;
  759. !     }
  760.   }
  761.   
  762.   /*
  763. ***************
  764. *** 523,531 ****
  765.       int    i;
  766.       int    is_member;
  767.       int    was_member;
  768. -     int    was_admin;
  769.       struct    group    *grp;
  770.       struct    sgrp    *sgrp;
  771.   
  772.       /*
  773.        * Lock and open the group file.  This will load all of the group
  774. --- 558,568 ----
  775.       int    i;
  776.       int    is_member;
  777.       int    was_member;
  778.       struct    group    *grp;
  779. + #ifdef    SHADOWGRP
  780. +     int    was_admin;
  781.       struct    sgrp    *sgrp;
  782. + #endif
  783.   
  784.       /*
  785.        * Lock and open the group file.  This will load all of the group
  786. ***************
  787. *** 1076,1084 ****
  788.   /*
  789.    * move_home - move the user's home directory
  790.    *
  791. !  *    move_home() creates the user's home directory if it does not
  792. !  *    already exist.  It will be created mode 755 owned by the user
  793. !  *    with the user's default group.
  794.    */
  795.   
  796.   move_home ()
  797. --- 1113,1121 ----
  798.   /*
  799.    * move_home - move the user's home directory
  800.    *
  801. !  *    move_home() moves the user's home directory to a new location.
  802. !  *    The files will be copied if the directory cannot simply be
  803. !  *    renamed.
  804.    */
  805.   
  806.   move_home ()
  807. ***************
  808. *** 1118,1124 ****
  809.   }
  810.   
  811.   /*
  812. !  * main - useradd command
  813.    */
  814.   
  815.   main (argc, argv)
  816. --- 1155,1200 ----
  817.   }
  818.   
  819.   /*
  820. !  * update_files - update the lastlog and faillog files
  821. !  */
  822. ! update_files ()
  823. ! {
  824. !     struct    lastlog    ll;
  825. !     struct    faillog    fl;
  826. !     int    fd;
  827. !     /*
  828. !      * Relocate the "lastlog" entries for the user.  The old entry
  829. !      * is left alone in case the UID was shared.  It doesn't hurt
  830. !      * anything to just leave it be.
  831. !      */
  832. !     if ((fd = open ("/usr/adm/lastlog", O_RDWR)) != -1) {
  833. !         lseek (fd, (long) user_id * sizeof ll, 0);
  834. !         if (read (fd, &ll, sizeof ll) == sizeof ll) {
  835. !             lseek (fd, (long) user_newid * sizeof ll, 0);
  836. !             write (fd, &ll, sizeof ll);
  837. !         }
  838. !         close (fd);
  839. !     }
  840. !     /*
  841. !      * Relocate the "faillog" entries in the same manner.
  842. !      */
  843. !     if ((fd = open (FAILFILE, O_RDWR)) != -1) {
  844. !         lseek (fd, (long) user_id * sizeof fl, 0);
  845. !         if (read (fd, &fl, sizeof fl) == sizeof fl) {
  846. !             lseek (fd, (long) user_newid * sizeof ll, 0);
  847. !             write (fd, &fl, sizeof fl);
  848. !         }
  849. !         close (fd);
  850. !     }
  851. ! }
  852. ! /*
  853. !  * main - usermod command
  854.    */
  855.   
  856.   main (argc, argv)
  857. ***************
  858. *** 1139,1152 ****
  859.   #endif
  860.   
  861.       /*
  862. !      * The open routines for the DBM files don't use read-write
  863.        * as the mode, so we have to clue them in.
  864.        */
  865.   
  866. - #if defined(DBM) || defined(NDBM)
  867. -     pw_dbm_mode = O_RDWR;
  868. - #endif
  869.   #ifdef    NDBM
  870.       sp_dbm_mode = O_RDWR;
  871.       gr_dbm_mode = O_RDWR;
  872.   #ifdef    SHADOWGRP
  873. --- 1215,1226 ----
  874.   #endif
  875.   
  876.       /*
  877. !      * The open routines for the NDBM files don't use read-write
  878.        * as the mode, so we have to clue them in.
  879.        */
  880.   
  881.   #ifdef    NDBM
  882. +     pw_dbm_mode = O_RDWR;
  883.       sp_dbm_mode = O_RDWR;
  884.       gr_dbm_mode = O_RDWR;
  885.   #ifdef    SHADOWGRP
  886. ***************
  887. *** 1168,1173 ****
  888. --- 1242,1250 ----
  889.   
  890.       if (mflg)
  891.           move_home ();
  892. +     if (uflg)
  893. +         update_files ();
  894.   
  895.       exit (0);
  896.       /*NOTREACHED*/
  897. Index: lmain.c
  898. *** rel3/lmain.c    Sat Dec 28 19:40:52 1991
  899. --- lmain.c    Sat Dec 28 19:42:48 1991
  900. ***************
  901. *** 9,14 ****
  902. --- 9,15 ----
  903.    * distribution media.
  904.    */
  905.   
  906. + #include "config.h"
  907.   #include <sys/types.h>
  908.   #include <sys/stat.h>
  909.   #include <stdio.h>
  910. ***************
  911. *** 29,36 ****
  912.   #else
  913.   #include <sgtty.h>
  914.   #endif
  915. ! #include "config.h"
  916. ! #include "lastlog.h"
  917.   #include "faillog.h"
  918.   #include "shadow.h"
  919.   
  920. --- 30,36 ----
  921.   #else
  922.   #include <sgtty.h>
  923.   #endif
  924. ! #include <lastlog.h>
  925.   #include "faillog.h"
  926.   #include "shadow.h"
  927.   
  928. ***************
  929. *** 47,53 ****
  930.   #endif
  931.   
  932.   #ifndef    lint
  933. ! static    char    sccsid[] = "@(#)lmain.c    3.15    14:38:18    10/27/91";
  934.   #endif
  935.   
  936.                       /* danger - side effects */
  937. --- 47,53 ----
  938.   #endif
  939.   
  940.   #ifndef    lint
  941. ! static    char    sccsid[] = "@(#)lmain.c    3.17    19:39:58    12/28/91";
  942.   #endif
  943.   
  944.                       /* danger - side effects */
  945. ***************
  946. *** 68,74 ****
  947.   int    hflg;
  948.   #endif
  949.   int    preauth_flag;
  950. ! #ifndef    BSD
  951.   struct    termio    termio;
  952.   #endif
  953.   
  954. --- 68,74 ----
  955.   int    hflg;
  956.   #endif
  957.   int    preauth_flag;
  958. ! #if defined(USG) || defined(SUN4)
  959.   struct    termio    termio;
  960.   #endif
  961.   
  962. ***************
  963. *** 178,187 ****
  964.       if (cp = strchr (term, '/'))
  965.           *cp = '\0';
  966.   
  967.       if (! (pwd = getpwnam (name)))
  968.           return 0;
  969.   
  970. !     return ruserok (remote_host, pwd->pw_uid == 0, remote_name, name);
  971.   }
  972.   
  973.   get_remote_string (buf, size)
  974. --- 178,203 ----
  975.       if (cp = strchr (term, '/'))
  976.           *cp = '\0';
  977.   
  978. + #if defined(USG) || defined(SUN4)
  979. +     (void) ioctl (0, TCGETA, &termio);
  980. +     termio.c_iflag |= ICRNL|IXON;
  981. +     termio.c_oflag |= OPOST|ONLCR;
  982. +     termio.c_lflag |= ICANON|ECHO|ECHOE;
  983. +     (void) ioctl (0, TCSETA, &termio);
  984. + #endif
  985.       if (! (pwd = getpwnam (name)))
  986.           return 0;
  987.   
  988. !     /*
  989. !      * ruserok() returns 0 for success on modern systems, and 1 on
  990. !      * older ones.  If you are having trouble with people logging
  991. !      * in without giving a required password, THIS is the culprit -
  992. !      * go fix the #define in config.h.
  993. !      */
  994. !     return ruserok (remote_host, pwd->pw_uid == 0,
  995. !                 remote_name, name) == RUSEROK;
  996.   }
  997.   
  998.   get_remote_string (buf, size)
  999. ***************
  1000. *** 226,237 ****
  1001.   {
  1002.       char    name[32];
  1003.       char    pass[32];
  1004. -     char    hush[BUFSIZ];
  1005.       char    tty[BUFSIZ];
  1006.       int    retries;
  1007.       int    failed;
  1008.       int    flag;
  1009. -     int    i;
  1010.       int    subroot = 0;
  1011.       char    *fname;
  1012.       char    *cp;
  1013. --- 242,251 ----
  1014. ***************
  1015. *** 374,379 ****
  1016. --- 388,394 ----
  1017.   top:
  1018.       (void) alarm (ALARM);        /* only allow ALARM sec. for login */
  1019.   
  1020. +     environ = newenvp;        /* make new environment active */
  1021.       retries = RETRIES;
  1022.       while (1) {    /* repeatedly get login/password pairs */
  1023.           pass[0] = '\0';
  1024. ***************
  1025. *** 448,454 ****
  1026. --- 463,471 ----
  1027.            * been authenticated and so on.
  1028.            */
  1029.   
  1030. + #ifdef    RLOGIN
  1031.   have_name:
  1032. + #endif
  1033.           if (getdef_bool("DIALUPS_CHECK_ENAB")) {
  1034.               alarm (30);
  1035.               if (pwent.pw_name &&
  1036. ***************
  1037. *** 510,517 ****
  1038.                   else
  1039.                       STRFCPY (failent.ut_name, "UNKNOWN");
  1040.               time (&failent.ut_time);
  1041.               failent.ut_type = USER_PROCESS;
  1042. !  
  1043.               failtmp (&failent);
  1044.           }
  1045.   
  1046. --- 527,535 ----
  1047.                   else
  1048.                       STRFCPY (failent.ut_name, "UNKNOWN");
  1049.               time (&failent.ut_time);
  1050. + #ifdef    USG_UTMP
  1051.               failent.ut_type = USER_PROCESS;
  1052. ! #endif
  1053.               failtmp (&failent);
  1054.           }
  1055.   
  1056. ***************
  1057. *** 554,562 ****
  1058.   #endif
  1059.           exit (0);
  1060.       }
  1061. -     environ = newenvp;        /* make new environment active */
  1062.       if (getenv ("IFS"))        /* don't export user IFS ... */
  1063.           addenv ("IFS= \t\n");    /* ... instead, set a safe IFS */
  1064.   
  1065. --- 572,577 ----
  1066. Index: smain.c
  1067. *** rel3/smain.c    Sat Dec 28 19:40:58 1991
  1068. --- smain.c    Sat Dec 28 19:42:51 1991
  1069. ***************
  1070. *** 13,19 ****
  1071.   #include <stdio.h>
  1072.   
  1073.   #ifndef    lint
  1074. ! static    char    sccsid[] = "@(#)smain.c    3.9    08:27:43    10/31/91";
  1075.   #endif
  1076.   
  1077.   /*
  1078. --- 13,19 ----
  1079.   #include <stdio.h>
  1080.   
  1081.   #ifndef    lint
  1082. ! static    char    sccsid[] = "@(#)smain.c    3.10    12:04:52    12/28/91";
  1083.   #endif
  1084.   
  1085.   /*
  1086. ***************
  1087. *** 21,27 ****
  1088.    * kept right here 
  1089.    */
  1090.   
  1091. ! #ifdef    USG
  1092.   #include <string.h>
  1093.   #include <memory.h>
  1094.   #define    bzero(a,n)    memset(a, 0, n)
  1095. --- 21,28 ----
  1096.    * kept right here 
  1097.    */
  1098.   
  1099. ! #include "config.h"
  1100. ! #if defined(USG) || defined(SUN4)
  1101.   #include <string.h>
  1102.   #include <memory.h>
  1103.   #define    bzero(a,n)    memset(a, 0, n)
  1104. ***************
  1105. *** 34,40 ****
  1106.   #endif
  1107.   
  1108.   #include <signal.h>
  1109. - #include "config.h"
  1110.   #include "lastlog.h"
  1111.   #include "pwd.h"
  1112.   #include "shadow.h"
  1113. --- 35,40 ----
  1114. ***************
  1115. *** 127,134 ****
  1116.   void    die (killed)
  1117.   int    killed;
  1118.   {
  1119. ! #ifdef    BSD
  1120. !     static    struct    sgtty    sgtty;
  1121.   
  1122.       if (killed)
  1123.           stty (0, &sgtty);
  1124. --- 127,134 ----
  1125.   void    die (killed)
  1126.   int    killed;
  1127.   {
  1128. ! #if defined(BSD) || defined(SUN)
  1129. !     static    struct    sgttyb    sgtty;
  1130.   
  1131.       if (killed)
  1132.           stty (0, &sgtty);
  1133. ***************
  1134. *** 236,241 ****
  1135. --- 236,253 ----
  1136.   
  1137.       if (fakelogin && (cp=getdef_str("ENV_HZ")) )
  1138.           addenv (cp);        /* set the default $HZ, if one */
  1139. +     /*
  1140. +      * The terminal type will be left alone if it is present in the
  1141. +      * environment already.
  1142. +      */
  1143. +     if (fakelogin && (cp = getenv ("TERM"))) {
  1144. +         char    term[BUFSIZ];
  1145. +         sprintf (term, "TERM=%s", cp);
  1146. +         addenv (term);
  1147. +     }
  1148.   
  1149.       /*
  1150.        * The next argument must be either a user ID, or some flag to
  1151. Index: logoutd.c
  1152. *** rel3/logoutd.c    Sat Dec 28 19:41:53 1991
  1153. --- logoutd.c    Sat Dec 28 19:42:52 1991
  1154. ***************
  1155. *** 1,6 ****
  1156.   /*
  1157.    * Copyright 1991, John F. Haugh II
  1158. -  * An unpublished work.
  1159.    * All rights reserved.
  1160.    *
  1161.    * Permission is granted to copy and create derivative works for any
  1162. --- 1,5 ----
  1163. ***************
  1164. *** 11,17 ****
  1165.    */
  1166.   
  1167.   #ifndef lint
  1168. ! static    char    sccsid[] = "@(#)logoutd.c    3.1    16:31:39    9/22/91";
  1169.   #endif
  1170.   
  1171.   #include <sys/types.h>
  1172. --- 10,16 ----
  1173.    */
  1174.   
  1175.   #ifndef lint
  1176. ! static    char    sccsid[] = "@(#)logoutd.c    3.2    11:50:28    12/28/91";
  1177.   #endif
  1178.   
  1179.   #include <sys/types.h>
  1180. ***************
  1181. *** 18,23 ****
  1182. --- 17,23 ----
  1183.   #include <stdio.h>
  1184.   #include <signal.h>
  1185.   #include <utmp.h>
  1186. + #include "config.h"
  1187.   
  1188.   main ()
  1189.   {
  1190. ***************
  1191. *** 24,35 ****
  1192. --- 24,44 ----
  1193.       int    i;
  1194.       struct    utmp    utmp;
  1195.       int    fd;
  1196. + #if defined(BSD) || defined(SUN) || defined(SUN4)
  1197. +     char    tty_name[BUFSIZ];
  1198. +     int    tty_fd;
  1199. + #endif
  1200.   
  1201.       for (i = 0;close (i) == 0;i++)
  1202.           ;
  1203.   
  1204.   #ifdef    NDEBUG
  1205. + #ifdef    USG
  1206.       setpgrp ();
  1207. + #endif
  1208. + #if defined(BSD) || defined(SUN) || defined(SUN4)
  1209. +     setpgid (getpid ());
  1210. + #endif
  1211.       signal (SIGHUP, SIG_IGN);
  1212.   
  1213.       if (fork () > 0)
  1214. ***************
  1215. *** 43,57 ****
  1216.               continue;
  1217.   
  1218.           while (read (fd, &utmp, sizeof utmp) == sizeof utmp) {
  1219.               if (utmp.ut_type != USER_PROCESS)
  1220.                   continue;
  1221.               if (isttytime (utmp.ut_user, utmp.ut_line, time (0)))
  1222.                   continue;
  1223.               kill (- utmp.ut_pid, SIGHUP);
  1224.               sleep (10);
  1225.               kill (- utmp.ut_pid, SIGKILL);
  1226.           }
  1227.           close (fd);
  1228.       }
  1229. --- 52,86 ----
  1230.               continue;
  1231.   
  1232.           while (read (fd, &utmp, sizeof utmp) == sizeof utmp) {
  1233. + #ifdef    USG_UTMP
  1234.               if (utmp.ut_type != USER_PROCESS)
  1235.                   continue;
  1236. ! #endif
  1237. ! #ifdef BSD_UTMP
  1238. !             if (utmp.ut_user[0] == '\0')
  1239. !                 continue;
  1240. ! #endif
  1241.               if (isttytime (utmp.ut_user, utmp.ut_line, time (0)))
  1242.                   continue;
  1243. ! #ifdef    USG_UTMP
  1244.               kill (- utmp.ut_pid, SIGHUP);
  1245.               sleep (10);
  1246.               kill (- utmp.ut_pid, SIGKILL);
  1247. + #endif
  1248. + #if defined(BSD) || defined(SUN) || defined(SUN4)
  1249. +             /*
  1250. +              * vhangup() the line to kill try and kill
  1251. +              * whatever is out there using it.
  1252. +              */
  1253. +             strcat (strcpy (tty_name, "/dev/"), utmp.ut_line);
  1254. +             if ((tty_fd = open (tty_name, O_RDONLY|O_NDELAY)) == -1)
  1255. +                 continue;
  1256. +             vhangup (tty_fd);
  1257. +             close (tty_fd);
  1258. + #endif
  1259.           }
  1260.           close (fd);
  1261.       }
  1262. Index: utmp.c
  1263. *** rel3/utmp.c    Sat Dec 28 19:41:33 1991
  1264. --- utmp.c    Sat Dec 28 19:42:54 1991
  1265. ***************
  1266. *** 24,30 ****
  1267.   #include <stdio.h>
  1268.   #include "config.h"
  1269.   
  1270. ! #if defined(SUN) || defined(BSD)
  1271.   #ifndef    WTMP_FILE
  1272.   #define WTMP_FILE "/usr/adm/wtmp"
  1273.   #endif
  1274. --- 24,30 ----
  1275.   #include <stdio.h>
  1276.   #include "config.h"
  1277.   
  1278. ! #if defined(SUN) || defined(BSD) || defined(SUN4)
  1279.   #ifndef    WTMP_FILE
  1280.   #define WTMP_FILE "/usr/adm/wtmp"
  1281.   #endif
  1282. ***************
  1283. *** 31,37 ****
  1284.   #endif    /* SUN || BSD */
  1285.   
  1286.   #ifndef    lint
  1287. ! static    char    sccsid[] = "@(#)utmp.c    3.12    07:43:36    9/17/91";
  1288.   #endif
  1289.   
  1290.   extern    struct    utmp    utent;
  1291. --- 31,37 ----
  1292.   #endif    /* SUN || BSD */
  1293.   
  1294.   #ifndef    lint
  1295. ! static    char    sccsid[] = "@(#)utmp.c    3.13    11:58:53    12/28/91";
  1296.   #endif
  1297.   
  1298.   extern    struct    utmp    utent;
  1299. ***************
  1300. *** 77,83 ****
  1301.   #endif
  1302.   #endif
  1303.   
  1304. ! #ifndef    SUN
  1305.       setutent ();
  1306.   #endif    /* SUN */
  1307.   
  1308. --- 77,83 ----
  1309.   #endif
  1310.   #endif
  1311.   
  1312. ! #if !defined(SUN) && !defined(SUN4)
  1313.       setutent ();
  1314.   #endif    /* SUN */
  1315.   
  1316. ***************
  1317. *** 126,137 ****
  1318.           (void) time (&utent.ut_time);
  1319.       }
  1320.   #else    /* !USG */
  1321.       bzero (&utent, sizeof utent);
  1322.       if (! (line = ttyname (0))) {
  1323.           puts (NO_TTY);
  1324.           exit (1);
  1325.       }
  1326. !     if (strncmp (line, "/dev/", 5))
  1327.           line += 5;
  1328.   
  1329.       (void) strncpy (utent.ut_line, line, sizeof utent.ut_line);
  1330. --- 126,142 ----
  1331.           (void) time (&utent.ut_time);
  1332.       }
  1333.   #else    /* !USG */
  1334. +     /*
  1335. +      * Hand-craft a new utmp entry.
  1336. +      */
  1337.       bzero (&utent, sizeof utent);
  1338.       if (! (line = ttyname (0))) {
  1339.           puts (NO_TTY);
  1340.           exit (1);
  1341.       }
  1342. !     if (strncmp (line, "/dev/", 5) == 0)
  1343.           line += 5;
  1344.   
  1345.       (void) strncpy (utent.ut_line, line, sizeof utent.ut_line);
  1346. ***************
  1347. *** 158,172 ****
  1348.       if (! (fd = open ("/etc/utmp", O_RDWR)))
  1349.           return;
  1350.   
  1351.        while (! found && read (fd, &utmp, sizeof utmp) == sizeof utmp) {
  1352.            if (! strncmp (line, utmp.ut_line, (int) sizeof utmp.ut_line))
  1353.               found++;
  1354.       }
  1355.       if (! found) {
  1356.             (void) bzero (&utmp, sizeof utmp);
  1357.            (void) strncpy (utmp.ut_line, line, (int) sizeof utmp.ut_line);
  1358.       }
  1359. ! #if defined(SUN) || defined(BSD)
  1360.       (void) strncpy (utmp.ut_name, name, (int) sizeof utent.ut_name);
  1361.   #else    /* SUN */
  1362.        (void) strncpy (utmp.ut_user, name, (int) sizeof utent.ut_user);
  1363. --- 163,191 ----
  1364.       if (! (fd = open ("/etc/utmp", O_RDWR)))
  1365.           return;
  1366.   
  1367. + #if !defined(SUN) && !defined(BSD) && !defined(SUN4)
  1368.        while (! found && read (fd, &utmp, sizeof utmp) == sizeof utmp) {
  1369.            if (! strncmp (line, utmp.ut_line, (int) sizeof utmp.ut_line))
  1370.               found++;
  1371.       }
  1372. + #endif
  1373.       if (! found) {
  1374. +         /*
  1375. +          * This is a brand-new entry.  Clear it out and fill it in
  1376. +          * later.
  1377. +          */
  1378.             (void) bzero (&utmp, sizeof utmp);
  1379.            (void) strncpy (utmp.ut_line, line, (int) sizeof utmp.ut_line);
  1380.       }
  1381. !     /*
  1382. !      * Fill in the parts of the UTMP entry.  BSD has just the name,
  1383. !      * while System V has the name, PID and a type.
  1384. !      */
  1385. ! #if defined(SUN) || defined(BSD) || defined(SUN4)
  1386.       (void) strncpy (utmp.ut_name, name, (int) sizeof utent.ut_name);
  1387.   #else    /* SUN */
  1388.        (void) strncpy (utmp.ut_user, name, (int) sizeof utent.ut_user);
  1389. ***************
  1390. *** 173,182 ****
  1391.       utmp.ut_type = USER_PROCESS;
  1392.       utmp.ut_pid = getpid ();
  1393.   #endif    /* SUN || BSD */
  1394.       (void) time (&utmp.ut_time);
  1395.   
  1396. !     if (found)
  1397.           lseek (fd, (long) - sizeof utmp, 1);
  1398.   
  1399.       (void) write (fd, &utmp, sizeof utmp);
  1400.       (void) close (fd);
  1401. --- 192,231 ----
  1402.       utmp.ut_type = USER_PROCESS;
  1403.       utmp.ut_pid = getpid ();
  1404.   #endif    /* SUN || BSD */
  1405. +     /*
  1406. +      * Put in the current time (common to everyone)
  1407. +      */
  1408.       (void) time (&utmp.ut_time);
  1409.   
  1410. ! #ifdef UT_HOST
  1411. !     /*
  1412. !      * Update the host name field for systems with networking support
  1413. !      */
  1414. !     (void) strncpy (utmp.ut_host, utent.ut_host, (int) sizeof utmp.ut_host);
  1415. ! #endif
  1416. !     /*
  1417. !      * Locate the correct position in the UTMP file for this
  1418. !      * entry.
  1419. !      */
  1420. ! #if defined(SUN) || defined(BSD) || defined(SUN4)
  1421. !     (void) lseek (fd, (long) (sizeof utmp) * ttyslot (), 0);
  1422. ! #else
  1423. !     if (found)    /* Back up a splot */
  1424.           lseek (fd, (long) - sizeof utmp, 1);
  1425. +     else        /* Otherwise, go to the end of the file */
  1426. +         lseek (fd, (long) 0, 2);
  1427. + #endif
  1428. +     /*
  1429. +      * Scribble out the new entry and close the file.  We're done
  1430. +      * with UTMP, next we do WTMP (which is real easy, put it on
  1431. +      * the end of the file.
  1432. +      */
  1433.   
  1434.       (void) write (fd, &utmp, sizeof utmp);
  1435.       (void) close (fd);
  1436. Index: groupdel.c
  1437. *** rel3/groupdel.c    Sat Dec 28 19:41:49 1991
  1438. --- groupdel.c    Sat Dec 28 19:42:56 1991
  1439. ***************
  1440. *** 10,16 ****
  1441.    */
  1442.   
  1443.   #ifndef lint
  1444. ! static    char    sccsid[] = "@(#)groupdel.c    3.3    08:43:48    9/12/91";
  1445.   #endif
  1446.   
  1447.   #include <sys/types.h>
  1448. --- 10,16 ----
  1449.    */
  1450.   
  1451.   #ifndef lint
  1452. ! static    char    sccsid[] = "@(#)groupdel.c    3.5    19:39:55    12/28/91";
  1453.   #endif
  1454.   
  1455.   #include <sys/types.h>
  1456. ***************
  1457. *** 58,64 ****
  1458.   
  1459.   usage ()
  1460.   {
  1461. !     fprintf (stderr, "usage: groupmod group\n");
  1462.       exit (2);
  1463.   }
  1464.   
  1465. --- 58,64 ----
  1466.   
  1467.   usage ()
  1468.   {
  1469. !     fprintf (stderr, "usage: groupdel group\n");
  1470.       exit (2);
  1471.   }
  1472.   
  1473. ***************
  1474. *** 71,77 ****
  1475. --- 71,79 ----
  1476.   void
  1477.   grp_update ()
  1478.   {
  1479. + #ifdef    NDBM
  1480.       struct    group    *ogrp;
  1481. + #endif
  1482.   
  1483.       if (! gr_remove (group_name)) {
  1484.           fprintf (stderr, "%s: error removing group entry\n", Prog);
  1485. Index: entry.c
  1486. *** rel3/entry.c    Sat Dec 28 19:41:07 1991
  1487. --- entry.c    Sat Dec 28 19:42:58 1991
  1488. ***************
  1489. *** 9,14 ****
  1490. --- 9,15 ----
  1491.    * distribution media.
  1492.    */
  1493.   
  1494. + #include "config.h"
  1495.   #include "pwd.h"
  1496.   #ifndef    BSD
  1497.   #include <string.h>
  1498. ***************
  1499. *** 17,29 ****
  1500.   #define    strchr    index
  1501.   #define    strrchr    rindex
  1502.   #endif
  1503. - #include "config.h"
  1504.   #ifdef    SHADOWPWD
  1505.   #include "shadow.h"
  1506.   #endif
  1507.   
  1508.   #ifndef    lint
  1509. ! static    char    sccsid[] = "@(#)entry.c    3.4    08:57:50    7/10/91";
  1510.   #endif
  1511.   
  1512.   struct    passwd    *fgetpwent ();
  1513. --- 18,29 ----
  1514.   #define    strchr    index
  1515.   #define    strrchr    rindex
  1516.   #endif
  1517.   #ifdef    SHADOWPWD
  1518.   #include "shadow.h"
  1519.   #endif
  1520.   
  1521.   #ifndef    lint
  1522. ! static    char    sccsid[] = "@(#)entry.c    3.5    11:59:41    12/28/91";
  1523.   #endif
  1524.   
  1525.   struct    passwd    *fgetpwent ();
  1526. Index: newusers.c
  1527. *** rel3/newusers.c    Sat Dec 28 19:41:13 1991
  1528. --- newusers.c    Sat Dec 28 19:43:00 1991
  1529. ***************
  1530. *** 15,32 ****
  1531.    *    adding entries in the related directories.
  1532.    */
  1533.   
  1534.   #include <stdio.h>
  1535.   #include "pwd.h"
  1536.   #include <grp.h>
  1537.   #include <fcntl.h>
  1538.   #include <string.h>
  1539. - #include "config.h"
  1540.   #ifdef    SHADOWPWD
  1541.   #include "shadow.h"
  1542.   #endif
  1543.   
  1544.   #ifndef    lint
  1545. ! static    char    sccsid[] = "@(#)newusers.c    3.5    07:44:18    9/17/91";
  1546.   #endif
  1547.   
  1548.   char    *Prog;
  1549. --- 15,32 ----
  1550.    *    adding entries in the related directories.
  1551.    */
  1552.   
  1553. + #include "config.h"
  1554.   #include <stdio.h>
  1555.   #include "pwd.h"
  1556.   #include <grp.h>
  1557.   #include <fcntl.h>
  1558.   #include <string.h>
  1559.   #ifdef    SHADOWPWD
  1560.   #include "shadow.h"
  1561.   #endif
  1562.   
  1563.   #ifndef    lint
  1564. ! static    char    sccsid[] = "@(#)newusers.c    3.6    12:04:31    12/28/91";
  1565.   #endif
  1566.   
  1567.   char    *Prog;
  1568. ***************
  1569. *** 222,228 ****
  1570.   
  1571.       if (uid[0] >= '0' && uid[0] <= '9') {
  1572.           i = atoi (uid);
  1573. !     } if (uid[0] && (pwd = pw_locate (uid))) {
  1574.           i = pwd->pw_uid;
  1575.       } else {
  1576.           i = 100;
  1577. --- 222,228 ----
  1578.   
  1579.       if (uid[0] >= '0' && uid[0] <= '9') {
  1580.           i = atoi (uid);
  1581. !     } else if (uid[0] && (pwd = pw_locate (uid))) {
  1582.           i = pwd->pw_uid;
  1583.       } else {
  1584.           i = 100;
  1585. ***************
  1586. *** 459,465 ****
  1587.               else
  1588.                   break;
  1589.           }
  1590. !         if (*cp || nfields != 6) {
  1591.               fprintf (stderr, "%s: line %d: invalid line\n",
  1592.                   Prog, line);
  1593.               continue;
  1594. --- 459,465 ----
  1595.               else
  1596.                   break;
  1597.           }
  1598. !         if (nfields != 6) {
  1599.               fprintf (stderr, "%s: line %d: invalid line\n",
  1600.                   Prog, line);
  1601.               continue;
  1602. Index: pwpack.c
  1603. *** rel3/pwpack.c    Sat Dec 28 19:40:53 1991
  1604. --- pwpack.c    Sat Dec 28 19:43:02 1991
  1605. ***************
  1606. *** 1,5 ****
  1607.   /*
  1608. !  * Copyright 1990, John F. Haugh II
  1609.    * All rights reserved.
  1610.    *
  1611.    * Permission is granted to copy and create derivative works for any
  1612. --- 1,5 ----
  1613.   /*
  1614. !  * Copyright 1990, 1991, John F. Haugh II
  1615.    * All rights reserved.
  1616.    *
  1617.    * Permission is granted to copy and create derivative works for any
  1618. ***************
  1619. *** 9,14 ****
  1620. --- 9,15 ----
  1621.    * distribution media.
  1622.    */
  1623.   
  1624. + #include "config.h"
  1625.   #include <stdio.h>
  1626.   #include "pwd.h"
  1627.   #ifdef    BSD
  1628. ***************
  1629. *** 18,27 ****
  1630.   #else
  1631.   #include <string.h>
  1632.   #endif
  1633. - #include "config.h"
  1634.   
  1635.   #ifndef    lint
  1636. ! static    char    sccsid[] = "@(#)pwpack.c    3.3    12:31:23    12/12/90";
  1637.   #endif
  1638.   
  1639.   /*
  1640. --- 19,27 ----
  1641.   #else
  1642.   #include <string.h>
  1643.   #endif
  1644.   
  1645.   #ifndef    lint
  1646. ! static    char    sccsid[] = "@(#)pwpack.c    3.4    11:50:31    12/28/91";
  1647.   #endif
  1648.   
  1649.   /*
  1650. Index: pwent.c
  1651. *** rel3/pwent.c    Sat Dec 28 19:41:05 1991
  1652. --- pwent.c    Sat Dec 28 19:43:07 1991
  1653. ***************
  1654. *** 9,14 ****
  1655. --- 9,15 ----
  1656.    * distribution media.
  1657.    */
  1658.   
  1659. + #include "config.h"
  1660.   #include <stdio.h>
  1661.   #include "pwd.h"
  1662.   #ifdef    BSD
  1663. ***************
  1664. *** 18,24 ****
  1665.   #else
  1666.   #include <string.h>
  1667.   #endif
  1668. - #include "config.h"
  1669.   
  1670.   /*
  1671.    * If AUTOSHADOW is enable, the getpwnam and getpwuid calls will
  1672. --- 19,24 ----
  1673. ***************
  1674. *** 60,66 ****
  1675.   #endif
  1676.   
  1677.   #ifndef    lint
  1678. ! static    char    sccsid[] = "@(#)pwent.c    3.6    08:09:35    7/15/91";
  1679.   #endif
  1680.   
  1681.   #define    SBUFSIZ    64
  1682. --- 60,66 ----
  1683.   #endif
  1684.   
  1685.   #ifndef    lint
  1686. ! static    char    sccsid[] = "@(#)pwent.c    3.7    12:04:47    12/28/91";
  1687.   #endif
  1688.   
  1689.   #define    SBUFSIZ    64
  1690. ***************
  1691. *** 472,478 ****
  1692.       return 0;
  1693.   }
  1694.   
  1695. ! #ifdef SUN
  1696.   
  1697.   /*
  1698.    * putpwent - Output a (struct passwd) in character format
  1699. --- 472,478 ----
  1700.       return 0;
  1701.   }
  1702.   
  1703. ! #ifdef NEED_PUTPWENT
  1704.   
  1705.   /*
  1706.    * putpwent - Output a (struct passwd) in character format
  1707. ***************
  1708. *** 488,495 ****
  1709.   struct    passwd    *p;
  1710.   FILE    *f;
  1711.   {
  1712. !     return (fprintf (f, "%s:%s:%d:%d:%s,%s:%s:%s\n",
  1713.           p->pw_name, p->pw_passwd, p->pw_uid, p->pw_gid,
  1714. !         p->pw_gecos, p->pw_comment, p->pw_dir, p->pw_shell) == EOF);
  1715.   }
  1716. ! #endif /* SUN */
  1717. --- 488,513 ----
  1718.   struct    passwd    *p;
  1719.   FILE    *f;
  1720.   {
  1721. !     int    status;
  1722. ! #if defined(SUN) || defined(BSD) || defined(SUN4)
  1723. !     status = fprintf (f, "%s:%s:%d:%d:%s,%s:%s:%s\n",
  1724.           p->pw_name, p->pw_passwd, p->pw_uid, p->pw_gid,
  1725. !         p->pw_gecos, p->pw_comment, p->pw_dir, p->pw_shell) == EOF;
  1726. ! #else
  1727. !     status = fprintf (f, "%s:%s", p->pw_name, p->pw_passwd) == EOF;
  1728. ! #ifdef    ATT_AGE
  1729. !     if (p->pw_age && p->pw_age[0])
  1730. !         status |= fprintf (f, ",%s", p->pw_age) == EOF;
  1731. ! #endif
  1732. !     status |= fprintf (f, ":%d:%d:%s", p->pw_uid, p->pw_gid,
  1733. !         p->pw_gecos) == EOF;
  1734. ! #ifdef    ATT_COMMENT
  1735. !     if (p->pw_comment && p->pw_comment[0])
  1736. !         status |= fprintf (f, ",%s", p->pw_comment) == EOF;
  1737. ! #endif
  1738. !     status |= fprintf (f, ":%s:%s\n", p->pw_dir, p->pw_shell) == EOF;
  1739. ! #endif
  1740. !     return status;
  1741.   }
  1742. ! #endif /* NEED_PUTPWENT */
  1743. Index: pwunconv.c
  1744. *** rel3/pwunconv.c    Sat Dec 28 19:40:42 1991
  1745. --- pwunconv.c    Sat Dec 28 19:43:08 1991
  1746. ***************
  1747. *** 19,33 ****
  1748.    *    possible.
  1749.    */
  1750.   
  1751.   #include <sys/types.h>
  1752.   #include <stdio.h>
  1753.   #include <fcntl.h>
  1754.   #include "pwd.h"
  1755. - #include "config.h"
  1756.   #include "shadow.h"
  1757.   
  1758.   #ifndef    lint
  1759. ! static    char    sccsid[] = "@(#)pwunconv.c    3.3    09:08:06    5/28/91";
  1760.   #endif
  1761.   
  1762.   #ifdef    ITI_AGING
  1763. --- 19,33 ----
  1764.    *    possible.
  1765.    */
  1766.   
  1767. + #include "config.h"
  1768.   #include <sys/types.h>
  1769.   #include <stdio.h>
  1770.   #include <fcntl.h>
  1771.   #include "pwd.h"
  1772.   #include "shadow.h"
  1773.   
  1774.   #ifndef    lint
  1775. ! static    char    sccsid[] = "@(#)pwunconv.c    3.4    11:59:24    12/28/91";
  1776.   #endif
  1777.   
  1778.   #ifdef    ITI_AGING
  1779. Index: ttytype.c
  1780. *** rel3/ttytype.c    Sat Dec 28 19:41:08 1991
  1781. --- ttytype.c    Sat Dec 28 19:43:10 1991
  1782. ***************
  1783. *** 21,27 ****
  1784.   #include "config.h"
  1785.   
  1786.   #ifndef    lint
  1787. ! static    char    _sccsid[] = "@(#)ttytype.c    3.1    07:43:33    9/17/91";
  1788.   #endif
  1789.   
  1790.   extern    char    *getdef_str();
  1791. --- 21,27 ----
  1792.   #include "config.h"
  1793.   
  1794.   #ifndef    lint
  1795. ! static    char    _sccsid[] = "@(#)ttytype.c    3.3    19:40:04    12/28/91";
  1796.   #endif
  1797.   
  1798.   extern    char    *getdef_str();
  1799. ***************
  1800. *** 37,43 ****
  1801.       FILE    *fp;
  1802.       char    buf[BUFSIZ];
  1803.       char    termvar[BUFSIZ];
  1804. !     char    *ttytype;
  1805.       char    *cp;
  1806.       char    *type;
  1807.       char    *port;
  1808. --- 37,43 ----
  1809.       FILE    *fp;
  1810.       char    buf[BUFSIZ];
  1811.       char    termvar[BUFSIZ];
  1812. !     char    *typefile;
  1813.       char    *cp;
  1814.       char    *type;
  1815.       char    *port;
  1816. ***************
  1817. *** 45,57 ****
  1818.   
  1819.       if (getenv ("TERM"))
  1820.           return;
  1821. !     if ((ttytype=getdef_str("TTYTYPE_FILE")) == NULL )
  1822.           return;
  1823. !     if (access (ttytype, 0))
  1824.           return;
  1825.   
  1826. !     if (! (fp = fopen (ttytype, "r"))) {
  1827. !         perror (ttytype);
  1828.           return;
  1829.       }
  1830.       while (fgets (buf, BUFSIZ, fp)) {
  1831. --- 45,57 ----
  1832.   
  1833.       if (getenv ("TERM"))
  1834.           return;
  1835. !     if ((typefile=getdef_str("TTYTYPE_FILE")) == NULL )
  1836.           return;
  1837. !     if (access (typefile, 0))
  1838.           return;
  1839.   
  1840. !     if (! (fp = fopen (typefile, "r"))) {
  1841. !         perror (typefile);
  1842.           return;
  1843.       }
  1844.       while (fgets (buf, BUFSIZ, fp)) {
  1845. ***************
  1846. *** 61,67 ****
  1847.           if (cp = strchr (buf, '\n'))
  1848.               *cp = '\0';
  1849.   
  1850. ! #if defined(SUN) || defined(BSD)
  1851.           if ((port = strtok (buf, "\t"))
  1852.                   && (type = strtok ((char *) 0, "\t"))
  1853.                   && (type = strtok ((char *) 0, "\t"))) {
  1854. --- 61,67 ----
  1855.           if (cp = strchr (buf, '\n'))
  1856.               *cp = '\0';
  1857.   
  1858. ! #if defined(SUN) || defined(BSD) || defined(SUN4)
  1859.           if ((port = strtok (buf, "\t"))
  1860.                   && (type = strtok ((char *) 0, "\t"))
  1861.                   && (type = strtok ((char *) 0, "\t"))) {
  1862. ***************
  1863. *** 74,81 ****
  1864.               if (strcmp (line, port) == 0)
  1865.                   break;
  1866.           }
  1867. -     }
  1868.   #endif
  1869.       if (! feof (fp) && ! ferror (fp)) {
  1870.           strcat (strcpy (termvar, "TERM="), type);
  1871.           addenv (termvar);
  1872. --- 74,81 ----
  1873.               if (strcmp (line, port) == 0)
  1874.                   break;
  1875.           }
  1876.   #endif
  1877. +     }
  1878.       if (! feof (fp) && ! ferror (fp)) {
  1879.           strcat (strcpy (termvar, "TERM="), type);
  1880.           addenv (termvar);
  1881. Index: pwd.h.m4
  1882. *** rel3/pwd.h.m4    Sat Dec 28 19:41:27 1991
  1883. --- pwd.h.m4    Sat Dec 28 19:43:11 1991
  1884. ***************
  1885. *** 15,21 ****
  1886.    * It is not derived from any of those sources.  Note that it can be
  1887.    * site-defined to have non-POSIX features as well.
  1888.    *
  1889. !  *    @(#)pwd.h.m4    3.1    08:54:41    11/3/91
  1890.    */
  1891.   
  1892.   #ifndef    PWD_H
  1893. --- 15,21 ----
  1894.    * It is not derived from any of those sources.  Note that it can be
  1895.    * site-defined to have non-POSIX features as well.
  1896.    *
  1897. !  *    @(#)pwd.h.m4    3.2    12:04:43    12/28/91
  1898.    */
  1899.   
  1900.   #ifndef    PWD_H
  1901. ***************
  1902. *** 30,35 ****
  1903. --- 30,37 ----
  1904.   #include <sys/types.h>
  1905.   #endif
  1906.   
  1907. + ifdef(`SUN4', `#define    ATT_AGE')
  1908. + ifdef(`SUN4', `#define  ATT_COMMENT')
  1909.   ifdef(`SUN', `#define    BSD_QUOTAS')
  1910.   ifdef(`BSD', `#define    BSD_QUOTAS')
  1911.   ifdef(`USG', `#define    ATT_AGE')
  1912. Index: port.c
  1913. *** rel3/port.c    Sat Dec 28 19:40:51 1991
  1914. --- port.c    Sat Dec 28 19:43:13 1991
  1915. ***************
  1916. *** 24,30 ****
  1917.   #include "port.h"
  1918.   
  1919.   #ifndef    lint
  1920. ! static    char    _sccsid[] = "@(#)port.c    3.1    08:59:32    2/8/91";
  1921.   #endif
  1922.   
  1923.   extern    int    errno;
  1924. --- 24,30 ----
  1925.   #include "port.h"
  1926.   
  1927.   #ifndef    lint
  1928. ! static    char    _sccsid[] = "@(#)port.c    3.2    11:58:29    12/28/91";
  1929.   #endif
  1930.   
  1931.   extern    int    errno;
  1932. ***************
  1933. *** 32,38 ****
  1934.   static    FILE    *ports;
  1935.   
  1936.   /*
  1937. !  * setttyent - open /etc/porttime file or rewind
  1938.    *
  1939.    *    the /etc/porttime file is rewound if already open, or
  1940.    *    opened for reading.
  1941. --- 32,38 ----
  1942.   static    FILE    *ports;
  1943.   
  1944.   /*
  1945. !  * setportent - open /etc/porttime file or rewind
  1946.    *
  1947.    *    the /etc/porttime file is rewound if already open, or
  1948.    *    opened for reading.
  1949. ***************
  1950. *** 39,45 ****
  1951.    */
  1952.   
  1953.   void
  1954. ! setttyent ()
  1955.   {
  1956.       if (ports)
  1957.           rewind (ports);
  1958. --- 39,45 ----
  1959.    */
  1960.   
  1961.   void
  1962. ! setportent ()
  1963.   {
  1964.       if (ports)
  1965.           rewind (ports);
  1966. ***************
  1967. *** 48,54 ****
  1968.   }
  1969.   
  1970.   /*
  1971. !  * endttyent - close the /etc/porttime file
  1972.    *
  1973.    *    the /etc/porttime file is closed and the ports variable set
  1974.    *    to NULL to indicate that the /etc/porttime file is no longer
  1975. --- 48,54 ----
  1976.   }
  1977.   
  1978.   /*
  1979. !  * endportent - close the /etc/porttime file
  1980.    *
  1981.    *    the /etc/porttime file is closed and the ports variable set
  1982.    *    to NULL to indicate that the /etc/porttime file is no longer
  1983. ***************
  1984. *** 56,62 ****
  1985.    */
  1986.   
  1987.   void
  1988. ! endttyent ()
  1989.   {
  1990.       if (ports)
  1991.           fclose (ports);
  1992. --- 56,62 ----
  1993.    */
  1994.   
  1995.   void
  1996. ! endportent ()
  1997.   {
  1998.       if (ports)
  1999.           fclose (ports);
  2000. ***************
  2001. *** 65,71 ****
  2002.   }
  2003.   
  2004.   /*
  2005. !  * getttyent - read a single entry from /etc/porttime
  2006.    *
  2007.    *    the next line in /etc/porttime is converted to a (struct port)
  2008.    *    and a pointer to a static (struct port) is returned to the
  2009. --- 65,71 ----
  2010.   }
  2011.   
  2012.   /*
  2013. !  * getportent - read a single entry from /etc/porttime
  2014.    *
  2015.    *    the next line in /etc/porttime is converted to a (struct port)
  2016.    *    and a pointer to a static (struct port) is returned to the
  2017. ***************
  2018. *** 74,80 ****
  2019.    */
  2020.   
  2021.   struct port *
  2022. ! getttyent ()
  2023.   {
  2024.       static    struct    port    port;    /* static struct to point to         */
  2025.       static    char    buf[BUFSIZ];    /* some space for stuff              */
  2026. --- 74,80 ----
  2027.    */
  2028.   
  2029.   struct port *
  2030. ! getportent ()
  2031.   {
  2032.       static    struct    port    port;    /* static struct to point to         */
  2033.       static    char    buf[BUFSIZ];    /* some space for stuff              */
  2034. ***************
  2035. *** 92,98 ****
  2036.        */
  2037.   
  2038.       if (! ports)
  2039. !         setttyent ();
  2040.   
  2041.       if (! ports) {
  2042.           errno = saveerr;
  2043. --- 92,98 ----
  2044.        */
  2045.   
  2046.       if (! ports)
  2047. !         setportent ();
  2048.   
  2049.       if (! ports) {
  2050.           errno = saveerr;
  2051. ***************
  2052. *** 307,315 ****
  2053.       int    i, j;
  2054.       struct    port    *port;
  2055.   
  2056. !     setttyent ();
  2057.   
  2058. !     while (port = getttyent ()) {
  2059.           if (port->pt_names == 0 || port->pt_users == 0)
  2060.               continue;
  2061.   
  2062. --- 307,315 ----
  2063.       int    i, j;
  2064.       struct    port    *port;
  2065.   
  2066. !     setportent ();
  2067.   
  2068. !     while (port = getportent ()) {
  2069.           if (port->pt_names == 0 || port->pt_users == 0)
  2070.               continue;
  2071.   
  2072. ***************
  2073. *** 329,335 ****
  2074.           if (port->pt_users[j] != 0)
  2075.               break;
  2076.       }
  2077. !     endttyent ();
  2078.       return port;
  2079.   }
  2080.   
  2081. --- 329,335 ----
  2082.           if (port->pt_users[j] != 0)
  2083.               break;
  2084.       }
  2085. !     endportent ();
  2086.       return port;
  2087.   }
  2088.   
  2089. Index: chsh.c
  2090. *** rel3/chsh.c    Sat Dec 28 19:40:57 1991
  2091. --- chsh.c    Sat Dec 28 19:43:15 1991
  2092. ***************
  2093. *** 15,21 ****
  2094.   #include <signal.h>
  2095.   
  2096.   #ifndef    lint
  2097. ! static    char    sccsid[] = "@(#)chsh.c    3.6    20:58:54    8/15/91";
  2098.   #endif
  2099.   
  2100.   /*
  2101. --- 15,21 ----
  2102.   #include <signal.h>
  2103.   
  2104.   #ifndef    lint
  2105. ! static    char    sccsid[] = "@(#)chsh.c    3.7    11:58:57    12/28/91";
  2106.   #endif
  2107.   
  2108.   /*
  2109. ***************
  2110. *** 42,48 ****
  2111. --- 42,53 ----
  2112.   #define    LOG_WARN LOG_WARNING
  2113.   #endif
  2114.   #endif
  2115. + #ifdef    USE_RLIMIT
  2116. + #include <sys/resource.h>
  2117.   
  2118. + struct    rlimit    rlimit_fsize = { RLIM_INFINITY, RLIM_INFINIT };
  2119. + #endif
  2120.   /*
  2121.    * Global variables.
  2122.    */
  2123. ***************
  2124. *** 373,379 ****
  2125. --- 378,389 ----
  2126.        * keyboard signals are set to be ignored.
  2127.        */
  2128.   
  2129. + #ifdef    HAVE_ULIMIT
  2130.       ulimit (2, 30000);
  2131. + #endif
  2132. + #ifdef    HAVE_RLIMIT
  2133. +     setrlimit (RLIMIT_FSIZE, &rlimit_fsize);
  2134. + #endif
  2135.       if (setuid (0)) {
  2136.           fprintf (stderr, NOTROOT);
  2137.   #ifdef    USE_SYSLOG
  2138. Index: chfn.c
  2139. *** rel3/chfn.c    Sat Dec 28 19:40:56 1991
  2140. --- chfn.c    Sat Dec 28 19:43:17 1991
  2141. ***************
  2142. *** 15,21 ****
  2143.   #include <signal.h>
  2144.   
  2145.   #ifndef    lint
  2146. ! static    char    sccsid[] = "@(#)chfn.c    3.7    10:14:35    8/15/91";
  2147.   #endif
  2148.   
  2149.   /*
  2150. --- 15,21 ----
  2151.   #include <signal.h>
  2152.   
  2153.   #ifndef    lint
  2154. ! static    char    sccsid[] = "@(#)chfn.c    3.8    11:59:27    12/28/91";
  2155.   #endif
  2156.   
  2157.   /*
  2158. ***************
  2159. *** 42,48 ****
  2160. --- 42,53 ----
  2161.   #define    LOG_WARN LOG_WARNING
  2162.   #endif
  2163.   #endif
  2164. + #ifdef    USE_RLIMIT
  2165. + #include <sys/resource.h>
  2166.   
  2167. + struct    rlimit    rlimit_fsize = { RLIM_INFINITY, RLIM_INFINIT };
  2168. + #endif
  2169.   /*
  2170.    * Global variables.
  2171.    */
  2172. ***************
  2173. *** 467,473 ****
  2174. --- 472,483 ----
  2175.        * keyboard signals are set to be ignored.
  2176.        */
  2177.   
  2178. + #ifdef    HAVE_ULIMIT
  2179.       ulimit (2, 30000);
  2180. + #endif
  2181. + #ifdef    HAVE_RLIMIT
  2182. +     setrlimit (RLIMIT_FSIZE, &rlimit_fsize);
  2183. + #endif
  2184.       if (setuid (0)) {
  2185.           fprintf (stderr, NOTROOT);
  2186.   #ifdef    USE_SYSLOG
  2187. Index: passwd.c
  2188. *** rel3/passwd.c    Sat Dec 28 19:40:46 1991
  2189. --- passwd.c    Sat Dec 28 19:43:19 1991
  2190. ***************
  2191. *** 9,14 ****
  2192. --- 9,15 ----
  2193.    * distribution media.
  2194.    */
  2195.   
  2196. + #include "config.h"
  2197.   #include <sys/types.h>
  2198.   #include <time.h>
  2199.   #include <stdio.h>
  2200. ***************
  2201. *** 16,22 ****
  2202.   #include <signal.h>
  2203.   
  2204.   #ifndef    lint
  2205. ! static    char    sccsid[] = "@(#)passwd.c    3.6    08:43:55    9/12/91";
  2206.   #endif
  2207.   
  2208.   /*
  2209. --- 17,23 ----
  2210.   #include <signal.h>
  2211.   
  2212.   #ifndef    lint
  2213. ! static    char    sccsid[] = "@(#)passwd.c    3.7    12:04:36    12/28/91";
  2214.   #endif
  2215.   
  2216.   /*
  2217. ***************
  2218. *** 34,40 ****
  2219.   #define    strrchr    rindex
  2220.   #endif
  2221.   
  2222. - #include "config.h"
  2223.   #include "pwd.h"
  2224.   #include "lastlog.h"
  2225.   #include "shadow.h"
  2226. --- 35,40 ----
  2227. ***************
  2228. *** 46,51 ****
  2229. --- 46,56 ----
  2230.   #define    LOG_WARN    LOG_WARNING
  2231.   #endif
  2232.   #endif
  2233. + #ifdef    USE_RLIMIT
  2234. + #include <sys/resource.h>
  2235. + struct    rlimit    rlimit_fsize = { RLIM_INFINITY, RLIM_INFINIT };
  2236. + #endif
  2237.   
  2238.   /*
  2239.    * Password aging constants
  2240. ***************
  2241. *** 426,431 ****
  2242. --- 431,437 ----
  2243.   char    **argv;
  2244.   {
  2245.       char    buf[BUFSIZ];        /* I/O buffer for messages, etc.      */
  2246. +     char    new_passwd[BUFSIZ];    /* Buffer for changed passwords       */
  2247.       char    *cp;            /* Miscellaneous character pointing   */
  2248.       time_t    min;            /* Minimum days before change         */
  2249.       time_t    max;            /* Maximum days until change          */
  2250. ***************
  2251. *** 434,439 ****
  2252. --- 440,446 ----
  2253.       int    i;            /* Loop control variable              */
  2254.       int    flag;            /* Current option to process          */
  2255.       int    lflg = 0;        /* -l - lock account option           */
  2256. +     int    uflg = 0;        /* -u - unlock account option         */
  2257.       int    dflg = 0;        /* -d - delete password option        */
  2258.       int    xflg = 0;        /* -x - set maximum days              */
  2259.       int    nflg = 0;        /* -n - set minimum days              */
  2260. ***************
  2261. *** 512,518 ****
  2262.        * which are restricted to root only.
  2263.        */
  2264.   
  2265. !     while ((flag = getopt (argc, argv, "ldx:n:w:i:S")) != EOF) {
  2266.           switch (flag) {
  2267.               case 'x':
  2268.                   max = strtol (optarg, &cp, 10);
  2269. --- 519,525 ----
  2270.        * which are restricted to root only.
  2271.        */
  2272.   
  2273. !     while ((flag = getopt (argc, argv, "ludx:n:w:i:S")) != EOF) {
  2274.           switch (flag) {
  2275.               case 'x':
  2276.                   max = strtol (optarg, &cp, 10);
  2277. ***************
  2278. *** 554,559 ****
  2279. --- 561,569 ----
  2280.               case 'l':
  2281.                   lflg++;
  2282.                   break;
  2283. +             case 'u':
  2284. +                 uflg++;
  2285. +                 break;
  2286.               default:
  2287.                   usage ();
  2288.           }
  2289. ***************
  2290. *** 570,576 ****
  2291.                   wflg || iflg || Sflg) && optind >= argc)
  2292.           usage ();
  2293.   
  2294. !     if ((dflg + lflg + (xflg || nflg || wflg || iflg) + Sflg) > 1)
  2295.           usage ();
  2296.   
  2297.       /*
  2298. --- 580,586 ----
  2299.                   wflg || iflg || Sflg) && optind >= argc)
  2300.           usage ();
  2301.   
  2302. !     if ((dflg + lflg + uflg + (xflg || nflg || wflg || iflg) + Sflg) > 1)
  2303.           usage ();
  2304.   
  2305.       /*
  2306. ***************
  2307. *** 655,661 ****
  2308.        * If there are no other flags, just change the password.
  2309.        */
  2310.   
  2311. !     if (! (dflg || lflg || xflg || nflg || wflg || iflg)) {
  2312.   
  2313.           /*
  2314.            * See if the user is permitted to change the password.
  2315. --- 665,671 ----
  2316.        * If there are no other flags, just change the password.
  2317.        */
  2318.   
  2319. !     if (! (dflg || lflg || uflg || xflg || nflg || wflg || iflg)) {
  2320.   
  2321.           /*
  2322.            * See if the user is permitted to change the password.
  2323. ***************
  2324. *** 681,689 ****
  2325.       if (dflg)            /* Set password to blank */
  2326.           sp->sp_pwdp = "";
  2327.   
  2328. !     if (lflg)            /* Set password to "locked" value */
  2329. !         sp->sp_pwdp = "!";
  2330.       if (xflg)
  2331.           sp->sp_max = (max * DAY) / SCALE;
  2332.   
  2333. --- 691,709 ----
  2334.       if (dflg)            /* Set password to blank */
  2335.           sp->sp_pwdp = "";
  2336.   
  2337. !     if (lflg) {            /* Set password to "locked" value */
  2338. !         if (sp->sp_pwdp && sp->sp_pwdp[0] != '!') {
  2339. !             strcpy (new_passwd, "!");
  2340. !             strcat (new_passwd, sp->sp_pwdp);
  2341. !             sp->sp_pwdp = new_passwd;
  2342. !         }
  2343. !     }
  2344. !     if (uflg) {            /* Undo password "locked" value */
  2345. !         if (sp->sp_pwdp && sp->sp_pwdp[0] == '!') {
  2346. !             strcpy (new_passwd, sp->sp_pwdp + 1);
  2347. !             sp->sp_pwdp = new_passwd;
  2348. !         }
  2349. !     }
  2350.       if (xflg)
  2351.           sp->sp_max = (max * DAY) / SCALE;
  2352.   
  2353. ***************
  2354. *** 703,709 ****
  2355. --- 723,734 ----
  2356.        * keyboard signals are set to be ignored.
  2357.        */
  2358.   
  2359. + #ifdef    HAVE_ULIMIT
  2360.       ulimit (2, 30000);
  2361. + #endif
  2362. + #ifdef    HAVE_RLIMIT
  2363. +     setrlimit (RLIMIT_FSIZE, &rlimit_fsize);
  2364. + #endif
  2365.       if (setuid (0)) {
  2366.           fprintf (stderr, NOTROOT);
  2367.   #ifdef    USE_SYSLOG
  2368. Index: gpmain.c
  2369. *** rel3/gpmain.c    Sat Dec 28 19:41:02 1991
  2370. --- gpmain.c    Sat Dec 28 19:43:22 1991
  2371. ***************
  2372. *** 17,45 ****
  2373.   #include <fcntl.h>
  2374.   #include <signal.h>
  2375.   #include <errno.h>
  2376. ! #ifndef    BSD
  2377.   #include <termio.h>
  2378.   #ifdef SYS3
  2379. ! #include <sys/ioctl.h>
  2380. ! #endif
  2381.   #include <string.h>
  2382.   #ifndef    SYS3
  2383. ! #include <memory.h>
  2384. ! #endif
  2385. ! #else
  2386.   #include <sgtty.h>
  2387.   #include <strings.h>
  2388.   #define    strchr    index
  2389.   #define    strrchr    rindex
  2390. ! #endif
  2391.   #include "config.h"
  2392.   
  2393. ! #if !defined(BSD) || !defined(SUN)
  2394.   #define    bzero(p,l) memset(p, 0, l)
  2395.   #endif
  2396.   
  2397.   #ifndef    lint
  2398. ! static    char    _sccsid[] = "@(#)gpmain.c    3.10    07:44:08    9/17/91";
  2399.   #endif
  2400.   
  2401.   char    name[BUFSIZ];
  2402. --- 17,45 ----
  2403.   #include <fcntl.h>
  2404.   #include <signal.h>
  2405.   #include <errno.h>
  2406. ! #if defined(USG) || defined(SUN4)
  2407.   #include <termio.h>
  2408.   #ifdef SYS3
  2409. ! # include <sys/ioctl.h>
  2410. ! #endif    /* SYS3 */
  2411.   #include <string.h>
  2412.   #ifndef    SYS3
  2413. ! # include <memory.h>
  2414. ! #endif /* !SYS3 */
  2415. ! #else /* SUN || BSD */
  2416.   #include <sgtty.h>
  2417.   #include <strings.h>
  2418.   #define    strchr    index
  2419.   #define    strrchr    rindex
  2420. ! #endif /* !SUN && !BSD */
  2421.   #include "config.h"
  2422.   
  2423. ! #ifdef    USG
  2424.   #define    bzero(p,l) memset(p, 0, l)
  2425.   #endif
  2426.   
  2427.   #ifndef    lint
  2428. ! static    char    _sccsid[] = "@(#)gpmain.c    3.12    19:39:50    12/28/91";
  2429.   #endif
  2430.   
  2431.   char    name[BUFSIZ];
  2432. ***************
  2433. *** 169,177 ****
  2434. --- 169,179 ----
  2435.       struct    group    *gr = 0;
  2436.       struct    group    *getgrnam ();
  2437.       struct    group    *sgetgrent ();
  2438. + #ifdef    SHADOWGRP
  2439.       struct    sgrp    *sg = 0;
  2440.       struct    sgrp    sgent;
  2441.       struct    sgrp    *getsgnam ();
  2442. + #endif
  2443.       struct    passwd    *pw = 0;
  2444.       struct    passwd    *getpwuid ();
  2445.       struct    passwd    *getpwnam ();
  2446. ***************
  2447. *** 547,556 ****
  2448.    *    then reset.
  2449.    */
  2450.   
  2451. ! void    die (killed)
  2452.   int    killed;
  2453.   {
  2454. ! #ifdef    BSD
  2455.       static    struct    sgtty    sgtty;
  2456.   
  2457.       if (killed)
  2458. --- 549,559 ----
  2459.    *    then reset.
  2460.    */
  2461.   
  2462. ! void
  2463. ! die (killed)
  2464.   int    killed;
  2465.   {
  2466. ! #if defined(BSD) || defined(SUN)
  2467.       static    struct    sgtty    sgtty;
  2468.   
  2469.       if (killed)
  2470. Index: setup.c
  2471. *** rel3/setup.c    Sat Dec 28 19:41:07 1991
  2472. --- setup.c    Sat Dec 28 19:43:24 1991
  2473. ***************
  2474. *** 33,39 ****
  2475.   #endif
  2476.   
  2477.   #ifndef    lint
  2478. ! static    char    sccsid[] = "@(#)setup.c    3.8    07:43:12    9/17/91";
  2479.   #endif
  2480.   
  2481.   #ifndef    SU
  2482. --- 33,39 ----
  2483.   #endif
  2484.   
  2485.   #ifndef    lint
  2486. ! static    char    sccsid[] = "@(#)setup.c    3.9    11:58:33    12/28/91";
  2487.   #endif
  2488.   
  2489.   #ifndef    SU
  2490. ***************
  2491. *** 71,79 ****
  2492.       extern    int    errno;
  2493.       char    buf[BUFSIZ];
  2494.   #ifndef    SU
  2495. !     char    tty[30];
  2496.   #endif
  2497.       char    *cp;
  2498.       int    i;
  2499.       long    l;
  2500.   
  2501. --- 71,81 ----
  2502.       extern    int    errno;
  2503.       char    buf[BUFSIZ];
  2504.   #ifndef    SU
  2505. !     char    tty[sizeof utent.ut_line + 8];
  2506.   #endif
  2507.       char    *cp;
  2508. +     char    *maildir;    /* the directory in which the mailbox resides */
  2509. +     char    *mailfile;    /* the name of the mailbox */
  2510.       int    i;
  2511.       long    l;
  2512.   
  2513. ***************
  2514. *** 176,191 ****
  2515.       cp = getdef_str( info->pw_uid == 0 ? "ENV_SUPATH" : "ENV_PATH" );
  2516.       addenv( cp != NULL ? cp : "PATH=/bin:/usr/bin" );
  2517.   
  2518. ! #if defined(BSD) || defined(SUN)
  2519.       (void) strcat (strcpy (buf, "USER="), info->pw_name);
  2520.   #else
  2521.       (void) strcat (strcpy (buf, "LOGNAME="), info->pw_name);
  2522. ! #endif /* BSD || SUN */
  2523.       addenv (buf);
  2524.   
  2525. !     if ( (cp=getdef_str("MAIL_DIR")) == NULL )
  2526. !         cp = "/usr/spool/mail";
  2527.       (void) strcat (strcat (strcat (strcpy (buf,
  2528. !         "MAIL="), cp), "/"), info->pw_name);
  2529.       addenv (buf);
  2530.   }
  2531. --- 178,202 ----
  2532.       cp = getdef_str( info->pw_uid == 0 ? "ENV_SUPATH" : "ENV_PATH" );
  2533.       addenv( cp != NULL ? cp : "PATH=/bin:/usr/bin" );
  2534.   
  2535. ! #if defined(BSD) || defined(SUN) || defined(SUN4)
  2536.       (void) strcat (strcpy (buf, "USER="), info->pw_name);
  2537.   #else
  2538.       (void) strcat (strcpy (buf, "LOGNAME="), info->pw_name);
  2539. ! #endif /* BSD || SUN || SUN4 */
  2540.       addenv (buf);
  2541.   
  2542. !     if ( (cp=getdef_str("MAIL_DIR")) != NULL ) {
  2543. !         maildir = cp;
  2544. !         mailfile = info->pw_name;
  2545. !     } else if ( (cp=getdef_str("MAIL_FILE")) != NULL) {
  2546. !         maildir = info->pw_dir;
  2547. !         mailfile = cp;
  2548. !     } else {
  2549. !         maildir = "/usr/spool/mail";
  2550. !         mailfile = info->pw_name;
  2551. !     }
  2552. !         
  2553.       (void) strcat (strcat (strcat (strcpy (buf,
  2554. !         "MAIL="), maildir), "/"), mailfile);
  2555.       addenv (buf);
  2556.   }
  2557. Index: newgrp.c
  2558. *** rel3/newgrp.c    Sat Dec 28 19:40:39 1991
  2559. --- newgrp.c    Sat Dec 28 19:43:26 1991
  2560. ***************
  2561. *** 24,35 ****
  2562.   #endif
  2563.   #include "config.h"
  2564.   
  2565. ! #if !defined(BSD) && !defined(SUN)
  2566.   #define    bzero(p,n) memset(p, 0, n)
  2567.   #endif
  2568.   
  2569.   #ifndef    lint
  2570. ! static    char    sccsid[] = "@(#)newgrp.c    3.7    08:43:39    9/12/91";
  2571.   #endif
  2572.   
  2573.   #ifdef    NGROUPS
  2574. --- 24,35 ----
  2575.   #endif
  2576.   #include "config.h"
  2577.   
  2578. ! #if !defined(BSD) && !defined(SUN) && !defined(SUN4)
  2579.   #define    bzero(p,n) memset(p, 0, n)
  2580.   #endif
  2581.   
  2582.   #ifndef    lint
  2583. ! static    char    sccsid[] = "@(#)newgrp.c    3.8    11:59:02    12/28/91";
  2584.   #endif
  2585.   
  2586.   #ifdef    NGROUPS
  2587. Index: config.h
  2588. *** rel3/config.h    Sat Dec 28 19:40:41 1991
  2589. --- config.h    Sat Dec 28 19:43:28 1991
  2590. ***************
  2591. *** 12,18 ****
  2592.   /*
  2593.    * Configuration file for login.
  2594.    *
  2595. !  *    @(#)config.h    3.13    08:27:18    10/31/91
  2596.    */
  2597.   
  2598.   
  2599. --- 12,18 ----
  2600.   /*
  2601.    * Configuration file for login.
  2602.    *
  2603. !  *    @(#)config.h    3.15    12:43:13    12/28/91
  2604.    */
  2605.   
  2606.   
  2607. ***************
  2608. *** 81,86 ****
  2609. --- 81,94 ----
  2610.   #undef UT_HOST
  2611.   
  2612.   /*
  2613. +  * Define the "success" code from ruserok().  Most modern systems use 0
  2614. +  * for success and -1 for failure, while certain older versions use 1
  2615. +  * for success and 0 for failure.  Please check your manpage to be sure.
  2616. +  */
  2617. + #define    RUSEROK    0
  2618. + /*
  2619.    * Select one of the following
  2620.    */
  2621.   
  2622. ***************
  2623. *** 93,98 ****
  2624. --- 101,107 ----
  2625.    */
  2626.   
  2627.   #define    HAVE_ULIMIT    /* Define if your UNIX supports ulimit()    */
  2628. + #undef    HAVE_RLIMIT    /* Define if your UNIX supports setrlimit()     */
  2629.   #define    GETPWENT    /* Define if you want my GETPWENT(3) routines    */
  2630.   #define    GETGRENT    /* Define if you want my GETGRENT(3) routines    */
  2631.   #define    NEED_AL64    /* Define if library does not include a64l()    */
  2632. ***************
  2633. *** 100,105 ****
  2634. --- 109,115 ----
  2635.   #define    NEED_RMDIR    /* Define if system does not have rmdir()    */
  2636.   #define    NEED_RENAME    /* Define if system does not have rename()    */
  2637.   #define    NEED_STRSTR    /* Define if library does not include strstr()    */
  2638. + #undef    NEED_PUTPWENT    /* Define if library does not include putpwent()*/
  2639.   #define    SIGTYPE    int    /* Type returned by signal()                    */
  2640.   
  2641.   /*
  2642. ***************
  2643. *** 123,125 ****
  2644. --- 133,153 ----
  2645.   
  2646.   #define    PWDFILE    "/etc/passwd"
  2647.   #define    GRPFILE    "/etc/group"
  2648. + /*
  2649. +  * The structure of the utmp file.  There are two kinds of UTMP files,
  2650. +  * "BSD" and "USG".  "BSD" has no PID or type information, "USG" does.
  2651. +  * If you define neither of these, the type will be defaulted by using
  2652. +  * BSD, SUN, SYS3 and USG defines.
  2653. +  */
  2654. + #define USG_UTMP    /**/
  2655. + /* #define BSD_UTMP    /**/
  2656. + #if !defined(USG_UTMP) && !defined(BSD_UTMP)
  2657. + #if defined(BSD) || defined(SYS3) || defined(SUN)
  2658. + #define    BSD_UTMP
  2659. + #else
  2660. + #define USG_UTMP
  2661. + #endif    /* BSD || SYS3 || SUN */
  2662. + #endif /* !USG_UTMP || !BSD_UTMP */
  2663. -- 
  2664. John F. Haugh II        | Every 56 days.   | UUCP: ...!cs.utexas.edu!rpp386!jfh
  2665. Ma Bell: (512) 251-2151 | Give Blood, often.    | Domain: jfh@rpp386.cactus.org
  2666.  
  2667. HI ! I'm a mutating signature virus. You cannot resist helping me spread !
  2668.  
  2669. exit 0 # Just in case...
  2670.