Setting the node name

John F Haugh II jfh at rpp386.cactus.org
Fri Feb 8 02:52:27 AEST 1991


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 at rpp368.cactus.org)	9/29/88
 *
 *	Modification History
 *
 *	02/07/91	jfh at 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 at rpp386.cactus.org
"I've never written a device driver, but I have written a device driver manual"
                -- Robert Hartman, IDE Corp.



More information about the Comp.unix.wizards mailing list