Hex Artifact Content

Artifact 129d0415abeb575a1f985b1857f183672cba30a8:


0000: 0a 2f 2a 20 43 6f 70 79 72 69 67 68 74 20 32 30  ./* Copyright 20
0010: 30 34 2d 32 30 31 31 20 52 75 73 73 65 6c 6c 20  04-2011 Russell 
0020: 4d 69 6c 6c 65 72 0a 20 20 20 20 54 68 69 73 20  Miller.    This 
0030: 70 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65 20  program is free 
0040: 73 6f 66 74 77 61 72 65 3b 20 79 6f 75 20 63 61  software; you ca
0050: 6e 20 72 65 64 69 73 74 72 69 62 75 74 65 20 69  n redistribute i
0060: 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 0a  t and/or modify.
0070: 20 20 20 20 69 74 20 75 6e 64 65 72 20 74 68 65      it under the
0080: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 47 4e   terms of the GN
0090: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
00a0: 20 4c 69 63 65 6e 73 65 20 61 73 20 70 75 62 6c   License as publ
00b0: 69 73 68 65 64 20 62 79 0a 20 20 20 20 74 68 65  ished by.    the
00c0: 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46   Free Software F
00d0: 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74 68 65  oundation; eithe
00e0: 72 20 76 65 72 73 69 6f 6e 20 32 20 6f 66 20 74  r version 2 of t
00f0: 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f 72 0a 20  he License, or. 
0100: 20 20 20 28 61 74 20 79 6f 75 72 20 6f 70 74 69     (at your opti
0110: 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65  on) any later ve
0120: 72 73 69 6f 6e 2e 0a 0a 20 20 20 20 54 68 69 73  rsion...    This
0130: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0140: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0150: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0160: 20 62 65 20 75 73 65 66 75 6c 2c 0a 20 20 20 20   be useful,.    
0170: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0180: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0190: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
01a0: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 20  ed warranty of. 
01b0: 20 20 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49     MERCHANTABILI
01c0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
01d0: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
01e0: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
01f0: 0a 20 20 20 20 47 4e 55 20 47 65 6e 65 72 61 6c  .    GNU General
0200: 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20   Public License 
0210: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73  for more details
0220: 2e 0a 0a 20 20 20 20 59 6f 75 20 73 68 6f 75 6c  ...    You shoul
0230: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0240: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0250: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0260: 20 4c 69 63 65 6e 73 65 0a 20 20 20 20 61 6c 6f   License.    alo
0270: 6e 67 20 77 69 74 68 20 74 68 69 73 20 70 72 6f  ng with this pro
0280: 67 72 61 6d 3b 20 69 66 20 6e 6f 74 2c 20 77 72  gram; if not, wr
0290: 69 74 65 20 74 6f 20 74 68 65 20 46 72 65 65 20  ite to the Free 
02a0: 53 6f 66 74 77 61 72 65 0a 20 20 20 20 46 6f 75  Software.    Fou
02b0: 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35  ndation, Inc., 5
02c0: 39 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 2c 20  9 Temple Place, 
02d0: 53 75 69 74 65 20 33 33 30 2c 20 42 6f 73 74 6f  Suite 330, Bosto
02e0: 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 33 30  n, MA  02111-130
02f0: 37 20 20 55 53 41 0a 2a 2f 0a 0a 23 69 6e 63 6c  7  USA.*/..#incl
0300: 75 64 65 20 22 70 61 63 6b 65 74 62 6c 2e 68 22  ude "packetbl.h"
0310: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 4f 50 53 49 53  ../*. * SYNOPSIS
0320: 3a 0a 20 2a 20 20 20 76 6f 69 64 20 64 61 65 6d  :. *   void daem
0330: 6f 6e 69 7a 65 28 76 6f 69 64 29 3b 0a 20 2a 0a  onize(void);. *.
0340: 20 2a 20 4e 4f 54 45 53 3a 0a 20 2a 20 20 20 54   * NOTES:. *   T
0350: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 63 63  his function acc
0360: 6f 6d 70 6c 69 73 68 65 73 20 65 76 65 72 79 74  omplishes everyt
0370: 68 69 6e 67 20 6e 65 65 64 65 64 20 74 6f 20 62  hing needed to b
0380: 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 2e 0a  ecome a daemon..
0390: 20 2a 20 20 20 49 6e 63 6c 75 64 69 6e 67 20 63   *   Including c
03a0: 6c 6f 73 69 6e 67 20 73 74 61 6e 64 61 72 64 20  losing standard 
03b0: 69 6e 2f 6f 75 74 2f 65 72 72 20 61 6e 64 20 66  in/out/err and f
03c0: 6f 72 6b 69 6e 67 2e 0a 20 2a 20 20 20 49 74 20  orking.. *   It 
03d0: 72 65 74 75 72 6e 73 20 6e 6f 74 68 69 6e 67 2c  returns nothing,
03e0: 20 6f 6e 20 66 61 69 6c 75 72 65 20 74 68 65 20   on failure the 
03f0: 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 61 62 6f  program must abo
0400: 72 74 2e 0a 20 2a 0a 20 2a 2f 0a 76 6f 69 64 20  rt.. *. */.void 
0410: 64 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29 20  daemonize(void) 
0420: 7b 0a 0a 09 70 69 64 5f 74 20 70 69 64 3b 0a 0a  {...pid_t pid;..
0430: 09 63 68 64 69 72 28 22 2f 22 29 3b 0a 0a 09 63  .chdir("/");...c
0440: 6c 6f 73 65 28 53 54 44 49 4e 5f 46 49 4c 45 4e  lose(STDIN_FILEN
0450: 4f 29 3b 0a 09 63 6c 6f 73 65 28 53 54 44 4f 55  O);..close(STDOU
0460: 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09 63 6c 6f 73  T_FILENO);..clos
0470: 65 28 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f 29  e(STDERR_FILENO)
0480: 3b 0a 0a 09 73 65 74 73 69 64 28 29 3b 0a 0a 09  ;...setsid();...
0490: 70 69 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 0a 09  pid = fork();...
04a0: 69 66 20 28 70 69 64 20 3e 20 30 29 20 7b 0a 09  if (pid > 0) {..
04b0: 09 65 78 69 74 28 45 58 49 54 5f 53 55 43 43 45  .exit(EXIT_SUCCE
04c0: 53 53 29 3b 0a 09 7d 0a 09 69 66 20 28 70 69 64  SS);..}..if (pid
04d0: 20 3c 20 30 29 20 7b 0a 09 09 44 50 52 49 4e 54   < 0) {...DPRINT
04e0: 28 22 46 6f 72 6b 20 66 61 69 6c 65 64 20 77 68  ("Fork failed wh
04f0: 69 6c 65 20 64 61 6d 6f 6e 69 7a 69 6e 67 3a 20  ile damonizing: 
0500: 25 73 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72  %s", strerror(er
0510: 72 6e 6f 29 29 3b 0a 09 09 65 78 69 74 28 45 58  rno));...exit(EX
0520: 49 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09 7d 0a  IT_FAILURE);..}.
0530: 0a 7d 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 43  .}..#ifdef USE_C
0540: 41 43 48 45 0a 2f 2a 0a 20 2a 20 53 59 4e 4f 50  ACHE./*. * SYNOP
0550: 53 49 53 3a 0a 20 2a 20 20 20 73 74 61 74 69 63  SIS:. *   static
0560: 20 75 69 6e 74 33 32 5f 74 20 70 61 63 6b 65 74   uint32_t packet
0570: 5f 63 61 63 68 65 5f 68 61 73 68 28 0a 20 2a 20  _cache_hash(. * 
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05a0: 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
05b0: 20 70 61 63 6b 65 74 5f 69 6e 66 6f 20 69 70 0a   packet_info ip.
05c0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
05d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05e0: 20 20 20 20 20 20 29 3b 0a 20 2a 0a 20 2a 20 41        );. *. * A
05f0: 52 47 55 4d 45 4e 54 53 3a 0a 20 2a 20 20 20 73  RGUMENTS:. *   s
0600: 74 72 75 63 74 20 70 61 63 6b 65 74 5f 69 6e 66  truct packet_inf
0610: 6f 20 69 70 20 20 20 20 20 20 20 20 53 74 72 75  o ip        Stru
0620: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
0630: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0640: 75 74 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  ut the. *       
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 20 20 20 20 49 50 20 61 64 64 72           IP addr
0670: 65 73 73 20 74 6f 20 63 72 65 61 74 65 20 74 68  ess to create th
0680: 65 20 68 61 73 68 2e 0a 20 2a 0a 20 2a 20 52 45  e hash.. *. * RE
0690: 54 55 52 4e 20 56 41 4c 55 45 3a 0a 20 2a 20 20  TURN VALUE:. *  
06a0: 20 41 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72   An integer repr
06b0: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 68 61 73  esenting the has
06c0: 68 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  h value is retur
06d0: 6e 65 64 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ned.  This value
06e0: 20 2a 4d 41 59 20 42 45 2a 0a 20 2a 20 20 20 67   *MAY BE*. *   g
06f0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
0700: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 61 73 68  size of the hash
0710: 20 74 61 62 6c 65 2c 20 73 6f 20 69 74 20 73 68   table, so it sh
0720: 6f 75 6c 64 20 62 65 20 63 68 65 63 6b 65 64 20  ould be checked 
0730: 62 65 66 6f 72 65 0a 20 2a 20 20 20 75 73 65 2e  before. *   use.
0740: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 3a 0a 20 2a  . *. * NOTES:. *
0750: 0a 20 2a 20 43 55 52 52 45 4e 54 20 49 4d 50 4c  . * CURRENT IMPL
0760: 45 4d 45 4e 54 41 54 49 4f 4e 20 4e 4f 54 45 53  EMENTATION NOTES
0770: 20 28 64 6f 20 6e 6f 74 20 72 65 6c 79 20 6f 6e   (do not rely on
0780: 20 74 68 69 73 20 66 6f 72 20 64 65 73 69 67 6e   this for design
0790: 29 3a 0a 20 2a 20 20 20 43 75 72 72 65 6e 74 6c  ):. *   Currentl
07a0: 79 2c 20 6f 6e 6c 79 20 74 68 65 20 49 50 20 70  y, only the IP p
07b0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  ortion of the st
07c0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
07d0: 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
07e0: 65 0a 20 2a 20 20 20 68 61 73 68 2e 0a 20 2a 20  e. *   hash.. * 
07f0: 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d    The current im
0800: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 69 6c  plementation wil
0810: 6c 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 61  l never return a
0820: 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 20 74   value greater t
0830: 68 61 6e 20 32 31 36 37 35 0a 20 2a 20 20 20 73  han 21675. *   s
0840: 6f 20 68 61 76 69 6e 67 20 61 20 68 61 73 68 20  o having a hash 
0850: 74 61 62 6c 65 20 6c 61 72 67 65 72 20 74 68 61  table larger tha
0860: 6e 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20  n that would be 
0870: 77 61 73 74 65 66 75 6c 2e 0a 20 2a 0a 20 2a 2f  wasteful.. *. */
0880: 0a 73 74 61 74 69 63 20 75 69 6e 74 33 32 5f 74  .static uint32_t
0890: 20 70 61 63 6b 65 74 5f 63 61 63 68 65 5f 68 61   packet_cache_ha
08a0: 73 68 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20  sh(const struct 
08b0: 70 61 63 6b 65 74 5f 69 6e 66 6f 20 69 70 29 20  packet_info ip) 
08c0: 7b 0a 09 75 69 6e 74 33 32 5f 74 20 68 61 73 68  {..uint32_t hash
08d0: 20 3d 20 30 3b 0a 0a 09 68 61 73 68 20 3d 20 69   = 0;...hash = i
08e0: 70 2e 62 31 20 3c 3c 20 36 3b 0a 09 68 61 73 68  p.b1 << 6;..hash
08f0: 20 2b 3d 20 69 70 2e 62 32 20 3c 3c 20 34 3b 0a   += ip.b2 << 4;.
0900: 09 68 61 73 68 20 2b 3d 20 69 70 2e 62 33 20 3c  .hash += ip.b3 <
0910: 3c 20 32 3b 0a 09 68 61 73 68 20 2b 3d 20 69 70  < 2;..hash += ip
0920: 2e 62 34 3b 0a 09 72 65 74 75 72 6e 20 68 61 73  .b4;..return has
0930: 68 3b 0a 7d 0a 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  h;.}.../*. * SYN
0940: 4f 50 53 49 53 3a 0a 20 2a 20 20 20 76 6f 69 64  OPSIS:. *   void
0950: 20 70 61 63 6b 65 74 5f 63 61 63 68 65 5f 63 6c   packet_cache_cl
0960: 65 61 72 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  ear(void);. *. *
0970: 20 41 52 47 55 4d 45 4e 54 53 3a 0a 20 2a 20 20   ARGUMENTS:. *  
0980: 20 28 6e 6f 6e 65 29 0a 20 2a 0a 20 2a 20 52 45   (none). *. * RE
0990: 54 55 52 4e 20 56 41 4c 55 45 3a 0a 20 2a 20 20  TURN VALUE:. *  
09a0: 20 28 6e 6f 6e 65 29 0a 20 2a 0a 20 2a 20 4e 4f   (none). *. * NO
09b0: 54 45 53 3a 0a 20 2a 20 20 20 54 68 69 73 20 66  TES:. *   This f
09c0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 75 63  unction must suc
09d0: 63 65 65 64 20 65 76 65 6e 20 69 66 20 22 70 61  ceed even if "pa
09e0: 63 6b 65 74 5f 63 61 63 68 65 22 20 69 73 20 4e  cket_cache" is N
09f0: 55 4c 4c 2e 0a 20 2a 20 20 20 54 68 69 73 20 66  ULL.. *   This f
0a00: 75 6e 63 74 69 6f 6e 20 69 6e 69 74 69 61 6c 69  unction initiali
0a10: 7a 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69  zes the values i
0a20: 6e 73 69 64 65 20 74 68 65 20 70 72 65 76 69 6f  nside the previo
0a30: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a 20  usly allocated. 
0a40: 2a 20 20 20 22 70 61 63 6b 65 74 5f 63 61 63 68  *   "packet_cach
0a50: 65 22 20 61 72 72 61 79 20 74 6f 20 73 61 66 65  e" array to safe
0a60: 20 76 61 6c 75 65 73 20 73 6f 20 74 68 61 74 20   values so that 
0a70: 77 65 20 6d 61 79 20 63 68 65 63 6b 20 65 6e 74  we may check ent
0a80: 72 69 65 73 0a 20 2a 20 20 20 73 61 66 65 6c 79  ries. *   safely
0a90: 2e 0a 20 2a 0a 20 2a 2f 0a 76 6f 69 64 20 70 61  .. *. */.void pa
0aa0: 63 6b 65 74 5f 63 61 63 68 65 5f 63 6c 65 61 72  cket_cache_clear
0ab0: 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32  (void) {..uint32
0ac0: 5f 74 20 69 3b 0a 0a 09 69 66 20 28 70 61 63 6b  _t i;...if (pack
0ad0: 65 74 5f 63 61 63 68 65 3d 3d 4e 55 4c 4c 29 20  et_cache==NULL) 
0ae0: 72 65 74 75 72 6e 3b 0a 0a 09 66 6f 72 20 28 69  return;...for (i
0af0: 3d 30 3b 20 69 3c 70 61 63 6b 65 74 5f 63 61 63  =0; i<packet_cac
0b00: 68 65 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09  he_len; i++) {..
0b10: 09 70 61 63 6b 65 74 5f 63 61 63 68 65 5b 69 5d  .packet_cache[i]
0b20: 2e 69 70 61 64 64 72 20 3d 20 30 3b 0a 09 09 70  .ipaddr = 0;...p
0b30: 61 63 6b 65 74 5f 63 61 63 68 65 5b 69 5d 2e 61  acket_cache[i].a
0b40: 63 74 69 6f 6e 20 3d 20 4e 46 5f 41 43 43 45 50  ction = NF_ACCEP
0b50: 54 3b 0a 09 09 70 61 63 6b 65 74 5f 63 61 63 68  T;...packet_cach
0b60: 65 5b 69 5d 2e 65 78 70 69 72 65 73 20 3d 20 30  e[i].expires = 0
0b70: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
0b80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 53  .#endif../*. * S
0b90: 59 4e 4f 50 53 49 53 3a 0a 20 2a 20 20 20 73 74  YNOPSIS:. *   st
0ba0: 61 74 69 63 20 75 69 6e 74 33 32 5f 74 20 70 61  atic uint32_t pa
0bb0: 63 6b 65 74 5f 69 6e 66 6f 5f 74 6f 5f 69 70 28  cket_info_to_ip(
0bc0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74          const st
0bf0: 72 75 63 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f  ruct packet_info
0c00: 20 69 70 0a 20 2a 20 20 20 20 20 20 20 20 20 20   ip. *          
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 2a 0a            );. *.
0c30: 20 2a 20 41 52 47 55 4d 45 4e 54 53 3a 0a 20 2a   * ARGUMENTS:. *
0c40: 20 20 20 73 74 72 75 63 74 20 70 61 63 6b 65 74     struct packet
0c50: 5f 69 6e 66 6f 20 69 70 20 20 20 20 20 20 20 20  _info ip        
0c60: 53 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  Structure contai
0c70: 6e 69 6e 67 20 49 50 20 66 69 65 6c 64 73 20 74  ning IP fields t
0c80: 6f 20 63 6f 6e 76 65 72 74 20 74 6f 0a 20 2a 20  o convert to. * 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0cb0: 20 33 32 62 69 74 20 75 6e 73 69 67 6e 65 64 20   32bit unsigned 
0cc0: 69 6e 74 65 67 65 72 2e 0a 20 2a 0a 20 2a 20 52  integer.. *. * R
0cd0: 45 54 55 52 4e 20 56 41 4c 55 45 3a 0a 20 2a 20  ETURN VALUE:. * 
0ce0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
0cf0: 72 65 74 75 72 6e 73 20 61 20 33 32 62 69 74 20  returns a 32bit 
0d00: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
0d10: 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
0d20: 20 61 0a 20 2a 20 20 20 22 6f 6e 65 2d 74 6f 2d   a. *   "one-to-
0d30: 6f 6e 65 22 20 6d 61 70 70 69 6e 67 20 6f 66 20  one" mapping of 
0d40: 49 50 20 6f 63 74 65 74 73 20 61 6e 64 20 69 6e  IP octets and in
0d50: 74 65 67 65 72 20 61 64 64 72 65 73 73 65 73 2c  teger addresses,
0d60: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20   it will not. * 
0d70: 20 20 6f 76 65 72 6c 61 70 2c 20 74 68 65 72 65    overlap, there
0d80: 66 6f 72 65 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  fore.. *. * NOTE
0d90: 53 3a 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  S:. *. */.static
0da0: 20 75 69 6e 74 33 32 5f 74 20 70 61 63 6b 65 74   uint32_t packet
0db0: 5f 69 6e 66 6f 5f 74 6f 5f 69 70 28 63 6f 6e 73  _info_to_ip(cons
0dc0: 74 20 73 74 72 75 63 74 20 70 61 63 6b 65 74 5f  t struct packet_
0dd0: 69 6e 66 6f 20 69 70 29 20 7b 0a 09 72 65 74 75  info ip) {..retu
0de0: 72 6e 20 28 28 69 70 2e 62 31 20 26 20 30 78 66  rn ((ip.b1 & 0xf
0df0: 66 29 20 3c 3c 20 32 34 29 20 7c 20 0a 09 09 28  f) << 24) | ...(
0e00: 28 69 70 2e 62 32 20 26 20 30 78 66 66 29 20 3c  (ip.b2 & 0xff) <
0e10: 3c 20 31 36 29 20 7c 20 0a 09 09 28 28 69 70 2e  < 16) | ...((ip.
0e20: 62 33 20 26 20 30 78 66 66 29 20 3c 3c 20 38 29  b3 & 0xff) << 8)
0e30: 20 7c 20 0a 09 09 28 69 70 2e 62 34 20 26 20 30   | ...(ip.b4 & 0
0e40: 78 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  xff);.}../*. * S
0e50: 59 4e 4f 50 53 49 53 3a 0a 20 2a 20 20 20 69 6e  YNOPSIS:. *   in
0e60: 74 20 70 61 63 6b 65 74 5f 63 68 65 63 6b 5f 69  t packet_check_i
0e70: 70 28 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  p(. *           
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
0e90: 74 20 73 74 72 75 63 74 20 70 61 63 6b 65 74 5f  t struct packet_
0ea0: 69 6e 66 6f 20 69 70 0a 20 2a 20 20 20 20 20 20  info ip. *      
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
0ed0: 54 53 3a 0a 20 2a 20 20 20 73 74 72 75 63 74 20  TS:. *   struct 
0ee0: 70 61 63 6b 65 74 5f 69 6e 66 6f 20 69 70 20 20  packet_info ip  
0ef0: 20 20 20 20 20 20 53 74 72 75 63 74 75 72 65 20        Structure 
0f00: 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e 66 6f 72  containing infor
0f10: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 20 2a 20  mation about. * 
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0f40: 61 63 6b 65 74 20 74 6f 20 63 68 65 63 6b 2e 0a  acket to check..
0f50: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
0f60: 55 45 3a 0a 20 2a 20 20 20 22 70 61 63 6b 65 74  UE:. *   "packet
0f70: 5f 63 68 65 63 6b 5f 69 70 22 20 72 65 74 75 72  _check_ip" retur
0f80: 6e 73 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20  ns an action to 
0f90: 73 75 70 70 6c 79 20 74 6f 20 22 70 62 6c 5f 73  supply to "pbl_s
0fa0: 65 74 5f 76 65 72 64 69 63 74 22 2e 0a 20 2a 20  et_verdict".. * 
0fb0: 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 69 74 20    Currently, it 
0fc0: 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6f 66 20 4e  will be one of N
0fd0: 46 5f 44 52 4f 50 20 6f 72 20 4e 46 5f 41 43 43  F_DROP or NF_ACC
0fe0: 45 50 54 20 62 75 74 20 6f 74 68 65 72 20 76 61  EPT but other va
0ff0: 6c 75 65 73 20 73 68 6f 75 6c 64 0a 20 2a 20 20  lues should. *  
1000: 20 62 65 20 61 63 63 6f 75 6e 74 65 64 20 66 6f   be accounted fo
1010: 72 2e 20 20 54 68 65 20 73 75 70 70 6c 69 65 64  r.  The supplied
1020: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1030: 63 68 65 63 6b 65 64 20 61 67 61 69 6e 73 74 20  checked against 
1040: 74 68 65 0a 20 2a 20 20 20 63 6f 6e 66 69 67 75  the. *   configu
1050: 65 64 20 44 4e 53 20 52 42 4c 73 20 61 6e 64 20  ed DNS RBLs and 
1060: 57 68 69 74 65 6c 69 73 74 73 20 74 6f 20 64 65  Whitelists to de
1070: 74 65 72 6d 69 6e 65 20 74 68 65 20 61 70 70 72  termine the appr
1080: 6f 70 72 69 61 74 65 20 61 63 74 69 6f 6e 2e 0a  opriate action..
1090: 20 2a 0a 20 2a 20 4e 4f 54 45 53 3a 0a 20 2a 20   *. * NOTES:. * 
10a0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
10b0: 6d 61 79 20 72 65 74 75 72 6e 20 73 74 61 6c 65  may return stale
10c0: 20 65 6e 74 72 69 65 73 20 64 75 65 20 74 6f 20   entries due to 
10d0: 63 61 63 68 69 6e 67 2e 0a 20 2a 20 20 20 54 68  caching.. *   Th
10e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 4d 55 53 54  is function MUST
10f0: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 77 6f 72   continue to wor
1100: 6b 20 69 66 20 22 70 61 63 6b 65 74 5f 63 61 63  k if "packet_cac
1110: 68 65 22 20 69 73 20 4e 55 4c 4c 2e 0a 20 2a 0a  he" is NULL.. *.
1120: 20 2a 2f 0a 69 6e 74 20 70 61 63 6b 65 74 5f 63   */.int packet_c
1130: 68 65 63 6b 5f 69 70 28 63 6f 6e 73 74 20 73 74  heck_ip(const st
1140: 72 75 63 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f  ruct packet_info
1150: 20 69 70 29 20 7b 0a 09 69 6e 74 20 72 65 74 76   ip) {..int retv
1160: 61 6c 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f  al;..#ifdef USE_
1170: 43 41 43 48 45 0a 09 75 69 6e 74 33 32 5f 74 20  CACHE..uint32_t 
1180: 69 70 61 64 64 72 5f 63 68 65 63 6b 3b 0a 09 75  ipaddr_check;..u
1190: 69 6e 74 33 32 5f 74 20 63 61 63 68 65 5f 68 61  int32_t cache_ha
11a0: 73 68 20 3d 20 30 3b 0a 09 74 69 6d 65 5f 74 20  sh = 0;..time_t 
11b0: 63 75 72 72 74 69 6d 65 3b 0a 09 63 68 61 72 20  currtime;..char 
11c0: 2a 61 63 74 69 6f 6e 73 74 72 20 3d 20 4e 55 4c  *actionstr = NUL
11d0: 4c 2c 20 2a 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a  L, *buf = NULL;.
11e0: 0a 09 63 75 72 72 74 69 6d 65 20 3d 20 74 69 6d  ..currtime = tim
11f0: 65 28 4e 55 4c 4c 29 3b 0a 0a 09 69 70 61 64 64  e(NULL);...ipadd
1200: 72 5f 63 68 65 63 6b 20 3d 20 70 61 63 6b 65 74  r_check = packet
1210: 5f 69 6e 66 6f 5f 74 6f 5f 69 70 28 69 70 29 3b  _info_to_ip(ip);
1220: 0a 09 69 66 20 28 70 61 63 6b 65 74 5f 63 61 63  ..if (packet_cac
1230: 68 65 5f 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09  he_len > 0) {...
1240: 63 61 63 68 65 5f 68 61 73 68 20 3d 20 70 61 63  cache_hash = pac
1250: 6b 65 74 5f 63 61 63 68 65 5f 68 61 73 68 28 69  ket_cache_hash(i
1260: 70 29 20 25 20 70 61 63 6b 65 74 5f 63 61 63 68  p) % packet_cach
1270: 65 5f 6c 65 6e 3b 0a 09 7d 0a 09 62 75 66 20 3d  e_len;..}..buf =
1280: 20 67 65 74 5f 69 70 5f 73 74 72 69 6e 67 28 26   get_ip_string(&
1290: 69 70 29 3b 0a 09 69 66 20 28 70 61 63 6b 65 74  ip);..if (packet
12a0: 5f 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 20  _cache != NULL) 
12b0: 7b 0a 09 09 69 66 20 28 70 61 63 6b 65 74 5f 63  {...if (packet_c
12c0: 61 63 68 65 5b 63 61 63 68 65 5f 68 61 73 68 5d  ache[cache_hash]
12d0: 2e 69 70 61 64 64 72 3d 3d 69 70 61 64 64 72 5f  .ipaddr==ipaddr_
12e0: 63 68 65 63 6b 20 0a 09 09 09 09 26 26 20 70 61  check .....&& pa
12f0: 63 6b 65 74 5f 63 61 63 68 65 5b 63 61 63 68 65  cket_cache[cache
1300: 5f 68 61 73 68 5d 2e 65 78 70 69 72 65 73 3e 63  _hash].expires>c
1310: 75 72 72 74 69 6d 65 29 20 7b 0a 09 09 09 72 65  urrtime) {....re
1320: 74 76 61 6c 20 3d 20 70 61 63 6b 65 74 5f 63 61  tval = packet_ca
1330: 63 68 65 5b 63 61 63 68 65 5f 68 61 73 68 5d 2e  che[cache_hash].
1340: 61 63 74 69 6f 6e 3b 0a 09 09 09 73 77 69 74 63  action;....switc
1350: 68 20 28 72 65 74 76 61 6c 29 20 7b 0a 09 09 09  h (retval) {....
1360: 09 63 61 73 65 20 4e 46 5f 44 52 4f 50 3a 0a 09  .case NF_DROP:..
1370: 09 09 09 09 61 63 74 69 6f 6e 73 74 72 3d 22 72  ....actionstr="r
1380: 65 6a 65 63 74 22 3b 0a 09 09 09 09 09 73 74 61  eject";......sta
1390: 74 69 73 74 69 63 73 2e 63 61 63 68 65 72 65 6a  tistics.cacherej
13a0: 65 63 74 2b 2b 3b 0a 09 09 09 09 09 62 72 65 61  ect++;......brea
13b0: 6b 3b 0a 09 09 09 09 63 61 73 65 20 4e 46 5f 41  k;.....case NF_A
13c0: 43 43 45 50 54 3a 0a 09 09 09 09 09 61 63 74 69  CCEPT:......acti
13d0: 6f 6e 73 74 72 3d 22 61 63 63 65 70 74 22 3b 0a  onstr="accept";.
13e0: 09 09 09 09 09 73 74 61 74 69 73 74 69 63 73 2e  .....statistics.
13f0: 63 61 63 68 65 61 63 63 65 70 74 2b 2b 3b 0a 09  cacheaccept++;..
1400: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 64  ....break;.....d
1410: 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 61 63 74  efault:......act
1420: 69 6f 6e 73 74 72 3d 22 3f 3f 3f 22 3b 0a 09 09  ionstr="???";...
1430: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
1440: 09 09 44 50 52 49 4e 54 51 28 22 5b 46 6f 75 6e  ..DPRINTQ("[Foun
1450: 64 20 69 6e 20 63 61 63 68 65 20 28 25 73 29 5d  d in cache (%s)]
1460: 20 5b 25 73 5d 22 2c 0a 09 09 09 09 09 61 63 74   [%s]",......act
1470: 69 6f 6e 73 74 72 2c 20 62 75 66 29 3b 0a 09 09  ionstr, buf);...
1480: 09 66 72 65 65 28 62 75 66 29 3b 0a 09 09 09 72  .free(buf);....r
1490: 65 74 75 72 6e 20 72 65 74 76 61 6c 3b 0a 09 09  eturn retval;...
14a0: 7d 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 6e 74 20  }..}.#else..int 
14b0: 72 76 3b 0a 09 63 68 61 72 20 2a 62 75 66 3b 0a  rv;..char *buf;.
14c0: 0a 09 62 75 66 20 3d 20 67 65 74 5f 69 70 5f 73  ..buf = get_ip_s
14d0: 74 72 69 6e 67 28 26 69 70 29 3b 0a 23 65 6e 64  tring(&ip);.#end
14e0: 69 66 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  if...if (retval 
14f0: 3d 20 63 68 65 63 6b 5f 70 61 63 6b 65 74 5f 6c  = check_packet_l
1500: 69 73 74 28 26 69 70 2c 20 63 6f 6e 66 2e 77 68  ist(&ip, conf.wh
1510: 69 74 65 6c 69 73 74 29 20 3e 20 30 29 20 7b 0a  itelist) > 0) {.
1520: 09 09 44 50 52 49 4e 54 51 28 22 5b 61 63 63 65  ..DPRINTQ("[acce
1530: 70 74 20 77 68 69 74 65 6c 69 73 74 5d 20 5b 25  pt whitelist] [%
1540: 73 5d 20 5b 25 64 5d 5c 6e 22 2c 20 62 75 66 2c  s] [%d]\n", buf,
1550: 20 72 65 74 76 61 6c 29 3b 0a 09 09 73 74 61 74   retval);...stat
1560: 69 73 74 69 63 73 2e 77 68 69 74 65 6c 69 73 74  istics.whitelist
1570: 68 69 74 73 2b 2b 3b 0a 09 09 72 65 74 76 61 6c  hits++;...retval
1580: 3d 4e 46 5f 41 43 43 45 50 54 3b 0a 09 7d 20 65  =NF_ACCEPT;..} e
1590: 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d  lse if (retval =
15a0: 20 63 68 65 63 6b 5f 70 61 63 6b 65 74 5f 6c 69   check_packet_li
15b0: 73 74 28 26 69 70 2c 20 63 6f 6e 66 2e 62 6c 61  st(&ip, conf.bla
15c0: 63 6b 6c 69 73 74 29 20 3e 20 30 29 20 7b 0a 09  cklist) > 0) {..
15d0: 09 44 50 52 49 4e 54 51 28 22 5b 72 65 6a 65 63  .DPRINTQ("[rejec
15e0: 74 20 62 6c 61 63 6b 6c 69 73 74 5d 20 5b 25 73  t blacklist] [%s
15f0: 5d 20 5b 25 64 5d 5c 6e 22 2c 20 62 75 66 2c 20  ] [%d]\n", buf, 
1600: 72 65 74 76 61 6c 29 3b 0a 09 09 73 74 61 74 69  retval);...stati
1610: 73 74 69 63 73 2e 62 6c 61 63 6b 6c 69 73 74 68  stics.blacklisth
1620: 69 74 73 2b 2b 3b 0a 09 09 72 65 74 76 61 6c 3d  its++;...retval=
1630: 4e 46 5f 44 52 4f 50 3b 0a 09 7d 20 65 6c 73 65  NF_DROP;..} else
1640: 20 69 66 20 28 72 65 74 76 61 6c 20 3d 20 63 68   if (retval = ch
1650: 65 63 6b 5f 70 61 63 6b 65 74 5f 64 6e 73 62 6c  eck_packet_dnsbl
1660: 28 26 69 70 2c 20 63 6f 6e 66 2e 77 68 69 74 65  (&ip, conf.white
1670: 6c 69 73 74 62 6c 29 20 3e 20 30 29 20 7b 0a 09  listbl) > 0) {..
1680: 09 44 50 52 49 4e 54 51 28 22 5b 61 63 63 65 70  .DPRINTQ("[accep
1690: 74 20 64 6e 73 62 6c 5d 20 5b 25 73 5d 20 5b 25  t dnsbl] [%s] [%
16a0: 64 5d 22 2c 20 62 75 66 2c 20 72 65 74 76 61 6c  d]", buf, retval
16b0: 29 3b 0a 09 09 73 74 61 74 69 73 74 69 63 73 2e  );...statistics.
16c0: 77 68 69 74 65 6c 69 73 74 62 6c 68 69 74 73 2b  whitelistblhits+
16d0: 2b 3b 0a 09 09 72 65 74 76 61 6c 3d 4e 46 5f 41  +;...retval=NF_A
16e0: 43 43 45 50 54 3b 0a 09 7d 20 65 6c 73 65 20 69  CCEPT;..} else i
16f0: 66 20 28 72 65 74 76 61 6c 20 3d 20 63 68 65 63  f (retval = chec
1700: 6b 5f 70 61 63 6b 65 74 5f 64 6e 73 62 6c 28 26  k_packet_dnsbl(&
1710: 69 70 2c 20 63 6f 6e 66 2e 62 6c 61 63 6b 6c 69  ip, conf.blackli
1720: 73 74 62 6c 29 20 3e 20 30 29 20 7b 0a 09 09 44  stbl) > 0) {...D
1730: 50 52 49 4e 54 51 28 22 5b 72 65 6a 65 63 74 20  PRINTQ("[reject 
1740: 64 6e 73 62 6c 5d 20 5b 25 73 5d 20 5b 25 64 5d  dnsbl] [%s] [%d]
1750: 22 2c 20 62 75 66 2c 20 72 65 74 76 61 6c 29 3b  ", buf, retval);
1760: 0a 09 09 73 74 61 74 69 73 74 69 63 73 2e 62 6c  ...statistics.bl
1770: 61 63 6b 6c 69 73 74 62 6c 68 69 74 73 2b 2b 3b  acklistblhits++;
1780: 0a 09 09 72 65 74 76 61 6c 3d 4e 46 5f 44 52 4f  ...retval=NF_DRO
1790: 50 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  P;..} else {...i
17a0: 66 20 28 63 6f 6e 66 2e 64 65 66 61 75 6c 74 5f  f (conf.default_
17b0: 61 63 63 65 70 74 20 3d 3d 20 31 29 20 7b 0a 09  accept == 1) {..
17c0: 09 09 44 50 52 49 4e 54 51 28 22 5b 61 63 63 65  ..DPRINTQ("[acce
17d0: 70 74 20 66 61 6c 6c 74 68 72 6f 75 67 68 5d 20  pt fallthrough] 
17e0: 5b 25 73 5d 22 2c 20 62 75 66 29 3b 0a 09 09 09  [%s]", buf);....
17f0: 72 65 74 76 61 6c 3d 4e 46 5f 41 43 43 45 50 54  retval=NF_ACCEPT
1800: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1810: 44 50 52 49 4e 54 51 28 22 5b 72 65 6a 65 63 74  DPRINTQ("[reject
1820: 20 66 61 6c 6c 74 68 72 6f 75 67 68 5d 20 5b 25   fallthrough] [%
1830: 73 5d 22 2c 20 62 75 66 29 3b 0a 09 09 09 72 65  s]", buf);....re
1840: 74 76 61 6c 3d 4e 46 5f 44 52 4f 50 3b 0a 09 09  tval=NF_DROP;...
1850: 7d 0a 09 09 73 74 61 74 69 73 74 69 63 73 2e 66  }...statistics.f
1860: 61 6c 6c 74 68 72 6f 75 67 68 68 69 74 73 2b 2b  allthroughhits++
1870: 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 55 53 45  ;..}..#ifdef USE
1880: 5f 43 41 43 48 45 0a 09 2f 2a 20 50 75 74 20 63  _CACHE../* Put c
1890: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 69 6e  urrent action in
18a0: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 2a 2f  to the cache. */
18b0: 0a 09 69 66 20 28 70 61 63 6b 65 74 5f 63 61 63  ..if (packet_cac
18c0: 68 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  he != NULL) {...
18d0: 70 61 63 6b 65 74 5f 63 61 63 68 65 5b 63 61 63  packet_cache[cac
18e0: 68 65 5f 68 61 73 68 5d 2e 69 70 61 64 64 72 20  he_hash].ipaddr 
18f0: 3d 20 69 70 61 64 64 72 5f 63 68 65 63 6b 3b 0a  = ipaddr_check;.
1900: 09 09 70 61 63 6b 65 74 5f 63 61 63 68 65 5b 63  ..packet_cache[c
1910: 61 63 68 65 5f 68 61 73 68 5d 2e 61 63 74 69 6f  ache_hash].actio
1920: 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 70 61  n = retval;...pa
1930: 63 6b 65 74 5f 63 61 63 68 65 5b 63 61 63 68 65  cket_cache[cache
1940: 5f 68 61 73 68 5d 2e 65 78 70 69 72 65 73 20 3d  _hash].expires =
1950: 20 63 75 72 72 74 69 6d 65 20 2b 20 70 61 63 6b   currtime + pack
1960: 65 74 5f 63 61 63 68 65 5f 74 74 6c 3b 0a 09 7d  et_cache_ttl;..}
1970: 0a 23 65 6e 64 69 66 0a 0a 09 66 72 65 65 28 62  .#endif...free(b
1980: 75 66 29 3b 0a 09 72 65 74 75 72 6e 20 72 65 74  uf);..return ret
1990: 76 61 6c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  val;.}..static i
19a0: 6e 74 20 70 62 6c 5f 63 61 6c 6c 62 61 63 6b 28  nt pbl_callback(
19b0: 73 74 72 75 63 74 20 6e 66 71 5f 71 5f 68 61 6e  struct nfq_q_han
19c0: 64 6c 65 20 2a 71 68 2c 20 73 74 72 75 63 74 20  dle *qh, struct 
19d0: 6e 66 67 65 6e 6d 73 67 20 2a 6e 66 6d 73 67 2c  nfgenmsg *nfmsg,
19e0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
19f0: 6e 66 71 5f 64 61 74 61 20 2a 6e 66 61 2c 20 76  nfq_data *nfa, v
1a00: 6f 69 64 20 2a 64 61 74 61 29 20 7b 0a 0a 09 69  oid *data) {...i
1a10: 6e 74 20 72 65 74 3b 0a 09 69 6e 74 20 69 64 3b  nt ret;..int id;
1a20: 0a 09 73 74 72 75 63 74 20 6e 66 71 6e 6c 5f 6d  ..struct nfqnl_m
1a30: 73 67 5f 70 61 63 6b 65 74 5f 68 64 72 20 2a 70  sg_packet_hdr *p
1a40: 68 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  h;..unsigned cha
1a50: 72 20 2a 6e 66 64 61 74 61 3b 0a 09 73 74 72 75  r *nfdata;..stru
1a60: 63 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f 20 69  ct packet_info i
1a70: 70 3b 0a 0a 09 44 45 42 55 47 28 32 2c 20 22 45  p;...DEBUG(2, "E
1a80: 6e 74 65 72 69 6e 67 20 63 61 6c 6c 62 61 63 6b  ntering callback
1a90: 22 29 3b 0a 0a 09 69 66 20 28 70 68 20 3d 20 6e  ");...if (ph = n
1aa0: 66 71 5f 67 65 74 5f 6d 73 67 5f 70 61 63 6b 65  fq_get_msg_packe
1ab0: 74 5f 68 64 72 28 6e 66 61 29 29 20 7b 0a 09 09  t_hdr(nfa)) {...
1ac0: 69 64 20 3d 20 6e 74 6f 68 6c 28 70 68 2d 3e 70  id = ntohl(ph->p
1ad0: 61 63 6b 65 74 5f 69 64 29 3b 0a 09 7d 0a 0a 09  acket_id);..}...
1ae0: 72 65 74 20 3d 20 6e 66 71 5f 67 65 74 5f 70 61  ret = nfq_get_pa
1af0: 79 6c 6f 61 64 28 6e 66 61 2c 20 26 6e 66 64 61  yload(nfa, &nfda
1b00: 74 61 29 3b 0a 09 2f 2a 20 77 68 61 74 20 72 65  ta);../* what re
1b10: 74 75 72 6e 20 63 6f 64 65 73 20 68 65 72 65 3f  turn codes here?
1b20: 20 2a 2f 0a 0a 09 72 65 74 20 3d 20 67 65 74 5f   */...ret = get_
1b30: 70 61 63 6b 65 74 5f 69 6e 66 6f 28 6e 66 64 61  packet_info(nfda
1b40: 74 61 2c 20 26 69 70 29 3b 09 0a 09 69 66 20 28  ta, &ip);...if (
1b50: 72 65 74 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 53  ret == -1) {...S
1b60: 45 54 5f 56 45 52 44 49 43 54 28 71 68 2c 20 69  ET_VERDICT(qh, i
1b70: 64 2c 20 4e 46 5f 41 43 43 45 50 54 2c 20 30 2c  d, NF_ACCEPT, 0,
1b80: 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e   NULL);...return
1b90: 3b 0a 09 7d 0a 0a 09 72 65 74 20 3d 20 70 61 63  ;..}...ret = pac
1ba0: 6b 65 74 5f 63 68 65 63 6b 5f 69 70 28 69 70 29  ket_check_ip(ip)
1bb0: 3b 0a 09 0a 09 69 66 20 28 63 6f 6e 66 2e 64 65  ;....if (conf.de
1bc0: 62 75 67 20 3e 3d 20 32 29 20 7b 0a 09 70 72 69  bug >= 2) {..pri
1bd0: 6e 74 66 20 28 22 47 6f 74 20 70 61 63 6b 65 74  ntf ("Got packet
1be0: 20 66 72 6f 6d 20 25 68 68 75 2e 25 68 68 75 2e   from %hhu.%hhu.
1bf0: 25 68 68 75 2e 25 68 68 75 3a 20 25 64 5c 6e 22  %hhu.%hhu: %d\n"
1c00: 2c 20 69 70 2e 62 31 2c 20 69 70 2e 62 32 2c 20  , ip.b1, ip.b2, 
1c10: 69 70 2e 62 33 2c 20 69 70 2e 62 34 2c 20 72 65  ip.b3, ip.b4, re
1c20: 74 29 3b 0a 09 7d 0a 09 53 45 54 5f 56 45 52 44  t);..}..SET_VERD
1c30: 49 43 54 28 71 68 2c 20 69 64 2c 20 63 6f 6e 66  ICT(qh, id, conf
1c40: 2e 64 72 79 72 75 6e 20 3f 20 4e 46 5f 41 43 43  .dryrun ? NF_ACC
1c50: 45 50 54 20 3a 20 72 65 74 2c 20 30 2c 20 4e 55  EPT : ret, 0, NU
1c60: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  LL);.}../*. * SY
1c70: 4e 4f 50 53 49 53 3a 0a 20 2a 20 20 20 69 6e 74  NOPSIS:. *   int
1c80: 20 6d 61 69 6e 28 0a 20 2a 20 20 20 20 20 20 20   main(. *       
1c90: 20 20 20 20 20 69 6e 74 20 61 72 67 63 2c 0a 20       int argc,. 
1ca0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  *            cha
1cb0: 72 20 2a 2a 61 72 67 76 0a 20 2a 20 20 20 20 20  r **argv. *     
1cc0: 20 20 20 20 20 20 29 3b 0a 20 2a 0a 20 2a 20 41        );. *. * A
1cd0: 52 47 55 4d 45 4e 54 53 3a 0a 20 2a 20 20 20 69  RGUMENTS:. *   i
1ce0: 6e 74 20 61 72 67 63 20 20 20 20 20 20 20 20 20  nt argc         
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 72 67              "Arg
1d00: 75 6d 65 6e 74 20 43 6f 75 6e 74 2c 22 20 6e 75  ument Count," nu
1d10: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6c  mber of valid el
1d20: 65 6d 65 6e 74 73 0a 20 2a 20 20 20 20 20 20 20  ements. *       
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 69 6e 20 74 68 65 20           in the 
1d50: 22 61 72 67 76 22 20 61 72 72 61 79 20 74 6f 6f  "argv" array too
1d60: 2e 0a 20 2a 20 20 20 63 68 61 72 20 2a 2a 61 72  .. *   char **ar
1d70: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gv              
1d80: 20 20 20 20 22 41 72 67 75 6d 65 6e 74 20 56 65      "Argument Ve
1d90: 63 74 6f 72 2c 22 20 61 72 72 61 79 20 6f 66 20  ctor," array of 
1da0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 0a  pointers to the.
1db0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73    arguments pass
1de0: 65 64 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65  ed to this proce
1df0: 73 73 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ss.. *. * RETURN
1e00: 20 56 41 4c 55 45 3a 0a 20 2a 20 20 20 54 68 69   VALUE:. *   Thi
1e10: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
1e20: 64 20 6e 65 76 65 72 20 72 65 74 75 72 6e 2c 20  d never return, 
1e30: 73 69 6e 63 65 20 77 65 20 61 72 65 20 61 20 64  since we are a d
1e40: 61 65 6d 6f 6e 2e 20 20 54 68 65 20 70 61 72 65  aemon.  The pare
1e50: 6e 74 0a 20 2a 20 20 20 70 72 6f 63 65 73 73 20  nt. *   process 
1e60: 65 78 69 74 73 20 77 69 74 68 20 73 75 63 63 65  exits with succe
1e70: 73 73 20 28 45 58 49 54 5f 53 55 43 43 45 53 53  ss (EXIT_SUCCESS
1e80: 29 20 66 72 6f 6d 20 64 61 65 6d 6f 6e 69 7a 65  ) from daemonize
1e90: 28 29 3b 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 3a  ();. *. * NOTES:
1ea0: 0a 20 2a 20 20 20 54 68 69 73 20 69 73 20 74 68  . *   This is th
1eb0: 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  e function that 
1ec0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
1ed0: 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 74 68 65   before any othe
1ee0: 72 73 2c 20 69 74 20 64 6f 65 73 0a 20 2a 20 20  rs, it does. *  
1ef0: 20 6d 61 6e 79 20 69 6d 70 6f 72 74 61 6e 74 20   many important 
1f00: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72  initialization r
1f10: 6f 75 74 69 6e 65 73 20 28 72 65 61 64 69 6e 67  outines (reading
1f20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1f30: 69 6c 65 2c 0a 20 2a 20 20 20 73 65 74 74 69 6e  ile,. *   settin
1f40: 67 20 75 70 20 74 68 65 20 49 50 20 51 75 65 75  g up the IP Queu
1f50: 65 20 72 6f 75 74 69 6e 65 73 2c 20 73 79 73 74  e routines, syst
1f60: 65 6d 20 6c 6f 67 67 69 6e 67 2c 20 65 74 63 29  em logging, etc)
1f70: 20 61 6e 64 20 70 72 6f 76 69 64 65 73 0a 20 2a   and provides. *
1f80: 20 20 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70     the main loop
1f90: 20 77 68 65 72 65 20 70 61 63 6b 65 74 73 20 61   where packets a
1fa0: 72 65 20 72 65 61 64 20 61 6e 64 20 70 72 6f 63  re read and proc
1fb0: 65 73 73 65 64 2e 0a 20 2a 0a 20 2a 2f 0a 69 6e  essed.. *. */.in
1fc0: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
1fd0: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a   char **argv) {.
1fe0: 0a 09 73 74 72 75 63 74 20 50 42 4c 5f 48 41 4e  ..struct PBL_HAN
1ff0: 44 4c 45 20 2a 68 61 6e 64 6c 65 3b 0a 09 63 68  DLE *handle;..ch
2000: 61 72 20 62 75 66 5b 42 55 46 46 45 52 53 49 5a  ar buf[BUFFERSIZ
2010: 45 5d 3b 0a 09 73 74 72 75 63 74 20 6e 66 71 5f  E];..struct nfq_
2020: 68 61 6e 64 6c 65 20 2a 68 3b 0a 09 73 74 72 75  handle *h;..stru
2030: 63 74 20 6e 66 6e 6c 5f 68 61 6e 64 6c 65 20 2a  ct nfnl_handle *
2040: 6e 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 73 74  nh;..int fd;..st
2050: 72 75 63 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f  ruct packet_info
2060: 20 69 70 3b 0a 09 73 74 72 75 63 74 20 73 74 61   ip;..struct sta
2070: 74 20 66 62 75 66 3b 0a 09 69 6e 74 20 61 63 74  t fbuf;..int act
2080: 69 6f 6e 3b 0a 09 69 6e 74 20 72 76 3b 0a 0a 09  ion;..int rv;...
2090: 63 6f 6e 66 2e 64 65 62 75 67 20 3d 20 30 3b 0a  conf.debug = 0;.
20a0: 0a 09 69 66 20 28 73 74 61 74 28 22 2f 70 72 6f  ..if (stat("/pro
20b0: 63 2f 6e 65 74 2f 6e 65 74 66 69 6c 74 65 72 2f  c/net/netfilter/
20c0: 6e 66 6e 65 74 6c 69 6e 6b 5f 71 75 65 75 65 22  nfnetlink_queue"
20d0: 2c 20 26 66 62 75 66 29 20 3d 3d 20 45 4e 4f 45  , &fbuf) == ENOE
20e0: 4e 54 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  NT) {...fprintf(
20f0: 73 74 64 65 72 72 2c 20 22 50 6c 65 61 73 65 20  stderr, "Please 
2100: 6d 61 6b 65 20 73 75 72 65 20 79 6f 75 20 68 61  make sure you ha
2110: 76 65 5c 6e 63 6f 6d 70 69 6c 65 64 20 61 20 6b  ve\ncompiled a k
2120: 65 72 6e 65 6c 20 77 69 74 68 20 74 68 65 20 4e  ernel with the N
2130: 65 74 66 69 6c 74 65 72 20 51 55 45 55 45 20 74  etfilter QUEUE t
2140: 61 72 67 65 74 20 62 75 69 6c 74 20 69 6e 2c 20  arget built in, 
2150: 6f 72 20 6c 6f 61 64 65 64 20 74 68 65 20 61 70  or loaded the ap
2160: 70 72 6f 70 72 69 61 74 65 20 6d 6f 64 75 6c 65  propriate module
2170: 2e 5c 6e 22 29 3b 0a 09 09 65 78 69 74 28 45 58  .\n");...exit(EX
2180: 49 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09 7d 0a  IT_FAILURE);..}.
2190: 0a 09 2f 2a 20 50 61 72 73 65 20 6f 75 72 20 63  ../* Parse our c
21a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74  onfiguration dat
21b0: 61 2e 20 2a 2f 0a 09 70 61 72 73 65 5f 63 6f 6e  a. */..parse_con
21c0: 66 69 67 28 29 3b 0a 0a 0a 09 2f 2a 20 57 65 20  fig();..../* We 
21d0: 70 61 72 73 65 20 61 72 67 75 6d 65 6e 74 73 20  parse arguments 
21e0: 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 74 68  after parsing th
21f0: 65 20 63 6f 6e 66 69 67 20 66 69 6c 65 20 73 6f  e config file so
2200: 20 77 65 20 63 61 6e 20 6f 76 65 72 72 69 64 65   we can override
2210: 20 74 68 65 0a 09 20 20 20 63 6f 6e 66 69 67 20   the..   config 
2220: 66 69 6c 65 2e 20 2a 2f 0a 09 70 61 72 73 65 5f  file. */..parse_
2230: 61 72 67 75 6d 65 6e 74 73 28 61 72 67 63 2c 20  arguments(argc, 
2240: 61 72 67 76 29 3b 0a 0a 09 69 66 20 28 63 6f 6e  argv);...if (con
2250: 66 2e 64 65 62 75 67 20 3e 20 30 29 20 7b 0a 09  f.debug > 0) {..
2260: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
2270: 20 22 44 65 62 75 67 20 6c 65 76 65 6c 20 25 64   "Debug level %d
2280: 5c 6e 22 2c 20 63 6f 6e 66 2e 64 65 62 75 67 29  \n", conf.debug)
2290: 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 6f 6e 66 2e  ;..}...if (conf.
22a0: 64 65 62 75 67 20 3e 20 30 29 20 7b 0a 09 09 66  debug > 0) {...f
22b0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
22c0: 4c 69 6e 6b 69 6e 67 20 74 6f 20 71 75 65 75 65  Linking to queue
22d0: 20 25 64 5c 6e 22 2c 20 63 6f 6e 66 2e 71 75 65   %d\n", conf.que
22e0: 75 65 6e 6f 29 3b 0a 09 7d 0a 0a 09 6f 70 65 6e  ueno);..}...open
22f0: 6c 6f 67 28 22 70 61 63 6b 65 74 62 6c 22 2c 20  log("packetbl", 
2300: 4c 4f 47 5f 50 49 44 2c 20 63 6f 6e 66 2e 6c 6f  LOG_PID, conf.lo
2310: 67 5f 66 61 63 69 6c 69 74 79 29 3b 0a 09 69 66  g_facility);..if
2320: 20 28 63 6f 6e 66 2e 64 65 62 75 67 20 3d 3d 20   (conf.debug == 
2330: 30 29 20 7b 0a 09 09 64 61 65 6d 6f 6e 69 7a 65  0) {...daemonize
2340: 28 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 55  ();..}..#ifdef U
2350: 53 45 5f 53 4f 43 4b 53 54 41 54 0a 09 70 62 6c  SE_SOCKSTAT..pbl
2360: 5f 69 6e 69 74 5f 73 6f 63 6b 73 74 61 74 28 29  _init_sockstat()
2370: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
2380: 20 55 53 45 5f 43 41 43 48 45 0a 09 69 66 20 28   USE_CACHE..if (
2390: 70 61 63 6b 65 74 5f 63 61 63 68 65 5f 6c 65 6e  packet_cache_len
23a0: 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 20 41 6c 6c   > 0) {.../* All
23b0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
23c0: 74 68 65 20 70 61 63 6b 65 74 20 63 61 63 68 65  the packet cache
23d0: 20 69 66 20 61 20 70 6f 73 69 74 69 76 65 20 6e   if a positive n
23e0: 75 6d 62 65 72 20 6f 66 0a 09 09 20 20 20 65 6c  umber of...   el
23f0: 65 6d 65 6e 74 73 20 69 73 20 72 65 71 75 65 73  ements is reques
2400: 74 65 64 2e 20 2a 2f 0a 09 09 70 61 63 6b 65 74  ted. */...packet
2410: 5f 63 61 63 68 65 20 3d 20 6d 61 6c 6c 6f 63 28  _cache = malloc(
2420: 73 69 7a 65 6f 66 28 2a 70 61 63 6b 65 74 5f 63  sizeof(*packet_c
2430: 61 63 68 65 29 20 2a 20 70 61 63 6b 65 74 5f 63  ache) * packet_c
2440: 61 63 68 65 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c  ache_len);..} el
2450: 73 65 20 7b 0a 09 09 70 61 63 6b 65 74 5f 63 61  se {...packet_ca
2460: 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  che = NULL;..}..
2470: 09 70 61 63 6b 65 74 5f 63 61 63 68 65 5f 63 6c  .packet_cache_cl
2480: 65 61 72 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a  ear();.#endif...
2490: 09 44 45 42 55 47 28 32 2c 20 22 43 72 65 61 74  .DEBUG(2, "Creat
24a0: 69 6e 67 20 6e 66 71 20 68 61 6e 64 6c 65 2e 2e  ing nfq handle..
24b0: 2e 22 29 3b 0a 09 69 66 20 28 28 68 20 3d 20 6e  .");..if ((h = n
24c0: 66 71 5f 6f 70 65 6e 28 29 29 20 3d 3d 20 4e 55  fq_open()) == NU
24d0: 4c 4c 29 20 7b 0a 09 09 73 79 73 6c 6f 67 28 4c  LL) {...syslog(L
24e0: 4f 47 5f 45 52 52 2c 20 22 43 6f 75 6c 64 6e 27  OG_ERR, "Couldn'
24f0: 74 20 63 72 65 61 74 65 20 6e 66 71 20 68 61 6e  t create nfq han
2500: 64 6c 65 3a 20 25 73 22 2c 20 73 74 72 65 72 72  dle: %s", strerr
2510: 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 09 09 44 45  or(errno));...DE
2520: 42 55 47 28 31 2c 20 22 43 6f 75 6c 64 6e 27 74  BUG(1, "Couldn't
2530: 20 63 72 65 61 74 65 20 6e 66 71 20 68 61 6e 64   create nfq hand
2540: 6c 65 22 29 3b 0a 09 09 65 78 69 74 28 45 58 49  le");...exit(EXI
2550: 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09 7d 0a 09  T_FAILURE);..}..
2560: 44 45 42 55 47 28 32 2c 20 22 75 6e 62 69 6e 64  DEBUG(2, "unbind
2570: 69 6e 67 20 6e 66 71 20 68 61 6e 64 6c 65 2e 2e  ing nfq handle..
2580: 2e 22 29 3b 0a 09 69 66 20 28 6e 66 71 5f 75 6e  .");..if (nfq_un
2590: 62 69 6e 64 5f 70 66 28 68 2c 20 41 46 5f 49 4e  bind_pf(h, AF_IN
25a0: 45 54 29 20 3c 20 30 29 20 7b 0a 09 09 73 79 73  ET) < 0) {...sys
25b0: 6c 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22 43 6f  log(LOG_ERR, "Co
25c0: 75 6c 64 6e 27 74 20 75 6e 62 69 6e 64 20 6e 66  uldn't unbind nf
25d0: 5f 71 75 65 75 65 20 68 61 6e 64 6c 65 72 20 66  _queue handler f
25e0: 6f 72 20 41 46 5f 49 4e 45 54 22 29 3b 0a 09 09  or AF_INET");...
25f0: 44 45 42 55 47 28 31 2c 20 22 43 6f 75 6c 64 6e  DEBUG(1, "Couldn
2600: 27 74 20 75 6e 62 69 6e 64 20 6e 66 5f 71 75 65  't unbind nf_que
2610: 75 65 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 41  ue handler for A
2620: 46 5f 49 4e 45 54 22 29 3b 0a 09 09 65 78 69 74  F_INET");...exit
2630: 28 45 58 49 54 5f 46 41 49 4c 55 52 45 29 3b 0a  (EXIT_FAILURE);.
2640: 09 7d 0a 09 44 45 42 55 47 28 32 2c 20 22 62 69  .}..DEBUG(2, "bi
2650: 6e 64 69 6e 67 20 6e 66 71 20 68 61 6e 64 6c 65  nding nfq handle
2660: 2e 2e 2e 22 29 3b 0a 09 69 66 20 28 6e 66 71 5f  ...");..if (nfq_
2670: 62 69 6e 64 5f 70 66 28 68 2c 20 41 46 5f 49 4e  bind_pf(h, AF_IN
2680: 45 54 29 20 3c 20 30 29 20 7b 0a 09 09 73 79 73  ET) < 0) {...sys
2690: 6c 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22 43 6f  log(LOG_ERR, "Co
26a0: 75 6c 64 6e 27 74 20 62 69 6e 64 20 6e 73 5f 71  uldn't bind ns_q
26b0: 75 65 75 65 20 68 61 6e 64 6c 65 72 20 66 6f 72  ueue handler for
26c0: 20 41 46 5f 49 4e 45 54 22 29 3b 0a 09 09 44 45   AF_INET");...DE
26d0: 42 55 47 28 31 2c 20 22 43 6f 75 6c 64 6e 27 74  BUG(1, "Couldn't
26e0: 20 62 69 6e 64 20 6e 73 5f 71 75 65 75 65 20 68   bind ns_queue h
26f0: 61 6e 64 6c 65 72 20 66 6f 72 20 41 46 5f 49 4e  andler for AF_IN
2700: 45 54 22 29 3b 0a 09 09 65 78 69 74 28 45 58 49  ET");...exit(EXI
2710: 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09 7d 0a 09  T_FAILURE);..}..
2720: 44 45 42 55 47 28 32 2c 20 22 63 72 65 61 74 69  DEBUG(2, "creati
2730: 6e 67 20 71 75 65 75 65 2e 2e 2e 22 29 3b 0a 09  ng queue...");..
2740: 69 66 20 28 28 68 61 6e 64 6c 65 20 3d 20 6e 66  if ((handle = nf
2750: 71 5f 63 72 65 61 74 65 5f 71 75 65 75 65 28 68  q_create_queue(h
2760: 2c 20 63 6f 6e 66 2e 71 75 65 75 65 6e 6f 2c 20  , conf.queueno, 
2770: 26 70 62 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 4e  &pbl_callback, N
2780: 55 4c 4c 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ULL)) == NULL) {
2790: 0a 09 09 73 79 73 6c 6f 67 28 4c 4f 47 5f 45 52  ...syslog(LOG_ER
27a0: 52 2c 20 22 6e 66 71 5f 63 72 65 61 74 65 5f 71  R, "nfq_create_q
27b0: 75 65 75 65 20 66 61 69 6c 65 64 22 29 3b 0a 09  ueue failed");..
27c0: 09 44 45 42 55 47 28 31 2c 20 22 6e 66 71 5f 63  .DEBUG(1, "nfq_c
27d0: 72 65 61 74 65 5f 71 75 65 75 65 20 66 61 69 6c  reate_queue fail
27e0: 65 64 22 29 3b 0a 09 09 65 78 69 74 28 45 58 49  ed");...exit(EXI
27f0: 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09 7d 0a 0a  T_FAILURE);..}..
2800: 09 69 66 20 28 28 50 42 4c 5f 53 45 54 5f 4d 4f  .if ((PBL_SET_MO
2810: 44 45 28 68 61 6e 64 6c 65 2c 20 50 42 4c 5f 43  DE(handle, PBL_C
2820: 4f 50 59 5f 50 41 43 4b 45 54 2c 20 42 55 46 46  OPY_PACKET, BUFF
2830: 45 52 53 49 5a 45 29 29 20 3d 3d 20 2d 31 29 20  ERSIZE)) == -1) 
2840: 7b 0a 09 09 73 79 73 6c 6f 67 28 4c 4f 47 5f 45  {...syslog(LOG_E
2850: 52 52 2c 20 22 69 70 71 5f 73 65 74 5f 6d 6f 64  RR, "ipq_set_mod
2860: 65 20 65 72 72 6f 72 3a 20 25 73 22 2c 0a 09 09  e error: %s",...
2870: 09 50 42 4c 5f 45 52 52 53 54 52 29 3b 0a 09 09  .PBL_ERRSTR);...
2880: 44 45 42 55 47 28 31 2c 20 22 69 70 71 5f 73 65  DEBUG(1, "ipq_se
2890: 74 5f 6d 6f 64 65 20 65 72 72 6f 72 22 29 3b 0a  t_mode error");.
28a0: 09 09 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20 31  ..if (errno == 1
28b0: 31 31 29 20 7b 0a 09 09 09 73 79 73 6c 6f 67 28  11) {....syslog(
28c0: 4c 4f 47 5f 45 52 52 2c 20 22 74 72 79 20 6c 6f  LOG_ERR, "try lo
28d0: 61 64 69 6e 67 20 74 68 65 20 69 70 5f 71 75 65  ading the ip_que
28e0: 75 65 20 6d 6f 64 75 6c 65 22 29 3b 0a 09 09 7d  ue module");...}
28f0: 0a 09 09 65 78 69 74 28 45 58 49 54 5f 46 41 49  ...exit(EXIT_FAI
2900: 4c 55 52 45 29 3b 0a 09 7d 0a 0a 09 73 79 73 6c  LURE);..}...sysl
2910: 6f 67 28 4c 4f 47 5f 49 4e 46 4f 2c 20 22 70 61  og(LOG_INFO, "pa
2920: 63 6b 65 74 62 6c 20 73 74 61 72 74 65 64 20 73  cketbl started s
2930: 75 63 63 65 73 73 66 75 6c 6c 79 22 29 3b 0a 09  uccessfully");..
2940: 44 45 42 55 47 28 31 2c 20 22 70 61 63 6b 65 74  DEBUG(1, "packet
2950: 62 6c 20 73 74 61 72 74 65 64 20 73 75 63 63 65  bl started succe
2960: 73 73 66 75 6c 6c 79 22 29 3b 0a 0a 09 2f 2a 20  ssfully");.../* 
2970: 6d 61 69 6e 20 70 61 63 6b 65 74 20 70 72 6f 63  main packet proc
2980: 65 73 73 69 6e 67 20 6c 6f 6f 70 2e 20 20 54 68  essing loop.  Th
2990: 69 73 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 20 6e  is loop should n
29a0: 65 76 65 72 20 74 65 72 6d 69 6e 61 74 65 0a 09  ever terminate..
29b0: 20 2a 20 75 6e 6c 65 73 73 20 61 20 73 69 67 6e   * unless a sign
29c0: 61 6c 20 69 73 20 72 65 63 65 69 76 65 64 20 6f  al is received o
29d0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 75 6e 66  r some other unf
29e0: 6f 72 65 73 65 65 6e 20 74 68 69 6e 67 0a 09 20  oreseen thing.. 
29f0: 2a 20 68 61 70 70 65 6e 73 2e 0a 09 20 2a 2f 0a  * happens... */.
2a00: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 0a 09 09  .while (1) {....
2a10: 6e 68 20 3d 20 6e 66 71 5f 6e 66 6e 6c 68 28 68  nh = nfq_nfnlh(h
2a20: 29 3b 0a 09 09 66 64 20 3d 20 6e 66 6e 6c 5f 66  );...fd = nfnl_f
2a30: 64 28 6e 68 29 3b 0a 09 09 44 45 42 55 47 28 32  d(nh);...DEBUG(2
2a40: 2c 20 22 45 6e 74 65 72 69 6e 67 20 6d 61 69 6e  , "Entering main
2a50: 20 6c 6f 6f 70 2e 22 29 3b 0a 0a 09 09 44 45 42   loop.");....DEB
2a60: 55 47 28 32 2c 20 22 77 61 69 74 69 6e 67 20 66  UG(2, "waiting f
2a70: 6f 72 20 61 20 70 61 63 6b 65 74 2e 2e 2e 22 29  or a packet...")
2a80: 3b 0a 09 09 77 68 69 6c 65 20 28 28 72 76 20 3d  ;...while ((rv =
2a90: 20 72 65 63 76 28 66 64 2c 20 62 75 66 2c 20 73   recv(fd, buf, s
2aa0: 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 29 29 20  izeof(buf), 0)) 
2ab0: 3e 20 30 29 20 7b 0a 09 09 09 44 45 42 55 47 28  > 0) {....DEBUG(
2ac0: 32 2c 20 22 48 61 6e 64 6c 69 6e 67 20 61 20 70  2, "Handling a p
2ad0: 61 63 6b 65 74 22 29 3b 0a 09 09 09 6e 66 71 5f  acket");....nfq_
2ae0: 68 61 6e 64 6c 65 5f 70 61 63 6b 65 74 28 68 2c  handle_packet(h,
2af0: 20 62 75 66 2c 20 72 76 29 3b 0a 09 09 7d 0a 09   buf, rv);...}..
2b00: 09 44 45 42 55 47 28 32 2c 20 22 50 61 63 6b 65  .DEBUG(2, "Packe
2b10: 74 20 67 6f 74 2e 22 29 3b 0a 09 09 73 74 61 74  t got.");...stat
2b20: 69 73 74 69 63 73 2e 74 6f 74 61 6c 70 61 63 6b  istics.totalpack
2b30: 65 74 73 2b 2b 3b 0a 0a 09 7d 0a 7d 0a 0a 2f 2a  ets++;...}.}../*
2b40: 0a 20 2a 20 53 59 4e 4f 50 53 49 53 3a 0a 20 2a  . * SYNOPSIS:. *
2b50: 20 20 20 69 6e 74 20 67 65 74 5f 70 61 63 6b 65     int get_packe
2b60: 74 5f 69 6e 66 6f 28 0a 20 2a 20 20 20 20 20 20  t_info(. *      
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 69 70 71 5f 70 61 63 6b 65 74 5f 6d 73 67 5f   ipq_packet_msg_
2b90: 74 20 2a 70 61 63 6b 65 74 2c 0a 20 2a 20 20 20  t *packet,. *   
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 73 74 72 75 63 74 20 70 61 63 6b 65      struct packe
2bc0: 74 5f 69 6e 66 6f 20 2a 69 70 0a 20 2a 20 20 20  t_info *ip. *   
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55     );. *. * ARGU
2bf0: 4d 45 4e 54 53 3a 0a 20 2a 20 20 69 70 71 5f 70  MENTS:. *  ipq_p
2c00: 61 63 6b 65 74 5f 6d 73 67 5f 74 20 2a 70 61 63  acket_msg_t *pac
2c10: 6b 65 74 20 20 20 20 20 20 49 50 20 51 75 65 75  ket      IP Queu
2c20: 65 20 73 75 70 70 6c 69 65 64 20 70 61 63 6b 65  e supplied packe
2c30: 74 20 68 65 61 64 65 72 73 0a 20 2a 20 20 73 74  t headers. *  st
2c40: 72 75 63 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f  ruct packet_info
2c50: 20 2a 69 70 20 20 20 20 20 20 20 20 53 74 72 75   *ip        Stru
2c60: 63 74 75 72 65 20 74 6f 20 62 65 20 66 69 6c 6c  cture to be fill
2c70: 65 64 20 69 6e 2e 0a 20 2a 0a 20 2a 20 52 45 54  ed in.. *. * RET
2c80: 55 52 4e 20 56 41 4c 55 45 3a 0a 20 2a 20 20 20  URN VALUE:. *   
2c90: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  0 is returned on
2ca0: 20 73 75 63 63 65 73 73 2c 20 6e 6f 6e 2d 7a 65   success, non-ze
2cb0: 72 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ro indicates tha
2cc0: 74 20 74 68 65 20 70 61 63 6b 65 74 20 63 6f 75  t the packet cou
2cd0: 6c 64 20 6e 6f 74 0a 20 2a 20 20 20 62 65 20 70  ld not. *   be p
2ce0: 72 6f 70 65 72 6c 79 20 70 72 6f 63 65 73 73 65  roperly processe
2cf0: 64 20 28 69 2e 65 2e 2c 20 69 74 27 73 20 6f 66  d (i.e., it's of
2d00: 66 20 74 68 65 20 77 72 6f 6e 67 20 70 72 6f 74  f the wrong prot
2d10: 6f 63 6f 6c 20 6f 72 20 76 65 72 73 69 6f 6e 29  ocol or version)
2d20: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 3a 0a 20  .. *. * NOTES:. 
2d30: 2a 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *   This functio
2d40: 6e 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 70  n fills in the p
2d50: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
2d60: 74 65 64 20 22 69 70 22 20 70 61 72 61 6d 65 74  ted "ip" paramet
2d70: 65 72 20 77 69 74 68 0a 20 2a 20 20 20 64 61 74  er with. *   dat
2d80: 61 20 66 72 6f 6d 20 74 68 65 20 22 70 61 63 6b  a from the "pack
2d90: 65 74 22 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  et" parameter.. 
2da0: 2a 0a 20 2a 2f 0a 69 6e 74 20 67 65 74 5f 70 61  *. */.int get_pa
2db0: 63 6b 65 74 5f 69 6e 66 6f 28 63 68 61 72 20 2a  cket_info(char *
2dc0: 70 61 79 6c 6f 61 64 2c 20 73 74 72 75 63 74 20  payload, struct 
2dd0: 70 61 63 6b 65 74 5f 69 6e 66 6f 20 2a 69 70 29  packet_info *ip)
2de0: 20 7b 0a 0a 09 69 6e 74 20 76 65 72 73 69 6f 6e   {...int version
2df0: 3b 0a 09 69 6e 74 20 69 70 5f 68 65 61 64 65 72  ;..int ip_header
2e00: 5f 6c 65 6e 67 74 68 2c 20 68 65 61 64 65 72 5f  _length, header_
2e10: 73 69 7a 65 3b 3b 0a 0a 09 69 66 20 28 69 70 20  size;;...if (ip 
2e20: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 61 79 6c 6f  == NULL || paylo
2e30: 61 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ad == NULL) {...
2e40: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09  return -1;..}...
2e50: 69 70 2d 3e 73 5f 70 6f 72 74 20 3d 20 30 3b 0a  ip->s_port = 0;.
2e60: 09 69 70 2d 3e 64 5f 70 6f 72 74 20 3d 20 30 3b  .ip->d_port = 0;
2e70: 0a 0a 09 2f 2a 20 47 65 74 20 49 50 20 56 65 72  .../* Get IP Ver
2e80: 73 69 6f 6e 09 09 42 79 74 65 20 31 20 6f 66 20  sion..Byte 1 of 
2e90: 49 50 20 48 65 61 64 65 72 20 2a 2f 0a 09 76 65  IP Header */..ve
2ea0: 72 73 69 6f 6e 20 3d 20 70 61 79 6c 6f 61 64 5b  rsion = payload[
2eb0: 30 5d 20 26 20 30 78 46 30 3b 0a 09 76 65 72 73  0] & 0xF0;..vers
2ec0: 69 6f 6e 20 3e 3e 3d 20 34 3b 0a 09 2f 2a 20 47  ion >>= 4;../* G
2ed0: 65 74 20 49 50 20 48 65 61 64 65 72 20 6c 65 6e  et IP Header len
2ee0: 67 74 68 09 09 42 79 74 65 20 32 20 6f 66 20 49  gth..Byte 2 of I
2ef0: 50 20 48 65 61 64 65 72 0a 09 20 2a 20 48 65 61  P Header.. * Hea
2f00: 64 65 72 20 6c 65 6e 67 74 68 20 69 73 20 75 73  der length is us
2f10: 75 61 6c 6c 79 20 32 30 2c 20 6f 72 20 35 20 33  ually 20, or 5 3
2f20: 32 2d 62 69 74 20 77 6f 72 64 73 20 2a 2f 0a 09  2-bit words */..
2f30: 69 70 5f 68 65 61 64 65 72 5f 6c 65 6e 67 74 68  ip_header_length
2f40: 20 3d 20 70 61 79 6c 6f 61 64 5b 30 5d 20 26 20   = payload[0] & 
2f50: 30 78 30 46 3b 0a 09 68 65 61 64 65 72 5f 73 69  0x0F;..header_si
2f60: 7a 65 20 3d 20 69 70 5f 68 65 61 64 65 72 5f 6c  ze = ip_header_l
2f70: 65 6e 67 74 68 20 2a 20 34 3b 0a 0a 09 2f 2a 20  ength * 4;.../* 
2f80: 57 65 27 72 65 20 6e 6f 74 20 68 61 6e 64 6c 69  We're not handli
2f90: 6e 67 20 49 50 56 36 20 70 61 63 6b 65 74 73 20  ng IPV6 packets 
2fa0: 79 65 74 2e 20 20 49 27 6c 6c 20 70 72 6f 62 61  yet.  I'll proba
2fb0: 62 6c 79 20 72 65 77 72 69 74 65 0a 09 20 2a 20  bly rewrite.. * 
2fc0: 74 68 69 73 20 77 68 6f 6c 65 20 64 61 6d 6e 65  this whole damne
2fd0: 64 20 74 68 69 6e 67 20 69 6e 20 43 2b 2b 20 66  d thing in C++ f
2fe0: 69 72 73 74 2e 20 2a 2f 0a 09 69 66 20 28 76 65  irst. */..if (ve
2ff0: 72 73 69 6f 6e 20 21 3d 20 34 29 20 7b 0a 09 09  rsion != 4) {...
3000: 44 45 42 55 47 28 32 2c 20 22 49 50 56 36 20 70  DEBUG(2, "IPV6 p
3010: 61 63 6b 65 74 20 72 65 63 65 69 76 65 64 20 61  acket received a
3020: 6e 64 20 69 67 6e 6f 72 65 64 2e 22 29 3b 0a 09  nd ignored.");..
3030: 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a  .return -1;..}..
3040: 09 2f 2a 20 49 50 20 41 64 64 72 65 73 73 09 09  ./* IP Address..
3050: 09 42 79 74 65 73 20 31 33 20 2d 20 31 36 20 6f  .Bytes 13 - 16 o
3060: 66 20 49 50 20 68 65 61 64 65 72 20 2a 2f 0a 09  f IP header */..
3070: 69 70 2d 3e 62 31 20 3d 20 70 61 79 6c 6f 61 64  ip->b1 = payload
3080: 5b 31 32 5d 3b 0a 09 69 70 2d 3e 62 32 20 3d 20  [12];..ip->b2 = 
3090: 70 61 79 6c 6f 61 64 5b 31 33 5d 3b 0a 09 69 70  payload[13];..ip
30a0: 2d 3e 62 33 20 3d 20 70 61 79 6c 6f 61 64 5b 31  ->b3 = payload[1
30b0: 34 5d 3b 0a 09 69 70 2d 3e 62 34 20 3d 20 70 61  4];..ip->b4 = pa
30c0: 79 6c 6f 61 64 5b 31 35 5d 3b 0a 0a 09 2f 2a 20  yload[15];.../* 
30d0: 53 6f 75 72 63 65 20 50 6f 72 74 09 09 09 42 79  Source Port...By
30e0: 74 65 73 20 32 31 20 2d 20 32 32 20 6f 66 20 49  tes 21 - 22 of I
30f0: 50 20 48 65 61 64 65 72 0a 09 20 2a 09 09 09 09  P Header.. *....
3100: 42 79 74 65 73 20 31 20 2d 20 32 20 6f 66 20 54  Bytes 1 - 2 of T
3110: 43 50 20 48 65 61 64 65 72 20 2a 2f 0a 09 69 70  CP Header */..ip
3120: 2d 3e 73 5f 70 6f 72 74 20 3d 20 70 61 79 6c 6f  ->s_port = paylo
3130: 61 64 5b 68 65 61 64 65 72 5f 73 69 7a 65 5d 20  ad[header_size] 
3140: 2a 20 32 35 36 3b 0a 09 69 70 2d 3e 73 5f 70 6f  * 256;..ip->s_po
3150: 72 74 20 2b 3d 20 70 61 79 6c 6f 61 64 5b 68 65  rt += payload[he
3160: 61 64 65 72 5f 73 69 7a 65 20 2b 20 31 5d 3b 0a  ader_size + 1];.
3170: 0a 09 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e  ../* Destination
3180: 20 50 6f 72 74 09 09 42 79 74 65 73 20 32 33 20   Port..Bytes 23 
3190: 2d 20 32 34 20 6f 66 20 49 50 20 48 65 61 64 65  - 24 of IP Heade
31a0: 72 0a 09 20 2a 09 09 09 09 42 79 74 65 73 20 33  r.. *....Bytes 3
31b0: 20 2d 20 34 20 6f 66 20 54 43 50 20 48 65 61 64   - 4 of TCP Head
31c0: 65 72 20 2a 2f 0a 09 69 70 2d 3e 64 5f 70 6f 72  er */..ip->d_por
31d0: 74 20 3d 20 70 61 79 6c 6f 61 64 5b 68 65 61 64  t = payload[head
31e0: 65 72 5f 73 69 7a 65 20 2b 20 32 5d 20 2a 20 32  er_size + 2] * 2
31f0: 35 36 3b 0a 09 69 70 2d 3e 64 5f 70 6f 72 74 20  56;..ip->d_port 
3200: 2b 3d 20 70 61 79 6c 6f 61 64 5b 68 65 61 64 65  += payload[heade
3210: 72 5f 73 69 7a 65 20 2b 20 33 5d 3b 0a 0a 09 2f  r_size + 3];.../
3220: 2a 20 54 43 50 20 46 6c 61 67 73 09 09 09 42 79  * TCP Flags...By
3230: 74 65 20 31 34 20 6f 66 20 54 43 50 20 68 65 61  te 14 of TCP hea
3240: 64 65 72 0a 09 20 2a 09 09 09 09 4c 61 73 74 20  der.. *....Last 
3250: 73 69 78 20 62 69 74 73 0a 09 20 2a 20 57 65 27  six bits.. * We'
3260: 72 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74  re only interest
3270: 65 64 20 61 74 20 70 72 65 73 65 6e 74 20 69 6e  ed at present in
3280: 20 74 68 65 20 53 59 4e 20 46 6c 61 67 2e 0a 09   the SYN Flag...
3290: 20 2a 20 42 75 74 20 74 68 65 72 65 27 73 20 6e   * But there's n
32a0: 6f 20 72 65 61 73 6f 6e 20 6e 6f 74 20 74 6f 20  o reason not to 
32b0: 63 6f 70 79 20 61 6c 6c 20 6f 66 20 74 68 65 6d  copy all of them
32c0: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  , the operation.
32d0: 09 20 2a 20 77 6f 75 6c 64 20 74 61 6b 65 20 70  . * would take p
32e0: 72 65 74 74 79 20 6d 75 63 68 20 74 68 65 20 73  retty much the s
32f0: 61 6d 65 20 74 69 6d 65 20 61 6e 79 77 61 79 2e  ame time anyway.
3300: 20 2a 2f 0a 09 69 70 2d 3e 66 6c 61 67 73 20 3d   */..ip->flags =
3310: 20 70 61 79 6c 6f 61 64 5b 68 65 61 64 65 72 5f   payload[header_
3320: 73 69 7a 65 20 2b 20 31 33 5d 20 26 20 30 78 33  size + 13] & 0x3
3330: 46 3b 0a 0a 09 2f 2a 20 52 65 74 75 72 6e 69 6e  F;.../* Returnin
3340: 67 20 2d 31 2c 20 61 74 20 70 72 65 73 65 6e 74  g -1, at present
3350: 20 61 63 63 65 70 74 73 20 74 68 65 20 70 61 63   accepts the pac
3360: 6b 65 74 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61  ket unconditiona
3370: 6c 6c 79 2e 20 2a 2f 0a 09 69 66 20 28 63 6f 6e  lly. */..if (con
3380: 66 2e 61 6c 6c 6f 77 5f 6e 6f 6e 32 35 20 3d 3d  f.allow_non25 ==
3390: 20 30 20 26 26 20 69 70 2d 3e 64 5f 70 6f 72 74   0 && ip->d_port
33a0: 20 21 3d 20 32 35 29 20 7b 0a 09 09 72 65 74 75   != 25) {...retu
33b0: 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn -1;..}...if (
33c0: 28 63 6f 6e 66 2e 61 6c 6c 6f 77 5f 6e 6f 6e 73  (conf.allow_nons
33d0: 79 6e 20 3d 3d 20 30 29 20 26 26 20 28 28 69 70  yn == 0) && ((ip
33e0: 2d 3e 66 6c 61 67 73 20 26 20 54 48 5f 53 59 4e  ->flags & TH_SYN
33f0: 29 20 3d 3d 20 30 29 29 20 7b 0a 09 09 72 65 74  ) == 0)) {...ret
3400: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  urn -1;..}.../* 
3410: 52 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 2a  Return success *
3420: 2f 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  /..return 0;.}./
3430: 2a 0a 20 2a 20 53 59 4e 4f 50 53 49 53 3a 0a 20  *. * SYNOPSIS:. 
3440: 2a 20 20 20 76 6f 69 64 20 70 61 72 73 65 5f 63  *   void parse_c
3450: 6f 6e 66 69 67 28 76 6f 69 64 29 3b 0a 20 2a 0a  onfig(void);. *.
3460: 20 2a 20 41 52 47 55 4d 45 4e 54 53 3a 0a 20 2a   * ARGUMENTS:. *
3470: 20 20 20 28 6e 6f 6e 65 29 0a 20 2a 0a 20 2a 20     (none). *. * 
3480: 52 45 54 55 52 4e 20 56 41 4c 55 45 3a 0a 20 2a  RETURN VALUE:. *
3490: 20 20 20 28 6e 6f 6e 65 29 0a 20 2a 0a 20 2a 20     (none). *. * 
34a0: 4e 4f 54 45 53 3a 0a 20 2a 20 20 20 54 68 69 73  NOTES:. *   This
34b0: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 73 65 73   function parses
34c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
34d0: 6f 6e 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  on file and sets
34e0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
34f0: 0a 20 2a 20 20 20 67 6c 6f 62 61 6c 20 76 61 72  . *   global var
3500: 69 61 62 6c 65 73 2e 20 20 49 74 20 6d 61 79 20  iables.  It may 
3510: 63 61 75 73 65 20 74 68 65 20 70 72 6f 67 72 61  cause the progra
3520: 6d 20 74 6f 20 61 62 6f 72 74 20 77 69 74 68 20  m to abort with 
3530: 61 20 66 61 69 6c 75 72 65 0a 20 2a 20 20 20 69  a failure. *   i
3540: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
3550: 69 6f 6e 20 69 73 20 75 6e 72 65 61 64 61 62 6c  ion is unreadabl
3560: 65 20 6f 72 20 75 6e 70 61 72 73 61 62 6c 65 2e  e or unparsable.
3570: 20 20 44 75 65 20 74 6f 20 74 68 69 73 20 66 61    Due to this fa
3580: 63 74 2c 0a 20 2a 20 20 20 69 74 20 73 68 6f 75  ct,. *   it shou
3590: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
35a0: 64 20 64 75 72 69 6e 67 20 73 74 61 72 74 2d 75  d during start-u
35b0: 70 20 61 6e 64 20 6e 6f 74 20 66 72 6f 6d 20 74  p and not from t
35c0: 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 2e 0a 20 2a  he main loop.. *
35d0: 0a 20 2a 2f 0a 76 6f 69 64 20 70 61 72 73 65 5f  . */.void parse_
35e0: 63 6f 6e 66 69 67 28 76 6f 69 64 29 20 7b 0a 0a  config(void) {..
35f0: 09 63 6f 6e 66 69 67 5f 74 20 63 66 2c 20 2a 63  .config_t cf, *c
3600: 6f 6e 66 69 67 3b 0a 09 63 6f 6e 66 69 67 5f 73  onfig;..config_s
3610: 65 74 74 69 6e 67 5f 74 20 2a 63 6f 6e 66 69 67  etting_t *config
3620: 5f 73 65 74 74 69 6e 67 20 3d 20 4e 55 4c 4c 3b  _setting = NULL;
3630: 0a 09 73 74 72 75 63 74 20 63 65 20 2a 63 6f 6e  ..struct ce *con
3640: 66 69 67 5f 65 6e 74 72 79 20 3d 20 4e 55 4c 4c  fig_entry = NULL
3650: 3b 0a 09 69 6e 74 20 72 65 73 75 6c 74 20 3d 20  ;..int result = 
3660: 30 3b 0a 09 69 6e 74 20 69 20 3d 20 30 3b 0a 09  0;..int i = 0;..
3670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 61 63 73  const char *facs
3680: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 0a 09 63 6f  tr = NULL;....co
3690: 6e 66 69 67 20 3d 20 26 63 66 3b 0a 09 63 6f 6e  nfig = &cf;..con
36a0: 66 69 67 5f 69 6e 69 74 28 63 6f 6e 66 69 67 29  fig_init(config)
36b0: 3b 0a 09 72 65 73 75 6c 74 20 3d 20 63 6f 6e 66  ;..result = conf
36c0: 69 67 5f 72 65 61 64 5f 66 69 6c 65 28 63 6f 6e  ig_read_file(con
36d0: 66 69 67 2c 20 22 43 4f 4e 46 49 47 46 49 4c 45  fig, "CONFIGFILE
36e0: 22 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20  ");..if (result 
36f0: 3d 3d 20 43 4f 4e 46 49 47 5f 46 41 4c 53 45 29  == CONFIG_FALSE)
3700: 20 7b 0a 09 09 69 66 20 28 63 6f 6e 66 69 67 5f   {...if (config_
3710: 65 72 72 6f 72 5f 74 79 70 65 28 63 6f 6e 66 69  error_type(confi
3720: 67 29 20 3d 3d 20 43 4f 4e 46 49 47 5f 45 52 52  g) == CONFIG_ERR
3730: 5f 50 41 52 53 45 29 20 7b 0a 09 09 09 66 70 72  _PARSE) {....fpr
3740: 69 6e 74 66 20 28 73 74 64 65 72 72 2c 20 22 45  intf (stderr, "E
3750: 72 72 6f 72 20 70 61 72 73 69 6e 67 20 63 6f 6e  rror parsing con
3760: 66 69 67 20 66 69 6c 65 20 25 73 2c 20 6c 69 6e  fig file %s, lin
3770: 65 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 09 09 09  e %d: %s\n",....
3780: 09 63 6f 6e 66 69 67 5f 65 72 72 6f 72 5f 66 69  .config_error_fi
3790: 6c 65 28 63 6f 6e 66 69 67 29 2c 0a 09 09 09 09  le(config),.....
37a0: 63 6f 6e 66 69 67 5f 65 72 72 6f 72 5f 6c 69 6e  config_error_lin
37b0: 65 28 63 6f 6e 66 69 67 29 2c 0a 09 09 09 09 63  e(config),.....c
37c0: 6f 6e 66 69 67 5f 65 72 72 6f 72 5f 74 65 78 74  onfig_error_text
37d0: 28 63 6f 6e 66 69 67 29 29 3b 0a 09 09 7d 0a 09  (config));...}..
37e0: 09 69 66 20 28 63 6f 6e 66 69 67 5f 65 72 72 6f  .if (config_erro
37f0: 72 5f 74 79 70 65 28 63 6f 6e 66 69 67 29 20 3d  r_type(config) =
3800: 3d 20 43 4f 4e 46 49 47 5f 45 52 52 5f 46 49 4c  = CONFIG_ERR_FIL
3810: 45 5f 49 4f 29 20 7b 0a 09 09 09 66 70 72 69 6e  E_IO) {....fprin
3820: 74 66 20 28 73 74 64 65 72 72 2c 20 22 45 72 72  tf (stderr, "Err
3830: 6f 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 66 69  or reading confi
3840: 67 20 66 69 6c 65 3a 20 25 73 5c 6e 22 2c 0a 09  g file: %s\n",..
3850: 09 09 09 63 6f 6e 66 69 67 5f 65 72 72 6f 72 5f  ...config_error_
3860: 74 65 78 74 28 63 6f 6e 66 69 67 29 29 3b 0a 09  text(config));..
3870: 09 7d 0a 09 09 65 78 69 74 28 45 58 49 54 5f 46  .}...exit(EXIT_F
3880: 41 49 4c 55 52 45 29 3b 0a 09 7d 0a 0a 09 2f 2a  AILURE);..}.../*
3890: 20 74 68 65 72 65 20 61 72 65 20 64 65 66 61 75   there are defau
38a0: 6c 74 2c 20 73 6f 20 49 27 6d 20 6e 6f 74 20 63  lt, so I'm not c
38b0: 68 65 63 6b 69 6e 67 20 72 65 74 75 72 6e 20 76  hecking return v
38c0: 61 6c 75 65 73 2e 20 20 49 66 20 69 74 20 66 61  alues.  If it fa
38d0: 69 6c 73 2c 0a 09 20 2a 20 74 68 65 6e 20 77 65  ils,.. * then we
38e0: 27 6c 6c 20 6a 75 73 74 20 73 74 61 79 20 77 69  'll just stay wi
38f0: 74 68 20 74 68 65 20 64 65 66 61 75 6c 74 2c 20  th the default, 
3900: 77 68 61 74 65 76 65 72 20 74 68 61 74 20 6d 69  whatever that mi
3910: 67 68 74 20 62 65 2e 20 2a 2f 0a 09 63 6f 6e 66  ght be. */..conf
3920: 69 67 5f 6c 6f 6f 6b 75 70 5f 62 6f 6f 6c 28 63  ig_lookup_bool(c
3930: 6f 6e 66 69 67 2c 20 22 6f 70 74 69 6f 6e 73 2e  onfig, "options.
3940: 66 61 6c 6c 74 68 72 6f 75 67 68 61 63 63 65 70  fallthroughaccep
3950: 74 22 2c 20 26 63 6f 6e 66 2e 64 65 66 61 75 6c  t", &conf.defaul
3960: 74 5f 61 63 63 65 70 74 29 3b 0a 09 63 6f 6e 66  t_accept);..conf
3970: 69 67 5f 6c 6f 6f 6b 75 70 5f 62 6f 6f 6c 28 63  ig_lookup_bool(c
3980: 6f 6e 66 69 67 2c 20 22 6f 70 74 69 6f 6e 73 2e  onfig, "options.
3990: 61 6c 6c 6f 77 6e 6f 6e 70 6f 72 74 32 35 22 2c  allownonport25",
39a0: 20 26 63 6f 6e 66 2e 61 6c 6c 6f 77 5f 6e 6f 6e   &conf.allow_non
39b0: 32 35 29 3b 0a 09 63 6f 6e 66 69 67 5f 6c 6f 6f  25);..config_loo
39c0: 6b 75 70 5f 62 6f 6f 6c 28 63 6f 6e 66 69 67 2c  kup_bool(config,
39d0: 20 22 6f 70 74 69 6f 6e 73 2e 64 72 79 72 75 6e   "options.dryrun
39e0: 22 2c 20 26 63 6f 6e 66 2e 64 72 79 72 75 6e 29  ", &conf.dryrun)
39f0: 3b 0a 09 63 6f 6e 66 69 67 5f 6c 6f 6f 6b 75 70  ;..config_lookup
3a00: 5f 62 6f 6f 6c 28 63 6f 6e 66 69 67 2c 20 22 6f  _bool(config, "o
3a10: 70 74 69 6f 6e 73 2e 61 6c 6c 6f 77 6e 6f 6e 73  ptions.allownons
3a20: 79 6e 22 2c 20 26 63 6f 6e 66 2e 61 6c 6c 6f 77  yn", &conf.allow
3a30: 5f 6e 6f 6e 73 79 6e 29 3b 0a 09 63 6f 6e 66 69  _nonsyn);..confi
3a40: 67 5f 6c 6f 6f 6b 75 70 5f 62 6f 6f 6c 28 63 6f  g_lookup_bool(co
3a50: 6e 66 69 67 2c 20 22 6f 70 74 69 6f 6e 73 2e 71  nfig, "options.q
3a60: 75 69 65 74 22 2c 20 26 63 6f 6e 66 2e 71 75 69  uiet", &conf.qui
3a70: 65 74 29 3b 0a 09 63 6f 6e 66 69 67 5f 6c 6f 6f  et);..config_loo
3a80: 6b 75 70 5f 69 6e 74 28 63 6f 6e 66 69 67 2c 20  kup_int(config, 
3a90: 22 6f 70 74 69 6f 6e 73 2e 64 65 62 75 67 22 2c  "options.debug",
3aa0: 20 26 63 6f 6e 66 2e 64 65 62 75 67 29 3b 0a 0a   &conf.debug);..
3ab0: 23 69 66 64 65 66 20 55 53 45 5f 43 41 43 48 45  #ifdef USE_CACHE
3ac0: 0a 09 63 6f 6e 66 69 67 5f 6c 6f 6f 6b 75 70 5f  ..config_lookup_
3ad0: 69 6e 74 28 63 6f 6e 66 69 67 2c 20 22 63 61 63  int(config, "cac
3ae0: 68 65 2e 74 74 6c 22 2c 20 26 70 61 63 6b 65 74  he.ttl", &packet
3af0: 5f 63 61 63 68 65 5f 74 74 6c 29 3b 0a 0a 09 69  _cache_ttl);...i
3b00: 66 20 28 70 61 63 6b 65 74 5f 63 61 63 68 65 5f  f (packet_cache_
3b10: 74 74 6c 20 3c 20 30 29 20 7b 0a 09 09 70 61 63  ttl < 0) {...pac
3b20: 6b 65 74 5f 63 61 63 68 65 5f 74 74 6c 20 3d 20  ket_cache_ttl = 
3b30: 55 53 45 5f 43 41 43 48 45 5f 44 45 46 5f 54 54  USE_CACHE_DEF_TT
3b40: 4c 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64  L;...fprintf(std
3b50: 65 72 72 2c 20 22 63 6f 6e 66 69 67 20 63 61 63  err, "config cac
3b60: 68 65 20 54 54 4c 20 6e 65 67 61 74 69 76 65 20  he TTL negative 
3b70: 2d 20 75 73 69 6e 67 20 64 65 66 61 75 6c 74 22  - using default"
3b80: 29 3b 0a 09 7d 0a 0a 09 63 6f 6e 66 69 67 5f 6c  );..}...config_l
3b90: 6f 6f 6b 75 70 5f 69 6e 74 28 63 6f 6e 66 69 67  ookup_int(config
3ba0: 2c 20 22 63 61 63 68 65 2e 6c 65 6e 22 2c 20 26  , "cache.len", &
3bb0: 70 61 63 6b 65 74 5f 63 61 63 68 65 5f 6c 65 6e  packet_cache_len
3bc0: 29 3b 0a 0a 09 69 66 20 28 70 61 63 6b 65 74 5f  );...if (packet_
3bd0: 63 61 63 68 65 5f 6c 65 6e 20 3c 20 30 29 20 7b  cache_len < 0) {
3be0: 0a 09 09 70 61 63 6b 65 74 5f 63 61 63 68 65 5f  ...packet_cache_
3bf0: 6c 65 6e 20 3d 20 55 53 45 5f 43 41 43 48 45 5f  len = USE_CACHE_
3c00: 44 45 46 5f 4c 45 4e 3b 0a 09 09 66 70 72 69 6e  DEF_LEN;...fprin
3c10: 74 66 28 73 74 64 65 72 72 2c 20 22 63 6f 6e 66  tf(stderr, "conf
3c20: 69 67 20 73 69 7a 65 20 54 54 4c 20 6e 65 67 61  ig size TTL nega
3c30: 74 69 76 65 20 2d 20 75 73 69 6e 67 20 64 65 66  tive - using def
3c40: 61 75 6c 74 22 29 3b 0a 09 7d 0a 23 65 6e 64 69  ault");..}.#endi
3c50: 66 0a 0a 09 72 65 73 75 6c 74 20 3d 20 63 6f 6e  f...result = con
3c60: 66 69 67 5f 6c 6f 6f 6b 75 70 5f 73 74 72 69 6e  fig_lookup_strin
3c70: 67 28 63 6f 6e 66 69 67 2c 20 22 6c 6f 67 2e 66  g(config, "log.f
3c80: 61 63 69 6c 69 74 79 22 2c 20 26 66 61 63 73 74  acility", &facst
3c90: 72 29 3b 0a 09 69 20 3d 20 30 3b 0a 09 69 66 20  r);..i = 0;..if 
3ca0: 28 72 65 73 75 6c 74 20 3d 3d 20 43 4f 4e 46 49  (result == CONFI
3cb0: 47 5f 54 52 55 45 29 20 7b 0a 09 09 77 68 69 6c  G_TRUE) {...whil
3cc0: 65 20 28 26 66 61 63 65 6e 75 6d 5b 69 5d 20 21  e (&facenum[i] !
3cd0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
3ce0: 28 73 74 72 63 61 73 65 63 6d 70 28 66 61 63 65  (strcasecmp(face
3cf0: 6e 75 6d 5b 69 5d 2e 73 74 72 69 6e 67 2c 20 66  num[i].string, f
3d00: 61 63 73 74 72 29 20 3d 3d 20 30 29 20 7b 0a 09  acstr) == 0) {..
3d10: 09 09 09 63 6f 6e 66 2e 6c 6f 67 5f 66 61 63 69  ...conf.log_faci
3d20: 6c 69 74 79 20 3d 20 66 61 63 65 6e 75 6d 5b 69  lity = facenum[i
3d30: 5d 2e 6e 75 6d 3b 0a 09 09 09 09 62 72 65 61 6b  ].num;.....break
3d40: 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
3d50: 09 09 69 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  ..i++;....}...}.
3d60: 09 7d 0a 09 0a 09 63 6f 6e 66 69 67 5f 6c 6f 6f  .}....config_loo
3d70: 6b 75 70 5f 69 6e 74 28 63 6f 6e 66 69 67 2c 20  kup_int(config, 
3d80: 22 6f 70 74 69 6f 6e 73 2e 71 75 65 75 65 6e 6f  "options.queueno
3d90: 22 2c 20 26 63 6f 6e 66 2e 71 75 65 75 65 6e 6f  ", &conf.queueno
3da0: 29 3b 0a 09 0a 09 69 66 20 28 63 6f 6e 66 2e 71  );....if (conf.q
3db0: 75 65 75 65 6e 6f 20 3c 20 30 29 20 7b 0a 09 09  ueueno < 0) {...
3dc0: 63 6f 6e 66 2e 71 75 65 75 65 6e 6f 20 3d 20 31  conf.queueno = 1
3dd0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  ;...fprintf(stde
3de0: 72 72 2c 20 22 71 75 65 75 65 6e 6f 20 6e 65 67  rr, "queueno neg
3df0: 61 74 69 76 65 20 2d 20 75 73 69 6e 67 20 64 65  ative - using de
3e00: 66 61 75 6c 74 22 29 3b 0a 09 7d 0a 0a 09 63 6f  fault");..}...co
3e10: 6e 66 69 67 5f 73 65 74 74 69 6e 67 20 3d 20 63  nfig_setting = c
3e20: 6f 6e 66 69 67 5f 6c 6f 6f 6b 75 70 28 63 6f 6e  onfig_lookup(con
3e30: 66 69 67 2c 20 22 62 6c 61 63 6b 6c 69 73 74 62  fig, "blacklistb
3e40: 6c 22 29 3b 0a 09 69 66 20 28 63 6f 6e 66 69 67  l");..if (config
3e50: 5f 73 65 74 74 69 6e 67 20 21 3d 20 4e 55 4c 4c  _setting != NULL
3e60: 29 20 7b 0a 09 09 70 61 72 73 65 5f 63 6f 6e 66  ) {...parse_conf
3e70: 69 67 5f 62 6c 5f 6c 69 73 74 28 63 6f 6e 66 69  ig_bl_list(confi
3e80: 67 5f 73 65 74 74 69 6e 67 2c 20 54 59 50 45 5f  g_setting, TYPE_
3e90: 42 4c 41 43 4b 4c 49 53 54 42 4c 29 3b 0a 09 7d  BLACKLISTBL);..}
3ea0: 0a 09 63 6f 6e 66 69 67 5f 73 65 74 74 69 6e 67  ..config_setting
3eb0: 20 3d 20 63 6f 6e 66 69 67 5f 6c 6f 6f 6b 75 70   = config_lookup
3ec0: 28 63 6f 6e 66 69 67 2c 20 22 77 68 69 74 65 6c  (config, "whitel
3ed0: 69 73 74 62 6c 22 29 3b 0a 09 69 66 20 28 63 6f  istbl");..if (co
3ee0: 6e 66 69 67 5f 73 65 74 74 69 6e 67 20 21 3d 20  nfig_setting != 
3ef0: 4e 55 4c 4c 29 20 7b 0a 09 09 70 61 72 73 65 5f  NULL) {...parse_
3f00: 63 6f 6e 66 69 67 5f 62 6c 5f 6c 69 73 74 28 63  config_bl_list(c
3f10: 6f 6e 66 69 67 5f 73 65 74 74 69 6e 67 2c 20 54  onfig_setting, T
3f20: 59 50 45 5f 57 48 49 54 45 4c 49 53 54 42 4c 29  YPE_WHITELISTBL)
3f30: 3b 0a 09 7d 0a 09 63 6f 6e 66 69 67 5f 73 65 74  ;..}..config_set
3f40: 74 69 6e 67 20 3d 20 63 6f 6e 66 69 67 5f 6c 6f  ting = config_lo
3f50: 6f 6b 75 70 28 63 6f 6e 66 69 67 2c 20 22 62 6c  okup(config, "bl
3f60: 61 63 6b 6c 69 73 74 22 29 3b 0a 09 69 66 20 28  acklist");..if (
3f70: 63 6f 6e 66 69 67 5f 73 65 74 74 69 6e 67 20 21  config_setting !
3f80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 61 72 73  = NULL) {...pars
3f90: 65 5f 63 6f 6e 66 69 67 5f 62 6c 5f 6c 69 73 74  e_config_bl_list
3fa0: 28 63 6f 6e 66 69 67 5f 73 65 74 74 69 6e 67 2c  (config_setting,
3fb0: 20 54 59 50 45 5f 42 4c 41 43 4b 4c 49 53 54 29   TYPE_BLACKLIST)
3fc0: 3b 0a 09 7d 0a 09 63 6f 6e 66 69 67 5f 73 65 74  ;..}..config_set
3fd0: 74 69 6e 67 20 3d 20 63 6f 6e 66 69 67 5f 6c 6f  ting = config_lo
3fe0: 6f 6b 75 70 28 63 6f 6e 66 69 67 2c 20 22 77 68  okup(config, "wh
3ff0: 69 74 65 6c 69 73 74 22 29 3b 0a 09 69 66 20 28  itelist");..if (
4000: 63 6f 6e 66 69 67 5f 73 65 74 74 69 6e 67 20 21  config_setting !
4010: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 61 72 73  = NULL) {...pars
4020: 65 5f 63 6f 6e 66 69 67 5f 62 6c 5f 6c 69 73 74  e_config_bl_list
4030: 28 63 6f 6e 66 69 67 5f 73 65 74 74 69 6e 67 2c  (config_setting,
4040: 20 54 59 50 45 5f 57 48 49 54 45 4c 49 53 54 29   TYPE_WHITELIST)
4050: 3b 0a 09 7d 0a 7d 0a 0a 70 61 72 73 65 5f 63 6f  ;..}.}..parse_co
4060: 6e 66 69 67 5f 62 6c 5f 6c 69 73 74 28 63 6f 6e  nfig_bl_list(con
4070: 66 69 67 5f 73 65 74 74 69 6e 67 5f 74 20 2a 63  fig_setting_t *c
4080: 2c 20 69 6e 74 20 74 79 70 65 29 20 7b 0a 0a 09  , int type) {...
4090: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 5f 65 6e  struct config_en
40a0: 74 72 79 20 2a 63 65 2c 20 2a 74 6d 70 3b 0a 09  try *ce, *tmp;..
40b0: 69 6e 74 20 69 20 3d 20 30 2c 20 6c 65 6e 20 3d  int i = 0, len =
40c0: 20 30 3b 0a 09 63 68 61 72 20 2a 73 65 74 74 69   0;..char *setti
40d0: 6e 67 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ng;.#ifdef HAVE_
40e0: 46 49 52 45 44 4e 53 0a 09 73 69 7a 65 5f 74 20  FIREDNS..size_t 
40f0: 62 6c 61 63 6b 6c 69 73 74 6c 65 6e 20 3d 20 30  blacklistlen = 0
4100: 3b 0a 23 65 6e 64 69 66 0a 0a 09 6c 65 6e 20 3d  ;.#endif...len =
4110: 20 63 6f 6e 66 69 67 5f 73 65 74 74 69 6e 67 5f   config_setting_
4120: 6c 65 6e 67 74 68 28 63 29 3b 0a 09 77 68 69 6c  length(c);..whil
4130: 65 20 28 69 20 3c 20 6c 65 6e 29 20 7b 0a 09 09  e (i < len) {...
4140: 73 65 74 74 69 6e 67 20 3d 20 63 6f 6e 66 69 67  setting = config
4150: 5f 73 65 74 74 69 6e 67 5f 67 65 74 5f 73 74 72  _setting_get_str
4160: 69 6e 67 5f 65 6c 65 6d 28 63 2c 20 69 29 3b 0a  ing_elem(c, i);.
4170: 09 09 69 66 20 28 73 65 74 74 69 6e 67 20 3d 3d  ..if (setting ==
4180: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61   NULL) {....brea
4190: 6b 3b 0a 09 09 7d 0a 09 09 63 65 20 3d 20 6d 61  k;...}...ce = ma
41a0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 74 72 75  lloc(sizeof(stru
41b0: 63 74 20 63 6f 6e 66 69 67 5f 65 6e 74 72 79 29  ct config_entry)
41c0: 29 3b 0a 09 09 69 66 20 28 63 65 20 3d 3d 20 4e  );...if (ce == N
41d0: 55 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 73 68 6f  ULL) {..../* sho
41e0: 75 6c 64 6e 27 74 20 68 61 70 70 65 6e 2e 2e 2e  uldn't happen...
41f0: 20 2a 2f 0a 09 09 09 66 70 72 69 6e 74 66 28 73   */....fprintf(s
4200: 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64 20 74  tderr, "Failed t
4210: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
4220: 79 20 66 6f 72 20 63 65 20 73 74 72 75 63 74 5c  y for ce struct\
4230: 6e 22 29 3b 0a 09 09 09 65 78 69 74 28 45 58 49  n");....exit(EXI
4240: 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09 09 7d 0a  T_FAILURE);...}.
4250: 0a 09 09 63 65 2d 3e 69 6e 64 65 78 20 3d 20 69  ...ce->index = i
4260: 3b 0a 09 09 63 65 2d 3e 73 74 72 69 6e 67 20 3d  ;...ce->string =
4270: 20 28 63 68 61 72 20 2a 29 73 74 72 64 75 70 28   (char *)strdup(
4280: 73 65 74 74 69 6e 67 29 3b 0a 09 09 63 65 2d 3e  setting);...ce->
4290: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 23 69 66  next = NULL;.#if
42a0: 64 65 66 20 48 41 56 45 5f 46 49 52 45 44 4e 53  def HAVE_FIREDNS
42b0: 0a 09 09 62 6c 61 63 6b 6c 69 73 74 6c 65 6e 20  ...blacklistlen 
42c0: 3d 20 73 74 72 6c 65 6e 28 63 65 2d 3e 73 74 72  = strlen(ce->str
42d0: 69 6e 67 29 3b 0a 09 09 69 66 20 28 63 65 2d 3e  ing);...if (ce->
42e0: 73 74 72 69 6e 67 5b 62 6c 61 63 6b 6c 69 73 74  string[blacklist
42f0: 6c 65 6e 20 2d 20 31 5d 20 3d 3d 20 27 2e 27 29  len - 1] == '.')
4300: 20 7b 0a 09 09 09 63 65 2d 3e 73 74 72 69 6e 67   {....ce->string
4310: 5b 62 6c 61 63 6b 6c 69 73 74 6c 65 6e 20 2d 20  [blacklistlen - 
4320: 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 23  1] = '\0';...}.#
4330: 65 6e 64 69 66 0a 0a 09 09 69 2b 2b 3b 0a 0a 09  endif....i++;...
4340: 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b  .switch (type) {
4350: 0a 09 09 09 63 61 73 65 20 54 59 50 45 5f 42 4c  ....case TYPE_BL
4360: 41 43 4b 4c 49 53 54 42 4c 3a 0a 09 09 09 09 69  ACKLISTBL:.....i
4370: 66 20 28 63 6f 6e 66 2e 62 6c 61 63 6b 6c 69 73  f (conf.blacklis
4380: 74 62 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tbl == NULL) {..
4390: 09 09 09 09 63 6f 6e 66 2e 62 6c 61 63 6b 6c 69  ....conf.blackli
43a0: 73 74 62 6c 20 3d 20 63 65 3b 0a 09 09 09 09 09  stbl = ce;......
43b0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 20  continue;.....} 
43c0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 74 6d 70 20  else {......tmp 
43d0: 3d 20 63 6f 6e 66 2e 62 6c 61 63 6b 6c 69 73 74  = conf.blacklist
43e0: 62 6c 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  bl;.....}.....br
43f0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 54 59 50  eak;....case TYP
4400: 45 5f 57 48 49 54 45 4c 49 53 54 42 4c 3a 0a 09  E_WHITELISTBL:..
4410: 09 09 09 69 66 20 28 63 6f 6e 66 2e 77 68 69 74  ...if (conf.whit
4420: 65 6c 69 73 74 62 6c 20 3d 3d 20 4e 55 4c 4c 29  elistbl == NULL)
4430: 20 7b 0a 09 09 09 09 09 63 6f 6e 66 2e 77 68 69   {......conf.whi
4440: 74 65 6c 69 73 74 62 6c 20 3d 20 63 65 3b 0a 09  telistbl = ce;..
4450: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
4460: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
4470: 74 6d 70 20 3d 20 63 6f 6e 66 2e 77 68 69 74 65  tmp = conf.white
4480: 6c 69 73 74 62 6c 3b 0a 09 09 09 09 7d 0a 09 09  listbl;.....}...
4490: 09 63 61 73 65 20 54 59 50 45 5f 42 4c 41 43 4b  .case TYPE_BLACK
44a0: 4c 49 53 54 3a 0a 09 09 09 09 66 70 72 69 6e 74  LIST:.....fprint
44b0: 66 28 73 74 64 65 72 72 2c 20 22 67 6f 74 20 25  f(stderr, "got %
44c0: 73 20 66 6f 72 20 62 6c 61 63 6b 6c 69 73 74 5c  s for blacklist\
44d0: 6e 22 2c 20 63 65 2d 3e 73 74 72 69 6e 67 29 3b  n", ce->string);
44e0: 0a 09 09 09 09 69 66 20 28 70 61 72 73 65 5f 63  .....if (parse_c
44f0: 69 64 72 28 63 65 29 20 3d 3d 20 2d 31 29 20 7b  idr(ce) == -1) {
4500: 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28 73 74  ......fprintf(st
4510: 64 65 72 72 2c 20 22 45 72 72 6f 72 20 70 61 72  derr, "Error par
4520: 73 69 6e 67 20 43 49 44 52 20 69 6e 20 25 73 2c  sing CIDR in %s,
4530: 20 69 67 6e 6f 72 69 6e 67 5c 6e 22 2c 20 63 65   ignoring\n", ce
4540: 2d 3e 73 74 72 69 6e 67 29 3b 0a 09 09 09 09 09  ->string);......
4550: 66 72 65 65 28 63 65 2d 3e 73 74 72 69 6e 67 29  free(ce->string)
4560: 3b 0a 09 09 09 09 09 66 72 65 65 28 63 65 29 3b  ;......free(ce);
4570: 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
4580: 09 09 09 09 7d 0a 09 09 09 09 69 66 20 28 63 6f  ....}.....if (co
4590: 6e 66 2e 62 6c 61 63 6b 6c 69 73 74 20 3d 3d 20  nf.blacklist == 
45a0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 63 6f 6e  NULL) {......con
45b0: 66 2e 62 6c 61 63 6b 6c 69 73 74 20 3d 20 63 65  f.blacklist = ce
45c0: 3b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
45d0: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
45e0: 09 09 09 74 6d 70 20 3d 20 63 6f 6e 66 2e 62 6c  ...tmp = conf.bl
45f0: 61 63 6b 6c 69 73 74 3b 0a 09 09 09 09 7d 0a 09  acklist;.....}..
4600: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
4610: 65 20 54 59 50 45 5f 57 48 49 54 45 4c 49 53 54  e TYPE_WHITELIST
4620: 3a 0a 09 09 09 09 69 66 20 28 70 61 72 73 65 5f  :.....if (parse_
4630: 63 69 64 72 28 63 65 29 20 3d 3d 20 2d 31 29 20  cidr(ce) == -1) 
4640: 7b 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28 73  {......fprintf(s
4650: 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 70 61  tderr, "Error pa
4660: 72 73 69 6e 67 20 43 49 44 52 20 69 6e 20 25 73  rsing CIDR in %s
4670: 2c 20 69 67 6e 6f 72 69 6e 67 5c 6e 22 2c 20 63  , ignoring\n", c
4680: 65 2d 3e 73 74 72 69 6e 67 29 3b 0a 09 09 09 09  e->string);.....
4690: 09 66 72 65 65 28 63 65 2d 3e 73 74 72 69 6e 67  .free(ce->string
46a0: 29 3b 0a 09 09 09 09 09 66 72 65 65 28 63 65 29  );......free(ce)
46b0: 3b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
46c0: 0a 09 09 09 09 7d 0a 09 09 09 09 69 66 20 28 63  .....}.....if (c
46d0: 6f 6e 66 2e 77 68 69 74 65 6c 69 73 74 20 3d 3d  onf.whitelist ==
46e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 63 6f   NULL) {......co
46f0: 6e 66 2e 77 68 69 74 65 6c 69 73 74 20 3d 20 63  nf.whitelist = c
4700: 65 3b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  e;......continue
4710: 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
4720: 09 09 09 09 74 6d 70 20 3d 20 63 6f 6e 66 2e 77  ....tmp = conf.w
4730: 68 69 74 65 6c 69 73 74 3b 0a 09 09 09 09 7d 0a  hitelist;.....}.
4740: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 09 0a  ....break;...}..
4750: 0a 09 09 77 68 69 6c 65 20 28 74 6d 70 2d 3e 6e  ...while (tmp->n
4760: 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ext != NULL) {..
4770: 09 09 74 6d 70 20 3d 20 74 6d 70 2d 3e 6e 65 78  ..tmp = tmp->nex
4780: 74 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 2d 3e 6e  t;...}....tmp->n
4790: 65 78 74 20 3d 20 63 65 3b 0a 0a 09 7d 0a 7d 0a  ext = ce;...}.}.
47a0: 09 0a 2f 2a 0a 20 2a 20 53 59 4e 4f 50 53 49 53  ../*. * SYNOPSIS
47b0: 3a 0a 20 2a 20 20 20 76 6f 69 64 20 70 61 72 73  :. *   void pars
47c0: 65 5f 61 72 67 75 6d 65 6e 74 73 28 0a 20 2a 20  e_arguments(. * 
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 69 6e 74 20 61 72 67 63 2c         int argc,
47f0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
4800: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
4810: 2a 2a 61 72 67 76 0a 20 2a 20 20 20 20 20 20 20  **argv. *       
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
4840: 54 53 3a 0a 20 2a 20 20 20 69 6e 74 20 61 72 67  TS:. *   int arg
4850: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
4860: 20 20 20 20 20 20 22 41 72 67 75 6d 65 6e 74 20        "Argument 
4870: 43 6f 75 6e 74 2c 22 20 6e 75 6d 62 65 72 20 6f  Count," number o
4880: 66 20 76 61 6c 69 64 20 65 6c 65 6d 65 6e 74 73  f valid elements
4890: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48b0: 20 20 20 69 6e 20 74 68 65 20 22 61 72 67 76 22     in the "argv"
48c0: 20 61 72 72 61 79 20 74 6f 6f 2e 0a 20 2a 20 20   array too.. *  
48d0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
48f0: 72 67 75 6d 65 6e 74 20 56 65 63 74 6f 72 2c 22  rgument Vector,"
4900: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
4910: 72 73 20 74 6f 20 74 68 65 0a 20 2a 20 20 20 20  rs to the. *    
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4930: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 75              argu
4940: 6d 65 6e 74 73 20 74 6f 20 62 65 20 63 6f 6e 73  ments to be cons
4950: 69 64 65 72 65 64 20 66 6f 72 20 70 72 6f 63 65  idered for proce
4960: 73 73 69 6e 67 2e 0a 20 2a 0a 20 2a 20 52 45 54  ssing.. *. * RET
4970: 55 52 4e 20 56 41 4c 55 45 3a 0a 20 2a 20 20 20  URN VALUE:. *   
4980: 28 6e 6f 6e 65 29 0a 20 2a 0a 20 2a 20 4e 4f 54  (none). *. * NOT
4990: 45 53 3a 0a 20 2a 20 20 20 55 73 65 20 67 65 74  ES:. *   Use get
49a0: 6f 70 74 28 29 20 74 6f 20 70 61 72 73 65 20 70  opt() to parse p
49b0: 61 73 73 65 64 20 73 68 6f 72 74 20 61 72 67 75  assed short argu
49c0: 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 73 68 6f  ments.  This sho
49d0: 75 6c 64 20 62 65 20 64 6f 6e 65 20 61 66 74 65  uld be done afte
49e0: 72 0a 20 2a 20 20 20 70 61 72 73 69 6e 67 20 74  r. *   parsing t
49f0: 68 65 20 63 6f 6e 66 69 67 20 66 69 6c 65 2c 20  he config file, 
4a00: 62 65 63 61 75 73 65 20 77 65 20 6d 69 67 68 74  because we might
4a10: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
4a20: 65 20 73 6f 6d 65 20 6f 66 20 69 74 73 0a 20 2a  e some of its. *
4a30: 20 20 20 73 65 74 74 69 6e 67 73 2e 20 20 57 65     settings.  We
4a40: 20 63 61 6e 6e 6f 74 20 72 65 74 75 72 6e 20 73   cannot return s
4a50: 75 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65  ucess or failure
4a60: 2c 20 73 6f 20 75 70 6f 6e 20 66 61 69 6c 75 72  , so upon failur
4a70: 65 20 77 65 20 73 68 6f 75 6c 64 0a 20 2a 20 20  e we should. *  
4a80: 20 61 62 6f 72 74 20 74 68 65 20 70 72 6f 67 72   abort the progr
4a90: 61 6d 2e 0a 20 2a 0a 20 2a 2f 0a 76 6f 69 64 20  am.. *. */.void 
4aa0: 70 61 72 73 65 5f 61 72 67 75 6d 65 6e 74 73 28  parse_arguments(
4ab0: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
4ac0: 2a 61 72 67 76 29 20 7b 0a 09 69 6e 74 20 63 68  *argv) {..int ch
4ad0: 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 68 20 3d  ;...while ((ch =
4ae0: 20 67 65 74 6f 70 74 28 61 72 67 63 2c 20 61 72   getopt(argc, ar
4af0: 67 76 2c 20 22 71 56 64 22 29 29 20 21 3d 20 2d  gv, "qVd")) != -
4b00: 31 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 63  1) {...switch (c
4b10: 68 29 20 7b 0a 09 09 09 63 61 73 65 20 27 71 27  h) {....case 'q'
4b20: 3a 0a 09 09 09 09 63 6f 6e 66 2e 71 75 69 65 74  :.....conf.quiet
4b30: 20 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b   = 1;.....break;
4b40: 0a 09 09 09 63 61 73 65 20 27 56 27 3a 0a 09 09  ....case 'V':...
4b50: 09 09 70 72 69 6e 74 66 28 22 50 61 63 6b 65 74  ..printf("Packet
4b60: 42 4c 20 76 65 72 73 69 6f 6e 20 25 73 5c 6e 22  BL version %s\n"
4b70: 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
4b80: 4e 29 3b 0a 09 09 09 09 65 78 69 74 28 45 58 49  N);.....exit(EXI
4b90: 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 09 09 09  T_SUCCESS);.....
4ba0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
4bb0: 64 27 3a 0a 09 09 09 09 63 6f 6e 66 2e 64 65 62  d':.....conf.deb
4bc0: 75 67 2b 2b 3b 0a 09 09 09 09 62 72 65 61 6b 3b  ug++;.....break;
4bd0: 0a 09 09 09 63 61 73 65 20 27 3f 27 3a 0a 09 09  ....case '?':...
4be0: 09 63 61 73 65 20 27 3a 27 3a 0a 09 09 09 64 65  .case ':':....de
4bf0: 66 61 75 6c 74 3a 0a 09 09 09 09 65 78 69 74 28  fault:.....exit(
4c00: 45 58 49 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09  EXIT_FAILURE);..
4c10: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
4c20: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
4c30: 0a 20 2a 20 53 59 4e 4f 50 53 49 53 3a 0a 20 2a  . * SYNOPSIS:. *
4c40: 20 20 20 69 6e 74 20 70 61 72 73 65 5f 63 69 64     int parse_cid
4c50: 72 28 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  r(. *           
4c60: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 63 6f         struct co
4c70: 6e 66 69 67 5f 65 6e 74 72 79 20 2a 63 65 0a 20  nfig_entry *ce. 
4c80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
4c90: 20 20 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d    );. *. * ARGUM
4ca0: 45 4e 54 53 3a 0a 20 2a 20 20 20 73 74 72 75 63  ENTS:. *   struc
4cb0: 74 20 63 6f 6e 66 69 67 5f 65 6e 74 72 79 20 2a  t config_entry *
4cc0: 63 65 20 20 20 20 20 20 53 74 72 75 63 74 75 72  ce      Structur
4cd0: 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  e to be filled i
4ce0: 6e 2c 20 2d 3e 73 74 72 69 6e 67 20 6d 75 73 74  n, ->string must
4cf0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 62 65 20 73 75 70 70 6c 69 65 64 2e 0a     be supplied..
4d20: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
4d30: 55 45 3a 0a 20 2a 20 20 20 4f 6e 20 73 75 63 63  UE:. *   On succ
4d40: 65 73 73 20 30 20 69 73 20 72 65 74 75 72 6e 65  ess 0 is returne
4d50: 64 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  d, non-zero is r
4d60: 65 74 75 72 6e 65 64 20 6f 6e 20 65 72 72 6f 72  eturned on error
4d70: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 3a 0a 20  .. *. * NOTES:. 
4d80: 2a 20 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *   This routine
4d90: 20 69 73 20 72 61 74 68 65 72 20 74 6f 72 74 75   is rather tortu
4da0: 72 65 64 2c 20 62 75 74 20 69 74 20 77 6f 72 6b  red, but it work
4db0: 73 20 61 6e 64 20 69 73 20 62 65 6c 69 65 76 65  s and is believe
4dc0: 64 0a 20 2a 20 20 20 63 6f 72 72 65 63 74 2e 20  d. *   correct. 
4dd0: 20 50 6c 65 61 73 65 20 64 6f 6e 27 74 20 6d 65   Please don't me
4de0: 73 73 20 77 69 74 68 20 69 74 20 77 69 74 68 6f  ss with it witho
4df0: 75 74 20 61 20 67 6f 6f 64 20 72 65 61 73 6f 6e  ut a good reason
4e00: 2e 0a 20 2a 0a 20 2a 2f 0a 69 6e 74 20 70 61 72  .. *. */.int par
4e10: 73 65 5f 63 69 64 72 28 73 74 72 75 63 74 20 63  se_cidr(struct c
4e20: 6f 6e 66 69 67 5f 65 6e 74 72 79 20 2a 63 65 29  onfig_entry *ce)
4e30: 20 7b 0a 0a 09 69 6e 74 20 73 65 70 20 3d 20 30   {...int sep = 0
4e40: 3b 09 09 09 2f 2f 20 77 68 69 63 68 20 73 65 70  ;...// which sep
4e50: 61 72 61 74 6f 72 20 77 65 27 72 65 20 6f 6e 2e  arator we're on.
4e60: 0a 09 69 6e 74 20 69 20 3d 20 30 3b 0a 09 63 68  ..int i = 0;..ch
4e70: 61 72 20 2a 63 6f 75 6e 74 65 72 2c 20 2a 63 31  ar *counter, *c1
4e80: 2c 20 2a 6e 75 6d 70 74 72 3b 0a 09 63 68 61 72  , *numptr;..char
4e90: 20 6e 75 6d 62 65 72 5b 42 55 46 46 45 52 53 49   number[BUFFERSI
4ea0: 5a 45 5d 3b 0a 0a 09 69 66 20 28 63 65 20 3d 3d  ZE];...if (ce ==
4eb0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
4ec0: 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 63 31 20 3d 20  n -1;..}...c1 = 
4ed0: 63 65 2d 3e 73 74 72 69 6e 67 3b 20 2f 2f 20 69  ce->string; // i
4ee0: 6e 69 74 69 61 6c 69 7a 65 20 73 74 61 74 65 20  nitialize state 
4ef0: 63 6f 75 6e 74 65 72 0a 0a 09 66 6f 72 20 28 63  counter...for (c
4f00: 6f 75 6e 74 65 72 20 3d 20 63 65 2d 3e 73 74 72  ounter = ce->str
4f10: 69 6e 67 3b 20 0a 09 09 09 28 63 6f 75 6e 74 65  ing; ....(counte
4f20: 72 20 2d 20 63 65 2d 3e 73 74 72 69 6e 67 29 20  r - ce->string) 
4f30: 3c 20 73 74 72 6c 65 6e 28 63 65 2d 3e 73 74 72  < strlen(ce->str
4f40: 69 6e 67 29 3b 20 0a 09 09 09 63 6f 75 6e 74 65  ing); ....counte
4f50: 72 2b 2b 29 20 7b 0a 09 09 73 77 69 74 63 68 20  r++) {...switch 
4f60: 28 2a 63 6f 75 6e 74 65 72 29 20 7b 0a 09 09 09  (*counter) {....
4f70: 63 61 73 65 20 27 2e 27 3a 0a 09 09 09 63 61 73  case '.':....cas
4f80: 65 20 27 2f 27 3a 0a 09 09 09 09 2f 2f 20 73 65  e '/':.....// se
4f90: 70 61 72 61 74 6f 72 0a 09 09 09 09 73 74 72 6e  parator.....strn
4fa0: 63 70 79 28 6e 75 6d 62 65 72 2c 20 63 31 2c 20  cpy(number, c1, 
4fb0: 28 69 6e 74 29 28 63 6f 75 6e 74 65 72 20 2d 20  (int)(counter - 
4fc0: 63 31 29 29 3b 0a 09 09 09 09 6e 75 6d 62 65 72  c1));.....number
4fd0: 5b 28 69 6e 74 29 28 63 6f 75 6e 74 65 72 20 2d  [(int)(counter -
4fe0: 20 63 31 29 5d 20 3d 20 27 5c 30 27 3b 0a 09 09   c1)] = '\0';...
4ff0: 09 09 69 20 3d 20 61 74 6f 69 28 6e 75 6d 62 65  ..i = atoi(numbe
5000: 72 29 3b 0a 09 09 09 09 73 77 69 74 63 68 28 73  r);.....switch(s
5010: 65 70 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20  ep) {......case 
5020: 30 3a 0a 09 09 09 09 09 09 6e 75 6d 70 74 72 20  0:.......numptr 
5030: 3d 20 26 63 65 2d 3e 69 70 2e 62 31 3b 0a 09 09  = &ce->ip.b1;...
5040: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
5050: 63 61 73 65 20 31 3a 0a 09 09 09 09 09 09 6e 75  case 1:.......nu
5060: 6d 70 74 72 20 3d 20 26 63 65 2d 3e 69 70 2e 62  mptr = &ce->ip.b
5070: 32 3b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  2;.......break;.
5080: 09 09 09 09 09 63 61 73 65 20 32 3a 0a 09 09 09  .....case 2:....
5090: 09 09 09 6e 75 6d 70 74 72 20 3d 20 26 63 65 2d  ...numptr = &ce-
50a0: 3e 69 70 2e 62 33 3b 0a 09 09 09 09 09 09 62 72  >ip.b3;.......br
50b0: 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 33  eak;......case 3
50c0: 3a 0a 09 09 09 09 09 09 6e 75 6d 70 74 72 20 3d  :.......numptr =
50d0: 20 26 63 65 2d 3e 69 70 2e 62 34 3b 0a 09 09 09   &ce->ip.b4;....
50e0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64  ...break;......d
50f0: 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 2f 2a  efault:......./*
5100: 20 73 68 6f 75 6c 64 6e 27 74 20 68 61 70 70 65   shouldn't happe
5110: 6e 2e 0a 09 09 09 09 09 09 46 49 58 4d 45 3a 20  n........FIXME: 
5120: 61 64 64 20 65 72 72 6f 72 20 2a 2f 0a 09 09 09  add error */....
5130: 09 09 09 3b 0a 09 09 09 09 09 09 0a 09 09 09 09  ...;............
5140: 7d 0a 09 09 09 09 63 65 2d 3e 69 70 2e 62 31 20  }.....ce->ip.b1 
5150: 3d 20 69 3b 0a 09 09 09 09 69 66 20 28 49 4e 56  = i;.....if (INV
5160: 41 4c 49 44 5f 4f 43 54 45 54 28 2a 6e 75 6d 70  ALID_OCTET(*nump
5170: 74 72 29 29 20 7b 0a 09 09 09 09 09 72 65 74 75  tr)) {......retu
5180: 72 6e 20 2d 31 3b 0a 09 09 09 09 7d 0a 09 09 09  rn -1;.....}....
5190: 09 73 65 70 2b 2b 3b 0a 09 09 09 09 63 31 20 3d  .sep++;.....c1 =
51a0: 20 63 6f 75 6e 74 65 72 20 2b 20 31 3b 0a 09 09   counter + 1;...
51b0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
51c0: 20 27 30 27 3a 0a 09 09 09 63 61 73 65 20 27 31   '0':....case '1
51d0: 27 3a 0a 09 09 09 63 61 73 65 20 27 32 27 3a 0a  ':....case '2':.
51e0: 09 09 09 63 61 73 65 20 27 33 27 3a 0a 09 09 09  ...case '3':....
51f0: 63 61 73 65 20 27 34 27 3a 0a 09 09 09 63 61 73  case '4':....cas
5200: 65 20 27 35 27 3a 0a 09 09 09 63 61 73 65 20 27  e '5':....case '
5210: 36 27 3a 0a 09 09 09 63 61 73 65 20 27 37 27 3a  6':....case '7':
5220: 0a 09 09 09 63 61 73 65 20 27 38 27 3a 0a 09 09  ....case '8':...
5230: 09 63 61 73 65 20 27 39 27 3a 0a 09 09 09 09 63  .case '9':.....c
5240: 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 64 65 66 61  ontinue;....defa
5250: 75 6c 74 3a 0a 09 09 09 09 2f 2f 20 74 68 69 73  ult:.....// this
5260: 20 63 68 61 72 61 63 74 65 72 20 64 6f 65 73 6e   character doesn
5270: 27 74 20 62 65 6c 6f 6e 67 20 68 65 72 65 2e 0a  't belong here..
5280: 09 09 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09  ....return -1;..
5290: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
52a0: 09 09 0a 09 73 74 72 6e 63 70 79 20 28 6e 75 6d  ....strncpy (num
52b0: 62 65 72 2c 20 63 31 2c 20 28 69 6e 74 29 28 63  ber, c1, (int)(c
52c0: 6f 75 6e 74 65 72 20 2d 20 63 31 29 29 3b 0a 09  ounter - c1));..
52d0: 6e 75 6d 62 65 72 5b 28 69 6e 74 29 28 63 6f 75  number[(int)(cou
52e0: 6e 74 65 72 20 2d 20 63 31 29 5d 20 3d 20 27 5c  nter - c1)] = '\
52f0: 30 27 3b 0a 09 63 65 2d 3e 63 69 64 72 2e 6e 65  0';..ce->cidr.ne
5300: 74 77 6f 72 6b 20 3d 20 61 74 6f 69 28 6e 75 6d  twork = atoi(num
5310: 62 65 72 29 3b 0a 0a 09 63 65 2d 3e 63 69 64 72  ber);...ce->cidr
5320: 2e 70 72 6f 63 65 73 73 65 64 20 3d 20 30 3b 0a  .processed = 0;.
5330: 09 63 65 2d 3e 63 69 64 72 2e 70 72 6f 63 65 73  .ce->cidr.proces
5340: 73 65 64 20 3d 20 30 78 66 66 66 66 66 66 66 66  sed = 0xffffffff
5350: 20 3c 3c 20 28 33 32 20 2d 20 63 65 2d 3e 63 69   << (32 - ce->ci
5360: 64 72 2e 6e 65 74 77 6f 72 6b 29 3b 0a 0a 09 63  dr.network);...c
5370: 65 2d 3e 63 69 64 72 2e 69 70 20 3d 20 30 3b 0a  e->cidr.ip = 0;.
5380: 09 63 65 2d 3e 63 69 64 72 2e 69 70 20 3d 20 63  .ce->cidr.ip = c
5390: 65 2d 3e 69 70 2e 62 31 20 3c 3c 20 32 34 3b 0a  e->ip.b1 << 24;.
53a0: 09 63 65 2d 3e 63 69 64 72 2e 69 70 20 7c 3d 20  .ce->cidr.ip |= 
53b0: 63 65 2d 3e 69 70 2e 62 32 20 3c 3c 20 31 36 3b  ce->ip.b2 << 16;
53c0: 0a 09 63 65 2d 3e 63 69 64 72 2e 69 70 20 7c 3d  ..ce->cidr.ip |=
53d0: 20 63 65 2d 3e 69 70 2e 62 33 20 3c 3c 20 38 3b   ce->ip.b3 << 8;
53e0: 0a 09 63 65 2d 3e 63 69 64 72 2e 69 70 20 7c 3d  ..ce->cidr.ip |=
53f0: 20 63 65 2d 3e 69 70 2e 62 34 3b 0a 0a 09 2f 2a   ce->ip.b4;.../*
5400: 20 4d 61 73 6b 20 6f 75 74 20 74 68 65 20 62 69   Mask out the bi
5410: 74 73 20 74 68 61 74 20 61 72 65 6e 27 74 20 69  ts that aren't i
5420: 6e 20 74 68 65 20 6e 65 74 77 6f 72 6b 20 69 6e  n the network in
5430: 20 63 69 64 72 2e 69 70 2e 0a 09 20 2a 20 57 65   cidr.ip... * We
5440: 20 64 6f 6e 27 74 20 63 61 72 65 20 61 62 6f 75   don't care abou
5450: 74 20 74 68 65 6d 20 61 6e 64 20 74 68 65 79 27  t them and they'
5460: 6c 6c 20 6a 75 73 74 20 63 6f 6e 66 75 73 65 20  ll just confuse 
5470: 74 68 65 20 69 73 73 75 65 2e 20 2a 2f 0a 09 63  the issue. */..c
5480: 65 2d 3e 63 69 64 72 2e 69 70 20 26 3d 20 63 65  e->cidr.ip &= ce
5490: 2d 3e 63 69 64 72 2e 70 72 6f 63 65 73 73 65 64  ->cidr.processed
54a0: 3b 0a 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a 7d  ;...return 0;..}
54b0: 0a 0a 2f 2a 0a 20 2a 20 74 68 69 73 20 72 6f 75  ../*. * this rou
54c0: 74 69 6e 65 20 69 73 6e 27 74 20 6e 65 63 65 73  tine isn't neces
54d0: 73 61 72 79 20 72 69 67 68 74 20 6e 6f 77 2e 0a  sary right now..
54e0: 69 6e 74 20 76 61 6c 69 64 61 74 65 5f 62 6c 61  int validate_bla
54f0: 63 6b 6c 69 73 74 28 63 68 61 72 20 2a 73 74 72  cklist(char *str
5500: 29 20 7b 0a 0a 09 73 74 72 75 63 74 20 68 6f 73  ) {...struct hos
5510: 74 65 6e 74 20 2a 68 6f 73 74 3b 0a 0a 09 61 73  tent *host;...as
5520: 73 65 72 74 28 73 74 72 20 21 3d 20 4e 55 4c 4c  sert(str != NULL
5530: 29 3b 0a 0a 09 68 6f 73 74 20 3d 20 67 65 74 68  );...host = geth
5540: 6f 73 74 62 79 6e 61 6d 65 28 73 74 72 29 3b 0a  ostbyname(str);.
5550: 0a 09 69 66 20 28 68 6f 73 74 20 3d 3d 20 4e 55  ..if (host == NU
5560: 4c 4c 20 26 26 20 68 5f 65 72 72 6e 6f 20 21 3d  LL && h_errno !=
5570: 20 4e 45 54 44 42 5f 53 55 43 43 45 53 53 29 20   NETDB_SUCCESS) 
5580: 7b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09  {...return -1;..
5590: 7d 0a 09 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d  }....return 0;.}
55a0: 0a 2a 2f 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 4f 50  .*/../*. * SYNOP
55b0: 53 49 53 3a 0a 20 2a 20 20 20 69 6e 74 20 63 68  SIS:. *   int ch
55c0: 65 63 6b 5f 70 61 63 6b 65 74 5f 64 6e 73 62 6c  eck_packet_dnsbl
55d0: 28 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  (. *            
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
55f0: 6e 73 74 20 73 74 72 75 63 74 20 70 61 63 6b 65  nst struct packe
5600: 74 5f 69 6e 66 6f 20 0a 20 2a 20 20 20 20 20 20  t_info . *      
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69      struct confi
5630: 67 5f 65 6e 74 72 79 20 2a 6c 69 73 74 0a 20 2a  g_entry *list. *
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 2a 0a 20           );. *. 
5660: 2a 20 41 52 47 55 4d 45 4e 54 53 3a 0a 20 2a 20  * ARGUMENTS:. * 
5670: 20 20 73 74 72 75 63 74 20 70 61 63 6b 65 74 5f    struct packet_
5680: 69 6e 66 6f 20 2a 69 70 20 20 20 20 20 20 20 49  info *ip       I
5690: 50 20 61 64 64 72 65 73 73 20 64 61 74 61 20 74  P address data t
56a0: 6f 20 63 68 65 63 6b 20 69 6e 20 44 4e 53 20 52  o check in DNS R
56b0: 42 4c 2e 0a 20 2a 20 20 20 73 74 72 75 63 74 20  BL.. *   struct 
56c0: 63 6f 6e 66 69 67 5f 65 6e 74 72 79 20 2a 6c 69  config_entry *li
56d0: 73 74 20 20 20 20 43 6f 6e 66 69 67 75 72 65 64  st    Configured
56e0: 20 44 4e 53 20 52 42 4c 20 74 6f 20 63 68 65 63   DNS RBL to chec
56f0: 6b 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  k.. *. * RETURN 
5700: 56 41 4c 55 45 3a 0a 20 2a 20 20 20 30 20 69 73  VALUE:. *   0 is
5710: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
5720: 20 22 69 70 22 20 63 61 6e 6e 6f 74 20 62 65 20   "ip" cannot be 
5730: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 67 69 76  found in the giv
5740: 65 6e 20 22 6c 69 73 74 22 2e 20 20 31 20 69 73  en "list".  1 is
5750: 0a 20 2a 20 20 20 72 65 74 75 72 6e 65 64 20 6f  . *   returned o
5760: 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  n a successful m
5770: 61 74 63 68 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  atch.. *. * NOTE
5780: 53 3a 0a 20 2a 20 20 20 22 63 68 65 63 6b 5f 70  S:. *   "check_p
5790: 61 63 6b 65 74 5f 64 6e 73 62 6c 22 20 20 73 65  acket_dnsbl"  se
57a0: 61 72 63 68 65 73 20 74 68 65 20 67 69 76 65 6e  arches the given
57b0: 20 6c 69 73 74 20 70 61 72 61 6d 65 74 65 72 20   list parameter 
57c0: 28 77 68 69 63 68 20 69 73 20 61 20 6c 69 73 74  (which is a list
57d0: 0a 20 2a 20 20 20 6f 66 20 63 6f 6e 66 69 67 75  . *   of configu
57e0: 72 65 64 20 44 4e 53 20 52 42 4c 73 20 69 6e 20  red DNS RBLs in 
57f0: 2d 3e 73 74 72 69 6e 67 29 20 74 6f 20 64 65 74  ->string) to det
5800: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 64 61  ermine if the da
5810: 74 61 20 70 61 73 73 65 64 20 69 6e 0a 20 2a 20  ta passed in. * 
5820: 20 20 22 69 70 22 20 73 68 6f 75 6c 64 20 62 65    "ip" should be
5830: 20 62 6c 6f 63 6b 65 64 2e 0a 20 2a 20 20 20 54   blocked.. *   T
5840: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
5850: 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 70  t be able to cop
5860: 65 20 77 69 74 68 20 4e 55 4c 4c 20 22 69 70 22  e with NULL "ip"
5870: 20 61 6e 64 20 22 6c 69 73 74 22 20 70 61 72 61   and "list" para
5880: 6d 74 65 72 73 0a 20 2a 20 20 20 77 69 74 68 6f  mters. *   witho
5890: 75 74 20 61 62 6f 72 74 69 6e 67 2e 0a 20 2a 0a  ut aborting.. *.
58a0: 20 2a 2f 0a 69 6e 74 20 63 68 65 63 6b 5f 70 61   */.int check_pa
58b0: 63 6b 65 74 5f 64 6e 73 62 6c 28 63 6f 6e 73 74  cket_dnsbl(const
58c0: 20 73 74 72 75 63 74 20 70 61 63 6b 65 74 5f 69   struct packet_i
58d0: 6e 66 6f 20 2a 69 70 2c 20 73 74 72 75 63 74 20  nfo *ip, struct 
58e0: 63 6f 6e 66 69 67 5f 65 6e 74 72 79 20 2a 6c 69  config_entry *li
58f0: 73 74 29 20 7b 0a 0a 09 73 74 72 75 63 74 20 63  st) {...struct c
5900: 6f 6e 66 69 67 5f 65 6e 74 72 79 20 2a 77 6c 74  onfig_entry *wlt
5910: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 23 69 66 6e 64  mp = NULL;.#ifnd
5920: 65 66 20 48 41 56 45 5f 46 49 52 45 44 4e 53 0a  ef HAVE_FIREDNS.
5930: 09 73 74 72 75 63 74 20 68 6f 73 74 65 6e 74 20  .struct hostent 
5940: 2a 68 6f 73 74 3b 0a 23 65 6c 73 65 0a 09 73 74  *host;.#else..st
5950: 72 75 63 74 20 69 6e 5f 61 64 64 72 20 2a 68 6f  ruct in_addr *ho
5960: 73 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  st;.#endif...if 
5970: 28 69 70 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6c  (ip == NULL || l
5980: 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
5990: 09 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09  .return 0;..}...
59a0: 77 6c 74 6d 70 20 3d 20 6c 69 73 74 3b 0a 0a 09  wltmp = list;...
59b0: 77 68 69 6c 65 20 28 31 29 20 7b 0a 0a 09 09 63  while (1) {....c
59c0: 68 61 72 20 6c 6f 6f 6b 75 70 62 75 66 5b 42 55  har lookupbuf[BU
59d0: 46 46 45 52 53 49 5a 45 5d 3b 0a 09 0a 09 09 73  FFERSIZE];.....s
59e0: 6e 70 72 69 6e 74 66 28 6c 6f 6f 6b 75 70 62 75  nprintf(lookupbu
59f0: 66 2c 20 73 69 7a 65 6f 66 28 6c 6f 6f 6b 75 70  f, sizeof(lookup
5a00: 62 75 66 29 2c 20 22 25 68 68 75 2e 25 68 68 75  buf), "%hhu.%hhu
5a10: 2e 25 68 68 75 2e 25 68 68 75 2e 25 73 22 2c 20  .%hhu.%hhu.%s", 
5a20: 69 70 2d 3e 62 34 2c 20 69 70 2d 3e 62 33 2c 20  ip->b4, ip->b3, 
5a30: 69 70 2d 3e 62 32 2c 20 69 70 2d 3e 62 31 2c 0a  ip->b2, ip->b1,.
5a40: 09 09 09 77 6c 74 6d 70 2d 3e 73 74 72 69 6e 67  ...wltmp->string
5a50: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 48 41 56 45  );..#ifndef HAVE
5a60: 5f 46 49 52 45 44 4e 53 0a 09 09 68 6f 73 74 20  _FIREDNS...host 
5a70: 3d 20 67 65 74 68 6f 73 74 62 79 6e 61 6d 65 28  = gethostbyname(
5a80: 6c 6f 6f 6b 75 70 62 75 66 29 3b 0a 23 65 6c 73  lookupbuf);.#els
5a90: 65 0a 09 09 68 6f 73 74 20 3d 20 66 69 72 65 64  e...host = fired
5aa0: 6e 73 5f 72 65 73 6f 6c 76 65 69 70 34 28 6c 6f  ns_resolveip4(lo
5ab0: 6f 6b 75 70 62 75 66 29 3b 0a 23 65 6e 64 69 66  okupbuf);.#endif
5ac0: 0a 0a 09 09 69 66 20 28 68 6f 73 74 20 3d 3d 20  ....if (host == 
5ad0: 4e 55 4c 4c 29 20 7b 0a 23 69 66 6e 64 65 66 20  NULL) {.#ifndef 
5ae0: 48 41 56 45 5f 46 49 52 45 44 4e 53 0a 09 09 09  HAVE_FIREDNS....
5af0: 69 66 20 28 68 5f 65 72 72 6e 6f 20 21 3d 20 48  if (h_errno != H
5b00: 4f 53 54 5f 4e 4f 54 5f 46 4f 55 4e 44 29 20 7b  OST_NOT_FOUND) {
5b10: 0a 09 09 09 09 73 79 73 6c 6f 67 28 4c 4f 47 5f  .....syslog(LOG_
5b20: 45 52 52 2c 20 22 45 72 72 6f 72 20 6c 6f 6f 6b  ERR, "Error look
5b30: 69 6e 67 20 75 70 20 68 6f 73 74 20 25 73 22 2c  ing up host %s",
5b40: 0a 09 09 09 09 09 6c 6f 6f 6b 75 70 62 75 66 09  ......lookupbuf.
5b50: 0a 09 09 09 09 29 3b 0a 09 09 09 7d 0a 23 65 6c  .....);....}.#el
5b60: 73 65 0a 09 09 3b 0a 23 65 6e 64 69 66 0a 09 09  se...;.#endif...
5b70: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 2f 2f 20 66  } else {....// f
5b80: 6f 75 6e 64 2e 0a 09 09 09 72 65 74 75 72 6e 20  ound.....return 
5b90: 31 3b 0a 09 09 7d 0a 09 09 09 0a 09 09 69 66 20  1;...}.......if 
5ba0: 28 77 6c 74 6d 70 2d 3e 6e 65 78 74 20 3d 3d 20  (wltmp->next == 
5bb0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65  NULL) {..../* Te
5bc0: 72 6d 69 6e 61 74 69 6f 6e 20 63 61 73 65 20 2a  rmination case *
5bd0: 2f 0a 09 09 09 72 65 74 75 72 6e 20 30 3b 0a 09  /....return 0;..
5be0: 09 7d 0a 0a 09 09 77 6c 74 6d 70 20 3d 20 77 6c  .}....wltmp = wl
5bf0: 74 6d 70 2d 3e 6e 65 78 74 3b 0a 09 7d 0a 0a 09  tmp->next;..}...
5c00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5c10: 20 2a 20 53 59 4e 4f 50 53 49 53 3a 0a 20 2a 20   * SYNOPSIS:. * 
5c20: 20 20 69 6e 74 20 63 68 65 63 6b 5f 70 61 63 6b    int check_pack
5c30: 65 74 5f 6c 69 73 74 28 0a 20 2a 20 20 20 20 20  et_list(. *     
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63       const struc
5c60: 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f 20 2a 69  t packet_info *i
5c70: 70 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  p. *            
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
5c90: 72 75 63 74 20 63 6f 6e 66 69 67 5f 65 6e 74 72  ruct config_entr
5ca0: 79 20 2a 6c 69 73 74 0a 20 2a 20 20 20 20 20 20  y *list. *      
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55     );. *. * ARGU
5cd0: 4d 45 4e 54 53 3a 0a 20 2a 20 20 20 73 74 72 75  MENTS:. *   stru
5ce0: 63 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f 20 2a  ct packet_info *
5cf0: 69 70 20 20 20 20 20 20 20 49 50 20 61 64 64 72  ip       IP addr
5d00: 65 73 73 20 64 61 74 61 20 74 6f 20 63 68 65 63  ess data to chec
5d10: 6b 20 69 6e 20 73 75 70 70 6c 69 65 64 20 6c 69  k in supplied li
5d20: 73 74 2e 20 0a 20 2a 20 20 20 73 74 72 75 63 74  st. . *   struct
5d30: 20 63 6f 6e 66 69 67 5f 65 6e 74 72 79 20 2a 6c   config_entry *l
5d40: 69 73 74 20 20 20 20 4c 69 73 74 20 74 68 61 74  ist    List that
5d50: 20 63 6f 6e 74 61 69 6e 73 20 64 61 74 61 20 74   contains data t
5d60: 6f 20 63 68 65 63 6b 20 69 6e 20 61 67 61 69 6e  o check in again
5d70: 73 74 2c 0a 20 2a 20 20 20 20 20 20 20 20 20 20  st,. *          
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 77 68 69 74 65 6c 69 73 74 20        whitelist 
5da0: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 20 2a 0a  for example.. *.
5db0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 3a   * RETURN VALUE:
5dc0: 0a 20 2a 20 20 20 30 20 69 73 20 72 65 74 75 72  . *   0 is retur
5dd0: 6e 65 64 20 69 66 20 74 68 65 20 22 69 70 22 20  ned if the "ip" 
5de0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 20  cannot be found 
5df0: 69 6e 20 74 68 65 20 67 69 76 65 6e 20 22 6c 69  in the given "li
5e00: 73 74 22 2e 20 54 68 65 20 69 6e 64 65 78 0a 20  st". The index. 
5e10: 2a 20 20 20 6f 66 20 74 68 65 20 6d 61 74 63 68  *   of the match
5e20: 65 64 20 6c 69 73 74 20 69 73 20 72 65 74 75 72  ed list is retur
5e30: 6e 65 64 20 6f 6e 20 61 20 73 75 63 63 65 73 73  ned on a success
5e40: 66 75 6c 20 6d 61 74 63 68 2e 0a 20 2a 0a 20 2a  ful match.. *. *
5e50: 20 4e 4f 54 45 53 3a 0a 20 2a 20 20 20 22 63 68   NOTES:. *   "ch
5e60: 65 63 6b 5f 70 61 63 6b 65 74 5f 6c 69 73 74 22  eck_packet_list"
5e70: 20 20 73 65 61 72 63 68 65 73 20 74 68 65 20 67    searches the g
5e80: 69 76 65 6e 20 6c 69 73 74 20 70 61 72 61 6d 65  iven list parame
5e90: 74 65 72 20 28 77 68 69 63 68 20 69 73 20 61 20  ter (which is a 
5ea0: 6c 69 73 74 0a 20 2a 20 20 20 43 49 44 52 73 29  list. *   CIDRs)
5eb0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
5ec0: 20 74 68 65 20 64 61 74 61 20 70 61 73 73 65 64   the data passed
5ed0: 20 69 6e 20 22 69 70 22 20 6d 61 74 63 68 65 73   in "ip" matches
5ee0: 20 28 77 68 69 74 65 6c 69 73 74 2c 20 66 6f 72   (whitelist, for
5ef0: 0a 20 2a 20 20 20 66 6f 72 20 65 78 61 6d 70 6c  . *   for exampl
5f00: 65 29 2e 0a 20 2a 20 20 20 54 68 69 73 20 66 75  e).. *   This fu
5f10: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  nction must be a
5f20: 62 6c 65 20 74 6f 20 63 6f 70 65 20 77 69 74 68  ble to cope with
5f30: 20 4e 55 4c 4c 20 22 69 70 22 20 61 6e 64 20 22   NULL "ip" and "
5f40: 6c 69 73 74 22 20 70 61 72 61 6d 74 65 72 73 0a  list" paramters.
5f50: 20 2a 20 20 20 77 69 74 68 6f 75 74 20 61 62 6f   *   without abo
5f60: 72 74 69 6e 67 2e 0a 20 2a 0a 20 2a 2f 0a 69 6e  rting.. *. */.in
5f70: 74 20 63 68 65 63 6b 5f 70 61 63 6b 65 74 5f 6c  t check_packet_l
5f80: 69 73 74 28 63 6f 6e 73 74 20 73 74 72 75 63 74  ist(const struct
5f90: 20 70 61 63 6b 65 74 5f 69 6e 66 6f 20 2a 69 70   packet_info *ip
5fa0: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 5f  , struct config_
5fb0: 65 6e 74 72 79 20 2a 6c 69 73 74 29 20 7b 0a 0a  entry *list) {..
5fc0: 09 73 74 72 75 63 74 20 63 6f 6e 66 69 67 5f 65  .struct config_e
5fd0: 6e 74 72 79 20 2a 77 6c 74 6d 70 20 3d 20 4e 55  ntry *wltmp = NU
5fe0: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  LL;..unsigned in
5ff0: 74 20 69 70 5f 70 72 6f 63 3b 0a 09 69 6e 74 20  t ip_proc;..int 
6000: 72 76 3b 0a 0a 09 69 66 20 28 69 70 20 3d 3d 20  rv;...if (ip == 
6010: 4e 55 4c 4c 20 7c 7c 20 6c 69 73 74 20 3d 3d 20  NULL || list == 
6020: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
6030: 20 30 3b 0a 09 7d 0a 0a 09 69 70 5f 70 72 6f 63   0;..}...ip_proc
6040: 20 3d 20 69 70 2d 3e 62 31 20 3c 3c 20 32 34 3b   = ip->b1 << 24;
6050: 0a 09 69 70 5f 70 72 6f 63 20 7c 3d 20 69 70 2d  ..ip_proc |= ip-
6060: 3e 62 32 20 3c 3c 20 31 36 3b 0a 09 69 70 5f 70  >b2 << 16;..ip_p
6070: 72 6f 63 20 7c 3d 20 69 70 2d 3e 62 33 20 3c 3c  roc |= ip->b3 <<
6080: 20 38 3b 0a 09 69 70 5f 70 72 6f 63 20 7c 3d 20   8;..ip_proc |= 
6090: 69 70 2d 3e 62 34 3b 0a 0a 09 77 6c 74 6d 70 20  ip->b4;...wltmp 
60a0: 3d 20 6c 69 73 74 3b 0a 0a 09 77 68 69 6c 65 20  = list;...while 
60b0: 28 31 29 20 7b 0a 09 09 75 69 6e 74 33 32 5f 74  (1) {...uint32_t
60c0: 20 70 20 3d 20 30 3b 0a 0a 09 09 70 20 3d 20 69   p = 0;....p = i
60d0: 70 5f 70 72 6f 63 3b 0a 09 09 70 20 26 3d 20 77  p_proc;...p &= w
60e0: 6c 74 6d 70 2d 3e 63 69 64 72 2e 70 72 6f 63 65  ltmp->cidr.proce
60f0: 73 73 65 64 3b 0a 0a 09 09 69 66 20 28 70 20 3d  ssed;....if (p =
6100: 3d 20 77 6c 74 6d 70 2d 3e 63 69 64 72 2e 69 70  = wltmp->cidr.ip
6110: 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 20 77 6c  ) {....return wl
6120: 74 6d 70 2d 3e 69 6e 64 65 78 3b 0a 09 09 09 72  tmp->index;....r
6130: 65 74 75 72 6e 20 31 3b 0a 09 09 7d 0a 0a 09 09  eturn 1;...}....
6140: 69 66 20 28 77 6c 74 6d 70 2d 3e 6e 65 78 74 20  if (wltmp->next 
6150: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 62 72  == NULL) {....br
6160: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 77 6c 74 6d  eak;...}....wltm
6170: 70 20 3d 20 77 6c 74 6d 70 2d 3e 6e 65 78 74 3b  p = wltmp->next;
6180: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d  ..}..return 0;.}
6190: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 4f 50 53 49 53  ../*. * SYNOPSIS
61a0: 3a 0a 20 2a 20 20 20 63 68 61 72 20 2a 20 67 65  :. *   char * ge
61b0: 74 5f 69 70 5f 73 74 72 69 6e 67 28 0a 20 2a 20  t_ip_string(. * 
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
61e0: 74 20 73 74 72 75 63 74 20 70 61 63 6b 65 74 5f  t struct packet_
61f0: 69 6e 66 6f 20 2a 69 70 0a 20 2a 20 20 20 20 20  info *ip. *     
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 20 20 29 3b 0a 20 2a 0a 20 2a 20         );. *. * 
6220: 41 52 47 55 4d 45 4e 54 53 3a 0a 20 2a 20 20 20  ARGUMENTS:. *   
6230: 73 74 72 75 63 74 20 70 61 63 6b 65 74 5f 69 6e  struct packet_in
6240: 66 6f 20 2a 69 70 20 20 20 20 20 20 20 53 74 72  fo *ip       Str
6250: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
6260: 67 20 49 50 20 70 61 72 74 73 20 74 6f 20 63 6f  g IP parts to co
6270: 6e 73 74 72 75 63 74 0a 20 2a 20 20 20 20 20 20  nstruct. *      
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 41 53            the AS
62a0: 43 49 49 20 72 65 70 72 65 73 65 6e 74 61 74 69  CII representati
62b0: 6f 6e 20 66 72 6f 6d 2e 0a 20 2a 0a 20 2a 20 52  on from.. *. * R
62c0: 45 54 55 52 4e 20 56 41 4c 55 45 3a 0a 20 2a 20  ETURN VALUE:. * 
62d0: 20 20 28 6e 6f 6e 65 29 0a 20 2a 0a 20 2a 20 4e    (none). *. * N
62e0: 4f 54 45 53 3a 0a 20 2a 20 20 20 54 68 69 73 20  OTES:. *   This 
62f0: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 74  function takes t
6300: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 70  he data in the p
6310: 61 72 61 6d 65 74 65 72 20 22 69 70 22 20 61 6e  arameter "ip" an
6320: 64 20 72 65 74 75 72 6e 73 20 61 20 62 75 66 66  d returns a buff
6330: 65 72 0a 20 2a 20 20 20 63 6f 6e 74 61 69 6e 69  er. *   containi
6340: 6e 67 20 61 20 73 74 72 69 6e 67 20 72 65 70 72  ng a string repr
6350: 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 69  esentation.  Thi
6360: 73 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  s buffer must be
6370: 20 66 72 65 65 64 2e 0a 20 2a 20 20 20 49 74 20   freed.. *   It 
6380: 6d 75 73 74 20 62 65 20 61 62 6c 65 20 74 6f 20  must be able to 
6390: 63 6f 70 65 20 77 69 74 68 20 22 69 70 22 20 62  cope with "ip" b
63a0: 65 69 6e 67 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a  eing NULL.. *. *
63b0: 2f 0a 63 68 61 72 20 2a 67 65 74 5f 69 70 5f 73  /.char *get_ip_s
63c0: 74 72 69 6e 67 28 63 6f 6e 73 74 20 73 74 72 75  tring(const stru
63d0: 63 74 20 70 61 63 6b 65 74 5f 69 6e 66 6f 20 2a  ct packet_info *
63e0: 69 70 29 20 7b 0a 0a 09 69 6e 74 20 72 76 3b 0a  ip) {...int rv;.
63f0: 09 63 68 61 72 20 2a 62 75 66 20 3d 20 4e 55 4c  .char *buf = NUL
6400: 4c 3b 0a 0a 09 62 75 66 20 3d 20 6d 61 6c 6c 6f  L;...buf = mallo
6410: 63 28 42 55 46 46 45 52 53 49 5a 45 29 3b 20 0a  c(BUFFERSIZE); .
6420: 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c  .if (buf == NULL
6430: 29 20 7b 0a 09 09 73 79 73 6c 6f 67 28 4c 4f 47  ) {...syslog(LOG
6440: 5f 45 52 52 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  _ERR, "could not
6450: 20 6d 61 6c 6c 6f 63 20 62 75 66 20 69 6e 20 67   malloc buf in g
6460: 65 74 5f 69 70 5f 73 74 72 69 6e 67 3a 20 25 73  et_ip_string: %s
6470: 5c 6e 22 2c 0a 09 09 09 73 74 72 65 72 72 6f 72  \n",....strerror
6480: 28 65 72 72 6e 6f 29 29 3b 0a 09 09 65 78 69 74  (errno));...exit
6490: 28 45 58 49 54 5f 46 41 49 4c 55 52 45 29 3b 0a  (EXIT_FAILURE);.
64a0: 09 7d 0a 0a 09 69 66 20 28 69 70 20 3d 3d 20 4e  .}...if (ip == N
64b0: 55 4c 4c 29 20 7b 0a 09 09 72 76 20 3d 20 73 70  ULL) {...rv = sp
64c0: 72 69 6e 74 66 28 62 75 66 2c 20 22 2d 22 29 3b  rintf(buf, "-");
64d0: 0a 09 09 69 66 20 28 72 76 20 3c 20 30 29 20 7b  ...if (rv < 0) {
64e0: 09 0a 09 09 09 73 79 73 6c 6f 67 28 4c 4f 47 5f  .....syslog(LOG_
64f0: 45 52 52 2c 20 22 73 70 72 69 6e 74 66 20 66 61  ERR, "sprintf fa
6500: 69 6c 65 64 20 69 6e 20 6c 69 6e 65 20 25 64 3a  iled in line %d:
6510: 20 25 73 22 2c 0a 09 09 09 09 5f 5f 4c 49 4e 45   %s",.....__LINE
6520: 5f 5f 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  __, strerror(err
6530: 6e 6f 29 29 3b 0a 09 09 09 65 78 69 74 28 45 58  no));....exit(EX
6540: 49 54 5f 46 41 49 4c 55 52 45 29 3b 0a 09 09 7d  IT_FAILURE);...}
6550: 0a 09 09 72 65 74 75 72 6e 20 62 75 66 3b 0a 09  ...return buf;..
6560: 7d 0a 0a 09 72 76 20 3d 20 73 6e 70 72 69 6e 74  }...rv = snprint
6570: 66 28 62 75 66 2c 20 42 55 46 46 45 52 53 49 5a  f(buf, BUFFERSIZ
6580: 45 2c 20 22 25 68 68 75 2e 25 68 68 75 2e 25 68  E, "%hhu.%hhu.%h
6590: 68 75 2e 25 68 68 75 3a 25 68 75 2e 25 68 75 22  hu.%hhu:%hu.%hu"
65a0: 2c 20 0a 09 09 09 69 70 2d 3e 62 31 2c 20 69 70  , ....ip->b1, ip
65b0: 2d 3e 62 32 2c 20 69 70 2d 3e 62 33 2c 20 69 70  ->b2, ip->b3, ip
65c0: 2d 3e 62 34 2c 0a 09 09 09 69 70 2d 3e 73 5f 70  ->b4,....ip->s_p
65d0: 6f 72 74 2c 69 70 2d 3e 64 5f 70 6f 72 74 29 3b  ort,ip->d_port);
65e0: 0a 09 09 69 66 20 28 72 76 20 3c 20 30 29 20 7b  ...if (rv < 0) {
65f0: 0a 09 09 09 73 79 73 6c 6f 67 28 4c 4f 47 5f 45  ....syslog(LOG_E
6600: 52 52 2c 20 22 73 6e 70 72 69 6e 74 66 20 66 61  RR, "snprintf fa
6610: 69 6c 65 64 20 69 6e 20 6c 69 6e 65 20 25 64 3a  iled in line %d:
6620: 20 25 73 22 2c 0a 09 09 09 09 5f 5f 4c 49 4e 45   %s",.....__LINE
6630: 5f 5f 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  __, strerror(err
6640: 6e 6f 29 29 3b 0a 09 09 09 65 78 69 74 28 31 29  no));....exit(1)
6650: 3b 0a 09 09 7d 0a 09 72 65 74 75 72 6e 20 62 75  ;...}..return bu
6660: 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 55 53 45  f;.}..#ifdef USE
6670: 5f 53 4f 43 4b 53 54 41 54 0a 2f 2a 0a 20 2a 20  _SOCKSTAT./*. * 
6680: 53 59 4e 4f 50 53 49 53 3a 0a 20 2a 20 20 20 76  SYNOPSIS:. *   v
6690: 6f 69 64 20 2a 70 62 6c 5f 73 6f 63 6b 73 74 61  oid *pbl_socksta
66a0: 74 5f 74 68 72 65 61 64 28 0a 20 2a 20 20 20 20  t_thread(. *    
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 74           void *t
66d0: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 20 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55     );. *. * ARGU
6700: 4d 45 4e 54 53 3a 0a 20 2a 20 20 20 76 6f 69 64  MENTS:. *   void
6710: 20 2a 74 64 61 74 61 20 20 20 20 20 20 20 20 20   *tdata         
6720: 20 20 20 20 20 20 20 20 20 44 61 74 61 20 74 6f           Data to
6730: 20 70 61 73 73 20 69 6e 74 6f 20 74 68 65 20 74   pass into the t
6740: 68 72 65 61 64 2e 20 20 54 68 69 73 20 69 73 20  hread.  This is 
6750: 75 6e 75 73 65 64 0a 20 2a 20 20 20 20 20 20 20  unused. *       
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 20 20 20 20 20 20 63 75 72 72 65 6e 74           current
6780: 6c 79 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ly.. *. * RETURN
6790: 20 56 41 4c 55 45 3a 0a 20 2a 20 20 20 54 68 69   VALUE:. *   Thi
67a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
67b0: 73 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  s returns NULL..
67c0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 3a 0a 20 2a 2f   *. * NOTES:. */
67d0: 0a 76 6f 69 64 20 2a 70 62 6c 5f 73 6f 63 6b 73  .void *pbl_socks
67e0: 74 61 74 5f 74 68 72 65 61 64 28 76 6f 69 64 20  tat_thread(void 
67f0: 2a 74 64 61 74 61 29 20 7b 0a 09 73 74 72 75 63  *tdata) {..struc
6800: 74 20 73 6f 63 6b 61 64 64 72 5f 75 6e 20 73 6f  t sockaddr_un so
6810: 63 6b 69 6e 66 6f 3b 0a 09 46 49 4c 45 20 2a 73  ckinfo;..FILE *s
6820: 6f 63 6b 66 70 20 3d 20 4e 55 4c 4c 3b 0a 09 63  ockfp = NULL;..c
6830: 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3d 7b 30  har buf[1024]={0
6840: 7d 3b 0a 09 74 69 6d 65 5f 74 20 63 75 72 72 65  };..time_t curre
6850: 6e 74 5f 74 69 6d 65 3b 0a 09 69 6e 74 20 6d 61  nt_time;..int ma
6860: 73 74 65 72 5f 73 6f 63 6b 66 64 2c 20 73 6f 63  ster_sockfd, soc
6870: 6b 66 64 3b 0a 09 69 6e 74 20 62 69 6e 64 72 65  kfd;..int bindre
6880: 74 2c 20 6c 69 73 74 65 6e 72 65 74 2c 20 73 6e  t, listenret, sn
6890: 70 72 69 6e 74 66 72 65 74 3b 0a 09 69 6e 74 20  printfret;..int 
68a0: 73 6f 63 6b 69 6e 66 6f 6c 65 6e 3b 0a 0a 09 2f  sockinfolen;.../
68b0: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 73 74 72  * Delete any str
68c0: 61 79 20 73 6f 63 6b 65 74 73 20 6c 65 66 74 20  ay sockets left 
68d0: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 2a 2f  lying around. */
68e0: 0a 09 75 6e 6c 69 6e 6b 28 53 4f 43 4b 53 54 41  ..unlink(SOCKSTA
68f0: 54 5f 50 41 54 48 29 3b 0a 0a 09 2f 2a 20 43 72  T_PATH);.../* Cr
6900: 65 61 74 65 20 61 20 55 4e 49 58 20 64 6f 6d 61  eate a UNIX doma
6910: 69 6e 20 73 6f 63 6b 65 74 2e 20 2a 2f 0a 09 6d  in socket. */..m
6920: 61 73 74 65 72 5f 73 6f 63 6b 66 64 20 3d 20 73  aster_sockfd = s
6930: 6f 63 6b 65 74 28 50 46 5f 55 4e 49 58 2c 20 53  ocket(PF_UNIX, S
6940: 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29 3b 0a  OCK_STREAM, 0);.
6950: 09 69 66 20 28 6d 61 73 74 65 72 5f 73 6f 63 6b  .if (master_sock
6960: 66 64 20 3c 20 30 29 20 7b 0a 09 09 73 79 73 6c  fd < 0) {...sysl
6970: 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22 45 72 72  og(LOG_ERR, "Err
6980: 6f 72 20 63 72 65 61 74 69 6e 67 20 73 6f 63 6b  or creating sock
6990: 65 74 3a 20 25 73 22 2c 0a 09 09 09 73 74 72 65  et: %s",....stre
69a0: 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 09 09  rror(errno));...
69b0: 70 74 68 72 65 61 64 5f 65 78 69 74 28 4e 55 4c  pthread_exit(NUL
69c0: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 69 6e 64  L);..}.../* Bind
69d0: 20 6f 75 72 20 73 6f 63 6b 65 74 20 74 6f 20 74   our socket to t
69e0: 68 65 20 70 61 74 68 6e 61 6d 65 2e 20 2a 2f 0a  he pathname. */.
69f0: 09 73 6f 63 6b 69 6e 66 6f 2e 73 75 6e 5f 66 61  .sockinfo.sun_fa
6a00: 6d 69 6c 79 20 3d 20 41 46 5f 55 4e 49 58 3b 0a  mily = AF_UNIX;.
6a10: 09 73 74 72 6e 63 70 79 28 73 6f 63 6b 69 6e 66  .strncpy(sockinf
6a20: 6f 2e 73 75 6e 5f 70 61 74 68 2c 20 53 4f 43 4b  o.sun_path, SOCK
6a30: 53 54 41 54 5f 50 41 54 48 2c 20 73 69 7a 65 6f  STAT_PATH, sizeo
6a40: 66 28 73 6f 63 6b 69 6e 66 6f 2e 73 75 6e 5f 70  f(sockinfo.sun_p
6a50: 61 74 68 29 29 3b 0a 09 62 69 6e 64 72 65 74 20  ath));..bindret 
6a60: 3d 20 62 69 6e 64 28 6d 61 73 74 65 72 5f 73 6f  = bind(master_so
6a70: 63 6b 66 64 2c 20 0a 09 09 28 73 74 72 75 63 74  ckfd, ...(struct
6a80: 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 73 6f   sockaddr *) &so
6a90: 63 6b 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 73  ckinfo, sizeof(s
6aa0: 6f 63 6b 69 6e 66 6f 29 29 3b 0a 09 69 66 20 28  ockinfo));..if (
6ab0: 62 69 6e 64 72 65 74 20 3c 20 30 29 20 7b 0a 09  bindret < 0) {..
6ac0: 09 73 79 73 6c 6f 67 28 4c 4f 47 5f 45 52 52 2c  .syslog(LOG_ERR,
6ad0: 20 22 45 72 72 6f 72 20 62 69 6e 64 69 6e 67 20   "Error binding 
6ae0: 74 6f 20 73 6f 63 6b 65 74 3a 20 25 73 22 2c 0a  to socket: %s",.
6af0: 09 09 09 73 74 72 65 72 72 6f 72 28 65 72 72 6e  ...strerror(errn
6b00: 6f 29 29 3b 0a 09 09 69 66 20 28 63 6c 6f 73 65  o));...if (close
6b10: 28 6d 61 73 74 65 72 5f 73 6f 63 6b 66 64 29 20  (master_sockfd) 
6b20: 3c 20 30 29 20 7b 0a 09 09 09 73 79 73 6c 6f 67  < 0) {....syslog
6b30: 28 4c 4f 47 5f 45 52 52 2c 20 22 25 73 3a 25 64  (LOG_ERR, "%s:%d
6b40: 20 63 6c 6f 73 65 28 29 20 66 61 69 6c 65 64 3a   close() failed:
6b50: 20 25 73 22 2c 0a 09 09 09 09 5f 5f 46 49 4c 45   %s",.....__FILE
6b60: 5f 5f 2c 5f 5f 4c 49 4e 45 5f 5f 2c 20 73 74 72  __,__LINE__, str
6b70: 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 09  error(errno));..
6b80: 09 7d 0a 09 09 70 74 68 72 65 61 64 5f 65 78 69  .}...pthread_exi
6b90: 74 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  t(NULL);..}.../*
6ba0: 20 53 74 61 72 74 20 6c 69 73 74 65 6e 69 6e 67   Start listening
6bb0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   for connections
6bc0: 2e 20 2a 2f 0a 09 6c 69 73 74 65 6e 72 65 74 20  . */..listenret 
6bd0: 3d 20 6c 69 73 74 65 6e 28 6d 61 73 74 65 72 5f  = listen(master_
6be0: 73 6f 63 6b 66 64 2c 20 33 29 3b 0a 09 69 66 20  sockfd, 3);..if 
6bf0: 28 6c 69 73 74 65 6e 72 65 74 20 3c 20 30 29 20  (listenret < 0) 
6c00: 7b 0a 09 09 73 79 73 6c 6f 67 28 4c 4f 47 5f 45  {...syslog(LOG_E
6c10: 52 52 2c 20 22 45 72 72 6f 72 20 6c 69 73 74 65  RR, "Error liste
6c20: 6e 69 6e 67 20 6f 6e 20 73 6f 63 6b 65 74 3a 20  ning on socket: 
6c30: 25 73 22 2c 0a 09 09 09 73 74 72 65 72 72 6f 72  %s",....strerror
6c40: 28 65 72 72 6e 6f 29 29 3b 0a 09 09 69 66 20 28  (errno));...if (
6c50: 63 6c 6f 73 65 28 6d 61 73 74 65 72 5f 73 6f 63  close(master_soc
6c60: 6b 66 64 29 20 3c 20 30 29 20 7b 0a 09 09 09 73  kfd) < 0) {....s
6c70: 79 73 6c 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22  yslog(LOG_ERR, "
6c80: 25 73 3a 25 64 20 63 6c 6f 73 65 28 29 20 66 61  %s:%d close() fa
6c90: 69 6c 65 64 3a 20 25 73 22 2c 0a 09 09 09 09 5f  iled: %s",....._
6ca0: 5f 46 49 4c 45 5f 5f 2c 5f 5f 4c 49 4e 45 5f 5f  _FILE__,__LINE__
6cb0: 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f  , strerror(errno
6cc0: 29 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28 75 6e  ));...}...if (un
6cd0: 6c 69 6e 6b 28 53 4f 43 4b 53 54 41 54 5f 50 41  link(SOCKSTAT_PA
6ce0: 54 48 29 20 3c 20 30 29 20 7b 0a 09 09 09 73 79  TH) < 0) {....sy
6cf0: 73 6c 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22 25  slog(LOG_ERR, "%
6d00: 73 3a 25 64 20 72 65 6d 6f 76 69 6e 67 20 73 6f  s:%d removing so
6d10: 63 6b 65 74 20 66 61 69 6c 65 64 3a 20 25 73 22  cket failed: %s"
6d20: 2c 0a 09 09 09 09 5f 5f 46 49 4c 45 5f 5f 2c 5f  ,.....__FILE__,_
6d30: 5f 4c 49 4e 45 5f 5f 2c 20 73 74 72 65 72 72 6f  _LINE__, strerro
6d40: 72 28 65 72 72 6e 6f 29 29 3b 0a 09 09 7d 0a 09  r(errno));...}..
6d50: 09 70 74 68 72 65 61 64 5f 65 78 69 74 28 4e 55  .pthread_exit(NU
6d60: 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 65 6e  LL);..}...curren
6d70: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
6d80: 4c 4c 29 3b 0a 09 63 74 69 6d 65 5f 72 28 26 63  LL);..ctime_r(&c
6d90: 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 62 75 66  urrent_time, buf
6da0: 29 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b  );...while (1) {
6db0: 0a 09 09 73 6f 63 6b 69 6e 66 6f 6c 65 6e 20 3d  ...sockinfolen =
6dc0: 20 73 69 7a 65 6f 66 28 73 6f 63 6b 69 6e 66 6f   sizeof(sockinfo
6dd0: 29 3b 0a 0a 09 09 73 6f 63 6b 66 64 20 3d 20 61  );....sockfd = a
6de0: 63 63 65 70 74 28 6d 61 73 74 65 72 5f 73 6f 63  ccept(master_soc
6df0: 6b 66 64 2c 20 0a 09 09 09 28 73 74 72 75 63 74  kfd, ....(struct
6e00: 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 73 6f   sockaddr *) &so
6e10: 63 6b 69 6e 66 6f 2c 20 26 73 6f 63 6b 69 6e 66  ckinfo, &sockinf
6e20: 6f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 6f  olen);....if (so
6e30: 63 6b 66 64 20 3c 20 30 29 20 63 6f 6e 74 69 6e  ckfd < 0) contin
6e40: 75 65 3b 0a 0a 09 09 73 6f 63 6b 66 70 20 3d 20  ue;....sockfp = 
6e50: 66 64 6f 70 65 6e 28 73 6f 63 6b 66 64 2c 20 22  fdopen(sockfd, "
6e60: 77 22 29 3b 0a 09 09 69 66 20 28 73 6f 63 6b 66  w");...if (sockf
6e70: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  p == NULL) {....
6e80: 69 66 20 28 63 6c 6f 73 65 28 73 6f 63 6b 66 64  if (close(sockfd
6e90: 29 20 3c 20 30 29 20 7b 0a 09 09 09 09 73 79 73  ) < 0) {.....sys
6ea0: 6c 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22 25 73  log(LOG_ERR, "%s
6eb0: 3a 25 64 20 63 6c 6f 73 65 28 29 20 66 61 69 6c  :%d close() fail
6ec0: 65 64 3a 20 25 73 22 2c 0a 09 09 09 09 09 5f 5f  ed: %s",......__
6ed0: 46 49 4c 45 5f 5f 2c 5f 5f 4c 49 4e 45 5f 5f 2c  FILE__,__LINE__,
6ee0: 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29   strerror(errno)
6ef0: 29 3b 0a 09 09 09 7d 0a 09 09 09 63 6f 6e 74 69  );....}....conti
6f00: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 66 70 72 69  nue;...}....fpri
6f10: 6e 74 66 28 73 6f 63 6b 66 70 2c 20 22 52 75 6e  ntf(sockfp, "Run
6f20: 6e 69 6e 67 20 73 69 6e 63 65 3a 20 25 73 22 2c  ning since: %s",
6f30: 20 62 75 66 29 3b 0a 09 09 66 70 72 69 6e 74 66   buf);...fprintf
6f40: 28 73 6f 63 6b 66 70 2c 20 22 53 74 61 74 69 73  (sockfp, "Statis
6f50: 74 69 63 73 3a 5c 6e 22 29 3b 0a 09 09 66 70 72  tics:\n");...fpr
6f60: 69 6e 74 66 28 73 6f 63 6b 66 70 2c 20 22 20 20  intf(sockfp, "  
6f70: 43 61 63 68 65 20 68 69 74 73 20 28 61 63 63 65  Cache hits (acce
6f80: 70 74 29 3a 20 25 64 5c 6e 22 2c 20 0a 09 09 09  pt): %d\n", ....
6f90: 73 74 61 74 69 73 74 69 63 73 2e 63 61 63 68 65  statistics.cache
6fa0: 61 63 63 65 70 74 29 3b 0a 09 09 66 70 72 69 6e  accept);...fprin
6fb0: 74 66 28 73 6f 63 6b 66 70 2c 20 22 20 20 43 61  tf(sockfp, "  Ca
6fc0: 63 68 65 20 68 69 74 73 20 28 72 65 6a 65 63 74  che hits (reject
6fd0: 29 3a 20 25 64 5c 6e 22 2c 20 0a 09 09 09 73 74  ): %d\n", ....st
6fe0: 61 74 69 73 74 69 63 73 2e 63 61 63 68 65 72 65  atistics.cachere
6ff0: 6a 65 63 74 29 3b 0a 09 09 66 70 72 69 6e 74 66  ject);...fprintf
7000: 28 73 6f 63 6b 66 70 2c 20 22 20 20 44 4e 53 20  (sockfp, "  DNS 
7010: 57 68 69 74 65 6c 69 73 74 20 68 69 74 73 3a 20  Whitelist hits: 
7020: 25 64 5c 6e 22 2c 20 0a 09 09 09 73 74 61 74 69  %d\n", ....stati
7030: 73 74 69 63 73 2e 77 68 69 74 65 6c 69 73 74 62  stics.whitelistb
7040: 6c 68 69 74 73 29 3b 0a 09 09 66 70 72 69 6e 74  lhits);...fprint
7050: 66 28 73 6f 63 6b 66 70 2c 20 22 20 20 44 4e 53  f(sockfp, "  DNS
7060: 20 42 6c 61 63 6b 6c 69 73 74 20 68 69 74 73 3a   Blacklist hits:
7070: 20 25 64 5c 6e 22 2c 20 0a 09 09 09 73 74 61 74   %d\n", ....stat
7080: 69 73 74 69 63 73 2e 62 6c 61 63 6b 6c 69 73 74  istics.blacklist
7090: 62 6c 68 69 74 73 29 3b 0a 09 09 66 70 72 69 6e  blhits);...fprin
70a0: 74 66 28 73 6f 63 6b 66 70 2c 20 22 20 20 57 68  tf(sockfp, "  Wh
70b0: 69 74 65 6c 69 73 74 20 68 69 74 73 3a 20 25 64  itelist hits: %d
70c0: 5c 6e 22 2c 20 0a 09 09 09 73 74 61 74 69 73 74  \n", ....statist
70d0: 69 63 73 2e 77 68 69 74 65 6c 69 73 74 68 69 74  ics.whitelisthit
70e0: 73 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 6f  s);...fprintf(so
70f0: 63 6b 66 70 2c 20 22 20 20 42 6c 61 63 6b 6c 69  ckfp, "  Blackli
7100: 73 74 20 68 69 74 73 3a 20 25 64 5c 6e 22 2c 20  st hits: %d\n", 
7110: 0a 09 09 09 73 74 61 74 69 73 74 69 63 73 2e 62  ....statistics.b
7120: 6c 61 63 6b 6c 69 73 74 68 69 74 73 29 3b 0a 09  lacklisthits);..
7130: 09 66 70 72 69 6e 74 66 28 73 6f 63 6b 66 70 2c  .fprintf(sockfp,
7140: 20 22 20 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   "  Fall through
7150: 20 68 69 74 73 3a 20 25 64 5c 6e 22 2c 20 0a 09   hits: %d\n", ..
7160: 09 09 73 74 61 74 69 73 74 69 63 73 2e 66 61 6c  ..statistics.fal
7170: 6c 74 68 72 6f 75 67 68 68 69 74 73 29 3b 0a 09  lthroughhits);..
7180: 09 66 70 72 69 6e 74 66 28 73 6f 63 6b 66 70 2c  .fprintf(sockfp,
7190: 20 22 20 20 54 6f 74 61 6c 20 70 61 63 6b 65 74   "  Total packet
71a0: 73 3a 20 25 64 5c 6e 22 2c 20 0a 09 09 09 73 74  s: %d\n", ....st
71b0: 61 74 69 73 74 69 63 73 2e 74 6f 74 61 6c 70 61  atistics.totalpa
71c0: 63 6b 65 74 73 29 3b 0a 09 09 66 63 6c 6f 73 65  ckets);...fclose
71d0: 28 73 6f 63 6b 66 70 29 3b 0a 09 7d 0a 0a 09 63  (sockfp);..}...c
71e0: 6c 6f 73 65 28 6d 61 73 74 65 72 5f 73 6f 63 6b  lose(master_sock
71f0: 66 64 29 3b 0a 09 69 66 20 28 63 6c 6f 73 65 28  fd);..if (close(
7200: 6d 61 73 74 65 72 5f 73 6f 63 6b 66 64 29 20 3c  master_sockfd) <
7210: 20 30 29 20 7b 0a 09 09 73 79 73 6c 6f 67 28 4c   0) {...syslog(L
7220: 4f 47 5f 45 52 52 2c 20 22 25 73 3a 25 64 20 63  OG_ERR, "%s:%d c
7230: 6c 6f 73 65 28 29 20 66 61 69 6c 65 64 3a 20 25  lose() failed: %
7240: 73 22 2c 0a 09 09 09 5f 5f 46 49 4c 45 5f 5f 2c  s",....__FILE__,
7250: 5f 5f 4c 49 4e 45 5f 5f 2c 20 73 74 72 65 72 72  __LINE__, strerr
7260: 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 09 7d 0a 0a  or(errno));..}..
7270: 09 2f 2a 20 43 6c 65 61 6e 75 70 20 73 6f 63 6b  ./* Cleanup sock
7280: 65 74 73 2e 20 2a 2f 0a 09 69 66 20 28 75 6e 6c  ets. */..if (unl
7290: 69 6e 6b 28 53 4f 43 4b 53 54 41 54 5f 50 41 54  ink(SOCKSTAT_PAT
72a0: 48 29 20 3c 20 30 29 20 7b 0a 09 09 73 79 73 6c  H) < 0) {...sysl
72b0: 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22 25 73 3a  og(LOG_ERR, "%s:
72c0: 25 64 20 72 65 6d 6f 76 69 6e 67 20 73 6f 63 6b  %d removing sock
72d0: 65 74 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 0a  et failed: %s",.
72e0: 09 09 09 5f 5f 46 49 4c 45 5f 5f 2c 5f 5f 4c 49  ...__FILE__,__LI
72f0: 4e 45 5f 5f 2c 20 73 74 72 65 72 72 6f 72 28 65  NE__, strerror(e
7300: 72 72 6e 6f 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  rrno));..}.../* 
7310: 54 65 72 6d 69 6e 61 74 65 20 6f 75 72 20 74 68  Terminate our th
7320: 72 65 61 64 20 77 69 74 68 6f 75 74 20 74 61 6b  read without tak
7330: 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 65 6e 74  ing down the ent
7340: 69 72 65 20 70 72 6f 63 65 73 73 2e 20 2a 2f 0a  ire process. */.
7350: 09 70 74 68 72 65 61 64 5f 65 78 69 74 28 4e 55  .pthread_exit(NU
7360: 4c 4c 29 3b 0a 0a 09 2f 2a 20 54 68 69 73 20 73  LL);.../* This s
7370: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
7380: 65 61 63 68 65 64 2e 20 2a 2f 0a 09 72 65 74 75  eached. */..retu
7390: 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(NULL);.}../*.
73a0: 20 2a 20 53 59 4e 4f 50 53 49 53 3a 0a 20 2a 20   * SYNOPSIS:. * 
73b0: 20 20 76 6f 69 64 20 70 62 6c 5f 69 6e 69 74 5f    void pbl_init_
73c0: 73 6f 63 6b 73 74 61 74 28 76 6f 69 64 29 3b 0a  sockstat(void);.
73d0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 3a   *. * ARGUMENTS:
73e0: 0a 20 2a 20 20 20 28 6e 6f 6e 65 29 0a 20 2a 0a  . *   (none). *.
73f0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 3a   * RETURN VALUE:
7400: 0a 20 2a 20 20 20 28 6e 6f 6e 65 29 0a 20 2a 0a  . *   (none). *.
7410: 20 2a 20 4e 4f 54 45 53 3a 0a 20 2a 2f 0a 76 6f   * NOTES:. */.vo
7420: 69 64 20 70 62 6c 5f 69 6e 69 74 5f 73 6f 63 6b  id pbl_init_sock
7430: 73 74 61 74 28 76 6f 69 64 29 20 7b 0a 09 70 74  stat(void) {..pt
7440: 68 72 65 61 64 5f 74 20 70 74 68 72 65 61 64 5f  hread_t pthread_
7450: 64 61 74 61 3b 0a 09 69 6e 74 20 70 74 68 72 65  data;..int pthre
7460: 61 64 5f 72 65 74 20 3d 20 30 3b 0a 0a 09 2f 2a  ad_ret = 0;.../*
7470: 20 43 72 65 61 74 65 20 74 68 65 20 74 68 72 65   Create the thre
7480: 61 64 20 74 6f 20 68 61 6e 64 6c 65 20 73 6f 63  ad to handle soc
7490: 6b 65 74 20 72 65 71 75 65 73 74 73 2e 20 2a 2f  ket requests. */
74a0: 0a 09 70 74 68 72 65 61 64 5f 72 65 74 20 3d 20  ..pthread_ret = 
74b0: 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 0a  pthread_create(.
74c0: 09 09 26 70 74 68 72 65 61 64 5f 64 61 74 61 2c  ..&pthread_data,
74d0: 20 4e 55 4c 4c 2c 20 70 62 6c 5f 73 6f 63 6b 73   NULL, pbl_socks
74e0: 74 61 74 5f 74 68 72 65 61 64 2c 20 4e 55 4c 4c  tat_thread, NULL
74f0: 29 3b 0a 09 69 66 20 28 70 74 68 72 65 61 64 5f  );..if (pthread_
7500: 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 73 79 73  ret < 0) {...sys
7510: 6c 6f 67 28 4c 4f 47 5f 45 52 52 2c 20 22 70 74  log(LOG_ERR, "pt
7520: 68 72 65 61 64 5f 63 72 65 61 74 65 20 66 61 69  hread_create fai
7530: 6c 65 64 3a 20 25 73 22 2c 0a 09 09 09 73 74 72  led: %s",....str
7540: 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 09  error(errno));..
7550: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 23  }...return;.}..#
7560: 65 6e 64 69 66 0a 0a                             endif..