home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1999 May / pcp151c.iso / misc / src / install / modutils / kerneld / admpersist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-06  |  2.5 KB  |  146 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4. #include <sys/utsname.h>
  5. #include <gdbm.h>
  6.  
  7. void dump_data(int *ip, int size)
  8. {
  9.     do {
  10.         printf("0x%x", *ip);
  11.         if (size > sizeof(int))
  12.             printf(",");
  13.         size -= sizeof(int);
  14.         ++ip;
  15.     } while (size > 0);
  16.     printf("\n");
  17. }
  18.  
  19. int base[100];
  20.  
  21. datum decode_data(char *p)
  22. {
  23.     datum data;
  24.     int *value = base;
  25.  
  26.     data.dsize = 0;
  27.     --p;
  28.  
  29.     do {
  30.         ++p;
  31.         if ('0' <= *p && *p <= '9') {
  32.             if (p[0] == '0') {
  33.                 if (p[1] == 'x')
  34.                     sscanf(p, "%x", value);
  35.                 else
  36.                     sscanf(p, "%o", value);
  37.             }
  38.             else
  39.                 sscanf(p, "%d", value);
  40.             ++value;
  41.             data.dptr = (char *)base;
  42.             data.dsize += sizeof(int);
  43.         }
  44.         else {
  45.             data.dptr = NULL;
  46.             break;
  47.         }
  48.     } while ((p = strchr(p, ',')) != (char *)0);
  49.  
  50.     return data;
  51. }
  52.  
  53. char *progname;
  54.  
  55. int main(int argc, char **argv)
  56. {
  57.     GDBM_FILE dbf;
  58.     datum key, data;
  59.     struct utsname uts_info;
  60.     char gdbmfile[80];
  61.     char *p;
  62.     int delete = 0;
  63.  
  64.     progname = argv[0];
  65.  
  66.     while (argc > 1 && argv[1][0] == '-') {
  67.         p = &(argv[1][1]);
  68.         while (*p) {
  69.             switch (*p) {
  70.             case 'd':
  71.                 delete = 1;
  72.                 break;
  73.  
  74.             default:
  75.                 fprintf(stderr, "Usage: %s [-d] key[=value[,value...]]\n", progname);
  76.                 exit(1);
  77.             }
  78.             ++p;
  79.         }
  80.         ++argv;
  81.         --argc;
  82.     }
  83.  
  84.     uname(&uts_info);
  85.     sprintf(gdbmfile, "/lib/modules/%s/persist.gdbm", uts_info.release);
  86.  
  87.     if ((dbf = gdbm_open(gdbmfile, 0, GDBM_WRCREAT, 0600, NULL)) == NULL) {
  88.         perror(gdbmfile);
  89.         exit(1);
  90.     }
  91.  
  92.     if (argc == 1) {
  93.         key = gdbm_firstkey(dbf);
  94.         while (key.dptr) {
  95.             datum nextkey;
  96.  
  97.             data = gdbm_fetch(dbf, key);
  98.             printf("%s=", key.dptr);
  99.             dump_data((int *)(data.dptr), data.dsize);
  100.             nextkey = gdbm_nextkey(dbf, key);
  101.             key = nextkey;
  102.         }
  103.     }
  104.     else {
  105.         while (argc > 1) {
  106.             char *kp = argv[1];
  107.             if ((p = strchr(kp, '=')))
  108.                 *p++ = '\0';
  109.             if ((*kp == '\'') || (*kp == '\"')) {
  110.                 if (strchr(kp +1, *kp)) {
  111.                     *(strchr(kp +1, *kp)) = '\0';
  112.                     ++kp;
  113.                 }
  114.             }
  115.             key.dptr = kp;
  116.             key.dsize = strlen(kp) +1;
  117.  
  118.             if (delete)
  119.                 gdbm_delete(dbf, key);
  120.             else if ((p)) { /* change/insert */
  121.                 data = decode_data(p);
  122.                 if (data.dptr) {
  123.                     gdbm_store(dbf, key, data, GDBM_REPLACE);
  124.                     free(data.dptr);
  125.                 }
  126.                 else
  127.                     fprintf(stderr, "unknown '%s'\n", p);
  128.             }
  129.             else { /* show */
  130.                 data = gdbm_fetch(dbf, key);
  131.                 if (data.dptr) {
  132.                     printf("%s=", key.dptr);
  133.                     dump_data((int *)(data.dptr), data.dsize);
  134.                     free(data.dptr);
  135.                 }
  136.                 else
  137.                     fprintf(stderr, "'%s' not found\n", key.dptr);
  138.             }
  139.             ++argv;
  140.             --argc;
  141.         }
  142.     }
  143.     gdbm_close(dbf);
  144.     return 0;
  145. }
  146.