source: trunk/athena/bin/lert/lertload.c @ 17860

Revision 17860, 2.1 KB checked in by zacheiss, 22 years ago (diff)
Implement v2 of the protocol, which uses krb5 for authentication. Leave v1 protocol support in the server for backwards compatability for now. Remove unused variables and modernize the declaration of main(), too.
Line 
1/*
2   file: lertload.c
3   basic use: lertload a < file_of_names
4     puts a set of names with a single letter category in the lert_msg db
5
6 */
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <unistd.h>
11#include <string.h>
12#include <sys/types.h>
13#include <sys/stat.h>
14#include <fcntl.h>
15#include <sys/file.h>
16#include <ctype.h>
17
18#include "lert.h"     
19
20int main(int argc, char **argv)
21{
22  char buffer[512];
23  DBM *db;
24  datum key;
25  datum old;
26  datum data;
27  char *cp;
28  char *bp;
29  char *nd_p;
30  int nd_c;
31  int count;
32  int new_char;
33  char categ[128];
34
35  if (argc != 2) {
36     fprintf(stderr, "usage: %s type\n", argv[0]);
37     fprintf(stderr, "   type is a single character category\n");
38     fprintf(stderr, "   and a file of names is fed in as stdin\n");
39     fprintf(stderr, "   and a matching lertdata file is written\n");
40     exit(1);
41  }
42   
43  db = dbm_open(LERTS_DATA, O_RDWR|O_CREAT, 0600);
44  if (db == NULL) {
45    fprintf(stderr, "Unable to open database file %s.\n", LERTS_DATA);
46    exit (1);
47  }
48  while(fgets(buffer, 512, stdin) != NULL) {
49    bp = buffer;
50    while (isspace(*bp))
51      bp++; /* skip leading spaces */
52    cp = bp;
53    while (!isspace(*cp) && *cp != '\0')
54      cp++;
55    *cp = '\0';
56    key.dptr = bp;
57    key.dsize = strlen(bp) + 1;
58
59
60    old = dbm_fetch(db, key);
61
62    if (old.dptr == NULL) {
63      categ[0] = argv[1][0];
64      nd_p = categ;
65      data.dptr = categ;
66      nd_c = 1;
67    } else {
68      cp = old.dptr;
69      count = old.dsize;
70      data.dptr = (char *)malloc(old.dsize + 1);
71
72      nd_p = data.dptr;
73      nd_c = 0;
74      new_char = TRUE;
75
76      while (count > nd_c) {
77        *nd_p = *cp;
78/*
79   already in list?
80 */
81        if (*cp == argv[1][0]) {
82          new_char = FALSE;
83        }
84      nd_p++;
85      cp++;
86      nd_c++;
87      }
88
89      if (new_char) {
90        *nd_p = argv[1][0];
91        nd_c++;
92      }
93    }
94/*
95    data.dptr = nd_p;
96 */
97    data.dsize = nd_c;
98    if (dbm_store(db, key, data, DBM_REPLACE) < 0) {
99      fprintf(stderr, "dbm_store() failed: Entry = %d\n", key.dptr);
100      (void) dbm_clearerr(db);
101    }
102  }
103  return (0);
104}
105   
Note: See TracBrowser for help on using the repository browser.