home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3186 / oksetluid.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-13  |  1.5 KB  |  60 lines

  1. /* oksetluid.c - version of setluid() that always works for root. */
  2.  
  3. /* By Charles Bryant, Datacode Communications Ltd <ch@dce.ie>, August 1990.
  4.    This program is not copyrighted. */
  5.  
  6. #ifndef __STDC__
  7. #define const /* nothing */
  8. #endif
  9.  
  10. #ifndef lint
  11. static const char rcsid[] =
  12.     "$Id: oksetluid.c,v 1.1 90/09/28 16:21:11 em Release $";
  13. #endif
  14.  
  15. #include <fcntl.h>
  16. #define _PTRDIFF_T
  17. #include <sys/types.h>
  18. #include <nlist.h>
  19. #define SecureWare
  20. #include <sys/security.h>
  21. #include <stddef.h>
  22.  
  23. static struct nlist nlsym[2] = {
  24.     {"sip"},
  25.     {""},
  26. };
  27.  
  28. extern void uxnlist();
  29. extern int lseek(), read(), open(), write(), close(), setluid();
  30.  
  31. char *oksetluid(id)
  32. unsigned short id;
  33. {
  34.  struct security_info *secp;
  35.  long secpaddr;
  36.  int fd, i;
  37.  char *err=0;
  38.  if (!setluid(id)) return 0;
  39.  uxnlist(nlsym);
  40.  if (!(secpaddr = nlsym[0].n_value) )
  41.     return "Can't read nlist from /unix";
  42.  if ( (fd=open("/dev/kmem", O_RDWR)) < 0)
  43.      return "Can't open /dev/kmem for read/write";
  44.  if (lseek(fd, secpaddr, 0) != secpaddr)
  45.       err = "Can't seek to pointer in /dev/kmem";
  46.  else if (read(fd, &secp, sizeof(secp)) != sizeof(secp))
  47.     err = "Can't read pointer from /dev/kmem";
  48.  else    {
  49.      /* Stupid definition of offsetof() in <stddef.h> produces warning from
  50.         Microsoft compiler. */
  51.      i = (long) secp + offsetof(struct security_info, si_luid);
  52.      if (lseek(fd, (long) i, 0) != i)
  53.          err = "Can't seek to info in /dev/kmem";
  54.      else if (write(fd, &id, sizeof(id)) != sizeof(id))
  55.          err = "Can't write luid to /dev/kmem";
  56.     }
  57.  close(fd);
  58.  return err;
  59. }
  60.