Hex Artifact Content

Artifact ce75275d14f50463b4b798acbb0907c2aa7e0c79:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 63 29 20 32 30 31 34 20 2d 20 32 30 31 36 2c  (c) 2014 - 2016,
0020: 20 52 6f 79 20 4b 65 65 6e 65 0a 20 2a 20 41 6c   Roy Keene. * Al
0030: 6c 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65  l rights reserve
0040: 64 2e 0a 20 2a 20 0a 20 2a 20 52 65 64 69 73 74  d.. * . * Redist
0050: 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65  ribution and use
0060: 20 69 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 62   in source and b
0070: 69 6e 61 72 79 20 66 6f 72 6d 73 2c 20 77 69 74  inary forms, wit
0080: 68 20 6f 72 20 77 69 74 68 6f 75 74 0a 20 2a 20  h or without. * 
0090: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2c 20 61 72  modification, ar
00a0: 65 20 70 65 72 6d 69 74 74 65 64 20 70 72 6f 76  e permitted prov
00b0: 69 64 65 64 20 74 68 61 74 20 74 68 65 20 66 6f  ided that the fo
00c0: 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f  llowing conditio
00d0: 6e 73 20 61 72 65 20 6d 65 74 3a 0a 20 2a 20 09  ns are met:. * .
00e0: 31 2e 20 52 65 64 69 73 74 72 69 62 75 74 69 6f  1. Redistributio
00f0: 6e 73 20 6f 66 20 73 6f 75 72 63 65 20 63 6f 64  ns of source cod
0100: 65 20 6d 75 73 74 20 72 65 74 61 69 6e 20 74 68  e must retain th
0110: 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68  e above copyrigh
0120: 74 0a 20 2a 20 09 20 20 20 6e 6f 74 69 63 65 2c  t. * .   notice,
0130: 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f   this list of co
0140: 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nditions and the
0150: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c   following discl
0160: 61 69 6d 65 72 2e 0a 20 2a 20 09 32 2e 20 52 65  aimer.. * .2. Re
0170: 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 69 6e  distributions in
0180: 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d 75 73   binary form mus
0190: 74 20 72 65 70 72 6f 64 75 63 65 20 74 68 65 20  t reproduce the 
01a0: 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 0a  above copyright.
01b0: 20 2a 20 09 20 20 20 6e 6f 74 69 63 65 2c 20 74   * .   notice, t
01c0: 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64  his list of cond
01d0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66  itions and the f
01e0: 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69  ollowing disclai
01f0: 6d 65 72 20 69 6e 20 74 68 65 0a 20 2a 20 09 20  mer in the. * . 
0200: 20 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20    documentation 
0210: 61 6e 64 2f 6f 72 20 6f 74 68 65 72 20 6d 61 74  and/or other mat
0220: 65 72 69 61 6c 73 20 70 72 6f 76 69 64 65 64 20  erials provided 
0230: 77 69 74 68 20 74 68 65 20 64 69 73 74 72 69 62  with the distrib
0240: 75 74 69 6f 6e 2e 0a 20 2a 20 0a 20 2a 20 54 48  ution.. * . * TH
0250: 49 53 20 53 4f 46 54 57 41 52 45 20 49 53 20 50  IS SOFTWARE IS P
0260: 52 4f 56 49 44 45 44 20 42 59 20 54 48 45 20 43  ROVIDED BY THE C
0270: 4f 50 59 52 49 47 48 54 20 48 4f 4c 44 45 52 53  OPYRIGHT HOLDERS
0280: 20 41 4e 44 20 43 4f 4e 54 52 49 42 55 54 4f 52   AND CONTRIBUTOR
0290: 53 20 22 41 53 20 49 53 22 20 0a 20 2a 20 41 4e  S "AS IS" . * AN
02a0: 44 20 41 4e 59 20 45 58 50 52 45 53 53 20 4f 52  D ANY EXPRESS OR
02b0: 20 49 4d 50 4c 49 45 44 20 57 41 52 52 41 4e 54   IMPLIED WARRANT
02c0: 49 45 53 2c 20 49 4e 43 4c 55 44 49 4e 47 2c 20  IES, INCLUDING, 
02d0: 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20  BUT NOT LIMITED 
02e0: 54 4f 2c 20 54 48 45 20 0a 20 2a 20 49 4d 50 4c  TO, THE . * IMPL
02f0: 49 45 44 20 57 41 52 52 41 4e 54 49 45 53 20 4f  IED WARRANTIES O
0300: 46 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  F MERCHANTABILIT
0310: 59 20 41 4e 44 20 46 49 54 4e 45 53 53 20 46 4f  Y AND FITNESS FO
0320: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
0330: 55 52 50 4f 53 45 20 0a 20 2a 20 41 52 45 20 44  URPOSE . * ARE D
0340: 49 53 43 4c 41 49 4d 45 44 2e 20 20 49 4e 20 4e  ISCLAIMED.  IN N
0350: 4f 20 45 56 45 4e 54 20 53 48 41 4c 4c 20 54 48  O EVENT SHALL TH
0360: 45 20 43 4f 50 59 52 49 47 48 54 20 48 4f 4c 44  E COPYRIGHT HOLD
0370: 45 52 20 4f 52 20 43 4f 4e 54 52 49 42 55 54 4f  ER OR CONTRIBUTO
0380: 52 53 20 42 45 20 0a 20 2a 20 4c 49 41 42 4c 45  RS BE . * LIABLE
0390: 20 46 4f 52 20 41 4e 59 20 44 49 52 45 43 54 2c   FOR ANY DIRECT,
03a0: 20 49 4e 44 49 52 45 43 54 2c 20 49 4e 43 49 44   INDIRECT, INCID
03b0: 45 4e 54 41 4c 2c 20 53 50 45 43 49 41 4c 2c 20  ENTAL, SPECIAL, 
03c0: 45 58 45 4d 50 4c 41 52 59 2c 20 4f 52 20 0a 20  EXEMPLARY, OR . 
03d0: 2a 20 43 4f 4e 53 45 51 55 45 4e 54 49 41 4c 20  * CONSEQUENTIAL 
03e0: 44 41 4d 41 47 45 53 20 28 49 4e 43 4c 55 44 49  DAMAGES (INCLUDI
03f0: 4e 47 2c 20 42 55 54 20 4e 4f 54 20 4c 49 4d 49  NG, BUT NOT LIMI
0400: 54 45 44 20 54 4f 2c 20 50 52 4f 43 55 52 45 4d  TED TO, PROCUREM
0410: 45 4e 54 20 4f 46 20 0a 20 2a 20 53 55 42 53 54  ENT OF . * SUBST
0420: 49 54 55 54 45 20 47 4f 4f 44 53 20 4f 52 20 53  ITUTE GOODS OR S
0430: 45 52 56 49 43 45 53 3b 20 4c 4f 53 53 20 4f 46  ERVICES; LOSS OF
0440: 20 55 53 45 2c 20 44 41 54 41 2c 20 4f 52 20 50   USE, DATA, OR P
0450: 52 4f 46 49 54 53 3b 20 4f 52 20 42 55 53 49 4e  ROFITS; OR BUSIN
0460: 45 53 53 20 0a 20 2a 20 49 4e 54 45 52 52 55 50  ESS . * INTERRUP
0470: 54 49 4f 4e 29 20 48 4f 57 45 56 45 52 20 43 41  TION) HOWEVER CA
0480: 55 53 45 44 20 41 4e 44 20 4f 4e 20 41 4e 59 20  USED AND ON ANY 
0490: 54 48 45 4f 52 59 20 4f 46 20 4c 49 41 42 49 4c  THEORY OF LIABIL
04a0: 49 54 59 2c 20 57 48 45 54 48 45 52 20 49 4e 20  ITY, WHETHER IN 
04b0: 0a 20 2a 20 43 4f 4e 54 52 41 43 54 2c 20 53 54  . * CONTRACT, ST
04c0: 52 49 43 54 20 4c 49 41 42 49 4c 49 54 59 2c 20  RICT LIABILITY, 
04d0: 4f 52 20 54 4f 52 54 20 28 49 4e 43 4c 55 44 49  OR TORT (INCLUDI
04e0: 4e 47 20 4e 45 47 4c 49 47 45 4e 43 45 20 4f 52  NG NEGLIGENCE OR
04f0: 20 4f 54 48 45 52 57 49 53 45 29 20 0a 20 2a 20   OTHERWISE) . * 
0500: 41 52 49 53 49 4e 47 20 49 4e 20 41 4e 59 20 57  ARISING IN ANY W
0510: 41 59 20 4f 55 54 20 4f 46 20 54 48 45 20 55 53  AY OUT OF THE US
0520: 45 20 4f 46 20 54 48 49 53 20 53 4f 46 54 57 41  E OF THIS SOFTWA
0530: 52 45 2c 20 45 56 45 4e 20 49 46 20 41 44 56 49  RE, EVEN IF ADVI
0540: 53 45 44 20 4f 46 20 54 48 45 20 0a 20 2a 20 50  SED OF THE . * P
0550: 4f 53 53 49 42 49 4c 49 54 59 20 4f 46 20 53 55  OSSIBILITY OF SU
0560: 43 48 20 44 41 4d 41 47 45 2e 0a 20 2a 2f 0a 23  CH DAMAGE.. */.#
0570: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 65 6e  include <sys/sen
0580: 64 66 69 6c 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  dfile.h>.#includ
0590: 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e  e <sys/socket.h>
05a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
05b0: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
05c0: 20 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23   <arpa/inet.h>.#
05d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61  include <sys/mma
05e0: 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  n.h>.#include <s
05f0: 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c  ys/stat.h>.#incl
0600: 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e  ude <sys/wait.h>
0610: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  .#include <pthre
0620: 61 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ad.h>.#include <
0630: 73 74 72 69 6e 67 73 2e 68 3e 0a 23 69 6e 63 6c  strings.h>.#incl
0640: 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23  ude <signal.h>.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0660: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0670: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0680: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0690: 75 64 65 20 3c 67 65 74 6f 70 74 2e 68 3e 0a 23  ude <getopt.h>.#
06a0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
06b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e  h>.#include <fcn
06c0: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
06d0: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  stdio.h>.#includ
06e0: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63  e <errno.h>.#inc
06f0: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69  lude <time.h>.#i
0700: 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 0a  nclude <pwd.h>..
0710: 2f 2a 0a 20 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*. * Determine 
0720: 69 66 20 74 68 65 20 43 20 63 6f 6d 70 69 6c 65  if the C compile
0730: 72 20 73 75 70 70 6f 72 74 73 20 43 31 31 20 61  r supports C11 a
0740: 74 6f 6d 69 63 73 0a 20 2a 2f 0a 23 69 66 20 5f  tomics. */.#if _
0750: 5f 53 54 44 43 5f 56 45 52 53 49 4f 4e 5f 5f 20  _STDC_VERSION__ 
0760: 3e 3d 20 32 30 31 31 31 32 4c 0a 23 20 20 69 66  >= 201112L.#  if
0770: 6e 64 65 66 20 5f 5f 53 54 44 43 5f 4e 4f 5f 41  ndef __STDC_NO_A
0780: 54 4f 4d 49 43 53 5f 5f 0a 23 20 20 20 20 64 65  TOMICS__.#    de
0790: 66 69 6e 65 20 46 49 4c 45 44 5f 46 45 41 54 55  fine FILED_FEATU
07a0: 52 45 5f 43 31 31 5f 41 54 4f 4d 49 43 53 20 31  RE_C11_ATOMICS 1
07b0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
07c0: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 65 20 43  ../*. * If the C
07d0: 20 63 6f 6d 70 69 6c 65 72 20 64 6f 65 73 20 6e   compiler does n
07e0: 6f 74 20 73 75 70 70 6f 72 74 20 43 31 31 20 61  ot support C11 a
07f0: 74 6f 6d 69 63 73 2c 20 64 69 73 61 62 6c 65 20  tomics, disable 
0800: 54 49 4d 45 4f 55 54 20 73 75 70 70 6f 72 74 0a  TIMEOUT support.
0810: 20 2a 20 73 69 6e 63 65 20 69 74 20 72 65 6c 69   * since it reli
0820: 65 73 20 75 70 6f 6e 20 69 74 0a 20 2a 2f 0a 23  es upon it. */.#
0830: 69 66 6e 64 65 66 20 46 49 4c 45 44 5f 46 45 41  ifndef FILED_FEA
0840: 54 55 52 45 5f 43 31 31 5f 41 54 4f 4d 49 43 53  TURE_C11_ATOMICS
0850: 0a 23 20 20 77 61 72 6e 69 6e 67 20 22 41 75 74  .#  warning "Aut
0860: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e  omatically defin
0870: 69 6e 67 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 54  ing FILED_DONT_T
0880: 49 4d 45 4f 55 54 20 73 69 6e 63 65 20 79 6f 75  IMEOUT since you
0890: 72 20 43 20 63 6f 6d 70 69 6c 65 72 20 6c 61 63  r C compiler lac
08a0: 6b 73 20 43 31 31 20 61 74 6f 6d 69 63 73 22 0a  ks C11 atomics".
08b0: 23 20 20 64 65 66 69 6e 65 20 46 49 4c 45 44 5f  #  define FILED_
08c0: 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 20 31 0a 23  DONT_TIMEOUT 1.#
08d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
08e0: 73 65 20 68 65 61 64 65 72 73 20 61 72 65 20 6f  se headers are o
08f0: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 66 6f 72  nly required for
0900: 20 54 49 4d 45 4f 55 54 20 73 75 70 70 6f 72 74   TIMEOUT support
0910: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 46 49 4c  . */.#ifndef FIL
0920: 45 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 0a  ED_DONT_TIMEOUT.
0930: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 74 6f  #include <stdato
0940: 6d 69 63 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  mic.h>.#include 
0950: 3c 73 74 64 62 6f 6f 6c 2e 68 3e 0a 23 65 6e 64  <stdbool.h>.#end
0960: 69 66 0a 0a 2f 2a 20 43 6f 6d 70 69 6c 65 20 74  if../* Compile t
0970: 69 6d 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  ime constants */
0980: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 56  .#define FILED_V
0990: 45 52 53 49 4f 4e 20 22 31 2e 31 37 22 0a 23 64  ERSION "1.17".#d
09a0: 65 66 69 6e 65 20 46 49 4c 45 44 5f 53 45 4e 44  efine FILED_SEND
09b0: 46 49 4c 45 5f 4d 41 58 20 31 36 37 37 37 32 31  FILE_MAX 1677721
09c0: 35 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f  5.#define FILED_
09d0: 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43 4f 55 4e  MAX_FAILURE_COUN
09e0: 54 20 33 30 0a 23 64 65 66 69 6e 65 20 46 49 4c  T 30.#define FIL
09f0: 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 20  ED_DEFAULT_TYPE 
0a00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
0a10: 65 74 2d 73 74 72 65 61 6d 22 0a 23 64 65 66 69  et-stream".#defi
0a20: 6e 65 20 46 49 4c 45 44 5f 50 41 54 48 5f 42 55  ne FILED_PATH_BU
0a30: 46 46 45 52 5f 53 49 5a 45 20 31 30 31 30 0a 0a  FFER_SIZE 1010..
0a40: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
0a50: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f 52  s */.#define POR
0a60: 54 20 38 30 0a 23 64 65 66 69 6e 65 20 54 48 52  T 80.#define THR
0a70: 45 41 44 5f 43 4f 55 4e 54 20 35 0a 23 64 65 66  EAD_COUNT 5.#def
0a80: 69 6e 65 20 42 49 4e 44 5f 41 44 44 52 20 22 3a  ine BIND_ADDR ":
0a90: 3a 22 0a 23 64 65 66 69 6e 65 20 43 41 43 48 45  :".#define CACHE
0aa0: 5f 53 49 5a 45 20 38 32 30 39 0a 23 64 65 66 69  _SIZE 8209.#defi
0ab0: 6e 65 20 4c 4f 47 5f 46 49 4c 45 20 22 2d 22 0a  ne LOG_FILE "-".
0ac0: 0a 2f 2a 20 46 75 7a 7a 69 6e 67 20 54 65 73 74  ./* Fuzzing Test
0ad0: 20 43 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20   Code */.#ifdef 
0ae0: 46 49 4c 45 44 5f 54 45 53 54 5f 41 46 4c 0a 23  FILED_TEST_AFL.#
0af0: 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44 4f 4e  define FILED_DON
0b00: 54 5f 4c 4f 47 20 31 0a 23 64 65 66 69 6e 65 20  T_LOG 1.#define 
0b10: 46 49 4c 45 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f  FILED_DONT_TIMEO
0b20: 55 54 20 31 0a 23 64 65 66 69 6e 65 20 70 74 68  UT 1.#define pth
0b30: 72 65 61 64 5f 63 72 65 61 74 65 28 61 2c 20 78  read_create(a, x
0b40: 2c 20 79 2c 20 7a 29 20 61 66 6c 5f 70 74 68 72  , y, z) afl_pthr
0b50: 65 61 64 5f 63 72 65 61 74 65 28 61 2c 20 78 2c  ead_create(a, x,
0b60: 20 79 2c 20 7a 29 0a 23 64 65 66 69 6e 65 20 62   y, z).#define b
0b70: 69 6e 64 28 78 2c 20 79 2c 20 7a 29 20 61 66 6c  ind(x, y, z) afl
0b80: 5f 62 69 6e 64 28 78 2c 20 79 2c 20 7a 29 0a 23  _bind(x, y, z).#
0b90: 64 65 66 69 6e 65 20 73 6f 63 6b 65 74 28 78 2c  define socket(x,
0ba0: 20 79 2c 20 7a 29 20 38 31 39 33 0a 23 64 65 66   y, z) 8193.#def
0bb0: 69 6e 65 20 6c 69 73 74 65 6e 28 78 2c 20 79 29  ine listen(x, y)
0bc0: 20 30 0a 23 64 65 66 69 6e 65 20 61 63 63 65 70   0.#define accep
0bd0: 74 28 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f 61  t(x, y, z) afl_a
0be0: 63 63 65 70 74 28 78 2c 20 79 2c 20 7a 29 0a 23  ccept(x, y, z).#
0bf0: 64 65 66 69 6e 65 20 63 6c 6f 73 65 28 78 29 20  define close(x) 
0c00: 7b 20 69 66 20 28 73 74 72 63 6d 70 28 23 78 2c  { if (strcmp(#x,
0c10: 20 22 72 61 6e 64 6f 6d 5f 66 64 22 29 20 3d 3d   "random_fd") ==
0c20: 20 30 29 20 7b 20 63 6c 6f 73 65 28 78 29 3b 20   0) { close(x); 
0c30: 7d 20 65 6c 73 65 20 7b 20 65 78 69 74 28 30 29  } else { exit(0)
0c40: 3b 20 7d 20 7d 0a 23 64 65 66 69 6e 65 20 66 63  ; } }.#define fc
0c50: 6c 6f 73 65 28 78 29 20 65 78 69 74 28 30 29 0a  lose(x) exit(0).
0c60: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 6c 5f  .static int afl_
0c70: 61 63 63 65 70 74 28 69 6e 74 20 78 2c 20 76 6f  accept(int x, vo
0c80: 69 64 20 2a 61 64 64 72 2c 20 76 6f 69 64 20 2a  id *addr, void *
0c90: 7a 29 20 7b 0a 09 28 28 73 74 72 75 63 74 20 73  z) {..((struct s
0ca0: 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29 20 61  ockaddr_in6 *) a
0cb0: 64 64 72 29 2d 3e 73 69 6e 36 5f 66 61 6d 69 6c  ddr)->sin6_famil
0cc0: 79 20 3d 20 41 46 5f 49 4e 45 54 20 2b 20 41 46  y = AF_INET + AF
0cd0: 5f 49 4e 45 54 36 20 2b 20 31 3b 0a 09 72 65 74  _INET6 + 1;..ret
0ce0: 75 72 6e 28 53 54 44 49 4e 5f 46 49 4c 45 4e 4f  urn(STDIN_FILENO
0cf0: 29 3b 0a 09 78 20 3d 20 78 3b 0a 09 7a 20 3d 20  );..x = x;..z = 
0d00: 7a 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  z;.}..static int
0d10: 20 61 66 6c 5f 62 69 6e 64 28 69 6e 74 20 78 2c   afl_bind(int x,
0d20: 20 76 6f 69 64 20 2a 79 2c 20 73 6f 63 6b 6c 65   void *y, sockle
0d30: 6e 5f 74 20 7a 29 20 7b 0a 09 72 65 74 75 72 6e  n_t z) {..return
0d40: 28 38 31 39 34 29 3b 0a 09 78 20 3d 20 78 3b 0a  (8194);..x = x;.
0d50: 09 79 20 3d 20 79 3b 0a 09 7a 20 3d 20 7a 3b 0a  .y = y;..z = z;.
0d60: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  }..static int af
0d70: 6c 5f 70 74 68 72 65 61 64 5f 63 72 65 61 74 65  l_pthread_create
0d80: 28 70 74 68 72 65 61 64 5f 74 20 2a 74 68 72 65  (pthread_t *thre
0d90: 61 64 2c 20 63 6f 6e 73 74 20 70 74 68 72 65 61  ad, const pthrea
0da0: 64 5f 61 74 74 72 5f 74 20 2a 61 74 74 72 2c 20  d_attr_t *attr, 
0db0: 76 6f 69 64 20 2a 28 2a 73 74 61 72 74 5f 72 6f  void *(*start_ro
0dc0: 75 74 69 6e 65 29 20 28 76 6f 69 64 20 2a 29 2c  utine) (void *),
0dd0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 09 73   void *arg) {..s
0de0: 74 61 72 74 5f 72 6f 75 74 69 6e 65 28 61 72 67  tart_routine(arg
0df0: 29 3b 0a 09 65 78 69 74 28 33 29 3b 0a 09 74 68  );..exit(3);..th
0e00: 72 65 61 64 20 3d 20 74 68 72 65 61 64 3b 0a 09  read = thread;..
0e10: 61 74 74 72 20 3d 20 61 74 74 72 3b 0a 7d 0a 23  attr = attr;.}.#
0e20: 65 6e 64 69 66 0a 0a 2f 2a 20 43 6f 6e 66 69 67  endif../* Config
0e30: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
0e40: 74 68 61 74 20 77 6f 72 6b 20 74 68 72 65 61 64  that work thread
0e50: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 77 61  s need to be awa
0e60: 72 65 20 6f 66 20 2a 2f 0a 73 74 72 75 63 74 20  re of */.struct 
0e70: 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 7b 0a  filed_options {.
0e80: 09 69 6e 74 20 76 68 6f 73 74 73 5f 65 6e 61 62  .int vhosts_enab
0e90: 6c 65 64 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67 75  led;.};../* Argu
0ea0: 6d 65 6e 74 73 20 66 6f 72 20 77 6f 72 6b 65 72  ments for worker
0eb0: 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72 75   threads */.stru
0ec0: 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f  ct filed_worker_
0ed0: 74 68 72 65 61 64 5f 61 72 67 73 20 7b 0a 09 69  thread_args {..i
0ee0: 6e 74 20 66 64 3b 0a 09 73 74 72 75 63 74 20 66  nt fd;..struct f
0ef0: 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 6f 70 74  iled_options opt
0f00: 69 6f 6e 73 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67  ions;.};../* Arg
0f10: 75 6d 65 6e 74 73 20 66 6f 72 20 6c 6f 67 67 69  uments for loggi
0f20: 6e 67 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74  ng threads */.st
0f30: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69  ruct filed_loggi
0f40: 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 7b  ng_thread_args {
0f50: 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 7d 3b 0a 0a  ..FILE *fp;.};..
0f60: 2f 2a 20 46 69 6c 65 20 69 6e 66 6f 72 6d 61 74  /* File informat
0f70: 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 66 69  ion */.struct fi
0f80: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 7b 0a 09  led_fileinfo {..
0f90: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
0fa0: 6d 75 74 65 78 3b 0a 09 63 68 61 72 20 70 61 74  mutex;..char pat
0fb0: 68 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46  h[FILED_PATH_BUF
0fc0: 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 69 6e 74 20  FER_SIZE];..int 
0fd0: 66 64 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e 3b 0a  fd;..off_t len;.
0fe0: 09 63 68 61 72 20 2a 6c 61 73 74 6d 6f 64 3b 0a  .char *lastmod;.
0ff0: 09 63 68 61 72 20 6c 61 73 74 6d 6f 64 5f 62 5b  .char lastmod_b[
1000: 36 34 5d 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72  64];..const char
1010: 20 2a 74 79 70 65 3b 0a 09 63 68 61 72 20 65 74   *type;..char et
1020: 61 67 5b 36 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 20 52  ag[64];.};../* R
1030: 65 71 75 65 73 74 20 76 61 72 69 61 62 6c 65 73  equest variables
1040: 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64   */.struct filed
1050: 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 7b 0a  _http_request {.
1060: 09 2f 2a 2a 20 42 75 66 66 65 72 73 20 2a 2a 2f  ./** Buffers **/
1070: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66  ..struct filed_f
1080: 69 6c 65 69 6e 66 6f 20 66 69 6c 65 69 6e 66 6f  ileinfo fileinfo
1090: 3b 0a 09 63 68 61 72 20 74 6d 70 62 75 66 5b 46  ;..char tmpbuf[F
10a0: 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52  ILED_PATH_BUFFER
10b0: 5f 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 2a 20 48 54  _SIZE];.../** HT
10c0: 54 50 20 52 65 71 75 65 73 74 20 69 6e 66 6f 72  TP Request infor
10d0: 6d 61 74 69 6f 6e 20 2a 2a 2f 0a 09 2f 2a 2a 2a  mation **/../***
10e0: 20 54 79 70 65 20 6f 66 20 72 65 71 75 65 73 74   Type of request
10f0: 20 28 48 45 41 44 20 6f 72 20 47 45 54 29 20 2a   (HEAD or GET) *
1100: 2a 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46 49  **/..enum {...FI
1110: 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48  LED_REQUEST_METH
1120: 4f 44 5f 47 45 54 2c 0a 09 09 46 49 4c 45 44 5f  OD_GET,...FILED_
1130: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48  REQUEST_METHOD_H
1140: 45 41 44 0a 09 7d 20 6d 65 74 68 6f 64 3b 0a 0a  EAD..} method;..
1150: 09 2f 2a 2a 2a 20 50 61 74 68 20 62 65 69 6e 67  ./*** Path being
1160: 20 72 65 71 75 65 73 74 65 64 20 2a 2a 2a 2f 0a   requested ***/.
1170: 09 63 68 61 72 20 70 61 74 68 5b 46 49 4c 45 44  .char path[FILED
1180: 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a  _PATH_BUFFER_SIZ
1190: 45 5d 3b 20 0a 0a 09 2f 2a 2a 2a 20 50 61 74 68  E]; .../*** Path
11a0: 20 74 79 70 65 20 2a 2a 2a 2f 0a 09 65 6e 75 6d   type ***/..enum
11b0: 20 7b 0a 09 09 46 49 4c 45 44 5f 52 45 51 55 45   {...FILED_REQUE
11c0: 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52  ST_TYPE_DIRECTOR
11d0: 59 2c 0a 09 09 46 49 4c 45 44 5f 52 45 51 55 45  Y,...FILED_REQUE
11e0: 53 54 5f 54 59 50 45 5f 4f 54 48 45 52 0a 09 7d  ST_TYPE_OTHER..}
11f0: 20 74 79 70 65 3b 0a 0a 09 73 74 72 75 63 74 20   type;...struct 
1200: 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09  {...struct {....
1210: 69 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09 09  int present;....
1220: 6f 66 66 5f 74 20 6f 66 66 73 65 74 3b 20 20 20  off_t offset;   
1230: 2f 2a 2a 2a 20 52 61 6e 67 65 20 73 74 61 72 74  /*** Range start
1240: 20 2a 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20 6c   ***/....off_t l
1250: 65 6e 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52 61  ength;   /*** Ra
1260: 6e 67 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f 0a  nge length ***/.
1270: 09 09 7d 20 72 61 6e 67 65 3b 0a 0a 09 09 73 74  ..} range;....st
1280: 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 70 72  ruct {....int pr
1290: 65 73 65 6e 74 3b 0a 09 09 09 63 68 61 72 20 68  esent;....char h
12a0: 6f 73 74 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42  ost[FILED_PATH_B
12b0: 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 09 7d  UFFER_SIZE];...}
12c0: 20 68 6f 73 74 3b 0a 0a 09 09 65 6e 75 6d 20 7b   host;....enum {
12d0: 0a 09 09 09 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  ....FILED_CONNEC
12e0: 54 49 4f 4e 5f 43 4c 4f 53 45 2c 0a 09 09 09 46  TION_CLOSE,....F
12f0: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
1300: 4b 45 45 50 5f 41 4c 49 56 45 0a 09 09 7d 20 63  KEEP_ALIVE...} c
1310: 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 09 7d 20 68 65  onnection;..} he
1320: 61 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c 6f  aders;.};../* Lo
1330: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72 75  g record */.stru
1340: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
1350: 72 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20 6f 66  ry {../* Type of
1360: 20 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a 09 65   log entry */..e
1370: 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 4c 4f  num {...FILED_LO
1380: 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 2c 0a  G_TYPE_MESSAGE,.
1390: 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45  ..FILED_LOG_TYPE
13a0: 5f 54 52 41 4e 53 46 45 52 0a 09 7d 20 74 79 70  _TRANSFER..} typ
13b0: 65 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64 20 6c  e;.../* Linked l
13c0: 69 73 74 20 68 65 61 64 2f 74 61 69 6c 20 2a 2f  ist head/tail */
13d0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
13e0: 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78 74 3b  og_entry *_next;
13f0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
1400: 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65 76 3b  og_entry *_prev;
1410: 0a 0a 09 2f 2a 20 54 68 72 65 61 64 20 66 72 6f  .../* Thread fro
1420: 6d 20 77 68 69 63 68 20 74 68 69 73 20 6c 6f 67  m which this log
1430: 20 65 6e 74 72 79 20 65 6d 69 6e 61 74 65 73 20   entry eminates 
1440: 2a 2f 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68  */..pthread_t th
1450: 72 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73 73 61  read;.../* Messa
1460: 67 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 79  ge buffer for ty
1470: 70 65 20 3d 20 4d 45 53 53 41 47 45 20 2a 2f 0a  pe = MESSAGE */.
1480: 09 2f 2a 20 50 61 74 68 20 62 75 66 66 65 72 20  ./* Path buffer 
1490: 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e 53  for type = TRANS
14a0: 46 45 52 20 2a 2f 0a 09 63 68 61 72 20 62 75 66  FER */..char buf
14b0: 66 65 72 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42  fer[FILED_PATH_B
14c0: 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f  UFFER_SIZE];.../
14d0: 2a 20 49 74 65 6d 73 20 66 6f 72 20 74 79 70 65  * Items for type
14e0: 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a 09   = TRANSFER */..
14f0: 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09  int http_code;..
1500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61 73  const char *reas
1510: 6f 6e 3b 0a 09 74 69 6d 65 5f 74 20 73 74 61 72  on;..time_t star
1520: 74 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74 20 65  ttime;..time_t e
1530: 6e 64 74 69 6d 65 3b 0a 09 6f 66 66 5f 74 20 72  ndtime;..off_t r
1540: 65 71 5f 6f 66 66 73 65 74 3b 0a 09 6f 66 66 5f  eq_offset;..off_
1550: 74 20 72 65 71 5f 6c 65 6e 67 74 68 3b 0a 09 6f  t req_length;..o
1560: 66 66 5f 74 20 73 65 6e 74 5f 6c 65 6e 67 74 68  ff_t sent_length
1570: 3b 0a 09 6f 66 66 5f 74 20 66 69 6c 65 5f 6c 65  ;..off_t file_le
1580: 6e 67 74 68 3b 0a 09 63 68 61 72 20 69 70 5b 31  ngth;..char ip[1
1590: 32 38 5d 3b 0a 09 69 6e 74 20 70 6f 72 74 3b 0a  28];..int port;.
15a0: 09 69 6e 74 20 6d 65 74 68 6f 64 3b 0a 7d 3b 0a  .int method;.};.
15b0: 0a 2f 2a 20 47 6c 6f 62 61 6c 20 76 61 72 69 61  ./* Global varia
15c0: 62 6c 65 73 20 2a 2f 0a 2f 2a 2a 20 4f 70 65 6e  bles */./** Open
15d0: 20 46 69 6c 65 20 63 61 63 68 65 20 2a 2a 2f 0a   File cache **/.
15e0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c  struct filed_fil
15f0: 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 66 69 6c  einfo *filed_fil
1600: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d 20  einfo_fdcache = 
1610: 4e 55 4c 4c 3b 0a 75 6e 73 69 67 6e 65 64 20 69  NULL;.unsigned i
1620: 6e 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  nt filed_fileinf
1630: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 3d  o_fdcache_size =
1640: 20 30 3b 0a 0a 2f 2a 2a 20 4c 6f 67 67 69 6e 67   0;../** Logging
1650: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65   **/.struct file
1660: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66 69 6c  d_log_entry *fil
1670: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b  ed_log_msg_list;
1680: 0a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
1690: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c   filed_log_msg_l
16a0: 69 73 74 5f 6d 75 74 65 78 3b 0a 70 74 68 72 65  ist_mutex;.pthre
16b0: 61 64 5f 63 6f 6e 64 5f 74 20 66 69 6c 65 64 5f  ad_cond_t filed_
16c0: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61  log_msg_list_rea
16d0: 64 79 3b 0a 0a 2f 2a 20 53 69 67 6e 61 6c 20 48  dy;../* Signal H
16e0: 61 6e 64 6c 65 72 20 2a 2f 0a 73 74 61 74 69 63  andler */.static
16f0: 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 69 67 6e   void filed_sign
1700: 61 6c 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 73  al_handler(int s
1710: 69 67 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a  ignal_number) {.
1720: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69  .struct filed_fi
1730: 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b 0a 09  leinfo *cache;..
1740: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 78  unsigned int idx
1750: 3b 0a 0a 09 73 77 69 74 63 68 20 28 73 69 67 6e  ;...switch (sign
1760: 61 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 09 63  al_number) {...c
1770: 61 73 65 20 53 49 47 48 55 50 3a 0a 09 09 09 66  ase SIGHUP:....f
1780: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1790: 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66   < filed_fileinf
17a0: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 3b 20  o_fdcache_size; 
17b0: 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 61 63  idx++) {.....cac
17c0: 68 65 20 3d 20 26 66 69 6c 65 64 5f 66 69 6c 65  he = &filed_file
17d0: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78  info_fdcache[idx
17e0: 5d 3b 0a 0a 09 09 09 09 70 74 68 72 65 61 64 5f  ];......pthread_
17f0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63 68  mutex_lock(&cach
1800: 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 09 09  e->mutex);......
1810: 63 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20 3d  cache->path[0] =
1820: 20 27 5c 30 27 3b 0a 09 09 09 09 69 66 20 28 63   '\0';.....if (c
1830: 61 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b  ache->fd >= 0) {
1840: 0a 09 09 09 09 09 63 6c 6f 73 65 28 63 61 63 68  ......close(cach
1850: 65 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 09 63 61  e->fd);.......ca
1860: 63 68 65 2d 3e 66 64 20 3d 20 2d 31 3b 0a 09 09  che->fd = -1;...
1870: 09 09 7d 0a 0a 09 09 09 09 63 61 63 68 65 2d 3e  ..}......cache->
1880: 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09 09  lastmod = "";...
1890: 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d 20  ..cache->type = 
18a0: 22 22 3b 0a 0a 09 09 09 09 70 74 68 72 65 61 64  "";......pthread
18b0: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63  _mutex_unlock(&c
18c0: 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 09 09  ache->mutex);...
18d0: 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  .}....break;..}.
18e0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  ..return;.}../* 
18f0: 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68 65  Initialize cache
1900: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
1910: 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65 28  iled_init_cache(
1920: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63  unsigned int cac
1930: 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e 73 69  he_size) {..unsi
1940: 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 09 69  gned int idx;..i
1950: 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  nt mutex_init_re
1960: 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20 6d 61  t;.../* Cache ma
1970: 79 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e 69 74  y not be re-init
1980: 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66 20 28  ialized */..if (
1990: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
19a0: 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20 30  dcache_size != 0
19b0: 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e   || filed_filein
19c0: 66 6f 5f 66 64 63 61 63 68 65 20 21 3d 20 4e 55  fo_fdcache != NU
19d0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  LL) {...return(1
19e0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f 63  );..}.../* Alloc
19f0: 61 74 65 20 63 61 63 68 65 20 2a 2f 0a 09 66 69  ate cache */..fi
1a00: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1a10: 61 63 68 65 5f 73 69 7a 65 20 3d 20 63 61 63 68  ache_size = cach
1a20: 65 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64 5f 66  e_size;..filed_f
1a30: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20  ileinfo_fdcache 
1a40: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
1a50: 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  *filed_fileinfo_
1a60: 66 64 63 61 63 68 65 29 20 2a 20 66 69 6c 65 64  fdcache) * filed
1a70: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
1a80: 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 66 69  e_size);..if (fi
1a90: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1aa0: 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ache == NULL) {.
1ab0: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
1ac0: 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
1ad0: 63 61 63 68 65 20 65 6e 74 72 69 65 73 20 2a 2f  cache entries */
1ae0: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1af0: 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65  idx < filed_file
1b00: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
1b10: 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d 75  e; idx++) {...mu
1b20: 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 70  tex_init_ret = p
1b30: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
1b40: 74 28 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  t(&filed_fileinf
1b50: 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 6d  o_fdcache[idx].m
1b60: 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69  utex, NULL);...i
1b70: 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  f (mutex_init_re
1b80: 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  t != 0) {....ret
1b90: 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 66  urn(1);...}....f
1ba0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1bb0: 63 61 63 68 65 5b 69 64 78 5d 2e 70 61 74 68 5b  cache[idx].path[
1bc0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 66 69 6c  0] = '\0';...fil
1bd0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
1be0: 63 68 65 5b 69 64 78 5d 2e 66 64 20 3d 20 2d 31  che[idx].fd = -1
1bf0: 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e  ;...filed_filein
1c00: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
1c10: 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09 09  lastmod = "";...
1c20: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
1c30: 64 63 61 63 68 65 5b 69 64 78 5d 2e 74 79 70 65  dcache[idx].type
1c40: 20 3d 20 22 22 3b 0a 09 7d 0a 0a 09 72 65 74 75   = "";..}...retu
1c50: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  rn(0);.}../* Ini
1c60: 74 69 61 6c 69 7a 65 20 70 72 6f 63 65 73 73 20  tialize process 
1c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
1c80: 6c 65 64 5f 69 6e 69 74 28 75 6e 73 69 67 6e 65  led_init(unsigne
1c90: 64 20 69 6e 74 20 63 61 63 68 65 5f 73 69 7a 65  d int cache_size
1ca0: 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20  ) {..static int 
1cb0: 63 61 6c 6c 65 64 20 3d 20 30 3b 0a 09 73 73 69  called = 0;..ssi
1cc0: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 20 3d 20  ze_t read_ret = 
1cd0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  0;..unsigned int
1ce0: 20 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 3d 20   random_value = 
1cf0: 30 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 72 65  0;..int cache_re
1d00: 74 3b 0a 09 69 6e 74 20 72 61 6e 64 6f 6d 5f 66  t;..int random_f
1d10: 64 3b 0a 0a 09 69 66 20 28 63 61 6c 6c 65 64 29  d;...if (called)
1d20: 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
1d30: 09 7d 0a 0a 09 63 61 6c 6c 65 64 20 3d 20 31 3b  .}...called = 1;
1d40: 0a 0a 09 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .../* Attempt to
1d50: 20 6c 6f 63 6b 20 61 6c 6c 20 6d 65 6d 6f 72 79   lock all memory
1d60: 20 74 6f 20 70 68 79 73 69 63 61 6c 20 52 41 4d   to physical RAM
1d70: 20 28 62 75 74 20 64 6f 6e 27 74 20 63 61 72 65   (but don't care
1d80: 20 69 66 20 77 65 20 63 61 6e 27 74 29 20 2a 2f   if we can't) */
1d90: 0a 09 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f 43  ..mlockall(MCL_C
1da0: 55 52 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55 54  URRENT | MCL_FUT
1db0: 55 52 45 29 3b 0a 0a 09 2f 2a 20 49 67 6e 6f 72  URE);.../* Ignor
1dc0: 65 20 53 49 47 50 49 50 45 20 2a 2f 0a 09 73 69  e SIGPIPE */..si
1dd0: 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20 53 49  gnal(SIGPIPE, SI
1de0: 47 5f 49 47 4e 29 3b 0a 0a 09 2f 2a 20 48 61 6e  G_IGN);.../* Han
1df0: 64 6c 65 20 53 49 47 48 55 50 20 74 6f 20 72 65  dle SIGHUP to re
1e00: 6c 65 61 73 65 20 61 6c 6c 20 63 61 63 68 65 73  lease all caches
1e10: 20 2a 2f 0a 09 73 69 67 6e 61 6c 28 53 49 47 48   */..signal(SIGH
1e20: 55 50 2c 20 66 69 6c 65 64 5f 73 69 67 6e 61 6c  UP, filed_signal
1e30: 5f 68 61 6e 64 6c 65 72 29 3b 0a 0a 09 2f 2a 20  _handler);.../* 
1e40: 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68 65  Initialize cache
1e50: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 09 63   structure */..c
1e60: 61 63 68 65 5f 72 65 74 20 3d 20 66 69 6c 65 64  ache_ret = filed
1e70: 5f 69 6e 69 74 5f 63 61 63 68 65 28 63 61 63 68  _init_cache(cach
1e80: 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 63 61  e_size);..if (ca
1e90: 63 68 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  che_ret != 0) {.
1ea0: 09 09 72 65 74 75 72 6e 28 63 61 63 68 65 5f 72  ..return(cache_r
1eb0: 65 74 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69  et);..}.../* Ini
1ec0: 74 69 61 6c 69 7a 65 20 72 61 6e 64 6f 6d 20 6e  tialize random n
1ed0: 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20  umber generator 
1ee0: 2a 2f 0a 09 72 61 6e 64 6f 6d 5f 66 64 20 3d 20  */..random_fd = 
1ef0: 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
1f00: 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  om", O_RDONLY);.
1f10: 09 69 66 20 28 72 61 6e 64 6f 6d 5f 66 64 20 3e  .if (random_fd >
1f20: 3d 20 30 29 20 7b 0a 09 09 72 65 61 64 5f 72 65  = 0) {...read_re
1f30: 74 20 3d 20 72 65 61 64 28 72 61 6e 64 6f 6d 5f  t = read(random_
1f40: 66 64 2c 20 26 72 61 6e 64 6f 6d 5f 76 61 6c 75  fd, &random_valu
1f50: 65 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  e, sizeof(random
1f60: 5f 76 61 6c 75 65 29 29 3b 0a 0a 09 09 63 6c 6f  _value));....clo
1f70: 73 65 28 72 61 6e 64 6f 6d 5f 66 64 29 3b 0a 09  se(random_fd);..
1f80: 7d 0a 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65  }...random_value
1f90: 20 5e 3d 20 67 65 74 70 69 64 28 29 3b 0a 09 72   ^= getpid();..r
1fa0: 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 67  andom_value ^= g
1fb0: 65 74 75 69 64 28 29 3b 0a 09 72 61 6e 64 6f 6d  etuid();..random
1fc0: 5f 76 61 6c 75 65 20 5e 3d 20 74 69 6d 65 28 4e  _value ^= time(N
1fd0: 55 4c 4c 29 3b 0a 0a 09 73 72 61 6e 64 6f 6d 28  ULL);...srandom(
1fe0: 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 29 3b 0a 0a  random_value);..
1ff0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 0a 09 2f 2a  .return(0);.../*
2000: 20 4e 4f 54 52 45 41 43 48 3a 20 52 65 61 64 20   NOTREACH: Read 
2010: 6d 61 79 20 66 61 69 6c 20 6f 72 20 73 75 63 63  may fail or succ
2020: 65 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 61 63  eed, we don't ac
2030: 74 75 61 6c 6c 79 20 63 61 72 65 20 2a 2f 0a 09  tually care */..
2040: 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64 5f  read_ret = read_
2050: 72 65 74 3b 0a 7d 0a 0a 2f 2a 20 4c 69 73 74 65  ret;.}../* Liste
2060: 6e 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  n on a particula
2070: 72 20 61 64 64 72 65 73 73 2f 70 6f 72 74 20 2a  r address/port *
2080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2090: 65 64 5f 6c 69 73 74 65 6e 28 63 6f 6e 73 74 20  ed_listen(const 
20a0: 63 68 61 72 20 2a 61 64 64 72 65 73 73 2c 20 75  char *address, u
20b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 6f 72 74  nsigned int port
20c0: 29 20 7b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b  ) {..struct sock
20d0: 61 64 64 72 5f 69 6e 36 20 61 64 64 72 5f 76 36  addr_in6 addr_v6
20e0: 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ;..struct sockad
20f0: 64 72 5f 69 6e 20 61 64 64 72 5f 76 34 3b 0a 09  dr_in addr_v4;..
2100: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
2110: 2a 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f  *addr;..socklen_
2120: 74 20 61 64 64 72 5f 6c 65 6e 3b 0a 09 69 6e 74  t addr_len;..int
2130: 20 70 74 6f 6e 5f 72 65 74 2c 20 62 69 6e 64 5f   pton_ret, bind_
2140: 72 65 74 2c 20 6c 69 73 74 65 6e 5f 72 65 74 3b  ret, listen_ret;
2150: 0a 09 69 6e 74 20 66 61 6d 69 6c 79 3b 0a 09 69  ..int family;..i
2160: 6e 74 20 66 64 3b 0a 0a 09 66 61 6d 69 6c 79 20  nt fd;...family 
2170: 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09 70 74 6f  = AF_INET6;..pto
2180: 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f  n_ret = inet_pto
2190: 6e 28 66 61 6d 69 6c 79 2c 20 61 64 64 72 65 73  n(family, addres
21a0: 73 2c 20 26 61 64 64 72 5f 76 36 2e 73 69 6e 36  s, &addr_v6.sin6
21b0: 5f 61 64 64 72 2e 73 36 5f 61 64 64 72 29 3b 0a  _addr.s6_addr);.
21c0: 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20 21 3d  .if (pton_ret !=
21d0: 20 31 29 20 7b 0a 09 09 66 61 6d 69 6c 79 20 3d   1) {...family =
21e0: 20 41 46 5f 49 4e 45 54 3b 0a 09 09 70 74 6f 6e   AF_INET;...pton
21f0: 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e  _ret = inet_pton
2200: 28 66 61 6d 69 6c 79 2c 20 61 64 64 72 65 73 73  (family, address
2210: 2c 20 26 61 64 64 72 5f 76 34 2e 73 69 6e 5f 61  , &addr_v4.sin_a
2220: 64 64 72 2e 73 5f 61 64 64 72 29 3b 0a 09 09 69  ddr.s_addr);...i
2230: 66 20 28 70 74 6f 6e 5f 72 65 74 20 21 3d 20 31  f (pton_ret != 1
2240: 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  ) {....return(-1
2250: 29 3b 0a 09 09 7d 0a 0a 09 09 61 64 64 72 5f 76  );...}....addr_v
2260: 34 2e 73 69 6e 5f 66 61 6d 69 6c 79 20 3d 20 66  4.sin_family = f
2270: 61 6d 69 6c 79 3b 0a 09 09 61 64 64 72 5f 76 34  amily;...addr_v4
2280: 2e 73 69 6e 5f 70 6f 72 74 20 3d 20 68 74 6f 6e  .sin_port = hton
2290: 73 28 70 6f 72 74 29 3b 0a 0a 09 09 61 64 64 72  s(port);....addr
22a0: 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61   = (struct socka
22b0: 64 64 72 20 2a 29 20 26 61 64 64 72 5f 76 34 3b  ddr *) &addr_v4;
22c0: 0a 09 09 61 64 64 72 5f 6c 65 6e 20 3d 20 73 69  ...addr_len = si
22d0: 7a 65 6f 66 28 61 64 64 72 5f 76 34 29 3b 0a 09  zeof(addr_v4);..
22e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 61 64 64 72 5f  } else {...addr_
22f0: 76 36 2e 73 69 6e 36 5f 66 61 6d 69 6c 79 20 3d  v6.sin6_family =
2300: 20 41 46 5f 49 4e 45 54 36 3b 0a 09 09 61 64 64   AF_INET6;...add
2310: 72 5f 76 36 2e 73 69 6e 36 5f 66 6c 6f 77 69 6e  r_v6.sin6_flowin
2320: 66 6f 20 3d 20 30 3b 0a 09 09 61 64 64 72 5f 76  fo = 0;...addr_v
2330: 36 2e 73 69 6e 36 5f 73 63 6f 70 65 5f 69 64 20  6.sin6_scope_id 
2340: 3d 20 30 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73  = 0;...addr_v6.s
2350: 69 6e 36 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73  in6_port = htons
2360: 28 70 6f 72 74 29 3b 0a 0a 09 09 61 64 64 72 20  (port);....addr 
2370: 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64  = (struct sockad
2380: 64 72 20 2a 29 20 26 61 64 64 72 5f 76 36 3b 0a  dr *) &addr_v6;.
2390: 09 09 61 64 64 72 5f 6c 65 6e 20 3d 20 73 69 7a  ..addr_len = siz
23a0: 65 6f 66 28 61 64 64 72 5f 76 36 29 3b 0a 09 7d  eof(addr_v6);..}
23b0: 0a 0a 09 66 64 20 3d 20 73 6f 63 6b 65 74 28 66  ...fd = socket(f
23c0: 61 6d 69 6c 79 2c 20 53 4f 43 4b 5f 53 54 52 45  amily, SOCK_STRE
23d0: 41 4d 2c 20 30 29 3b 0a 09 69 66 20 28 66 64 20  AM, 0);..if (fd 
23e0: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
23f0: 66 64 29 3b 0a 09 7d 0a 0a 09 62 69 6e 64 5f 72  fd);..}...bind_r
2400: 65 74 20 3d 20 62 69 6e 64 28 66 64 2c 20 61 64  et = bind(fd, ad
2410: 64 72 2c 20 61 64 64 72 5f 6c 65 6e 29 3b 0a 09  dr, addr_len);..
2420: 69 66 20 28 62 69 6e 64 5f 72 65 74 20 3c 20 30  if (bind_ret < 0
2430: 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b  ) {...close(fd);
2440: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
2450: 09 7d 0a 0a 09 6c 69 73 74 65 6e 5f 72 65 74 20  .}...listen_ret 
2460: 3d 20 6c 69 73 74 65 6e 28 66 64 2c 20 31 32 38  = listen(fd, 128
2470: 29 3b 0a 09 69 66 20 28 6c 69 73 74 65 6e 5f 72  );..if (listen_r
2480: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 63 6c 6f  et != 0) {...clo
2490: 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74 75 72  se(fd);....retur
24a0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  n(-1);..}...retu
24b0: 72 6e 28 66 64 29 3b 0a 7d 0a 0a 2f 2a 20 4c 6f  rn(fd);.}../* Lo
24c0: 67 20 61 20 6d 65 73 73 61 67 65 20 2a 2f 0a 23  g a message */.#
24d0: 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54  ifdef FILED_DONT
24e0: 5f 4c 4f 47 0a 23 20 20 64 65 66 69 6e 65 20 66  _LOG.#  define f
24f0: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
2500: 65 61 64 5f 69 6e 69 74 28 78 29 20 30 0a 23 20  ead_init(x) 0.# 
2510: 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f   define filed_lo
2520: 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e  g_msg_debug(x, .
2530: 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69  ..) /**/.#  defi
2540: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ne filed_log_msg
2550: 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20  (x, ...) /**/.# 
2560: 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f   define filed_lo
2570: 67 5f 65 6e 74 72 79 28 78 29 20 2f 2a 2a 2f 0a  g_entry(x) /**/.
2580: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
2590: 6c 6f 67 5f 69 70 28 78 2c 20 2e 2e 2e 29 20 4e  log_ip(x, ...) N
25a0: 55 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 66 69  ULL.#  define fi
25b0: 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 78 29 20 26  led_log_new(x) &
25c0: 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 0a  local_dummy_log.
25d0: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
25e0: 6c 6f 67 5f 66 72 65 65 28 78 29 20 2f 2a 2a 2f  log_free(x) /**/
25f0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 6c 6f 67 67  ../* Return logg
2600: 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 73 74  ing handle */.st
2610: 61 74 69 63 20 46 49 4c 45 20 2a 66 69 6c 65 64  atic FILE *filed
2620: 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  _log_open(const 
2630: 63 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a 09 72  char *file) {..r
2640: 65 74 75 72 6e 28 73 74 64 6f 75 74 29 3b 0a 09  eturn(stdout);..
2650: 66 69 6c 65 20 3d 20 66 69 6c 65 3b 0a 7d 0a 23  file = file;.}.#
2660: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 66  else.#  define f
2670: 69 6c 65 64 5f 6c 6f 67 5f 66 72 65 65 28 78 29  iled_log_free(x)
2680: 20 66 72 65 65 28 78 29 0a 23 20 20 69 66 64 65   free(x).#  ifde
2690: 66 20 46 49 4c 45 44 5f 44 45 42 55 47 0a 23 20  f FILED_DEBUG.# 
26a0: 20 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f     define filed_
26b0: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c  log_msg_debug(x,
26c0: 20 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28   ...) { fprintf(
26d0: 73 74 64 65 72 72 2c 20 78 2c 20 5f 5f 56 41 5f  stderr, x, __VA_
26e0: 41 52 47 53 5f 5f 29 3b 20 66 70 72 69 6e 74 66  ARGS__); fprintf
26f0: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20  (stderr, "\n"); 
2700: 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20  fflush(stderr); 
2710: 7d 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  }.#  else.#    d
2720: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
2730: 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e  msg_debug(x, ...
2740: 29 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 66 0a  ) /**/.#  endif.
2750: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6c  ./* Initialize l
2760: 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a 2f  ogging thread */
2770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69  .static void *fi
2780: 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65  led_logging_thre
2790: 61 64 28 76 6f 69 64 20 2a 61 72 67 5f 70 29 20  ad(void *arg_p) 
27a0: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
27b0: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 61  logging_thread_a
27c0: 72 67 73 20 2a 61 72 67 3b 0a 09 73 74 72 75 63  rgs *arg;..struc
27d0: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  t filed_log_entr
27e0: 79 20 2a 63 75 72 72 2c 20 2a 70 72 65 76 3b 0a  y *curr, *prev;.
27f0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65 74  .const char *met
2800: 68 6f 64 3b 0a 09 74 69 6d 65 5f 74 20 6e 6f 77  hod;..time_t now
2810: 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 61  ;..FILE *fp;...a
2820: 72 67 20 3d 20 61 72 67 5f 70 3b 0a 0a 09 66 70  rg = arg_p;...fp
2830: 20 3d 20 61 72 67 2d 3e 66 70 3b 0a 0a 09 77 68   = arg->fp;...wh
2840: 69 6c 65 20 28 31 29 20 7b 0a 09 09 70 74 68 72  ile (1) {...pthr
2850: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
2860: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
2870: 73 74 5f 6d 75 74 65 78 29 3b 0a 09 09 70 74 68  st_mutex);...pth
2880: 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69 74 28 26  read_cond_wait(&
2890: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
28a0: 73 74 5f 72 65 61 64 79 2c 20 26 66 69 6c 65 64  st_ready, &filed
28b0: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
28c0: 74 65 78 29 3b 0a 0a 09 09 63 75 72 72 20 3d 20  tex);....curr = 
28d0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
28e0: 73 74 3b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  st;...filed_log_
28f0: 6d 73 67 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b  msg_list = NULL;
2900: 0a 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ....pthread_mute
2910: 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f  x_unlock(&filed_
2920: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74  log_msg_list_mut
2930: 65 78 29 3b 0a 0a 09 09 6e 6f 77 20 3d 20 74 69  ex);....now = ti
2940: 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 09 70 72 65  me(NULL);....pre
2950: 76 20 3d 20 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20  v = NULL;...for 
2960: 28 3b 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20  (; curr; curr = 
2970: 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09  curr->_next) {..
2980: 09 09 63 75 72 72 2d 3e 5f 70 72 65 76 20 3d 20  ..curr->_prev = 
2990: 70 72 65 76 3b 0a 0a 09 09 09 70 72 65 76 20 3d  prev;.....prev =
29a0: 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 63 75   curr;...}....cu
29b0: 72 72 20 3d 20 70 72 65 76 3b 0a 09 09 77 68 69  rr = prev;...whi
29c0: 6c 65 20 28 63 75 72 72 29 20 7b 0a 09 09 09 73  le (curr) {....s
29d0: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 79 70  witch (curr->typ
29e0: 65 29 20 7b 0a 09 09 09 09 63 61 73 65 20 46 49  e) {.....case FI
29f0: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53  LED_LOG_TYPE_MES
2a00: 53 41 47 45 3a 0a 09 09 09 09 09 66 70 72 69 6e  SAGE:......fprin
2a10: 74 66 28 66 70 2c 20 22 25 73 22 2c 20 63 75 72  tf(fp, "%s", cur
2a20: 72 2d 3e 62 75 66 66 65 72 29 3b 0a 0a 09 09 09  r->buffer);.....
2a30: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
2a40: 65 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45  e FILED_LOG_TYPE
2a50: 5f 54 52 41 4e 53 46 45 52 3a 0a 09 09 09 09 09  _TRANSFER:......
2a60: 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e 6d 65  switch (curr->me
2a70: 74 68 6f 64 29 20 7b 0a 09 09 09 09 09 09 63 61  thod) {.......ca
2a80: 73 65 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54  se FILED_REQUEST
2a90: 5f 4d 45 54 48 4f 44 5f 47 45 54 3a 0a 09 09 09  _METHOD_GET:....
2aa0: 09 09 09 09 6d 65 74 68 6f 64 3d 22 47 45 54 22  ....method="GET"
2ab0: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
2ac0: 09 09 09 09 09 09 63 61 73 65 20 46 49 4c 45 44  ......case FILED
2ad0: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
2ae0: 48 45 41 44 3a 0a 09 09 09 09 09 09 09 6d 65 74  HEAD:........met
2af0: 68 6f 64 3d 22 48 45 41 44 22 3b 0a 09 09 09 09  hod="HEAD";.....
2b00: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
2b10: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 09  default:........
2b20: 6d 65 74 68 6f 64 3d 22 3c 75 6e 6b 6e 6f 77 6e  method="<unknown
2b30: 3e 22 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  >";........break
2b40: 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
2b50: 66 20 28 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65  f (curr->endtime
2b60: 20 3d 3d 20 28 28 74 69 6d 65 5f 74 29 20 2d 31   == ((time_t) -1
2b70: 29 29 20 7b 0a 09 09 09 09 09 09 63 75 72 72 2d  )) {.......curr-
2b80: 3e 65 6e 64 74 69 6d 65 20 3d 20 6e 6f 77 3b 0a  >endtime = now;.
2b90: 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 66 70 72  .....}.......fpr
2ba0: 69 6e 74 66 28 66 70 2c 20 22 54 52 41 4e 53 46  intf(fp, "TRANSF
2bb0: 45 52 20 4d 45 54 48 4f 44 3d 25 73 20 50 41 54  ER METHOD=%s PAT
2bc0: 48 3d 25 73 20 53 52 43 3d 25 73 3a 25 69 20 54  H=%s SRC=%s:%i T
2bd0: 49 4d 45 2e 53 54 41 52 54 3d 25 6c 6c 75 20 54  IME.START=%llu T
2be0: 49 4d 45 2e 45 4e 44 3d 25 6c 6c 75 20 43 4f 44  IME.END=%llu COD
2bf0: 45 2e 56 41 4c 55 45 3d 25 75 20 43 4f 44 45 2e  E.VALUE=%u CODE.
2c00: 52 45 41 53 4f 4e 3d 25 73 20 52 45 51 55 45 53  REASON=%s REQUES
2c10: 54 2e 4f 46 46 53 45 54 3d 25 6c 6c 75 20 52 45  T.OFFSET=%llu RE
2c20: 51 55 45 53 54 2e 4c 45 4e 47 54 48 3d 25 6c 6c  QUEST.LENGTH=%ll
2c30: 75 20 46 49 4c 45 2e 4c 45 4e 47 54 48 3d 25 6c  u FILE.LENGTH=%l
2c40: 6c 75 20 54 52 41 4e 53 46 45 52 2e 4c 45 4e 47  lu TRANSFER.LENG
2c50: 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 09 09 09  TH=%llu",.......
2c60: 6d 65 74 68 6f 64 2c 0a 09 09 09 09 09 09 63 75  method,.......cu
2c70: 72 72 2d 3e 62 75 66 66 65 72 2c 0a 09 09 09 09  rr->buffer,.....
2c80: 09 09 63 75 72 72 2d 3e 69 70 2c 20 63 75 72 72  ..curr->ip, curr
2c90: 2d 3e 70 6f 72 74 2c 0a 09 09 09 09 09 09 28 75  ->port,.......(u
2ca0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
2cb0: 67 29 20 63 75 72 72 2d 3e 73 74 61 72 74 74 69  g) curr->startti
2cc0: 6d 65 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67  me,.......(unsig
2cd0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63  ned long long) c
2ce0: 75 72 72 2d 3e 65 6e 64 74 69 6d 65 2c 0a 09 09  urr->endtime,...
2cf0: 09 09 09 09 63 75 72 72 2d 3e 68 74 74 70 5f 63  ....curr->http_c
2d00: 6f 64 65 2c 20 63 75 72 72 2d 3e 72 65 61 73 6f  ode, curr->reaso
2d10: 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  n,.......(unsign
2d20: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
2d30: 72 72 2d 3e 72 65 71 5f 6f 66 66 73 65 74 2c 0a  rr->req_offset,.
2d40: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
2d50: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
2d60: 3e 72 65 71 5f 6c 65 6e 67 74 68 2c 0a 09 09 09  >req_length,....
2d70: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
2d80: 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 66 69  g long) curr->fi
2d90: 6c 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 09 09  le_length,......
2da0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
2db0: 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73 65 6e 74  long) curr->sent
2dc0: 5f 6c 65 6e 67 74 68 0a 09 09 09 09 09 29 3b 0a  _length......);.
2dd0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
2de0: 7d 0a 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c  }....fprintf(fp,
2df0: 20 22 20 54 48 52 45 41 44 3d 25 6c 6c 75 20 54   " THREAD=%llu T
2e00: 49 4d 45 3d 25 6c 6c 75 5c 6e 22 2c 0a 09 09 09  IME=%llu\n",....
2e10: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
2e20: 6c 6f 6e 67 29 20 28 28 69 6e 74 70 74 72 5f 74  long) ((intptr_t
2e30: 29 20 63 75 72 72 2d 3e 74 68 72 65 61 64 29 2c  ) curr->thread),
2e40: 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
2e50: 6f 6e 67 20 6c 6f 6e 67 29 20 6e 6f 77 0a 09 09  ong long) now...
2e60: 09 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70  .);....fflush(fp
2e70: 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75  );.....prev = cu
2e80: 72 72 3b 0a 09 09 09 63 75 72 72 20 3d 20 63 75  rr;....curr = cu
2e90: 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09 09 66  rr->_prev;.....f
2ea0: 72 65 65 28 70 72 65 76 29 3b 0a 09 09 7d 0a 09  ree(prev);...}..
2eb0: 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  }...return(NULL)
2ec0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2ed0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
2ee0: 28 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  (struct filed_lo
2ef0: 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 29 20  g_entry *entry) 
2f00: 7b 0a 09 65 6e 74 72 79 2d 3e 74 68 72 65 61 64  {..entry->thread
2f10: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
2f20: 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  );...pthread_mut
2f30: 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c  ex_lock(&filed_l
2f40: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65  og_msg_list_mute
2f50: 78 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f 6e 65  x);...entry->_ne
2f60: 78 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  xt = filed_log_m
2f70: 73 67 5f 6c 69 73 74 3b 0a 09 66 69 6c 65 64 5f  sg_list;..filed_
2f80: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 65  log_msg_list = e
2f90: 6e 74 72 79 3b 0a 0a 09 70 74 68 72 65 61 64 5f  ntry;...pthread_
2fa0: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69  mutex_unlock(&fi
2fb0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
2fc0: 5f 6d 75 74 65 78 29 3b 0a 0a 09 70 74 68 72 65  _mutex);...pthre
2fd0: 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26  ad_cond_signal(&
2fe0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
2ff0: 73 74 5f 72 65 61 64 79 29 3b 0a 0a 09 72 65 74  st_ready);...ret
3000: 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  urn;.}..static s
3010: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f  truct filed_log_
3020: 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67  entry *filed_log
3030: 5f 6e 65 77 28 69 6e 74 20 69 6e 69 74 69 61 6c  _new(int initial
3040: 69 7a 65 29 20 7b 0a 09 73 74 72 75 63 74 20 66  ize) {..struct f
3050: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a  iled_log_entry *
3060: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
3070: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
3080: 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 69 66  (*retval));...if
3090: 20 28 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a   (initialize) {.
30a0: 09 09 72 65 74 76 61 6c 2d 3e 62 75 66 66 65 72  ..retval->buffer
30b0: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65  [0] = '\0';...re
30c0: 74 76 61 6c 2d 3e 68 74 74 70 5f 63 6f 64 65 20  tval->http_code 
30d0: 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c 2d 3e  = -1;...retval->
30e0: 73 74 61 72 74 74 69 6d 65 20 3d 20 30 3b 0a 09  starttime = 0;..
30f0: 09 72 65 74 76 61 6c 2d 3e 65 6e 64 74 69 6d 65  .retval->endtime
3100: 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e   = 0;...retval->
3110: 72 65 71 5f 6f 66 66 73 65 74 20 3d 20 30 3b 0a  req_offset = 0;.
3120: 09 09 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6c 65  ..retval->req_le
3130: 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72 65 74 76  ngth = 0;...retv
3140: 61 6c 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 20  al->sent_length 
3150: 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 66  = 0;...retval->f
3160: 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a  ile_length = 0;.
3170: 09 09 72 65 74 76 61 6c 2d 3e 69 70 5b 30 5d 20  ..retval->ip[0] 
3180: 3d 20 27 5c 30 27 3b 0a 09 09 72 65 74 76 61 6c  = '\0';...retval
3190: 2d 3e 70 6f 72 74 20 3d 20 2d 31 3b 0a 09 09 72  ->port = -1;...r
31a0: 65 74 76 61 6c 2d 3e 6d 65 74 68 6f 64 20 3d 20  etval->method = 
31b0: 2d 31 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  -1;..}...return(
31c0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
31d0: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c 6f  ic void filed_lo
31e0: 67 5f 6d 73 67 28 63 6f 6e 73 74 20 63 68 61 72  g_msg(const char
31f0: 20 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09 73   *fmt, ...) {..s
3200: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f  truct filed_log_
3210: 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a 09 76  entry *entry;..v
3220: 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a 0a 09 65  a_list args;...e
3230: 6e 74 72 79 20 3d 20 66 69 6c 65 64 5f 6c 6f 67  ntry = filed_log
3240: 5f 6e 65 77 28 30 29 3b 0a 0a 09 76 61 5f 73 74  _new(0);...va_st
3250: 61 72 74 28 61 72 67 73 2c 20 66 6d 74 29 3b 0a  art(args, fmt);.
3260: 0a 09 76 73 6e 70 72 69 6e 74 66 28 65 6e 74 72  ..vsnprintf(entr
3270: 79 2d 3e 62 75 66 66 65 72 2c 20 73 69 7a 65 6f  y->buffer, sizeo
3280: 66 28 65 6e 74 72 79 2d 3e 62 75 66 66 65 72 29  f(entry->buffer)
3290: 2c 20 66 6d 74 2c 20 61 72 67 73 29 3b 0a 0a 09  , fmt, args);...
32a0: 76 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a 09  va_end(args);...
32b0: 65 6e 74 72 79 2d 3e 74 79 70 65 20 3d 20 46 49  entry->type = FI
32c0: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53  LED_LOG_TYPE_MES
32d0: 53 41 47 45 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f  SAGE;...filed_lo
32e0: 67 5f 65 6e 74 72 79 28 65 6e 74 72 79 29 3b 0a  g_entry(entry);.
32f0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
3300: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3310: 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 73 74 72  filed_log_ip(str
3320: 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64  uct sockaddr *ad
3330: 64 72 2c 20 63 68 61 72 20 2a 62 75 66 66 65 72  dr, char *buffer
3340: 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 6c  , size_t bufferl
3350: 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 73 6f  en) {..struct so
3360: 63 6b 61 64 64 72 5f 69 6e 20 2a 61 64 64 72 5f  ckaddr_in *addr_
3370: 76 34 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b  v4;..struct sock
3380: 61 64 64 72 5f 69 6e 36 20 2a 61 64 64 72 5f 76  addr_in6 *addr_v
3390: 36 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  6;..const char *
33a0: 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a  retval = NULL;..
33b0: 09 61 64 64 72 5f 76 36 20 3d 20 28 73 74 72 75  .addr_v6 = (stru
33c0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  ct sockaddr_in6 
33d0: 2a 29 20 61 64 64 72 3b 0a 0a 09 73 77 69 74 63  *) addr;...switc
33e0: 68 20 28 61 64 64 72 5f 76 36 2d 3e 73 69 6e 36  h (addr_v6->sin6
33f0: 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 63 61 73  _family) {...cas
3400: 65 20 41 46 5f 49 4e 45 54 3a 0a 09 09 09 61 64  e AF_INET:....ad
3410: 64 72 5f 76 34 20 3d 20 28 73 74 72 75 63 74 20  dr_v4 = (struct 
3420: 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 29 20 61  sockaddr_in *) a
3430: 64 64 72 3b 0a 09 09 09 72 65 74 76 61 6c 20 3d  ddr;....retval =
3440: 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e   inet_ntop(AF_IN
3450: 45 54 2c 20 26 61 64 64 72 5f 76 34 2d 3e 73 69  ET, &addr_v4->si
3460: 6e 5f 61 64 64 72 2c 20 62 75 66 66 65 72 2c 20  n_addr, buffer, 
3470: 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09 62  bufferlen);....b
3480: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 46 5f  reak;...case AF_
3490: 49 4e 45 54 36 3a 0a 09 09 09 72 65 74 76 61 6c  INET6:....retval
34a0: 20 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f   = inet_ntop(AF_
34b0: 49 4e 45 54 36 2c 20 26 61 64 64 72 5f 76 36 2d  INET6, &addr_v6-
34c0: 3e 73 69 6e 36 5f 61 64 64 72 2c 20 62 75 66 66  >sin6_addr, buff
34d0: 65 72 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a  er, bufferlen);.
34e0: 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
34f0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
3500: 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66  ..static FILE *f
3510: 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f  iled_log_open(co
3520: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 29 20  nst char *file) 
3530: 7b 0a 09 46 49 4c 45 20 2a 72 65 74 76 61 6c 3b  {..FILE *retval;
3540: 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 66 69  ...if (strcmp(fi
3550: 6c 65 2c 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b  le, "-") == 0) {
3560: 0a 09 09 72 65 74 76 61 6c 20 3d 20 73 74 64 6f  ...retval = stdo
3570: 75 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  ut;..} else if (
3580: 66 69 6c 65 5b 30 5d 20 3d 3d 20 27 7c 27 29 20  file[0] == '|') 
3590: 7b 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09 09 72 65  {...file++;...re
35a0: 74 76 61 6c 20 3d 20 70 6f 70 65 6e 28 66 69 6c  tval = popen(fil
35b0: 65 2c 20 22 77 22 29 3b 0a 09 7d 20 65 6c 73 65  e, "w");..} else
35c0: 20 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20 66 6f   {...retval = fo
35d0: 70 65 6e 28 66 69 6c 65 2c 20 22 61 2b 22 29 3b  pen(file, "a+");
35e0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
35f0: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
3600: 69 6e 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  int filed_loggin
3610: 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 46 49  g_thread_init(FI
3620: 4c 45 20 2a 6c 6f 67 66 70 29 20 7b 0a 09 73 74  LE *logfp) {..st
3630: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69  ruct filed_loggi
3640: 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a  ng_thread_args *
3650: 61 72 67 73 3b 0a 09 70 74 68 72 65 61 64 5f 74  args;..pthread_t
3660: 20 74 68 72 65 61 64 5f 69 64 3b 0a 0a 09 61 72   thread_id;...ar
3670: 67 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  gs = malloc(size
3680: 6f 66 28 2a 61 72 67 73 29 29 3b 0a 09 61 72 67  of(*args));..arg
3690: 73 2d 3e 66 70 20 3d 20 6c 6f 67 66 70 3b 0a 0a  s->fp = logfp;..
36a0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  .filed_log_msg_l
36b0: 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 70 74  ist = NULL;...pt
36c0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
36d0: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
36e0: 6c 69 73 74 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c  list_mutex, NULL
36f0: 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 72 65  );...pthread_cre
3700: 61 74 65 28 26 74 68 72 65 61 64 5f 69 64 2c 20  ate(&thread_id, 
3710: 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f 67 67  NULL, filed_logg
3720: 69 6e 67 5f 74 68 72 65 61 64 2c 20 61 72 67 73  ing_thread, args
3730: 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  );...filed_log_m
3740: 73 67 28 22 53 54 41 52 54 22 29 3b 0a 0a 09 72  sg("START");...r
3750: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 65 6e 64  eturn(0);.}.#end
3760: 69 66 0a 0a 23 69 66 64 65 66 20 46 49 4c 45 44  if..#ifdef FILED
3770: 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 0a 23 64  _DONT_TIMEOUT.#d
3780: 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b  efine filed_sock
3790: 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64  ettimeout_thread
37a0: 5f 69 6e 69 74 28 29 20 30 0a 23 64 65 66 69 6e  _init() 0.#defin
37b0: 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  e filed_socketti
37c0: 6d 65 6f 75 74 5f 61 63 63 65 70 74 28 78 29 20  meout_accept(x) 
37d0: 2f 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6c  /**/.#define fil
37e0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
37f0: 5f 70 72 6f 63 65 73 73 69 6e 67 5f 73 74 61 72  _processing_star
3800: 74 28 78 29 20 2f 2a 2a 2f 0a 23 64 65 66 69 6e  t(x) /**/.#defin
3810: 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  e filed_socketti
3820: 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e 67  meout_processing
3830: 5f 65 6e 64 28 78 29 20 2f 2a 2a 2f 0a 23 64 65  _end(x) /**/.#de
3840: 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65  fine filed_socke
3850: 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65 28 78  ttimeout_close(x
3860: 29 20 2f 2a 2a 2f 0a 23 65 6c 73 65 0a 5f 41 74  ) /**/.#else._At
3870: 6f 6d 69 63 20 74 69 6d 65 5f 74 20 66 69 6c 65  omic time_t file
3880: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3890: 74 69 6d 65 3b 0a 73 74 72 75 63 74 20 7b 0a 09  time;.struct {..
38a0: 5f 41 74 6f 6d 69 63 20 74 69 6d 65 5f 74 20 65  _Atomic time_t e
38b0: 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 3b 0a  xpiration_time;.
38c0: 09 5f 41 74 6f 6d 69 63 20 70 74 68 72 65 61 64  ._Atomic pthread
38d0: 5f 74 20 74 68 72 65 61 64 5f 69 64 3b 0a 09 62  _t thread_id;..b
38e0: 6f 6f 6c 20 76 61 6c 69 64 3b 0a 7d 2a 20 66 69  ool valid;.}* fi
38f0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
3900: 74 5f 73 6f 63 6b 73 74 61 74 75 73 3b 0a 6c 6f  t_sockstatus;.lo
3910: 6e 67 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ng filed_sockett
3920: 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75  imeout_sockstatu
3930: 73 5f 6c 65 6e 67 74 68 3b 0a 69 6e 74 20 66 69  s_length;.int fi
3940: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
3950: 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 3b 0a 0a 73  t_devnull_fd;..s
3960: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
3970: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
3980: 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28 69 6e  ckfd_in_range(in
3990: 74 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20  t sockfd) {..if 
39a0: 28 73 6f 63 6b 66 64 20 3c 20 33 29 20 7b 0a 09  (sockfd < 3) {..
39b0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
39c0: 09 69 66 20 28 73 6f 63 6b 66 64 20 3e 20 66 69  .if (sockfd > fi
39d0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
39e0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c 65 6e  t_sockstatus_len
39f0: 67 74 68 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  gth) {...return(
3a00: 30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  0);..}...return(
3a10: 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  1);.}..static vo
3a20: 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  id filed_sockett
3a30: 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28 69 6e  imeout_expire(in
3a40: 74 20 73 6f 63 6b 66 64 2c 20 69 6e 74 20 6c 65  t sockfd, int le
3a50: 6e 67 74 68 29 20 7b 0a 09 74 69 6d 65 5f 74 20  ngth) {..time_t 
3a60: 6e 6f 77 2c 20 65 78 70 69 72 65 3b 0a 0a 09 6e  now, expire;...n
3a70: 6f 77 20 3d 20 61 74 6f 6d 69 63 5f 6c 6f 61 64  ow = atomic_load
3a80: 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  (&filed_socketti
3a90: 6d 65 6f 75 74 5f 74 69 6d 65 29 3b 0a 0a 09 65  meout_time);...e
3aa0: 78 70 69 72 65 20 3d 20 6e 6f 77 20 2b 20 6c 65  xpire = now + le
3ab0: 6e 67 74 68 3b 0a 0a 09 61 74 6f 6d 69 63 5f 73  ngth;...atomic_s
3ac0: 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63 6b  tore(&filed_sock
3ad0: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74  ettimeout_sockst
3ae0: 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 65 78 70  atus[sockfd].exp
3af0: 69 72 61 74 69 6f 6e 5f 74 69 6d 65 2c 20 65 78  iration_time, ex
3b00: 70 69 72 65 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  pire);...return;
3b10: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
3b20: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3b30: 6f 75 74 5f 61 63 63 65 70 74 28 69 6e 74 20 73  out_accept(int s
3b40: 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28 21 66  ockfd) {..if (!f
3b50: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3b60: 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e  ut_sockfd_in_ran
3b70: 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a 09 09  ge(sockfd)) {...
3b80: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 69 6c  return;..}...fil
3b90: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3ba0: 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64 2c 20  _expire(sockfd, 
3bb0: 36 30 29 3b 0a 0a 09 61 74 6f 6d 69 63 5f 73 74  60);...atomic_st
3bc0: 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65  ore(&filed_socke
3bd0: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
3be0: 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 74 68 72 65  tus[sockfd].thre
3bf0: 61 64 5f 69 64 2c 20 70 74 68 72 65 61 64 5f 73  ad_id, pthread_s
3c00: 65 6c 66 28 29 29 3b 0a 0a 09 61 74 6f 6d 69 63  elf());...atomic
3c10: 5f 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f  _store(&filed_so
3c20: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
3c30: 73 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 76  status[sockfd].v
3c40: 61 6c 69 64 2c 20 74 72 75 65 29 3b 0a 0a 09 72  alid, true);...r
3c50: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
3c60: 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b   void filed_sock
3c70: 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73  ettimeout_proces
3c80: 73 69 6e 67 5f 73 74 61 72 74 28 69 6e 74 20 73  sing_start(int s
3c90: 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28 21 66  ockfd) {..if (!f
3ca0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3cb0: 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e  ut_sockfd_in_ran
3cc0: 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a 09 09  ge(sockfd)) {...
3cd0: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 69 6c  return;..}...fil
3ce0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3cf0: 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64 2c 20  _expire(sockfd, 
3d00: 38 36 34 30 30 29 3b 0a 0a 09 72 65 74 75 72 6e  86400);...return
3d10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
3d20: 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d   filed_sockettim
3d30: 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e 67 5f  eout_processing_
3d40: 65 6e 64 28 69 6e 74 20 73 6f 63 6b 66 64 29 20  end(int sockfd) 
3d50: 7b 0a 09 69 66 20 28 21 66 69 6c 65 64 5f 73 6f  {..if (!filed_so
3d60: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
3d70: 66 64 5f 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b  fd_in_range(sock
3d80: 66 64 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  fd)) {...return;
3d90: 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b  ..}...filed_sock
3da0: 65 74 74 69 6d 65 6f 75 74 5f 65 78 70 69 72 65  ettimeout_expire
3db0: 28 73 6f 63 6b 66 64 2c 20 36 30 29 3b 0a 0a 09  (sockfd, 60);...
3dc0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
3dd0: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63  c void filed_soc
3de0: 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65  kettimeout_close
3df0: 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b 0a 09  (int sockfd) {..
3e00: 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63 6b 65  if (!filed_socke
3e10: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66 64 5f  ttimeout_sockfd_
3e20: 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66 64 29  in_range(sockfd)
3e30: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
3e40: 0a 0a 09 61 74 6f 6d 69 63 5f 73 74 6f 72 65 28  ...atomic_store(
3e50: 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  &filed_sockettim
3e60: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b  eout_sockstatus[
3e70: 73 6f 63 6b 66 64 5d 2e 76 61 6c 69 64 2c 20 66  sockfd].valid, f
3e80: 61 6c 73 65 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  alse);...return;
3e90: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
3ea0: 2a 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  *filed_sockettim
3eb0: 65 6f 75 74 5f 74 68 72 65 61 64 28 76 6f 69 64  eout_thread(void
3ec0: 20 2a 61 72 67 29 20 7b 0a 09 74 69 6d 65 5f 74   *arg) {..time_t
3ed0: 20 6e 6f 77 2c 20 65 78 70 69 72 61 74 69 6f 6e   now, expiration
3ee0: 5f 74 69 6d 65 3b 0a 09 70 74 68 72 65 61 64 5f  _time;..pthread_
3ef0: 74 20 74 68 72 65 61 64 5f 69 64 3b 0a 09 6c 6f  t thread_id;..lo
3f00: 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 63 6f 75  ng idx;..int cou
3f10: 6e 74 3b 0a 09 62 6f 6f 6c 20 76 61 6c 69 64 3b  nt;..bool valid;
3f20: 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
3f30: 09 66 6f 72 20 28 63 6f 75 6e 74 20 3d 20 30 3b  .for (count = 0;
3f40: 20 63 6f 75 6e 74 20 3c 20 31 30 3b 20 63 6f 75   count < 10; cou
3f50: 6e 74 2b 2b 29 20 7b 0a 09 09 09 75 73 6c 65 65  nt++) {....uslee
3f60: 70 28 33 30 30 30 30 30 30 30 29 3b 0a 0a 09 09  p(30000000);....
3f70: 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e 55 4c 4c  .now = time(NULL
3f80: 29 3b 0a 0a 09 09 09 61 74 6f 6d 69 63 5f 73 74  );.....atomic_st
3f90: 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65  ore(&filed_socke
3fa0: 74 74 69 6d 65 6f 75 74 5f 74 69 6d 65 2c 20 6e  ttimeout_time, n
3fb0: 6f 77 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20  ow);...}....for 
3fc0: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
3fd0: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3fe0: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c  out_sockstatus_l
3ff0: 65 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a  ength; idx++) {.
4000: 09 09 09 76 61 6c 69 64 20 3d 20 61 74 6f 6d 69  ...valid = atomi
4010: 63 5f 6c 6f 61 64 28 26 66 69 6c 65 64 5f 73 6f  c_load(&filed_so
4020: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
4030: 73 74 61 74 75 73 5b 69 64 78 5d 2e 76 61 6c 69  status[idx].vali
4040: 64 29 3b 0a 0a 09 09 09 69 66 20 28 21 76 61 6c  d);.....if (!val
4050: 69 64 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  id) {.....contin
4060: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 65 78 70  ue;....}.....exp
4070: 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20 3d 20 61  iration_time = a
4080: 74 6f 6d 69 63 5f 6c 6f 61 64 28 26 66 69 6c 65  tomic_load(&file
4090: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
40a0: 73 6f 63 6b 73 74 61 74 75 73 5b 69 64 78 5d 2e  sockstatus[idx].
40b0: 65 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 29  expiration_time)
40c0: 3b 0a 0a 09 09 09 74 68 72 65 61 64 5f 69 64 20  ;.....thread_id 
40d0: 3d 20 61 74 6f 6d 69 63 5f 6c 6f 61 64 28 26 66  = atomic_load(&f
40e0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
40f0: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69 64  ut_sockstatus[id
4100: 78 5d 2e 74 68 72 65 61 64 5f 69 64 29 3b 0a 0a  x].thread_id);..
4110: 09 09 09 69 66 20 28 65 78 70 69 72 61 74 69 6f  ...if (expiratio
4120: 6e 5f 74 69 6d 65 20 3e 20 6e 6f 77 29 20 7b 0a  n_time > now) {.
4130: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
4140: 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 73 6f 63  .}.....filed_soc
4150: 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65  kettimeout_close
4160: 28 69 64 78 29 3b 0a 0a 09 09 09 64 75 70 32 28  (idx);.....dup2(
4170: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
4180: 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 2c 20  out_devnull_fd, 
4190: 69 64 78 29 3b 0a 0a 09 09 09 70 74 68 72 65 61  idx);.....pthrea
41a0: 64 5f 6b 69 6c 6c 28 74 68 72 65 61 64 5f 69 64  d_kill(thread_id
41b0: 2c 20 53 49 47 50 49 50 45 29 3b 0a 09 09 7d 0a  , SIGPIPE);...}.
41c0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .}...return(NULL
41d0: 29 3b 0a 0a 09 2f 2a 20 4e 4f 54 52 45 41 43 48  );.../* NOTREACH
41e0: 3a 20 57 65 20 64 6f 6e 27 74 20 61 63 74 75 61  : We don't actua
41f0: 6c 6c 79 20 74 61 6b 65 20 61 6e 79 20 61 72 67  lly take any arg
4200: 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d  uments */..arg =
4210: 20 61 72 67 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   arg;.}..static 
4220: 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  int filed_socket
4230: 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 5f 69  timeout_thread_i
4240: 6e 69 74 28 76 6f 69 64 29 20 7b 0a 09 70 74 68  nit(void) {..pth
4250: 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69 64  read_t thread_id
4260: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 72 65 61  ;...pthread_crea
4270: 74 65 28 26 74 68 72 65 61 64 5f 69 64 2c 20 4e  te(&thread_id, N
4280: 55 4c 4c 2c 20 66 69 6c 65 64 5f 73 6f 63 6b 65  ULL, filed_socke
4290: 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 2c  ttimeout_thread,
42a0: 20 4e 55 4c 4c 29 3b 0a 0a 09 72 65 74 75 72 6e   NULL);...return
42b0: 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (0);.}..static i
42c0: 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  nt filed_sockett
42d0: 69 6d 65 6f 75 74 5f 69 6e 69 74 28 76 6f 69 64  imeout_init(void
42e0: 29 20 7b 0a 09 6c 6f 6e 67 20 6d 61 78 66 64 2c  ) {..long maxfd,
42f0: 20 69 64 78 3b 0a 0a 09 6d 61 78 66 64 20 3d 20   idx;...maxfd = 
4300: 73 79 73 63 6f 6e 66 28 5f 53 43 5f 4f 50 45 4e  sysconf(_SC_OPEN
4310: 5f 4d 41 58 29 3b 0a 09 69 66 20 28 6d 61 78 66  _MAX);..if (maxf
4320: 64 20 3c 3d 20 30 29 20 7b 0a 09 09 6d 61 78 66  d <= 0) {...maxf
4330: 64 20 3d 20 34 30 39 36 3b 0a 09 7d 0a 0a 09 66  d = 4096;..}...f
4340: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4350: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 20 3d 20  ut_sockstatus = 
4360: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 66  malloc(sizeof(*f
4370: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4380: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 29 20 2a  ut_sockstatus) *
4390: 20 6d 61 78 66 64 29 3b 0a 09 69 66 20 28 66 69   maxfd);..if (fi
43a0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
43b0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 20 3d 3d 20  t_sockstatus == 
43c0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
43d0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  (-1);..}...for (
43e0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6d  idx = 0; idx < m
43f0: 61 78 66 64 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  axfd; idx++) {..
4400: 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  .filed_sockettim
4410: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b  eout_sockstatus[
4420: 69 64 78 5d 2e 76 61 6c 69 64 20 3d 20 66 61 6c  idx].valid = fal
4430: 73 65 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73  se;..}...filed_s
4440: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63  ockettimeout_soc
4450: 6b 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 20 3d  kstatus_length =
4460: 20 6d 61 78 66 64 3b 0a 09 66 69 6c 65 64 5f 73   maxfd;..filed_s
4470: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64 65 76  ockettimeout_dev
4480: 6e 75 6c 6c 5f 66 64 20 3d 20 6f 70 65 6e 28 22  null_fd = open("
4490: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44  /dev/null", O_RD
44a0: 57 52 29 3b 0a 09 69 66 20 28 66 69 6c 65 64 5f  WR);..if (filed_
44b0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64 65  sockettimeout_de
44c0: 76 6e 75 6c 6c 5f 66 64 20 3c 20 30 29 20 7b 0a  vnull_fd < 0) {.
44d0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
44e0: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
44f0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 6d 61  #endif../* Forma
4500: 74 20 74 69 6d 65 20 70 65 72 20 52 46 43 32 36  t time per RFC26
4510: 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  16 */.static cha
4520: 72 20 2a 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f  r *filed_format_
4530: 74 69 6d 65 28 63 68 61 72 20 2a 62 75 66 66 65  time(char *buffe
4540: 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72  r, size_t buffer
4550: 5f 6c 65 6e 2c 20 63 6f 6e 73 74 20 74 69 6d 65  _len, const time
4560: 5f 74 20 74 69 6d 65 69 6e 66 6f 29 20 7b 0a 09  _t timeinfo) {..
4570: 73 74 72 75 63 74 20 74 6d 20 74 69 6d 65 69 6e  struct tm timein
4580: 66 6f 5f 74 6d 2c 20 2a 74 69 6d 65 69 6e 66 6f  fo_tm, *timeinfo
4590: 5f 74 6d 5f 70 3b 0a 0a 09 74 69 6d 65 69 6e 66  _tm_p;...timeinf
45a0: 6f 5f 74 6d 5f 70 20 3d 20 67 6d 74 69 6d 65 5f  o_tm_p = gmtime_
45b0: 72 28 26 74 69 6d 65 69 6e 66 6f 2c 20 26 74 69  r(&timeinfo, &ti
45c0: 6d 65 69 6e 66 6f 5f 74 6d 29 3b 0a 09 69 66 20  meinfo_tm);..if 
45d0: 28 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d  (timeinfo_tm_p =
45e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
45f0: 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a 09  rn("unknown");..
4600: 7d 0a 0a 09 62 75 66 66 65 72 5b 62 75 66 66 65  }...buffer[buffe
4610: 72 5f 6c 65 6e 20 2d 20 31 5d 20 3d 20 27 5c 30  r_len - 1] = '\0
4620: 27 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d  ';..buffer_len =
4630: 20 73 74 72 66 74 69 6d 65 28 62 75 66 66 65 72   strftime(buffer
4640: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31  , buffer_len - 1
4650: 2c 20 22 25 61 2c 20 25 64 20 25 62 20 25 59 20  , "%a, %d %b %Y 
4660: 25 48 3a 25 4d 3a 25 53 20 47 4d 54 22 2c 20 74  %H:%M:%S GMT", t
4670: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 29 3b 0a 0a  imeinfo_tm_p);..
4680: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b  .return(buffer);
4690: 0a 7d 0a 0a 2f 2a 20 68 61 73 68 20 2a 2f 0a 73  .}../* hash */.s
46a0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
46b0: 6e 74 20 66 69 6c 65 64 5f 68 61 73 68 28 63 6f  nt filed_hash(co
46c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
46d0: 72 20 2a 76 61 6c 75 65 2c 20 75 6e 73 69 67 6e  r *value, unsign
46e0: 65 64 20 69 6e 74 20 6d 6f 64 75 6c 75 73 29 20  ed int modulus) 
46f0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
4700: 20 63 75 72 72 2c 20 70 72 65 76 3b 0a 09 69 6e   curr, prev;..in
4710: 74 20 64 69 66 66 3b 0a 09 75 6e 73 69 67 6e 65  t diff;..unsigne
4720: 64 20 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09  d int retval;...
4730: 72 65 74 76 61 6c 20 3d 20 6d 6f 64 75 6c 75 73  retval = modulus
4740: 20 2d 20 31 3b 0a 09 70 72 65 76 20 3d 20 6d 6f   - 1;..prev = mo
4750: 64 75 6c 75 73 20 25 20 32 35 35 3b 0a 0a 09 77  dulus % 255;...w
4760: 68 69 6c 65 20 28 28 63 75 72 72 20 3d 20 2a 76  hile ((curr = *v
4770: 61 6c 75 65 29 29 20 7b 0a 09 09 69 66 20 28 63  alue)) {...if (c
4780: 75 72 72 20 3c 20 33 32 29 20 7b 0a 09 09 09 63  urr < 32) {....c
4790: 75 72 72 20 3d 20 32 35 35 20 2d 20 63 75 72 72  urr = 255 - curr
47a0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
47b0: 63 75 72 72 20 2d 3d 20 33 32 3b 0a 09 09 7d 0a  curr -= 32;...}.
47c0: 0a 09 09 69 66 20 28 70 72 65 76 20 3c 20 63 75  ...if (prev < cu
47d0: 72 72 29 20 7b 0a 09 09 09 64 69 66 66 20 3d 20  rr) {....diff = 
47e0: 63 75 72 72 20 2d 20 70 72 65 76 3b 0a 09 09 7d  curr - prev;...}
47f0: 20 65 6c 73 65 20 7b 0a 09 09 09 64 69 66 66 20   else {....diff 
4800: 3d 20 70 72 65 76 20 2d 20 63 75 72 72 3b 0a 09  = prev - curr;..
4810: 09 7d 0a 0a 09 09 70 72 65 76 20 3d 20 63 75 72  .}....prev = cur
4820: 72 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3c 3c 3d  r;....retval <<=
4830: 20 33 3b 0a 09 09 72 65 74 76 61 6c 20 26 3d 20   3;...retval &= 
4840: 30 78 46 46 46 46 46 46 46 46 4c 55 3b 0a 09 09  0xFFFFFFFFLU;...
4850: 72 65 74 76 61 6c 20 5e 3d 20 64 69 66 66 3b 0a  retval ^= diff;.
4860: 0a 09 09 76 61 6c 75 65 2b 2b 3b 0a 09 7d 0a 0a  ...value++;..}..
4870: 09 72 65 74 76 61 6c 20 3d 20 72 65 74 76 61 6c  .retval = retval
4880: 20 25 20 6d 6f 64 75 6c 75 73 3b 0a 0a 09 72 65   % modulus;...re
4890: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
48a0: 0a 2f 2a 20 46 69 6e 64 20 61 20 6d 69 6d 65 2d  ./* Find a mime-
48b0: 74 79 70 65 20 62 61 73 65 64 20 6f 6e 20 74 68  type based on th
48c0: 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74  e filename */.st
48d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
48e0: 2a 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65  *filed_determine
48f0: 5f 6d 69 6d 65 74 79 70 65 28 63 6f 6e 73 74 20  _mimetype(const 
4900: 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 09 63  char *path) {..c
4910: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 0a 09  onst char *p;...
4920: 70 20 3d 20 73 74 72 72 63 68 72 28 70 61 74 68  p = strrchr(path
4930: 2c 20 27 2e 27 29 3b 0a 09 69 66 20 28 70 20 3d  , '.');..if (p =
4940: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
4950: 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54  rn(FILED_DEFAULT
4960: 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 70 2b 2b  _TYPE);..}...p++
4970: 3b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 27 5c 30  ;..if (*p == '\0
4980: 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 46 49  ') {...return(FI
4990: 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45  LED_DEFAULT_TYPE
49a0: 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f  );..}...filed_lo
49b0: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f 6f  g_msg_debug("Loo
49c0: 6b 69 6e 67 20 75 70 20 4d 49 4d 45 20 74 79 70  king up MIME typ
49d0: 65 20 66 6f 72 20 25 73 20 28 68 61 73 68 20 3d  e for %s (hash =
49e0: 20 25 6c 6c 75 29 22 2c 20 70 2c 20 28 75 6e 73   %llu)", p, (uns
49f0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
4a00: 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f 6e   filed_hash((con
4a10: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4a20: 20 2a 29 20 70 2c 20 31 36 37 37 37 32 35 39 29   *) p, 16777259)
4a30: 29 3b 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 69  );..#include "fi
4a40: 6c 65 64 2d 6d 69 6d 65 2d 74 79 70 65 73 2e 68  led-mime-types.h
4a50: 22 0a 0a 09 72 65 74 75 72 6e 28 46 49 4c 45 44  "...return(FILED
4a60: 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a  _DEFAULT_TYPE);.
4a70: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
4a80: 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69   unique identifi
4a90: 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  er */.static voi
4aa0: 64 20 66 69 6c 65 64 5f 67 65 6e 65 72 61 74 65  d filed_generate
4ab0: 5f 65 74 61 67 28 63 68 61 72 20 2a 65 74 61 67  _etag(char *etag
4ac0: 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 29  , size_t length)
4ad0: 20 7b 0a 09 73 6e 70 72 69 6e 74 66 28 65 74 61   {..snprintf(eta
4ae0: 67 2c 20 6c 65 6e 67 74 68 2c 20 22 25 6c 6c 78  g, length, "%llx
4af0: 2d 25 6c 6c 78 25 6c 6c 78 25 6c 6c 78 25 6c 6c  -%llx%llx%llx%ll
4b00: 78 22 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20  x",...(unsigned 
4b10: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 74 69 6d 65 28  long long) time(
4b20: 4e 55 4c 4c 29 2c 0a 09 09 28 75 6e 73 69 67 6e  NULL),...(unsign
4b30: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61  ed long long) ra
4b40: 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73 69 67  ndom(),...(unsig
4b50: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
4b60: 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73 69  andom(),...(unsi
4b70: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
4b80: 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73  random(),...(uns
4b90: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
4ba0: 20 72 61 6e 64 6f 6d 28 29 0a 09 29 3b 0a 7d 0a   random()..);.}.
4bb0: 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  ./* Open a file 
4bc0: 61 6e 64 20 72 65 74 75 72 6e 20 66 69 6c 65 20  and return file 
4bd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 73  information */.s
4be0: 74 61 74 69 63 20 73 74 72 75 63 74 20 66 69 6c  tatic struct fil
4bf0: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c  ed_fileinfo *fil
4c00: 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 63 6f 6e  ed_open_file(con
4c10: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73  st char *path, s
4c20: 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65  truct filed_file
4c30: 69 6e 66 6f 20 2a 62 75 66 66 65 72 29 20 7b 0a  info *buffer) {.
4c40: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69  .struct filed_fi
4c50: 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b 0a 09  leinfo *cache;..
4c60: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63  unsigned int cac
4c70: 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f 74 20 6c  he_idx;..off_t l
4c80: 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 63  en;..int fd;...c
4c90: 61 63 68 65 5f 69 64 78 20 3d 20 66 69 6c 65 64  ache_idx = filed
4ca0: 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73  _hash((const uns
4cb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70 61  igned char *) pa
4cc0: 74 68 2c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  th, filed_filein
4cd0: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29  fo_fdcache_size)
4ce0: 3b 0a 0a 09 63 61 63 68 65 20 3d 20 26 66 69 6c  ;...cache = &fil
4cf0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
4d00: 63 68 65 5b 63 61 63 68 65 5f 69 64 78 5d 3b 0a  che[cache_idx];.
4d10: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
4d20: 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67 20 6d  debug("Locking m
4d30: 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c  utex for idx: %l
4d40: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
4d50: 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a  ng) cache_idx);.
4d60: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
4d70: 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74  lock(&cache->mut
4d80: 65 78 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  ex);...filed_log
4d90: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70  _msg_debug("Comp
4da0: 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6d 75  leted locking mu
4db0: 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c 75  tex for idx: %lu
4dc0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
4dd0: 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a 0a  g) cache_idx);..
4de0: 09 69 66 20 28 73 74 72 63 6d 70 28 70 61 74 68  .if (strcmp(path
4df0: 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 29 20 21  , cache->path) !
4e00: 3d 20 30 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c  = 0) {...filed_l
4e10: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 61  og_msg_debug("Ca
4e20: 63 68 65 20 6d 69 73 73 20 66 6f 72 20 69 64 78  che miss for idx
4e30: 3a 20 25 6c 75 3a 20 4f 4c 44 20 5c 22 25 73 5c  : %lu: OLD \"%s\
4e40: 22 2c 20 4e 45 57 20 5c 22 25 73 5c 22 22 2c 20  ", NEW \"%s\"", 
4e50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
4e60: 63 61 63 68 65 5f 69 64 78 2c 20 63 61 63 68 65  cache_idx, cache
4e70: 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b 0a 0a  ->path, path);..
4e80: 09 09 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68  ..fd = open(path
4e90: 2c 20 4f 5f 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4c  , O_RDONLY | O_L
4ea0: 41 52 47 45 46 49 4c 45 29 3b 0a 09 09 69 66 20  ARGEFILE);...if 
4eb0: 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 09 70 74  (fd < 0) {....pt
4ec0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
4ed0: 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78  ck(&cache->mutex
4ee0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55  );.....return(NU
4ef0: 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  LL);...}....if (
4f00: 63 61 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20  cache->fd >= 0) 
4f10: 7b 0a 09 09 09 63 6c 6f 73 65 28 63 61 63 68 65  {....close(cache
4f20: 2d 3e 66 64 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65  ->fd);...}....le
4f30: 6e 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 30 2c  n = lseek(fd, 0,
4f40: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73   SEEK_END);...ls
4f50: 65 65 6b 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f  eek(fd, 0, SEEK_
4f60: 53 45 54 29 3b 0a 0a 09 09 63 61 63 68 65 2d 3e  SET);....cache->
4f70: 66 64 20 3d 20 66 64 3b 0a 09 09 63 61 63 68 65  fd = fd;...cache
4f80: 2d 3e 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73  ->len = len;...s
4f90: 74 72 63 70 79 28 63 61 63 68 65 2d 3e 70 61 74  trcpy(cache->pat
4fa0: 68 2c 20 70 61 74 68 29 3b 0a 09 09 63 61 63 68  h, path);...cach
4fb0: 65 2d 3e 74 79 70 65 20 3d 20 66 69 6c 65 64 5f  e->type = filed_
4fc0: 64 65 74 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79  determine_mimety
4fd0: 70 65 28 70 61 74 68 29 3b 0a 09 09 66 69 6c 65  pe(path);...file
4fe0: 64 5f 67 65 6e 65 72 61 74 65 5f 65 74 61 67 28  d_generate_etag(
4ff0: 63 61 63 68 65 2d 3e 65 74 61 67 2c 20 73 69 7a  cache->etag, siz
5000: 65 6f 66 28 63 61 63 68 65 2d 3e 65 74 61 67 29  eof(cache->etag)
5010: 29 3b 0a 0a 09 09 2f 2a 20 58 58 58 3a 54 4f 44  );..../* XXX:TOD
5020: 4f 3a 20 44 65 74 65 72 6d 69 6e 65 20 2a 2f 0a  O: Determine */.
5030: 09 09 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64  ..cache->lastmod
5040: 20 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f   = filed_format_
5050: 74 69 6d 65 28 63 61 63 68 65 2d 3e 6c 61 73 74  time(cache->last
5060: 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 63 61  mod_b, sizeof(ca
5070: 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c  che->lastmod_b),
5080: 20 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 33 30   time(NULL) - 30
5090: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66  );..} else {...f
50a0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62  iled_log_msg_deb
50b0: 75 67 28 22 43 61 63 68 65 20 68 69 74 20 66 6f  ug("Cache hit fo
50c0: 72 20 69 64 78 3a 20 25 6c 75 3a 20 50 41 54 48  r idx: %lu: PATH
50d0: 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73 69 67   \"%s\"", (unsig
50e0: 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f  ned long) cache_
50f0: 69 64 78 2c 20 70 61 74 68 29 3b 0a 09 7d 0a 0a  idx, path);..}..
5100: 09 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76 65 20  ./*.. * We have 
5110: 74 6f 20 6d 61 6b 65 20 61 20 64 75 70 6c 69 63  to make a duplic
5120: 61 74 65 20 46 44 2c 20 62 65 63 61 75 73 65 20  ate FD, because 
5130: 6f 6e 63 65 20 77 65 20 72 65 6c 65 61 73 65 20  once we release 
5140: 74 68 65 20 63 61 63 68 65 0a 09 20 2a 20 6d 75  the cache.. * mu
5150: 74 65 78 2c 20 74 68 65 20 66 69 6c 65 20 64 65  tex, the file de
5160: 73 63 72 69 70 74 6f 72 20 6d 61 79 20 62 65 20  scriptor may be 
5170: 63 6c 6f 73 65 64 0a 09 20 2a 2f 0a 09 66 64 20  closed.. */..fd 
5180: 3d 20 64 75 70 28 63 61 63 68 65 2d 3e 66 64 29  = dup(cache->fd)
5190: 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b  ;..if (fd < 0) {
51a0: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
51b0: 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e  _unlock(&cache->
51c0: 6d 75 74 65 78 29 3b 0a 0a 09 09 72 65 74 75 72  mutex);....retur
51d0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75  n(NULL);..}...bu
51e0: 66 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 09  ffer->fd = fd;..
51f0: 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63 61  buffer->len = ca
5200: 63 68 65 2d 3e 6c 65 6e 3b 0a 09 62 75 66 66 65  che->len;..buffe
5210: 72 2d 3e 74 79 70 65 20 3d 20 63 61 63 68 65 2d  r->type = cache-
5220: 3e 74 79 70 65 3b 0a 09 6d 65 6d 63 70 79 28 62  >type;..memcpy(b
5230: 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62  uffer->lastmod_b
5240: 2c 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64  , cache->lastmod
5250: 5f 62 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65  _b, sizeof(buffe
5260: 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29 3b 0a  r->lastmod_b));.
5270: 09 6d 65 6d 63 70 79 28 62 75 66 66 65 72 2d 3e  .memcpy(buffer->
5280: 65 74 61 67 2c 20 63 61 63 68 65 2d 3e 65 74 61  etag, cache->eta
5290: 67 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  g, sizeof(buffer
52a0: 2d 3e 65 74 61 67 29 29 3b 0a 09 62 75 66 66 65  ->etag));..buffe
52b0: 72 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 62 75 66  r->lastmod = buf
52c0: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 20 2b  fer->lastmod_b +
52d0: 20 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64   (cache->lastmod
52e0: 20 2d 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f   - cache->lastmo
52f0: 64 5f 62 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f  d_b);...pthread_
5300: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61  mutex_unlock(&ca
5310: 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 72  che->mutex);...r
5320: 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b 0a 7d  eturn(buffer);.}
5330: 0a 0a 2f 2a 20 50 72 6f 63 65 73 73 20 61 6e 20  ../* Process an 
5340: 48 54 54 50 20 72 65 71 75 65 73 74 20 61 6e 64  HTTP request and
5350: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   return the path
5360: 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 73 74   requested */.st
5370: 61 74 69 63 20 73 74 72 75 63 74 20 66 69 6c 65  atic struct file
5380: 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a  d_http_request *
5390: 66 69 6c 65 64 5f 67 65 74 5f 68 74 74 70 5f 72  filed_get_http_r
53a0: 65 71 75 65 73 74 28 46 49 4c 45 20 2a 66 70 2c  equest(FILE *fp,
53b0: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74   struct filed_ht
53c0: 74 70 5f 72 65 71 75 65 73 74 20 2a 62 75 66 66  tp_request *buff
53d0: 65 72 5f 73 74 2c 20 73 74 72 75 63 74 20 66 69  er_st, struct fi
53e0: 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74  led_options *opt
53f0: 69 6f 6e 73 29 20 7b 0a 09 63 68 61 72 20 2a 6d  ions) {..char *m
5400: 65 74 68 6f 64 2c 20 2a 70 61 74 68 3b 0a 09 63  ethod, *path;..c
5410: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 2a 77 6f  har *buffer, *wo
5420: 72 6b 62 75 66 66 65 72 2c 20 2a 77 6f 72 6b 62  rkbuffer, *workb
5430: 75 66 66 65 72 5f 6e 65 78 74 3b 0a 09 63 68 61  uffer_next;..cha
5440: 72 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 73  r *fgets_ret;..s
5450: 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
5460: 2c 20 70 61 74 68 5f 6c 65 6e 3b 0a 09 6f 66 66  , path_len;..off
5470: 5f 74 20 72 61 6e 67 65 5f 73 74 61 72 74 2c 20  _t range_start, 
5480: 72 61 6e 67 65 5f 65 6e 64 2c 20 72 61 6e 67 65  range_end, range
5490: 5f 6c 65 6e 67 74 68 3b 0a 09 69 6e 74 20 72 61  _length;..int ra
54a0: 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 69 6e  nge_request;..in
54b0: 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 0a  t snprintf_ret;.
54c0: 09 69 6e 74 20 69 3b 0a 0a 09 2f 2a 20 53 65 74  .int i;.../* Set
54d0: 20 74 6f 20 64 65 66 61 75 6c 74 20 76 61 6c 75   to default valu
54e0: 65 73 20 2a 2f 0a 09 72 61 6e 67 65 5f 73 74 61  es */..range_sta
54f0: 72 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 65  rt = 0;..range_e
5500: 6e 64 20 20 20 3d 20 30 3b 0a 09 72 61 6e 67 65  nd   = 0;..range
5510: 5f 72 65 71 75 65 73 74 20 3d 20 30 3b 0a 09 72  _request = 0;..r
5520: 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 2d 31  ange_length = -1
5530: 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  ;..buffer_st->he
5540: 61 64 65 72 73 2e 68 6f 73 74 2e 70 72 65 73 65  aders.host.prese
5550: 6e 74 20 3d 20 30 3b 0a 09 62 75 66 66 65 72 5f  nt = 0;..buffer_
5560: 73 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e  st->headers.conn
5570: 65 63 74 69 6f 6e 20 3d 20 46 49 4c 45 44 5f 43  ection = FILED_C
5580: 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 3b  ONNECTION_CLOSE;
5590: 0a 0a 09 62 75 66 66 65 72 20 3d 20 62 75 66 66  ...buffer = buff
55a0: 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09  er_st->tmpbuf;..
55b0: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a  buffer_len = siz
55c0: 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74  eof(buffer_st->t
55d0: 6d 70 62 75 66 29 3b 0a 0a 09 66 67 65 74 73 5f  mpbuf);...fgets_
55e0: 72 65 74 20 3d 20 66 67 65 74 73 28 62 75 66 66  ret = fgets(buff
55f0: 65 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  er, buffer_len, 
5600: 66 70 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f  fp);..if (fgets_
5610: 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ret == NULL) {..
5620: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
5630: 7d 0a 0a 09 6d 65 74 68 6f 64 20 3d 20 62 75 66  }...method = buf
5640: 66 65 72 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20  fer;...buffer = 
5650: 73 74 72 63 68 72 28 62 75 66 66 65 72 2c 20 27  strchr(buffer, '
5660: 20 27 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72   ');..if (buffer
5670: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
5680: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
5690: 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b  .*buffer = '\0';
56a0: 0a 09 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 70 61  ..buffer++;...pa
56b0: 74 68 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 2f  th = buffer;.../
56c0: 2a 20 54 65 72 6d 69 6e 61 74 65 20 70 61 74 68  * Terminate path
56d0: 20 63 6f 6d 70 6f 6e 65 6e 74 20 2a 2f 0a 09 62   component */..b
56e0: 75 66 66 65 72 20 3d 20 73 74 72 70 62 72 6b 28  uffer = strpbrk(
56f0: 70 61 74 68 2c 20 22 5c 72 5c 6e 20 22 29 3b 0a  path, "\r\n ");.
5700: 09 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e  .if (buffer != N
5710: 55 4c 4c 29 20 7b 0a 09 09 2a 62 75 66 66 65 72  ULL) {...*buffer
5720: 20 3d 20 27 5c 30 27 3b 0a 09 09 62 75 66 66 65   = '\0';...buffe
5730: 72 2b 2b 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 65 20  r++;..}.../* We 
5740: 6f 6e 6c 79 20 68 61 6e 64 6c 65 20 74 68 65 20  only handle the 
5750: 22 47 45 54 22 20 61 6e 64 20 22 48 45 41 44 27  "GET" and "HEAD'
5760: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 09 69 66 20   methods */..if 
5770: 28 73 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68  (strcasecmp(meth
5780: 6f 64 2c 20 22 68 65 61 64 22 29 20 21 3d 20 30  od, "head") != 0
5790: 29 20 7b 0a 09 09 69 66 20 28 73 74 72 63 61 73  ) {...if (strcas
57a0: 65 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22 67 65  ecmp(method, "ge
57b0: 74 22 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 72  t") != 0) {....r
57c0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d  eturn(NULL);...}
57d0: 0a 0a 09 09 2f 2a 20 47 45 54 20 72 65 71 75 65  ..../* GET reque
57e0: 73 74 20 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73  st */...buffer_s
57f0: 74 2d 3e 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45  t->method = FILE
5800: 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44  D_REQUEST_METHOD
5810: 5f 47 45 54 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  _GET;..} else {.
5820: 09 09 2f 2a 20 48 45 41 44 20 72 65 71 75 65 73  ../* HEAD reques
5830: 74 20 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74  t */...buffer_st
5840: 2d 3e 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44  ->method = FILED
5850: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
5860: 48 45 41 44 3b 0a 09 7d 0a 0a 09 2f 2a 20 4e 6f  HEAD;..}.../* No
5870: 74 65 20 70 61 74 68 20 2a 2f 0a 09 70 61 74 68  te path */..path
5880: 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 61  _len = strlen(pa
5890: 74 68 29 3b 0a 09 6d 65 6d 63 70 79 28 62 75 66  th);..memcpy(buf
58a0: 66 65 72 5f 73 74 2d 3e 70 61 74 68 2c 20 70 61  fer_st->path, pa
58b0: 74 68 2c 20 70 61 74 68 5f 6c 65 6e 20 2b 20 31  th, path_len + 1
58c0: 29 3b 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  );.../* Determin
58d0: 65 20 74 79 70 65 20 6f 66 20 72 65 71 75 65 73  e type of reques
58e0: 74 20 66 72 6f 6d 20 70 61 74 68 20 2a 2f 0a 09  t from path */..
58f0: 69 66 20 28 70 61 74 68 5f 6c 65 6e 20 3d 3d 20  if (path_len == 
5900: 30 29 20 7b 0a 09 09 62 75 66 66 65 72 5f 73 74  0) {...buffer_st
5910: 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 52  ->type = FILED_R
5920: 45 51 55 45 53 54 5f 54 59 50 45 5f 44 49 52 45  EQUEST_TYPE_DIRE
5930: 43 54 4f 52 59 3b 0a 09 7d 20 65 6c 73 65 20 7b  CTORY;..} else {
5940: 0a 09 09 69 66 20 28 70 61 74 68 5b 70 61 74 68  ...if (path[path
5950: 5f 6c 65 6e 20 2d 20 31 5d 20 3d 3d 20 27 2f 27  _len - 1] == '/'
5960: 29 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 73 74  ) {....buffer_st
5970: 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 52  ->type = FILED_R
5980: 45 51 55 45 53 54 5f 54 59 50 45 5f 44 49 52 45  EQUEST_TYPE_DIRE
5990: 43 54 4f 52 59 3b 0a 09 09 7d 20 65 6c 73 65 20  CTORY;...} else 
59a0: 7b 0a 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  {....buffer_st->
59b0: 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 52 45 51  type = FILED_REQ
59c0: 55 45 53 54 5f 54 59 50 45 5f 4f 54 48 45 52 3b  UEST_TYPE_OTHER;
59d0: 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 52 65 73  ...}..}.../* Res
59e0: 65 74 20 62 75 66 66 65 72 20 66 6f 72 20 6c 61  et buffer for la
59f0: 74 65 72 20 75 73 65 20 2a 2f 0a 09 62 75 66 66  ter use */..buff
5a00: 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e  er = buffer_st->
5a10: 74 6d 70 62 75 66 3b 0a 0a 09 66 6f 72 20 28 69  tmpbuf;...for (i
5a20: 20 3d 20 30 3b 20 69 20 3c 20 31 30 30 3b 20 69   = 0; i < 100; i
5a30: 2b 2b 29 20 7b 0a 09 09 66 67 65 74 73 5f 72 65  ++) {...fgets_re
5a40: 74 20 3d 20 66 67 65 74 73 28 62 75 66 66 65 72  t = fgets(buffer
5a50: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70  , buffer_len, fp
5a60: 29 3b 0a 09 09 69 66 20 28 66 67 65 74 73 5f 72  );...if (fgets_r
5a70: 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  et == NULL) {...
5a80: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
5a90: 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28 62  f (strncasecmp(b
5aa0: 75 66 66 65 72 2c 20 22 52 61 6e 67 65 3a 20 22  uffer, "Range: "
5ab0: 2c 20 37 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  , 7) == 0) {....
5ac0: 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 62 75 66  workbuffer = buf
5ad0: 66 65 72 20 2b 20 37 3b 0a 0a 09 09 09 69 66 20  fer + 7;.....if 
5ae0: 28 73 74 72 6e 63 61 73 65 63 6d 70 28 77 6f 72  (strncasecmp(wor
5af0: 6b 62 75 66 66 65 72 2c 20 22 62 79 74 65 73 3d  kbuffer, "bytes=
5b00: 22 2c 20 36 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 6) == 0) {...
5b10: 09 09 77 6f 72 6b 62 75 66 66 65 72 20 2b 3d 20  ..workbuffer += 
5b20: 36 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f 72 65  6;......range_re
5b30: 71 75 65 73 74 20 3d 20 31 3b 0a 0a 09 09 09 09  quest = 1;......
5b40: 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20 73 74  range_start = st
5b50: 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75 66 66 65  rtoull(workbuffe
5b60: 72 2c 20 26 77 6f 72 6b 62 75 66 66 65 72 5f 6e  r, &workbuffer_n
5b70: 65 78 74 2c 20 31 30 29 3b 0a 0a 09 09 09 09 77  ext, 10);......w
5b80: 6f 72 6b 62 75 66 66 65 72 20 3d 20 77 6f 72 6b  orkbuffer = work
5b90: 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 0a 09 09  buffer_next;....
5ba0: 09 09 69 66 20 28 2a 77 6f 72 6b 62 75 66 66 65  ..if (*workbuffe
5bb0: 72 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 09 09  r == '-') {.....
5bc0: 09 77 6f 72 6b 62 75 66 66 65 72 2b 2b 3b 0a 0a  .workbuffer++;..
5bd0: 09 09 09 09 09 69 66 20 28 2a 77 6f 72 6b 62 75  .....if (*workbu
5be0: 66 66 65 72 20 21 3d 20 27 5c 72 27 20 26 26 20  ffer != '\r' && 
5bf0: 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 27  *workbuffer != '
5c00: 5c 6e 27 29 20 7b 0a 09 09 09 09 09 09 72 61 6e  \n') {.......ran
5c10: 67 65 5f 65 6e 64 20 3d 20 73 74 72 74 6f 75 6c  ge_end = strtoul
5c20: 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77  l(workbuffer, &w
5c30: 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20  orkbuffer_next, 
5c40: 31 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  10);......}.....
5c50: 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  }....}...} else 
5c60: 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28  if (strncasecmp(
5c70: 62 75 66 66 65 72 2c 20 22 48 6f 73 74 3a 20 22  buffer, "Host: "
5c80: 2c 20 35 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  , 5) == 0) {....
5c90: 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65  buffer_st->heade
5ca0: 72 73 2e 68 6f 73 74 2e 70 72 65 73 65 6e 74 20  rs.host.present 
5cb0: 3d 20 31 3b 0a 0a 09 09 09 77 6f 72 6b 62 75 66  = 1;.....workbuf
5cc0: 66 65 72 20 3d 20 73 74 72 70 62 72 6b 28 62 75  fer = strpbrk(bu
5cd0: 66 66 65 72 20 2b 20 35 2c 20 22 5c 72 5c 6e 3a  ffer + 5, "\r\n:
5ce0: 22 29 3b 0a 09 09 09 69 66 20 28 77 6f 72 6b 62  ");....if (workb
5cf0: 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  uffer != NULL) {
5d00: 0a 09 09 09 09 2a 77 6f 72 6b 62 75 66 66 65 72  .....*workbuffer
5d10: 20 3d 20 27 5c 30 27 3b 0a 09 09 09 7d 0a 0a 09   = '\0';....}...
5d20: 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 62  ..workbuffer = b
5d30: 75 66 66 65 72 20 2b 20 35 3b 0a 09 09 09 77 68  uffer + 5;....wh
5d40: 69 6c 65 20 28 2a 77 6f 72 6b 62 75 66 66 65 72  ile (*workbuffer
5d50: 20 3d 3d 20 27 20 27 29 20 7b 0a 09 09 09 09 77   == ' ') {.....w
5d60: 6f 72 6b 62 75 66 66 65 72 2b 2b 3b 0a 09 09 09  orkbuffer++;....
5d70: 7d 0a 0a 09 09 09 73 74 72 63 70 79 28 62 75 66  }.....strcpy(buf
5d80: 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e  fer_st->headers.
5d90: 68 6f 73 74 2e 68 6f 73 74 2c 20 77 6f 72 6b 62  host.host, workb
5da0: 75 66 66 65 72 29 3b 0a 09 09 7d 20 65 6c 73 65  uffer);...} else
5db0: 20 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70   if (strncasecmp
5dc0: 28 62 75 66 66 65 72 2c 20 22 43 6f 6e 6e 65 63  (buffer, "Connec
5dd0: 74 69 6f 6e 3a 20 4b 65 65 70 2d 41 6c 69 76 65  tion: Keep-Alive
5de0: 22 2c 20 32 32 29 20 3d 3d 20 30 29 20 7b 0a 09  ", 22) == 0) {..
5df0: 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61  ..buffer_st->hea
5e00: 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20  ders.connection 
5e10: 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49  = FILED_CONNECTI
5e20: 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56 45 3b 0a 09  ON_KEEP_ALIVE;..
5e30: 09 7d 0a 0a 09 09 69 66 20 28 6d 65 6d 63 6d 70  .}....if (memcmp
5e40: 28 62 75 66 66 65 72 2c 20 22 5c 72 5c 6e 22 2c  (buffer, "\r\n",
5e50: 20 32 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62   2) == 0) {....b
5e60: 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  reak;...}..}.../
5e70: 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 61 6e 67  * Determine rang
5e80: 65 20 2a 2f 0a 09 69 66 20 28 72 61 6e 67 65 5f  e */..if (range_
5e90: 65 6e 64 20 21 3d 20 30 29 20 7b 0a 09 09 69 66  end != 0) {...if
5ea0: 20 28 72 61 6e 67 65 5f 65 6e 64 20 3c 3d 20 72   (range_end <= r
5eb0: 61 6e 67 65 5f 73 74 61 72 74 29 20 7b 0a 09 09  ange_start) {...
5ec0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
5ed0: 09 7d 0a 0a 09 09 72 61 6e 67 65 5f 6c 65 6e 67  .}....range_leng
5ee0: 74 68 20 3d 20 72 61 6e 67 65 5f 65 6e 64 20 2d  th = range_end -
5ef0: 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 0a 09   range_start;...
5f00: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64  .filed_log_msg_d
5f10: 65 62 75 67 28 22 43 6f 6d 70 75 74 69 6e 67 20  ebug("Computing 
5f20: 6c 65 6e 67 74 68 20 70 61 72 61 6d 65 74 65 72  length parameter
5f30: 3a 20 25 6c 6c 75 20 3d 20 25 6c 6c 75 20 2d 20  : %llu = %llu - 
5f40: 25 6c 6c 75 22 2c 0a 09 09 09 28 75 6e 73 69 67  %llu",....(unsig
5f50: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
5f60: 61 6e 67 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09  ange_length,....
5f70: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
5f80: 6f 6e 67 29 20 72 61 6e 67 65 5f 65 6e 64 2c 0a  ong) range_end,.
5f90: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
5fa0: 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 73 74  g long) range_st
5fb0: 61 72 74 0a 09 09 29 3b 0a 09 7d 0a 0a 09 2f 2a  art...);..}.../*
5fc0: 20 46 69 6c 6c 20 75 70 20 73 74 72 75 63 74 75   Fill up structu
5fd0: 72 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  re to return */.
5fe0: 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64  .buffer_st->head
5ff0: 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e  ers.range.presen
6000: 74 20 3d 20 72 61 6e 67 65 5f 72 65 71 75 65 73  t = range_reques
6010: 74 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68  t;..buffer_st->h
6020: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
6030: 73 65 74 20 20 3d 20 72 61 6e 67 65 5f 73 74 61  set  = range_sta
6040: 72 74 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e  rt;..buffer_st->
6050: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
6060: 6e 67 74 68 20 20 3d 20 72 61 6e 67 65 5f 6c 65  ngth  = range_le
6070: 6e 67 74 68 3b 0a 0a 09 2f 2a 20 49 66 20 76 68  ngth;.../* If vh
6080: 6f 73 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64  osts are enabled
6090: 2c 20 63 6f 6d 70 75 74 65 20 6e 65 77 20 70 61  , compute new pa
60a0: 74 68 20 2a 2f 0a 09 69 66 20 28 6f 70 74 69 6f  th */..if (optio
60b0: 6e 73 2d 3e 76 68 6f 73 74 73 5f 65 6e 61 62 6c  ns->vhosts_enabl
60c0: 65 64 29 20 7b 0a 09 09 69 66 20 28 62 75 66 66  ed) {...if (buff
60d0: 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68  er_st->headers.h
60e0: 6f 73 74 2e 70 72 65 73 65 6e 74 20 3d 3d 20 31  ost.present == 1
60f0: 29 20 7b 0a 09 09 09 62 75 66 66 65 72 20 3d 20  ) {....buffer = 
6100: 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75  buffer_st->tmpbu
6110: 66 3b 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e  f;....buffer_len
6120: 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72   = sizeof(buffer
6130: 5f 73 74 2d 3e 74 6d 70 62 75 66 29 3b 0a 0a 09  _st->tmpbuf);...
6140: 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d  ..snprintf_ret =
6150: 20 73 6e 70 72 69 6e 74 66 28 62 75 66 66 65 72   snprintf(buffer
6160: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 22 2f  , buffer_len, "/
6170: 25 73 25 73 25 73 22 2c 0a 09 09 09 09 62 75 66  %s%s%s",.....buf
6180: 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e  fer_st->headers.
6190: 68 6f 73 74 2e 68 6f 73 74 2c 0a 09 09 09 09 62  host.host,.....b
61a0: 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 5b 30  uffer_st->path[0
61b0: 5d 20 3d 3d 20 27 2f 27 20 3f 20 22 22 20 3a 20  ] == '/' ? "" : 
61c0: 22 2f 22 2c 0a 09 09 09 09 62 75 66 66 65 72 5f  "/",.....buffer_
61d0: 73 74 2d 3e 70 61 74 68 0a 09 09 09 29 3b 0a 09  st->path....);..
61e0: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
61f0: 65 74 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 69  et >= 0) {.....i
6200: 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  f (((unsigned in
6210: 74 29 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 29  t) snprintf_ret)
6220: 20 3c 20 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b   < buffer_len) {
6230: 0a 09 09 09 09 09 73 74 72 63 70 79 28 62 75 66  ......strcpy(buf
6240: 66 65 72 5f 73 74 2d 3e 70 61 74 68 2c 20 62 75  fer_st->path, bu
6250: 66 66 65 72 29 3b 0a 09 09 09 09 7d 0a 09 09 09  ffer);.....}....
6260: 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  }...}..}...retur
6270: 6e 28 62 75 66 66 65 72 5f 73 74 29 3b 0a 7d 0a  n(buffer_st);.}.
6280: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ./* Return an er
6290: 72 6f 72 20 70 61 67 65 20 2a 2f 0a 73 74 61 74  ror page */.stat
62a0: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 65 72  ic void filed_er
62b0: 72 6f 72 5f 70 61 67 65 28 46 49 4c 45 20 2a 66  ror_page(FILE *f
62c0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  p, const char *d
62d0: 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 69 6e 74  ate_current, int
62e0: 20 65 72 72 6f 72 5f 6e 75 6d 62 65 72 2c 20 69   error_number, i
62f0: 6e 74 20 6d 65 74 68 6f 64 2c 20 63 6f 6e 73 74  nt method, const
6300: 20 63 68 61 72 20 2a 72 65 61 73 6f 6e 2c 20 73   char *reason, s
6310: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f  truct filed_log_
6320: 65 6e 74 72 79 20 2a 6c 6f 67 29 20 7b 0a 09 63  entry *log) {..c
6330: 68 61 72 20 2a 65 72 72 6f 72 5f 73 74 72 69 6e  har *error_strin
6340: 67 20 3d 20 22 3c 68 74 6d 6c 3e 3c 68 65 61 64  g = "<html><head
6350: 3e 3c 74 69 74 6c 65 3e 45 52 52 4f 52 3c 2f 74  ><title>ERROR</t
6360: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 3c 62 6f 64  itle></head><bod
6370: 79 3e 55 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63  y>Unable to proc
6380: 65 73 73 20 72 65 71 75 65 73 74 3c 2f 62 6f 64  ess request</bod
6390: 79 3e 3c 2f 68 74 6d 6c 3e 22 3b 0a 0a 09 66 70  y></html>";...fp
63a0: 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f  rintf(fp, "HTTP/
63b0: 31 2e 31 20 25 69 20 4e 6f 74 20 4f 4b 5c 72 5c  1.1 %i Not OK\r\
63c0: 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72  nDate: %s\r\nSer
63d0: 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61  ver: filed\r\nLa
63e0: 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c  st-Modified: %s\
63f0: 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74  r\nContent-Lengt
6400: 68 3a 20 25 6c 6c 75 5c 72 5c 6e 43 6f 6e 74 65  h: %llu\r\nConte
6410: 6e 74 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43  nt-Type: %s\r\nC
6420: 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65  onnection: close
6430: 5c 72 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 65 72 72  \r\n\r\n",...err
6440: 6f 72 5f 6e 75 6d 62 65 72 2c 0a 09 09 64 61 74  or_number,...dat
6450: 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74  e_current,...dat
6460: 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09 28 75 6e  e_current,...(un
6470: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
6480: 29 20 73 74 72 6c 65 6e 28 65 72 72 6f 72 5f 73  ) strlen(error_s
6490: 74 72 69 6e 67 29 2c 0a 09 09 22 74 65 78 74 2f  tring),..."text/
64a0: 68 74 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a 20 73  html"..);.../* s
64b0: 69 6c 65 6e 63 65 20 65 72 72 6f 72 20 73 74 72  ilence error str
64c0: 69 6e 67 20 66 6f 72 20 48 45 41 44 20 72 65 71  ing for HEAD req
64d0: 75 65 73 74 73 20 2a 2f 0a 09 69 66 20 28 6d 65  uests */..if (me
64e0: 74 68 6f 64 20 21 3d 20 46 49 4c 45 44 5f 52 45  thod != FILED_RE
64f0: 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41  QUEST_METHOD_HEA
6500: 44 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 66  D) {...fprintf(f
6510: 70 2c 20 22 25 73 22 2c 20 65 72 72 6f 72 5f 73  p, "%s", error_s
6520: 74 72 69 6e 67 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  tring);..}.../* 
6530: 4c 6f 67 20 65 72 72 6f 72 20 2a 2f 0a 09 2f 2a  Log error */../*
6540: 2a 20 72 65 61 73 6f 6e 20 6d 75 73 74 20 70 6f  * reason must po
6550: 69 6e 74 20 74 6f 20 61 20 67 6c 6f 62 61 6c 6c  int to a globall
6560: 79 20 61 6c 6c 6f 63 61 74 65 64 20 76 61 6c 75  y allocated valu
6570: 65 20 2a 2a 2f 0a 09 6c 6f 67 2d 3e 72 65 61 73  e **/..log->reas
6580: 6f 6e 20 3d 20 72 65 61 73 6f 6e 3b 0a 09 6c 6f  on = reason;..lo
6590: 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 65  g->http_code = e
65a0: 72 72 6f 72 5f 6e 75 6d 62 65 72 3b 0a 0a 09 66  rror_number;...f
65b0: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c  iled_log_entry(l
65c0: 6f 67 29 3b 0a 0a 09 2f 2a 20 43 6c 6f 73 65 20  og);.../* Close 
65d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09 66  connection */..f
65e0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
65f0: 75 74 5f 63 6c 6f 73 65 28 66 69 6c 65 6e 6f 28  ut_close(fileno(
6600: 66 70 29 29 3b 0a 0a 09 66 63 6c 6f 73 65 28 66  fp));...fclose(f
6610: 70 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  p);...return;.}.
6620: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 72 65 64  ./* Return a red
6630: 69 72 65 63 74 20 74 6f 20 69 6e 64 65 78 2e 68  irect to index.h
6640: 74 6d 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  tml */.static vo
6650: 69 64 20 66 69 6c 65 64 5f 72 65 64 69 72 65 63  id filed_redirec
6660: 74 5f 69 6e 64 65 78 28 46 49 4c 45 20 2a 66 70  t_index(FILE *fp
6670: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61  , const char *da
6680: 74 65 5f 63 75 72 72 65 6e 74 2c 20 63 6f 6e 73  te_current, cons
6690: 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74  t char *path, st
66a0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
66b0: 6e 74 72 79 20 2a 6c 6f 67 29 20 7b 0a 09 69 6e  ntry *log) {..in
66c0: 74 20 68 74 74 70 5f 63 6f 64 65 20 3d 20 33 30  t http_code = 30
66d0: 31 3b 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20  1;..fprintf(fp, 
66e0: 22 48 54 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c  "HTTP/1.1 %i OK\
66f0: 72 5c 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53  r\nDate: %s\r\nS
6700: 65 72 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e  erver: filed\r\n
6710: 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25  Last-Modified: %
6720: 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e  s\r\nContent-Len
6730: 67 74 68 3a 20 30 5c 72 5c 6e 43 6f 6e 6e 65 63  gth: 0\r\nConnec
6740: 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 4c  tion: close\r\nL
6750: 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 5c  ocation: %s\r\n\
6760: 72 5c 6e 22 2c 0a 09 09 68 74 74 70 5f 63 6f 64  r\n",...http_cod
6770: 65 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e  e,...date_curren
6780: 74 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e  t,...date_curren
6790: 74 2c 0a 09 09 22 69 6e 64 65 78 2e 68 74 6d 6c  t,..."index.html
67a0: 22 0a 09 29 3b 0a 0a 09 2f 2a 20 4c 6f 67 20 72  "..);.../* Log r
67b0: 65 64 69 72 65 63 74 20 2a 2f 0a 09 6c 6f 67 2d  edirect */..log-
67c0: 3e 72 65 61 73 6f 6e 20 3d 20 22 72 65 64 69 72  >reason = "redir
67d0: 65 63 74 22 3b 0a 09 6c 6f 67 2d 3e 68 74 74 70  ect";..log->http
67e0: 5f 63 6f 64 65 20 3d 20 68 74 74 70 5f 63 6f 64  _code = http_cod
67f0: 65 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65  e;...filed_log_e
6800: 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 2f 2a 20  ntry(log);.../* 
6810: 43 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Close connection
6820: 20 2a 2f 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65   */..filed_socke
6830: 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65 28 66  ttimeout_close(f
6840: 69 6c 65 6e 6f 28 66 70 29 29 3b 0a 0a 09 66 63  ileno(fp));...fc
6850: 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65 74 75  lose(fp);...retu
6860: 72 6e 3b 0a 0a 09 2f 2a 20 43 75 72 72 65 6e 74  rn;.../* Current
6870: 6c 79 20 75 6e 75 73 65 64 3a 20 70 61 74 68 20  ly unused: path 
6880: 2a 2f 0a 09 70 61 74 68 20 3d 20 70 61 74 68 3b  */..path = path;
6890: 0a 7d 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  .}../* Convert a
68a0: 6e 20 65 6e 75 6d 20 72 65 70 72 65 73 65 6e 74  n enum represent
68b0: 69 6e 67 20 74 68 65 20 22 43 6f 6e 6e 65 63 74  ing the "Connect
68c0: 69 6f 6e 22 20 68 65 61 64 65 72 20 76 61 6c 75  ion" header valu
68d0: 65 20 74 6f 20 61 20 73 74 72 69 6e 67 20 2a 2f  e to a string */
68e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
68f0: 61 72 20 2a 66 69 6c 65 64 5f 63 6f 6e 6e 65 63  ar *filed_connec
6900: 74 69 6f 6e 5f 73 74 72 28 69 6e 74 20 63 6f 6e  tion_str(int con
6910: 6e 65 63 74 69 6f 6e 5f 76 61 6c 75 65 29 20 7b  nection_value) {
6920: 0a 09 73 77 69 74 63 68 20 28 63 6f 6e 6e 65 63  ..switch (connec
6930: 74 69 6f 6e 5f 76 61 6c 75 65 29 20 7b 0a 09 09  tion_value) {...
6940: 63 61 73 65 20 46 49 4c 45 44 5f 43 4f 4e 4e 45  case FILED_CONNE
6950: 43 54 49 4f 4e 5f 43 4c 4f 53 45 3a 0a 09 09 09  CTION_CLOSE:....
6960: 72 65 74 75 72 6e 28 22 63 6c 6f 73 65 22 29 3b  return("close");
6970: 0a 09 09 63 61 73 65 20 46 49 4c 45 44 5f 43 4f  ...case FILED_CO
6980: 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c  NNECTION_KEEP_AL
6990: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
69a0: 6b 65 65 70 2d 61 6c 69 76 65 22 29 3b 0a 09 7d  keep-alive");..}
69b0: 0a 0a 09 72 65 74 75 72 6e 28 22 63 6c 6f 73 65  ...return("close
69c0: 22 29 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65  ");.}../* Handle
69d0: 20 61 20 73 69 6e 67 6c 65 20 72 65 71 75 65 73   a single reques
69e0: 74 20 66 72 6f 6d 20 61 20 63 6c 69 65 6e 74 20  t from a client 
69f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
6a00: 6c 65 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e  led_handle_clien
6a10: 74 28 69 6e 74 20 66 64 2c 20 73 74 72 75 63 74  t(int fd, struct
6a20: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
6a30: 65 73 74 20 2a 72 65 71 75 65 73 74 2c 20 73 74  est *request, st
6a40: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
6a50: 6e 74 72 79 20 2a 6c 6f 67 2c 20 73 74 72 75 63  ntry *log, struc
6a60: 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20  t filed_options 
6a70: 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 72  *options) {..str
6a80: 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  uct filed_filein
6a90: 66 6f 20 2a 66 69 6c 65 69 6e 66 6f 3b 0a 09 73  fo *fileinfo;..s
6aa0: 73 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f  size_t sendfile_
6ab0: 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 73 65 6e  ret;..size_t sen
6ac0: 64 66 69 6c 65 5f 73 69 7a 65 3b 0a 09 6f 66 66  dfile_size;..off
6ad0: 5f 74 20 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73  _t sendfile_offs
6ae0: 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e  et, sendfile_sen
6af0: 74 2c 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b  t, sendfile_len;
6b00: 0a 09 63 68 61 72 20 2a 70 61 74 68 3b 0a 09 63  ..char *path;..c
6b10: 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e  har *date_curren
6b20: 74 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  t, date_current_
6b30: 62 5b 36 34 5d 3b 0a 09 69 6e 74 20 68 74 74 70  b[64];..int http
6b40: 5f 63 6f 64 65 3b 0a 09 46 49 4c 45 20 2a 66 70  _code;..FILE *fp
6b50: 3b 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ;.../* Determine
6b60: 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 2a 2f   current time */
6b70: 0a 09 64 61 74 65 5f 63 75 72 72 65 6e 74 20 3d  ..date_current =
6b80: 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69   filed_format_ti
6b90: 6d 65 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  me(date_current_
6ba0: 62 2c 20 73 69 7a 65 6f 66 28 64 61 74 65 5f 63  b, sizeof(date_c
6bb0: 75 72 72 65 6e 74 5f 62 29 2c 20 74 69 6d 65 28  urrent_b), time(
6bc0: 4e 55 4c 4c 29 29 3b 0a 0a 09 2f 2a 20 4f 70 65  NULL));.../* Ope
6bd0: 6e 20 73 6f 63 6b 65 74 20 61 73 20 41 4e 53 49  n socket as ANSI
6be0: 20 49 2f 4f 20 66 6f 72 20 65 61 73 65 20 6f 66   I/O for ease of
6bf0: 20 75 73 65 20 2a 2f 0a 09 66 70 20 3d 20 66 64   use */..fp = fd
6c00: 6f 70 65 6e 28 66 64 2c 20 22 77 2b 62 22 29 3b  open(fd, "w+b");
6c10: 0a 09 69 66 20 28 66 70 20 3d 3d 20 4e 55 4c 4c  ..if (fp == NULL
6c20: 29 20 7b 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b  ) {...filed_sock
6c30: 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65 28  ettimeout_close(
6c40: 66 64 29 3b 0a 0a 09 09 63 6c 6f 73 65 28 66 64  fd);....close(fd
6c50: 29 3b 0a 0a 09 09 6c 6f 67 2d 3e 62 75 66 66 65  );....log->buffe
6c60: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 6c  r[0] = '\0';...l
6c70: 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20  og->http_code = 
6c80: 2d 31 3b 0a 09 09 6c 6f 67 2d 3e 72 65 61 73 6f  -1;...log->reaso
6c90: 6e 20 3d 20 22 66 64 6f 70 65 6e 5f 66 61 69 6c  n = "fdopen_fail
6ca0: 65 64 22 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f  ed";....filed_lo
6cb0: 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09  g_entry(log);...
6cc0: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f  .return(FILED_CO
6cd0: 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b  NNECTION_CLOSE);
6ce0: 0a 09 7d 0a 0a 09 72 65 71 75 65 73 74 20 3d 20  ..}...request = 
6cf0: 66 69 6c 65 64 5f 67 65 74 5f 68 74 74 70 5f 72  filed_get_http_r
6d00: 65 71 75 65 73 74 28 66 70 2c 20 72 65 71 75 65  equest(fp, reque
6d10: 73 74 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a 0a 09  st, options);...
6d20: 69 66 20 28 72 65 71 75 65 73 74 20 3d 3d 20 4e  if (request == N
6d30: 55 4c 4c 29 20 7b 0a 09 09 6c 6f 67 2d 3e 62 75  ULL) {...log->bu
6d40: 66 66 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ffer[0] = '\0';.
6d50: 0a 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70  ...filed_error_p
6d60: 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72  age(fp, date_cur
6d70: 72 65 6e 74 2c 20 35 30 30 2c 20 46 49 4c 45 44  rent, 500, FILED
6d80: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
6d90: 47 45 54 2c 20 22 66 6f 72 6d 61 74 22 2c 20 6c  GET, "format", l
6da0: 6f 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46  og);....return(F
6db0: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
6dc0: 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c  CLOSE);..}...fil
6dd0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
6de0: 5f 70 72 6f 63 65 73 73 69 6e 67 5f 73 74 61 72  _processing_star
6df0: 74 28 66 64 29 3b 0a 0a 09 70 61 74 68 20 3d 20  t(fd);...path = 
6e00: 72 65 71 75 65 73 74 2d 3e 70 61 74 68 3b 0a 09  request->path;..
6e10: 73 74 72 63 70 79 28 6c 6f 67 2d 3e 62 75 66 66  strcpy(log->buff
6e20: 65 72 2c 20 70 61 74 68 29 3b 0a 09 6c 6f 67 2d  er, path);..log-
6e30: 3e 6d 65 74 68 6f 64 20 3d 20 72 65 71 75 65 73  >method = reques
6e40: 74 2d 3e 6d 65 74 68 6f 64 3b 0a 0a 09 2f 2a 20  t->method;.../* 
6e50: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
6e60: 20 70 61 74 68 20 69 73 20 61 20 64 69 72 65 63   path is a direc
6e70: 74 6f 72 79 2c 20 72 65 64 69 72 65 63 74 20 74  tory, redirect t
6e80: 6f 20 69 6e 64 65 78 20 70 61 67 65 20 2a 2f 0a  o index page */.
6e90: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 74 79  .if (request->ty
6ea0: 70 65 20 3d 3d 20 46 49 4c 45 44 5f 52 45 51 55  pe == FILED_REQU
6eb0: 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f  EST_TYPE_DIRECTO
6ec0: 52 59 29 20 7b 0a 09 09 66 69 6c 65 64 5f 72 65  RY) {...filed_re
6ed0: 64 69 72 65 63 74 5f 69 6e 64 65 78 28 66 70 2c  direct_index(fp,
6ee0: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 70   date_current, p
6ef0: 61 74 68 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72 65  ath, log);....re
6f00: 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45  turn(FILED_CONNE
6f10: 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d  CTION_CLOSE);..}
6f20: 0a 0a 09 66 69 6c 65 69 6e 66 6f 20 3d 20 66 69  ...fileinfo = fi
6f30: 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 70 61  led_open_file(pa
6f40: 74 68 2c 20 26 72 65 71 75 65 73 74 2d 3e 66 69  th, &request->fi
6f50: 6c 65 69 6e 66 6f 29 3b 0a 09 69 66 20 28 66 69  leinfo);..if (fi
6f60: 6c 65 69 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  leinfo == NULL) 
6f70: 7b 0a 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f  {...filed_error_
6f80: 70 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75  page(fp, date_cu
6f90: 72 72 65 6e 74 2c 20 34 30 34 2c 20 72 65 71 75  rrent, 404, requ
6fa0: 65 73 74 2d 3e 6d 65 74 68 6f 64 2c 20 22 6f 70  est->method, "op
6fb0: 65 6e 5f 66 61 69 6c 65 64 22 2c 20 6c 6f 67 29  en_failed", log)
6fc0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45  ;....return(FILE
6fd0: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f  D_CONNECTION_CLO
6fe0: 53 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  SE);..}...if (re
6ff0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
7000: 61 6e 67 65 2e 70 72 65 73 65 6e 74 29 20 7b 0a  ange.present) {.
7010: 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
7020: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
7030: 73 65 74 20 21 3d 20 30 20 7c 7c 20 72 65 71 75  set != 0 || requ
7040: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
7050: 67 65 2e 6c 65 6e 67 74 68 20 3e 3d 20 30 29 20  ge.length >= 0) 
7060: 7b 0a 09 09 09 69 66 20 28 72 65 71 75 65 73 74  {....if (request
7070: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
7080: 6f 66 66 73 65 74 20 3e 3d 20 66 69 6c 65 69 6e  offset >= filein
7090: 66 6f 2d 3e 6c 65 6e 29 20 7b 0a 09 09 09 09 66  fo->len) {.....f
70a0: 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28  iled_error_page(
70b0: 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74  fp, date_current
70c0: 2c 20 34 31 36 2c 20 72 65 71 75 65 73 74 2d 3e  , 416, request->
70d0: 6d 65 74 68 6f 64 2c 20 22 72 61 6e 67 65 5f 69  method, "range_i
70e0: 6e 76 61 6c 69 64 22 2c 20 6c 6f 67 29 3b 0a 0a  nvalid", log);..
70f0: 09 09 09 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e  ....close(filein
7100: 66 6f 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 72 65  fo->fd);......re
7110: 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45  turn(FILED_CONNE
7120: 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 09  CTION_CLOSE);...
7130: 09 7d 0a 0a 09 09 09 69 66 20 28 72 65 71 75 65  .}.....if (reque
7140: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
7150: 65 2e 6c 65 6e 67 74 68 20 3d 3d 20 28 28 6f 66  e.length == ((of
7160: 66 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 09 09  f_t) -1)) {.....
7170: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
7180: 62 75 67 28 22 43 6f 6d 70 75 74 69 6e 67 20 6c  bug("Computing l
7190: 65 6e 67 74 68 20 74 6f 20 66 69 74 20 69 6e 20  ength to fit in 
71a0: 62 6f 75 6e 64 73 3a 20 66 69 6c 65 69 6e 66 6f  bounds: fileinfo
71b0: 2d 3e 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20 72 65  ->len = %llu, re
71c0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
71d0: 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20 25 6c  ange.offset = %l
71e0: 6c 75 22 2c 0a 09 09 09 09 09 28 75 6e 73 69 67  lu",......(unsig
71f0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66  ned long long) f
7200: 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09  ileinfo->len,...
7210: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
7220: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
7230: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
7240: 66 66 73 65 74 0a 09 09 09 09 29 3b 0a 0a 09 09  ffset.....);....
7250: 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ..request->heade
7260: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
7270: 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20  = fileinfo->len 
7280: 2d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  - request->heade
7290: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b  rs.range.offset;
72a0: 0a 09 09 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f  ....}.....filed_
72b0: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 50  log_msg_debug("P
72c0: 61 72 74 69 61 6c 20 72 65 71 75 65 73 74 2c 20  artial request, 
72d0: 73 74 61 72 74 69 6e 67 20 61 74 3a 20 25 6c 6c  starting at: %ll
72e0: 75 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20 66 6f  u and running fo
72f0: 72 20 25 6c 6c 69 20 62 79 74 65 73 22 2c 0a 09  r %lli bytes",..
7300: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
7310: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
7320: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
7330: 66 66 73 65 74 2c 0a 09 09 09 09 28 6c 6f 6e 67  ffset,.....(long
7340: 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e   long) request->
7350: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
7360: 6e 67 74 68 0a 09 09 09 29 3b 0a 0a 09 09 7d 0a  ngth....);....}.
7370: 0a 09 09 68 74 74 70 5f 63 6f 64 65 20 3d 20 32  ...http_code = 2
7380: 30 36 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  06;..} else {...
7390: 68 74 74 70 5f 63 6f 64 65 20 3d 20 32 30 30 3b  http_code = 200;
73a0: 0a 0a 09 09 2f 2a 20 43 6f 6d 70 75 74 65 20 66  ..../* Compute f
73b0: 61 6b 65 20 72 61 6e 67 65 20 70 61 72 61 6d 65  ake range parame
73c0: 74 65 72 73 20 74 68 61 74 20 69 6e 63 6c 75 64  ters that includ
73d0: 65 73 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  es the entire fi
73e0: 6c 65 20 2a 2f 0a 09 09 72 65 71 75 65 73 74 2d  le */...request-
73f0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
7400: 66 66 73 65 74 20 3d 20 30 3b 0a 09 09 72 65 71  ffset = 0;...req
7410: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
7420: 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c  nge.length = fil
7430: 65 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 09 7d 0a 0a  einfo->len;..}..
7440: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 48 54  .fprintf(fp, "HT
7450: 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e  TP/1.1 %i OK\r\n
7460: 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76  Date: %s\r\nServ
7470: 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73  er: filed\r\nLas
7480: 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72  t-Modified: %s\r
7490: 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68  \nContent-Length
74a0: 3a 20 25 6c 6c 75 5c 72 5c 6e 41 63 63 65 70 74  : %llu\r\nAccept
74b0: 2d 52 61 6e 67 65 73 3a 20 62 79 74 65 73 5c 72  -Ranges: bytes\r
74c0: 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20  \nContent-Type: 
74d0: 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e  %s\r\nConnection
74e0: 3a 20 25 73 5c 72 5c 6e 45 54 61 67 3a 20 5c 22  : %s\r\nETag: \"
74f0: 25 73 5c 22 5c 72 5c 6e 22 2c 0a 09 09 68 74 74  %s\"\r\n",...htt
7500: 70 5f 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63  p_code,...date_c
7510: 75 72 72 65 6e 74 2c 0a 09 09 66 69 6c 65 69 6e  urrent,...filein
7520: 66 6f 2d 3e 6c 61 73 74 6d 6f 64 2c 0a 09 09 28  fo->lastmod,...(
7530: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
7540: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
7550: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
7560: 68 2c 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74  h,...fileinfo->t
7570: 79 70 65 2c 0a 09 09 66 69 6c 65 64 5f 63 6f 6e  ype,...filed_con
7580: 6e 65 63 74 69 6f 6e 5f 73 74 72 28 72 65 71 75  nection_str(requ
7590: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e  est->headers.con
75a0: 6e 65 63 74 69 6f 6e 29 2c 0a 09 09 66 69 6c 65  nection),...file
75b0: 69 6e 66 6f 2d 3e 65 74 61 67 0a 09 29 3b 0a 0a  info->etag..);..
75c0: 09 69 66 20 28 68 74 74 70 5f 63 6f 64 65 20 3d  .if (http_code =
75d0: 3d 20 32 30 36 29 20 7b 0a 09 09 66 70 72 69 6e  = 206) {...fprin
75e0: 74 66 28 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d  tf(fp, "Content-
75f0: 52 61 6e 67 65 3a 20 62 79 74 65 73 20 25 6c 6c  Range: bytes %ll
7600: 75 2d 25 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22  u-%llu/%llu\r\n"
7610: 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ,....(unsigned l
7620: 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73  ong long) reques
7630: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
7640: 2e 6f 66 66 73 65 74 2c 0a 09 09 09 28 75 6e 73  .offset,....(uns
7650: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
7660: 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65   (request->heade
7670: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20  rs.range.offset 
7680: 2b 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  + request->heade
7690: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
76a0: 2d 20 31 29 2c 0a 09 09 09 28 75 6e 73 69 67 6e  - 1),....(unsign
76b0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69  ed long long) fi
76c0: 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 0a 09 09 29 3b  leinfo->len...);
76d0: 0a 09 7d 0a 09 66 70 72 69 6e 74 66 28 66 70 2c  ..}..fprintf(fp,
76e0: 20 22 5c 72 5c 6e 22 29 3b 0a 09 66 66 6c 75 73   "\r\n");..fflus
76f0: 68 28 66 70 29 3b 0a 0a 09 6c 6f 67 2d 3e 68 74  h(fp);...log->ht
7700: 74 70 5f 63 6f 64 65 20 3d 20 68 74 74 70 5f 63  tp_code = http_c
7710: 6f 64 65 3b 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f  ode;..log->reaso
7720: 6e 20 3d 20 22 4f 4b 22 3b 0a 09 6c 6f 67 2d 3e  n = "OK";..log->
7730: 73 74 61 72 74 74 69 6d 65 20 3d 20 74 69 6d 65  starttime = time
7740: 28 4e 55 4c 4c 29 3b 0a 09 6c 6f 67 2d 3e 72 65  (NULL);..log->re
7750: 71 5f 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65  q_offset = reque
7760: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
7770: 65 2e 6f 66 66 73 65 74 3b 0a 09 6c 6f 67 2d 3e  e.offset;..log->
7780: 72 65 71 5f 6c 65 6e 67 74 68 20 3d 20 72 65 71  req_length = req
7790: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
77a0: 6e 67 65 2e 6c 65 6e 67 74 68 3b 0a 09 6c 6f 67  nge.length;..log
77b0: 2d 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20  ->file_length = 
77c0: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 0a  fileinfo->len;..
77d0: 23 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e  #ifdef FILED_NON
77e0: 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 69 6e 74 20  BLOCK_HTTP..int 
77f0: 73 6f 63 6b 65 74 5f 66 6c 61 67 73 3b 0a 09 66  socket_flags;..f
7800: 64 5f 73 65 74 20 72 66 64 2c 20 77 66 64 3b 0a  d_set rfd, wfd;.
7810: 09 63 68 61 72 20 73 69 6e 6b 62 75 66 5b 38 31  .char sinkbuf[81
7820: 39 32 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65  92];..ssize_t re
7830: 61 64 5f 72 65 74 3b 0a 0a 09 46 44 5f 5a 45 52  ad_ret;...FD_ZER
7840: 4f 28 26 72 66 64 29 3b 0a 09 46 44 5f 5a 45 52  O(&rfd);..FD_ZER
7850: 4f 28 26 77 66 64 29 3b 0a 09 46 44 5f 53 45 54  O(&wfd);..FD_SET
7860: 28 66 64 2c 20 26 72 66 64 29 3b 0a 09 46 44 5f  (fd, &rfd);..FD_
7870: 53 45 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a  SET(fd, &wfd);..
7880: 09 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 3d 20  .socket_flags = 
7890: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  fcntl(fd, F_GETF
78a0: 4c 29 3b 0a 09 66 63 6e 74 6c 28 66 64 2c 20 46  L);..fcntl(fd, F
78b0: 5f 53 45 54 46 4c 2c 20 73 6f 63 6b 65 74 5f 66  _SETFL, socket_f
78c0: 6c 61 67 73 20 7c 20 4f 5f 4e 4f 4e 42 4c 4f 43  lags | O_NONBLOC
78d0: 4b 29 3b 0a 23 65 6e 64 69 66 0a 09 73 65 6e 64  K);.#endif..send
78e0: 66 69 6c 65 5f 6f 66 66 73 65 74 20 3d 20 72 65  file_offset = re
78f0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
7900: 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 73 65  ange.offset;..se
7910: 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 20 72 65 71  ndfile_len = req
7920: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
7930: 6e 67 65 2e 6c 65 6e 67 74 68 3b 0a 09 73 65 6e  nge.length;..sen
7940: 64 66 69 6c 65 5f 73 65 6e 74 20 3d 20 30 3b 0a  dfile_sent = 0;.
7950: 09 77 68 69 6c 65 20 28 72 65 71 75 65 73 74 2d  .while (request-
7960: 3e 6d 65 74 68 6f 64 20 3d 3d 20 46 49 4c 45 44  >method == FILED
7970: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
7980: 47 45 54 29 20 7b 0a 09 09 69 66 20 28 73 65 6e  GET) {...if (sen
7990: 64 66 69 6c 65 5f 6c 65 6e 20 3e 20 46 49 4c 45  dfile_len > FILE
79a0: 44 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 29 20  D_SENDFILE_MAX) 
79b0: 7b 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69  {....sendfile_si
79c0: 7a 65 20 3d 20 46 49 4c 45 44 5f 53 45 4e 44 46  ze = FILED_SENDF
79d0: 49 4c 45 5f 4d 41 58 3b 0a 09 09 7d 20 65 6c 73  ILE_MAX;...} els
79e0: 65 20 7b 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f  e {....sendfile_
79f0: 73 69 7a 65 20 3d 20 73 65 6e 64 66 69 6c 65 5f  size = sendfile_
7a00: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64  len;...}....send
7a10: 66 69 6c 65 5f 72 65 74 20 3d 20 73 65 6e 64 66  file_ret = sendf
7a20: 69 6c 65 28 66 64 2c 20 66 69 6c 65 69 6e 66 6f  ile(fd, fileinfo
7a30: 2d 3e 66 64 2c 20 26 73 65 6e 64 66 69 6c 65 5f  ->fd, &sendfile_
7a40: 6f 66 66 73 65 74 2c 20 73 65 6e 64 66 69 6c 65  offset, sendfile
7a50: 5f 73 69 7a 65 29 3b 0a 09 09 69 66 20 28 73 65  _size);...if (se
7a60: 6e 64 66 69 6c 65 5f 72 65 74 20 3c 3d 20 30 29  ndfile_ret <= 0)
7a70: 20 7b 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f   {.#ifdef FILED_
7a80: 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 09  NONBLOCK_HTTP...
7a90: 09 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20 45 41  .if (errno == EA
7aa0: 47 41 49 4e 29 20 7b 0a 09 09 09 09 73 65 6e 64  GAIN) {.....send
7ab0: 66 69 6c 65 5f 72 65 74 20 3d 20 30 3b 0a 0a 09  file_ret = 0;...
7ac0: 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
7ad0: 09 09 09 09 73 65 6c 65 63 74 28 66 64 20 2b 20  ....select(fd + 
7ae0: 31 2c 20 26 72 66 64 2c 20 26 77 66 64 2c 20 4e  1, &rfd, &wfd, N
7af0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09  ULL, NULL);.....
7b00: 09 69 66 20 28 46 44 5f 49 53 53 45 54 28 66 64  .if (FD_ISSET(fd
7b10: 2c 20 26 72 66 64 29 29 20 7b 0a 09 09 09 09 09  , &rfd)) {......
7b20: 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64  .read_ret = read
7b30: 28 66 64 2c 20 73 69 6e 6b 62 75 66 2c 20 73 69  (fd, sinkbuf, si
7b40: 7a 65 6f 66 28 73 69 6e 6b 62 75 66 29 29 3b 0a  zeof(sinkbuf));.
7b50: 0a 09 09 09 09 09 09 69 66 20 28 72 65 61 64 5f  .......if (read_
7b60: 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09  ret <= 0) {.....
7b70: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
7b80: 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  }......}.......i
7b90: 66 20 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20  f (FD_ISSET(fd, 
7ba0: 26 77 66 64 29 29 20 7b 0a 09 09 09 09 09 09 72  &wfd)) {.......r
7bb0: 65 61 64 5f 72 65 74 20 3d 20 31 3b 0a 0a 09 09  ead_ret = 1;....
7bc0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
7bd0: 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  }.....}......if 
7be0: 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  (read_ret <= 0) 
7bf0: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
7c00: 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ..}....} else {.
7c10: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
7c20: 23 65 6c 73 65 0a 09 09 09 62 72 65 61 6b 3b 0a  #else....break;.
7c30: 23 65 6e 64 69 66 0a 09 09 7d 0a 0a 09 09 73 65  #endif...}....se
7c40: 6e 64 66 69 6c 65 5f 6c 65 6e 20 2d 3d 20 73 65  ndfile_len -= se
7c50: 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 09 73 65  ndfile_ret;...se
7c60: 6e 64 66 69 6c 65 5f 73 65 6e 74 20 2b 3d 20 73  ndfile_sent += s
7c70: 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 09 69  endfile_ret;...i
7c80: 66 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20  f (sendfile_len 
7c90: 3d 3d 20 30 29 20 7b 0a 09 09 09 62 72 65 61 6b  == 0) {....break
7ca0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6c 6f 67 2d 3e  ;...}..}...log->
7cb0: 65 6e 64 74 69 6d 65 20 3d 20 28 74 69 6d 65 5f  endtime = (time_
7cc0: 74 29 20 2d 31 3b 0a 09 6c 6f 67 2d 3e 73 65 6e  t) -1;..log->sen
7cd0: 74 5f 6c 65 6e 67 74 68 20 3d 20 73 65 6e 64 66  t_length = sendf
7ce0: 69 6c 65 5f 73 65 6e 74 3b 0a 0a 09 66 69 6c 65  ile_sent;...file
7cf0: 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29  d_log_entry(log)
7d00: 3b 0a 0a 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e  ;...close(filein
7d10: 66 6f 2d 3e 66 64 29 3b 0a 0a 09 69 66 20 28 72  fo->fd);...if (r
7d20: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
7d30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 21 3d 20 46 49  connection != FI
7d40: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b  LED_CONNECTION_K
7d50: 45 45 50 5f 41 4c 49 56 45 29 20 7b 0a 09 09 66  EEP_ALIVE) {...f
7d60: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
7d70: 75 74 5f 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09  ut_close(fd);...
7d80: 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 09  .fclose(fp);....
7d90: 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e  return(FILED_CON
7da0: 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a  NECTION_CLOSE);.
7db0: 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65  .}...filed_socke
7dc0: 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73  ttimeout_process
7dd0: 69 6e 67 5f 65 6e 64 28 66 64 29 3b 0a 0a 09 72  ing_end(fd);...r
7de0: 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e  eturn(FILED_CONN
7df0: 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56  ECTION_KEEP_ALIV
7e00: 45 29 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65  E);.}../* Handle
7e10: 20 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63   incoming connec
7e20: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
7e30: 76 6f 69 64 20 2a 66 69 6c 65 64 5f 77 6f 72 6b  void *filed_work
7e40: 65 72 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a  er_thread(void *
7e50: 61 72 67 5f 76 29 20 7b 0a 09 73 74 72 75 63 74  arg_v) {..struct
7e60: 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68   filed_worker_th
7e70: 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a  read_args *arg;.
7e80: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74  .struct filed_ht
7e90: 74 70 5f 72 65 71 75 65 73 74 20 72 65 71 75 65  tp_request reque
7ea0: 73 74 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  st;..struct file
7eb0: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67  d_log_entry *log
7ec0: 2c 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f  , local_dummy_lo
7ed0: 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  g;..struct filed
7ee0: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e  _options *option
7ef0: 73 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61  s;..struct socka
7f00: 64 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a 09 73  ddr_in6 addr;..s
7f10: 6f 63 6b 6c 65 6e 5f 74 20 61 64 64 72 6c 65 6e  ocklen_t addrlen
7f20: 3b 0a 09 69 6e 74 20 66 61 69 6c 75 72 65 5f 63  ;..int failure_c
7f30: 6f 75 6e 74 20 3d 20 30 2c 20 6d 61 78 5f 66 61  ount = 0, max_fa
7f40: 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 46 49  ilure_count = FI
7f50: 4c 45 44 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f  LED_MAX_FAILURE_
7f60: 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 63 6f 6e 6e  COUNT;..int conn
7f70: 65 63 74 69 6f 6e 5f 73 74 61 74 65 20 3d 20 46  ection_state = F
7f80: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
7f90: 43 4c 4f 53 45 3b 0a 09 69 6e 74 20 6d 61 73 74  CLOSE;..int mast
7fa0: 65 72 5f 66 64 2c 20 66 64 20 3d 20 2d 31 3b 0a  er_fd, fd = -1;.
7fb0: 0a 09 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65  ../* Read argume
7fc0: 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d 20 61 72  nts */..arg = ar
7fd0: 67 5f 76 3b 0a 0a 09 6d 61 73 74 65 72 5f 66 64  g_v;...master_fd
7fe0: 20 3d 20 61 72 67 2d 3e 66 64 3b 0a 09 6f 70 74   = arg->fd;..opt
7ff0: 69 6f 6e 73 20 3d 20 26 61 72 67 2d 3e 6f 70 74  ions = &arg->opt
8000: 69 6f 6e 73 3b 0a 0a 09 77 68 69 6c 65 20 28 31  ions;...while (1
8010: 29 20 7b 0a 09 09 2f 2a 20 46 61 69 6c 75 72 65  ) {.../* Failure
8020: 20 6c 6f 6f 70 20 70 72 65 76 65 6e 74 69 6f 6e   loop prevention
8030: 20 2a 2f 0a 09 09 69 66 20 28 66 61 69 6c 75 72   */...if (failur
8040: 65 5f 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 66 61  e_count > max_fa
8050: 69 6c 75 72 65 5f 63 6f 75 6e 74 29 20 7b 0a 09  ilure_count) {..
8060: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
8070: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
8080: 77 20 6c 6f 67 20 62 75 66 66 65 72 20 2a 2f 0a  w log buffer */.
8090: 09 09 6c 6f 67 20 3d 20 66 69 6c 65 64 5f 6c 6f  ..log = filed_lo
80a0: 67 5f 6e 65 77 28 31 29 3b 0a 09 09 69 66 20 28  g_new(1);...if (
80b0: 6c 6f 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  log == NULL) {..
80c0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
80d0: 22 41 4c 4c 4f 43 41 54 45 5f 4c 4f 47 5f 4d 53  "ALLOCATE_LOG_MS
80e0: 47 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09  G_FAILED");.....
80f0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 6c 6f  break;...}....lo
8100: 67 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45 44 5f  g->type = FILED_
8110: 4c 4f 47 5f 54 59 50 45 5f 54 52 41 4e 53 46 45  LOG_TYPE_TRANSFE
8120: 52 3b 0a 0a 09 09 2f 2a 20 49 66 20 77 65 20 63  R;..../* If we c
8130: 6c 6f 73 65 64 20 74 68 65 20 6f 6c 64 20 63 6f  losed the old co
8140: 6e 6e 65 63 74 69 6f 6e 2c 20 61 63 63 65 70 74  nnection, accept
8150: 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 09 09   a new one */...
8160: 69 66 20 28 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73  if (connection_s
8170: 74 61 74 65 20 3d 3d 20 46 49 4c 45 44 5f 43 4f  tate == FILED_CO
8180: 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 20  NNECTION_CLOSE) 
8190: 7b 0a 09 09 09 2f 2a 20 41 63 63 65 70 74 20 61  {..../* Accept a
81a0: 20 6e 65 77 20 63 6c 69 65 6e 74 20 2a 2f 0a 09   new client */..
81b0: 09 09 61 64 64 72 6c 65 6e 20 3d 20 73 69 7a 65  ..addrlen = size
81c0: 6f 66 28 61 64 64 72 29 3b 0a 0a 09 09 09 66 64  of(addr);.....fd
81d0: 20 3d 20 61 63 63 65 70 74 28 6d 61 73 74 65 72   = accept(master
81e0: 5f 66 64 2c 20 28 73 74 72 75 63 74 20 73 6f 63  _fd, (struct soc
81f0: 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72 2c 20  kaddr *) &addr, 
8200: 26 61 64 64 72 6c 65 6e 29 3b 0a 09 09 7d 0a 0a  &addrlen);...}..
8210: 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 77 65 20  ../*... * If we 
8220: 66 61 69 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74  fail, make a not
8230: 65 20 6f 66 20 69 74 20 73 6f 20 77 65 20 64 6f  e of it so we do
8240: 6e 27 74 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f  n't go into a lo
8250: 6f 70 20 6f 66 0a 09 09 20 2a 20 61 63 63 65 70  op of... * accep
8260: 74 28 29 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a  t() failing... *
8270: 2f 0a 09 09 69 66 20 28 66 64 20 3c 20 30 29 20  /...if (fd < 0) 
8280: 7b 0a 09 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20  {..../* Log the 
8290: 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  new connection *
82a0: 2f 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  /....filed_log_m
82b0: 73 67 28 22 41 43 43 45 50 54 5f 46 41 49 4c 45  sg("ACCEPT_FAILE
82c0: 44 22 29 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65  D");.....failure
82d0: 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 66 69  _count++;.....fi
82e0: 6c 65 64 5f 6c 6f 67 5f 66 72 65 65 28 6c 6f 67  led_log_free(log
82f0: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
8300: 0a 09 09 7d 0a 0a 09 09 66 69 6c 65 64 5f 73 6f  ...}....filed_so
8310: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 61 63 63 65  ckettimeout_acce
8320: 70 74 28 66 64 29 3b 0a 0a 09 09 2f 2a 20 46 69  pt(fd);..../* Fi
8330: 6c 6c 20 69 6e 20 6c 6f 67 20 73 74 72 75 63 74  ll in log struct
8340: 75 72 65 20 2a 2f 0a 09 09 69 66 20 28 66 69 6c  ure */...if (fil
8350: 65 64 5f 6c 6f 67 5f 69 70 28 28 73 74 72 75 63  ed_log_ip((struc
8360: 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61  t sockaddr *) &a
8370: 64 64 72 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73 69  ddr, log->ip, si
8380: 7a 65 6f 66 28 6c 6f 67 2d 3e 69 70 29 29 20 3d  zeof(log->ip)) =
8390: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67  = NULL) {....log
83a0: 2d 3e 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ->ip[0] = '\0';.
83b0: 09 09 09 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 30  ...log->port = 0
83c0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
83d0: 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 61 64 64 72  log->port = addr
83e0: 2e 73 69 6e 36 5f 70 6f 72 74 3b 0a 09 09 7d 0a  .sin6_port;...}.
83f0: 0a 09 09 2f 2a 20 52 65 73 65 74 20 66 61 69 6c  .../* Reset fail
8400: 75 72 65 20 63 6f 75 6e 74 2a 2f 0a 09 09 66 61  ure count*/...fa
8410: 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 3b  ilure_count = 0;
8420: 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20 73 6f  ..../* Handle so
8430: 63 6b 65 74 20 2a 2f 0a 09 09 63 6f 6e 6e 65 63  cket */...connec
8440: 74 69 6f 6e 5f 73 74 61 74 65 20 3d 20 66 69 6c  tion_state = fil
8450: 65 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74  ed_handle_client
8460: 28 66 64 2c 20 26 72 65 71 75 65 73 74 2c 20 6c  (fd, &request, l
8470: 6f 67 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a 09 7d  og, options);..}
8480: 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 65 72 72  .../* Report err
8490: 6f 72 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67  or */..filed_log
84a0: 5f 6d 73 67 28 22 54 48 52 45 41 44 5f 44 49 45  _msg("THREAD_DIE
84b0: 44 20 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09  D ABNORMAL");...
84c0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09  return(NULL);...
84d0: 2f 2a 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c  /* local_dummy_l
84e0: 6f 67 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  og is only used 
84f0: 69 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f  if FILED_DONT_LO
8500: 47 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74  G is enabled, ot
8510: 68 65 72 77 69 73 65 20 69 74 27 73 20 6e 6f 74  herwise it's not
8520: 20 75 73 65 64 2c 20 62 75 74 20 74 68 65 20 63   used, but the c
8530: 6f 6d 70 69 6c 65 72 20 68 61 74 65 73 20 74 68  ompiler hates th
8540: 61 74 20 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63  at idea. */..loc
8550: 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70  al_dummy_log.typ
8560: 65 20 3d 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75  e = 0;..local_du
8570: 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c  mmy_log.type = l
8580: 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74  ocal_dummy_log.t
8590: 79 70 65 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74  ype;.}../* Creat
85a0: 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73  e worker threads
85b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
85c0: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
85d0: 61 64 73 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c  ads_init(int fd,
85e0: 20 69 6e 74 20 74 68 72 65 61 64 5f 63 6f 75 6e   int thread_coun
85f0: 74 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  t, struct filed_
8600: 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73  options *options
8610: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
8620: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f  d_worker_thread_
8630: 61 72 67 73 20 2a 61 72 67 3b 0a 09 70 74 68 72  args *arg;..pthr
8640: 65 61 64 5f 74 20 74 68 72 65 61 64 69 64 3b 0a  ead_t threadid;.
8650: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
8660: 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20  ;..int i;...for 
8670: 28 69 20 3d 20 30 3b 20 69 20 3c 20 74 68 72 65  (i = 0; i < thre
8680: 61 64 5f 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b  ad_count; i++) {
8690: 0a 09 09 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28  ...arg = malloc(
86a0: 73 69 7a 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a  sizeof(*arg));..
86b0: 09 09 61 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a  ..arg->fd = fd;.
86c0: 09 09 6d 65 6d 63 70 79 28 26 61 72 67 2d 3e 6f  ..memcpy(&arg->o
86d0: 70 74 69 6f 6e 73 2c 20 6f 70 74 69 6f 6e 73 2c  ptions, options,
86e0: 20 73 69 7a 65 6f 66 28 2a 6f 70 74 69 6f 6e 73   sizeof(*options
86f0: 29 29 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ));....pthread_r
8700: 65 74 20 3d 20 70 74 68 72 65 61 64 5f 63 72 65  et = pthread_cre
8710: 61 74 65 28 26 74 68 72 65 61 64 69 64 2c 20 4e  ate(&threadid, N
8720: 55 4c 4c 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65  ULL, filed_worke
8730: 72 5f 74 68 72 65 61 64 2c 20 61 72 67 29 3b 0a  r_thread, arg);.
8740: 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
8750: 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  t != 0) {....ret
8760: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a  urn(-1);...}..}.
8770: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
8780: 2f 2a 20 44 69 73 70 6c 61 79 20 68 65 6c 70 20  /* Display help 
8790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
87a0: 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28  iled_print_help(
87b0: 46 49 4c 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e  FILE *output, in
87c0: 74 20 6c 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e  t long_help, con
87d0: 73 74 20 63 68 61 72 20 2a 65 78 74 72 61 29 20  st char *extra) 
87e0: 7b 0a 09 69 66 20 28 65 78 74 72 61 29 20 7b 0a  {..if (extra) {.
87f0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8800: 2c 20 22 25 73 5c 6e 22 2c 20 65 78 74 72 61 29  , "%s\n", extra)
8810: 3b 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f  ;..}...fprintf(o
8820: 75 74 70 75 74 2c 20 22 55 73 61 67 65 3a 20 66  utput, "Usage: f
8830: 69 6c 65 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d  iled [<options>]
8840: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
8850: 75 74 70 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e  utput, "  Option
8860: 73 3a 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  s:\n");..fprintf
8870: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
8880: 2d 68 2c 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a  -h, --help\n");.
8890: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
88a0: 20 22 20 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61   "      -d, --da
88b0: 65 6d 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  emon\n");..fprin
88c0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
88d0: 20 20 2d 76 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c    -v, --version\
88e0: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
88f0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 56 2c  tput, "      -V,
8900: 20 2d 2d 76 68 6f 73 74 5c 6e 22 29 3b 0a 09 66   --vhost\n");..f
8910: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
8920: 20 20 20 20 20 20 2d 62 20 3c 61 64 64 72 65 73        -b <addres
8930: 73 3e 2c 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72  s>, --bind <addr
8940: 65 73 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  ess>\n");..fprin
8950: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
8960: 20 20 2d 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70    -p <port>, --p
8970: 6f 72 74 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a  ort <port>\n");.
8980: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8990: 20 22 20 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e   "      -t <coun
89a0: 74 3e 2c 20 2d 2d 74 68 72 65 61 64 73 20 3c 63  t>, --threads <c
89b0: 6f 75 6e 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  ount>\n");..fpri
89c0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
89d0: 20 20 20 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c     -c <entries>,
89e0: 20 2d 2d 63 61 63 68 65 20 3c 65 6e 74 72 69 65   --cache <entrie
89f0: 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  s>\n");..fprintf
8a00: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
8a10: 2d 6c 20 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67  -l <file>, --log
8a20: 20 3c 66 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70   <file>\n");..fp
8a30: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
8a40: 20 20 20 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20       -u <user>, 
8a50: 2d 2d 75 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22  --user <user>\n"
8a60: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
8a70: 75 74 2c 20 22 20 20 20 20 20 20 2d 72 20 3c 64  ut, "      -r <d
8a80: 69 72 65 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f  irectory>, --roo
8a90: 74 20 3c 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22  t <directory>\n"
8aa0: 29 3b 0a 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65  );...if (long_he
8ab0: 6c 70 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  lp) {...fprintf(
8ac0: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
8ad0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8ae0: 20 22 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a   "  Usage:\n");.
8af0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8b00: 2c 20 22 20 20 20 20 20 20 2d 68 20 28 6f 72 20  , "      -h (or 
8b10: 2d 2d 68 65 6c 70 29 20 70 72 69 6e 74 73 20 74  --help) prints t
8b20: 68 69 73 20 75 73 61 67 65 20 69 6e 66 6f 72 6d  his usage inform
8b30: 61 74 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70  ation.\n");...fp
8b40: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
8b50: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
8b60: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64  utput, "      -d
8b70: 20 28 6f 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69   (or --daemon) i
8b80: 6e 73 74 72 75 63 74 73 20 66 69 6c 65 64 20 74  nstructs filed t
8b90: 6f 20 62 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f  o become a daemo
8ba0: 6e 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69  n after initiali
8bb0: 7a 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69  zing\n");...fpri
8bc0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8be0: 20 20 20 20 74 68 65 20 6c 69 73 74 65 6e 69 6e      the listenin
8bf0: 67 20 54 43 50 20 73 6f 63 6b 65 74 20 61 6e 64  g TCP socket and
8c00: 20 6c 6f 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b   log files.\n");
8c10: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
8c20: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
8c30: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
8c40: 20 20 20 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73     -v (or --vers
8c50: 69 6f 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66  ion) instructs f
8c60: 69 6c 65 64 20 70 72 69 6e 74 20 6f 75 74 20 74  iled print out t
8c70: 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
8c80: 72 20 61 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b  r and exit.\n");
8c90: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
8ca0: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
8cb0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
8cc0: 20 20 20 2d 56 20 28 6f 72 20 2d 2d 76 68 6f 73     -V (or --vhos
8cd0: 74 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c  t) instructs fil
8ce0: 65 64 20 74 6f 20 70 72 65 70 65 6e 64 20 61 6c  ed to prepend al
8cf0: 6c 20 72 65 71 75 65 73 74 73 20 77 69 74 68 20  l requests with 
8d00: 74 68 65 69 72 20 48 54 54 50 5c 6e 22 29 3b 0a  their HTTP\n");.
8d10: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8d20: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
8d30: 20 20 20 20 20 20 20 20 20 48 6f 73 74 20 68 65           Host he
8d40: 61 64 65 72 2e 5c 6e 22 29 3b 0a 09 09 66 70 72  ader.\n");...fpr
8d50: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
8d60: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
8d70: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20  tput, "      -b 
8d80: 28 6f 72 20 2d 2d 62 69 6e 64 29 20 73 70 65 63  (or --bind) spec
8d90: 69 66 69 65 73 20 74 68 65 20 61 64 64 72 65 73  ifies the addres
8da0: 73 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20  s to listen for 
8db0: 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22  incoming HTTP\n"
8dc0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
8dd0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
8de0: 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65             reque
8df0: 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66  sts on.  The def
8e00: 61 75 6c 74 20 76 61 6c 75 65 20 69 73 20 5c 22  ault value is \"
8e10: 25 73 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41  %s\".\n", BIND_A
8e20: 44 44 52 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  DDR);...fprintf(
8e30: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
8e40: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8e50: 20 22 20 20 20 20 20 20 2d 70 20 28 6f 72 20 2d   "      -p (or -
8e60: 2d 70 6f 72 74 29 20 73 70 65 63 69 66 69 65 73  -port) specifies
8e70: 20 74 68 65 20 54 43 50 20 70 6f 72 74 20 6e 75   the TCP port nu
8e80: 6d 62 65 72 20 74 6f 20 6c 69 73 74 65 6e 20 66  mber to listen f
8e90: 6f 72 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50  or incoming HTTP
8ea0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
8eb0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8ed0: 71 75 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20  quests on.  The 
8ee0: 64 65 66 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e  default is %u.\n
8ef0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
8f00: 29 20 50 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e  ) PORT);...fprin
8f10: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
8f20: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
8f30: 75 74 2c 20 22 20 20 20 20 20 20 2d 74 20 28 6f  ut, "      -t (o
8f40: 72 20 2d 2d 74 68 72 65 61 64 73 29 20 73 70 65  r --threads) spe
8f50: 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
8f60: 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65  r of worker thre
8f70: 61 64 73 20 74 6f 20 63 72 65 61 74 65 2e 20 45  ads to create. E
8f80: 61 63 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ach\n");...fprin
8f90: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 20 77 6f 72 6b 65 72 20 74 68 72 65 61      worker threa
8fc0: 64 20 63 61 6e 20 73 65 72 76 69 63 65 20 6f 6e  d can service on
8fd0: 65 20 63 6f 6e 63 75 72 72 65 6e 74 20 48 54 54  e concurrent HTT
8fe0: 50 20 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a  P session.\n");.
8ff0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9000: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9010: 20 20 20 20 20 20 20 20 20 20 20 54 68 75 73 20             Thus 
9020: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
9030: 72 65 61 64 73 20 63 72 65 61 74 65 64 20 77 69  reads created wi
9040: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  ll determine how
9050: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9060: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 6d 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f   many simultaneo
9090: 75 73 20 74 72 61 6e 73 66 65 72 73 20 77 69 6c  us transfers wil
90a0: 6c 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 20 54  l be possible. T
90b0: 68 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  he\n");...fprint
90c0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c     default is %l
90f0: 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64  u.\n", (unsigned
9100: 20 6c 6f 6e 67 29 20 54 48 52 45 41 44 5f 43 4f   long) THREAD_CO
9110: 55 4e 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  UNT);...fprintf(
9120: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
9130: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9140: 20 22 20 20 20 20 20 20 2d 63 20 28 6f 72 20 2d   "      -c (or -
9150: 2d 63 61 63 68 65 29 20 73 70 65 63 69 66 69 65  -cache) specifie
9160: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9170: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
9180: 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 5c 6e   cache entries\n
9190: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
91a0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
91c0: 61 6c 6c 6f 63 61 74 65 2e 20 20 45 61 63 68 20  allocate.  Each 
91d0: 63 61 63 68 65 20 65 6e 74 72 79 20 68 6f 6c 64  cache entry hold
91e0: 73 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  s file informati
91f0: 6f 6e 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72  on as\n");...fpr
9200: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f      well as an o
9230: 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
9240: 74 6f 72 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  tor to the file,
9250: 20 73 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22 29   so resource\n")
9260: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9270: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
9280: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74             limit
9290: 73 20 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29  s (i.e., ulimit)
92a0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69   should be consi
92b0: 64 65 72 65 64 2e 20 20 54 68 69 73 20 73 68 6f  dered.  This sho
92c0: 75 6c 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  uld\n");...fprin
92d0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d    be a prime num
9300: 62 65 72 20 66 6f 72 20 69 64 65 61 6c 20 75 73  ber for ideal us
9310: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75  e with the looku
9320: 70 20 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09  p method.\n");..
9330: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9340: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9350: 20 20 20 20 20 20 20 20 54 68 65 20 64 65 66 61          The defa
9360: 75 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20  ult is %lu.\n", 
9370: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
9380: 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66  CACHE_SIZE);...f
9390: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
93a0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
93b0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
93c0: 6c 20 28 6f 72 20 2d 2d 6c 6f 67 29 20 73 70 65  l (or --log) spe
93d0: 63 69 66 69 65 73 20 61 20 66 69 6c 65 6e 61 6d  cifies a filenam
93e0: 65 20 74 6f 20 6f 70 65 6e 20 66 6f 72 20 77 72  e to open for wr
93f0: 69 74 69 6e 67 20 6c 6f 67 20 65 6e 74 72 69 65  iting log entrie
9400: 73 2e 20 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09 66  s.  Log\n");...f
9410: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 20 20 65 6e 74 72 69 65 73 20 61 72 65 20      entries are 
9440: 6d 61 64 65 20 66 6f 72 20 76 61 72 69 6f 75 73  made for various
9450: 20 73 74 61 67 65 73 20 69 6e 20 74 72 61 6e 73   stages in trans
9460: 66 65 72 69 6e 67 20 66 69 6c 65 73 2e 5c 6e 22  fering files.\n"
9470: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9480: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
9490: 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f            The lo
94a0: 67 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  g file is opened
94b0: 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e   before switchin
94c0: 67 20 75 73 65 72 73 20 28 73 65 65 20 5c 22 2d  g users (see \"-
94d0: 75 5c 22 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69  u\")\n");...fpri
94e0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 61 6e 64 20 72 6f 6f 74 20 64 69 72 65 63 74   and root direct
9510: 6f 72 69 65 73 20 28 73 65 65 20 5c 22 2d 72 5c  ories (see \"-r\
9520: 22 29 2e 20 20 54 68 65 20 6c 6f 67 20 66 69 6c  ").  The log fil
9530: 65 20 69 73 20 6e 65 76 65 72 5c 6e 22 29 3b 0a  e is never\n");.
9540: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9550: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9560: 20 20 20 20 20 20 20 63 6c 6f 73 65 64 20 73 6f         closed so
9570: 20 6c 6f 67 20 72 6f 74 61 74 69 6f 6e 20 77 69   log rotation wi
9580: 74 68 6f 75 74 20 73 74 6f 70 70 69 6e 67 20 74  thout stopping t
9590: 68 65 20 64 61 65 6d 6f 6e 20 69 73 20 77 69 6c  he daemon is wil
95a0: 6c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  l\n");...fprintf
95b0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f                no
95d0: 74 20 77 6f 72 6b 2e 20 20 54 68 65 20 76 61 6c  t work.  The val
95e0: 75 65 20 6f 66 20 5c 22 2d 5c 22 20 69 6e 64 69  ue of \"-\" indi
95f0: 63 61 74 65 73 20 74 68 61 74 20 73 74 61 6e 64  cates that stand
9600: 61 72 64 20 6f 75 74 70 75 74 5c 6e 22 29 3b 0a  ard output\n");.
9610: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9620: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9630: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
9640: 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e   used for loggin
9650: 67 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 6e  g.  If the filen
9660: 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
9670: 61 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  a\n");...fprintf
9680: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 69                pi
96a0: 70 65 20 28 5c 22 7c 5c 22 29 20 74 68 65 6e 20  pe (\"|\") then 
96b0: 61 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 61  a process is sta
96c0: 72 74 65 64 20 61 6e 64 20 75 73 65 64 20 66 6f  rted and used fo
96d0: 72 20 6c 6f 67 67 69 6e 67 5c 6e 22 29 3b 0a 09  r logging\n");..
96e0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
96f0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9700: 20 20 20 20 20 20 69 6e 73 74 65 61 64 20 6f 66        instead of
9710: 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20 64 65   a file.  The de
9720: 66 61 75 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e  fault is \"%s\".
9730: 5c 6e 22 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a  \n", LOG_FILE);.
9740: 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e  #ifdef FILED_DON
9750: 54 5f 4c 4f 47 0a 09 09 66 70 72 69 6e 74 66 28  T_LOG...fprintf(
9760: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74               Not
9780: 65 20 74 68 61 74 20 6c 6f 67 67 69 6e 67 20 69  e that logging i
9790: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  s completely dis
97a0: 61 62 6c 65 64 20 73 6f 20 74 68 69 73 20 6f 70  abled so this op
97b0: 74 69 6f 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09  tion does\n");..
97c0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
97d0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
97e0: 20 20 20 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e        nothing in
97f0: 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29   this build.\n")
9800: 3b 0a 23 65 6e 64 69 66 0a 09 09 66 70 72 69 6e  ;.#endif...fprin
9810: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
9820: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9830: 75 74 2c 20 22 20 20 20 20 20 20 2d 75 20 28 6f  ut, "      -u (o
9840: 72 20 2d 2d 75 73 65 72 29 20 73 70 65 63 69 66  r --user) specif
9850: 69 65 73 20 74 68 65 20 75 73 65 72 20 74 6f 20  ies the user to 
9860: 73 77 69 74 63 68 20 75 73 65 72 20 49 44 73 20  switch user IDs 
9870: 74 6f 20 62 65 66 6f 72 65 20 73 65 72 76 69 63  to before servic
9880: 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ing\n");...fprin
9890: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 72 65 71 75 65 73 74 73 2e 20 20 54 68 65 20   requests.  The 
98c0: 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63  default is not c
98d0: 68 61 6e 67 65 20 75 73 65 72 20 49 44 73 2e 5c  hange user IDs.\
98e0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
98f0: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
9900: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9910: 22 20 20 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d  "      -r (or --
9920: 72 6f 6f 74 29 20 73 70 65 63 69 66 69 65 73 20  root) specifies 
9930: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
9940: 20 61 63 74 20 61 73 20 74 68 65 20 72 6f 6f 74   act as the root
9950: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e   directory for\n
9960: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
9970: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
9980: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
9990: 66 69 6c 65 20 73 65 72 76 65 72 2e 20 20 49 66  file server.  If
99a0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20   this option is 
99b0: 73 70 65 63 69 66 69 65 64 2c 20 63 68 72 6f 6f  specified, chroo
99c0: 74 28 32 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t(2)\n");...fpri
99d0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68    is called.  Th
9a00: 65 20 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74  e default is not
9a10: 20 63 68 61 6e 67 65 20 72 6f 6f 74 20 64 69 72   change root dir
9a20: 65 63 74 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09  ectories,\n");..
9a30: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9a40: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9a50: 20 20 20 20 20 20 20 74 68 61 74 20 69 73 2c 20         that is, 
9a60: 74 68 65 20 5c 22 2f 5c 22 20 64 69 72 65 63 74  the \"/\" direct
9a70: 6f 72 79 20 69 73 20 73 68 61 72 65 64 20 6f 75  ory is shared ou
9a80: 74 2e 20 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22  t.  This will\n"
9a90: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9aa0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
9ab0: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6b 65 6c             likel
9ac0: 79 20 62 65 20 61 20 73 65 63 75 72 69 74 79 20  y be a security 
9ad0: 69 73 73 75 65 2c 20 73 6f 20 74 68 69 73 20 6f  issue, so this o
9ae0: 70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ption should alw
9af0: 61 79 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ays\n");...fprin
9b00: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 62 65 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09   be used.\n");..
9b30: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
9b40: 2a 20 41 64 64 20 61 20 67 65 74 6f 70 74 20 6f  * Add a getopt o
9b50: 70 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ption */.static 
9b60: 76 6f 69 64 20 66 69 6c 65 64 5f 67 65 74 6f 70  void filed_getop
9b70: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74  t_long_setopt(st
9b80: 72 75 63 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74  ruct option *opt
9b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61  , const char *na
9ba0: 6d 65 2c 20 69 6e 74 20 68 61 73 5f 61 72 67 2c  me, int has_arg,
9bb0: 20 69 6e 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74   int val) {..opt
9bc0: 2d 3e 6e 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d  ->name     = nam
9bd0: 65 3b 0a 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67  e;..opt->has_arg
9be0: 20 20 3d 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70    = has_arg;..op
9bf0: 74 2d 3e 66 6c 61 67 20 20 20 20 20 3d 20 4e 55  t->flag     = NU
9c00: 4c 4c 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20  LL;..opt->val   
9c10: 20 20 20 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75     = val;...retu
9c20: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76  rn;.}../* Resolv
9c30: 65 20 61 20 75 73 65 72 6e 61 6d 65 20 74 6f 20  e a username to 
9c40: 61 20 55 49 44 20 2a 2f 0a 73 74 61 74 69 63 20  a UID */.static 
9c50: 69 6e 74 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c  int filed_user_l
9c60: 6f 6f 6b 75 70 28 63 6f 6e 73 74 20 63 68 61 72  ookup(const char
9c70: 20 2a 75 73 65 72 2c 20 75 69 64 5f 74 20 2a 75   *user, uid_t *u
9c80: 73 65 72 5f 69 64 29 20 7b 0a 09 63 68 61 72 20  ser_id) {..char 
9c90: 2a 6e 65 78 74 3b 0a 09 75 69 64 5f 74 20 75 73  *next;..uid_t us
9ca0: 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66  er_id_check;.#if
9cb0: 6e 64 65 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45  ndef FILED_NO_GE
9cc0: 54 50 57 4e 41 4d 0a 09 73 74 72 75 63 74 20 70  TPWNAM..struct p
9cd0: 61 73 73 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e  asswd *ent;...en
9ce0: 74 20 3d 20 67 65 74 70 77 6e 61 6d 28 75 73 65  t = getpwnam(use
9cf0: 72 29 3b 0a 09 69 66 20 28 65 6e 74 20 21 3d 20  r);..if (ent != 
9d00: 4e 55 4c 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f  NULL) {...*user_
9d10: 69 64 20 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64  id = ent->pw_uid
9d20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  ;....return(0);.
9d30: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 75 73 65 72  .}.#endif...user
9d40: 5f 69 64 5f 63 68 65 63 6b 20 3d 20 73 74 72 74  _id_check = strt
9d50: 6f 75 6c 6c 28 75 73 65 72 2c 20 26 6e 65 78 74  oull(user, &next
9d60: 2c 20 31 30 29 3b 0a 09 69 66 20 28 6e 65 78 74  , 10);..if (next
9d70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
9d80: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
9d90: 20 28 6e 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30   (next[0] != '\0
9da0: 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  ') {...return(1)
9db0: 3b 0a 09 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20  ;..}...*user_id 
9dc0: 3d 20 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b  = user_id_check;
9dd0: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
9de0: 0a 2f 2a 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f  ./* Daemonize */
9df0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
9e00: 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64  d_daemonize(void
9e10: 29 20 7b 0a 09 70 69 64 5f 74 20 73 65 74 73 69  ) {..pid_t setsi
9e20: 64 5f 72 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b  d_ret, fork_ret;
9e30: 0a 09 69 6e 74 20 63 68 64 69 72 5f 72 65 74 2c  ..int chdir_ret,
9e40: 20 64 75 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20   dup2_ret;..int 
9e50: 66 64 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a  fd_in, fd_out;..
9e60: 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64  .chdir_ret = chd
9e70: 69 72 28 22 2f 22 29 3b 0a 09 69 66 20 28 63 68  ir("/");..if (ch
9e80: 64 69 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  dir_ret != 0) {.
9e90: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
9ea0: 0a 09 66 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72  ..fork_ret = for
9eb0: 6b 28 29 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72  k();..if (fork_r
9ec0: 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
9ed0: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn(1);..}...if (
9ee0: 66 6f 72 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a  fork_ret > 0) {.
9ef0: 09 09 2f 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09  ../* Parent */..
9f00: 09 77 61 69 74 70 69 64 28 66 6f 72 6b 5f 72 65  .waitpid(fork_re
9f10: 74 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09  t, NULL, 0);....
9f20: 65 78 69 74 28 45 58 49 54 5f 53 55 43 43 45 53  exit(EXIT_SUCCES
9f30: 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c  S);..}.../* Chil
9f40: 64 20 2a 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29  d */..if (fork()
9f50: 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68   != 0) {.../* Ch
9f60: 69 6c 64 20 2a 2f 0a 09 09 65 78 69 74 28 45 58  ild */...exit(EX
9f70: 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a  IT_SUCCESS);..}.
9f80: 0a 09 2f 2a 20 47 72 61 6e 64 20 63 68 69 6c 64  ../* Grand child
9f90: 20 2a 2f 0a 09 73 65 74 73 69 64 5f 72 65 74 20   */..setsid_ret 
9fa0: 3d 20 73 65 74 73 69 64 28 29 3b 0a 09 69 66 20  = setsid();..if 
9fb0: 28 73 65 74 73 69 64 5f 72 65 74 20 3d 3d 20 28  (setsid_ret == (
9fc0: 28 70 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09  (pid_t) -1)) {..
9fd0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
9fe0: 09 66 64 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f  .fd_in = open("/
9ff0: 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f  dev/null", O_RDO
a000: 4e 4c 59 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20  NLY);..fd_out = 
a010: 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  open("/dev/null"
a020: 2c 20 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66  , O_WRONLY);..if
a030: 20 28 66 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66   (fd_in < 0 || f
a040: 64 5f 6f 75 74 20 3c 20 30 29 20 7b 0a 09 09 72  d_out < 0) {...r
a050: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64  eturn(1);..}...d
a060: 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66  up2_ret = dup2(f
a070: 64 5f 69 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45  d_in, STDIN_FILE
a080: 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72  NO);..if (dup2_r
a090: 65 74 20 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45  et != STDIN_FILE
a0a0: 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  NO) {...return(1
a0b0: 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74  );..}...dup2_ret
a0c0: 20 3d 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20   = dup2(fd_out, 
a0d0: 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a  STDOUT_FILENO);.
a0e0: 09 69 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d  .if (dup2_ret !=
a0f0: 20 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20   STDOUT_FILENO) 
a100: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
a110: 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64  }...dup2_ret = d
a120: 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 45  up2(fd_out, STDE
a130: 52 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20  RR_FILENO);..if 
a140: 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44  (dup2_ret != STD
a150: 45 52 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09  ERR_FILENO) {...
a160: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
a170: 63 6c 6f 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63  close(fd_in);..c
a180: 6c 6f 73 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09  lose(fd_out);...
a190: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
a1a0: 20 52 75 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a   Run process */.
a1b0: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
a1c0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20  c, char **argv) 
a1d0: 7b 0a 09 73 74 72 75 63 74 20 6f 70 74 69 6f 6e  {..struct option
a1e0: 20 6f 70 74 69 6f 6e 73 5b 31 32 5d 3b 0a 09 73   options[12];..s
a1f0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69  truct filed_opti
a200: 6f 6e 73 20 74 68 72 65 61 64 5f 6f 70 74 69 6f  ons thread_optio
a210: 6e 73 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ns;..const char 
a220: 2a 62 69 6e 64 5f 61 64 64 72 20 3d 20 42 49 4e  *bind_addr = BIN
a230: 44 5f 41 44 44 52 2c 20 2a 6e 65 77 72 6f 6f 74  D_ADDR, *newroot
a240: 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f 67 5f 66 69   = NULL, *log_fi
a250: 6c 65 20 3d 20 4c 4f 47 5f 46 49 4c 45 3b 0a 09  le = LOG_FILE;..
a260: 46 49 4c 45 20 2a 6c 6f 67 5f 66 70 3b 0a 09 75  FILE *log_fp;..u
a270: 69 64 5f 74 20 75 73 65 72 20 3d 20 30 3b 0a 09  id_t user = 0;..
a280: 69 6e 74 20 70 6f 72 74 20 3d 20 50 4f 52 54 2c  int port = PORT,
a290: 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20   thread_count = 
a2a0: 54 48 52 45 41 44 5f 43 4f 55 4e 54 3b 0a 09 69  THREAD_COUNT;..i
a2b0: 6e 74 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  nt cache_size = 
a2c0: 43 41 43 48 45 5f 53 49 5a 45 3b 0a 09 69 6e 74  CACHE_SIZE;..int
a2d0: 20 69 6e 69 74 5f 72 65 74 2c 20 63 68 72 6f 6f   init_ret, chroo
a2e0: 74 5f 72 65 74 2c 20 73 65 74 75 69 64 5f 72 65  t_ret, setuid_re
a2f0: 74 2c 20 6c 6f 6f 6b 75 70 5f 72 65 74 2c 20 63  t, lookup_ret, c
a300: 68 64 69 72 5f 72 65 74 3b 0a 09 69 6e 74 20 73  hdir_ret;..int s
a310: 65 74 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20  etuid_enabled = 
a320: 30 2c 20 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65  0, daemon_enable
a330: 64 20 3d 20 30 3b 0a 09 69 6e 74 20 63 68 3b 0a  d = 0;..int ch;.
a340: 09 69 6e 74 20 66 64 3b 0a 0a 09 2f 2a 20 53 65  .int fd;.../* Se
a350: 74 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  t default values
a360: 20 2a 2f 0a 09 74 68 72 65 61 64 5f 6f 70 74 69   */..thread_opti
a370: 6f 6e 73 2e 76 68 6f 73 74 73 5f 65 6e 61 62 6c  ons.vhosts_enabl
a380: 65 64 20 3d 20 30 3b 0a 0a 09 2f 2a 20 50 72 6f  ed = 0;.../* Pro
a390: 63 65 73 73 20 61 72 67 75 6d 65 6e 74 73 20 2a  cess arguments *
a3a0: 2f 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  /..filed_getopt_
a3b0: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
a3c0: 69 6f 6e 73 5b 30 5d 2c 20 22 70 6f 72 74 22 2c  ions[0], "port",
a3d0: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
a3e0: 6e 74 2c 20 27 70 27 29 3b 0a 09 66 69 6c 65 64  nt, 'p');..filed
a3f0: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
a400: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31 5d 2c  opt(&options[1],
a410: 20 22 74 68 72 65 61 64 73 22 2c 20 72 65 71 75   "threads", requ
a420: 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27  ired_argument, '
a430: 74 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  t');..filed_geto
a440: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
a450: 6f 70 74 69 6f 6e 73 5b 32 5d 2c 20 22 63 61 63  options[2], "cac
a460: 68 65 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72  he", required_ar
a470: 67 75 6d 65 6e 74 2c 20 27 63 27 29 3b 0a 09 66  gument, 'c');..f
a480: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
a490: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
a4a0: 5b 33 5d 2c 20 22 62 69 6e 64 22 2c 20 72 65 71  [3], "bind", req
a4b0: 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20  uired_argument, 
a4c0: 27 62 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'b');..filed_get
a4d0: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
a4e0: 26 6f 70 74 69 6f 6e 73 5b 34 5d 2c 20 22 75 73  &options[4], "us
a4f0: 65 72 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72  er", required_ar
a500: 67 75 6d 65 6e 74 2c 20 27 75 27 29 3b 0a 09 66  gument, 'u');..f
a510: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
a520: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
a530: 5b 35 5d 2c 20 22 72 6f 6f 74 22 2c 20 72 65 71  [5], "root", req
a540: 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20  uired_argument, 
a550: 27 72 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'r');..filed_get
a560: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
a570: 26 6f 70 74 69 6f 6e 73 5b 36 5d 2c 20 22 68 65  &options[6], "he
a580: 6c 70 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74  lp", no_argument
a590: 2c 20 27 68 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'h');..filed_g
a5a0: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
a5b0: 74 28 26 6f 70 74 69 6f 6e 73 5b 37 5d 2c 20 22  t(&options[7], "
a5c0: 64 61 65 6d 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75  daemon", no_argu
a5d0: 6d 65 6e 74 2c 20 27 64 27 29 3b 0a 09 66 69 6c  ment, 'd');..fil
a5e0: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
a5f0: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 38  etopt(&options[8
a600: 5d 2c 20 22 6c 6f 67 22 2c 20 72 65 71 75 69 72  ], "log", requir
a610: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 6c 27  ed_argument, 'l'
a620: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
a630: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
a640: 74 69 6f 6e 73 5b 39 5d 2c 20 22 76 65 72 73 69  tions[9], "versi
a650: 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74  on", no_argument
a660: 2c 20 27 76 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'v');..filed_g
a670: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
a680: 74 28 26 6f 70 74 69 6f 6e 73 5b 31 30 5d 2c 20  t(&options[10], 
a690: 22 76 68 6f 73 74 22 2c 20 6e 6f 5f 61 72 67 75  "vhost", no_argu
a6a0: 6d 65 6e 74 2c 20 27 56 27 29 3b 0a 09 66 69 6c  ment, 'V');..fil
a6b0: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
a6c0: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31  etopt(&options[1
a6d0: 31 5d 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b  1], NULL, 0, 0);
a6e0: 0a 09 77 68 69 6c 65 20 28 28 63 68 20 3d 20 67  ..while ((ch = g
a6f0: 65 74 6f 70 74 5f 6c 6f 6e 67 28 61 72 67 63 2c  etopt_long(argc,
a700: 20 61 72 67 76 2c 20 22 70 3a 74 3a 63 3a 62 3a   argv, "p:t:c:b:
a710: 75 3a 72 3a 6c 3a 68 64 76 56 22 2c 20 6f 70 74  u:r:l:hdvV", opt
a720: 69 6f 6e 73 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  ions, NULL)) != 
a730: 2d 31 29 20 7b 0a 09 09 73 77 69 74 63 68 28 63  -1) {...switch(c
a740: 68 29 20 7b 0a 09 09 09 63 61 73 65 20 27 70 27  h) {....case 'p'
a750: 3a 0a 09 09 09 09 70 6f 72 74 20 3d 20 61 74 6f  :.....port = ato
a760: 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  i(optarg);.....b
a770: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 74  reak;....case 't
a780: 27 3a 0a 09 09 09 09 74 68 72 65 61 64 5f 63 6f  ':.....thread_co
a790: 75 6e 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72  unt = atoi(optar
a7a0: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
a7b0: 09 09 63 61 73 65 20 27 63 27 3a 0a 09 09 09 09  ..case 'c':.....
a7c0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 61 74 6f  cache_size = ato
a7d0: 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  i(optarg);.....b
a7e0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 62  reak;....case 'b
a7f0: 27 3a 0a 09 09 09 09 62 69 6e 64 5f 61 64 64 72  ':.....bind_addr
a800: 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72 67   = strdup(optarg
a810: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
a820: 09 63 61 73 65 20 27 75 27 3a 0a 09 09 09 09 73  .case 'u':.....s
a830: 65 74 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20  etuid_enabled = 
a840: 31 3b 0a 09 09 09 09 6c 6f 6f 6b 75 70 5f 72 65  1;.....lookup_re
a850: 74 20 3d 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c  t = filed_user_l
a860: 6f 6f 6b 75 70 28 6f 70 74 61 72 67 2c 20 26 75  ookup(optarg, &u
a870: 73 65 72 29 3b 0a 09 09 09 09 69 66 20 28 6c 6f  ser);.....if (lo
a880: 6f 6b 75 70 5f 72 65 74 20 21 3d 20 30 29 20 7b  okup_ret != 0) {
a890: 0a 09 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e  ......filed_prin
a8a0: 74 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20 30  t_help(stderr, 0
a8b0: 2c 20 22 49 6e 76 61 6c 69 64 20 75 73 65 72 6e  , "Invalid usern
a8c0: 61 6d 65 20 73 70 65 63 69 66 69 65 64 22 29 3b  ame specified");
a8d0: 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 31 29  .......return(1)
a8e0: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  ;.....}.....brea
a8f0: 6b 3b 0a 09 09 09 63 61 73 65 20 27 72 27 3a 0a  k;....case 'r':.
a900: 09 09 09 09 6e 65 77 72 6f 6f 74 20 3d 20 73 74  ....newroot = st
a910: 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09  rdup(optarg);...
a920: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
a930: 20 27 6c 27 3a 0a 09 09 09 09 6c 6f 67 5f 66 69   'l':.....log_fi
a940: 6c 65 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61  le = strdup(opta
a950: 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  rg);.....break;.
a960: 09 09 09 63 61 73 65 20 27 64 27 3a 0a 09 09 09  ...case 'd':....
a970: 09 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20  .daemon_enabled 
a980: 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  = 1;.....break;.
a990: 09 09 09 63 61 73 65 20 27 56 27 3a 0a 09 09 09  ...case 'V':....
a9a0: 09 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73 2e  .thread_options.
a9b0: 76 68 6f 73 74 73 5f 65 6e 61 62 6c 65 64 20 3d  vhosts_enabled =
a9c0: 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a   1;......break;.
a9d0: 09 09 09 63 61 73 65 20 27 76 27 3a 0a 09 09 09  ...case 'v':....
a9e0: 09 70 72 69 6e 74 66 28 22 66 69 6c 65 64 20 76  .printf("filed v
a9f0: 65 72 73 69 6f 6e 20 25 73 5c 6e 22 2c 20 46 49  ersion %s\n", FI
aa00: 4c 45 44 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09  LED_VERSION);...
aa10: 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09  ...return(0);...
aa20: 09 63 61 73 65 20 27 3f 27 3a 0a 09 09 09 63 61  .case '?':....ca
aa30: 73 65 20 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65  se ':':.....file
aa40: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64  d_print_help(std
aa50: 65 72 72 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  err, 0, NULL);..
aa60: 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
aa70: 09 09 63 61 73 65 20 27 68 27 3a 0a 09 09 09 09  ..case 'h':.....
aa80: 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70  filed_print_help
aa90: 28 73 74 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c  (stdout, 1, NULL
aaa0: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 30  );......return(0
aab0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f  );...}..}.../* O
aac0: 70 65 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  pen log file */.
aad0: 09 6c 6f 67 5f 66 70 20 3d 20 66 69 6c 65 64 5f  .log_fp = filed_
aae0: 6c 6f 67 5f 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c  log_open(log_fil
aaf0: 65 29 3b 0a 09 69 66 20 28 6c 6f 67 5f 66 70 20  e);..if (log_fp 
ab00: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 65 72  == NULL) {...per
ab10: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f  ror("filed_log_o
ab20: 70 65 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  pen");....return
ab30: 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65  (4);..}.../* Cre
ab40: 61 74 65 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f  ate listening so
ab50: 63 6b 65 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69  cket */..fd = fi
ab60: 6c 65 64 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f  led_listen(bind_
ab70: 61 64 64 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66  addr, port);..if
ab80: 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 70 65   (fd < 0) {...pe
ab90: 72 72 6f 72 28 22 66 69 6c 65 64 5f 6c 69 73 74  rror("filed_list
aba0: 65 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  en");....return(
abb0: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74  1);..}.../* Init
abc0: 69 61 6c 69 7a 65 20 74 69 6d 65 6f 75 74 20 73  ialize timeout s
abd0: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 09 69 6e  tructures */..in
abe0: 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 73  it_ret = filed_s
abf0: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69 6e 69  ockettimeout_ini
ac00: 74 28 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  t();..if (init_r
ac10: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
ac20: 72 6f 72 28 22 66 69 6c 65 64 5f 73 6f 63 6b 65  ror("filed_socke
ac30: 74 74 69 6d 65 6f 75 74 5f 69 6e 69 74 22 29 3b  ttimeout_init");
ac40: 0a 0a 09 09 72 65 74 75 72 6e 28 38 29 3b 0a 09  ....return(8);..
ac50: 7d 0a 0a 09 2f 2a 20 42 65 63 6f 6d 65 20 61 20  }.../* Become a 
ac60: 64 61 65 6d 6f 6e 20 2a 2f 0a 09 69 66 20 28 64  daemon */..if (d
ac70: 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 29 20 7b  aemon_enabled) {
ac80: 0a 09 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69  ...init_ret = fi
ac90: 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 29 3b  led_daemonize();
aca0: 0a 09 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20  ...if (init_ret 
acb0: 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f  != 0) {....perro
acc0: 72 28 22 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69  r("filed_daemoni
acd0: 7a 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ze");.....return
ace0: 28 36 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a  (6);...}..}.../*
acf0: 20 43 68 72 6f 6f 74 2c 20 69 66 20 61 70 70 72   Chroot, if appr
ad00: 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66 20 28  opriate */..if (
ad10: 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09 63 68 64  newroot) {...chd
ad20: 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72 28 6e  ir_ret = chdir(n
ad30: 65 77 72 6f 6f 74 29 3b 0a 09 09 69 66 20 28 63  ewroot);...if (c
ad40: 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29 20 7b  hdir_ret != 0) {
ad50: 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68 64 69  ....perror("chdi
ad60: 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  r");.....return(
ad70: 31 29 3b 0a 09 09 7d 0a 0a 09 09 63 68 72 6f 6f  1);...}....chroo
ad80: 74 5f 72 65 74 20 3d 20 63 68 72 6f 6f 74 28 22  t_ret = chroot("
ad90: 2e 22 29 3b 0a 09 09 69 66 20 28 63 68 72 6f 6f  .");...if (chroo
ada0: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
adb0: 09 70 65 72 72 6f 72 28 22 63 68 72 6f 6f 74 22  .perror("chroot"
adc0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 31 29  );.....return(1)
add0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 72  ;...}..}.../* Dr
ade0: 6f 70 20 70 72 69 76 69 6c 65 67 65 73 2c 20 69  op privileges, i
adf0: 66 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  f appropriate */
ae00: 0a 09 69 66 20 28 73 65 74 75 69 64 5f 65 6e 61  ..if (setuid_ena
ae10: 62 6c 65 64 29 20 7b 0a 09 09 73 65 74 75 69 64  bled) {...setuid
ae20: 5f 72 65 74 20 3d 20 73 65 74 75 69 64 28 75 73  _ret = setuid(us
ae30: 65 72 29 3b 0a 09 09 69 66 20 28 73 65 74 75 69  er);...if (setui
ae40: 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  d_ret != 0) {...
ae50: 09 70 65 72 72 6f 72 28 22 73 65 74 75 69 64 22  .perror("setuid"
ae60: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 31 29  );.....return(1)
ae70: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 49 6e  ;...}..}.../* In
ae80: 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 09 69 6e 69  itialize */..ini
ae90: 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 69 6e  t_ret = filed_in
aea0: 69 74 28 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  it(cache_size);.
aeb0: 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d  .if (init_ret !=
aec0: 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22   0) {...perror("
aed0: 66 69 6c 65 64 5f 69 6e 69 74 22 29 3b 0a 0a 09  filed_init");...
aee0: 09 72 65 74 75 72 6e 28 33 29 3b 0a 09 7d 0a 0a  .return(3);..}..
aef0: 09 2f 2a 20 43 72 65 61 74 65 20 6c 6f 67 67 69  ./* Create loggi
af00: 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a 09 69 6e  ng thread */..in
af10: 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 6c  it_ret = filed_l
af20: 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e  ogging_thread_in
af30: 69 74 28 6c 6f 67 5f 66 70 29 3b 0a 09 69 66 20  it(log_fp);..if 
af40: 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  (init_ret != 0) 
af50: 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65  {...perror("file
af60: 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64  d_logging_thread
af70: 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75  _init");....retu
af80: 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  rn(4);..}.../* C
af90: 72 65 61 74 65 20 73 6f 63 6b 65 74 20 74 65 72  reate socket ter
afa0: 6d 69 6e 61 74 69 6f 6e 20 74 68 72 65 61 64 20  mination thread 
afb0: 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66  */..init_ret = f
afc0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
afd0: 75 74 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 29  ut_thread_init()
afe0: 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20  ;..if (init_ret 
aff0: 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72  != 0) {...perror
b000: 28 22 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  ("filed_socketti
b010: 6d 65 6f 75 74 5f 74 68 72 65 61 64 5f 69 6e 69  meout_thread_ini
b020: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 37  t");....return(7
b030: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74  );..}.../* Creat
b040: 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73  e worker threads
b050: 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20   */..init_ret = 
b060: 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72  filed_worker_thr
b070: 65 61 64 73 5f 69 6e 69 74 28 66 64 2c 20 74 68  eads_init(fd, th
b080: 72 65 61 64 5f 63 6f 75 6e 74 2c 20 26 74 68 72  read_count, &thr
b090: 65 61 64 5f 6f 70 74 69 6f 6e 73 29 3b 0a 09 69  ead_options);..i
b0a0: 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30  f (init_ret != 0
b0b0: 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69  ) {...perror("fi
b0c0: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
b0d0: 64 73 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65  ds_init");....re
b0e0: 74 75 72 6e 28 35 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(5);..}.../*
b0f0: 20 57 61 69 74 20 66 6f 72 20 74 68 72 65 61 64   Wait for thread
b100: 73 20 74 6f 20 65 78 69 74 20 2a 2f 0a 09 2f 2a  s to exit */../*
b110: 20 58 58 58 3a 54 4f 44 4f 3a 20 4d 6f 6e 69 74   XXX:TODO: Monit
b120: 6f 72 20 74 68 72 65 61 64 20 75 73 61 67 65 20  or thread usage 
b130: 2a 2f 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  */..while (1) {.
b140: 09 09 73 6c 65 65 70 28 36 30 29 3b 0a 09 7d 0a  ..sleep(60);..}.
b150: 0a 09 2f 2a 20 52 65 74 75 72 6e 20 69 6e 20 66  ../* Return in f
b160: 61 69 6c 75 72 65 20 2a 2f 0a 09 72 65 74 75 72  ailure */..retur
b170: 6e 28 32 29 3b 0a 7d 0a                          n(2);.}.