home *** CD-ROM | disk | FTP | other *** search
- /* oksetluid.c - version of setluid() that always works for root. */
-
- /* By Charles Bryant, Datacode Communications Ltd <ch@dce.ie>, August 1990.
- This program is not copyrighted. */
-
- #ifndef __STDC__
- #define const /* nothing */
- #endif
-
- #ifndef lint
- static const char rcsid[] =
- "$Id: oksetluid.c,v 1.1 90/09/28 16:21:11 em Release $";
- #endif
-
- #include <fcntl.h>
- #define _PTRDIFF_T
- #include <sys/types.h>
- #include <nlist.h>
- #define SecureWare
- #include <sys/security.h>
- #include <stddef.h>
-
- static struct nlist nlsym[2] = {
- {"sip"},
- {""},
- };
-
- extern void uxnlist();
- extern int lseek(), read(), open(), write(), close(), setluid();
-
- char *oksetluid(id)
- unsigned short id;
- {
- struct security_info *secp;
- long secpaddr;
- int fd, i;
- char *err=0;
- if (!setluid(id)) return 0;
- uxnlist(nlsym);
- if (!(secpaddr = nlsym[0].n_value) )
- return "Can't read nlist from /unix";
- if ( (fd=open("/dev/kmem", O_RDWR)) < 0)
- return "Can't open /dev/kmem for read/write";
- if (lseek(fd, secpaddr, 0) != secpaddr)
- err = "Can't seek to pointer in /dev/kmem";
- else if (read(fd, &secp, sizeof(secp)) != sizeof(secp))
- err = "Can't read pointer from /dev/kmem";
- else {
- /* Stupid definition of offsetof() in <stddef.h> produces warning from
- Microsoft compiler. */
- i = (long) secp + offsetof(struct security_info, si_luid);
- if (lseek(fd, (long) i, 0) != i)
- err = "Can't seek to info in /dev/kmem";
- else if (write(fd, &id, sizeof(id)) != sizeof(id))
- err = "Can't write luid to /dev/kmem";
- }
- close(fd);
- return err;
- }
-