Not logged in

Artifact 999b2278aa1cb633522a6b72a4715a2a47a779dd:


0000: 2f 2a 20 7a 64 62 69 2e 63 0a 0a 20 20 20 43 6f  /* zdbi.c..   Co
0010: 70 79 72 69 67 68 74 20 c2 a9 20 32 30 31 36 20  pyright .. 2016 
0020: 42 72 61 6e 64 6f 6e 20 49 6e 76 65 72 67 6f 20  Brandon Invergo 
0030: 3c 62 72 61 6e 64 6f 6e 40 69 6e 76 65 72 67 6f  <brandon@invergo
0040: 2e 6e 65 74 3e 0a 0a 20 20 20 54 68 69 73 20 66  .net>..   This f
0050: 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66 20 7a  ile is part of z
0060: 65 70 74 6f 64 62 0a 0a 20 20 20 7a 65 70 74 6f  eptodb..   zepto
0070: 64 62 20 69 73 20 66 72 65 65 20 73 6f 66 74 77  db is free softw
0080: 61 72 65 3a 20 79 6f 75 20 63 61 6e 20 72 65 64  are: you can red
0090: 69 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64  istribute it and
00a0: 2f 6f 72 20 6d 6f 64 69 66 79 0a 20 20 20 69 74  /or modify.   it
00b0: 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73   under the terms
00c0: 20 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65   of the GNU Gene
00d0: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e  ral Public Licen
00e0: 73 65 20 61 73 20 70 75 62 6c 69 73 68 65 64 20  se as published 
00f0: 62 79 0a 20 20 20 74 68 65 20 46 72 65 65 20 53  by.   the Free S
0100: 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69  oftware Foundati
0110: 6f 6e 2c 20 65 69 74 68 65 72 20 76 65 72 73 69  on, either versi
0120: 6f 6e 20 33 20 6f 66 20 74 68 65 20 4c 69 63 65  on 3 of the Lice
0130: 6e 73 65 2c 20 6f 72 0a 20 20 20 28 61 74 20 79  nse, or.   (at y
0140: 6f 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20  our option) any 
0150: 6c 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 0a  later version...
0160: 20 20 20 7a 65 70 74 6f 64 62 20 69 73 20 64 69     zeptodb is di
0170: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0180: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0190: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 20 20  ll be useful,.  
01a0: 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59   but WITHOUT ANY
01b0: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
01c0: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
01d0: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
01e0: 20 20 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49     MERCHANTABILI
01f0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
0200: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
0210: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
0220: 0a 20 20 20 47 4e 55 20 47 65 6e 65 72 61 6c 20  .   GNU General 
0230: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66  Public License f
0240: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
0250: 0a 0a 20 20 20 59 6f 75 20 73 68 6f 75 6c 64 20  ..   You should 
0260: 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61 20  have received a 
0270: 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55 20  copy of the GNU 
0280: 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c  General Public L
0290: 69 63 65 6e 73 65 0a 20 20 20 61 6c 6f 6e 67 20  icense.   along 
02a0: 77 69 74 68 20 7a 65 70 74 6f 64 62 2e 20 20 49  with zeptodb.  I
02b0: 66 20 6e 6f 74 2c 20 73 65 65 20 3c 68 74 74 70  f not, see <http
02c0: 3a 2f 2f 77 77 77 2e 67 6e 75 2e 6f 72 67 2f 6c  ://www.gnu.org/l
02d0: 69 63 65 6e 73 65 73 2f 3e 2e 0a 2a 2f 0a 0a 23  icenses/>..*/..#
02e0: 64 65 66 69 6e 65 20 5f 47 4e 55 5f 53 4f 55 52  define _GNU_SOUR
02f0: 43 45 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f  CE..#include <co
0300: 6e 66 69 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  nfig.h>.#include
0310: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0320: 6c 75 64 65 20 22 65 72 72 6f 72 2e 68 22 0a 23  lude "error.h".#
0330: 69 6e 63 6c 75 64 65 20 22 61 72 67 70 2e 68 22  include "argp.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61  .#include <signa
0350: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  l.h>.#include <s
0360: 74 64 62 6f 6f 6c 2e 68 3e 0a 23 69 6e 63 6c 75  tdbool.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6e 74 2e 68  nclude <stdint.h
0390: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 7a 64 62 2e  >.#include "zdb.
03a0: 68 22 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  h"..const char *
03b0: 70 72 6f 67 72 61 6d 5f 6e 61 6d 65 20 3d 20 22  program_name = "
03c0: 7a 64 62 69 22 3b 0a 63 6f 6e 73 74 20 63 68 61  zdbi";.const cha
03d0: 72 20 2a 61 72 67 70 5f 70 72 6f 67 72 61 6d 5f  r *argp_program_
03e0: 76 65 72 73 69 6f 6e 20 3d 20 50 41 43 4b 41 47  version = PACKAG
03f0: 45 5f 53 54 52 49 4e 47 3b 0a 63 6f 6e 73 74 20  E_STRING;.const 
0400: 63 68 61 72 20 2a 61 72 67 70 5f 70 72 6f 67 72  char *argp_progr
0410: 61 6d 5f 62 75 67 5f 61 64 64 72 65 73 73 20 3d  am_bug_address =
0420: 20 50 41 43 4b 41 47 45 5f 42 55 47 52 45 50 4f   PACKAGE_BUGREPO
0430: 52 54 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  RT;.static void 
0440: 2a 64 61 74 61 62 61 73 65 3b 0a 73 74 61 74 69  *database;.stati
0450: 63 20 63 68 61 72 20 64 6f 63 5b 5d 20 3d 0a 20  c char doc[] =. 
0460: 20 22 7a 64 62 69 20 2d 2d 20 69 6e 73 70 65 63   "zdbi -- inspec
0470: 74 20 61 20 44 42 4d 20 64 61 74 61 62 61 73 65  t a DBM database
0480: 22 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 61  ";.static char a
0490: 72 67 73 5f 64 6f 63 5b 5d 20 3d 20 22 44 41 54  rgs_doc[] = "DAT
04a0: 41 42 41 53 45 22 3b 0a 0a 73 74 61 74 69 63 20  ABASE";..static 
04b0: 73 74 72 75 63 74 20 61 72 67 70 5f 6f 70 74 69  struct argp_opti
04c0: 6f 6e 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b  on options[] = {
04d0: 0a 20 20 7b 22 6d 6d 61 70 2d 73 69 7a 65 22 2c  .  {"mmap-size",
04e0: 20 20 20 28 69 6e 74 29 27 6d 27 2c 20 22 4e 55     (int)'m', "NU
04f0: 4d 22 2c 20 30 2c 0a 20 20 20 22 54 68 65 20 73  M", 0,.   "The s
0500: 69 7a 65 20 28 69 6e 20 62 79 74 65 73 29 20 6f  ize (in bytes) o
0510: 66 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 70  f the memory-map
0520: 70 65 64 20 72 65 67 69 6f 6e 20 74 6f 20 75 73  ped region to us
0530: 65 20 28 64 65 66 61 75 6c 74 3d 31 30 32 34 29  e (default=1024)
0540: 22 2c 20 30 7d 2c 0a 20 20 7b 22 63 61 63 68 65  ", 0},.  {"cache
0550: 2d 73 69 7a 65 22 2c 20 28 69 6e 74 29 27 63 27  -size", (int)'c'
0560: 2c 20 22 4e 55 4d 22 2c 20 30 2c 0a 20 20 20 22  , "NUM", 0,.   "
0570: 54 68 65 20 62 75 63 6b 65 74 20 63 61 63 68 65  The bucket cache
0580: 20 73 69 7a 65 20 74 6f 20 75 73 65 20 28 64 65   size to use (de
0590: 66 61 75 6c 74 3d 31 32 38 29 22 2c 20 30 7d 2c  fault=128)", 0},
05a0: 0a 20 20 7b 22 62 6c 6f 63 6b 2d 73 69 7a 65 22  .  {"block-size"
05b0: 2c 20 28 69 6e 74 29 27 62 27 2c 20 22 4e 55 4d  , (int)'b', "NUM
05c0: 22 2c 20 30 2c 0a 20 20 20 22 54 68 65 20 62 6c  ", 0,.   "The bl
05d0: 6f 63 6b 20 73 69 7a 65 20 74 6f 20 75 73 65 20  ock size to use 
05e0: 28 64 65 66 61 75 6c 74 3d 35 31 32 29 22 2c 20  (default=512)", 
05f0: 30 7d 2c 0a 20 20 7b 22 6e 6f 2d 6d 6d 61 70 22  0},.  {"no-mmap"
0600: 2c 20 28 69 6e 74 29 27 6e 27 2c 20 28 63 6f 6e  , (int)'n', (con
0610: 73 74 20 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 20  st char *)NULL, 
0620: 30 2c 0a 20 20 20 22 44 6f 20 6e 6f 74 20 6d 65  0,.   "Do not me
0630: 6d 6f 72 79 2d 6d 61 70 20 74 68 65 20 64 61 74  mory-map the dat
0640: 61 62 61 73 65 20 66 69 6c 65 22 2c 20 30 7d 2c  abase file", 0},
0650: 0a 20 20 7b 22 6e 6f 2d 6c 6f 63 6b 22 2c 20 28  .  {"no-lock", (
0660: 69 6e 74 29 27 6c 27 2c 20 28 63 6f 6e 73 74 20  int)'l', (const 
0670: 63 68 61 72 20 2a 29 4e 55 4c 4c 2c 20 30 2c 0a  char *)NULL, 0,.
0680: 20 20 20 22 44 6f 20 6e 6f 74 20 70 65 72 66 6f     "Do not perfo
0690: 72 6d 20 61 6e 79 20 6c 6f 63 6b 69 6e 67 20 6f  rm any locking o
06a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
06b0: 69 6c 65 22 2c 20 30 7d 2c 0a 20 20 7b 22 76 65  ile", 0},.  {"ve
06c0: 72 62 6f 73 65 22 2c 20 28 69 6e 74 29 27 76 27  rbose", (int)'v'
06d0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
06e0: 4e 55 4c 4c 2c 20 30 2c 0a 20 20 20 22 50 72 69  NULL, 0,.   "Pri
06f0: 6e 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  nt extra informa
0700: 74 69 6f 6e 2e 22 2c 20 30 7d 2c 0a 20 20 7b 28  tion.", 0},.  {(
0710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 4e 55 4c  const char *)NUL
0720: 4c 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63 68 61  L, 0, (const cha
0730: 72 20 2a 29 4e 55 4c 4c 2c 20 30 2c 20 28 63 6f  r *)NULL, 0, (co
0740: 6e 73 74 20 63 68 61 72 20 2a 29 4e 55 4c 4c 2c  nst char *)NULL,
0750: 20 30 7d 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 61   0}.};..struct a
0760: 72 67 75 6d 65 6e 74 73 0a 7b 0a 20 20 63 68 61  rguments.{.  cha
0770: 72 20 2a 61 72 67 73 5b 31 5d 3b 0a 20 20 73 69  r *args[1];.  si
0780: 7a 65 5f 74 20 6d 6d 61 70 5f 73 69 7a 65 3b 0a  ze_t mmap_size;.
0790: 20 20 73 69 7a 65 5f 74 20 63 61 63 68 65 5f 73    size_t cache_s
07a0: 69 7a 65 3b 0a 20 20 73 69 7a 65 5f 74 20 62 6c  ize;.  size_t bl
07b0: 6f 63 6b 5f 73 69 7a 65 3b 0a 20 20 62 6f 6f 6c  ock_size;.  bool
07c0: 20 6e 6f 5f 6d 6d 61 70 3b 0a 20 20 62 6f 6f 6c   no_mmap;.  bool
07d0: 20 6e 6f 5f 6c 6f 63 6b 3b 0a 20 20 62 6f 6f 6c   no_lock;.  bool
07e0: 20 76 65 72 62 6f 73 65 3b 0a 7d 3b 0a 0a 73 74   verbose;.};..st
07f0: 61 74 69 63 20 65 72 72 6f 72 5f 74 0a 70 61 72  atic error_t.par
0800: 73 65 5f 6f 70 74 20 28 69 6e 74 20 6b 65 79 2c  se_opt (int key,
0810: 20 63 68 61 72 20 2a 61 72 67 2c 20 73 74 72 75   char *arg, stru
0820: 63 74 20 61 72 67 70 5f 73 74 61 74 65 20 2a 73  ct argp_state *s
0830: 74 61 74 65 29 0a 7b 0a 20 20 73 74 72 75 63 74  tate).{.  struct
0840: 20 61 72 67 75 6d 65 6e 74 73 20 2a 61 72 67 75   arguments *argu
0850: 6d 65 6e 74 73 20 3d 20 73 74 61 74 65 2d 3e 69  ments = state->i
0860: 6e 70 75 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nput;.  unsigned
0870: 20 6c 6f 6e 67 20 69 6e 74 20 73 69 7a 65 3b 0a   long int size;.
0880: 20 20 73 77 69 74 63 68 20 28 6b 65 79 29 0a 20    switch (key). 
0890: 20 20 20 7b 0a 20 20 20 20 63 61 73 65 20 27 62     {.    case 'b
08a0: 27 3a 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  ':.      size = 
08b0: 61 72 67 20 3f 20 73 74 72 74 6f 75 6c 20 28 61  arg ? strtoul (a
08c0: 72 67 2c 20 4e 55 4c 4c 2c 20 31 30 29 20 3a 20  rg, NULL, 10) : 
08d0: 35 31 32 55 4c 3b 0a 20 20 20 20 20 20 69 66 20  512UL;.      if 
08e0: 28 73 69 7a 65 20 3e 20 53 49 5a 45 5f 4d 41 58  (size > SIZE_MAX
08f0: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ).        {.    
0900: 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74 73 2d        arguments-
0910: 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 53 49  >cache_size = SI
0920: 5a 45 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20  ZE_MAX;.        
0930: 7d 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20  }.      else.   
0940: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
0950: 20 61 72 67 75 6d 65 6e 74 73 2d 3e 63 61 63 68   arguments->cach
0960: 65 5f 73 69 7a 65 20 3d 20 28 73 69 7a 65 5f 74  e_size = (size_t
0970: 29 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  )size;.        }
0980: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0990: 20 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20 20    case 'c':.    
09a0: 20 20 73 69 7a 65 20 3d 20 61 72 67 20 3f 20 73    size = arg ? s
09b0: 74 72 74 6f 75 6c 20 28 61 72 67 2c 20 4e 55 4c  trtoul (arg, NUL
09c0: 4c 2c 20 31 30 29 20 3a 20 31 32 38 55 4c 3b 0a  L, 10) : 128UL;.
09d0: 20 20 20 20 20 20 69 66 20 28 73 69 7a 65 20 3e        if (size >
09e0: 20 53 49 5a 45 5f 4d 41 58 29 0a 20 20 20 20 20   SIZE_MAX).     
09f0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 61     {.          a
0a00: 72 67 75 6d 65 6e 74 73 2d 3e 63 61 63 68 65 5f  rguments->cache_
0a10: 73 69 7a 65 20 3d 20 53 49 5a 45 5f 4d 41 58 3b  size = SIZE_MAX;
0a20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0a30: 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a   else.        {.
0a40: 20 20 20 20 20 20 20 20 20 20 61 72 67 75 6d 65            argume
0a50: 6e 74 73 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20  nts->cache_size 
0a60: 3d 20 28 73 69 7a 65 5f 74 29 73 69 7a 65 3b 0a  = (size_t)size;.
0a70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0a80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0a90: 27 6c 27 3a 0a 20 20 20 20 20 20 61 72 67 75 6d  'l':.      argum
0aa0: 65 6e 74 73 2d 3e 6e 6f 5f 6c 6f 63 6b 20 3d 20  ents->no_lock = 
0ab0: 74 72 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61  true;.      brea
0ac0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 27 6d 27 3a  k;.    case 'm':
0ad0: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 61 72  .      size = ar
0ae0: 67 20 3f 20 73 74 72 74 6f 75 6c 20 28 61 72 67  g ? strtoul (arg
0af0: 2c 20 4e 55 4c 4c 2c 20 31 30 29 20 3a 20 31 33  , NULL, 10) : 13
0b00: 31 30 37 32 55 4c 3b 0a 20 20 20 20 20 20 69 66  1072UL;.      if
0b10: 20 28 73 69 7a 65 20 3e 20 53 49 5a 45 5f 4d 41   (size > SIZE_MA
0b20: 58 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  X).        {.   
0b30: 20 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74 73         arguments
0b40: 2d 3e 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 53 49  ->mmap_size = SI
0b50: 5a 45 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20  ZE_MAX;.        
0b60: 7d 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20  }.      else.   
0b70: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
0b80: 20 61 72 67 75 6d 65 6e 74 73 2d 3e 6d 6d 61 70   arguments->mmap
0b90: 5f 73 69 7a 65 20 3d 20 28 73 69 7a 65 5f 74 29  _size = (size_t)
0ba0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  size;.        }.
0bb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0bc0: 20 63 61 73 65 20 27 6e 27 3a 0a 20 20 20 20 20   case 'n':.     
0bd0: 20 61 72 67 75 6d 65 6e 74 73 2d 3e 6e 6f 5f 6d   arguments->no_m
0be0: 6d 61 70 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  map = true;.    
0bf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0c00: 65 20 27 76 27 3a 0a 20 20 20 20 20 20 61 72 67  e 'v':.      arg
0c10: 75 6d 65 6e 74 73 2d 3e 76 65 72 62 6f 73 65 20  uments->verbose 
0c20: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 62 72  = true;.      br
0c30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
0c40: 47 50 5f 4b 45 59 5f 41 52 47 3a 0a 20 20 20 20  GP_KEY_ARG:.    
0c50: 20 20 69 66 20 28 73 74 61 74 65 2d 3e 61 72 67    if (state->arg
0c60: 5f 6e 75 6d 20 3e 3d 20 31 29 0a 20 20 20 20 20  _num >= 1).     
0c70: 20 20 20 61 72 67 70 5f 75 73 61 67 65 20 28 73     argp_usage (s
0c80: 74 61 74 65 29 3b 0a 20 20 20 20 20 20 61 72 67  tate);.      arg
0c90: 75 6d 65 6e 74 73 2d 3e 61 72 67 73 5b 73 74 61  uments->args[sta
0ca0: 74 65 2d 3e 61 72 67 5f 6e 75 6d 5d 20 3d 20 61  te->arg_num] = a
0cb0: 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  rg;.      break;
0cc0: 0a 20 20 20 20 63 61 73 65 20 41 52 47 50 5f 4b  .    case ARGP_K
0cd0: 45 59 5f 45 4e 44 3a 0a 20 20 20 20 20 20 69 66  EY_END:.      if
0ce0: 20 28 73 74 61 74 65 2d 3e 61 72 67 5f 6e 75 6d   (state->arg_num
0cf0: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20 20 61   == 0).        a
0d00: 72 67 70 5f 75 73 61 67 65 20 28 73 74 61 74 65  rgp_usage (state
0d10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0d20: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
0d30: 20 20 20 72 65 74 75 72 6e 20 41 52 47 50 5f 45     return ARGP_E
0d40: 52 52 5f 55 4e 4b 4e 4f 57 4e 3b 0a 20 20 20 20  RR_UNKNOWN;.    
0d50: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
0d60: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
0d70: 72 67 70 20 61 72 67 70 20 3d 20 7b 6f 70 74 69  rgp argp = {opti
0d80: 6f 6e 73 2c 20 70 61 72 73 65 5f 6f 70 74 2c 20  ons, parse_opt, 
0d90: 61 72 67 73 5f 64 6f 63 2c 20 64 6f 63 2c 0a 20  args_doc, doc,. 
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74            (const
0dc0: 20 73 74 72 75 63 74 20 61 72 67 70 5f 63 68 69   struct argp_chi
0dd0: 6c 64 20 2a 29 4e 55 4c 4c 2c 0a 20 20 20 20 20  ld *)NULL,.     
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 28 63 6f 6e        NULL, (con
0e00: 73 74 20 63 68 61 72 20 2a 29 4e 55 4c 4c 7d 3b  st char *)NULL};
0e10: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 74 65  ..static void.te
0e20: 72 6d 69 6e 61 74 69 6f 6e 5f 68 61 6e 64 6c 65  rmination_handle
0e30: 72 20 28 69 6e 74 20 73 69 67 6e 75 6d 20 5f 5f  r (int signum __
0e40: 61 74 74 72 69 62 75 74 65 5f 5f 20 28 28 75 6e  attribute__ ((un
0e50: 75 73 65 64 29 29 29 0a 7b 0a 20 20 70 72 69 6e  used))).{.  prin
0e60: 74 66 20 28 22 49 6e 74 65 72 72 75 70 74 20 63  tf ("Interrupt c
0e70: 61 75 67 68 74 2c 20 63 6c 6f 73 69 6e 67 20 64  aught, closing d
0e80: 61 74 61 62 61 73 65 5c 6e 22 29 3b 0a 20 20 69  atabase\n");.  i
0e90: 66 20 28 64 61 74 61 62 61 73 65 20 26 26 20 7a  f (database && z
0ea0: 64 62 5f 63 6c 6f 73 65 20 28 64 61 74 61 62 61  db_close (databa
0eb0: 73 65 2c 20 66 61 6c 73 65 29 29 0a 20 20 20 20  se, false)).    
0ec0: 65 72 72 6f 72 20 28 45 58 49 54 5f 46 41 49 4c  error (EXIT_FAIL
0ed0: 55 52 45 2c 20 65 72 72 6e 6f 2c 20 22 46 61 69  URE, errno, "Fai
0ee0: 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74  led to close dat
0ef0: 61 62 61 73 65 22 29 3b 0a 20 20 65 6c 73 65 0a  abase");.  else.
0f00: 20 20 20 20 65 78 69 74 20 28 45 58 49 54 5f 53      exit (EXIT_S
0f10: 55 43 43 45 53 53 29 3b 0a 7d 0a 0a 69 6e 74 0a  UCCESS);.}..int.
0f20: 6d 61 69 6e 20 28 69 6e 74 20 61 72 67 63 2c 20  main (int argc, 
0f30: 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a 20  char **argv).{. 
0f40: 20 73 74 72 75 63 74 20 61 72 67 75 6d 65 6e 74   struct argument
0f50: 73 20 61 72 67 75 6d 65 6e 74 73 3b 0a 20 20 69  s arguments;.  i
0f60: 6e 74 20 6d 6f 64 65 20 3d 20 5a 44 42 5f 52 45  nt mode = ZDB_RE
0f70: 41 44 45 52 3b 0a 20 20 65 72 72 6f 72 5f 74 20  ADER;.  error_t 
0f80: 61 72 67 70 5f 72 65 73 75 6c 74 3b 0a 0a 20 20  argp_result;..  
0f90: 61 72 67 75 6d 65 6e 74 73 2e 6d 6d 61 70 5f 73  arguments.mmap_s
0fa0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 61 72  ize = 1024;.  ar
0fb0: 67 75 6d 65 6e 74 73 2e 63 61 63 68 65 5f 73 69  guments.cache_si
0fc0: 7a 65 20 3d 20 31 32 38 3b 0a 20 20 61 72 67 75  ze = 128;.  argu
0fd0: 6d 65 6e 74 73 2e 62 6c 6f 63 6b 5f 73 69 7a 65  ments.block_size
0fe0: 20 3d 20 35 31 32 3b 0a 20 20 61 72 67 75 6d 65   = 512;.  argume
0ff0: 6e 74 73 2e 6e 6f 5f 6d 6d 61 70 20 3d 20 66 61  nts.no_mmap = fa
1000: 6c 73 65 3b 0a 20 20 61 72 67 75 6d 65 6e 74 73  lse;.  arguments
1010: 2e 6e 6f 5f 6c 6f 63 6b 20 3d 20 66 61 6c 73 65  .no_lock = false
1020: 3b 0a 20 20 61 72 67 75 6d 65 6e 74 73 2e 76 65  ;.  arguments.ve
1030: 72 62 6f 73 65 20 3d 20 66 61 6c 73 65 3b 0a 0a  rbose = false;..
1040: 20 20 61 72 67 70 5f 72 65 73 75 6c 74 20 3d 20    argp_result = 
1050: 61 72 67 70 5f 70 61 72 73 65 20 28 26 61 72 67  argp_parse (&arg
1060: 70 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 30  p, argc, argv, 0
1070: 2c 20 30 2c 20 26 61 72 67 75 6d 65 6e 74 73 29  , 0, &arguments)
1080: 3b 0a 20 20 69 66 20 28 61 72 67 70 5f 72 65 73  ;.  if (argp_res
1090: 75 6c 74 29 0a 20 20 20 20 65 72 72 6f 72 20 28  ult).    error (
10a0: 45 58 49 54 5f 46 41 49 4c 55 52 45 2c 20 61 72  EXIT_FAILURE, ar
10b0: 67 70 5f 72 65 73 75 6c 74 2c 20 22 46 61 69 6c  gp_result, "Fail
10c0: 65 64 20 74 6f 20 70 61 72 73 65 20 61 72 67 75  ed to parse argu
10d0: 6d 65 6e 74 73 22 29 3b 0a 0a 20 20 69 66 20 28  ments");..  if (
10e0: 73 69 67 6e 61 6c 20 28 53 49 47 49 4e 54 2c 20  signal (SIGINT, 
10f0: 74 65 72 6d 69 6e 61 74 69 6f 6e 5f 68 61 6e 64  termination_hand
1100: 6c 65 72 29 20 3d 3d 20 53 49 47 5f 49 47 4e 29  ler) == SIG_IGN)
1110: 0a 20 20 20 20 73 69 67 6e 61 6c 20 28 53 49 47  .    signal (SIG
1120: 49 4e 54 2c 20 53 49 47 5f 49 47 4e 29 3b 0a 20  INT, SIG_IGN);. 
1130: 20 69 66 20 28 73 69 67 6e 61 6c 20 28 53 49 47   if (signal (SIG
1140: 48 55 50 2c 20 74 65 72 6d 69 6e 61 74 69 6f 6e  HUP, termination
1150: 5f 68 61 6e 64 6c 65 72 29 20 3d 3d 20 53 49 47  _handler) == SIG
1160: 5f 49 47 4e 29 0a 20 20 20 20 73 69 67 6e 61 6c  _IGN).    signal
1170: 20 28 53 49 47 48 55 50 2c 20 53 49 47 5f 49 47   (SIGHUP, SIG_IG
1180: 4e 29 3b 0a 20 20 69 66 20 28 73 69 67 6e 61 6c  N);.  if (signal
1190: 20 28 53 49 47 54 45 52 4d 2c 20 74 65 72 6d 69   (SIGTERM, termi
11a0: 6e 61 74 69 6f 6e 5f 68 61 6e 64 6c 65 72 29 20  nation_handler) 
11b0: 3d 3d 20 53 49 47 5f 49 47 4e 29 0a 20 20 20 20  == SIG_IGN).    
11c0: 73 69 67 6e 61 6c 20 28 53 49 47 54 45 52 4d 2c  signal (SIGTERM,
11d0: 20 53 49 47 5f 49 47 4e 29 3b 0a 0a 20 20 69 66   SIG_IGN);..  if
11e0: 20 28 61 72 67 75 6d 65 6e 74 73 2e 6e 6f 5f 6c   (arguments.no_l
11f0: 6f 63 6b 29 0a 20 20 20 20 6d 6f 64 65 20 5e 3d  ock).    mode ^=
1200: 20 5a 44 42 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69   ZDB_NOLOCK;.  i
1210: 66 20 28 61 72 67 75 6d 65 6e 74 73 2e 6e 6f 5f  f (arguments.no_
1220: 6d 6d 61 70 29 0a 20 20 20 20 6d 6f 64 65 20 5e  mmap).    mode ^
1230: 3d 20 5a 44 42 5f 4e 4f 4d 4d 41 50 3b 0a 0a 20  = ZDB_NOMMAP;.. 
1240: 20 2f 2a 20 6f 70 65 6e 20 74 68 65 20 64 61 74   /* open the dat
1250: 61 62 61 73 65 20 2a 2f 0a 20 20 64 61 74 61 62  abase */.  datab
1260: 61 73 65 20 3d 20 7a 64 62 5f 6f 70 65 6e 20 28  ase = zdb_open (
1270: 61 72 67 75 6d 65 6e 74 73 2e 61 72 67 73 5b 30  arguments.args[0
1280: 5d 2c 20 6d 6f 64 65 2c 20 61 72 67 75 6d 65 6e  ], mode, argumen
1290: 74 73 2e 6d 6d 61 70 5f 73 69 7a 65 2c 0a 20 20  ts.mmap_size,.  
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 61 72 67 75 6d 65 6e 74 73 2e 63       arguments.c
12c0: 61 63 68 65 5f 73 69 7a 65 2c 20 61 72 67 75 6d  ache_size, argum
12d0: 65 6e 74 73 2e 62 6c 6f 63 6b 5f 73 69 7a 65 2c  ents.block_size,
12e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f0: 20 20 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74          argument
1300: 73 2e 76 65 72 62 6f 73 65 29 3b 0a 20 20 69 66  s.verbose);.  if
1310: 20 28 21 64 61 74 61 62 61 73 65 29 0a 20 20 20   (!database).   
1320: 20 65 72 72 6f 72 20 28 45 58 49 54 5f 46 41 49   error (EXIT_FAI
1330: 4c 55 52 45 2c 20 65 72 72 6e 6f 2c 0a 20 20 20  LURE, errno,.   
1340: 20 20 20 20 20 20 20 20 22 46 61 69 6c 65 64 20          "Failed 
1350: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
1360: 20 25 73 22 2c 20 61 72 67 75 6d 65 6e 74 73 2e   %s", arguments.
1370: 61 72 67 73 5b 30 5d 29 3b 0a 20 20 7a 64 62 5f  args[0]);.  zdb_
1380: 70 72 69 6e 74 5f 69 6e 66 6f 20 28 64 61 74 61  print_info (data
1390: 62 61 73 65 29 3b 0a 20 20 69 66 20 28 7a 64 62  base);.  if (zdb
13a0: 5f 63 6c 6f 73 65 20 28 64 61 74 61 62 61 73 65  _close (database
13b0: 2c 20 61 72 67 75 6d 65 6e 74 73 2e 76 65 72 62  , arguments.verb
13c0: 6f 73 65 29 20 21 3d 20 30 29 0a 20 20 20 20 65  ose) != 0).    e
13d0: 72 72 6f 72 20 28 45 58 49 54 5f 46 41 49 4c 55  rror (EXIT_FAILU
13e0: 52 45 2c 20 65 72 72 6e 6f 2c 0a 20 20 20 20 20  RE, errno,.     
13f0: 20 20 20 20 20 20 22 46 61 69 6c 65 64 20 74 6f        "Failed to
1400: 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20   close database 
1410: 25 73 22 2c 20 61 72 67 75 6d 65 6e 74 73 2e 61  %s", arguments.a
1420: 72 67 73 5b 30 5d 29 3b 0a 20 20 65 78 69 74 20  rgs[0]);.  exit 
1430: 28 45 58 49 54 5f 53 55 43 43 45 53 53 29 3b 0a  (EXIT_SUCCESS);.
1440: 7d 0a                                            }.