mess822x 1.23
mess822x
Loading...
Searching...
No Matches
ofmipname.c
Go to the documentation of this file.
1#include <sys/types.h>
2#include <sys/stat.h>
3#include <unistd.h>
4#include "cdbmake.h"
5#include "logmsg.h"
6#include "open.h"
7#include "buffer.h"
8#include "stralloc.h"
9#include "getln.h"
10#include "exit.h"
11#include "byte.h"
12
13#define WHO "ofmipname"
14
15int rename(const char *,const char *); // stdio.h
16
17char *fncdb;
18char *fntmp;
19
20static void nomem()
21{ logmsg(WHO,111,FATAL,"out of memory"); }
22static void die_read()
23{ logmsg(WHO,111,FATAL,"unable to read input: "); }
24static void die_write()
25{ logmsg(WHO,111,FATAL,B("unable to create: ",fntmp)); }
26static void usage()
27{ logmsg(WHO,100,USAGE,"ofmipname cdb tmp"); }
28
29struct cdb_make cdb;
30
31stralloc line = {0};
33
34stralloc key = {0};
35stralloc data = {0};
36
37static void doit(char *x,unsigned int len)
38{
39 unsigned int colon;
40
41 if (!len) return;
42 if (x[0] == '#') return;
43
44 colon = byte_chr(x,len,':');
45 if (colon == len) return;
46 if (!stralloc_copyb(&key,x,colon)) nomem();
47 ++colon; x += colon; len -= colon;
48
49 colon = byte_chr(x,len,':');
50 if (colon == len) return;
51 if (!stralloc_copyb(&data,x,colon)) nomem();
52 if (!stralloc_0(&data)) nomem();
53 ++colon; x += colon; len -= colon;
54
55 colon = byte_chr(x,len,':');
56 if (colon == len) return;
57 if (!stralloc_catb(&data,x,colon)) nomem();
58 ++colon; x += colon; len -= colon;
59
60 if (cdb_make_add(&cdb,key.s,key.len,data.s,data.len) == -1)
61 die_write();
62}
63
64int main(int argc,char **argv)
65{
66 int fd;
67
68 umask(033);
69
70 fncdb = argv[1];
71 if (!fncdb) usage();
72 fntmp = argv[2];
73 if (!fntmp) usage();
74
75 fd = open_trunc(fntmp);
76 if (fd == -1) die_write();
77 if (cdb_make_start(&cdb,fd) == -1) die_write();
78
79 for (;;) {
80 if (getln(buffer_0,&line,&match,'\n') == -1) die_read();
81 doit(line.s,line.len);
82 if (!match) break;
83 }
84
85 if (cdb_make_finish(&cdb) == -1) die_write();
86 if (fsync(fd) == -1) die_write();
87 if (close(fd) == -1) die_write(); /* NFS stupidity */
88 if (rename(fntmp,fncdb) == -1)
89 logmsg(WHO,111,FATAL,B("unable to move ",fntmp," to ",fncdb));
90
91 _exit(0);
92}
stralloc key
Definition: ofmipname.c:34
char * fntmp
Definition: ofmipname.c:18
struct cdb_make cdb
Definition: ofmipname.c:29
int rename(const char *, const char *)
stralloc data
Definition: ofmipname.c:35
stralloc line
Definition: ofmipname.c:31
int match
Definition: ofmipname.c:32
char * fncdb
Definition: ofmipname.c:17
#define WHO
Definition: ofmipname.c:13
int main()
Definition: 822print.c:351