home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / idutil / getpwuid.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-12  |  2.3 KB  |  126 lines

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <pwd.h>
  4. #include <gnu/fileutil.h>
  5. #include "pwinf.h"
  6.  
  7. static char *RCSid="$Header: getpwuid.c,v 1.3 92/02/25 14:00:10 dtb Exp $";
  8.  
  9. int     fpr_usage();
  10. int    process_it();
  11.  
  12. static int     report_except = 0;
  13. static char     all_found     = 1;
  14. static char     *trim_main_name;
  15.  
  16. int    main ( argc, argv, envp )
  17. int    argc;
  18. char    **argv;
  19. char    **envp;
  20. {
  21.     char        *optstring = "acd:Ighnprsuv" ;
  22.     int        optchar;
  23.     extern char    *optarg;
  24.     extern int    optind;
  25.     extern int    opterr;
  26.     struct pwinfrq     *pwinf;
  27.  
  28.     trim_main_name = basename(*argv);
  29.     if ((pwinf = pwinfrq_set_dflt (NULL)) == NULL)
  30.         exit (ENOMEM);
  31.     opterr = 0;
  32.     while ((optchar = getopt(argc, argv, optstring)) != -1)
  33.         switch (optchar) {
  34.         case 'I':
  35.             fprintf (stderr, "%s %s\n", __FILE__, RCSid);
  36.             pwinf_info_fpr (stderr);
  37.             break;
  38.         case 'a':
  39.             pwinf->epw = pwinf->nam = pwinf->uid = pwinf->gid
  40.                 = pwinf->age = pwinf->cmt = pwinf->dir
  41.                 = pwinf->shl = 1;
  42.             break;
  43.         case 'c':
  44.             pwinf->cmt = 1;
  45.             break;
  46.         case 'd':
  47.             pwinf->dlm = *optarg;
  48.             break;
  49.         case 'g':
  50.             pwinf->gid = 1;
  51.             break;
  52.         case 'h':
  53.             pwinf->dir = 1;
  54.             break;
  55.         case 'n':
  56.             pwinf->nam = 1;
  57.             break;
  58.         case 'p':
  59.             pwinf->epw = 1;
  60.             break;
  61.         case 'r':
  62.             report_except = 1;
  63.             break;
  64.         case 's':
  65.             pwinf->shl = 1;
  66.             break;
  67.         case 'u':
  68.             pwinf->uid = 1;
  69.             break;
  70.         case 'v':
  71.             pwinf->vbs = 1;
  72.             break;
  73.         case '?':
  74.             fpr_usage (stderr);
  75.             exit (EINVAL);
  76.         }
  77.     if (optind == argc)
  78.         process_it (geteuid(), pwinf);
  79.     while (optind < argc) {
  80.         int     uid;
  81.         if (sscanf(*(argv+optind), "%d", &uid) != 1) {
  82.             fprintf (stderr, "%s: %s not a valid integer\n",
  83.                 trim_main_name, *(argv+optind));
  84.             exit (EINVAL);
  85.         }
  86.         process_it (uid, pwinf);
  87.         optind++;
  88.     }
  89.     exit (all_found ? 0 : 1);
  90.  
  91. }
  92.  
  93.  
  94. int    process_it( uid, pwinf)
  95. int    uid;
  96. struct     pwinfrq     *pwinf;
  97. {
  98.     struct     passwd *pwent;
  99.     int     nout = 0;
  100.  
  101.     pwent = (struct passwd *) getpwuid ( uid );
  102.     if ( pwent == NULL) {
  103.         all_found = 0;
  104.         if (report_except) {
  105.             fprintf (stderr, "%s: could not find user %d\n",
  106.             trim_main_name, uid);
  107.         }
  108.     } else {
  109.         nout = pwinf_fpr (stdout, pwent, pwinf);
  110.     }
  111.     return (nout);
  112. }
  113.  
  114.  
  115. int     fpr_usage (fp)
  116. FILE     *fp;
  117. {
  118.     int     nout = 0;
  119.     nout += fprintf (stderr, 
  120.         "Usage: %s [-%s] [-%s] usrid [...]\n",
  121.         trim_main_name,
  122.         "Iacghnprsuv", "d char" );
  123.     return (nout);
  124. }
  125.  
  126.