home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3348 / grdbm.c < prev    next >
C/C++ Source or Header  |  1991-05-16  |  2KB  |  109 lines

  1. /*
  2.  * Copyright 1990, John F. Haugh II
  3.  * All rights reserved.
  4.  *
  5.  * Use, duplication, and disclosure prohibited without
  6.  * the express written permission of the author.
  7.  */
  8.  
  9. #ifndef    lint
  10. static    char    sccsid[] = "@(#)grdbm.c    3.1    08:11:52    11/21/90";
  11. #endif
  12.  
  13. #include <string.h>
  14. #include <stdio.h>
  15. #include <grp.h>
  16. #include "config.h"
  17.  
  18. #ifdef    NDBM
  19. #include <ndbm.h>
  20. DBM    *gr_dbm;
  21.  
  22. #define    GRP_FRAG    256
  23.  
  24. /*
  25.  * gr_dbm_update
  26.  *
  27.  * Updates the DBM password files, if they exist.
  28.  */
  29.  
  30. int
  31. gr_dbm_update (gr)
  32. struct    group    *gr;
  33. {
  34.     datum    key;
  35.     datum    content;
  36.     char    data[BUFSIZ*8];
  37.     char    grpkey[60];
  38.     char    *cp;
  39.     int    len;
  40.     int    i;
  41.     int    cnt;
  42.     static    int    once;
  43.  
  44.     if (! once) {
  45.         if (! gr_dbm)
  46.             setgrent ();
  47.  
  48.         once++;
  49.     }
  50.     if (! gr_dbm)
  51.         return 0;
  52.  
  53.     len = gr_pack (gr, data);
  54.  
  55.     if (len <= GRP_FRAG) {
  56.         content.dsize = len;
  57.         content.dptr = data;
  58.  
  59.         key.dsize = strlen (gr->gr_name);
  60.         key.dptr = gr->gr_name;
  61.         if (dbm_store (gr_dbm, key, content, DBM_REPLACE))
  62.             return 0;
  63.  
  64.         key.dsize = sizeof gr->gr_gid;
  65.         key.dptr = (char *) &gr->gr_gid;
  66.         if (dbm_store (gr_dbm, key, content, DBM_REPLACE))
  67.             return 0;
  68.  
  69.     } else {
  70.         content.dsize = sizeof cnt;
  71.         content.dptr = (char *) &cnt;
  72.         cnt = (len + (GRP_FRAG-1)) / GRP_FRAG;
  73.  
  74.         key.dsize = strlen (gr->gr_name);
  75.         key.dptr = gr->gr_name;
  76.         if (dbm_store (gr_dbm, key, content, DBM_REPLACE))
  77.             return 0;
  78.  
  79.         key.dsize = sizeof gr->gr_gid;
  80.         key.dptr = (char *) &gr->gr_gid;
  81.         if (dbm_store (gr_dbm, key, content, DBM_REPLACE))
  82.             return 0;
  83.  
  84.         for (cp = data, i = 0;i < cnt;i++) {
  85.             content.dsize = len > GRP_FRAG ? GRP_FRAG:len;
  86.             len -= content.dsize;
  87.             content.dptr = cp;
  88.             cp += content.dsize;
  89.  
  90.             key.dsize = sizeof i + strlen (gr->gr_name);
  91.             key.dptr = grpkey;
  92.             memcpy (grpkey, &i, sizeof i);
  93.             strcpy (grpkey + sizeof i, gr->gr_name);
  94.             if (dbm_store (gr_dbm, key, content, DBM_REPLACE))
  95.                 return 0;
  96.  
  97.             key.dsize = sizeof i + sizeof gr->gr_gid;
  98.             key.dptr = grpkey;
  99.             memcpy (grpkey, &i, sizeof i);
  100.             memcpy (grpkey + sizeof i, &gr->gr_gid,
  101.                 sizeof gr->gr_gid);
  102.             if (dbm_store (gr_dbm, key, content, DBM_REPLACE))
  103.                 return 0;
  104.         }
  105.     }
  106.     return 1;
  107. }
  108. #endif
  109.