home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1990, John F. Haugh II
- * All rights reserved.
- *
- * Permission is granted to copy and create derivative works for any
- * non-commercial purpose, provided this copyright notice is preserved
- * in all copies of source code, or included in human readable form
- * and conspicuously displayed on all copies of object code or
- * distribution media.
- */
-
- #ifndef lint
- static char sccsid[] = "@(#)gsdbm.c 3.3 11:25:29 12/19/90";
- #endif
-
- #include <string.h>
- #include <stdio.h>
- #include "shadow.h"
- #include "config.h"
-
- #ifdef NDBM
- #include <ndbm.h>
- DBM *sgr_dbm;
-
- #define GRP_FRAG 256
-
- /*
- * sgr_dbm_update
- *
- * Updates the DBM password files, if they exist.
- */
-
- int
- sgr_dbm_update (sgr)
- struct sgrp *sgr;
- {
- datum key;
- datum content;
- char data[BUFSIZ*8];
- char sgrpkey[60];
- char *cp;
- int len;
- int i;
- int cnt;
- static int once;
-
- if (! once) {
- if (! sgr_dbm)
- setsgent ();
-
- once++;
- }
- if (! sgr_dbm)
- return 0;
-
- len = sgr_pack (sgr, data);
-
- if (len <= GRP_FRAG) {
- content.dsize = len;
- content.dptr = data;
-
- key.dsize = strlen (sgr->sg_name);
- key.dptr = sgr->sg_name;
- if (dbm_store (sgr_dbm, key, content, DBM_REPLACE))
- return 0;
- } else {
- content.dsize = sizeof cnt;
- content.dptr = (char *) &cnt;
- cnt = (len + (GRP_FRAG-1)) / GRP_FRAG;
-
- key.dsize = strlen (sgr->sg_name);
- key.dptr = sgr->sg_name;
- if (dbm_store (sgr_dbm, key, content, DBM_REPLACE))
- return 0;
-
- for (cp = data, i = 0;i < cnt;i++) {
- content.dsize = len > GRP_FRAG ? GRP_FRAG:len;
- len -= content.dsize;
- content.dptr = cp;
- cp += content.dsize;
-
- key.dsize = sizeof i + strlen (sgr->sg_name);
- key.dptr = sgrpkey;
- memcpy (sgrpkey, &i, sizeof i);
- strcpy (sgrpkey + sizeof i, sgr->sg_name);
- if (dbm_store (sgr_dbm, key, content, DBM_REPLACE))
- return 0;
- }
- }
- return 1;
- }
- #endif
-