home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume4 / chuni / chuni.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  2.1 KB  |  106 lines

  1. /* This program is designed to change the default login universe
  2.  * of a user.  It requires to run setuid and handles checking of
  3.  * user permissions (hopefully).
  4.  *
  5.  *    Only a user or root can change a the login universe
  6.  *                    F. Crawford - 31 Jul 84
  7.  *    SCCS @(#)chuni.c    1.3    9/26/84
  8.  */
  9. #include <stdio.h>
  10. #include <pwd.h>
  11. #include <universe.h>
  12. #include <sys/file.h>
  13.  
  14. #define UNIVERSE    "/etc/u_universe"    /* Universe file */
  15. #define NOUNIV    (sizeof(univ_name) / sizeof(char *))
  16.                         /* Number of known universes */
  17. #define UCB    2                /* Universe number of UCB */
  18.  
  19. char *getlogin();
  20.  
  21. void release (file)
  22.     FILE *file;
  23.     {
  24.     flock(fileno(file), LOCK_UN);
  25.     fclose(file);
  26.     }
  27.  
  28. int main(argc, argv)
  29.     int argc;
  30.     char **argv;
  31.     {
  32.     register FILE *univ;
  33.     register char *loginid;
  34.     register int i;
  35.     char buf[20], name[20];
  36.     int len;
  37.     struct passwd *pwdent;
  38.  
  39.     setuniverse(UCB);
  40.     if (--argc < 1)
  41.     {
  42.     fprintf(stderr, "Usage: %s user [universe]\n", *argv);
  43.     exit(1);
  44.     }
  45.     else
  46.     ++argv;
  47.     if (!(loginid = getlogin()))
  48.     {
  49.     if (!(pwdent = getpwuid(getuid())))
  50.         {
  51.         fprintf(stderr, "You don't exist\n");
  52.         exit(1);
  53.         }
  54.     loginid = pwdent->pw_name;
  55.     }
  56.     if (!(univ = fopen(UNIVERSE, "r+")))
  57.     {
  58.     perror(UNIVERSE);
  59.     exit(1);
  60.     }
  61.     setbuf(univ, NULL);
  62.     if (flock(fileno(univ), LOCK_SH | LOCK_NB) < 0)
  63.     {
  64.     fprintf(stderr, "File is busy\n");
  65.     fclose(univ);
  66.     exit(1);
  67.     }
  68.     strcpy(name, *argv);
  69.     strcat(name, ":");
  70.     len = strlen(name);
  71.     while (fgets(buf, sizeof(buf), univ) && strncmp(name, buf, len))
  72.     ;
  73.     if (strncmp(name, buf, len))
  74.     {
  75.     fprintf(stderr, "Name not found\n");
  76.     release(univ);
  77.     exit(1);
  78.     }
  79.     if (argc == 1)
  80.     {
  81.     printf("%s", &buf[len]);
  82.     release(univ);
  83.     exit(0);
  84.     }
  85.     else
  86.     {
  87.     if (getuid() && strcmp(*argv, loginid))
  88.         fprintf(stderr, "Permission denied\n");
  89.     else
  90.         {
  91.         for (i = 0; i < NOUNIV; i++)
  92.         if (!strcmp(argv[1], univ_name[i]))
  93.             {
  94.             flock(fileno(univ), LOCK_EX);
  95.             fseek(univ, (long) (-strlen(buf)), 1);
  96.             fprintf(univ, "%s:%s\n", argv[0], argv[1]);
  97.             release(univ);
  98.             exit(0);
  99.             }
  100.         fprintf(stderr, "Unknown universe\n");
  101.         }
  102.     }
  103.     release(univ);
  104.     exit(1);
  105.     }
  106.