1c2aa98e2SPeter Wemm /* 2*5dd76dd0SGregory Neil Shapiro * Copyright (c) 1998-2001, 2008 Proofpoint, Inc. and its suppliers. 33299c2f1SGregory Neil Shapiro * All rights reserved. 4c2aa98e2SPeter Wemm * Copyright (c) 1983 Eric P. Allman. All rights reserved. 5c2aa98e2SPeter Wemm * Copyright (c) 1988, 1993 6c2aa98e2SPeter Wemm * The Regents of the University of California. All rights reserved. 7c2aa98e2SPeter Wemm * 8c2aa98e2SPeter Wemm * By using this file, you agree to the terms and conditions set 9c2aa98e2SPeter Wemm * forth in the LICENSE file which can be found at the top level of 10c2aa98e2SPeter Wemm * the sendmail distribution. 11c2aa98e2SPeter Wemm * 12c2aa98e2SPeter Wemm */ 13c2aa98e2SPeter Wemm 1412ed1c7cSGregory Neil Shapiro #include <sm/gen.h> 1512ed1c7cSGregory Neil Shapiro 1612ed1c7cSGregory Neil Shapiro SM_IDSTR(copyright, 17*5dd76dd0SGregory Neil Shapiro "@(#) Copyright (c) 1998-2001 Proofpoint, Inc. and its suppliers.\n\ 183299c2f1SGregory Neil Shapiro All rights reserved.\n\ 193299c2f1SGregory Neil Shapiro Copyright (c) 1983 Eric P. Allman. All rights reserved.\n\ 203299c2f1SGregory Neil Shapiro Copyright (c) 1988, 1993\n\ 2112ed1c7cSGregory Neil Shapiro The Regents of the University of California. All rights reserved.\n") 22c2aa98e2SPeter Wemm 23*5dd76dd0SGregory Neil Shapiro SM_IDSTR(id, "@(#)$Id: praliases.c,v 8.98 2013/11/22 20:51:53 ca Exp $") 24c2aa98e2SPeter Wemm 253299c2f1SGregory Neil Shapiro #include <sys/types.h> 263299c2f1SGregory Neil Shapiro #include <ctype.h> 273299c2f1SGregory Neil Shapiro #include <stdlib.h> 283299c2f1SGregory Neil Shapiro #include <unistd.h> 293299c2f1SGregory Neil Shapiro #ifdef EX_OK 303299c2f1SGregory Neil Shapiro # undef EX_OK /* unistd.h may have another use for this */ 313299c2f1SGregory Neil Shapiro #endif /* EX_OK */ 323299c2f1SGregory Neil Shapiro #include <sysexits.h> 333299c2f1SGregory Neil Shapiro 343299c2f1SGregory Neil Shapiro 35c2aa98e2SPeter Wemm #ifndef NOT_SENDMAIL 36c2aa98e2SPeter Wemm # define NOT_SENDMAIL 373299c2f1SGregory Neil Shapiro #endif /* ! NOT_SENDMAIL */ 383299c2f1SGregory Neil Shapiro #include <sendmail/sendmail.h> 393299c2f1SGregory Neil Shapiro #include <sendmail/pathnames.h> 403299c2f1SGregory Neil Shapiro #include <libsmdb/smdb.h> 41c2aa98e2SPeter Wemm 4276b7bf71SPeter Wemm static void praliases __P((char *, int, char **)); 433299c2f1SGregory Neil Shapiro 443299c2f1SGregory Neil Shapiro uid_t RealUid; 453299c2f1SGregory Neil Shapiro gid_t RealGid; 463299c2f1SGregory Neil Shapiro char *RealUserName; 473299c2f1SGregory Neil Shapiro uid_t RunAsUid; 4841f3d2ceSGregory Neil Shapiro gid_t RunAsGid; 493299c2f1SGregory Neil Shapiro char *RunAsUserName; 503299c2f1SGregory Neil Shapiro int Verbose = 2; 5112ed1c7cSGregory Neil Shapiro bool DontInitGroups = false; 523299c2f1SGregory Neil Shapiro uid_t TrustedUid = 0; 533299c2f1SGregory Neil Shapiro BITMAP256 DontBlameSendmail; 543299c2f1SGregory Neil Shapiro 55c46d91b7SGregory Neil Shapiro # define DELIMITERS " ,/" 56c46d91b7SGregory Neil Shapiro # define PATH_SEPARATOR ':' 5776b7bf71SPeter Wemm 58c2aa98e2SPeter Wemm int 59c2aa98e2SPeter Wemm main(argc, argv) 60c2aa98e2SPeter Wemm int argc; 61c2aa98e2SPeter Wemm char **argv; 62c2aa98e2SPeter Wemm { 6376b7bf71SPeter Wemm char *cfile; 6476b7bf71SPeter Wemm char *filename = NULL; 6512ed1c7cSGregory Neil Shapiro SM_FILE_T *cfp; 66c2aa98e2SPeter Wemm int ch; 6776b7bf71SPeter Wemm char afilebuf[MAXLINE]; 6876b7bf71SPeter Wemm char buf[MAXLINE]; 693299c2f1SGregory Neil Shapiro struct passwd *pw; 703299c2f1SGregory Neil Shapiro static char rnamebuf[MAXNAME]; 713299c2f1SGregory Neil Shapiro extern char *optarg; 723299c2f1SGregory Neil Shapiro extern int optind; 733299c2f1SGregory Neil Shapiro 743299c2f1SGregory Neil Shapiro clrbitmap(DontBlameSendmail); 753299c2f1SGregory Neil Shapiro RunAsUid = RealUid = getuid(); 763299c2f1SGregory Neil Shapiro RunAsGid = RealGid = getgid(); 773299c2f1SGregory Neil Shapiro pw = getpwuid(RealUid); 783299c2f1SGregory Neil Shapiro if (pw != NULL) 793299c2f1SGregory Neil Shapiro { 803299c2f1SGregory Neil Shapiro if (strlen(pw->pw_name) > MAXNAME - 1) 813299c2f1SGregory Neil Shapiro pw->pw_name[MAXNAME] = 0; 8212ed1c7cSGregory Neil Shapiro sm_snprintf(rnamebuf, sizeof rnamebuf, "%s", pw->pw_name); 833299c2f1SGregory Neil Shapiro } 843299c2f1SGregory Neil Shapiro else 8512ed1c7cSGregory Neil Shapiro (void) sm_snprintf(rnamebuf, sizeof rnamebuf, 8612ed1c7cSGregory Neil Shapiro "Unknown UID %d", (int) RealUid); 873299c2f1SGregory Neil Shapiro RunAsUserName = RealUserName = rnamebuf; 88c2aa98e2SPeter Wemm 8912ed1c7cSGregory Neil Shapiro cfile = getcfname(0, 0, SM_GET_SENDMAIL_CF, NULL); 9076b7bf71SPeter Wemm while ((ch = getopt(argc, argv, "C:f:")) != -1) 9176b7bf71SPeter Wemm { 92c2aa98e2SPeter Wemm switch ((char)ch) { 9376b7bf71SPeter Wemm case 'C': 9476b7bf71SPeter Wemm cfile = optarg; 9576b7bf71SPeter Wemm break; 96c2aa98e2SPeter Wemm case 'f': 97c2aa98e2SPeter Wemm filename = optarg; 98c2aa98e2SPeter Wemm break; 99c2aa98e2SPeter Wemm case '?': 100c2aa98e2SPeter Wemm default: 10112ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 1029bd497b8SGregory Neil Shapiro "usage: praliases [-C cffile] [-f aliasfile]" 1039bd497b8SGregory Neil Shapiro " [key ...]\n"); 104c2aa98e2SPeter Wemm exit(EX_USAGE); 105c2aa98e2SPeter Wemm } 10676b7bf71SPeter Wemm } 107c2aa98e2SPeter Wemm argc -= optind; 108c2aa98e2SPeter Wemm argv += optind; 109c2aa98e2SPeter Wemm 11076b7bf71SPeter Wemm if (filename != NULL) 11176b7bf71SPeter Wemm { 11276b7bf71SPeter Wemm praliases(filename, argc, argv); 11376b7bf71SPeter Wemm exit(EX_OK); 11476b7bf71SPeter Wemm } 11576b7bf71SPeter Wemm 11612ed1c7cSGregory Neil Shapiro if ((cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, cfile, SM_IO_RDONLY, 11712ed1c7cSGregory Neil Shapiro NULL)) == NULL) 11876b7bf71SPeter Wemm { 11912ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 12012ed1c7cSGregory Neil Shapiro "praliases: %s: %s\n", cfile, 12112ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 12276b7bf71SPeter Wemm exit(EX_NOINPUT); 12376b7bf71SPeter Wemm } 12476b7bf71SPeter Wemm 125552d4955SGregory Neil Shapiro while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) >= 0) 12676b7bf71SPeter Wemm { 12776b7bf71SPeter Wemm register char *b, *p; 12876b7bf71SPeter Wemm 1293299c2f1SGregory Neil Shapiro b = strchr(buf, '\n'); 1303299c2f1SGregory Neil Shapiro if (b != NULL) 1313299c2f1SGregory Neil Shapiro *b = '\0'; 1323299c2f1SGregory Neil Shapiro 13376b7bf71SPeter Wemm b = buf; 13476b7bf71SPeter Wemm switch (*b++) 13576b7bf71SPeter Wemm { 13676b7bf71SPeter Wemm case 'O': /* option -- see if alias file */ 13712ed1c7cSGregory Neil Shapiro if (sm_strncasecmp(b, " AliasFile", 10) == 0 && 13876b7bf71SPeter Wemm !(isascii(b[10]) && isalnum(b[10]))) 13976b7bf71SPeter Wemm { 14076b7bf71SPeter Wemm /* new form -- find value */ 14176b7bf71SPeter Wemm b = strchr(b, '='); 14276b7bf71SPeter Wemm if (b == NULL) 14376b7bf71SPeter Wemm continue; 14476b7bf71SPeter Wemm while (isascii(*++b) && isspace(*b)) 14576b7bf71SPeter Wemm continue; 14676b7bf71SPeter Wemm } 14776b7bf71SPeter Wemm else if (*b++ != 'A') 14876b7bf71SPeter Wemm { 14976b7bf71SPeter Wemm /* something else boring */ 15076b7bf71SPeter Wemm continue; 15176b7bf71SPeter Wemm } 15276b7bf71SPeter Wemm 15376b7bf71SPeter Wemm /* this is the A or AliasFile option -- save it */ 15412ed1c7cSGregory Neil Shapiro if (sm_strlcpy(afilebuf, b, sizeof afilebuf) >= 1553299c2f1SGregory Neil Shapiro sizeof afilebuf) 15676b7bf71SPeter Wemm { 15712ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 1583299c2f1SGregory Neil Shapiro "praliases: AliasFile filename too long: %.30s\n", 15976b7bf71SPeter Wemm b); 16012ed1c7cSGregory Neil Shapiro (void) sm_io_close(cfp, SM_TIME_DEFAULT); 16176b7bf71SPeter Wemm exit(EX_CONFIG); 16276b7bf71SPeter Wemm } 16376b7bf71SPeter Wemm b = afilebuf; 16476b7bf71SPeter Wemm 16576b7bf71SPeter Wemm for (p = b; p != NULL; ) 16676b7bf71SPeter Wemm { 16776b7bf71SPeter Wemm while (isascii(*p) && isspace(*p)) 16876b7bf71SPeter Wemm p++; 16976b7bf71SPeter Wemm if (*p == '\0') 17076b7bf71SPeter Wemm break; 17176b7bf71SPeter Wemm b = p; 17276b7bf71SPeter Wemm 173c46d91b7SGregory Neil Shapiro p = strpbrk(p, DELIMITERS); 1743299c2f1SGregory Neil Shapiro 17576b7bf71SPeter Wemm /* find end of spec */ 17676b7bf71SPeter Wemm if (p != NULL) 1773299c2f1SGregory Neil Shapiro { 17812ed1c7cSGregory Neil Shapiro bool quoted = false; 17976b7bf71SPeter Wemm 1803299c2f1SGregory Neil Shapiro for (; *p != '\0'; p++) 1813299c2f1SGregory Neil Shapiro { 1823299c2f1SGregory Neil Shapiro /* 1833299c2f1SGregory Neil Shapiro ** Don't break into a quoted 1843299c2f1SGregory Neil Shapiro ** string. 1853299c2f1SGregory Neil Shapiro */ 1863299c2f1SGregory Neil Shapiro 1873299c2f1SGregory Neil Shapiro if (*p == '"') 1883299c2f1SGregory Neil Shapiro quoted = !quoted; 1893299c2f1SGregory Neil Shapiro else if (*p == ',' && !quoted) 1903299c2f1SGregory Neil Shapiro break; 1913299c2f1SGregory Neil Shapiro } 1923299c2f1SGregory Neil Shapiro 1933299c2f1SGregory Neil Shapiro /* No more alias specs follow */ 1943299c2f1SGregory Neil Shapiro if (*p == '\0') 1953299c2f1SGregory Neil Shapiro { 1963299c2f1SGregory Neil Shapiro /* chop trailing whitespace */ 1973299c2f1SGregory Neil Shapiro while (isascii(*p) && 1983299c2f1SGregory Neil Shapiro isspace(*p) && 1993299c2f1SGregory Neil Shapiro p > b) 2003299c2f1SGregory Neil Shapiro p--; 2013299c2f1SGregory Neil Shapiro *p = '\0'; 2023299c2f1SGregory Neil Shapiro p = NULL; 2033299c2f1SGregory Neil Shapiro } 2043299c2f1SGregory Neil Shapiro } 2053299c2f1SGregory Neil Shapiro 2063299c2f1SGregory Neil Shapiro if (p != NULL) 2073299c2f1SGregory Neil Shapiro { 2083299c2f1SGregory Neil Shapiro char *e = p - 1; 2093299c2f1SGregory Neil Shapiro 2103299c2f1SGregory Neil Shapiro /* chop trailing whitespace */ 2113299c2f1SGregory Neil Shapiro while (isascii(*e) && 2123299c2f1SGregory Neil Shapiro isspace(*e) && 2133299c2f1SGregory Neil Shapiro e > b) 2143299c2f1SGregory Neil Shapiro e--; 2153299c2f1SGregory Neil Shapiro *++e = '\0'; 2163299c2f1SGregory Neil Shapiro *p++ = '\0'; 2173299c2f1SGregory Neil Shapiro } 21876b7bf71SPeter Wemm praliases(b, argc, argv); 21976b7bf71SPeter Wemm } 22076b7bf71SPeter Wemm 22176b7bf71SPeter Wemm default: 22276b7bf71SPeter Wemm continue; 22376b7bf71SPeter Wemm } 22476b7bf71SPeter Wemm } 22512ed1c7cSGregory Neil Shapiro (void) sm_io_close(cfp, SM_TIME_DEFAULT); 22676b7bf71SPeter Wemm exit(EX_OK); 2273299c2f1SGregory Neil Shapiro /* NOTREACHED */ 2283299c2f1SGregory Neil Shapiro return EX_OK; 22976b7bf71SPeter Wemm } 23076b7bf71SPeter Wemm 23176b7bf71SPeter Wemm static void 23276b7bf71SPeter Wemm praliases(filename, argc, argv) 23376b7bf71SPeter Wemm char *filename; 23476b7bf71SPeter Wemm int argc; 23576b7bf71SPeter Wemm char **argv; 23676b7bf71SPeter Wemm { 2373299c2f1SGregory Neil Shapiro int result; 2383299c2f1SGregory Neil Shapiro char *colon; 2393299c2f1SGregory Neil Shapiro char *db_name; 2403299c2f1SGregory Neil Shapiro char *db_type; 2413299c2f1SGregory Neil Shapiro SMDB_DATABASE *database = NULL; 2423299c2f1SGregory Neil Shapiro SMDB_CURSOR *cursor = NULL; 2433299c2f1SGregory Neil Shapiro SMDB_DBENT db_key, db_value; 2443299c2f1SGregory Neil Shapiro SMDB_DBPARAMS params; 2453299c2f1SGregory Neil Shapiro SMDB_USER_INFO user_info; 24676b7bf71SPeter Wemm 247c46d91b7SGregory Neil Shapiro colon = strchr(filename, PATH_SEPARATOR); 2483299c2f1SGregory Neil Shapiro if (colon == NULL) 24976b7bf71SPeter Wemm { 2503299c2f1SGregory Neil Shapiro db_name = filename; 2513299c2f1SGregory Neil Shapiro db_type = SMDB_TYPE_DEFAULT; 252c2aa98e2SPeter Wemm } 253c2aa98e2SPeter Wemm else 254c2aa98e2SPeter Wemm { 2553299c2f1SGregory Neil Shapiro *colon = '\0'; 2563299c2f1SGregory Neil Shapiro db_name = colon + 1; 2573299c2f1SGregory Neil Shapiro db_type = filename; 2583299c2f1SGregory Neil Shapiro } 2593299c2f1SGregory Neil Shapiro 2603299c2f1SGregory Neil Shapiro /* clean off arguments */ 2613299c2f1SGregory Neil Shapiro for (;;) 2623299c2f1SGregory Neil Shapiro { 2633299c2f1SGregory Neil Shapiro while (isascii(*db_name) && isspace(*db_name)) 2643299c2f1SGregory Neil Shapiro db_name++; 265c46d91b7SGregory Neil Shapiro 2663299c2f1SGregory Neil Shapiro if (*db_name != '-') 2673299c2f1SGregory Neil Shapiro break; 2683299c2f1SGregory Neil Shapiro while (*db_name != '\0' && 2693299c2f1SGregory Neil Shapiro !(isascii(*db_name) && isspace(*db_name))) 2703299c2f1SGregory Neil Shapiro db_name++; 2713299c2f1SGregory Neil Shapiro } 2723299c2f1SGregory Neil Shapiro 273b4662009SGregory Neil Shapiro /* Skip non-file based DB types */ 274b4662009SGregory Neil Shapiro if (db_type != NULL && *db_type != '\0') 275b4662009SGregory Neil Shapiro { 276b4662009SGregory Neil Shapiro if (db_type != SMDB_TYPE_DEFAULT && 277b4662009SGregory Neil Shapiro strcmp(db_type, "hash") != 0 && 278b4662009SGregory Neil Shapiro strcmp(db_type, "btree") != 0 && 279b4662009SGregory Neil Shapiro strcmp(db_type, "dbm") != 0) 280b4662009SGregory Neil Shapiro { 28112ed1c7cSGregory Neil Shapiro sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 282b4662009SGregory Neil Shapiro "praliases: Skipping non-file based alias type %s\n", 283b4662009SGregory Neil Shapiro db_type); 284b4662009SGregory Neil Shapiro return; 285b4662009SGregory Neil Shapiro } 286b4662009SGregory Neil Shapiro } 287b4662009SGregory Neil Shapiro 2883299c2f1SGregory Neil Shapiro if (*db_name == '\0' || (db_type != NULL && *db_type == '\0')) 2893299c2f1SGregory Neil Shapiro { 2903299c2f1SGregory Neil Shapiro if (colon != NULL) 2913299c2f1SGregory Neil Shapiro *colon = ':'; 29212ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 29312ed1c7cSGregory Neil Shapiro "praliases: illegal alias specification: %s\n", filename); 2943299c2f1SGregory Neil Shapiro goto fatal; 2953299c2f1SGregory Neil Shapiro } 2963299c2f1SGregory Neil Shapiro 2973299c2f1SGregory Neil Shapiro memset(¶ms, '\0', sizeof params); 2983299c2f1SGregory Neil Shapiro params.smdbp_cache_size = 1024 * 1024; 2993299c2f1SGregory Neil Shapiro 3003299c2f1SGregory Neil Shapiro user_info.smdbu_id = RunAsUid; 3013299c2f1SGregory Neil Shapiro user_info.smdbu_group_id = RunAsGid; 30212ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(user_info.smdbu_name, RunAsUserName, 30312ed1c7cSGregory Neil Shapiro SMDB_MAX_USER_NAME_LEN); 3043299c2f1SGregory Neil Shapiro 3053299c2f1SGregory Neil Shapiro result = smdb_open_database(&database, db_name, O_RDONLY, 0, 3063299c2f1SGregory Neil Shapiro SFF_ROOTOK, db_type, &user_info, ¶ms); 3073299c2f1SGregory Neil Shapiro if (result != SMDBE_OK) 3083299c2f1SGregory Neil Shapiro { 30912ed1c7cSGregory Neil Shapiro sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 31012ed1c7cSGregory Neil Shapiro "praliases: %s: open: %s\n", 31112ed1c7cSGregory Neil Shapiro db_name, sm_errstring(result)); 3123299c2f1SGregory Neil Shapiro goto fatal; 3133299c2f1SGregory Neil Shapiro } 3143299c2f1SGregory Neil Shapiro 3153299c2f1SGregory Neil Shapiro if (argc == 0) 3163299c2f1SGregory Neil Shapiro { 3173299c2f1SGregory Neil Shapiro memset(&db_key, '\0', sizeof db_key); 3183299c2f1SGregory Neil Shapiro memset(&db_value, '\0', sizeof db_value); 3193299c2f1SGregory Neil Shapiro 3203299c2f1SGregory Neil Shapiro result = database->smdb_cursor(database, &cursor, 0); 3213299c2f1SGregory Neil Shapiro if (result != SMDBE_OK) 3223299c2f1SGregory Neil Shapiro { 32312ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 32412ed1c7cSGregory Neil Shapiro "praliases: %s: set cursor: %s\n", db_name, 32512ed1c7cSGregory Neil Shapiro sm_errstring(result)); 3263299c2f1SGregory Neil Shapiro goto fatal; 3273299c2f1SGregory Neil Shapiro } 3283299c2f1SGregory Neil Shapiro 3293299c2f1SGregory Neil Shapiro while ((result = cursor->smdbc_get(cursor, &db_key, &db_value, 3303299c2f1SGregory Neil Shapiro SMDB_CURSOR_GET_NEXT)) == 3313299c2f1SGregory Neil Shapiro SMDBE_OK) 3323299c2f1SGregory Neil Shapiro { 3333299c2f1SGregory Neil Shapiro #if 0 3343299c2f1SGregory Neil Shapiro /* skip magic @:@ entry */ 335c46d91b7SGregory Neil Shapiro if (db_key.size == 2 && 336c46d91b7SGregory Neil Shapiro db_key.data[0] == '@' && 337c46d91b7SGregory Neil Shapiro db_key.data[1] == '\0' && 338c46d91b7SGregory Neil Shapiro db_value.size == 2 && 339c46d91b7SGregory Neil Shapiro db_value.data[0] == '@' && 340c46d91b7SGregory Neil Shapiro db_value.data[1] == '\0') 3413299c2f1SGregory Neil Shapiro continue; 3423299c2f1SGregory Neil Shapiro #endif /* 0 */ 3433299c2f1SGregory Neil Shapiro 34412ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 34512ed1c7cSGregory Neil Shapiro "%.*s:%.*s\n", 346c46d91b7SGregory Neil Shapiro (int) db_key.size, 347c46d91b7SGregory Neil Shapiro (char *) db_key.data, 348c46d91b7SGregory Neil Shapiro (int) db_value.size, 349c46d91b7SGregory Neil Shapiro (char *) db_value.data); 3503299c2f1SGregory Neil Shapiro } 3513299c2f1SGregory Neil Shapiro 3523299c2f1SGregory Neil Shapiro if (result != SMDBE_OK && result != SMDBE_LAST_ENTRY) 3533299c2f1SGregory Neil Shapiro { 35412ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 3553299c2f1SGregory Neil Shapiro "praliases: %s: get value at cursor: %s\n", 35612ed1c7cSGregory Neil Shapiro db_name, sm_errstring(result)); 3573299c2f1SGregory Neil Shapiro goto fatal; 358c2aa98e2SPeter Wemm } 359c2aa98e2SPeter Wemm } 3603299c2f1SGregory Neil Shapiro else for (; *argv != NULL; ++argv) 36176b7bf71SPeter Wemm { 362c0c4794dSGregory Neil Shapiro int get_res; 363c0c4794dSGregory Neil Shapiro 3643299c2f1SGregory Neil Shapiro memset(&db_key, '\0', sizeof db_key); 3653299c2f1SGregory Neil Shapiro memset(&db_value, '\0', sizeof db_value); 366c46d91b7SGregory Neil Shapiro db_key.data = *argv; 367c0c4794dSGregory Neil Shapiro db_key.size = strlen(*argv); 368c0c4794dSGregory Neil Shapiro get_res = database->smdb_get(database, &db_key, &db_value, 0); 369c0c4794dSGregory Neil Shapiro if (get_res == SMDBE_NOT_FOUND) 370c0c4794dSGregory Neil Shapiro { 371c0c4794dSGregory Neil Shapiro db_key.size++; 372c0c4794dSGregory Neil Shapiro get_res = database->smdb_get(database, &db_key, 373c0c4794dSGregory Neil Shapiro &db_value, 0); 374c0c4794dSGregory Neil Shapiro } 375c0c4794dSGregory Neil Shapiro if (get_res == SMDBE_OK) 3763299c2f1SGregory Neil Shapiro { 37712ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 37812ed1c7cSGregory Neil Shapiro "%.*s:%.*s\n", 379c46d91b7SGregory Neil Shapiro (int) db_key.size, 380c46d91b7SGregory Neil Shapiro (char *) db_key.data, 381c46d91b7SGregory Neil Shapiro (int) db_value.size, 382c46d91b7SGregory Neil Shapiro (char *) db_value.data); 383c2aa98e2SPeter Wemm } 38476b7bf71SPeter Wemm else 38512ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 38612ed1c7cSGregory Neil Shapiro "%s: No such key\n", 38712ed1c7cSGregory Neil Shapiro (char *)db_key.data); 38876b7bf71SPeter Wemm } 38976b7bf71SPeter Wemm 3903299c2f1SGregory Neil Shapiro fatal: 3913299c2f1SGregory Neil Shapiro if (cursor != NULL) 3923299c2f1SGregory Neil Shapiro (void) cursor->smdbc_close(cursor); 3933299c2f1SGregory Neil Shapiro if (database != NULL) 3943299c2f1SGregory Neil Shapiro (void) database->smdb_close(database); 3953299c2f1SGregory Neil Shapiro if (colon != NULL) 3963299c2f1SGregory Neil Shapiro *colon = ':'; 3973299c2f1SGregory Neil Shapiro return; 398c2aa98e2SPeter Wemm } 399