home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s2 / passwd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  2.2 KB  |  152 lines

  1. /*
  2.  * enter a password in the password file
  3.  * this program should be suid with owner
  4.  * with an owner with write permission on /etc/passwd
  5.  */
  6. char    *tfile    { "/tmp/ptmp" };
  7. char    *pfile    { "/etc/passwd" };
  8. int    tbuf[259];
  9. int    pbuf[259];
  10.  
  11. main(argc, argv)
  12. char *argv[];
  13. {
  14.     register u, c;
  15.     register char *p;
  16.  
  17.     if(argc != 3) {
  18.         write(2, "Usage: passwd user password\n", 28);
  19.         goto bex;
  20.     }
  21.     signal(1, 1);
  22.     signal(2, 1);
  23.     signal(3, 1);
  24.  
  25.     if(stat(tfile, tbuf+20) >= 0) {
  26.         write(2, "Temporary file busy -- try again\n", 33);
  27.         goto bex;
  28.     }
  29.     tbuf[0] = creat(tfile, 0600);
  30.     if(tbuf[0] < 0) {
  31.         write(2, "Cannot create temporary file\n", 29);
  32.         goto bex;
  33.     }
  34.     pbuf[0] = open(pfile, 0);
  35.     if(pbuf[0] < 0) {
  36.         write(2, "Cannot open /etc/passwd\n", 24);
  37.         goto out;
  38.     }
  39.     goto l1;
  40.  
  41. /*
  42.  * skip to beginning of next line
  43.  */
  44.  
  45. skip:
  46.     while(c != '\n') {
  47.         if(c < 0)
  48.             goto ill;
  49.         c = getc(pbuf);
  50.         putc(c, tbuf);
  51.     }
  52.  
  53. /*
  54.  * compare user names
  55.  */
  56.  
  57. l1:
  58.     c = getc(pbuf);
  59.     putc(c, tbuf);
  60.     if(c < 0) {
  61.         write(2, "User name not found in password file\n", 37);
  62.         goto out;
  63.     }
  64.     p = argv[1];
  65.     while(c != ':') {
  66.         if(*p++ != c)
  67.             goto skip;
  68.         c = getc(pbuf);
  69.         putc(c, tbuf);
  70.     }
  71.     if(*p)
  72.         goto skip;
  73. /*
  74.  * skip old password
  75.  */
  76.     do {
  77.         c = getc(pbuf);
  78.         if(c < 0)
  79.             goto ill;
  80.     } while(c != ':');
  81.  
  82. /*
  83.  * copy in new password
  84.  */
  85.     p = argv[2];
  86.     for(c=0; c<9; c++)
  87.         if(*p++ == 0)
  88.             break;
  89.     *--p = 0;
  90.     if(p != argv[2])
  91.         p = crypt(argv[2]);
  92.     while(*p)
  93.         putc(*p++, tbuf);
  94.     putc(':', tbuf);
  95.  
  96. /*
  97.  * validate uid
  98.  */
  99.  
  100.     u = 0;
  101.     do {
  102.         c = getc(pbuf);
  103.         putc(c, tbuf);
  104.         if(c >= '0' && c <= '9')
  105.             u = u*10 + c-'0';
  106.         if(c < 0)
  107.             goto ill;
  108.     } while(c != ':');
  109.     c = getuid() & 0377;
  110.     if(c != 0 && c != u) {
  111.         write(2, "Permission denied\n", 18);
  112.         goto out;
  113.     }
  114.  
  115. /*
  116.  * copy out and back
  117.  */
  118.  
  119.     for(;;) {
  120.         c = getc(pbuf);
  121.         if(c < 0) {
  122.             fflush(tbuf);
  123.             close(pbuf[0]);
  124.             close(tbuf[0]);
  125.             tbuf[0] = open(tfile, 0);
  126.             if(tbuf[0] < 0) {
  127.                 write(2, "Urk\n", 4);
  128.                 goto out;
  129.             }
  130.             pbuf[0] = creat(pfile, 0644);
  131.             if(pbuf[0] < 0) {
  132.                 write(2, "Cannot create /etc/passwd\n", 26);
  133.                 goto out;
  134.             }
  135.             while((c = read(tbuf[0], tbuf+1, 512)) > 0)
  136.                 write(pbuf[0], tbuf+1, c);
  137.             unlink(tfile);
  138.             exit(0);
  139.         }
  140.         putc(c, tbuf);
  141.     }
  142.  
  143. ill:
  144.     write(2, "Password file illformed\n", 24);
  145.  
  146. out:
  147.     unlink(tfile);
  148.  
  149. bex:
  150.     exit(1);
  151. }
  152.