adnan@sgtech.uucp (Adnan Yaqub) (09/19/90)
I am trying to write a program which reads values from /dev/kmem. The program works great except when I try to lseek to the value returned by nlist, lseek bombs (returns -1, errno 0). The values nlist gives me are like 0xd00011e4. This, I suppose, looks like a negative number to lseek (which wants a long, not unsigned long, offset according to the manual) and it doesn't like that. Any ideas how this is supposed to work? On a related topic, what happened to adb? It didn't seem to come with ISC Unix 2.2. Thanks. -- Adnan Yaqub (adnan@sgtech.uucp) Star Gate Technologies 29300 Aurora Rd, Solon, OH, 44139, USA, +1 216 349 1860
cpcahil@virtech.uucp (Conor P. Cahill) (09/20/90)
In article <49@sgtech.UUCP> adnan@sgtech.uucp (Adnan Yaqub) writes: >I am trying to write a program which reads values from /dev/kmem. The >program works great except when I try to lseek to the value returned This should work without any problems. I have attached a sample program that can be used to modify a kernel value. (I use this to change the NFS variable nobody to 0 so that root users on other systems in our network get root privileges on thier NFS mounted file systems) >On a related topic, what happened to adb? It didn't seem to come with >ISC Unix 2.2. adb has been gone from AT&T unix since SVR2 although some vendors still supply it (they do the porting/maintenance themselves). sdb is the supported debugger (and 2.2 comes with codewatch, although I don't know how well that works since I haven't tried it). X#include <sys/types.h> X#include <nlist.h> X#include <fcntl.h> X#include <stdio.h> X Xmain(argc,argv) X int argc; X char * argv[]; X{ X int err; X char * kernelfile = "/dev/kmem"; X int kfd; X struct nlist nl; X int oflags; X long oldvalue; X int setval; X char * unixfileptr = "/unix"; X long value; X X if( (argc != 2) && (argc != 3) ) X { X fprintf(stderr,"Usage: %s symbol [value]\n",argv[0]); X exit(10); X } X X nl.n_name = argv[1]; X if( argc == 3 ) X { X value = atoi(argv[2]); X setval = 1; X oflags = O_RDWR; X } X else X { X setval = 0; X oflags = O_RDONLY; X } X X err = nlist(unixfileptr,&nl); X X if( (err == -1) || (nl.n_value == 0) ) X { X fprintf(stderr,"Unable to find symbol '%s' in '%s'\n", X nl.n_name, unixfileptr); X exit(10); X } X X if( (kfd=open(kernelfile,oflags)) == -1) X { X fprintf(stderr,"Unable to open '%s'\n", kernelfile); X exit(40); X } X X if( lseek(kfd,nl.n_value,0) != nl.n_value) X { X fprintf(stderr,"Unable to seek to %s's location\n",nl.n_name); X exit(50); X } X X if( read(kfd,(char *) &oldvalue,sizeof(long)) != sizeof(long)) X { X fprintf(stderr,"Unable to read %s's data\n",nl.n_name); X exit(60); X } X X if( ! setval ) X { X fprintf(stdout,"value of %s is %ld\n", nl.n_name, oldvalue); X exit(0); X } X X /* X * Now go change the value to be what we want it to be... X */ X X if( lseek(kfd,nl.n_value,0) != nl.n_value) X { X fprintf(stderr,"Unable to seek to %s's location\n",nl.n_name); X exit(70); X } X X if( write(kfd,(char *) &value,sizeof(long)) != sizeof(long)) X { X fprintf(stderr,"Unable to change %s's data\n",nl.n_name); X exit(80); X } X X fprintf(stdout,"Value of %s changed from %ld to %ld\n", X nl.n_name, oldvalue, value); X exit(0); X} -- Conor P. Cahill (703)430-9247 Virtual Technologies, Inc., uunet!virtech!cpcahil 46030 Manekin Plaza, Suite 160 Sterling, VA 22170