jfh@rpp386.cactus.org (John F Haugh II) (02/07/91)
Someone asked for a program which did this. I just found this while cleaning out a directory. Enjoy! -- /* * setuname.c * * This program is hereby placed in the public domain. You may do * whatever you wish. You may even lie and say you wrote it yourself. * Most importantly you may sell it with your operating system so people * won't have to reconfigure their systems to change the nodename. * * John F. Haugh II (jfh@rpp368.cactus.org) 9/29/88 * * Modification History * * 02/07/91 jfh@rpp386.cactus.org * Changed my mail address. */ #include <sys/a.out.h> #include <sys/types.h> #include <sys/utsname.h> #include <fcntl.h> #include <stdio.h> int memfd; int kmemfd; struct utsname utsname; struct utsname Kutsname; char nodename[SYS_NMLN]; #define UTSNAME 0 #define NODENAME 1 struct xlist namelist[] = { { 0, 0, 0, "_utsname" }, { 0, 0, 0, "_node" }, { 0, 0, 0, (char *) 0 } }; usage () { fprintf (stderr, "usage: setuname [ -n namelist ] [ -k kmem ] nodename\n"); exit (1); } r_read (fd, buf, n) int fd; char *buf; int n; { int i; if ((i = read (fd, buf, n)) == -1) { perror ("error on read"); return (-1); } else return (i); } w_write (fd, buf, n) int fd; char *buf; int n; { int i; if ((i = write (fd, buf, n)) == -1) { perror ("error on write"); return (-1); } else return (i); } long l_lseek (fd, offs, whence) int fd; long offs; int whence; { long i; long lseek (); if ((i = lseek (fd, offs, whence)) == -1L) { perror ("error on lseek"); return (-1); } else return (i); } main (argc, argv) int argc; char **argv; { char newname[10]; char *namefile = "/xenix"; char *kmemfile = "/dev/kmem"; char *name; int c; extern int optind; extern char *optarg; while ((c = getopt (argc, argv, "n:k:")) != EOF) { switch (c) { case 'k': kmemfile = optarg; break; case 'n': namefile = optarg; break; default: usage (); } } if (optind == argc) usage (); name = argv[optind]; if (xlist (namefile, namelist) != 0) { perror ("pstat: namelist"); exit (1); } if (namelist[UTSNAME].xl_value == 0 || namelist[NODENAME].xl_value == 0){ fprintf (stderr, "pstat: bad namelist: %s\n", namefile); exit (1); } if ((kmemfd = open (kmemfile, O_RDWR)) < 0) { perror ("pstat: kmemfile"); exit (1); } l_lseek (kmemfd, namelist[NODENAME].xl_value, 0); r_read (kmemfd, nodename, sizeof nodename); l_lseek (kmemfd, namelist[UTSNAME].xl_value, 0); r_read (kmemfd, &Kutsname, sizeof Kutsname); uname (&utsname); if (memcmp (&Kutsname, &utsname, sizeof utsname) != 0) { fprintf (stderr, "pstat: can't find utsname!\n"); exit (1); } printf ("changing node %.9s to %.9s: DEL if wrong!\n", nodename, name); sleep (10); strncpy (nodename, name, sizeof utsname.nodename); l_lseek (kmemfd, namelist[NODENAME].xl_value, 0); w_write (kmemfd, nodename, sizeof utsname.nodename); strncpy (utsname.nodename, name, sizeof utsname.nodename); l_lseek (kmemfd, namelist[UTSNAME].xl_value, 0); w_write (kmemfd, &utsname, sizeof utsname); exit (0); } -- John F. Haugh II UUCP: ...!cs.utexas.edu!rpp386!jfh Ma Bell: (512) 832-8832 Domain: jfh@rpp386.cactus.org "I've never written a device driver, but I have written a device driver manual" -- Robert Hartman, IDE Corp.