[net.unix] Dumb question about uucp

gww@aphasia.UUCP (George Williams) (08/27/85)

    We have here a callan box (modified by someone else if that matters) running
system 5 unix (no source of course, we have 4.2bsd source on a vax if that can
be modified).  The box is of the opinion that its uuname is `clm' we would like
to convince it otherwise; there does not seem to be a hostname command, or any
equivalent.  One system V that we have has a magic little file that lives in
/usr/lib/uucp that contains this name, does callan?

    It seems to me that I read somewhere that the host name was compiled into
the kernel under sysV, that seems dumb, and unbelievable (we don't have source).
What am I missing?


			George Williams
			decvax!frog!aphasia!gww

There must be a better way.

guy@sun.uucp (Guy Harris) (08/31/85)

> The box is of the opinion that its uuname is `clm' we would like to
> convince it otherwise; there does not seem to be a hostname command, or any
> equivalent.  One system V that we have has a magic little file that lives in
> /usr/lib/uucp that contains this name, does callan?
> 
>     It seems to me that I read somewhere that the host name was compiled
> into the kernel under sysV, that seems dumb, and unbelievable (we don't
> have source).

It may or may not be dumb and unbelievable, but it is true.  Given the
environment that the USG/USDL UNIX releases were, until recently, targeted
at (namely, AT&T sites who had source, and who ran big machines with a wide
variety of possible hardware configurations, so you'd build a kernel
specifically for that machine), it's not that dumb.  The intent is that the
distribution would come with a "generic" kernel, whose sole purpose was to
run on just about any configuration long enough to build a kernel tailored
for your configuration.  At that time you'd assign a name to the system and
build a kernel with that name built in.  A company offering S5 on their
machine could, if AT&T's binary licensing terms permit it (I don't know
whether they do or not - they *should*, but that's no guarantee), offer the
contents of "/usr/src/uts/<machine>/cf" as part of their distribution, along
with pre-compiled object libraries for the kernel.  That's sufficient to
build a tailored kernel and to set the system name.

This solution fails to some degree in the case of 4.xBSD, where you may
build a kernel which isn't completely generic but which will run on several
machines (using the autoconfiguration code), and fails miserably in the case
of the small UNIX boxes where there are a limited number of possible
hardware configurations and where you may not trust the end user to be able
to configure a kernel.  Some micro vendors have a command that'll either
patch your /unix (or whatever it's called) or your running kernel or both to
give the system a particular name.  If any such micro vendors didn't do
this, but instead kludged up all the user-mode programs which want the
system name to get it out of a file, they didn't do a very good job.  CCI
originally did that until I got fed up and hacked the "uname" command to
patch the kernel if you have it a name as an argument.

If you want, you can patch it yourself using "adb" (or, if you're feeling
ambitious, write a program to do it).  The structure returned by a "uname"
system call is called "utsname".  Unless the vendor has monkeyed with it, it
consists of 5 (or 4, for System III) 9-character strings; the strings are
embedded in the structure, not pointed to by pointers in the structure.
Starting at the location "utsname" (or "_utsname", as is likely on most
systems), there will be 9 bytes which will probably be the system name.  The
next 9 bytes after it (starting at "utsname + 9") will definitely be the
system name unless something is badly screwed up.  Just patch those to the
name you want - remember to include the terminating '\0' (if the first
string isn't the current system name, don't patch it).  Remember to make a
copy of the kernel before doing this, and remember to reboot afterwards if
you only patched it and not /dev/kmem.

It may not be optimal, but it's a lot better than, say, V7, where you needed
all the source to do a sysgen (many V7 vendors changed this, but out of the
box you needed source) *and* the name of the system was not affected by a
sysgen - it came out of an include file and was compiled directly into
user-mode programs (many V7 vendors fixed this, also).

	Guy Harris

joe@emacs.uucp (Joe Chapman) (09/01/85)

<>

> [ Referring to a SysV-derived system ]
>     It seems to me that I read somewhere that the host name was compiled
> into the kernel under sysV, that seems dumb, and unbelievable (we don't
> have source).

You can poke around for the utsname structure (its format should be in
the documentation for uname(1) or uname(2)) with your favorite debugger
and change your hostname to whatever you'd like.

My favorite method is to Emacs up the kernel, and do a Query Replace on
the hostname---count those ^@'s right or you'll be in trouble.  Do this
casually while one of your colleagues is looking and become a legend in
your own time.

Of course, now I do ``emacs /dev/kmem'' instead of ps... :-)

-- 
-- Joseph Chapman                  decvax!cca!emacs!joe
   CCA Uniworks, Inc.              emacs!joe@cca-unix.ARPA
   20 William St.
   Wellesley, MA  02181            (617) 235-2600

tim@cithep.UucP (Tim Smith ) (09/01/85)

Sounds like a job for adbman!  Look at location utsname in /unix.  There
you will find a string with the name of the machine ( actually, you will
find TWO strings with the name of the machine.  I forget which one you
need to change.  Better do them both ).  Change these strings with adb.
I think they are eight character strings, null terminated iff less than
eight chars long.
-- 
unlk	a6
rts
					Tim Smith
				ihnp4!{wlbr!callan,cithep}!tim

jww@sdcsvax.UUCP (Joel West) (09/01/85)

> Sounds like a job for adbman!  Look at location utsname in /unix.  There
> you will find a string with the name of the machine ( actually, you will
> find TWO strings with the name of the machine.  I forget which one you
> need to change.  Better do them both ).  Change these strings with adb.

Actually, the 2nd is the uucp name.  But not knowing who wrote what
sloppy code, I wouldn't be brave enough to run a system with the
1st <> 2nd.

	Joel West	CACI, Inc. - Federal (c/o UC San Diego)
	{ucbvax,decvax,ihnp4}!sdcsvax!jww
	jww@SDCSVAX.ARPA