/* * Copyright (c) 2005, 2006 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. */ #include "sm/generic.h" SM_RCSID("@(#)$Id: greyprint.c,v 1.7 2006/11/30 04:32:59 ca Exp $") #include "sm/assert.h" #include "sm/error.h" #include "sm/memops.h" #include "sm/net.h" #include "sm/time.h" #include "sm/sysexits.h" #include "sm/greyctl.h" #include "sm/bdb.h" #if MTA_USE_PTHREADS #include "sm/pthread.h" #endif #include "greyctl.h" static int Verbose = 0; #define MAX_BUF_LEN_TIME 32 static sm_ret_T grey_display0(DB *db, sm_file_T *fp) { sm_ret_T ret; DBC *dbcp; DBT db_data, db_key; greyentry_T ge; ret = db->cursor(db, NULL, &dbcp, 0); if (ret != 0) return ret; do { sm_memzero(&db_key, sizeof(db_key)); sm_memzero(&db_data, sizeof(db_data)); db_data.flags = DB_DBT_USERMEM; db_data.data = ≥ db_data.ulen = sizeof(ge); ret = dbcp->c_get(dbcp, &db_key, &db_data, DB_NEXT); if (ret != 0) break; if (Verbose == 0) { sm_io_fprintf(fp, "addr=%16A, time=%7ld, expire=%7ld, type=%s\n", (ipv4_T) ge.ge_key, (long) ge.ge_time, (long) ge.ge_expire, ge.ge_type == GREY_TYPE_GREY ? "grey" : ge.ge_type == GREY_TYPE_WHITE ? "white" : "oops"); } #if HAVE_STRFTIME if (Verbose >= 1) { char b_time[MAX_BUF_LEN_TIME], e_time[MAX_BUF_LEN_TIME]; strftime(b_time, sizeof(b_time), "%Y-%m-%d/%H:%M:%S", localtime(&(ge.ge_time))); strftime(e_time, sizeof(e_time), "%Y-%m-%d/%H:%M:%S", localtime(&(ge.ge_expire))); sm_io_fprintf(fp, "addr=%16A, time=%s, expire=%s, type=%s\n", (ipv4_T) ge.ge_key, b_time, e_time, ge.ge_type == GREY_TYPE_GREY ? "grey" : ge.ge_type == GREY_TYPE_WHITE ? "white" : "oops"); } #endif } while (ret == 0); ret = dbcp->c_close(dbcp); return ret; } static sm_ret_T grey_print(const char *db_name) { sm_ret_T ret; DB *db; #define dbenv NULL /* open primary */ ret = db_create(&db, dbenv, 0); if (ret != 0) return ret; ret = db->open(db, NULL, db_name, NULL, DB_BTREE, DB_RDONLY, 0600); if (ret != 0) return ret; grey_display0(db, smioout); sm_io_putc(smioout, '\n'); sm_io_flush(smioout); ret = db->close(db, 0); return ret; } /* ** USAGE -- Show usage ** ** Parameters: ** prg -- program name ** ** Returns: ** none */ static void usage(const char *prg) { fprintf(stderr, "%s: usage: %s [options] grey.db\n" "options:\n" "-V increase verbosity\n" , prg, prg); } int main(int argc, char *argv[]) { int c, r; char *db_name; #define DB_NAME "grey_grey_m.db" db_name = DB_NAME; while ((c = getopt(argc, argv, "V")) != -1) { switch (c) { case 'V': ++Verbose; break; default: usage(argv[0]); return EX_USAGE; } } argc -= optind; argv += optind; r = 0; /* shut up bogus gcc complaint */ if (argc == 0) r = grey_print(db_name); else { for (c = 0; c < argc; c++) r = grey_print(argv[c]); } return r; }