home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / security / shadow-3.1.4 / grdbm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-26  |  3.5 KB  |  185 lines

  1. /*
  2.  * Copyright 1990, 1991, 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.3    08:44:03    9/12/91";
  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, (char *) &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, (char *) &i, sizeof i);
  100.             memcpy (grpkey + sizeof i, (char *) &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.  
  109. /*
  110.  * gr_dbm_remove
  111.  *
  112.  * Deletes the DBM group file entries, if they exist.
  113.  */
  114.  
  115. int
  116. gr_dbm_remove (gr)
  117. struct    group    *gr;
  118. {
  119.     datum    key;
  120.     datum    content;
  121.     char    grpkey[60];
  122.     int    i;
  123.     int    cnt;
  124.     int    errors = 0;
  125.     static    int    once;
  126.  
  127.     if (! once) {
  128.         if (! gr_dbm)
  129.             setgrent ();
  130.  
  131.         once++;
  132.     }
  133.     if (! gr_dbm)
  134.         return 0;
  135.  
  136.     key.dsize = strlen (gr->gr_name);
  137.     key.dptr = (char *) gr->gr_name;
  138.     content = dbm_fetch (gr_dbm, key);
  139.     if (content.dptr == 0)
  140.         ++errors;
  141.     else {
  142.         if (content.dsize == sizeof (int)) {
  143.             memcpy ((char *) &cnt, content.dptr, sizeof cnt);
  144.  
  145.             for (i = 0;i < cnt;i++) {
  146.                 key.dsize = sizeof i + strlen (gr->gr_name);
  147.                 key.dptr = grpkey;
  148.                 memcpy (grpkey, (char *) &i, sizeof i);
  149.                 strcpy (grpkey + sizeof i, gr->gr_name);
  150.                 if (dbm_delete (gr_dbm, key))
  151.                     ++errors;
  152.             }
  153.         } else {
  154.             if (dbm_delete (gr_dbm, key))
  155.                 ++errors;
  156.         }
  157.     }
  158.     key.dsize = sizeof gr->gr_gid;
  159.     key.dptr = (char *) &gr->gr_gid;
  160.     content = dbm_fetch (gr_dbm, key);
  161.     if (content.dptr == 0)
  162.         ++errors;
  163.     else {
  164.         if (content.dsize == sizeof (int)) {
  165.             memcpy ((char *) &cnt, content.dptr, sizeof cnt);
  166.  
  167.             for (i = 0;i < cnt;i++) {
  168.                 key.dsize = sizeof i + sizeof gr->gr_gid;
  169.                 key.dptr = grpkey;
  170.                 memcpy (grpkey, (char *) &i, sizeof i);
  171.                 memcpy (grpkey + sizeof i, (char *) &gr->gr_gid,
  172.                     sizeof gr->gr_gid);
  173.  
  174.                 if (dbm_delete (gr_dbm, key))
  175.                     ++errors;
  176.             }
  177.         } else {
  178.             if (dbm_delete (gr_dbm, key))
  179.                 ++errors;
  180.         }
  181.     }
  182.     return errors ? 0:1;
  183. }
  184. #endif
  185.