1m4_indent([dnl 2m4_include(sys/types.h) 3m4_include(sys/stat.h) 4m4_blank 5m4_include(errno.h) 6m4_include(stdarg.h) 7m4_include(stdlib.h) 8m4_include(string.h) 9m4_include(unistd.h) 10m4_blank 11m4_include(db.h) 12m4_blank 13#define ENV_DIRECTORY "TXNAPP" 14m4_blank 15void env_dir_create(void); 16void env_open(DB_ENV **); 17m4_blank 18m4_ignore([void usage(){}]) 19int 20main(int argc, char *argv[]) 21{ 22 extern int optind; 23 DB *db_cats, *db_color, *db_fruit; 24 DB_ENV *dbenv; 25 int ch; 26m4_ignore([db_fruit = NULL; db_color = NULL; db_cats = NULL;]) 27m4_blank 28 while ((ch = getopt(argc, argv, "")) != EOF) 29 switch (ch) { 30 case '?': 31 default: 32 usage(); 33 } 34 argc -= optind; 35 argv += optind; 36m4_blank 37 env_dir_create(); 38 env_open(&dbenv); 39m4_blank 40 return (0); 41} 42m4_blank 43void 44env_dir_create() 45{ 46 struct stat sb; 47m4_blank 48 /* 49 * If the directory exists, we're done. We do not further check 50 * the type of the file, DB will fail appropriately if it's the 51 * wrong type. 52 */ 53 if (stat(ENV_DIRECTORY, &sb) == 0) 54 return; 55m4_blank 56 /* Create the directory, read/write/access owner only. */ 57 if (mkdir(ENV_DIRECTORY, S_IRWXU) != 0) { 58 fprintf(stderr, 59 "txnapp: mkdir: %s: %s\n", ENV_DIRECTORY, strerror(errno)); 60 exit (1); 61 } 62} 63m4_blank 64void 65env_open(DB_ENV **dbenvp) 66{ 67 DB_ENV *dbenv; 68 int ret; 69m4_blank 70 /* Create the environment handle. */ 71 if ((ret = db_env_create(&dbenv, 0)) != 0) { 72 fprintf(stderr, 73 "txnapp: db_env_create: %s\n", db_strerror(ret)); 74 exit (1); 75 } 76m4_blank 77 /* Set up error handling. */ 78 dbenv-__GT__set_errpfx(dbenv, "txnapp"); 79 dbenv-__GT__set_errfile(dbenv, stderr); 80m4_blank 81 /* 82 * Open a transactional environment: 83 * create if it doesn't exist 84 * free-threaded handle 85 * run recovery 86 * read/write owner only 87 */ 88 if ((ret = dbenv-__GT__open(dbenv, ENV_DIRECTORY, 89 DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | 90 DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER | DB_THREAD, 91 S_IRUSR | S_IWUSR)) != 0) { 92 (void)dbenv-__GT__close(dbenv, 0); 93 fprintf(stderr, "dbenv-__GT__open: %s: %s\n", 94 ENV_DIRECTORY, db_strerror(ret)); 95 exit (1); 96 } 97m4_blank 98 *dbenvp = dbenv; 99}]) 100