Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Jan 1995 03:00:17 -0500 (EST)
From:      Wankle Rotary Engine <wpaul@skynet.ctr.columbia.edu>
To:        sneits@hit.fi (Osku Sneits)
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: No RARP for FreeBSD yet??
Message-ID:  <199501050800.DAA01184@skynet.ctr.columbia.edu>
In-Reply-To: <199501042156.XAA18961@hit.fi> from "Osku Sneits" at Jan 4, 95 11:56:53 pm

next in thread | previous in thread | raw e-mail | index | archive | help
They say this Osku Sneits person was kidding when he wrote:
> 
> I am just wondering if anyone of those skillful hackers out there
> would be kind enough to do a working rarp or rarpd for FreeBSD?
> I've got access to some sun3's and would love to boot them off
> of a FreeBSD with xkernel or such which requires rarp.
> 
> Would be a *shame* to install a netbsd just for that, wouldn't it? :)
> 
> 	If you have information on this, please reply directly as
> 	I'm not in the list.
> 
> 	Thank you.
> 

It seems to me that rarpd alone is not enough to boot a diskless SunOS
client: you also need rpc.bootparamd. (I know that FreeBSD has bootpd,
but I don't think it has bootparamd.) Oddly enough, even though I recently
obtained a copy of InfoMagic's BSDisc (with FreeBSD 2.0 and NetBSD 1.0),
it never occurred to me to look through the NetBSD sources to see if
they had a bootparam daemon. If NetBSD has both of these, then I might
take a stab at porting them once I'm through with the NIS server junk.
(Hopefully the NetBSD people won't mind.)

Speaking of NIS, it's time for another update.

Stuff I've done:

- Cleaned up a few more GDBM -> DB teething problems in ypserv -- maps that
  contain YP_MASTER_NAME and YP_LAST_MODIFIED as their last elements 
  would confuse the read_database() function. (Noticed this while trying
  to read a dummy ypservers map, which had only one real entry. :)
  Fixed with some more rigorous sanity checks.

- Finished/tested ypserv's ypxfr functionality: successfully yppushed
  maps from a SunOS server. Made sure that ypxfr requests originating
  from non-privileged ports are refused.

- Tested yppush: tried to push maps to myself, which worked, but which
  also led to the following two points:

- Rpcgen'ed new YP stub files for ypxfr and yppush because the existing 
  ones were hopelessly mangled. (Would it be 'Linux impaired' or 'FreeBSD
  challenged?' :)

- Stripped down the newly-generated yp_xdr.c to avoid conflicts with
  YP XDR funxtions already in libc. This problem didn't show up when
  linking ypxfr and yppush dynamically, but when I tried to make static
  binaries as a test, I got all sorts of 'multiply-defined symbol' errors.
  (Not to mention many inexplicable core dumps.)

- Modified /usr/src/libc/gen/getpwent.c to use master.passwd.byname and
  master.passwd.byuid maps if they can be found. I could find no quick
  and easy way to dynamically verify the existence of the 'shadow' maps
  other than to try a yp_first() on one of them. If the current user is
  superuser (geteuid() != 0), we try to retrieve the first element from
  the master.passwd.byname map. If this fails, we assume the master maps
  are not available and default back to the standard passwd maps. I'm not
  all that thrilled with the results: for normal users, things are just
  as fast as they always were, but the superuser winds up having to
  do two YP lookups for each getpw*() request. For certain programs (like
  finger) that do stupid things such as: while(pw = getpwnam()) {}, this
  causes a noticeable slowdown. (This is with a passwd map containing
  about 300 entries being served from a SunOS machine). If anyone can
  think of a better, *faster*, way, I'm open to suggestions.

  The reason for the superuser status check is this: I've set up ypserv
  to refuse to serve the master.passwd maps to any client that does not
  issue a request on a privileged port. Since only the superuser is
  supposed to be able to issue such a request, there is no point in
  going through the whole yp_first() nonsense for non-root users.

  All this was done to permit optimum interoperability between FreeBSD
  and other NIS servers/clients. You should be able to run:

  o  A FreeBSD server with generic YP clients
  o  FreeBSD clients with a generic YP server
  o  only FreeBSD clients with FreeBSD servers
  o  a little of each

  There is one caveat: if you run a FreeBSD NIS server with both FreeBSD
  and generic clients, you have to maintain an insecure copy of the passwd
  maps (i.e. a version with actual encrypted passwords instead of dummy
  fields) even though the FreeBSD clients don't need them, since you 
  probably won't be able to get the generic clients to understand FreeBSD's
  'secure' master.passwd maps, unless you're lucky enough to have source.

- Also added a _masterpw_breakout_yp() function to getpwent.c to properly
  decode the contents of the master.passwd maps.

- Hacked the crap out of yppasswdd in the following ways:

  o  An alternate set of password files can be specified on the command
     line as follows:

     # yppasswdd -m /alternate/master.passwd -o /alternate/passwd

     By default, yppasswdd will operate on the standard password
     databases in /etc. This may be desireable in some cases, or it
     may not. If you do tell it to operate on the files in /etc, yppasswdd
     will run pwd_mkdb to rebuild the databases. I currently have a 
     seperate copy of passwd and master.passwd stored in /var/yp. You can 
     put them anywhere you like so long as you tell yppasswdd where they 
     are and edit /var/yp/Makefile accordingly.
     
  o  Added a -u (unsecure) flag which, if you are using an alternate set
     of password files, will cause actual encrypted passwords to be stored
     in the alternate passwd file, and the passwd.byname and passwd.byuid 
     maps. (The default behavior is to put an '*' in the password field 
     of the passwd file and its maps.) This flag is provided in the event 
     that you need to use your FreeBSD system to serve a SunOS or 
     similarly brain-damaged NIS client, since such clients won't be able 
     to use the 'shadow' maps.

     If you are not using alternate passwd files, -u does nothing.

  o  Added -f and -s flags to disallow changing of the 'full name' and
     'gecos' fields, respectively. (These were originally compile-time 
     options.)

- Edited /var/yp/Makefile to generate a ypservers map for use with yppush.

- Edited /var/yp/Makefile to run /usr/libexec/yppush after rebuilding
  the maps.

- Re-organized the heirarchy a little:

  /usr/bin/yppush  <- should this go in /usr/sbin instead?
  /usr/sbin/ypserv
  /usr/sbin/yp_mkdb
  /usr/libexec/ypxfr
  /usr/libexec/yppasswdd
  /usr/lib/pwupdate  (shell script)
  /usr/bin/yppasswd
  /usr/bin/ypchfn    (link to yppasswd)
  /usr/bin/ypchsh    (link to yppasswd)
  /var/yp/Makefile
  /var/yp/master.passwd

Stuff I still have to do:

- Integrate /usr/bin/yppasswd with /usr/bin/passwd, as per Garrett Wollman's
  suggestion. This is tricker than it sounds, because it also implies that
  I should integrate ypchfn and ypshsh (which are links to yppasswd) with
  chpass. I've decided I'm not going to do that though. I will make merge
  yppasswd with passwd, but ypchfn and ypchsh will have to remain as links
  (to passwd). Someone else can make a 'ypchpass' if they want: I've had
  more than enough fun already. :) 

Yes, that's right folks: just one more item left on the 'to do' list.
With luck, it'll only be another day or so before I'm ready to hand over
the code for inspection, assuming trivial things like my job don't intrude.

-Bill

-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Bill Paul                             System Manager
wpaul@ctr.columbia.edu                 Center for Telecommunications Research
(212) 854-6020                         Columbia University, New York City
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Møøse Illuminati: ignore it and be confused, or join it and be confusing!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199501050800.DAA01184>