home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / idutil / getgrnam.c < prev    next >
C/C++ Source or Header  |  1992-06-12  |  2KB  |  121 lines

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <grp.h>
  4. #include <gnu/fileutil.h>
  5. #include "grinf.h"
  6.  
  7. static char *RCSid="$Header: getgrnam.c,v 1.7 92/02/25 14:00:01 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 = "ad:e:Igmnprv" ;
  22.     int        optchar;
  23.     extern char    *optarg;
  24.     extern int    optind;
  25.     extern int     opterr;
  26.     struct grinfrq     *grinf;
  27.  
  28.     trim_main_name =basename(*argv);
  29.     if ((grinf = grinfrq_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.             grinf_info_fpr (stderr);
  37.             break;
  38.         case 'a':
  39.             grinf->epw = grinf->nam = grinf->mem = grinf->gid = 1;
  40.             break;
  41.         case 'd':
  42.             grinf->dlm = *optarg;
  43.             break;
  44.         case 'e' :
  45.             grinf->mdl = *optarg;
  46.             break;
  47.         case 'g':
  48.             grinf->gid = 1;
  49.             break;
  50.         case 'm':
  51.             grinf->mem = 1;
  52.             break;
  53.         case 'n':
  54.             grinf->nam = 1;
  55.             break;
  56.         case 'p':
  57.             grinf->epw = 1;
  58.             break;
  59.         case 'r':
  60.             report_except = 1;
  61.             break;
  62.         case 'v':
  63.             grinf->vbs = 1;
  64.             break;
  65.         case '?':
  66.             fpr_usage (stderr);
  67.             exit (EINVAL);
  68.         }
  69.     if (optind == argc) {
  70.         struct group * gp;
  71.         char          gnametmp[256];
  72.         gp = (struct group *)getgrgid (getegid());
  73.         strcpy (gnametmp, gp->gr_name);
  74.         /* 
  75.         We need a temporary buffer for the current group name
  76.         rather than passing gp->gr_name to process_it as the
  77.         buffer pointed at by the returning getgrnam call will
  78.         overwrite the passed parameter
  79.         */
  80.         process_it (&gnametmp[0], grinf);
  81.     }
  82.     while (optind < argc) {
  83.         process_it (*(argv+optind++), grinf);
  84.     }
  85.     exit (all_found ? 0 : 1);
  86. }
  87.  
  88.  
  89. int    process_it( grpnam, grinf)
  90. char    *grpnam;
  91. struct     grinfrq     *grinf;
  92. {
  93.     struct     group *grp;
  94.     int     nout = 0;
  95.  
  96.     grp = (struct group *) getgrnam ( grpnam );
  97.     if ( grp == NULL) {
  98.         all_found = 0;
  99.         if (report_except) {
  100.             fprintf (stderr, "%s: could not find group %s\n",
  101.             trim_main_name, grpnam);
  102.         }
  103.     } else {
  104.         nout = grinf_fpr (stdout, grp, grinf);
  105.     }
  106.     return (nout);
  107. }
  108.  
  109.  
  110. int     fpr_usage (fp)
  111. FILE     *fp;
  112. {
  113.     int     nout = 0;
  114.     nout += fprintf (stderr, 
  115.         "Usage: %s [-%s] [-%s] [-%s] grpname [...]\n",
  116.         trim_main_name,
  117.         "Iagmnprv", "d char", "e char" );
  118.     return (nout);
  119. }
  120.  
  121.