1
/* Copyright (c) 1996,1997, 1998, 1999, 2000, 2002, 2003, 2005 Thorsten Kukuk
2
Author: Thorsten Kukuk <kukuk@suse.de>
4
The YP Server is free software; you can redistribute it and/or
5
modify it under the terms of the GNU General Public License
6
version 2 as published by the Free Software Foundation.
8
The YP Server is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
General Public License for more details.
13
You should have received a copy of the GNU General Public
14
License along with the YP Server; see the file COPYING. If
15
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
16
Cambridge, MA 02139, USA. */
20
#if defined(HAVE_CONFIG_H)
26
#endif /* HAVE_ALLOCA_H */
33
#endif /* HAVE_GETOPT_H */
42
#if defined (__NetBSD__) || (defined(__GLIBC__) && (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0))
43
/* <rpc/rpc.h> is missing the prototype */
44
int callrpc (char *host, u_long prognum, u_long versnum, u_long procnum,
45
xdrproc_t inproc, char *in, xdrproc_t outproc, char *out);
47
#include <sys/param.h>
50
#if defined(HAVE_LIBGDBM)
54
#define ypdb_store gdbm_store
55
#define YPDB_REPLACE GDBM_REPLACE
56
#define ypdb_close gdbm_close
59
#elif defined (HAVE_NDBM)
63
#define ypdb_store dbm_store
64
#define YPDB_REPLACE DBM_REPLACE
65
#define ypdb_close dbm_close
70
#error "No database found or selected!"
77
write_data (datum key, datum data)
79
if (ypdb_store (dbm, key, data, YPDB_REPLACE) != 0)
81
perror ("makedbm: dbm_store");
89
strapp (const char *str1, const char *str2)
91
char *buffer = alloca(strlen (str1) + strlen (str2) + 1);
93
strcpy (buffer, str1);
94
strcat (buffer, str2);
96
return strdup (buffer);
101
create_file (char *fileName, char *dbmName, char *masterName,
102
char *domainName, char *inputName,
103
char *outputName, int aliases, int shortlines,
104
int b_flag, int s_flag, int remove_comments,
110
char *filename = NULL;
116
input = strcmp (fileName, "-") ? fopen (fileName, "r") : stdin;
119
fprintf (stderr, "makedbm: Cannot open %s\n", fileName);
123
filename = calloc (1, strlen (dbmName) + 3);
124
sprintf (filename, "%s~", dbmName);
125
#if defined(HAVE_LIBGDBM)
126
dbm = gdbm_open (filename, 0, GDBM_NEWDB | GDBM_FAST, 0600, NULL);
127
#elif defined(HAVE_NDBM)
128
dbm = dbm_open (filename, O_CREAT | O_RDWR, 0600);
132
fprintf (stderr, "makedbm: Cannot open %s\n", filename);
136
if (masterName && *masterName)
138
kdat.dptr = "YP_MASTER_NAME";
139
kdat.dsize = strlen (kdat.dptr);
140
vdat.dptr = masterName;
141
vdat.dsize = strlen (vdat.dptr);
142
write_data (kdat, vdat);
145
if (domainName && *domainName)
147
kdat.dptr = "YP_DOMAIN_NAME";
148
kdat.dsize = strlen (kdat.dptr);
149
vdat.dptr = domainName;
150
vdat.dsize = strlen (vdat.dptr);
151
write_data (kdat, vdat);
154
if (inputName && *inputName)
156
kdat.dptr = "YP_INPUT_NAME";
157
kdat.dsize = strlen (kdat.dptr);
158
vdat.dptr = inputName;
159
vdat.dsize = strlen (vdat.dptr);
160
write_data (kdat, vdat);
163
if (outputName && *outputName)
165
kdat.dptr = "YP_OUTPUT_NAME";
166
kdat.dsize = strlen (kdat.dptr);
167
vdat.dptr = outputName;
168
vdat.dsize = strlen (vdat.dptr);
169
write_data (kdat, vdat);
174
kdat.dptr = "YP_INTERDOMAIN";
175
kdat.dsize = strlen (kdat.dptr);
177
vdat.dsize = strlen (vdat.dptr);
178
write_data (kdat, vdat);
183
kdat.dptr = "YP_SECURE";
184
kdat.dsize = strlen (kdat.dptr);
186
vdat.dsize = strlen (vdat.dptr);
187
write_data (kdat, vdat);
193
kdat.dsize = strlen (kdat.dptr);
195
vdat.dsize = strlen (vdat.dptr);
196
write_data (kdat, vdat);
199
gettimeofday (&tv, &tz);
200
sprintf (orderNum, "%ld", (long) tv.tv_sec);
201
kdat.dptr = "YP_LAST_MODIFIED";
202
kdat.dsize = strlen (kdat.dptr);
203
vdat.dptr = orderNum;
204
vdat.dsize = strlen (vdat.dptr);
205
write_data (kdat, vdat);
207
while (!feof (input))
212
ssize_t n = getline (&key, &keylen, input);
214
ssize_t n = getdelim (&key, &keylen, '\n', input);
221
key = malloc (keylen);
224
fgets (key, keylen - 1, input);
232
if (key[n - 1] == '\n' || key[n - 1] == '\r')
234
if (n > 1 && (key[n - 2] == '\n' || key[n - 2] == '\r'))
238
if ((cptr = strchr (key, '#')) != NULL)
242
while (*cptr == ' ' || *cptr == '\t')
249
if (strlen (key) == 0)
257
while (key[len - 1] == ' ' || key[len - 1] == '\t')
263
while (key[len - 1] == ',')
268
getline (&nkey, &nkeylen, input);
270
getdelim (&nkey, &nkeylen, '\n', input);
273
nkey = malloc (nkeylen);
275
fgets (nkey, nkeylen - 1, input);
279
while ((*cptr == ' ') || (*cptr == '\t'))
281
if (strlen (key) + strlen (cptr) < keylen)
286
key = realloc (key, keylen);
294
if ((cptr = strchr (key, '\n')) != NULL)
297
while (key[len - 1] == ' ' || key[len - 1] == '\t')
303
if ((cptr = strchr (key, ':')) != NULL)
307
while (key[strlen (key) - 1] == '\\')
312
ssize_t n = getline (&nkey, &nkeylen, input);
314
ssize_t n = getdelim (&nkey, &nkeylen, '\n', input);
319
nkey = malloc (nkeylen);
321
fgets (nkey, nkeylen - 1, input);
329
if (nkey[n - 1] == '\n' || nkey[n - 1] == '\r')
331
if (n > 1 && (nkey[n - 2] == '\n' || nkey[n - 2] == '\r'))
334
key[strlen (key) - 1] = '\0';
343
if ((key[len - 1] != ' ') && (key[len - 1] != '\t'))
346
while ((*cptr == ' ') || (*cptr == '\t'))
348
if (len + 1 + strlen (cptr) < keylen)
353
key = realloc (key, keylen);
362
key = realloc (key, keylen);
369
if ((cptr = strchr (key, '\n')) != NULL)
375
/* Hack for spaces in passwd, group and hosts keys. If we
376
find a <TAB> in the string, Makefile generates it to
377
seperate the key. This should be the standard, but is not
378
done for all maps (like bootparamd). */
379
if (strchr (cptr, '\t') == NULL)
381
while (*cptr && *cptr != '\t' && *cptr != ' ')
386
while (*cptr && *cptr != '\t')
388
/* But a key should not end with a space. */
389
while (cptr[-1] == ' ')
395
while (*cptr == '\t' || *cptr == ' ')
398
if (strlen (key) == 0)
400
if (strlen (cptr) != 0)
402
"makedbm: warning: malformed input data (ignored)\n");
408
if (check_limit && strlen (key) > YPMAXRECORD)
410
fprintf (stderr, "makedbm: warning: key too long: %s\n", key);
413
kdat.dsize = strlen (key);
416
if (check_limit && strlen (cptr) > YPMAXRECORD)
418
fprintf (stderr, "makedbm: warning: data too long: %s\n", cptr);
421
vdat.dsize = strlen (cptr);
425
for (i = 0; i < kdat.dsize; i++)
426
kdat.dptr[i] = tolower (kdat.dptr[i]);
428
write_data (kdat, vdat);
433
#if defined(HAVE_NDBM)
434
#if defined(__GLIBC__) && __GLIBC__ >= 2
436
char *dbm_db = strapp (dbmName, ".db");
437
char *filedb = strapp (filename, ".db");
440
rename (filedb, dbm_db);
444
char *dbm_pag = strapp (dbmName, ".pag");
445
char *dbm_dir = strapp (dbmName, ".dir");
446
char *filepag = strapp (filename, ".pag");
447
char *filedir = strapp (filename, ".dir");
451
rename (filepag, dbm_pag);
452
rename (filedir, dbm_dir);
457
rename (filename, dbmName);
463
dump_file (char *dbmName)
466
#if defined(HAVE_LIBGDBM)
467
dbm = gdbm_open (dbmName, 0, GDBM_READER, 0600, NULL);
468
#elif defined(HAVE_NDBM)
469
dbm = dbm_open (dbmName, O_RDONLY, 0600);
473
fprintf (stderr, "makedbm: Cannot open %s\n", dbmName);
476
#if defined(HAVE_LIBGDBM)
477
for (key = gdbm_firstkey (dbm); key.dptr; key = gdbm_nextkey (dbm, key))
479
data = gdbm_fetch (dbm, key);
482
fprintf (stderr, "Error:\n");
486
printf ("%.*s\t%.*s\n",
488
data.dsize, data.dptr);
491
#elif defined(HAVE_NDBM)
492
key = dbm_firstkey (dbm);
495
data = dbm_fetch (dbm, key);
498
fprintf (stderr, "Error:\n");
502
printf ("%.*s\t%.*s\n",
504
data.dsize, data.dptr);
505
key = dbm_nextkey (dbm);
517
if ((stat = callrpc ("localhost", YPPROG, YPVERS, YPPROC_CLEAR,
518
(xdrproc_t) xdr_void, &in,
519
(xdrproc_t) xdr_void, out)) != RPC_SUCCESS)
521
fprintf (stderr, "failed to send 'clear' to local ypserv: %s",
522
clnt_sperrno ((enum clnt_stat) stat));
527
Usage (int exit_code)
529
fprintf (stderr, "usage: makedbm -u dbname\n");
530
fprintf (stderr, " makedbm [-a|-r] [-b] [-c] [-s] [-l] [-i YP_INPUT_NAME]\n");
531
fprintf (stderr, " [-o YP_OUTPUT_NAME] [-m YP_MASTER_NAME] inputfile dbname\n");
532
fprintf (stderr, " makedbm -c\n");
533
fprintf (stderr, " makedbm --version\n");
538
main (int argc, char *argv[])
540
char *domainName = NULL;
541
char *inputName = NULL;
542
char *outputName = NULL;
543
char masterName[MAXHOSTNAMELEN + 1] = "";
550
int remove_comments = 0;
556
int option_index = 0;
557
static struct option long_options[] =
559
{"version", no_argument, NULL, '\255'},
560
{"dump", no_argument, NULL, 'u'},
561
{"help", no_argument, NULL, 'h'},
562
{"usage", no_argument, NULL, 'h'},
563
{"secure", no_argument, NULL, 's'},
564
{"aliases", no_argument, NULL, 'a'},
565
{"send_clear", no_argument, NULL, 'c'},
566
{"remove-spaces", no_argument, NULL, '\254'},
567
{"remove-comments", no_argument, NULL, 'r'},
568
{"no-limit-check", no_argument, NULL, '\253'},
569
{NULL, 0, NULL, '\0'}
572
c = getopt_long (argc, argv, "abcd:hi:lm:o:rsu", long_options, &option_index);
612
if (strlen (optarg) <= MAXHOSTNAMELEN)
613
strcpy (masterName, optarg);
615
fprintf (stderr, "hostname to long: %s\n", optarg);
621
fprintf (stdout, "makedbm (%s) %s", PACKAGE, VERSION);
644
if (clear && argc == 0)
654
if (strlen (masterName) == 0)
656
if (gethostname (masterName, sizeof (masterName)) < 0)
657
perror ("gethostname");
663
if (!(hp = gethostbyname (masterName)))
664
perror ("gethostbyname()");
667
strncpy (masterName, hp->h_name, MAXHOSTNAMELEN);
668
masterName[MAXHOSTNAMELEN] = '\0';
673
create_file (argv[0], argv[1], masterName, domainName,
674
inputName, outputName, aliases, shortline,
675
b_flag, s_flag, remove_comments, check_limit);