Hex Artifact Content

Artifact 07cd3525936a0606cd7a6e7754eb1cf4b1d20cef:


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 64 65 66 69 6e 65 20 46 49 4c 45 44  .#  define FILED
0860: 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 20 31 0a  _DONT_TIMEOUT 1.
0870: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
0880: 65 73 65 20 68 65 61 64 65 72 73 20 61 72 65 20  ese headers are 
0890: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 66 6f  only required fo
08a0: 72 20 54 49 4d 45 4f 55 54 20 73 75 70 70 6f 72  r TIMEOUT suppor
08b0: 74 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 46 49  t. */.#ifndef FI
08c0: 4c 45 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54  LED_DONT_TIMEOUT
08d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 74  .#include <stdat
08e0: 6f 6d 69 63 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  omic.h>.#include
08f0: 20 3c 73 74 64 62 6f 6f 6c 2e 68 3e 0a 23 65 6e   <stdbool.h>.#en
0900: 64 69 66 0a 0a 2f 2a 20 43 6f 6d 70 69 6c 65 20  dif../* Compile 
0910: 74 69 6d 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a  time constants *
0920: 2f 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f  /.#define FILED_
0930: 56 45 52 53 49 4f 4e 20 22 31 2e 31 37 22 0a 23  VERSION "1.17".#
0940: 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 53 45 4e  define FILED_SEN
0950: 44 46 49 4c 45 5f 4d 41 58 20 31 36 37 37 37 32  DFILE_MAX 167772
0960: 31 35 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44  15.#define FILED
0970: 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43 4f 55  _MAX_FAILURE_COU
0980: 4e 54 20 33 30 0a 23 64 65 66 69 6e 65 20 46 49  NT 30.#define FI
0990: 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45  LED_DEFAULT_TYPE
09a0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63   "application/oc
09b0: 74 65 74 2d 73 74 72 65 61 6d 22 0a 23 64 65 66  tet-stream".#def
09c0: 69 6e 65 20 46 49 4c 45 44 5f 50 41 54 48 5f 42  ine FILED_PATH_B
09d0: 55 46 46 45 52 5f 53 49 5a 45 20 31 30 31 30 0a  UFFER_SIZE 1010.
09e0: 0a 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  ./* Default valu
09f0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f  es */.#define PO
0a00: 52 54 20 38 30 0a 23 64 65 66 69 6e 65 20 54 48  RT 80.#define TH
0a10: 52 45 41 44 5f 43 4f 55 4e 54 20 35 0a 23 64 65  READ_COUNT 5.#de
0a20: 66 69 6e 65 20 42 49 4e 44 5f 41 44 44 52 20 22  fine BIND_ADDR "
0a30: 3a 3a 22 0a 23 64 65 66 69 6e 65 20 43 41 43 48  ::".#define CACH
0a40: 45 5f 53 49 5a 45 20 38 32 30 39 0a 23 64 65 66  E_SIZE 8209.#def
0a50: 69 6e 65 20 4c 4f 47 5f 46 49 4c 45 20 22 2d 22  ine LOG_FILE "-"
0a60: 0a 0a 2f 2a 20 46 75 7a 7a 69 6e 67 20 54 65 73  ../* Fuzzing Tes
0a70: 74 20 43 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66  t Code */.#ifdef
0a80: 20 46 49 4c 45 44 5f 54 45 53 54 5f 41 46 4c 0a   FILED_TEST_AFL.
0a90: 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44 4f  #define FILED_DO
0aa0: 4e 54 5f 4c 4f 47 20 31 0a 23 64 65 66 69 6e 65  NT_LOG 1.#define
0ab0: 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 54 49 4d 45   FILED_DONT_TIME
0ac0: 4f 55 54 20 31 0a 23 64 65 66 69 6e 65 20 70 74  OUT 1.#define pt
0ad0: 68 72 65 61 64 5f 63 72 65 61 74 65 28 61 2c 20  hread_create(a, 
0ae0: 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f 70 74 68  x, y, z) afl_pth
0af0: 72 65 61 64 5f 63 72 65 61 74 65 28 61 2c 20 78  read_create(a, x
0b00: 2c 20 79 2c 20 7a 29 0a 23 64 65 66 69 6e 65 20  , y, z).#define 
0b10: 62 69 6e 64 28 78 2c 20 79 2c 20 7a 29 20 61 66  bind(x, y, z) af
0b20: 6c 5f 62 69 6e 64 28 78 2c 20 79 2c 20 7a 29 0a  l_bind(x, y, z).
0b30: 23 64 65 66 69 6e 65 20 73 6f 63 6b 65 74 28 78  #define socket(x
0b40: 2c 20 79 2c 20 7a 29 20 38 31 39 33 0a 23 64 65  , y, z) 8193.#de
0b50: 66 69 6e 65 20 6c 69 73 74 65 6e 28 78 2c 20 79  fine listen(x, y
0b60: 29 20 30 0a 23 64 65 66 69 6e 65 20 61 63 63 65  ) 0.#define acce
0b70: 70 74 28 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f  pt(x, y, z) afl_
0b80: 61 63 63 65 70 74 28 78 2c 20 79 2c 20 7a 29 0a  accept(x, y, z).
0b90: 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 28 78 29  #define close(x)
0ba0: 20 7b 20 69 66 20 28 73 74 72 63 6d 70 28 23 78   { if (strcmp(#x
0bb0: 2c 20 22 72 61 6e 64 6f 6d 5f 66 64 22 29 20 3d  , "random_fd") =
0bc0: 3d 20 30 29 20 7b 20 63 6c 6f 73 65 28 78 29 3b  = 0) { close(x);
0bd0: 20 7d 20 65 6c 73 65 20 7b 20 65 78 69 74 28 30   } else { exit(0
0be0: 29 3b 20 7d 20 7d 0a 23 64 65 66 69 6e 65 20 66  ); } }.#define f
0bf0: 63 6c 6f 73 65 28 78 29 20 65 78 69 74 28 30 29  close(x) exit(0)
0c00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 6c  ..static int afl
0c10: 5f 61 63 63 65 70 74 28 69 6e 74 20 78 2c 20 76  _accept(int x, v
0c20: 6f 69 64 20 2a 61 64 64 72 2c 20 76 6f 69 64 20  oid *addr, void 
0c30: 2a 7a 29 20 7b 0a 09 28 28 73 74 72 75 63 74 20  *z) {..((struct 
0c40: 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29 20  sockaddr_in6 *) 
0c50: 61 64 64 72 29 2d 3e 73 69 6e 36 5f 66 61 6d 69  addr)->sin6_fami
0c60: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 20 2b 20 41  ly = AF_INET + A
0c70: 46 5f 49 4e 45 54 36 20 2b 20 31 3b 0a 09 72 65  F_INET6 + 1;..re
0c80: 74 75 72 6e 28 53 54 44 49 4e 5f 46 49 4c 45 4e  turn(STDIN_FILEN
0c90: 4f 29 3b 0a 09 78 20 3d 20 78 3b 0a 09 7a 20 3d  O);..x = x;..z =
0ca0: 20 7a 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   z;.}..static in
0cb0: 74 20 61 66 6c 5f 62 69 6e 64 28 69 6e 74 20 78  t afl_bind(int x
0cc0: 2c 20 76 6f 69 64 20 2a 79 2c 20 73 6f 63 6b 6c  , void *y, sockl
0cd0: 65 6e 5f 74 20 7a 29 20 7b 0a 09 72 65 74 75 72  en_t z) {..retur
0ce0: 6e 28 38 31 39 34 29 3b 0a 09 78 20 3d 20 78 3b  n(8194);..x = x;
0cf0: 0a 09 79 20 3d 20 79 3b 0a 09 7a 20 3d 20 7a 3b  ..y = y;..z = z;
0d00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
0d10: 66 6c 5f 70 74 68 72 65 61 64 5f 63 72 65 61 74  fl_pthread_creat
0d20: 65 28 70 74 68 72 65 61 64 5f 74 20 2a 74 68 72  e(pthread_t *thr
0d30: 65 61 64 2c 20 63 6f 6e 73 74 20 70 74 68 72 65  ead, const pthre
0d40: 61 64 5f 61 74 74 72 5f 74 20 2a 61 74 74 72 2c  ad_attr_t *attr,
0d50: 20 76 6f 69 64 20 2a 28 2a 73 74 61 72 74 5f 72   void *(*start_r
0d60: 6f 75 74 69 6e 65 29 20 28 76 6f 69 64 20 2a 29  outine) (void *)
0d70: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 09  , void *arg) {..
0d80: 73 74 61 72 74 5f 72 6f 75 74 69 6e 65 28 61 72  start_routine(ar
0d90: 67 29 3b 0a 09 65 78 69 74 28 33 29 3b 0a 09 74  g);..exit(3);..t
0da0: 68 72 65 61 64 20 3d 20 74 68 72 65 61 64 3b 0a  hread = thread;.
0db0: 09 61 74 74 72 20 3d 20 61 74 74 72 3b 0a 7d 0a  .attr = attr;.}.
0dc0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 43 6f 6e 66 69  #endif../* Confi
0dd0: 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
0de0: 20 74 68 61 74 20 77 6f 72 6b 20 74 68 72 65 61   that work threa
0df0: 64 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 77  ds need to be aw
0e00: 61 72 65 20 6f 66 20 2a 2f 0a 73 74 72 75 63 74  are of */.struct
0e10: 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 7b   filed_options {
0e20: 0a 09 69 6e 74 20 76 68 6f 73 74 73 5f 65 6e 61  ..int vhosts_ena
0e30: 62 6c 65 64 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67  bled;.};../* Arg
0e40: 75 6d 65 6e 74 73 20 66 6f 72 20 77 6f 72 6b 65  uments for worke
0e50: 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72  r threads */.str
0e60: 75 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  uct filed_worker
0e70: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 7b 0a 09  _thread_args {..
0e80: 69 6e 74 20 66 64 3b 0a 09 73 74 72 75 63 74 20  int fd;..struct 
0e90: 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 6f 70  filed_options op
0ea0: 74 69 6f 6e 73 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72  tions;.};../* Ar
0eb0: 67 75 6d 65 6e 74 73 20 66 6f 72 20 6c 6f 67 67  guments for logg
0ec0: 69 6e 67 20 74 68 72 65 61 64 73 20 2a 2f 0a 73  ing threads */.s
0ed0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67  truct filed_logg
0ee0: 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ing_thread_args 
0ef0: 7b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 7d 3b 0a  {..FILE *fp;.};.
0f00: 0a 2f 2a 20 46 69 6c 65 20 69 6e 66 6f 72 6d 61  ./* File informa
0f10: 74 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 66  tion */.struct f
0f20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 7b 0a  iled_fileinfo {.
0f30: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
0f40: 20 6d 75 74 65 78 3b 0a 09 63 68 61 72 20 70 61   mutex;..char pa
0f50: 74 68 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55  th[FILED_PATH_BU
0f60: 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 69 6e 74  FFER_SIZE];..int
0f70: 20 66 64 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e 3b   fd;..off_t len;
0f80: 0a 09 63 68 61 72 20 2a 6c 61 73 74 6d 6f 64 3b  ..char *lastmod;
0f90: 0a 09 63 68 61 72 20 6c 61 73 74 6d 6f 64 5f 62  ..char lastmod_b
0fa0: 5b 36 34 5d 3b 0a 09 63 6f 6e 73 74 20 63 68 61  [64];..const cha
0fb0: 72 20 2a 74 79 70 65 3b 0a 09 63 68 61 72 20 65  r *type;..char e
0fc0: 74 61 67 5b 36 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 20  tag[64];.};../* 
0fd0: 52 65 71 75 65 73 74 20 76 61 72 69 61 62 6c 65  Request variable
0fe0: 73 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65  s */.struct file
0ff0: 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 7b  d_http_request {
1000: 0a 09 2f 2a 2a 20 42 75 66 66 65 72 73 20 2a 2a  ../** Buffers **
1010: 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  /..struct filed_
1020: 66 69 6c 65 69 6e 66 6f 20 66 69 6c 65 69 6e 66  fileinfo fileinf
1030: 6f 3b 0a 09 63 68 61 72 20 74 6d 70 62 75 66 5b  o;..char tmpbuf[
1040: 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45  FILED_PATH_BUFFE
1050: 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 2a 20 48  R_SIZE];.../** H
1060: 54 54 50 20 52 65 71 75 65 73 74 20 69 6e 66 6f  TTP Request info
1070: 72 6d 61 74 69 6f 6e 20 2a 2a 2f 0a 09 2f 2a 2a  rmation **/../**
1080: 2a 20 54 79 70 65 20 6f 66 20 72 65 71 75 65 73  * Type of reques
1090: 74 20 28 48 45 41 44 20 6f 72 20 47 45 54 29 20  t (HEAD or GET) 
10a0: 2a 2a 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46  ***/..enum {...F
10b0: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54  ILED_REQUEST_MET
10c0: 48 4f 44 5f 47 45 54 2c 0a 09 09 46 49 4c 45 44  HOD_GET,...FILED
10d0: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
10e0: 48 45 41 44 0a 09 7d 20 6d 65 74 68 6f 64 3b 0a  HEAD..} method;.
10f0: 0a 09 2f 2a 2a 2a 20 50 61 74 68 20 62 65 69 6e  ../*** Path bein
1100: 67 20 72 65 71 75 65 73 74 65 64 20 2a 2a 2a 2f  g requested ***/
1110: 0a 09 63 68 61 72 20 70 61 74 68 5b 46 49 4c 45  ..char path[FILE
1120: 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49  D_PATH_BUFFER_SI
1130: 5a 45 5d 3b 20 0a 0a 09 2f 2a 2a 2a 20 50 61 74  ZE]; .../*** Pat
1140: 68 20 74 79 70 65 20 2a 2a 2a 2f 0a 09 65 6e 75  h type ***/..enu
1150: 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 52 45 51 55  m {...FILED_REQU
1160: 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f  EST_TYPE_DIRECTO
1170: 52 59 2c 0a 09 09 46 49 4c 45 44 5f 52 45 51 55  RY,...FILED_REQU
1180: 45 53 54 5f 54 59 50 45 5f 4f 54 48 45 52 0a 09  EST_TYPE_OTHER..
1190: 7d 20 74 79 70 65 3b 0a 0a 09 73 74 72 75 63 74  } type;...struct
11a0: 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09   {...struct {...
11b0: 09 69 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09  .int present;...
11c0: 09 6f 66 66 5f 74 20 6f 66 66 73 65 74 3b 20 20  .off_t offset;  
11d0: 20 2f 2a 2a 2a 20 52 61 6e 67 65 20 73 74 61 72   /*** Range star
11e0: 74 20 2a 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20  t ***/....off_t 
11f0: 6c 65 6e 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52  length;   /*** R
1200: 61 6e 67 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f  ange length ***/
1210: 0a 09 09 7d 20 72 61 6e 67 65 3b 0a 0a 09 09 73  ...} range;....s
1220: 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 70  truct {....int p
1230: 72 65 73 65 6e 74 3b 0a 09 09 09 63 68 61 72 20  resent;....char 
1240: 68 6f 73 74 5b 46 49 4c 45 44 5f 50 41 54 48 5f  host[FILED_PATH_
1250: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 09  BUFFER_SIZE];...
1260: 7d 20 68 6f 73 74 3b 0a 0a 09 09 65 6e 75 6d 20  } host;....enum 
1270: 7b 0a 09 09 09 46 49 4c 45 44 5f 43 4f 4e 4e 45  {....FILED_CONNE
1280: 43 54 49 4f 4e 5f 43 4c 4f 53 45 2c 0a 09 09 09  CTION_CLOSE,....
1290: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
12a0: 5f 4b 45 45 50 5f 41 4c 49 56 45 0a 09 09 7d 20  _KEEP_ALIVE...} 
12b0: 63 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 09 7d 20 68  connection;..} h
12c0: 65 61 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c  eaders;.};../* L
12d0: 6f 67 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72  og record */.str
12e0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
12f0: 74 72 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20 6f  try {../* Type o
1300: 66 20 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a 09  f log entry */..
1310: 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 4c  enum {...FILED_L
1320: 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 2c  OG_TYPE_MESSAGE,
1330: 0a 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50  ...FILED_LOG_TYP
1340: 45 5f 54 52 41 4e 53 46 45 52 0a 09 7d 20 74 79  E_TRANSFER..} ty
1350: 70 65 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64 20  pe;.../* Linked 
1360: 6c 69 73 74 20 68 65 61 64 2f 74 61 69 6c 20 2a  list head/tail *
1370: 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  /..struct filed_
1380: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78 74  log_entry *_next
1390: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
13a0: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65 76  log_entry *_prev
13b0: 3b 0a 0a 09 2f 2a 20 54 68 72 65 61 64 20 66 72  ;.../* Thread fr
13c0: 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 6c 6f  om which this lo
13d0: 67 20 65 6e 74 72 79 20 65 6d 69 6e 61 74 65 73  g entry eminates
13e0: 20 2a 2f 0a 09 70 74 68 72 65 61 64 5f 74 20 74   */..pthread_t t
13f0: 68 72 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73 73  hread;.../* Mess
1400: 61 67 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  age buffer for t
1410: 79 70 65 20 3d 20 4d 45 53 53 41 47 45 20 2a 2f  ype = MESSAGE */
1420: 0a 09 2f 2a 20 50 61 74 68 20 62 75 66 66 65 72  ../* Path buffer
1430: 20 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e   for type = TRAN
1440: 53 46 45 52 20 2a 2f 0a 09 63 68 61 72 20 62 75  SFER */..char bu
1450: 66 66 65 72 5b 46 49 4c 45 44 5f 50 41 54 48 5f  ffer[FILED_PATH_
1460: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09  BUFFER_SIZE];...
1470: 2f 2a 20 49 74 65 6d 73 20 66 6f 72 20 74 79 70  /* Items for typ
1480: 65 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a  e = TRANSFER */.
1490: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
14a0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61  .const char *rea
14b0: 73 6f 6e 3b 0a 09 74 69 6d 65 5f 74 20 73 74 61  son;..time_t sta
14c0: 72 74 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74 20  rttime;..time_t 
14d0: 65 6e 64 74 69 6d 65 3b 0a 09 6f 66 66 5f 74 20  endtime;..off_t 
14e0: 72 65 71 5f 6f 66 66 73 65 74 3b 0a 09 6f 66 66  req_offset;..off
14f0: 5f 74 20 72 65 71 5f 6c 65 6e 67 74 68 3b 0a 09  _t req_length;..
1500: 6f 66 66 5f 74 20 73 65 6e 74 5f 6c 65 6e 67 74  off_t sent_lengt
1510: 68 3b 0a 09 6f 66 66 5f 74 20 66 69 6c 65 5f 6c  h;..off_t file_l
1520: 65 6e 67 74 68 3b 0a 09 63 68 61 72 20 69 70 5b  ength;..char ip[
1530: 31 32 38 5d 3b 0a 09 69 6e 74 20 70 6f 72 74 3b  128];..int port;
1540: 0a 09 69 6e 74 20 6d 65 74 68 6f 64 3b 0a 7d 3b  ..int method;.};
1550: 0a 0a 2f 2a 20 47 6c 6f 62 61 6c 20 76 61 72 69  ../* Global vari
1560: 61 62 6c 65 73 20 2a 2f 0a 2f 2a 2a 20 4f 70 65  ables */./** Ope
1570: 6e 20 46 69 6c 65 20 63 61 63 68 65 20 2a 2a 2f  n File cache **/
1580: 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69  .struct filed_fi
1590: 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 66 69  leinfo *filed_fi
15a0: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d  leinfo_fdcache =
15b0: 20 4e 55 4c 4c 3b 0a 75 6e 73 69 67 6e 65 64 20   NULL;.unsigned 
15c0: 69 6e 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  int filed_filein
15d0: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20  fo_fdcache_size 
15e0: 3d 20 30 3b 0a 0a 2f 2a 2a 20 4c 6f 67 67 69 6e  = 0;../** Loggin
15f0: 67 20 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  g **/.struct fil
1600: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66 69  ed_log_entry *fi
1610: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
1620: 3b 0a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ;.pthread_mutex_
1630: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  t filed_log_msg_
1640: 6c 69 73 74 5f 6d 75 74 65 78 3b 0a 70 74 68 72  list_mutex;.pthr
1650: 65 61 64 5f 63 6f 6e 64 5f 74 20 66 69 6c 65 64  ead_cond_t filed
1660: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65  _log_msg_list_re
1670: 61 64 79 3b 0a 0a 2f 2a 20 53 69 67 6e 61 6c 20  ady;../* Signal 
1680: 48 61 6e 64 6c 65 72 20 2a 2f 0a 73 74 61 74 69  Handler */.stati
1690: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 69 67  c void filed_sig
16a0: 6e 61 6c 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  nal_handler(int 
16b0: 73 69 67 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b  signal_number) {
16c0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66  ..struct filed_f
16d0: 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b 0a  ileinfo *cache;.
16e0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64  .unsigned int id
16f0: 78 3b 0a 0a 09 73 77 69 74 63 68 20 28 73 69 67  x;...switch (sig
1700: 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 09  nal_number) {...
1710: 63 61 73 65 20 53 49 47 48 55 50 3a 0a 09 09 09  case SIGHUP:....
1720: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1730: 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  x < filed_filein
1740: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 3b  fo_fdcache_size;
1750: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 61   idx++) {.....ca
1760: 63 68 65 20 3d 20 26 66 69 6c 65 64 5f 66 69 6c  che = &filed_fil
1770: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64  einfo_fdcache[id
1780: 78 5d 3b 0a 0a 09 09 09 09 70 74 68 72 65 61 64  x];......pthread
1790: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63  _mutex_lock(&cac
17a0: 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 09  he->mutex);.....
17b0: 09 63 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20  .cache->path[0] 
17c0: 3d 20 27 5c 30 27 3b 0a 09 09 09 09 69 66 20 28  = '\0';.....if (
17d0: 63 61 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20  cache->fd >= 0) 
17e0: 7b 0a 09 09 09 09 09 63 6c 6f 73 65 28 63 61 63  {......close(cac
17f0: 68 65 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 09 63  he->fd);.......c
1800: 61 63 68 65 2d 3e 66 64 20 3d 20 2d 31 3b 0a 09  ache->fd = -1;..
1810: 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 68 65 2d  ...}......cache-
1820: 3e 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09  >lastmod = "";..
1830: 09 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d  ...cache->type =
1840: 20 22 22 3b 0a 0a 09 09 09 09 70 74 68 72 65 61   "";......pthrea
1850: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
1860: 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 09  cache->mutex);..
1870: 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  ..}....break;..}
1880: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
1890: 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68   Initialize cach
18a0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
18b0: 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65  filed_init_cache
18c0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  (unsigned int ca
18d0: 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e 73  che_size) {..uns
18e0: 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 09  igned int idx;..
18f0: 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
1900: 65 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20 6d  et;.../* Cache m
1910: 61 79 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e 69  ay not be re-ini
1920: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66 20  tialized */..if 
1930: 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  (filed_fileinfo_
1940: 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20  fdcache_size != 
1950: 30 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65 69  0 || filed_filei
1960: 6e 66 6f 5f 66 64 63 61 63 68 65 20 21 3d 20 4e  nfo_fdcache != N
1970: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1980: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f  1);..}.../* Allo
1990: 63 61 74 65 20 63 61 63 68 65 20 2a 2f 0a 09 66  cate cache */..f
19a0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
19b0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 63 61 63  cache_size = cac
19c0: 68 65 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64 5f  he_size;..filed_
19d0: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
19e0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
19f0: 28 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  (*filed_fileinfo
1a00: 5f 66 64 63 61 63 68 65 29 20 2a 20 66 69 6c 65  _fdcache) * file
1a10: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
1a20: 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 66  he_size);..if (f
1a30: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1a40: 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  cache == NULL) {
1a50: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
1a60: 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .../* Initialize
1a70: 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 20 2a   cache entries *
1a80: 2f 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  /..for (idx = 0;
1a90: 20 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c   idx < filed_fil
1aa0: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69  einfo_fdcache_si
1ab0: 7a 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d  ze; idx++) {...m
1ac0: 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20  utex_init_ret = 
1ad0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
1ae0: 69 74 28 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e  it(&filed_filein
1af0: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
1b00: 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09  mutex, NULL);...
1b10: 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72  if (mutex_init_r
1b20: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65  et != 0) {....re
1b30: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09  turn(1);...}....
1b40: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
1b50: 64 63 61 63 68 65 5b 69 64 78 5d 2e 70 61 74 68  dcache[idx].path
1b60: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 66 69  [0] = '\0';...fi
1b70: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1b80: 61 63 68 65 5b 69 64 78 5d 2e 66 64 20 3d 20 2d  ache[idx].fd = -
1b90: 31 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69  1;...filed_filei
1ba0: 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d  nfo_fdcache[idx]
1bb0: 2e 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09  .lastmod = "";..
1bc0: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
1bd0: 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 74 79 70  fdcache[idx].typ
1be0: 65 20 3d 20 22 22 3b 0a 09 7d 0a 0a 09 72 65 74  e = "";..}...ret
1bf0: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e  urn(0);.}../* In
1c00: 69 74 69 61 6c 69 7a 65 20 70 72 6f 63 65 73 73  itialize process
1c10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
1c20: 69 6c 65 64 5f 69 6e 69 74 28 75 6e 73 69 67 6e  iled_init(unsign
1c30: 65 64 20 69 6e 74 20 63 61 63 68 65 5f 73 69 7a  ed int cache_siz
1c40: 65 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74  e) {..static int
1c50: 20 63 61 6c 6c 65 64 20 3d 20 30 3b 0a 09 73 73   called = 0;..ss
1c60: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 20 3d  ize_t read_ret =
1c70: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e   0;..unsigned in
1c80: 74 20 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 3d  t random_value =
1c90: 20 30 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 72   0;..int cache_r
1ca0: 65 74 3b 0a 09 69 6e 74 20 72 61 6e 64 6f 6d 5f  et;..int random_
1cb0: 66 64 3b 0a 0a 09 69 66 20 28 63 61 6c 6c 65 64  fd;...if (called
1cc0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  ) {...return(0);
1cd0: 0a 09 7d 0a 0a 09 63 61 6c 6c 65 64 20 3d 20 31  ..}...called = 1
1ce0: 3b 0a 0a 09 2f 2a 20 41 74 74 65 6d 70 74 20 74  ;.../* Attempt t
1cf0: 6f 20 6c 6f 63 6b 20 61 6c 6c 20 6d 65 6d 6f 72  o lock all memor
1d00: 79 20 74 6f 20 70 68 79 73 69 63 61 6c 20 52 41  y to physical RA
1d10: 4d 20 28 62 75 74 20 64 6f 6e 27 74 20 63 61 72  M (but don't car
1d20: 65 20 69 66 20 77 65 20 63 61 6e 27 74 29 20 2a  e if we can't) *
1d30: 2f 0a 09 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f  /..mlockall(MCL_
1d40: 43 55 52 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55  CURRENT | MCL_FU
1d50: 54 55 52 45 29 3b 0a 0a 09 2f 2a 20 49 67 6e 6f  TURE);.../* Igno
1d60: 72 65 20 53 49 47 50 49 50 45 20 2a 2f 0a 09 73  re SIGPIPE */..s
1d70: 69 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20 53  ignal(SIGPIPE, S
1d80: 49 47 5f 49 47 4e 29 3b 0a 0a 09 2f 2a 20 48 61  IG_IGN);.../* Ha
1d90: 6e 64 6c 65 20 53 49 47 48 55 50 20 74 6f 20 72  ndle SIGHUP to r
1da0: 65 6c 65 61 73 65 20 61 6c 6c 20 63 61 63 68 65  elease all cache
1db0: 73 20 2a 2f 0a 09 73 69 67 6e 61 6c 28 53 49 47  s */..signal(SIG
1dc0: 48 55 50 2c 20 66 69 6c 65 64 5f 73 69 67 6e 61  HUP, filed_signa
1dd0: 6c 5f 68 61 6e 64 6c 65 72 29 3b 0a 0a 09 2f 2a  l_handler);.../*
1de0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68   Initialize cach
1df0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 09  e structure */..
1e00: 63 61 63 68 65 5f 72 65 74 20 3d 20 66 69 6c 65  cache_ret = file
1e10: 64 5f 69 6e 69 74 5f 63 61 63 68 65 28 63 61 63  d_init_cache(cac
1e20: 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 63  he_size);..if (c
1e30: 61 63 68 65 5f 72 65 74 20 21 3d 20 30 29 20 7b  ache_ret != 0) {
1e40: 0a 09 09 72 65 74 75 72 6e 28 63 61 63 68 65 5f  ...return(cache_
1e50: 72 65 74 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e  ret);..}.../* In
1e60: 69 74 69 61 6c 69 7a 65 20 72 61 6e 64 6f 6d 20  itialize random 
1e70: 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
1e80: 20 2a 2f 0a 09 72 61 6e 64 6f 6d 5f 66 64 20 3d   */..random_fd =
1e90: 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
1ea0: 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
1eb0: 0a 09 69 66 20 28 72 61 6e 64 6f 6d 5f 66 64 20  ..if (random_fd 
1ec0: 3e 3d 20 30 29 20 7b 0a 09 09 72 65 61 64 5f 72  >= 0) {...read_r
1ed0: 65 74 20 3d 20 72 65 61 64 28 72 61 6e 64 6f 6d  et = read(random
1ee0: 5f 66 64 2c 20 26 72 61 6e 64 6f 6d 5f 76 61 6c  _fd, &random_val
1ef0: 75 65 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ue, sizeof(rando
1f00: 6d 5f 76 61 6c 75 65 29 29 3b 0a 0a 09 09 63 6c  m_value));....cl
1f10: 6f 73 65 28 72 61 6e 64 6f 6d 5f 66 64 29 3b 0a  ose(random_fd);.
1f20: 09 7d 0a 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75  .}...random_valu
1f30: 65 20 5e 3d 20 67 65 74 70 69 64 28 29 3b 0a 09  e ^= getpid();..
1f40: 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20  random_value ^= 
1f50: 67 65 74 75 69 64 28 29 3b 0a 09 72 61 6e 64 6f  getuid();..rando
1f60: 6d 5f 76 61 6c 75 65 20 5e 3d 20 74 69 6d 65 28  m_value ^= time(
1f70: 4e 55 4c 4c 29 3b 0a 0a 09 73 72 61 6e 64 6f 6d  NULL);...srandom
1f80: 28 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 29 3b 0a  (random_value);.
1f90: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 0a 09 2f  ..return(0);.../
1fa0: 2a 20 4e 4f 54 52 45 41 43 48 3a 20 52 65 61 64  * NOTREACH: Read
1fb0: 20 6d 61 79 20 66 61 69 6c 20 6f 72 20 73 75 63   may fail or suc
1fc0: 63 65 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 61  ceed, we don't a
1fd0: 63 74 75 61 6c 6c 79 20 63 61 72 65 20 2a 2f 0a  ctually care */.
1fe0: 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64  .read_ret = read
1ff0: 5f 72 65 74 3b 0a 7d 0a 0a 2f 2a 20 4c 69 73 74  _ret;.}../* List
2000: 65 6e 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  en on a particul
2010: 61 72 20 61 64 64 72 65 73 73 2f 70 6f 72 74 20  ar address/port 
2020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2030: 6c 65 64 5f 6c 69 73 74 65 6e 28 63 6f 6e 73 74  led_listen(const
2040: 20 63 68 61 72 20 2a 61 64 64 72 65 73 73 2c 20   char *address, 
2050: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 6f 72  unsigned int por
2060: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 73 6f 63  t) {..struct soc
2070: 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72 5f 76  kaddr_in6 addr_v
2080: 36 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61  6;..struct socka
2090: 64 64 72 5f 69 6e 20 61 64 64 72 5f 76 34 3b 0a  ddr_in addr_v4;.
20a0: 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  .struct sockaddr
20b0: 20 2a 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e   *addr;..socklen
20c0: 5f 74 20 61 64 64 72 5f 6c 65 6e 3b 0a 09 69 6e  _t addr_len;..in
20d0: 74 20 70 74 6f 6e 5f 72 65 74 2c 20 62 69 6e 64  t pton_ret, bind
20e0: 5f 72 65 74 2c 20 6c 69 73 74 65 6e 5f 72 65 74  _ret, listen_ret
20f0: 3b 0a 09 69 6e 74 20 66 61 6d 69 6c 79 3b 0a 09  ;..int family;..
2100: 69 6e 74 20 66 64 3b 0a 0a 09 66 61 6d 69 6c 79  int fd;...family
2110: 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09 70 74   = AF_INET6;..pt
2120: 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70 74  on_ret = inet_pt
2130: 6f 6e 28 66 61 6d 69 6c 79 2c 20 61 64 64 72 65  on(family, addre
2140: 73 73 2c 20 26 61 64 64 72 5f 76 36 2e 73 69 6e  ss, &addr_v6.sin
2150: 36 5f 61 64 64 72 2e 73 36 5f 61 64 64 72 29 3b  6_addr.s6_addr);
2160: 0a 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20 21  ..if (pton_ret !
2170: 3d 20 31 29 20 7b 0a 09 09 66 61 6d 69 6c 79 20  = 1) {...family 
2180: 3d 20 41 46 5f 49 4e 45 54 3b 0a 09 09 70 74 6f  = AF_INET;...pto
2190: 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f  n_ret = inet_pto
21a0: 6e 28 66 61 6d 69 6c 79 2c 20 61 64 64 72 65 73  n(family, addres
21b0: 73 2c 20 26 61 64 64 72 5f 76 34 2e 73 69 6e 5f  s, &addr_v4.sin_
21c0: 61 64 64 72 2e 73 5f 61 64 64 72 29 3b 0a 09 09  addr.s_addr);...
21d0: 69 66 20 28 70 74 6f 6e 5f 72 65 74 20 21 3d 20  if (pton_ret != 
21e0: 31 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d  1) {....return(-
21f0: 31 29 3b 0a 09 09 7d 0a 0a 09 09 61 64 64 72 5f  1);...}....addr_
2200: 76 34 2e 73 69 6e 5f 66 61 6d 69 6c 79 20 3d 20  v4.sin_family = 
2210: 66 61 6d 69 6c 79 3b 0a 09 09 61 64 64 72 5f 76  family;...addr_v
2220: 34 2e 73 69 6e 5f 70 6f 72 74 20 3d 20 68 74 6f  4.sin_port = hto
2230: 6e 73 28 70 6f 72 74 29 3b 0a 0a 09 09 61 64 64  ns(port);....add
2240: 72 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b  r = (struct sock
2250: 61 64 64 72 20 2a 29 20 26 61 64 64 72 5f 76 34  addr *) &addr_v4
2260: 3b 0a 09 09 61 64 64 72 5f 6c 65 6e 20 3d 20 73  ;...addr_len = s
2270: 69 7a 65 6f 66 28 61 64 64 72 5f 76 34 29 3b 0a  izeof(addr_v4);.
2280: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 61 64 64 72  .} else {...addr
2290: 5f 76 36 2e 73 69 6e 36 5f 66 61 6d 69 6c 79 20  _v6.sin6_family 
22a0: 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09 09 61 64  = AF_INET6;...ad
22b0: 64 72 5f 76 36 2e 73 69 6e 36 5f 66 6c 6f 77 69  dr_v6.sin6_flowi
22c0: 6e 66 6f 20 3d 20 30 3b 0a 09 09 61 64 64 72 5f  nfo = 0;...addr_
22d0: 76 36 2e 73 69 6e 36 5f 73 63 6f 70 65 5f 69 64  v6.sin6_scope_id
22e0: 20 3d 20 30 3b 0a 09 09 61 64 64 72 5f 76 36 2e   = 0;...addr_v6.
22f0: 73 69 6e 36 5f 70 6f 72 74 20 3d 20 68 74 6f 6e  sin6_port = hton
2300: 73 28 70 6f 72 74 29 3b 0a 0a 09 09 61 64 64 72  s(port);....addr
2310: 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61   = (struct socka
2320: 64 64 72 20 2a 29 20 26 61 64 64 72 5f 76 36 3b  ddr *) &addr_v6;
2330: 0a 09 09 61 64 64 72 5f 6c 65 6e 20 3d 20 73 69  ...addr_len = si
2340: 7a 65 6f 66 28 61 64 64 72 5f 76 36 29 3b 0a 09  zeof(addr_v6);..
2350: 7d 0a 0a 09 66 64 20 3d 20 73 6f 63 6b 65 74 28  }...fd = socket(
2360: 66 61 6d 69 6c 79 2c 20 53 4f 43 4b 5f 53 54 52  family, SOCK_STR
2370: 45 41 4d 2c 20 30 29 3b 0a 09 69 66 20 28 66 64  EAM, 0);..if (fd
2380: 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
2390: 28 66 64 29 3b 0a 09 7d 0a 0a 09 62 69 6e 64 5f  (fd);..}...bind_
23a0: 72 65 74 20 3d 20 62 69 6e 64 28 66 64 2c 20 61  ret = bind(fd, a
23b0: 64 64 72 2c 20 61 64 64 72 5f 6c 65 6e 29 3b 0a  ddr, addr_len);.
23c0: 09 69 66 20 28 62 69 6e 64 5f 72 65 74 20 3c 20  .if (bind_ret < 
23d0: 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29  0) {...close(fd)
23e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
23f0: 0a 09 7d 0a 0a 09 6c 69 73 74 65 6e 5f 72 65 74  ..}...listen_ret
2400: 20 3d 20 6c 69 73 74 65 6e 28 66 64 2c 20 31 32   = listen(fd, 12
2410: 38 29 3b 0a 09 69 66 20 28 6c 69 73 74 65 6e 5f  8);..if (listen_
2420: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 63 6c  ret != 0) {...cl
2430: 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74 75  ose(fd);....retu
2440: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 74  rn(-1);..}...ret
2450: 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 2f 2a 20 4c  urn(fd);.}../* L
2460: 6f 67 20 61 20 6d 65 73 73 61 67 65 20 2a 2f 0a  og a message */.
2470: 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e  #ifdef FILED_DON
2480: 54 5f 4c 4f 47 0a 23 20 20 64 65 66 69 6e 65 20  T_LOG.#  define 
2490: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
24a0: 72 65 61 64 5f 69 6e 69 74 28 78 29 20 30 0a 23  read_init(x) 0.#
24b0: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
24c0: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20  og_msg_debug(x, 
24d0: 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66  ...) /**/.#  def
24e0: 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ine filed_log_ms
24f0: 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23  g(x, ...) /**/.#
2500: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
2510: 6f 67 5f 65 6e 74 72 79 28 78 29 20 2f 2a 2a 2f  og_entry(x) /**/
2520: 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64  .#  define filed
2530: 5f 6c 6f 67 5f 69 70 28 78 2c 20 2e 2e 2e 29 20  _log_ip(x, ...) 
2540: 4e 55 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 66  NULL.#  define f
2550: 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 78 29 20  iled_log_new(x) 
2560: 26 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67  &local_dummy_log
2570: 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64  .#  define filed
2580: 5f 6c 6f 67 5f 66 72 65 65 28 78 29 20 2f 2a 2a  _log_free(x) /**
2590: 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 6c 6f 67  /../* Return log
25a0: 67 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 73  ging handle */.s
25b0: 74 61 74 69 63 20 46 49 4c 45 20 2a 66 69 6c 65  tatic FILE *file
25c0: 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73 74  d_log_open(const
25d0: 20 63 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a 09   char *file) {..
25e0: 72 65 74 75 72 6e 28 73 74 64 6f 75 74 29 3b 0a  return(stdout);.
25f0: 09 66 69 6c 65 20 3d 20 66 69 6c 65 3b 0a 7d 0a  .file = file;.}.
2600: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
2610: 66 69 6c 65 64 5f 6c 6f 67 5f 66 72 65 65 28 78  filed_log_free(x
2620: 29 20 66 72 65 65 28 78 29 0a 23 20 20 69 66 64  ) free(x).#  ifd
2630: 65 66 20 46 49 4c 45 44 5f 44 45 42 55 47 0a 23  ef FILED_DEBUG.#
2640: 20 20 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64      define filed
2650: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78  _log_msg_debug(x
2660: 2c 20 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66  , ...) { fprintf
2670: 28 73 74 64 65 72 72 2c 20 78 2c 20 5f 5f 56 41  (stderr, x, __VA
2680: 5f 41 52 47 53 5f 5f 29 3b 20 66 70 72 69 6e 74  _ARGS__); fprint
2690: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b  f(stderr, "\n");
26a0: 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b   fflush(stderr);
26b0: 20 7d 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20   }.#  else.#    
26c0: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
26d0: 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e  _msg_debug(x, ..
26e0: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 66  .) /**/.#  endif
26f0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
2700: 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a  logging thread *
2710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66  /.static void *f
2720: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
2730: 65 61 64 28 76 6f 69 64 20 2a 61 72 67 5f 70 29  ead(void *arg_p)
2740: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
2750: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
2760: 61 72 67 73 20 2a 61 72 67 3b 0a 09 73 74 72 75  args *arg;..stru
2770: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
2780: 72 79 20 2a 63 75 72 72 2c 20 2a 70 72 65 76 3b  ry *curr, *prev;
2790: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65  ..const char *me
27a0: 74 68 6f 64 3b 0a 09 74 69 6d 65 5f 74 20 6e 6f  thod;..time_t no
27b0: 77 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09  w;..FILE *fp;...
27c0: 61 72 67 20 3d 20 61 72 67 5f 70 3b 0a 0a 09 66  arg = arg_p;...f
27d0: 70 20 3d 20 61 72 67 2d 3e 66 70 3b 0a 0a 09 77  p = arg->fp;...w
27e0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 70 74 68  hile (1) {...pth
27f0: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
2800: 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  &filed_log_msg_l
2810: 69 73 74 5f 6d 75 74 65 78 29 3b 0a 09 09 70 74  ist_mutex);...pt
2820: 68 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69 74 28  hread_cond_wait(
2830: 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  &filed_log_msg_l
2840: 69 73 74 5f 72 65 61 64 79 2c 20 26 66 69 6c 65  ist_ready, &file
2850: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
2860: 75 74 65 78 29 3b 0a 0a 09 09 63 75 72 72 20 3d  utex);....curr =
2870: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c   filed_log_msg_l
2880: 69 73 74 3b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  ist;...filed_log
2890: 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c  _msg_list = NULL
28a0: 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74  ;....pthread_mut
28b0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64  ex_unlock(&filed
28c0: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
28d0: 74 65 78 29 3b 0a 0a 09 09 6e 6f 77 20 3d 20 74  tex);....now = t
28e0: 69 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 09 70 72  ime(NULL);....pr
28f0: 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 09 66 6f 72  ev = NULL;...for
2900: 20 28 3b 20 63 75 72 72 3b 20 63 75 72 72 20 3d   (; curr; curr =
2910: 20 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a   curr->_next) {.
2920: 09 09 09 63 75 72 72 2d 3e 5f 70 72 65 76 20 3d  ...curr->_prev =
2930: 20 70 72 65 76 3b 0a 0a 09 09 09 70 72 65 76 20   prev;.....prev 
2940: 3d 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 63  = curr;...}....c
2950: 75 72 72 20 3d 20 70 72 65 76 3b 0a 09 09 77 68  urr = prev;...wh
2960: 69 6c 65 20 28 63 75 72 72 29 20 7b 0a 09 09 09  ile (curr) {....
2970: 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 79  switch (curr->ty
2980: 70 65 29 20 7b 0a 09 09 09 09 63 61 73 65 20 46  pe) {.....case F
2990: 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45  ILED_LOG_TYPE_ME
29a0: 53 53 41 47 45 3a 0a 09 09 09 09 09 66 70 72 69  SSAGE:......fpri
29b0: 6e 74 66 28 66 70 2c 20 22 25 73 22 2c 20 63 75  ntf(fp, "%s", cu
29c0: 72 72 2d 3e 62 75 66 66 65 72 29 3b 0a 0a 09 09  rr->buffer);....
29d0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61  ...break;.....ca
29e0: 73 65 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50  se FILED_LOG_TYP
29f0: 45 5f 54 52 41 4e 53 46 45 52 3a 0a 09 09 09 09  E_TRANSFER:.....
2a00: 09 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e 6d  .switch (curr->m
2a10: 65 74 68 6f 64 29 20 7b 0a 09 09 09 09 09 09 63  ethod) {.......c
2a20: 61 73 65 20 46 49 4c 45 44 5f 52 45 51 55 45 53  ase FILED_REQUES
2a30: 54 5f 4d 45 54 48 4f 44 5f 47 45 54 3a 0a 09 09  T_METHOD_GET:...
2a40: 09 09 09 09 09 6d 65 74 68 6f 64 3d 22 47 45 54  .....method="GET
2a50: 22 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b  ";........break;
2a60: 0a 09 09 09 09 09 09 63 61 73 65 20 46 49 4c 45  .......case FILE
2a70: 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44  D_REQUEST_METHOD
2a80: 5f 48 45 41 44 3a 0a 09 09 09 09 09 09 09 6d 65  _HEAD:........me
2a90: 74 68 6f 64 3d 22 48 45 41 44 22 3b 0a 09 09 09  thod="HEAD";....
2aa0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
2ab0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09  .default:.......
2ac0: 09 6d 65 74 68 6f 64 3d 22 3c 75 6e 6b 6e 6f 77  .method="<unknow
2ad0: 6e 3e 22 3b 0a 09 09 09 09 09 09 09 62 72 65 61  n>";........brea
2ae0: 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
2af0: 69 66 20 28 63 75 72 72 2d 3e 65 6e 64 74 69 6d  if (curr->endtim
2b00: 65 20 3d 3d 20 28 28 74 69 6d 65 5f 74 29 20 2d  e == ((time_t) -
2b10: 31 29 29 20 7b 0a 09 09 09 09 09 09 63 75 72 72  1)) {.......curr
2b20: 2d 3e 65 6e 64 74 69 6d 65 20 3d 20 6e 6f 77 3b  ->endtime = now;
2b30: 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 66 70  ......}.......fp
2b40: 72 69 6e 74 66 28 66 70 2c 20 22 54 52 41 4e 53  rintf(fp, "TRANS
2b50: 46 45 52 20 4d 45 54 48 4f 44 3d 25 73 20 50 41  FER METHOD=%s PA
2b60: 54 48 3d 25 73 20 53 52 43 3d 25 73 3a 25 69 20  TH=%s SRC=%s:%i 
2b70: 54 49 4d 45 2e 53 54 41 52 54 3d 25 6c 6c 75 20  TIME.START=%llu 
2b80: 54 49 4d 45 2e 45 4e 44 3d 25 6c 6c 75 20 43 4f  TIME.END=%llu CO
2b90: 44 45 2e 56 41 4c 55 45 3d 25 75 20 43 4f 44 45  DE.VALUE=%u CODE
2ba0: 2e 52 45 41 53 4f 4e 3d 25 73 20 52 45 51 55 45  .REASON=%s REQUE
2bb0: 53 54 2e 4f 46 46 53 45 54 3d 25 6c 6c 75 20 52  ST.OFFSET=%llu R
2bc0: 45 51 55 45 53 54 2e 4c 45 4e 47 54 48 3d 25 6c  EQUEST.LENGTH=%l
2bd0: 6c 75 20 46 49 4c 45 2e 4c 45 4e 47 54 48 3d 25  lu FILE.LENGTH=%
2be0: 6c 6c 75 20 54 52 41 4e 53 46 45 52 2e 4c 45 4e  llu TRANSFER.LEN
2bf0: 47 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 09 09  GTH=%llu",......
2c00: 09 6d 65 74 68 6f 64 2c 0a 09 09 09 09 09 09 63  .method,.......c
2c10: 75 72 72 2d 3e 62 75 66 66 65 72 2c 0a 09 09 09  urr->buffer,....
2c20: 09 09 09 63 75 72 72 2d 3e 69 70 2c 20 63 75 72  ...curr->ip, cur
2c30: 72 2d 3e 70 6f 72 74 2c 0a 09 09 09 09 09 09 28  r->port,.......(
2c40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
2c50: 6e 67 29 20 63 75 72 72 2d 3e 73 74 61 72 74 74  ng) curr->startt
2c60: 69 6d 65 2c 0a 09 09 09 09 09 09 28 75 6e 73 69  ime,.......(unsi
2c70: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2c80: 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65 2c 0a 09  curr->endtime,..
2c90: 09 09 09 09 09 63 75 72 72 2d 3e 68 74 74 70 5f  .....curr->http_
2ca0: 63 6f 64 65 2c 20 63 75 72 72 2d 3e 72 65 61 73  code, curr->reas
2cb0: 6f 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67  on,.......(unsig
2cc0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63  ned long long) c
2cd0: 75 72 72 2d 3e 72 65 71 5f 6f 66 66 73 65 74 2c  urr->req_offset,
2ce0: 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64  .......(unsigned
2cf0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72   long long) curr
2d00: 2d 3e 72 65 71 5f 6c 65 6e 67 74 68 2c 0a 09 09  ->req_length,...
2d10: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
2d20: 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 66  ng long) curr->f
2d30: 69 6c 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 09  ile_length,.....
2d40: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
2d50: 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73 65 6e   long) curr->sen
2d60: 74 5f 6c 65 6e 67 74 68 0a 09 09 09 09 09 29 3b  t_length......);
2d70: 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
2d80: 09 7d 0a 09 09 09 66 70 72 69 6e 74 66 28 66 70  .}....fprintf(fp
2d90: 2c 20 22 20 54 48 52 45 41 44 3d 25 6c 6c 75 20  , " THREAD=%llu 
2da0: 54 49 4d 45 3d 25 6c 6c 75 5c 6e 22 2c 0a 09 09  TIME=%llu\n",...
2db0: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
2dc0: 20 6c 6f 6e 67 29 20 28 28 69 6e 74 70 74 72 5f   long) ((intptr_
2dd0: 74 29 20 63 75 72 72 2d 3e 74 68 72 65 61 64 29  t) curr->thread)
2de0: 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ,.....(unsigned 
2df0: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 6e 6f 77 0a 09  long long) now..
2e00: 09 09 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66  ..);....fflush(f
2e10: 70 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63  p);.....prev = c
2e20: 75 72 72 3b 0a 09 09 09 63 75 72 72 20 3d 20 63  urr;....curr = c
2e30: 75 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09 09  urr->_prev;.....
2e40: 66 72 65 65 28 70 72 65 76 29 3b 0a 09 09 7d 0a  free(prev);...}.
2e50: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .}...return(NULL
2e60: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
2e70: 64 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  d filed_log_entr
2e80: 79 28 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  y(struct filed_l
2e90: 6f 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 29  og_entry *entry)
2ea0: 20 7b 0a 09 65 6e 74 72 79 2d 3e 74 68 72 65 61   {..entry->threa
2eb0: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
2ec0: 28 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75  ();...pthread_mu
2ed0: 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f  tex_lock(&filed_
2ee0: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74  log_msg_list_mut
2ef0: 65 78 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f 6e  ex);...entry->_n
2f00: 65 78 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f  ext = filed_log_
2f10: 6d 73 67 5f 6c 69 73 74 3b 0a 09 66 69 6c 65 64  msg_list;..filed
2f20: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20  _log_msg_list = 
2f30: 65 6e 74 72 79 3b 0a 0a 09 70 74 68 72 65 61 64  entry;...pthread
2f40: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66  _mutex_unlock(&f
2f50: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
2f60: 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 70 74 68 72  t_mutex);...pthr
2f70: 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28  ead_cond_signal(
2f80: 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  &filed_log_msg_l
2f90: 69 73 74 5f 72 65 61 64 79 29 3b 0a 0a 09 72 65  ist_ready);...re
2fa0: 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  turn;.}..static 
2fb0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
2fc0: 5f 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f  _entry *filed_lo
2fd0: 67 5f 6e 65 77 28 69 6e 74 20 69 6e 69 74 69 61  g_new(int initia
2fe0: 6c 69 7a 65 29 20 7b 0a 09 73 74 72 75 63 74 20  lize) {..struct 
2ff0: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20  filed_log_entry 
3000: 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61  *retval;...retva
3010: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
3020: 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 69  f(*retval));...i
3030: 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b  f (initialize) {
3040: 0a 09 09 72 65 74 76 61 6c 2d 3e 62 75 66 66 65  ...retval->buffe
3050: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 72  r[0] = '\0';...r
3060: 65 74 76 61 6c 2d 3e 68 74 74 70 5f 63 6f 64 65  etval->http_code
3070: 20 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c 2d   = -1;...retval-
3080: 3e 73 74 61 72 74 74 69 6d 65 20 3d 20 30 3b 0a  >starttime = 0;.
3090: 09 09 72 65 74 76 61 6c 2d 3e 65 6e 64 74 69 6d  ..retval->endtim
30a0: 65 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d  e = 0;...retval-
30b0: 3e 72 65 71 5f 6f 66 66 73 65 74 20 3d 20 30 3b  >req_offset = 0;
30c0: 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6c  ...retval->req_l
30d0: 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72 65 74  ength = 0;...ret
30e0: 76 61 6c 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68  val->sent_length
30f0: 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e   = 0;...retval->
3100: 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 30 3b  file_length = 0;
3110: 0a 09 09 72 65 74 76 61 6c 2d 3e 69 70 5b 30 5d  ...retval->ip[0]
3120: 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65 74 76 61   = '\0';...retva
3130: 6c 2d 3e 70 6f 72 74 20 3d 20 2d 31 3b 0a 09 09  l->port = -1;...
3140: 72 65 74 76 61 6c 2d 3e 6d 65 74 68 6f 64 20 3d  retval->method =
3150: 20 2d 31 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e   -1;..}...return
3160: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
3170: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c  tic void filed_l
3180: 6f 67 5f 6d 73 67 28 63 6f 6e 73 74 20 63 68 61  og_msg(const cha
3190: 72 20 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09  r *fmt, ...) {..
31a0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
31b0: 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a 09  _entry *entry;..
31c0: 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a 0a 09  va_list args;...
31d0: 65 6e 74 72 79 20 3d 20 66 69 6c 65 64 5f 6c 6f  entry = filed_lo
31e0: 67 5f 6e 65 77 28 30 29 3b 0a 0a 09 76 61 5f 73  g_new(0);...va_s
31f0: 74 61 72 74 28 61 72 67 73 2c 20 66 6d 74 29 3b  tart(args, fmt);
3200: 0a 0a 09 76 73 6e 70 72 69 6e 74 66 28 65 6e 74  ...vsnprintf(ent
3210: 72 79 2d 3e 62 75 66 66 65 72 2c 20 73 69 7a 65  ry->buffer, size
3220: 6f 66 28 65 6e 74 72 79 2d 3e 62 75 66 66 65 72  of(entry->buffer
3230: 29 2c 20 66 6d 74 2c 20 61 72 67 73 29 3b 0a 0a  ), fmt, args);..
3240: 09 76 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a  .va_end(args);..
3250: 09 65 6e 74 72 79 2d 3e 74 79 70 65 20 3d 20 46  .entry->type = F
3260: 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45  ILED_LOG_TYPE_ME
3270: 53 53 41 47 45 3b 0a 0a 09 66 69 6c 65 64 5f 6c  SSAGE;...filed_l
3280: 6f 67 5f 65 6e 74 72 79 28 65 6e 74 72 79 29 3b  og_entry(entry);
3290: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74  ...return;.}..st
32a0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
32b0: 2a 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 73 74  *filed_log_ip(st
32c0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61  ruct sockaddr *a
32d0: 64 64 72 2c 20 63 68 61 72 20 2a 62 75 66 66 65  ddr, char *buffe
32e0: 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72  r, size_t buffer
32f0: 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 73  len) {..struct s
3300: 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 61 64 64 72  ockaddr_in *addr
3310: 5f 76 34 3b 0a 09 73 74 72 75 63 74 20 73 6f 63  _v4;..struct soc
3320: 6b 61 64 64 72 5f 69 6e 36 20 2a 61 64 64 72 5f  kaddr_in6 *addr_
3330: 76 36 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  v6;..const char 
3340: 2a 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a  *retval = NULL;.
3350: 0a 09 61 64 64 72 5f 76 36 20 3d 20 28 73 74 72  ..addr_v6 = (str
3360: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36  uct sockaddr_in6
3370: 20 2a 29 20 61 64 64 72 3b 0a 0a 09 73 77 69 74   *) addr;...swit
3380: 63 68 20 28 61 64 64 72 5f 76 36 2d 3e 73 69 6e  ch (addr_v6->sin
3390: 36 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 63 61  6_family) {...ca
33a0: 73 65 20 41 46 5f 49 4e 45 54 3a 0a 09 09 09 61  se AF_INET:....a
33b0: 64 64 72 5f 76 34 20 3d 20 28 73 74 72 75 63 74  ddr_v4 = (struct
33c0: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 29 20   sockaddr_in *) 
33d0: 61 64 64 72 3b 0a 09 09 09 72 65 74 76 61 6c 20  addr;....retval 
33e0: 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49  = inet_ntop(AF_I
33f0: 4e 45 54 2c 20 26 61 64 64 72 5f 76 34 2d 3e 73  NET, &addr_v4->s
3400: 69 6e 5f 61 64 64 72 2c 20 62 75 66 66 65 72 2c  in_addr, buffer,
3410: 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09   bufferlen);....
3420: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 46  break;...case AF
3430: 5f 49 4e 45 54 36 3a 0a 09 09 09 72 65 74 76 61  _INET6:....retva
3440: 6c 20 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46  l = inet_ntop(AF
3450: 5f 49 4e 45 54 36 2c 20 26 61 64 64 72 5f 76 36  _INET6, &addr_v6
3460: 2d 3e 73 69 6e 36 5f 61 64 64 72 2c 20 62 75 66  ->sin6_addr, buf
3470: 66 65 72 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b  fer, bufferlen);
3480: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
3490: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
34a0: 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  }..static FILE *
34b0: 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63  filed_log_open(c
34c0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 29  onst char *file)
34d0: 20 7b 0a 09 46 49 4c 45 20 2a 72 65 74 76 61 6c   {..FILE *retval
34e0: 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 66  ;...if (strcmp(f
34f0: 69 6c 65 2c 20 22 2d 22 29 20 3d 3d 20 30 29 20  ile, "-") == 0) 
3500: 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20 73 74 64  {...retval = std
3510: 6f 75 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  out;..} else if 
3520: 28 66 69 6c 65 5b 30 5d 20 3d 3d 20 27 7c 27 29  (file[0] == '|')
3530: 20 7b 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09 09 72   {...file++;...r
3540: 65 74 76 61 6c 20 3d 20 70 6f 70 65 6e 28 66 69  etval = popen(fi
3550: 6c 65 2c 20 22 77 22 29 3b 0a 09 7d 20 65 6c 73  le, "w");..} els
3560: 65 20 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20 66  e {...retval = f
3570: 6f 70 65 6e 28 66 69 6c 65 2c 20 22 61 2b 22 29  open(file, "a+")
3580: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
3590: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
35a0: 20 69 6e 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69   int filed_loggi
35b0: 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 46  ng_thread_init(F
35c0: 49 4c 45 20 2a 6c 6f 67 66 70 29 20 7b 0a 09 73  ILE *logfp) {..s
35d0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67  truct filed_logg
35e0: 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ing_thread_args 
35f0: 2a 61 72 67 73 3b 0a 09 70 74 68 72 65 61 64 5f  *args;..pthread_
3600: 74 20 74 68 72 65 61 64 5f 69 64 3b 0a 0a 09 61  t thread_id;...a
3610: 72 67 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rgs = malloc(siz
3620: 65 6f 66 28 2a 61 72 67 73 29 29 3b 0a 09 61 72  eof(*args));..ar
3630: 67 73 2d 3e 66 70 20 3d 20 6c 6f 67 66 70 3b 0a  gs->fp = logfp;.
3640: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
3650: 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 70  list = NULL;...p
3660: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
3670: 74 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  t(&filed_log_msg
3680: 5f 6c 69 73 74 5f 6d 75 74 65 78 2c 20 4e 55 4c  _list_mutex, NUL
3690: 4c 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 72  L);...pthread_cr
36a0: 65 61 74 65 28 26 74 68 72 65 61 64 5f 69 64 2c  eate(&thread_id,
36b0: 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f 67   NULL, filed_log
36c0: 67 69 6e 67 5f 74 68 72 65 61 64 2c 20 61 72 67  ging_thread, arg
36d0: 73 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  s);...filed_log_
36e0: 6d 73 67 28 22 53 54 41 52 54 22 29 3b 0a 0a 09  msg("START");...
36f0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 65 6e  return(0);.}.#en
3700: 64 69 66 0a 0a 23 69 66 64 65 66 20 46 49 4c 45  dif..#ifdef FILE
3710: 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 0a 23  D_DONT_TIMEOUT.#
3720: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63  define filed_soc
3730: 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61  kettimeout_threa
3740: 64 5f 69 6e 69 74 28 29 20 30 0a 23 64 65 66 69  d_init() 0.#defi
3750: 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ne filed_sockett
3760: 69 6d 65 6f 75 74 5f 69 6e 69 74 28 29 20 30 0a  imeout_init() 0.
3770: 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f  #define filed_so
3780: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 61 63 63 65  ckettimeout_acce
3790: 70 74 28 78 29 20 2f 2a 2a 2f 0a 23 64 65 66 69  pt(x) /**/.#defi
37a0: 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ne filed_sockett
37b0: 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e  imeout_processin
37c0: 67 5f 73 74 61 72 74 28 78 29 20 2f 2a 2a 2f 0a  g_start(x) /**/.
37d0: 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f  #define filed_so
37e0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63  ckettimeout_proc
37f0: 65 73 73 69 6e 67 5f 65 6e 64 28 78 29 20 2f 2a  essing_end(x) /*
3800: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64  */.#define filed
3810: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63  _sockettimeout_c
3820: 6c 6f 73 65 28 78 29 20 2f 2a 2a 2f 0a 23 65 6c  lose(x) /**/.#el
3830: 73 65 0a 5f 41 74 6f 6d 69 63 20 74 69 6d 65 5f  se._Atomic time_
3840: 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  t filed_socketti
3850: 6d 65 6f 75 74 5f 74 69 6d 65 3b 0a 73 74 72 75  meout_time;.stru
3860: 63 74 20 7b 0a 09 5f 41 74 6f 6d 69 63 20 74 69  ct {.._Atomic ti
3870: 6d 65 5f 74 20 65 78 70 69 72 61 74 69 6f 6e 5f  me_t expiration_
3880: 74 69 6d 65 3b 0a 09 5f 41 74 6f 6d 69 63 20 70  time;.._Atomic p
3890: 74 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f  thread_t thread_
38a0: 69 64 3b 0a 09 62 6f 6f 6c 20 76 61 6c 69 64 3b  id;..bool valid;
38b0: 0a 7d 2a 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  .}* filed_socket
38c0: 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74  timeout_sockstat
38d0: 75 73 3b 0a 6c 6f 6e 67 20 66 69 6c 65 64 5f 73  us;.long filed_s
38e0: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63  ockettimeout_soc
38f0: 6b 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 3b 0a  kstatus_length;.
3900: 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  int filed_socket
3910: 74 69 6d 65 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f  timeout_devnull_
3920: 66 64 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  fd;..static int 
3930: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3940: 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61  out_sockfd_in_ra
3950: 6e 67 65 28 69 6e 74 20 73 6f 63 6b 66 64 29 20  nge(int sockfd) 
3960: 7b 0a 09 69 66 20 28 73 6f 63 6b 66 64 20 3c 20  {..if (sockfd < 
3970: 33 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  3) {...return(0)
3980: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 66  ;..}...if (sockf
3990: 64 20 3e 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  d > filed_socket
39a0: 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74  timeout_sockstat
39b0: 75 73 5f 6c 65 6e 67 74 68 29 20 7b 0a 09 09 72  us_length) {...r
39c0: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72  eturn(0);..}...r
39d0: 65 74 75 72 6e 28 31 29 3b 0a 7d 0a 0a 73 74 61  eturn(1);.}..sta
39e0: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73  tic void filed_s
39f0: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65 78 70  ockettimeout_exp
3a00: 69 72 65 28 69 6e 74 20 73 6f 63 6b 66 64 2c 20  ire(int sockfd, 
3a10: 69 6e 74 20 6c 65 6e 67 74 68 29 20 7b 0a 09 74  int length) {..t
3a20: 69 6d 65 5f 74 20 6e 6f 77 2c 20 65 78 70 69 72  ime_t now, expir
3a30: 65 3b 0a 0a 09 6e 6f 77 20 3d 20 61 74 6f 6d 69  e;...now = atomi
3a40: 63 5f 6c 6f 61 64 28 26 66 69 6c 65 64 5f 73 6f  c_load(&filed_so
3a50: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 69 6d 65  ckettimeout_time
3a60: 29 3b 0a 0a 09 65 78 70 69 72 65 20 3d 20 6e 6f  );...expire = no
3a70: 77 20 2b 20 6c 65 6e 67 74 68 3b 0a 0a 09 61 74  w + length;...at
3a80: 6f 6d 69 63 5f 73 74 6f 72 65 28 26 66 69 6c 65  omic_store(&file
3a90: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3aa0: 73 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66  sockstatus[sockf
3ab0: 64 5d 2e 65 78 70 69 72 61 74 69 6f 6e 5f 74 69  d].expiration_ti
3ac0: 6d 65 2c 20 65 78 70 69 72 65 29 3b 0a 0a 09 72  me, expire);...r
3ad0: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
3ae0: 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b   void filed_sock
3af0: 65 74 74 69 6d 65 6f 75 74 5f 61 63 63 65 70 74  ettimeout_accept
3b00: 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b 0a 09  (int sockfd) {..
3b10: 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63 6b 65  if (!filed_socke
3b20: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66 64 5f  ttimeout_sockfd_
3b30: 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66 64 29  in_range(sockfd)
3b40: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
3b50: 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ...filed_sockett
3b60: 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28 73 6f  imeout_expire(so
3b70: 63 6b 66 64 2c 20 36 30 29 3b 0a 0a 09 61 74 6f  ckfd, 60);...ato
3b80: 6d 69 63 5f 73 74 6f 72 65 28 26 66 69 6c 65 64  mic_store(&filed
3b90: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73  _sockettimeout_s
3ba0: 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66 64  ockstatus[sockfd
3bb0: 5d 2e 74 68 72 65 61 64 5f 69 64 2c 20 70 74 68  ].thread_id, pth
3bc0: 72 65 61 64 5f 73 65 6c 66 28 29 29 3b 0a 0a 09  read_self());...
3bd0: 61 74 6f 6d 69 63 5f 73 74 6f 72 65 28 26 66 69  atomic_store(&fi
3be0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
3bf0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63  t_sockstatus[soc
3c00: 6b 66 64 5d 2e 76 61 6c 69 64 2c 20 74 72 75 65  kfd].valid, true
3c10: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
3c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
3c30: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3c40: 70 72 6f 63 65 73 73 69 6e 67 5f 73 74 61 72 74  processing_start
3c50: 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b 0a 09  (int sockfd) {..
3c60: 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63 6b 65  if (!filed_socke
3c70: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66 64 5f  ttimeout_sockfd_
3c80: 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66 64 29  in_range(sockfd)
3c90: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
3ca0: 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ...filed_sockett
3cb0: 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28 73 6f  imeout_expire(so
3cc0: 63 6b 66 64 2c 20 38 36 34 30 30 29 3b 0a 0a 09  ckfd, 86400);...
3cd0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
3ce0: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63  c void filed_soc
3cf0: 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65  kettimeout_proce
3d00: 73 73 69 6e 67 5f 65 6e 64 28 69 6e 74 20 73 6f  ssing_end(int so
3d10: 63 6b 66 64 29 20 7b 0a 09 69 66 20 28 21 66 69  ckfd) {..if (!fi
3d20: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
3d30: 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67  t_sockfd_in_rang
3d40: 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a 09 09 72  e(sockfd)) {...r
3d50: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 69 6c 65  eturn;..}...file
3d60: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3d70: 65 78 70 69 72 65 28 73 6f 63 6b 66 64 2c 20 36  expire(sockfd, 6
3d80: 30 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  0);...return;.}.
3d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
3da0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3db0: 5f 63 6c 6f 73 65 28 69 6e 74 20 73 6f 63 6b 66  _close(int sockf
3dc0: 64 29 20 7b 0a 09 69 66 20 28 21 66 69 6c 65 64  d) {..if (!filed
3dd0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73  _sockettimeout_s
3de0: 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28 73  ockfd_in_range(s
3df0: 6f 63 6b 66 64 29 29 20 7b 0a 09 09 72 65 74 75  ockfd)) {...retu
3e00: 72 6e 3b 0a 09 7d 0a 0a 09 61 74 6f 6d 69 63 5f  rn;..}...atomic_
3e10: 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63  store(&filed_soc
3e20: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73  kettimeout_socks
3e30: 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 76 61  tatus[sockfd].va
3e40: 6c 69 64 2c 20 66 61 6c 73 65 29 3b 0a 0a 09 72  lid, false);...r
3e50: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
3e60: 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 73 6f 63   void *filed_soc
3e70: 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61  kettimeout_threa
3e80: 64 28 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 09  d(void *arg) {..
3e90: 74 69 6d 65 5f 74 20 6e 6f 77 2c 20 65 78 70 69  time_t now, expi
3ea0: 72 61 74 69 6f 6e 5f 74 69 6d 65 3b 0a 09 70 74  ration_time;..pt
3eb0: 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69  hread_t thread_i
3ec0: 64 3b 0a 09 6c 6f 6e 67 20 69 64 78 3b 0a 09 69  d;..long idx;..i
3ed0: 6e 74 20 63 6f 75 6e 74 3b 0a 09 62 6f 6f 6c 20  nt count;..bool 
3ee0: 76 61 6c 69 64 3b 0a 0a 09 77 68 69 6c 65 20 28  valid;...while (
3ef0: 31 29 20 7b 0a 09 09 66 6f 72 20 28 63 6f 75 6e  1) {...for (coun
3f00: 74 20 3d 20 30 3b 20 63 6f 75 6e 74 20 3c 20 31  t = 0; count < 1
3f10: 30 3b 20 63 6f 75 6e 74 2b 2b 29 20 7b 0a 09 09  0; count++) {...
3f20: 09 75 73 6c 65 65 70 28 33 30 30 30 30 30 30 30  .usleep(30000000
3f30: 29 3b 0a 0a 09 09 09 6e 6f 77 20 3d 20 74 69 6d  );.....now = tim
3f40: 65 28 4e 55 4c 4c 29 3b 0a 0a 09 09 09 61 74 6f  e(NULL);.....ato
3f50: 6d 69 63 5f 73 74 6f 72 65 28 26 66 69 6c 65 64  mic_store(&filed
3f60: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74  _sockettimeout_t
3f70: 69 6d 65 2c 20 6e 6f 77 29 3b 0a 09 09 7d 0a 0a  ime, now);...}..
3f80: 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
3f90: 69 64 78 20 3c 20 66 69 6c 65 64 5f 73 6f 63 6b  idx < filed_sock
3fa0: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74  ettimeout_sockst
3fb0: 61 74 75 73 5f 6c 65 6e 67 74 68 3b 20 69 64 78  atus_length; idx
3fc0: 2b 2b 29 20 7b 0a 09 09 09 76 61 6c 69 64 20 3d  ++) {....valid =
3fd0: 20 61 74 6f 6d 69 63 5f 6c 6f 61 64 28 26 66 69   atomic_load(&fi
3fe0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
3ff0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69 64 78  t_sockstatus[idx
4000: 5d 2e 76 61 6c 69 64 29 3b 0a 0a 09 09 09 69 66  ].valid);.....if
4010: 20 28 21 76 61 6c 69 64 29 20 7b 0a 09 09 09 09   (!valid) {.....
4020: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
4030: 09 09 09 65 78 70 69 72 61 74 69 6f 6e 5f 74 69  ...expiration_ti
4040: 6d 65 20 3d 20 61 74 6f 6d 69 63 5f 6c 6f 61 64  me = atomic_load
4050: 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  (&filed_socketti
4060: 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73  meout_sockstatus
4070: 5b 69 64 78 5d 2e 65 78 70 69 72 61 74 69 6f 6e  [idx].expiration
4080: 5f 74 69 6d 65 29 3b 0a 0a 09 09 09 74 68 72 65  _time);.....thre
4090: 61 64 5f 69 64 20 3d 20 61 74 6f 6d 69 63 5f 6c  ad_id = atomic_l
40a0: 6f 61 64 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65  oad(&filed_socke
40b0: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
40c0: 74 75 73 5b 69 64 78 5d 2e 74 68 72 65 61 64 5f  tus[idx].thread_
40d0: 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 65 78 70  id);.....if (exp
40e0: 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20 3e 20 6e  iration_time > n
40f0: 6f 77 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ow) {.....contin
4100: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 69 6c  ue;....}.....fil
4110: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
4120: 5f 63 6c 6f 73 65 28 69 64 78 29 3b 0a 0a 09 09  _close(idx);....
4130: 09 64 75 70 32 28 66 69 6c 65 64 5f 73 6f 63 6b  .dup2(filed_sock
4140: 65 74 74 69 6d 65 6f 75 74 5f 64 65 76 6e 75 6c  ettimeout_devnul
4150: 6c 5f 66 64 2c 20 69 64 78 29 3b 0a 0a 09 09 09  l_fd, idx);.....
4160: 70 74 68 72 65 61 64 5f 6b 69 6c 6c 28 74 68 72  pthread_kill(thr
4170: 65 61 64 5f 69 64 2c 20 53 49 47 50 49 50 45 29  ead_id, SIGPIPE)
4180: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
4190: 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 4e 4f  n(NULL);.../* NO
41a0: 54 52 45 41 43 48 3a 20 57 65 20 64 6f 6e 27 74  TREACH: We don't
41b0: 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65 20 61   actually take a
41c0: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ny arguments */.
41d0: 09 61 72 67 20 3d 20 61 72 67 3b 0a 7d 0a 0a 73  .arg = arg;.}..s
41e0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
41f0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68  sockettimeout_th
4200: 72 65 61 64 5f 69 6e 69 74 28 76 6f 69 64 29 20  read_init(void) 
4210: 7b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72  {..pthread_t thr
4220: 65 61 64 5f 69 64 3b 0a 0a 09 70 74 68 72 65 61  ead_id;...pthrea
4230: 64 5f 63 72 65 61 74 65 28 26 74 68 72 65 61 64  d_create(&thread
4240: 5f 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65 64  _id, NULL, filed
4250: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74  _sockettimeout_t
4260: 68 72 65 61 64 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  hread, NULL);...
4270: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
4280: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 73  atic int filed_s
4290: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69 6e 69  ockettimeout_ini
42a0: 74 28 76 6f 69 64 29 20 7b 0a 09 6c 6f 6e 67 20  t(void) {..long 
42b0: 6d 61 78 66 64 2c 20 69 64 78 3b 0a 0a 09 6d 61  maxfd, idx;...ma
42c0: 78 66 64 20 3d 20 73 79 73 63 6f 6e 66 28 5f 53  xfd = sysconf(_S
42d0: 43 5f 4f 50 45 4e 5f 4d 41 58 29 3b 0a 09 69 66  C_OPEN_MAX);..if
42e0: 20 28 6d 61 78 66 64 20 3c 3d 20 30 29 20 7b 0a   (maxfd <= 0) {.
42f0: 09 09 6d 61 78 66 64 20 3d 20 34 30 39 36 3b 0a  ..maxfd = 4096;.
4300: 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65  .}...filed_socke
4310: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
4320: 74 75 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tus = malloc(siz
4330: 65 6f 66 28 2a 66 69 6c 65 64 5f 73 6f 63 6b 65  eof(*filed_socke
4340: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
4350: 74 75 73 29 20 2a 20 6d 61 78 66 64 29 3b 0a 09  tus) * maxfd);..
4360: 69 66 20 28 66 69 6c 65 64 5f 73 6f 63 6b 65 74  if (filed_socket
4370: 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74  timeout_sockstat
4380: 75 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  us == NULL) {...
4390: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
43a0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
43b0: 64 78 20 3c 20 6d 61 78 66 64 3b 20 69 64 78 2b  dx < maxfd; idx+
43c0: 2b 29 20 7b 0a 09 09 66 69 6c 65 64 5f 73 6f 63  +) {...filed_soc
43d0: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73  kettimeout_socks
43e0: 74 61 74 75 73 5b 69 64 78 5d 2e 76 61 6c 69 64  tatus[idx].valid
43f0: 20 3d 20 66 61 6c 73 65 3b 0a 09 7d 0a 0a 09 66   = false;..}...f
4400: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4410: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c 65  ut_sockstatus_le
4420: 6e 67 74 68 20 3d 20 6d 61 78 66 64 3b 0a 09 66  ngth = maxfd;..f
4430: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4440: 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 20 3d 20  ut_devnull_fd = 
4450: 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  open("/dev/null"
4460: 2c 20 4f 5f 52 44 57 52 29 3b 0a 09 69 66 20 28  , O_RDWR);..if (
4470: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
4480: 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 20 3c  out_devnull_fd <
4490: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
44a0: 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  1);..}...return(
44b0: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0);.}.#endif../*
44c0: 20 46 6f 72 6d 61 74 20 74 69 6d 65 20 70 65 72   Format time per
44d0: 20 52 46 43 32 36 31 36 20 2a 2f 0a 73 74 61 74   RFC2616 */.stat
44e0: 69 63 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 66  ic char *filed_f
44f0: 6f 72 6d 61 74 5f 74 69 6d 65 28 63 68 61 72 20  ormat_time(char 
4500: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
4510: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 63 6f 6e 73  buffer_len, cons
4520: 74 20 74 69 6d 65 5f 74 20 74 69 6d 65 69 6e 66  t time_t timeinf
4530: 6f 29 20 7b 0a 09 73 74 72 75 63 74 20 74 6d 20  o) {..struct tm 
4540: 74 69 6d 65 69 6e 66 6f 5f 74 6d 2c 20 2a 74 69  timeinfo_tm, *ti
4550: 6d 65 69 6e 66 6f 5f 74 6d 5f 70 3b 0a 0a 09 74  meinfo_tm_p;...t
4560: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 20 67  imeinfo_tm_p = g
4570: 6d 74 69 6d 65 5f 72 28 26 74 69 6d 65 69 6e 66  mtime_r(&timeinf
4580: 6f 2c 20 26 74 69 6d 65 69 6e 66 6f 5f 74 6d 29  o, &timeinfo_tm)
4590: 3b 0a 09 69 66 20 28 74 69 6d 65 69 6e 66 6f 5f  ;..if (timeinfo_
45a0: 74 6d 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tm_p == NULL) {.
45b0: 09 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f 77  ..return("unknow
45c0: 6e 22 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72  n");..}...buffer
45d0: 5b 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31 5d  [buffer_len - 1]
45e0: 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72   = '\0';..buffer
45f0: 5f 6c 65 6e 20 3d 20 73 74 72 66 74 69 6d 65 28  _len = strftime(
4600: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c  buffer, buffer_l
4610: 65 6e 20 2d 20 31 2c 20 22 25 61 2c 20 25 64 20  en - 1, "%a, %d 
4620: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 47  %b %Y %H:%M:%S G
4630: 4d 54 22 2c 20 74 69 6d 65 69 6e 66 6f 5f 74 6d  MT", timeinfo_tm
4640: 5f 70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75  _p);...return(bu
4650: 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 68 61 73  ffer);.}../* has
4660: 68 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  h */.static unsi
4670: 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f 68  gned int filed_h
4680: 61 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ash(const unsign
4690: 65 64 20 63 68 61 72 20 2a 76 61 6c 75 65 2c 20  ed char *value, 
46a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 6f 64  unsigned int mod
46b0: 75 6c 75 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65  ulus) {..unsigne
46c0: 64 20 63 68 61 72 20 63 75 72 72 2c 20 70 72 65  d char curr, pre
46d0: 76 3b 0a 09 69 6e 74 20 64 69 66 66 3b 0a 09 75  v;..int diff;..u
46e0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 65 74 76  nsigned int retv
46f0: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d  al;...retval = m
4700: 6f 64 75 6c 75 73 20 2d 20 31 3b 0a 09 70 72 65  odulus - 1;..pre
4710: 76 20 3d 20 6d 6f 64 75 6c 75 73 20 25 20 32 35  v = modulus % 25
4720: 35 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 75 72  5;...while ((cur
4730: 72 20 3d 20 2a 76 61 6c 75 65 29 29 20 7b 0a 09  r = *value)) {..
4740: 09 69 66 20 28 63 75 72 72 20 3c 20 33 32 29 20  .if (curr < 32) 
4750: 7b 0a 09 09 09 63 75 72 72 20 3d 20 32 35 35 20  {....curr = 255 
4760: 2d 20 63 75 72 72 3b 0a 09 09 7d 20 65 6c 73 65  - curr;...} else
4770: 20 7b 0a 09 09 09 63 75 72 72 20 2d 3d 20 33 32   {....curr -= 32
4780: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 72 65  ;...}....if (pre
4790: 76 20 3c 20 63 75 72 72 29 20 7b 0a 09 09 09 64  v < curr) {....d
47a0: 69 66 66 20 3d 20 63 75 72 72 20 2d 20 70 72 65  iff = curr - pre
47b0: 76 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  v;...} else {...
47c0: 09 64 69 66 66 20 3d 20 70 72 65 76 20 2d 20 63  .diff = prev - c
47d0: 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 70 72 65 76  urr;...}....prev
47e0: 20 3d 20 63 75 72 72 3b 0a 0a 09 09 72 65 74 76   = curr;....retv
47f0: 61 6c 20 3c 3c 3d 20 33 3b 0a 09 09 72 65 74 76  al <<= 3;...retv
4800: 61 6c 20 26 3d 20 30 78 46 46 46 46 46 46 46 46  al &= 0xFFFFFFFF
4810: 4c 55 3b 0a 09 09 72 65 74 76 61 6c 20 5e 3d 20  LU;...retval ^= 
4820: 64 69 66 66 3b 0a 0a 09 09 76 61 6c 75 65 2b 2b  diff;....value++
4830: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
4840: 72 65 74 76 61 6c 20 25 20 6d 6f 64 75 6c 75 73  retval % modulus
4850: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
4860: 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  l);.}../* Find a
4870: 20 6d 69 6d 65 2d 74 79 70 65 20 62 61 73 65 64   mime-type based
4880: 20 6f 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   on the filename
4890: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
48a0: 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 64 65 74   char *filed_det
48b0: 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28  ermine_mimetype(
48c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
48d0: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ) {..const char 
48e0: 2a 70 3b 0a 0a 09 70 20 3d 20 73 74 72 72 63 68  *p;...p = strrch
48f0: 72 28 70 61 74 68 2c 20 27 2e 27 29 3b 0a 09 69  r(path, '.');..i
4900: 66 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  f (p == NULL) {.
4910: 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44  ..return(FILED_D
4920: 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d  EFAULT_TYPE);..}
4930: 0a 0a 09 70 2b 2b 3b 0a 09 69 66 20 28 2a 70 20  ...p++;..if (*p 
4940: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74  == '\0') {...ret
4950: 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c  urn(FILED_DEFAUL
4960: 54 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 66 69  T_TYPE);..}...fi
4970: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
4980: 67 28 22 4c 6f 6f 6b 69 6e 67 20 75 70 20 4d 49  g("Looking up MI
4990: 4d 45 20 74 79 70 65 20 66 6f 72 20 25 73 20 28  ME type for %s (
49a0: 68 61 73 68 20 3d 20 25 6c 6c 75 29 22 2c 20 70  hash = %llu)", p
49b0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
49c0: 20 6c 6f 6e 67 29 20 66 69 6c 65 64 5f 68 61 73   long) filed_has
49d0: 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  h((const unsigne
49e0: 64 20 63 68 61 72 20 2a 29 20 70 2c 20 31 36 37  d char *) p, 167
49f0: 37 37 32 35 39 29 29 3b 0a 0a 23 69 6e 63 6c 75  77259));..#inclu
4a00: 64 65 20 22 66 69 6c 65 64 2d 6d 69 6d 65 2d 74  de "filed-mime-t
4a10: 79 70 65 73 2e 68 22 0a 0a 09 72 65 74 75 72 6e  ypes.h"...return
4a20: 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54  (FILED_DEFAULT_T
4a30: 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  YPE);.}../* Gene
4a40: 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 69 64  rate a unique id
4a50: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 73 74 61 74  entifier */.stat
4a60: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 67 65  ic void filed_ge
4a70: 6e 65 72 61 74 65 5f 65 74 61 67 28 63 68 61 72  nerate_etag(char
4a80: 20 2a 65 74 61 67 2c 20 73 69 7a 65 5f 74 20 6c   *etag, size_t l
4a90: 65 6e 67 74 68 29 20 7b 0a 09 73 6e 70 72 69 6e  ength) {..snprin
4aa0: 74 66 28 65 74 61 67 2c 20 6c 65 6e 67 74 68 2c  tf(etag, length,
4ab0: 20 22 25 6c 6c 78 2d 25 6c 6c 78 25 6c 6c 78 25   "%llx-%llx%llx%
4ac0: 6c 6c 78 25 6c 6c 78 22 2c 0a 09 09 28 75 6e 73  llx%llx",...(uns
4ad0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
4ae0: 20 74 69 6d 65 28 4e 55 4c 4c 29 2c 0a 09 09 28   time(NULL),...(
4af0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
4b00: 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09  ng) random(),...
4b10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
4b20: 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09  ong) random(),..
4b30: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
4b40: 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a  long) random(),.
4b50: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
4b60: 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 0a   long) random().
4b70: 09 29 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61  .);.}../* Open a
4b80: 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e   file and return
4b90: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
4ba0: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
4bb0: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
4bc0: 6f 20 2a 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69  o *filed_open_fi
4bd0: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  le(const char *p
4be0: 61 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65  ath, struct file
4bf0: 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 62 75 66 66  d_fileinfo *buff
4c00: 65 72 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69  er) {..struct fi
4c10: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 63 61  led_fileinfo *ca
4c20: 63 68 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  che;..unsigned i
4c30: 6e 74 20 63 61 63 68 65 5f 69 64 78 3b 0a 09 6f  nt cache_idx;..o
4c40: 66 66 5f 74 20 6c 65 6e 3b 0a 09 69 6e 74 20 66  ff_t len;..int f
4c50: 64 3b 0a 0a 09 63 61 63 68 65 5f 69 64 78 20 3d  d;...cache_idx =
4c60: 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f 6e   filed_hash((con
4c70: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4c80: 20 2a 29 20 70 61 74 68 2c 20 66 69 6c 65 64 5f   *) path, filed_
4c90: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
4ca0: 5f 73 69 7a 65 29 3b 0a 0a 09 63 61 63 68 65 20  _size);...cache 
4cb0: 3d 20 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  = &filed_fileinf
4cc0: 6f 5f 66 64 63 61 63 68 65 5b 63 61 63 68 65 5f  o_fdcache[cache_
4cd0: 69 64 78 5d 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f  idx];...filed_lo
4ce0: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f 63  g_msg_debug("Loc
4cf0: 6b 69 6e 67 20 6d 75 74 65 78 20 66 6f 72 20 69  king mutex for i
4d00: 64 78 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  dx: %lu", (unsig
4d10: 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f  ned long) cache_
4d20: 69 64 78 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f  idx);...pthread_
4d30: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63 68  mutex_lock(&cach
4d40: 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 66 69 6c  e->mutex);...fil
4d50: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
4d60: 28 22 43 6f 6d 70 6c 65 74 65 64 20 6c 6f 63 6b  ("Completed lock
4d70: 69 6e 67 20 6d 75 74 65 78 20 66 6f 72 20 69 64  ing mutex for id
4d80: 78 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  x: %lu", (unsign
4d90: 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69  ed long) cache_i
4da0: 64 78 29 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d  dx);...if (strcm
4db0: 70 28 70 61 74 68 2c 20 63 61 63 68 65 2d 3e 70  p(path, cache->p
4dc0: 61 74 68 29 20 21 3d 20 30 29 20 7b 0a 09 09 66  ath) != 0) {...f
4dd0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62  iled_log_msg_deb
4de0: 75 67 28 22 43 61 63 68 65 20 6d 69 73 73 20 66  ug("Cache miss f
4df0: 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20 4f 4c 44  or idx: %lu: OLD
4e00: 20 5c 22 25 73 5c 22 2c 20 4e 45 57 20 5c 22 25   \"%s\", NEW \"%
4e10: 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  s\"", (unsigned 
4e20: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 2c  long) cache_idx,
4e30: 20 63 61 63 68 65 2d 3e 70 61 74 68 2c 20 70 61   cache->path, pa
4e40: 74 68 29 3b 0a 0a 09 09 66 64 20 3d 20 6f 70 65  th);....fd = ope
4e50: 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59  n(path, O_RDONLY
4e60: 20 7c 20 4f 5f 4c 41 52 47 45 46 49 4c 45 29 3b   | O_LARGEFILE);
4e70: 0a 09 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b  ...if (fd < 0) {
4e80: 0a 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ....pthread_mute
4e90: 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d  x_unlock(&cache-
4ea0: 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 09 72 65 74  >mutex);.....ret
4eb0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a  urn(NULL);...}..
4ec0: 09 09 69 66 20 28 63 61 63 68 65 2d 3e 66 64 20  ..if (cache->fd 
4ed0: 3e 3d 20 30 29 20 7b 0a 09 09 09 63 6c 6f 73 65  >= 0) {....close
4ee0: 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09 7d  (cache->fd);...}
4ef0: 0a 0a 09 09 6c 65 6e 20 3d 20 6c 73 65 65 6b 28  ....len = lseek(
4f00: 66 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29  fd, 0, SEEK_END)
4f10: 3b 0a 09 09 6c 73 65 65 6b 28 66 64 2c 20 30 2c  ;...lseek(fd, 0,
4f20: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 09 09 63   SEEK_SET);....c
4f30: 61 63 68 65 2d 3e 66 64 20 3d 20 66 64 3b 0a 09  ache->fd = fd;..
4f40: 09 63 61 63 68 65 2d 3e 6c 65 6e 20 3d 20 6c 65  .cache->len = le
4f50: 6e 3b 0a 09 09 73 74 72 63 70 79 28 63 61 63 68  n;...strcpy(cach
4f60: 65 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b 0a  e->path, path);.
4f70: 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d 20  ..cache->type = 
4f80: 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65 5f  filed_determine_
4f90: 6d 69 6d 65 74 79 70 65 28 70 61 74 68 29 3b 0a  mimetype(path);.
4fa0: 09 09 66 69 6c 65 64 5f 67 65 6e 65 72 61 74 65  ..filed_generate
4fb0: 5f 65 74 61 67 28 63 61 63 68 65 2d 3e 65 74 61  _etag(cache->eta
4fc0: 67 2c 20 73 69 7a 65 6f 66 28 63 61 63 68 65 2d  g, sizeof(cache-
4fd0: 3e 65 74 61 67 29 29 3b 0a 0a 09 09 2f 2a 20 58  >etag));..../* X
4fe0: 58 58 3a 54 4f 44 4f 3a 20 44 65 74 65 72 6d 69  XX:TODO: Determi
4ff0: 6e 65 20 2a 2f 0a 09 09 63 61 63 68 65 2d 3e 6c  ne */...cache->l
5000: 61 73 74 6d 6f 64 20 3d 20 66 69 6c 65 64 5f 66  astmod = filed_f
5010: 6f 72 6d 61 74 5f 74 69 6d 65 28 63 61 63 68 65  ormat_time(cache
5020: 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20 73 69 7a  ->lastmod_b, siz
5030: 65 6f 66 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d  eof(cache->lastm
5040: 6f 64 5f 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c  od_b), time(NULL
5050: 29 20 2d 20 33 30 29 3b 0a 09 7d 20 65 6c 73 65  ) - 30);..} else
5060: 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d   {...filed_log_m
5070: 73 67 5f 64 65 62 75 67 28 22 43 61 63 68 65 20  sg_debug("Cache 
5080: 68 69 74 20 66 6f 72 20 69 64 78 3a 20 25 6c 75  hit for idx: %lu
5090: 3a 20 50 41 54 48 20 5c 22 25 73 5c 22 22 2c 20  : PATH \"%s\"", 
50a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
50b0: 63 61 63 68 65 5f 69 64 78 2c 20 70 61 74 68 29  cache_idx, path)
50c0: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65  ;..}.../*.. * We
50d0: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 20   have to make a 
50e0: 64 75 70 6c 69 63 61 74 65 20 46 44 2c 20 62 65  duplicate FD, be
50f0: 63 61 75 73 65 20 6f 6e 63 65 20 77 65 20 72 65  cause once we re
5100: 6c 65 61 73 65 20 74 68 65 20 63 61 63 68 65 0a  lease the cache.
5110: 09 20 2a 20 6d 75 74 65 78 2c 20 74 68 65 20 66  . * mutex, the f
5120: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
5130: 61 79 20 62 65 20 63 6c 6f 73 65 64 0a 09 20 2a  ay be closed.. *
5140: 2f 0a 09 66 64 20 3d 20 64 75 70 28 63 61 63 68  /..fd = dup(cach
5150: 65 2d 3e 66 64 29 3b 0a 09 69 66 20 28 66 64 20  e->fd);..if (fd 
5160: 3c 20 30 29 20 7b 0a 09 09 70 74 68 72 65 61 64  < 0) {...pthread
5170: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63  _mutex_unlock(&c
5180: 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09  ache->mutex);...
5190: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
51a0: 7d 0a 0a 09 62 75 66 66 65 72 2d 3e 66 64 20 3d  }...buffer->fd =
51b0: 20 66 64 3b 0a 09 62 75 66 66 65 72 2d 3e 6c 65   fd;..buffer->le
51c0: 6e 20 3d 20 63 61 63 68 65 2d 3e 6c 65 6e 3b 0a  n = cache->len;.
51d0: 09 62 75 66 66 65 72 2d 3e 74 79 70 65 20 3d 20  .buffer->type = 
51e0: 63 61 63 68 65 2d 3e 74 79 70 65 3b 0a 09 6d 65  cache->type;..me
51f0: 6d 63 70 79 28 62 75 66 66 65 72 2d 3e 6c 61 73  mcpy(buffer->las
5200: 74 6d 6f 64 5f 62 2c 20 63 61 63 68 65 2d 3e 6c  tmod_b, cache->l
5210: 61 73 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66  astmod_b, sizeof
5220: 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64  (buffer->lastmod
5230: 5f 62 29 29 3b 0a 09 6d 65 6d 63 70 79 28 62 75  _b));..memcpy(bu
5240: 66 66 65 72 2d 3e 65 74 61 67 2c 20 63 61 63 68  ffer->etag, cach
5250: 65 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66 28  e->etag, sizeof(
5260: 62 75 66 66 65 72 2d 3e 65 74 61 67 29 29 3b 0a  buffer->etag));.
5270: 09 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64  .buffer->lastmod
5280: 20 3d 20 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d   = buffer->lastm
5290: 6f 64 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e 6c  od_b + (cache->l
52a0: 61 73 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d 3e  astmod - cache->
52b0: 6c 61 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 70 74  lastmod_b);...pt
52c0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
52d0: 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78  ck(&cache->mutex
52e0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66  );...return(buff
52f0: 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f 63 65  er);.}../* Proce
5300: 73 73 20 61 6e 20 48 54 54 50 20 72 65 71 75 65  ss an HTTP reque
5310: 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  st and return th
5320: 65 20 70 61 74 68 20 72 65 71 75 65 73 74 65 64  e path requested
5330: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
5340: 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71  t filed_http_req
5350: 75 65 73 74 20 2a 66 69 6c 65 64 5f 67 65 74 5f  uest *filed_get_
5360: 68 74 74 70 5f 72 65 71 75 65 73 74 28 46 49 4c  http_request(FIL
5370: 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 66 69  E *fp, struct fi
5380: 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74  led_http_request
5390: 20 2a 62 75 66 66 65 72 5f 73 74 2c 20 73 74 72   *buffer_st, str
53a0: 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e  uct filed_option
53b0: 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09 63  s *options) {..c
53c0: 68 61 72 20 2a 6d 65 74 68 6f 64 2c 20 2a 70 61  har *method, *pa
53d0: 74 68 3b 0a 09 63 68 61 72 20 2a 62 75 66 66 65  th;..char *buffe
53e0: 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72 2c 20  r, *workbuffer, 
53f0: 2a 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74  *workbuffer_next
5400: 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73 5f 72  ;..char *fgets_r
5410: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66  et;..size_t buff
5420: 65 72 5f 6c 65 6e 2c 20 70 61 74 68 5f 6c 65 6e  er_len, path_len
5430: 3b 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65 5f 73  ;..off_t range_s
5440: 74 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e 64 2c  tart, range_end,
5450: 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 09   range_length;..
5460: 69 6e 74 20 72 61 6e 67 65 5f 72 65 71 75 65 73  int range_reques
5470: 74 3b 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74 66  t;..int snprintf
5480: 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09  _ret;..int i;...
5490: 2f 2a 20 53 65 74 20 74 6f 20 64 65 66 61 75 6c  /* Set to defaul
54a0: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 09 72 61 6e  t values */..ran
54b0: 67 65 5f 73 74 61 72 74 20 3d 20 30 3b 0a 09 72  ge_start = 0;..r
54c0: 61 6e 67 65 5f 65 6e 64 20 20 20 3d 20 30 3b 0a  ange_end   = 0;.
54d0: 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d  .range_request =
54e0: 20 30 3b 0a 09 72 61 6e 67 65 5f 6c 65 6e 67 74   0;..range_lengt
54f0: 68 20 3d 20 2d 31 3b 0a 09 62 75 66 66 65 72 5f  h = -1;..buffer_
5500: 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74  st->headers.host
5510: 2e 70 72 65 73 65 6e 74 20 3d 20 30 3b 0a 09 62  .present = 0;..b
5520: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
5530: 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 46  s.connection = F
5540: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
5550: 43 4c 4f 53 45 3b 0a 0a 09 62 75 66 66 65 72 20  CLOSE;...buffer 
5560: 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70  = buffer_st->tmp
5570: 62 75 66 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  buf;..buffer_len
5580: 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72   = sizeof(buffer
5590: 5f 73 74 2d 3e 74 6d 70 62 75 66 29 3b 0a 0a 09  _st->tmpbuf);...
55a0: 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74  fgets_ret = fget
55b0: 73 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  s(buffer, buffer
55c0: 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 69 66 20 28  _len, fp);..if (
55d0: 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c  fgets_ret == NUL
55e0: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55  L) {...return(NU
55f0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 6d 65 74 68 6f 64  LL);..}...method
5600: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75 66   = buffer;...buf
5610: 66 65 72 20 3d 20 73 74 72 63 68 72 28 62 75 66  fer = strchr(buf
5620: 66 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20 28  fer, ' ');..if (
5630: 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20  buffer == NULL) 
5640: 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  {...return(NULL)
5650: 3b 0a 09 7d 0a 0a 09 2a 62 75 66 66 65 72 20 3d  ;..}...*buffer =
5660: 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72 2b 2b   '\0';..buffer++
5670: 3b 0a 0a 09 70 61 74 68 20 3d 20 62 75 66 66 65  ;...path = buffe
5680: 72 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74  r;.../* Terminat
5690: 65 20 70 61 74 68 20 63 6f 6d 70 6f 6e 65 6e 74  e path component
56a0: 20 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20 73 74   */..buffer = st
56b0: 72 70 62 72 6b 28 70 61 74 68 2c 20 22 5c 72 5c  rpbrk(path, "\r\
56c0: 6e 20 22 29 3b 0a 09 69 66 20 28 62 75 66 66 65  n ");..if (buffe
56d0: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  r != NULL) {...*
56e0: 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09  buffer = '\0';..
56f0: 09 62 75 66 66 65 72 2b 2b 3b 0a 09 7d 0a 0a 09  .buffer++;..}...
5700: 2f 2a 20 57 65 20 6f 6e 6c 79 20 68 61 6e 64 6c  /* We only handl
5710: 65 20 74 68 65 20 22 47 45 54 22 20 61 6e 64 20  e the "GET" and 
5720: 22 48 45 41 44 27 20 6d 65 74 68 6f 64 73 20 2a  "HEAD' methods *
5730: 2f 0a 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  /..if (strcasecm
5740: 70 28 6d 65 74 68 6f 64 2c 20 22 68 65 61 64 22  p(method, "head"
5750: 29 20 21 3d 20 30 29 20 7b 0a 09 09 69 66 20 28  ) != 0) {...if (
5760: 73 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68 6f  strcasecmp(metho
5770: 64 2c 20 22 67 65 74 22 29 20 21 3d 20 30 29 20  d, "get") != 0) 
5780: 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  {....return(NULL
5790: 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 47 45 54  );...}..../* GET
57a0: 20 72 65 71 75 65 73 74 20 2a 2f 0a 09 09 62 75   request */...bu
57b0: 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f 64 20  ffer_st->method 
57c0: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
57d0: 4d 45 54 48 4f 44 5f 47 45 54 3b 0a 09 7d 20 65  METHOD_GET;..} e
57e0: 6c 73 65 20 7b 0a 09 09 2f 2a 20 48 45 41 44 20  lse {.../* HEAD 
57f0: 72 65 71 75 65 73 74 20 2a 2f 0a 09 09 62 75 66  request */...buf
5800: 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f 64 20 3d  fer_st->method =
5810: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
5820: 45 54 48 4f 44 5f 48 45 41 44 3b 0a 09 7d 0a 0a  ETHOD_HEAD;..}..
5830: 09 2f 2a 20 4e 6f 74 65 20 70 61 74 68 20 2a 2f  ./* Note path */
5840: 0a 09 70 61 74 68 5f 6c 65 6e 20 3d 20 73 74 72  ..path_len = str
5850: 6c 65 6e 28 70 61 74 68 29 3b 0a 09 6d 65 6d 63  len(path);..memc
5860: 70 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 70 61  py(buffer_st->pa
5870: 74 68 2c 20 70 61 74 68 2c 20 70 61 74 68 5f 6c  th, path, path_l
5880: 65 6e 20 2b 20 31 29 3b 0a 0a 09 2f 2a 20 44 65  en + 1);.../* De
5890: 74 65 72 6d 69 6e 65 20 74 79 70 65 20 6f 66 20  termine type of 
58a0: 72 65 71 75 65 73 74 20 66 72 6f 6d 20 70 61 74  request from pat
58b0: 68 20 2a 2f 0a 09 69 66 20 28 70 61 74 68 5f 6c  h */..if (path_l
58c0: 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 62 75 66  en == 0) {...buf
58d0: 66 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d 20 46  fer_st->type = F
58e0: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50  ILED_REQUEST_TYP
58f0: 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 7d 20  E_DIRECTORY;..} 
5900: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 70 61 74  else {...if (pat
5910: 68 5b 70 61 74 68 5f 6c 65 6e 20 2d 20 31 5d 20  h[path_len - 1] 
5920: 3d 3d 20 27 2f 27 29 20 7b 0a 09 09 09 62 75 66  == '/') {....buf
5930: 66 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d 20 46  fer_st->type = F
5940: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50  ILED_REQUEST_TYP
5950: 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 09 7d  E_DIRECTORY;...}
5960: 20 65 6c 73 65 20 7b 0a 09 09 09 62 75 66 66 65   else {....buffe
5970: 72 5f 73 74 2d 3e 74 79 70 65 20 3d 20 46 49 4c  r_st->type = FIL
5980: 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f  ED_REQUEST_TYPE_
5990: 4f 54 48 45 52 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  OTHER;...}..}...
59a0: 2f 2a 20 52 65 73 65 74 20 62 75 66 66 65 72 20  /* Reset buffer 
59b0: 66 6f 72 20 6c 61 74 65 72 20 75 73 65 20 2a 2f  for later use */
59c0: 0a 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65  ..buffer = buffe
59d0: 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 0a 09  r_st->tmpbuf;...
59e0: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
59f0: 31 30 30 3b 20 69 2b 2b 29 20 7b 0a 09 09 66 67  100; i++) {...fg
5a00: 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28  ets_ret = fgets(
5a10: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c  buffer, buffer_l
5a20: 65 6e 2c 20 66 70 29 3b 0a 09 09 69 66 20 28 66  en, fp);...if (f
5a30: 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c  gets_ret == NULL
5a40: 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ) {....break;...
5a50: 7d 0a 0a 09 09 69 66 20 28 73 74 72 6e 63 61 73  }....if (strncas
5a60: 65 63 6d 70 28 62 75 66 66 65 72 2c 20 22 52 61  ecmp(buffer, "Ra
5a70: 6e 67 65 3a 20 22 2c 20 37 29 20 3d 3d 20 30 29  nge: ", 7) == 0)
5a80: 20 7b 0a 09 09 09 77 6f 72 6b 62 75 66 66 65 72   {....workbuffer
5a90: 20 3d 20 62 75 66 66 65 72 20 2b 20 37 3b 0a 0a   = buffer + 7;..
5aa0: 09 09 09 69 66 20 28 73 74 72 6e 63 61 73 65 63  ...if (strncasec
5ab0: 6d 70 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 22  mp(workbuffer, "
5ac0: 62 79 74 65 73 3d 22 2c 20 36 29 20 3d 3d 20 30  bytes=", 6) == 0
5ad0: 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75 66 66  ) {.....workbuff
5ae0: 65 72 20 2b 3d 20 36 3b 0a 0a 09 09 09 09 72 61  er += 6;......ra
5af0: 6e 67 65 5f 72 65 71 75 65 73 74 20 3d 20 31 3b  nge_request = 1;
5b00: 0a 0a 09 09 09 09 72 61 6e 67 65 5f 73 74 61 72  ......range_star
5b10: 74 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72  t = strtoull(wor
5b20: 6b 62 75 66 66 65 72 2c 20 26 77 6f 72 6b 62 75  kbuffer, &workbu
5b30: 66 66 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a  ffer_next, 10);.
5b40: 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20  .....workbuffer 
5b50: 3d 20 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78  = workbuffer_nex
5b60: 74 3b 0a 0a 09 09 09 09 69 66 20 28 2a 77 6f 72  t;......if (*wor
5b70: 6b 62 75 66 66 65 72 20 3d 3d 20 27 2d 27 29 20  kbuffer == '-') 
5b80: 7b 0a 09 09 09 09 09 77 6f 72 6b 62 75 66 66 65  {......workbuffe
5b90: 72 2b 2b 3b 0a 0a 09 09 09 09 09 69 66 20 28 2a  r++;.......if (*
5ba0: 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 27 5c  workbuffer != '\
5bb0: 72 27 20 26 26 20 2a 77 6f 72 6b 62 75 66 66 65  r' && *workbuffe
5bc0: 72 20 21 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 09  r != '\n') {....
5bd0: 09 09 09 72 61 6e 67 65 5f 65 6e 64 20 3d 20 73  ...range_end = s
5be0: 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75 66 66  trtoull(workbuff
5bf0: 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65 72 5f  er, &workbuffer_
5c00: 6e 65 78 74 2c 20 31 30 29 3b 0a 09 09 09 09 09  next, 10);......
5c10: 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  }.....}....}...}
5c20: 20 65 6c 73 65 20 69 66 20 28 73 74 72 6e 63 61   else if (strnca
5c30: 73 65 63 6d 70 28 62 75 66 66 65 72 2c 20 22 48  secmp(buffer, "H
5c40: 6f 73 74 3a 20 22 2c 20 35 29 20 3d 3d 20 30 29  ost: ", 5) == 0)
5c50: 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 73 74 2d   {....buffer_st-
5c60: 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 70 72  >headers.host.pr
5c70: 65 73 65 6e 74 20 3d 20 31 3b 0a 0a 09 09 09 77  esent = 1;.....w
5c80: 6f 72 6b 62 75 66 66 65 72 20 3d 20 73 74 72 70  orkbuffer = strp
5c90: 62 72 6b 28 62 75 66 66 65 72 20 2b 20 35 2c 20  brk(buffer + 5, 
5ca0: 22 5c 72 5c 6e 3a 22 29 3b 0a 09 09 09 69 66 20  "\r\n:");....if 
5cb0: 28 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 4e  (workbuffer != N
5cc0: 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 77 6f 72 6b  ULL) {.....*work
5cd0: 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09  buffer = '\0';..
5ce0: 09 09 7d 0a 0a 09 09 09 77 6f 72 6b 62 75 66 66  ..}.....workbuff
5cf0: 65 72 20 3d 20 62 75 66 66 65 72 20 2b 20 35 3b  er = buffer + 5;
5d00: 0a 09 09 09 77 68 69 6c 65 20 28 2a 77 6f 72 6b  ....while (*work
5d10: 62 75 66 66 65 72 20 3d 3d 20 27 20 27 29 20 7b  buffer == ' ') {
5d20: 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72 2b  .....workbuffer+
5d30: 2b 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 74 72 63  +;....}.....strc
5d40: 70 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  py(buffer_st->he
5d50: 61 64 65 72 73 2e 68 6f 73 74 2e 68 6f 73 74 2c  aders.host.host,
5d60: 20 77 6f 72 6b 62 75 66 66 65 72 29 3b 0a 09 09   workbuffer);...
5d70: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 6e 63  } else if (strnc
5d80: 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c 20 22  asecmp(buffer, "
5d90: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 4b 65 65 70  Connection: Keep
5da0: 2d 41 6c 69 76 65 22 2c 20 32 32 29 20 3d 3d 20  -Alive", 22) == 
5db0: 30 29 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 73  0) {....buffer_s
5dc0: 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65  t->headers.conne
5dd0: 63 74 69 6f 6e 20 3d 20 46 49 4c 45 44 5f 43 4f  ction = FILED_CO
5de0: 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c  NNECTION_KEEP_AL
5df0: 49 56 45 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IVE;...}....if (
5e00: 6d 65 6d 63 6d 70 28 62 75 66 66 65 72 2c 20 22  memcmp(buffer, "
5e10: 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d 20 30 29 20  \r\n", 2) == 0) 
5e20: 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  {....break;...}.
5e30: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
5e40: 65 20 72 61 6e 67 65 20 2a 2f 0a 09 69 66 20 28  e range */..if (
5e50: 72 61 6e 67 65 5f 65 6e 64 20 21 3d 20 30 29 20  range_end != 0) 
5e60: 7b 0a 09 09 69 66 20 28 72 61 6e 67 65 5f 65 6e  {...if (range_en
5e70: 64 20 3c 3d 20 72 61 6e 67 65 5f 73 74 61 72 74  d <= range_start
5e80: 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55  ) {....return(NU
5e90: 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 72 61 6e 67  LL);...}....rang
5ea0: 65 5f 6c 65 6e 67 74 68 20 3d 20 72 61 6e 67 65  e_length = range
5eb0: 5f 65 6e 64 20 2d 20 72 61 6e 67 65 5f 73 74 61  _end - range_sta
5ec0: 72 74 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  rt;....filed_log
5ed0: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70  _msg_debug("Comp
5ee0: 75 74 69 6e 67 20 6c 65 6e 67 74 68 20 70 61 72  uting length par
5ef0: 61 6d 65 74 65 72 3a 20 25 6c 6c 75 20 3d 20 25  ameter: %llu = %
5f00: 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c 0a 09 09 09  llu - %llu",....
5f10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
5f20: 6f 6e 67 29 20 72 61 6e 67 65 5f 6c 65 6e 67 74  ong) range_lengt
5f30: 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20  h,....(unsigned 
5f40: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65  long long) range
5f50: 5f 65 6e 64 2c 0a 09 09 09 28 75 6e 73 69 67 6e  _end,....(unsign
5f60: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61  ed long long) ra
5f70: 6e 67 65 5f 73 74 61 72 74 0a 09 09 29 3b 0a 09  nge_start...);..
5f80: 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20 75 70 20 73  }.../* Fill up s
5f90: 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 74 75  tructure to retu
5fa0: 72 6e 20 2a 2f 0a 09 62 75 66 66 65 72 5f 73 74  rn */..buffer_st
5fb0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
5fc0: 70 72 65 73 65 6e 74 20 3d 20 72 61 6e 67 65 5f  present = range_
5fd0: 72 65 71 75 65 73 74 3b 0a 09 62 75 66 66 65 72  request;..buffer
5fe0: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  _st->headers.ran
5ff0: 67 65 2e 6f 66 66 73 65 74 20 20 3d 20 72 61 6e  ge.offset  = ran
6000: 67 65 5f 73 74 61 72 74 3b 0a 09 62 75 66 66 65  ge_start;..buffe
6010: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  r_st->headers.ra
6020: 6e 67 65 2e 6c 65 6e 67 74 68 20 20 3d 20 72 61  nge.length  = ra
6030: 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 0a 09 2f 2a  nge_length;.../*
6040: 20 49 66 20 76 68 6f 73 74 73 20 61 72 65 20 65   If vhosts are e
6050: 6e 61 62 6c 65 64 2c 20 63 6f 6d 70 75 74 65 20  nabled, compute 
6060: 6e 65 77 20 70 61 74 68 20 2a 2f 0a 09 69 66 20  new path */..if 
6070: 28 6f 70 74 69 6f 6e 73 2d 3e 76 68 6f 73 74 73  (options->vhosts
6080: 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 69 66  _enabled) {...if
6090: 20 28 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61   (buffer_st->hea
60a0: 64 65 72 73 2e 68 6f 73 74 2e 70 72 65 73 65 6e  ders.host.presen
60b0: 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 62 75 66  t == 1) {....buf
60c0: 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d  fer = buffer_st-
60d0: 3e 74 6d 70 62 75 66 3b 0a 09 09 09 62 75 66 66  >tmpbuf;....buff
60e0: 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  er_len = sizeof(
60f0: 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75  buffer_st->tmpbu
6100: 66 29 3b 0a 0a 09 09 09 73 6e 70 72 69 6e 74 66  f);.....snprintf
6110: 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74 66 28  _ret = snprintf(
6120: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c  buffer, buffer_l
6130: 65 6e 2c 20 22 2f 25 73 25 73 25 73 22 2c 0a 09  en, "/%s%s%s",..
6140: 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  ...buffer_st->he
6150: 61 64 65 72 73 2e 68 6f 73 74 2e 68 6f 73 74 2c  aders.host.host,
6160: 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  .....buffer_st->
6170: 70 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 20 3f  path[0] == '/' ?
6180: 20 22 22 20 3a 20 22 2f 22 2c 0a 09 09 09 09 62   "" : "/",.....b
6190: 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 0a 09  uffer_st->path..
61a0: 09 09 29 3b 0a 09 09 09 69 66 20 28 73 6e 70 72  ..);....if (snpr
61b0: 69 6e 74 66 5f 72 65 74 20 3e 3d 20 30 29 20 7b  intf_ret >= 0) {
61c0: 0a 09 09 09 09 69 66 20 28 28 28 75 6e 73 69 67  .....if (((unsig
61d0: 6e 65 64 20 69 6e 74 29 20 73 6e 70 72 69 6e 74  ned int) snprint
61e0: 66 5f 72 65 74 29 20 3c 20 62 75 66 66 65 72 5f  f_ret) < buffer_
61f0: 6c 65 6e 29 20 7b 0a 09 09 09 09 09 73 74 72 63  len) {......strc
6200: 70 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 70 61  py(buffer_st->pa
6210: 74 68 2c 20 62 75 66 66 65 72 29 3b 0a 09 09 09  th, buffer);....
6220: 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  .}....}...}..}..
6230: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 73  .return(buffer_s
6240: 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  t);.}../* Return
6250: 20 61 6e 20 65 72 72 6f 72 20 70 61 67 65 20 2a   an error page *
6260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
6270: 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 46  led_error_page(F
6280: 49 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20 63  ILE *fp, const c
6290: 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e  har *date_curren
62a0: 74 2c 20 69 6e 74 20 65 72 72 6f 72 5f 6e 75 6d  t, int error_num
62b0: 62 65 72 2c 20 69 6e 74 20 6d 65 74 68 6f 64 2c  ber, int method,
62c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61   const char *rea
62d0: 73 6f 6e 2c 20 73 74 72 75 63 74 20 66 69 6c 65  son, struct file
62e0: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67  d_log_entry *log
62f0: 29 20 7b 0a 09 63 68 61 72 20 2a 65 72 72 6f 72  ) {..char *error
6300: 5f 73 74 72 69 6e 67 20 3d 20 22 3c 68 74 6d 6c  _string = "<html
6310: 3e 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 45 52  ><head><title>ER
6320: 52 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61  ROR</title></hea
6330: 64 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c 65 20 74  d><body>Unable t
6340: 6f 20 70 72 6f 63 65 73 73 20 72 65 71 75 65 73  o process reques
6350: 74 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c 3e 22  t</body></html>"
6360: 3b 0a 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20  ;...fprintf(fp, 
6370: 22 48 54 54 50 2f 31 2e 31 20 25 69 20 4e 6f 74  "HTTP/1.1 %i Not
6380: 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c   OK\r\nDate: %s\
6390: 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64  r\nServer: filed
63a0: 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65  \r\nLast-Modifie
63b0: 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74  d: %s\r\nContent
63c0: 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c  -Length: %llu\r\
63d0: 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25  nContent-Type: %
63e0: 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a  s\r\nConnection:
63f0: 20 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c 6e 22 2c   close\r\n\r\n",
6400: 0a 09 09 65 72 72 6f 72 5f 6e 75 6d 62 65 72 2c  ...error_number,
6410: 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
6420: 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
6430: 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
6440: 67 20 6c 6f 6e 67 29 20 73 74 72 6c 65 6e 28 65  g long) strlen(e
6450: 72 72 6f 72 5f 73 74 72 69 6e 67 29 2c 0a 09 09  rror_string),...
6460: 22 74 65 78 74 2f 68 74 6d 6c 22 0a 09 29 3b 0a  "text/html"..);.
6470: 0a 09 2f 2a 20 73 69 6c 65 6e 63 65 20 65 72 72  ../* silence err
6480: 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20 48 45  or string for HE
6490: 41 44 20 72 65 71 75 65 73 74 73 20 2a 2f 0a 09  AD requests */..
64a0: 69 66 20 28 6d 65 74 68 6f 64 20 21 3d 20 46 49  if (method != FI
64b0: 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48  LED_REQUEST_METH
64c0: 4f 44 5f 48 45 41 44 29 20 7b 0a 09 09 66 70 72  OD_HEAD) {...fpr
64d0: 69 6e 74 66 28 66 70 2c 20 22 25 73 22 2c 20 65  intf(fp, "%s", e
64e0: 72 72 6f 72 5f 73 74 72 69 6e 67 29 3b 0a 09 7d  rror_string);..}
64f0: 0a 0a 09 2f 2a 20 4c 6f 67 20 65 72 72 6f 72 20  .../* Log error 
6500: 2a 2f 0a 09 2f 2a 2a 20 72 65 61 73 6f 6e 20 6d  */../** reason m
6510: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 67  ust point to a g
6520: 6c 6f 62 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  lobally allocate
6530: 64 20 76 61 6c 75 65 20 2a 2a 2f 0a 09 6c 6f 67  d value **/..log
6540: 2d 3e 72 65 61 73 6f 6e 20 3d 20 72 65 61 73 6f  ->reason = reaso
6550: 6e 3b 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f  n;..log->http_co
6560: 64 65 20 3d 20 65 72 72 6f 72 5f 6e 75 6d 62 65  de = error_numbe
6570: 72 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65  r;...filed_log_e
6580: 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 2f 2a 20  ntry(log);.../* 
6590: 43 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Close connection
65a0: 20 2a 2f 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65   */..filed_socke
65b0: 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65 28 66  ttimeout_close(f
65c0: 69 6c 65 6e 6f 28 66 70 29 29 3b 0a 0a 09 66 63  ileno(fp));...fc
65d0: 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65 74 75  lose(fp);...retu
65e0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  rn;.}../* Return
65f0: 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 69   a redirect to i
6600: 6e 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 73 74 61  ndex.html */.sta
6610: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 72  tic void filed_r
6620: 65 64 69 72 65 63 74 5f 69 6e 64 65 78 28 46 49  edirect_index(FI
6630: 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20 63 68  LE *fp, const ch
6640: 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74  ar *date_current
6650: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
6660: 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  th, struct filed
6670: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 29  _log_entry *log)
6680: 20 7b 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64   {..int http_cod
6690: 65 20 3d 20 33 30 31 3b 0a 09 66 70 72 69 6e 74  e = 301;..fprint
66a0: 66 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20  f(fp, "HTTP/1.1 
66b0: 25 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25  %i OK\r\nDate: %
66c0: 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c  s\r\nServer: fil
66d0: 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66  ed\r\nLast-Modif
66e0: 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65  ied: %s\r\nConte
66f0: 6e 74 2d 4c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e  nt-Length: 0\r\n
6700: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73  Connection: clos
6710: 65 5c 72 5c 6e 4c 6f 63 61 74 69 6f 6e 3a 20 25  e\r\nLocation: %
6720: 73 5c 72 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 68 74  s\r\n\r\n",...ht
6730: 74 70 5f 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f  tp_code,...date_
6740: 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f  current,...date_
6750: 63 75 72 72 65 6e 74 2c 0a 09 09 22 69 6e 64 65  current,..."inde
6760: 78 2e 68 74 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a  x.html"..);.../*
6770: 20 4c 6f 67 20 72 65 64 69 72 65 63 74 20 2a 2f   Log redirect */
6780: 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20  ..log->reason = 
6790: 22 72 65 64 69 72 65 63 74 22 3b 0a 09 6c 6f 67  "redirect";..log
67a0: 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 68 74  ->http_code = ht
67b0: 74 70 5f 63 6f 64 65 3b 0a 0a 09 66 69 6c 65 64  tp_code;...filed
67c0: 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b  _log_entry(log);
67d0: 0a 0a 09 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e  .../* Close conn
67e0: 65 63 74 69 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64  ection */..filed
67f0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63  _sockettimeout_c
6800: 6c 6f 73 65 28 66 69 6c 65 6e 6f 28 66 70 29 29  lose(fileno(fp))
6810: 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a  ;...fclose(fp);.
6820: 0a 09 72 65 74 75 72 6e 3b 0a 0a 09 2f 2a 20 43  ..return;.../* C
6830: 75 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64 3a  urrently unused:
6840: 20 70 61 74 68 20 2a 2f 0a 09 70 61 74 68 20 3d   path */..path =
6850: 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e   path;.}../* Con
6860: 76 65 72 74 20 61 6e 20 65 6e 75 6d 20 72 65 70  vert an enum rep
6870: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 22 43  resenting the "C
6880: 6f 6e 6e 65 63 74 69 6f 6e 22 20 68 65 61 64 65  onnection" heade
6890: 72 20 76 61 6c 75 65 20 74 6f 20 61 20 73 74 72  r value to a str
68a0: 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ing */.static co
68b0: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 64 5f  nst char *filed_
68c0: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 72 28 69  connection_str(i
68d0: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 5f 76 61  nt connection_va
68e0: 6c 75 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  lue) {..switch (
68f0: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 76 61 6c 75 65  connection_value
6900: 29 20 7b 0a 09 09 63 61 73 65 20 46 49 4c 45 44  ) {...case FILED
6910: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53  _CONNECTION_CLOS
6920: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 63 6c  E:....return("cl
6930: 6f 73 65 22 29 3b 0a 09 09 63 61 73 65 20 46 49  ose");...case FI
6940: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b  LED_CONNECTION_K
6950: 45 45 50 5f 41 4c 49 56 45 3a 0a 09 09 09 72 65  EEP_ALIVE:....re
6960: 74 75 72 6e 28 22 6b 65 65 70 2d 61 6c 69 76 65  turn("keep-alive
6970: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
6980: 22 63 6c 6f 73 65 22 29 3b 0a 7d 0a 0a 2f 2a 20  "close");.}../* 
6990: 48 61 6e 64 6c 65 20 61 20 73 69 6e 67 6c 65 20  Handle a single 
69a0: 72 65 71 75 65 73 74 20 66 72 6f 6d 20 61 20 63  request from a c
69b0: 6c 69 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20  lient */.static 
69c0: 69 6e 74 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65  int filed_handle
69d0: 5f 63 6c 69 65 6e 74 28 69 6e 74 20 66 64 2c 20  _client(int fd, 
69e0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74  struct filed_htt
69f0: 70 5f 72 65 71 75 65 73 74 20 2a 72 65 71 75 65  p_request *reque
6a00: 73 74 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  st, struct filed
6a10: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 2c  _log_entry *log,
6a20: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70   struct filed_op
6a30: 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20  tions *options) 
6a40: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
6a50: 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 69 6e  fileinfo *filein
6a60: 66 6f 3b 0a 09 73 73 69 7a 65 5f 74 20 73 65 6e  fo;..ssize_t sen
6a70: 64 66 69 6c 65 5f 72 65 74 3b 0a 09 73 69 7a 65  dfile_ret;..size
6a80: 5f 74 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  _t sendfile_size
6a90: 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 64 66 69 6c  ;..off_t sendfil
6aa0: 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e 64 66 69  e_offset, sendfi
6ab0: 6c 65 5f 73 65 6e 74 2c 20 73 65 6e 64 66 69 6c  le_sent, sendfil
6ac0: 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 70 61  e_len;..char *pa
6ad0: 74 68 3b 0a 09 63 68 61 72 20 2a 64 61 74 65 5f  th;..char *date_
6ae0: 63 75 72 72 65 6e 74 2c 20 64 61 74 65 5f 63 75  current, date_cu
6af0: 72 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a 09 69 6e  rrent_b[64];..in
6b00: 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09 46 49  t http_code;..FI
6b10: 4c 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20 44 65 74  LE *fp;.../* Det
6b20: 65 72 6d 69 6e 65 20 63 75 72 72 65 6e 74 20 74  ermine current t
6b30: 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f 63 75 72  ime */..date_cur
6b40: 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f 66 6f 72  rent = filed_for
6b50: 6d 61 74 5f 74 69 6d 65 28 64 61 74 65 5f 63 75  mat_time(date_cu
6b60: 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65 6f 66 28  rrent_b, sizeof(
6b70: 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62 29 2c  date_current_b),
6b80: 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b 0a 0a 09   time(NULL));...
6b90: 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65 74 20 61  /* Open socket a
6ba0: 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f 72 20 65  s ANSI I/O for e
6bb0: 61 73 65 20 6f 66 20 75 73 65 20 2a 2f 0a 09 66  ase of use */..f
6bc0: 70 20 3d 20 66 64 6f 70 65 6e 28 66 64 2c 20 22  p = fdopen(fd, "
6bd0: 77 2b 62 22 29 3b 0a 09 69 66 20 28 66 70 20 3d  w+b");..if (fp =
6be0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65  = NULL) {...file
6bf0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
6c00: 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 63 6c  close(fd);....cl
6c10: 6f 73 65 28 66 64 29 3b 0a 0a 09 09 6c 6f 67 2d  ose(fd);....log-
6c20: 3e 62 75 66 66 65 72 5b 30 5d 20 3d 20 27 5c 30  >buffer[0] = '\0
6c30: 27 3b 0a 09 09 6c 6f 67 2d 3e 68 74 74 70 5f 63  ';...log->http_c
6c40: 6f 64 65 20 3d 20 2d 31 3b 0a 09 09 6c 6f 67 2d  ode = -1;...log-
6c50: 3e 72 65 61 73 6f 6e 20 3d 20 22 66 64 6f 70 65  >reason = "fdope
6c60: 6e 5f 66 61 69 6c 65 64 22 3b 0a 0a 09 09 66 69  n_failed";....fi
6c70: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f  led_log_entry(lo
6c80: 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49  g);....return(FI
6c90: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43  LED_CONNECTION_C
6ca0: 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09 72 65 71 75  LOSE);..}...requ
6cb0: 65 73 74 20 3d 20 66 69 6c 65 64 5f 67 65 74 5f  est = filed_get_
6cc0: 68 74 74 70 5f 72 65 71 75 65 73 74 28 66 70 2c  http_request(fp,
6cd0: 20 72 65 71 75 65 73 74 2c 20 6f 70 74 69 6f 6e   request, option
6ce0: 73 29 3b 0a 0a 09 69 66 20 28 72 65 71 75 65 73  s);...if (reques
6cf0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c  t == NULL) {...l
6d00: 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d 20  og->buffer[0] = 
6d10: 27 5c 30 27 3b 0a 0a 09 09 66 69 6c 65 64 5f 65  '\0';....filed_e
6d20: 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64 61  rror_page(fp, da
6d30: 74 65 5f 63 75 72 72 65 6e 74 2c 20 35 30 30 2c  te_current, 500,
6d40: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
6d50: 45 54 48 4f 44 5f 47 45 54 2c 20 22 66 6f 72 6d  ETHOD_GET, "form
6d60: 61 74 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72 65  at", log);....re
6d70: 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45  turn(FILED_CONNE
6d80: 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d  CTION_CLOSE);..}
6d90: 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ...filed_sockett
6da0: 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e  imeout_processin
6db0: 67 5f 73 74 61 72 74 28 66 64 29 3b 0a 0a 09 70  g_start(fd);...p
6dc0: 61 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 70  ath = request->p
6dd0: 61 74 68 3b 0a 09 73 74 72 63 70 79 28 6c 6f 67  ath;..strcpy(log
6de0: 2d 3e 62 75 66 66 65 72 2c 20 70 61 74 68 29 3b  ->buffer, path);
6df0: 0a 09 6c 6f 67 2d 3e 6d 65 74 68 6f 64 20 3d 20  ..log->method = 
6e00: 72 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 3b  request->method;
6e10: 0a 0a 09 2f 2a 20 49 66 20 74 68 65 20 72 65 71  .../* If the req
6e20: 75 65 73 74 65 64 20 70 61 74 68 20 69 73 20 61  uested path is a
6e30: 20 64 69 72 65 63 74 6f 72 79 2c 20 72 65 64 69   directory, redi
6e40: 72 65 63 74 20 74 6f 20 69 6e 64 65 78 20 70 61  rect to index pa
6e50: 67 65 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  ge */..if (reque
6e60: 73 74 2d 3e 74 79 70 65 20 3d 3d 20 46 49 4c 45  st->type == FILE
6e70: 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 44  D_REQUEST_TYPE_D
6e80: 49 52 45 43 54 4f 52 59 29 20 7b 0a 09 09 66 69  IRECTORY) {...fi
6e90: 6c 65 64 5f 72 65 64 69 72 65 63 74 5f 69 6e 64  led_redirect_ind
6ea0: 65 78 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72  ex(fp, date_curr
6eb0: 65 6e 74 2c 20 70 61 74 68 2c 20 6c 6f 67 29 3b  ent, path, log);
6ec0: 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44  ....return(FILED
6ed0: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53  _CONNECTION_CLOS
6ee0: 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 69 6e 66  E);..}...fileinf
6ef0: 6f 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66  o = filed_open_f
6f00: 69 6c 65 28 70 61 74 68 2c 20 26 72 65 71 75 65  ile(path, &reque
6f10: 73 74 2d 3e 66 69 6c 65 69 6e 66 6f 29 3b 0a 09  st->fileinfo);..
6f20: 69 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d 3d 20  if (fileinfo == 
6f30: 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64 5f  NULL) {...filed_
6f40: 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64  error_page(fp, d
6f50: 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 30 34  ate_current, 404
6f60: 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f  , request->metho
6f70: 64 2c 20 22 6f 70 65 6e 5f 66 61 69 6c 65 64 22  d, "open_failed"
6f80: 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72 65 74 75 72  , log);....retur
6f90: 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49  n(FILED_CONNECTI
6fa0: 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09  ON_CLOSE);..}...
6fb0: 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61  if (request->hea
6fc0: 64 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65  ders.range.prese
6fd0: 6e 74 29 20 7b 0a 09 09 69 66 20 28 72 65 71 75  nt) {...if (requ
6fe0: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
6ff0: 67 65 2e 6f 66 66 73 65 74 20 21 3d 20 30 20 7c  ge.offset != 0 |
7000: 7c 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  | request->heade
7010: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
7020: 3e 3d 20 30 29 20 7b 0a 09 09 09 69 66 20 28 72  >= 0) {....if (r
7030: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
7040: 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3e 3d 20  range.offset >= 
7050: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 29 20 7b  fileinfo->len) {
7060: 0a 09 09 09 09 66 69 6c 65 64 5f 65 72 72 6f 72  .....filed_error
7070: 5f 70 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63  _page(fp, date_c
7080: 75 72 72 65 6e 74 2c 20 34 31 36 2c 20 72 65 71  urrent, 416, req
7090: 75 65 73 74 2d 3e 6d 65 74 68 6f 64 2c 20 22 72  uest->method, "r
70a0: 61 6e 67 65 5f 69 6e 76 61 6c 69 64 22 2c 20 6c  ange_invalid", l
70b0: 6f 67 29 3b 0a 0a 09 09 09 09 63 6c 6f 73 65 28  og);......close(
70c0: 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a 0a  fileinfo->fd);..
70d0: 09 09 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44  ....return(FILED
70e0: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53  _CONNECTION_CLOS
70f0: 45 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  E);....}.....if 
7100: 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72  (request->header
7110: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d  s.range.length =
7120: 3d 20 28 28 6f 66 66 5f 74 29 20 2d 31 29 29 20  = ((off_t) -1)) 
7130: 7b 0a 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  {.....filed_log_
7140: 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75  msg_debug("Compu
7150: 74 69 6e 67 20 6c 65 6e 67 74 68 20 74 6f 20 66  ting length to f
7160: 69 74 20 69 6e 20 62 6f 75 6e 64 73 3a 20 66 69  it in bounds: fi
7170: 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 3d 20 25 6c  leinfo->len = %l
7180: 6c 75 2c 20 72 65 71 75 65 73 74 2d 3e 68 65 61  lu, request->hea
7190: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
71a0: 74 20 3d 20 25 6c 6c 75 22 2c 0a 09 09 09 09 09  t = %llu",......
71b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
71c0: 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  ong) fileinfo->l
71d0: 65 6e 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e  en,......(unsign
71e0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65  ed long long) re
71f0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
7200: 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09 09 09  ange.offset.....
7210: 29 3b 0a 0a 09 09 09 09 72 65 71 75 65 73 74 2d  );......request-
7220: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
7230: 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f  ength = fileinfo
7240: 2d 3e 6c 65 6e 20 2d 20 72 65 71 75 65 73 74 2d  ->len - request-
7250: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
7260: 66 66 73 65 74 3b 0a 09 09 09 7d 0a 0a 09 09 09  ffset;....}.....
7270: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
7280: 62 75 67 28 22 50 61 72 74 69 61 6c 20 72 65 71  bug("Partial req
7290: 75 65 73 74 2c 20 73 74 61 72 74 69 6e 67 20 61  uest, starting a
72a0: 74 3a 20 25 6c 6c 75 20 61 6e 64 20 72 75 6e 6e  t: %llu and runn
72b0: 69 6e 67 20 66 6f 72 20 25 6c 6c 69 20 62 79 74  ing for %lli byt
72c0: 65 73 22 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e  es",.....(unsign
72d0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65  ed long long) re
72e0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
72f0: 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09 09 09  ange.offset,....
7300: 09 28 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  .(long long) req
7310: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
7320: 6e 67 65 2e 6c 65 6e 67 74 68 0a 09 09 09 29 3b  nge.length....);
7330: 0a 0a 09 09 7d 0a 0a 09 09 68 74 74 70 5f 63 6f  ....}....http_co
7340: 64 65 20 3d 20 32 30 36 3b 0a 09 7d 20 65 6c 73  de = 206;..} els
7350: 65 20 7b 0a 09 09 68 74 74 70 5f 63 6f 64 65 20  e {...http_code 
7360: 3d 20 32 30 30 3b 0a 0a 09 09 2f 2a 20 43 6f 6d  = 200;..../* Com
7370: 70 75 74 65 20 66 61 6b 65 20 72 61 6e 67 65 20  pute fake range 
7380: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
7390: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 65 6e 74  includes the ent
73a0: 69 72 65 20 66 69 6c 65 20 2a 2f 0a 09 09 72 65  ire file */...re
73b0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
73c0: 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20 30 3b  ange.offset = 0;
73d0: 0a 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64  ...request->head
73e0: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
73f0: 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e   = fileinfo->len
7400: 3b 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28 66  ;..}...fprintf(f
7410: 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69 20  p, "HTTP/1.1 %i 
7420: 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c 72  OK\r\nDate: %s\r
7430: 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64 5c  \nServer: filed\
7440: 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64  r\nLast-Modified
7450: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d  : %s\r\nContent-
7460: 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c 6e  Length: %llu\r\n
7470: 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a 20 62  Accept-Ranges: b
7480: 79 74 65 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d  ytes\r\nContent-
7490: 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e  Type: %s\r\nConn
74a0: 65 63 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 45 54  ection: %s\r\nET
74b0: 61 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c  ag: \"%s\"\r\n",
74c0: 0a 09 09 68 74 74 70 5f 63 6f 64 65 2c 0a 09 09  ...http_code,...
74d0: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09  date_current,...
74e0: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 61 73 74 6d 6f  fileinfo->lastmo
74f0: 64 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  d,...(unsigned l
7500: 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73  ong long) reques
7510: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
7520: 2e 6c 65 6e 67 74 68 2c 0a 09 09 66 69 6c 65 69  .length,...filei
7530: 6e 66 6f 2d 3e 74 79 70 65 2c 0a 09 09 66 69 6c  nfo->type,...fil
7540: 65 64 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74  ed_connection_st
7550: 72 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  r(request->heade
7560: 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 29 2c 0a  rs.connection),.
7570: 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 65 74 61 67  ..fileinfo->etag
7580: 0a 09 29 3b 0a 0a 09 69 66 20 28 68 74 74 70 5f  ..);...if (http_
7590: 63 6f 64 65 20 3d 3d 20 32 30 36 29 20 7b 0a 09  code == 206) {..
75a0: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 43 6f  .fprintf(fp, "Co
75b0: 6e 74 65 6e 74 2d 52 61 6e 67 65 3a 20 62 79 74  ntent-Range: byt
75c0: 65 73 20 25 6c 6c 75 2d 25 6c 6c 75 2f 25 6c 6c  es %llu-%llu/%ll
75d0: 75 5c 72 5c 6e 22 2c 0a 09 09 09 28 75 6e 73 69  u\r\n",....(unsi
75e0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
75f0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7600: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09  .range.offset,..
7610: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
7620: 20 6c 6f 6e 67 29 20 28 72 65 71 75 65 73 74 2d   long) (request-
7630: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
7640: 66 66 73 65 74 20 2b 20 72 65 71 75 65 73 74 2d  ffset + request-
7650: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
7660: 65 6e 67 74 68 20 2d 20 31 29 2c 0a 09 09 09 28  ength - 1),....(
7670: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
7680: 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65  ng) fileinfo->le
7690: 6e 0a 09 09 29 3b 0a 09 7d 0a 09 66 70 72 69 6e  n...);..}..fprin
76a0: 74 66 28 66 70 2c 20 22 5c 72 5c 6e 22 29 3b 0a  tf(fp, "\r\n");.
76b0: 09 66 66 6c 75 73 68 28 66 70 29 3b 0a 0a 09 6c  .fflush(fp);...l
76c0: 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20  og->http_code = 
76d0: 68 74 74 70 5f 63 6f 64 65 3b 0a 09 6c 6f 67 2d  http_code;..log-
76e0: 3e 72 65 61 73 6f 6e 20 3d 20 22 4f 4b 22 3b 0a  >reason = "OK";.
76f0: 09 6c 6f 67 2d 3e 73 74 61 72 74 74 69 6d 65 20  .log->starttime 
7700: 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 09 6c  = time(NULL);..l
7710: 6f 67 2d 3e 72 65 71 5f 6f 66 66 73 65 74 20 3d  og->req_offset =
7720: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
7730: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a  s.range.offset;.
7740: 09 6c 6f 67 2d 3e 72 65 71 5f 6c 65 6e 67 74 68  .log->req_length
7750: 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64   = request->head
7760: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
7770: 3b 0a 09 6c 6f 67 2d 3e 66 69 6c 65 5f 6c 65 6e  ;..log->file_len
7780: 67 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e  gth = fileinfo->
7790: 6c 65 6e 3b 0a 0a 23 69 66 64 65 66 20 46 49 4c  len;..#ifdef FIL
77a0: 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54 50  ED_NONBLOCK_HTTP
77b0: 0a 09 69 6e 74 20 73 6f 63 6b 65 74 5f 66 6c 61  ..int socket_fla
77c0: 67 73 3b 0a 09 66 64 5f 73 65 74 20 72 66 64 2c  gs;..fd_set rfd,
77d0: 20 77 66 64 3b 0a 09 63 68 61 72 20 73 69 6e 6b   wfd;..char sink
77e0: 62 75 66 5b 38 31 39 32 5d 3b 0a 09 73 73 69 7a  buf[8192];..ssiz
77f0: 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09  e_t read_ret;...
7800: 46 44 5f 5a 45 52 4f 28 26 72 66 64 29 3b 0a 09  FD_ZERO(&rfd);..
7810: 46 44 5f 5a 45 52 4f 28 26 77 66 64 29 3b 0a 09  FD_ZERO(&wfd);..
7820: 46 44 5f 53 45 54 28 66 64 2c 20 26 72 66 64 29  FD_SET(fd, &rfd)
7830: 3b 0a 09 46 44 5f 53 45 54 28 66 64 2c 20 26 77  ;..FD_SET(fd, &w
7840: 66 64 29 3b 0a 0a 09 73 6f 63 6b 65 74 5f 66 6c  fd);...socket_fl
7850: 61 67 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20  ags = fcntl(fd, 
7860: 46 5f 47 45 54 46 4c 29 3b 0a 09 66 63 6e 74 6c  F_GETFL);..fcntl
7870: 28 66 64 2c 20 46 5f 53 45 54 46 4c 2c 20 73 6f  (fd, F_SETFL, so
7880: 63 6b 65 74 5f 66 6c 61 67 73 20 7c 20 4f 5f 4e  cket_flags | O_N
7890: 4f 4e 42 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  ONBLOCK);.#endif
78a0: 0a 09 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65  ..sendfile_offse
78b0: 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61  t = request->hea
78c0: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
78d0: 74 3b 0a 09 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  t;..sendfile_len
78e0: 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64   = request->head
78f0: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
7900: 3b 0a 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74  ;..sendfile_sent
7910: 20 3d 20 30 3b 0a 09 77 68 69 6c 65 20 28 72 65   = 0;..while (re
7920: 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 20 3d 3d  quest->method ==
7930: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
7940: 45 54 48 4f 44 5f 47 45 54 29 20 7b 0a 09 09 69  ETHOD_GET) {...i
7950: 66 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20  f (sendfile_len 
7960: 3e 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45  > FILED_SENDFILE
7970: 5f 4d 41 58 29 20 7b 0a 09 09 09 73 65 6e 64 66  _MAX) {....sendf
7980: 69 6c 65 5f 73 69 7a 65 20 3d 20 46 49 4c 45 44  ile_size = FILED
7990: 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 3b 0a 09  _SENDFILE_MAX;..
79a0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73 65 6e  .} else {....sen
79b0: 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 73 65 6e  dfile_size = sen
79c0: 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a  dfile_len;...}..
79d0: 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3d  ..sendfile_ret =
79e0: 20 73 65 6e 64 66 69 6c 65 28 66 64 2c 20 66 69   sendfile(fd, fi
79f0: 6c 65 69 6e 66 6f 2d 3e 66 64 2c 20 26 73 65 6e  leinfo->fd, &sen
7a00: 64 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73 65  dfile_offset, se
7a10: 6e 64 66 69 6c 65 5f 73 69 7a 65 29 3b 0a 09 09  ndfile_size);...
7a20: 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 72 65 74  if (sendfile_ret
7a30: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 64 65 66 20   <= 0) {.#ifdef 
7a40: 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48  FILED_NONBLOCK_H
7a50: 54 54 50 0a 09 09 09 69 66 20 28 65 72 72 6e 6f  TTP....if (errno
7a60: 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09   == EAGAIN) {...
7a70: 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3d  ..sendfile_ret =
7a80: 20 30 3b 0a 0a 09 09 09 09 77 68 69 6c 65 20 28   0;......while (
7a90: 31 29 20 7b 0a 09 09 09 09 09 73 65 6c 65 63 74  1) {......select
7aa0: 28 66 64 20 2b 20 31 2c 20 26 72 66 64 2c 20 26  (fd + 1, &rfd, &
7ab0: 77 66 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  wfd, NULL, NULL)
7ac0: 3b 0a 09 09 09 09 09 69 66 20 28 46 44 5f 49 53  ;......if (FD_IS
7ad0: 53 45 54 28 66 64 2c 20 26 72 66 64 29 29 20 7b  SET(fd, &rfd)) {
7ae0: 0a 09 09 09 09 09 09 72 65 61 64 5f 72 65 74 20  .......read_ret 
7af0: 3d 20 72 65 61 64 28 66 64 2c 20 73 69 6e 6b 62  = read(fd, sinkb
7b00: 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 6e 6b 62  uf, sizeof(sinkb
7b10: 75 66 29 29 3b 0a 0a 09 09 09 09 09 09 69 66 20  uf));........if 
7b20: 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  (read_ret <= 0) 
7b30: 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  {........break;.
7b40: 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a  ......}......}..
7b50: 09 09 09 09 09 69 66 20 28 46 44 5f 49 53 53 45  .....if (FD_ISSE
7b60: 54 28 66 64 2c 20 26 77 66 64 29 29 20 7b 0a 09  T(fd, &wfd)) {..
7b70: 09 09 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20  .....read_ret = 
7b80: 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  1;........break;
7b90: 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
7ba0: 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ...if (read_ret 
7bb0: 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65  <= 0) {......bre
7bc0: 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  ak;.....}....} e
7bd0: 6c 73 65 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  lse {.....break;
7be0: 0a 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09 62  ....}.#else....b
7bf0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 09 7d  reak;.#endif...}
7c00: 0a 0a 09 09 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  ....sendfile_len
7c10: 20 2d 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65 74   -= sendfile_ret
7c20: 3b 0a 09 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e  ;...sendfile_sen
7c30: 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65  t += sendfile_re
7c40: 74 3b 0a 09 09 69 66 20 28 73 65 6e 64 66 69 6c  t;...if (sendfil
7c50: 65 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  e_len == 0) {...
7c60: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
7c70: 09 6c 6f 67 2d 3e 65 6e 64 74 69 6d 65 20 3d 20  .log->endtime = 
7c80: 28 74 69 6d 65 5f 74 29 20 2d 31 3b 0a 09 6c 6f  (time_t) -1;..lo
7c90: 67 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 20 3d  g->sent_length =
7ca0: 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 3b 0a   sendfile_sent;.
7cb0: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  ..filed_log_entr
7cc0: 79 28 6c 6f 67 29 3b 0a 0a 09 63 6c 6f 73 65 28  y(log);...close(
7cd0: 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a 0a  fileinfo->fd);..
7ce0: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
7cf0: 61 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e  aders.connection
7d00: 20 21 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43   != FILED_CONNEC
7d10: 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56 45 29  TION_KEEP_ALIVE)
7d20: 20 7b 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b 65   {...filed_socke
7d30: 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65 28 66  ttimeout_close(f
7d40: 64 29 3b 0a 0a 09 09 66 63 6c 6f 73 65 28 66 70  d);....fclose(fp
7d50: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c  );....return(FIL
7d60: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c  ED_CONNECTION_CL
7d70: 4f 53 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64  OSE);..}...filed
7d80: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70  _sockettimeout_p
7d90: 72 6f 63 65 73 73 69 6e 67 5f 65 6e 64 28 66 64  rocessing_end(fd
7da0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 46 49 4c 45  );...return(FILE
7db0: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45  D_CONNECTION_KEE
7dc0: 50 5f 41 4c 49 56 45 29 3b 0a 7d 0a 0a 2f 2a 20  P_ALIVE);.}../* 
7dd0: 48 61 6e 64 6c 65 20 69 6e 63 6f 6d 69 6e 67 20  Handle incoming 
7de0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 73  connections */.s
7df0: 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c 65  tatic void *file
7e00: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 28  d_worker_thread(
7e10: 76 6f 69 64 20 2a 61 72 67 5f 76 29 20 7b 0a 09  void *arg_v) {..
7e20: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77 6f 72  struct filed_wor
7e30: 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ker_thread_args 
7e40: 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66 69  *arg;..struct fi
7e50: 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74  led_http_request
7e60: 20 72 65 71 75 65 73 74 3b 0a 09 73 74 72 75 63   request;..struc
7e70: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  t filed_log_entr
7e80: 79 20 2a 6c 6f 67 2c 20 6c 6f 63 61 6c 5f 64 75  y *log, local_du
7e90: 6d 6d 79 5f 6c 6f 67 3b 0a 09 73 74 72 75 63 74  mmy_log;..struct
7ea0: 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a   filed_options *
7eb0: 6f 70 74 69 6f 6e 73 3b 0a 09 73 74 72 75 63 74  options;..struct
7ec0: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61 64   sockaddr_in6 ad
7ed0: 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 61  dr;..socklen_t a
7ee0: 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66 61 69  ddrlen;..int fai
7ef0: 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 2c 20  lure_count = 0, 
7f00: 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e  max_failure_coun
7f10: 74 20 3d 20 46 49 4c 45 44 5f 4d 41 58 5f 46 41  t = FILED_MAX_FA
7f20: 49 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a 09 69 6e  ILURE_COUNT;..in
7f30: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 61  t connection_sta
7f40: 74 65 20 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45  te = FILED_CONNE
7f50: 43 54 49 4f 4e 5f 43 4c 4f 53 45 3b 0a 09 69 6e  CTION_CLOSE;..in
7f60: 74 20 6d 61 73 74 65 72 5f 66 64 2c 20 66 64 20  t master_fd, fd 
7f70: 3d 20 2d 31 3b 0a 0a 09 2f 2a 20 52 65 61 64 20  = -1;.../* Read 
7f80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72  arguments */..ar
7f90: 67 20 3d 20 61 72 67 5f 76 3b 0a 0a 09 6d 61 73  g = arg_v;...mas
7fa0: 74 65 72 5f 66 64 20 3d 20 61 72 67 2d 3e 66 64  ter_fd = arg->fd
7fb0: 3b 0a 09 6f 70 74 69 6f 6e 73 20 3d 20 26 61 72  ;..options = &ar
7fc0: 67 2d 3e 6f 70 74 69 6f 6e 73 3b 0a 0a 09 77 68  g->options;...wh
7fd0: 69 6c 65 20 28 31 29 20 7b 0a 09 09 2f 2a 20 46  ile (1) {.../* F
7fe0: 61 69 6c 75 72 65 20 6c 6f 6f 70 20 70 72 65 76  ailure loop prev
7ff0: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 09 69 66 20 28  ention */...if (
8000: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3e 20  failure_count > 
8010: 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e  max_failure_coun
8020: 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  t) {....break;..
8030: 09 7d 0a 0a 09 09 2f 2a 20 41 6c 6c 6f 63 61 74  .}..../* Allocat
8040: 65 20 61 20 6e 65 77 20 6c 6f 67 20 62 75 66 66  e a new log buff
8050: 65 72 20 2a 2f 0a 09 09 6c 6f 67 20 3d 20 66 69  er */...log = fi
8060: 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 31 29 3b 0a  led_log_new(1);.
8070: 09 09 69 66 20 28 6c 6f 67 20 3d 3d 20 4e 55 4c  ..if (log == NUL
8080: 4c 29 20 7b 0a 09 09 09 66 69 6c 65 64 5f 6c 6f  L) {....filed_lo
8090: 67 5f 6d 73 67 28 22 41 4c 4c 4f 43 41 54 45 5f  g_msg("ALLOCATE_
80a0: 4c 4f 47 5f 4d 53 47 5f 46 41 49 4c 45 44 22 29  LOG_MSG_FAILED")
80b0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
80c0: 0a 0a 09 09 6c 6f 67 2d 3e 74 79 70 65 20 3d 20  ....log->type = 
80d0: 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54  FILED_LOG_TYPE_T
80e0: 52 41 4e 53 46 45 52 3b 0a 0a 09 09 2f 2a 20 49  RANSFER;..../* I
80f0: 66 20 77 65 20 63 6c 6f 73 65 64 20 74 68 65 20  f we closed the 
8100: 6f 6c 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  old connection, 
8110: 61 63 63 65 70 74 20 61 20 6e 65 77 20 6f 6e 65  accept a new one
8120: 20 2a 2f 0a 09 09 69 66 20 28 63 6f 6e 6e 65 63   */...if (connec
8130: 74 69 6f 6e 5f 73 74 61 74 65 20 3d 3d 20 46 49  tion_state == FI
8140: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43  LED_CONNECTION_C
8150: 4c 4f 53 45 29 20 7b 0a 09 09 09 2f 2a 20 41 63  LOSE) {..../* Ac
8160: 63 65 70 74 20 61 20 6e 65 77 20 63 6c 69 65 6e  cept a new clien
8170: 74 20 2a 2f 0a 09 09 09 61 64 64 72 6c 65 6e 20  t */....addrlen 
8180: 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 29 3b 0a  = sizeof(addr);.
8190: 0a 09 09 09 66 64 20 3d 20 61 63 63 65 70 74 28  ....fd = accept(
81a0: 6d 61 73 74 65 72 5f 66 64 2c 20 28 73 74 72 75  master_fd, (stru
81b0: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26  ct sockaddr *) &
81c0: 61 64 64 72 2c 20 26 61 64 64 72 6c 65 6e 29 3b  addr, &addrlen);
81d0: 0a 09 09 7d 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20  ...}..../*... * 
81e0: 49 66 20 77 65 20 66 61 69 6c 2c 20 6d 61 6b 65  If we fail, make
81f0: 20 61 20 6e 6f 74 65 20 6f 66 20 69 74 20 73 6f   a note of it so
8200: 20 77 65 20 64 6f 6e 27 74 20 67 6f 20 69 6e 74   we don't go int
8210: 6f 20 61 20 6c 6f 6f 70 20 6f 66 0a 09 09 20 2a  o a loop of... *
8220: 20 61 63 63 65 70 74 28 29 20 66 61 69 6c 69 6e   accept() failin
8230: 67 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 66 64  g... */...if (fd
8240: 20 3c 20 30 29 20 7b 0a 09 09 09 2f 2a 20 4c 6f   < 0) {..../* Lo
8250: 67 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  g the new connec
8260: 74 69 6f 6e 20 2a 2f 0a 09 09 09 66 69 6c 65 64  tion */....filed
8270: 5f 6c 6f 67 5f 6d 73 67 28 22 41 43 43 45 50 54  _log_msg("ACCEPT
8280: 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09 66  _FAILED");.....f
8290: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 2b 2b 3b 0a  ailure_count++;.
82a0: 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 66 72  ....filed_log_fr
82b0: 65 65 28 6c 6f 67 29 3b 0a 0a 09 09 09 63 6f 6e  ee(log);.....con
82c0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 66 69  tinue;...}....fi
82d0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
82e0: 74 5f 61 63 63 65 70 74 28 66 64 29 3b 0a 0a 09  t_accept(fd);...
82f0: 09 2f 2a 20 46 69 6c 6c 20 69 6e 20 6c 6f 67 20  ./* Fill in log 
8300: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 09 09 69  structure */...i
8310: 66 20 28 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28  f (filed_log_ip(
8320: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
8330: 20 2a 29 20 26 61 64 64 72 2c 20 6c 6f 67 2d 3e   *) &addr, log->
8340: 69 70 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 2d 3e  ip, sizeof(log->
8350: 69 70 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ip)) == NULL) {.
8360: 09 09 09 6c 6f 67 2d 3e 69 70 5b 30 5d 20 3d 20  ...log->ip[0] = 
8370: 27 5c 30 27 3b 0a 09 09 09 6c 6f 67 2d 3e 70 6f  '\0';....log->po
8380: 72 74 20 3d 20 30 3b 0a 09 09 7d 20 65 6c 73 65  rt = 0;...} else
8390: 20 7b 0a 09 09 09 6c 6f 67 2d 3e 70 6f 72 74 20   {....log->port 
83a0: 3d 20 61 64 64 72 2e 73 69 6e 36 5f 70 6f 72 74  = addr.sin6_port
83b0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 52 65 73 65  ;...}..../* Rese
83c0: 74 20 66 61 69 6c 75 72 65 20 63 6f 75 6e 74 2a  t failure count*
83d0: 2f 0a 09 09 66 61 69 6c 75 72 65 5f 63 6f 75 6e  /...failure_coun
83e0: 74 20 3d 20 30 3b 0a 0a 09 09 2f 2a 20 48 61 6e  t = 0;..../* Han
83f0: 64 6c 65 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 09  dle socket */...
8400: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 61 74 65  connection_state
8410: 20 3d 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f   = filed_handle_
8420: 63 6c 69 65 6e 74 28 66 64 2c 20 26 72 65 71 75  client(fd, &requ
8430: 65 73 74 2c 20 6c 6f 67 2c 20 6f 70 74 69 6f 6e  est, log, option
8440: 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 70 6f  s);..}.../* Repo
8450: 72 74 20 65 72 72 6f 72 20 2a 2f 0a 09 66 69 6c  rt error */..fil
8460: 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 54 48 52 45  ed_log_msg("THRE
8470: 41 44 5f 44 49 45 44 20 41 42 4e 4f 52 4d 41 4c  AD_DIED ABNORMAL
8480: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c  ");...return(NUL
8490: 4c 29 3b 0a 0a 09 2f 2a 20 6c 6f 63 61 6c 5f 64  L);.../* local_d
84a0: 75 6d 6d 79 5f 6c 6f 67 20 69 73 20 6f 6e 6c 79  ummy_log is only
84b0: 20 75 73 65 64 20 69 66 20 46 49 4c 45 44 5f 44   used if FILED_D
84c0: 4f 4e 54 5f 4c 4f 47 20 69 73 20 65 6e 61 62 6c  ONT_LOG is enabl
84d0: 65 64 2c 20 6f 74 68 65 72 77 69 73 65 20 69 74  ed, otherwise it
84e0: 27 73 20 6e 6f 74 20 75 73 65 64 2c 20 62 75 74  's not used, but
84f0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 68 61   the compiler ha
8500: 74 65 73 20 74 68 61 74 20 69 64 65 61 2e 20 2a  tes that idea. *
8510: 2f 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c  /..local_dummy_l
8520: 6f 67 2e 74 79 70 65 20 3d 20 30 3b 0a 09 6c 6f  og.type = 0;..lo
8530: 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79  cal_dummy_log.ty
8540: 70 65 20 3d 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79  pe = local_dummy
8550: 5f 6c 6f 67 2e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a  _log.type;.}../*
8560: 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20 74   Create worker t
8570: 68 72 65 61 64 73 20 2a 2f 0a 73 74 61 74 69 63  hreads */.static
8580: 20 69 6e 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65   int filed_worke
8590: 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28 69  r_threads_init(i
85a0: 6e 74 20 66 64 2c 20 69 6e 74 20 74 68 72 65 61  nt fd, int threa
85b0: 64 5f 63 6f 75 6e 74 2c 20 73 74 72 75 63 74 20  d_count, struct 
85c0: 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f  filed_options *o
85d0: 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 72 75 63  ptions) {..struc
85e0: 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74  t filed_worker_t
85f0: 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b  hread_args *arg;
8600: 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72 65  ..pthread_t thre
8610: 61 64 69 64 3b 0a 09 69 6e 74 20 70 74 68 72 65  adid;..int pthre
8620: 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a  ad_ret;..int i;.
8630: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
8640: 3c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 3b 20  < thread_count; 
8650: 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d 20 6d  i++) {...arg = m
8660: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 61 72  alloc(sizeof(*ar
8670: 67 29 29 3b 0a 0a 09 09 61 72 67 2d 3e 66 64 20  g));....arg->fd 
8680: 3d 20 66 64 3b 0a 09 09 6d 65 6d 63 70 79 28 26  = fd;...memcpy(&
8690: 61 72 67 2d 3e 6f 70 74 69 6f 6e 73 2c 20 6f 70  arg->options, op
86a0: 74 69 6f 6e 73 2c 20 73 69 7a 65 6f 66 28 2a 6f  tions, sizeof(*o
86b0: 70 74 69 6f 6e 73 29 29 3b 0a 0a 09 09 70 74 68  ptions));....pth
86c0: 72 65 61 64 5f 72 65 74 20 3d 20 70 74 68 72 65  read_ret = pthre
86d0: 61 64 5f 63 72 65 61 74 65 28 26 74 68 72 65 61  ad_create(&threa
86e0: 64 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65 64  did, NULL, filed
86f0: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 2c 20  _worker_thread, 
8700: 61 72 67 29 3b 0a 09 09 69 66 20 28 70 74 68 72  arg);...if (pthr
8710: 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  ead_ret != 0) {.
8720: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
8730: 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  .}..}...return(0
8740: 29 3b 0a 7d 0a 0a 2f 2a 20 44 69 73 70 6c 61 79  );.}../* Display
8750: 20 68 65 6c 70 20 2a 2f 0a 73 74 61 74 69 63 20   help */.static 
8760: 76 6f 69 64 20 66 69 6c 65 64 5f 70 72 69 6e 74  void filed_print
8770: 5f 68 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74 70  _help(FILE *outp
8780: 75 74 2c 20 69 6e 74 20 6c 6f 6e 67 5f 68 65 6c  ut, int long_hel
8790: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65  p, const char *e
87a0: 78 74 72 61 29 20 7b 0a 09 69 66 20 28 65 78 74  xtra) {..if (ext
87b0: 72 61 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  ra) {...fprintf(
87c0: 6f 75 74 70 75 74 2c 20 22 25 73 5c 6e 22 2c 20  output, "%s\n", 
87d0: 65 78 74 72 61 29 3b 0a 09 7d 0a 0a 09 66 70 72  extra);..}...fpr
87e0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 55 73  intf(output, "Us
87f0: 61 67 65 3a 20 66 69 6c 65 64 20 5b 3c 6f 70 74  age: filed [<opt
8800: 69 6f 6e 73 3e 5d 5c 6e 22 29 3b 0a 09 66 70 72  ions>]\n");..fpr
8810: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
8820: 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b 0a 09 66  Options:\n");..f
8830: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
8840: 20 20 20 20 20 20 2d 68 2c 20 2d 2d 68 65 6c 70        -h, --help
8850: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
8860: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64  utput, "      -d
8870: 2c 20 2d 2d 64 61 65 6d 6f 6e 5c 6e 22 29 3b 0a  , --daemon\n");.
8880: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8890: 20 22 20 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65   "      -v, --ve
88a0: 72 73 69 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69  rsion\n");..fpri
88b0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
88c0: 20 20 20 2d 56 2c 20 2d 2d 76 68 6f 73 74 5c 6e     -V, --vhost\n
88d0: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
88e0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20 3c  put, "      -b <
88f0: 61 64 64 72 65 73 73 3e 2c 20 2d 2d 62 69 6e 64  address>, --bind
8900: 20 3c 61 64 64 72 65 73 73 3e 5c 6e 22 29 3b 0a   <address>\n");.
8910: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8920: 20 22 20 20 20 20 20 20 2d 70 20 3c 70 6f 72 74   "      -p <port
8930: 3e 2c 20 2d 2d 70 6f 72 74 20 3c 70 6f 72 74 3e  >, --port <port>
8940: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
8950: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 74  utput, "      -t
8960: 20 3c 63 6f 75 6e 74 3e 2c 20 2d 2d 74 68 72 65   <count>, --thre
8970: 61 64 73 20 3c 63 6f 75 6e 74 3e 5c 6e 22 29 3b  ads <count>\n");
8980: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8990: 2c 20 22 20 20 20 20 20 20 2d 63 20 3c 65 6e 74  , "      -c <ent
89a0: 72 69 65 73 3e 2c 20 2d 2d 63 61 63 68 65 20 3c  ries>, --cache <
89b0: 65 6e 74 72 69 65 73 3e 5c 6e 22 29 3b 0a 09 66  entries>\n");..f
89c0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
89d0: 20 20 20 20 20 20 2d 6c 20 3c 66 69 6c 65 3e 2c        -l <file>,
89e0: 20 2d 2d 6c 6f 67 20 3c 66 69 6c 65 3e 5c 6e 22   --log <file>\n"
89f0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
8a00: 75 74 2c 20 22 20 20 20 20 20 20 2d 75 20 3c 75  ut, "      -u <u
8a10: 73 65 72 3e 2c 20 2d 2d 75 73 65 72 20 3c 75 73  ser>, --user <us
8a20: 65 72 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  er>\n");..fprint
8a30: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
8a40: 20 2d 72 20 3c 64 69 72 65 63 74 6f 72 79 3e 2c   -r <directory>,
8a50: 20 2d 2d 72 6f 6f 74 20 3c 64 69 72 65 63 74 6f   --root <directo
8a60: 72 79 3e 5c 6e 22 29 3b 0a 0a 09 69 66 20 28 6c  ry>\n");...if (l
8a70: 6f 6e 67 5f 68 65 6c 70 29 20 7b 0a 09 09 66 70  ong_help) {...fp
8a80: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
8a90: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
8aa0: 75 74 70 75 74 2c 20 22 20 20 55 73 61 67 65 3a  utput, "  Usage:
8ab0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
8ac0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
8ad0: 68 20 28 6f 72 20 2d 2d 68 65 6c 70 29 20 70 72  h (or --help) pr
8ae0: 69 6e 74 73 20 74 68 69 73 20 75 73 61 67 65 20  ints this usage 
8af0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 5c 6e 22 29  information.\n")
8b00: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
8b10: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
8b20: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
8b30: 20 20 20 20 2d 64 20 28 6f 72 20 2d 2d 64 61 65      -d (or --dae
8b40: 6d 6f 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66  mon) instructs f
8b50: 69 6c 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  iled to become a
8b60: 20 64 61 65 6d 6f 6e 20 61 66 74 65 72 20 69 6e   daemon after in
8b70: 69 74 69 61 6c 69 7a 69 6e 67 5c 6e 22 29 3b 0a  itializing\n");.
8b80: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8b90: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
8ba0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6c 69            the li
8bb0: 73 74 65 6e 69 6e 67 20 54 43 50 20 73 6f 63 6b  stening TCP sock
8bc0: 65 74 20 61 6e 64 20 6c 6f 67 20 66 69 6c 65 73  et and log files
8bd0: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
8be0: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
8bf0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8c00: 2c 20 22 20 20 20 20 20 20 2d 76 20 28 6f 72 20  , "      -v (or 
8c10: 2d 2d 76 65 72 73 69 6f 6e 29 20 69 6e 73 74 72  --version) instr
8c20: 75 63 74 73 20 66 69 6c 65 64 20 70 72 69 6e 74  ucts filed print
8c30: 20 6f 75 74 20 74 68 65 20 76 65 72 73 69 6f 6e   out the version
8c40: 20 6e 75 6d 62 65 72 20 61 6e 64 20 65 78 69 74   number and exit
8c50: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
8c60: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
8c70: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8c80: 2c 20 22 20 20 20 20 20 20 2d 56 20 28 6f 72 20  , "      -V (or 
8c90: 2d 2d 76 68 6f 73 74 29 20 69 6e 73 74 72 75 63  --vhost) instruc
8ca0: 74 73 20 66 69 6c 65 64 20 74 6f 20 70 72 65 70  ts filed to prep
8cb0: 65 6e 64 20 61 6c 6c 20 72 65 71 75 65 73 74 73  end all requests
8cc0: 20 77 69 74 68 20 74 68 65 69 72 20 48 54 54 50   with their HTTP
8cd0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
8ce0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 48                 H
8d00: 6f 73 74 20 68 65 61 64 65 72 2e 5c 6e 22 29 3b  ost header.\n");
8d10: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
8d20: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
8d30: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
8d40: 20 20 20 2d 62 20 28 6f 72 20 2d 2d 62 69 6e 64     -b (or --bind
8d50: 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  ) specifies the 
8d60: 61 64 64 72 65 73 73 20 74 6f 20 6c 69 73 74 65  address to liste
8d70: 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e 67 20 48  n for incoming H
8d80: 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  TTP\n");...fprin
8d90: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 72 65 71 75 65 73 74 73 20 6f 6e 2e 20 20 54   requests on.  T
8dc0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
8dd0: 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 20   is \"%s\".\n", 
8de0: 42 49 4e 44 5f 41 44 44 52 29 3b 0a 09 09 66 70  BIND_ADDR);...fp
8df0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
8e00: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
8e10: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 70  utput, "      -p
8e20: 20 28 6f 72 20 2d 2d 70 6f 72 74 29 20 73 70 65   (or --port) spe
8e30: 63 69 66 69 65 73 20 74 68 65 20 54 43 50 20 70  cifies the TCP p
8e40: 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 20 6c 69  ort number to li
8e50: 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e  sten for incomin
8e60: 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70  g HTTP\n");...fp
8e70: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 72 65 71 75 65 73 74 73 20 6f 6e 2e      requests on.
8ea0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
8eb0: 20 25 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e   %u.\n", (unsign
8ec0: 65 64 20 69 6e 74 29 20 50 4f 52 54 29 3b 0a 09  ed int) PORT);..
8ed0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8ee0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
8ef0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
8f00: 20 2d 74 20 28 6f 72 20 2d 2d 74 68 72 65 61 64   -t (or --thread
8f10: 73 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65  s) specifies the
8f20: 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65   number of worke
8f30: 72 20 74 68 72 65 61 64 73 20 74 6f 20 63 72 65  r threads to cre
8f40: 61 74 65 2e 20 45 61 63 68 5c 6e 22 29 3b 0a 09  ate. Each\n");..
8f50: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8f60: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
8f70: 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 65 72            worker
8f80: 20 74 68 72 65 61 64 20 63 61 6e 20 73 65 72 76   thread can serv
8f90: 69 63 65 20 6f 6e 65 20 63 6f 6e 63 75 72 72 65  ice one concurre
8fa0: 6e 74 20 48 54 54 50 20 73 65 73 73 69 6f 6e 2e  nt HTTP session.
8fb0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
8fc0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 54 68 75 73 20 74 68 65 20 6e 75 6d 62 65 72   Thus the number
8ff0: 20 6f 66 20 74 68 72 65 61 64 73 20 63 72 65 61   of threads crea
9000: 74 65 64 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ted will determi
9010: 6e 65 20 68 6f 77 5c 6e 22 29 3b 0a 09 09 66 70  ne how\n");...fp
9020: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 20 20 6d 61 6e 79 20 73 69 6d 75         many simu
9050: 6c 74 61 6e 65 6f 75 73 20 74 72 61 6e 73 66 65  ltaneous transfe
9060: 72 73 20 77 69 6c 6c 20 62 65 20 70 6f 73 73 69  rs will be possi
9070: 62 6c 65 2e 20 54 68 65 5c 6e 22 29 3b 0a 09 09  ble. The\n");...
9080: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9090: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
90a0: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
90b0: 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e   is %lu.\n", (un
90c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 48 52  signed long) THR
90d0: 45 41 44 5f 43 4f 55 4e 54 29 3b 0a 09 09 66 70  EAD_COUNT);...fp
90e0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
90f0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9100: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 63  utput, "      -c
9110: 20 28 6f 72 20 2d 2d 63 61 63 68 65 29 20 73 70   (or --cache) sp
9120: 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
9130: 65 72 20 6f 66 20 66 69 6c 65 20 69 6e 66 6f 72  er of file infor
9140: 6d 61 74 69 6f 6e 20 63 61 63 68 65 20 65 6e 74  mation cache ent
9150: 72 69 65 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69  ries\n");...fpri
9160: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20     to allocate. 
9190: 20 45 61 63 68 20 63 61 63 68 65 20 65 6e 74 72   Each cache entr
91a0: 79 20 68 6f 6c 64 73 20 66 69 6c 65 20 69 6e 66  y holds file inf
91b0: 6f 72 6d 61 74 69 6f 6e 20 61 73 5c 6e 22 29 3b  ormation as\n");
91c0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
91d0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
91e0: 20 20 20 20 20 20 20 20 20 20 77 65 6c 6c 20 61            well a
91f0: 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  s an open file d
9200: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
9210: 20 66 69 6c 65 2c 20 73 6f 20 72 65 73 6f 75 72   file, so resour
9220: 63 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ce\n");...fprint
9230: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 6c 69 6d 69 74 73 20 28 69 2e 65 2e 2c 20 75   limits (i.e., u
9260: 6c 69 6d 69 74 29 20 73 68 6f 75 6c 64 20 62 65  limit) should be
9270: 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68   considered.  Th
9280: 69 73 20 73 68 6f 75 6c 64 5c 6e 22 29 3b 0a 09  is should\n");..
9290: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
92a0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
92b0: 20 20 20 20 20 20 20 20 62 65 20 61 20 70 72 69          be a pri
92c0: 6d 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 69 64  me number for id
92d0: 65 61 6c 20 75 73 65 20 77 69 74 68 20 74 68 65  eal use with the
92e0: 20 6c 6f 6f 6b 75 70 20 6d 65 74 68 6f 64 2e 5c   lookup method.\
92f0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9300: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
9320: 65 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75  e default is %lu
9330: 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  .\n", (unsigned 
9340: 6c 6f 6e 67 29 20 43 41 43 48 45 5f 53 49 5a 45  long) CACHE_SIZE
9350: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9360: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
9370: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9380: 20 20 20 20 20 2d 6c 20 28 6f 72 20 2d 2d 6c 6f       -l (or --lo
9390: 67 29 20 73 70 65 63 69 66 69 65 73 20 61 20 66  g) specifies a f
93a0: 69 6c 65 6e 61 6d 65 20 74 6f 20 6f 70 65 6e 20  ilename to open 
93b0: 66 6f 72 20 77 72 69 74 69 6e 67 20 6c 6f 67 20  for writing log 
93c0: 65 6e 74 72 69 65 73 2e 20 20 4c 6f 67 5c 6e 22  entries.  Log\n"
93d0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
93e0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
93f0: 20 20 20 20 20 20 20 20 20 20 65 6e 74 72 69 65            entrie
9400: 73 20 61 72 65 20 6d 61 64 65 20 66 6f 72 20 76  s are made for v
9410: 61 72 69 6f 75 73 20 73 74 61 67 65 73 20 69 6e  arious stages in
9420: 20 74 72 61 6e 73 66 65 72 69 6e 67 20 66 69 6c   transfering fil
9430: 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  es.\n");...fprin
9440: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  The log file is 
9470: 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 73 77  opened before sw
9480: 69 74 63 68 69 6e 67 20 75 73 65 72 73 20 28 73  itching users (s
9490: 65 65 20 5c 22 2d 75 5c 22 29 5c 6e 22 29 3b 0a  ee \"-u\")\n");.
94a0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
94b0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
94c0: 20 20 20 20 20 20 20 61 6e 64 20 72 6f 6f 74 20         and root 
94d0: 64 69 72 65 63 74 6f 72 69 65 73 20 28 73 65 65  directories (see
94e0: 20 5c 22 2d 72 5c 22 29 2e 20 20 54 68 65 20 6c   \"-r\").  The l
94f0: 6f 67 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  og file is never
9500: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9510: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
9530: 73 65 64 20 73 6f 20 6c 6f 67 20 72 6f 74 61 74  sed so log rotat
9540: 69 6f 6e 20 77 69 74 68 6f 75 74 20 73 74 6f 70  ion without stop
9550: 70 69 6e 67 20 74 68 65 20 64 61 65 6d 6f 6e 20  ping the daemon 
9560: 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66  is will\n");...f
9570: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 20 6e 6f 74 20 77 6f 72 6b 2e 20 20 54      not work.  T
95a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 5c 22 2d 5c  he value of \"-\
95b0: 22 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  " indicates that
95c0: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
95d0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
95e0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
9600: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
9610: 6c 6f 67 67 69 6e 67 2e 20 20 49 66 20 74 68 65  logging.  If the
9620: 20 66 69 6c 65 6e 61 6d 65 20 62 65 67 69 6e 73   filename begins
9630: 20 77 69 74 68 20 61 5c 6e 22 29 3b 0a 09 09 66   with a\n");...f
9640: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 20 70 69 70 65 20 28 5c 22 7c 5c 22 29      pipe (\"|\")
9670: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
9680: 69 73 20 73 74 61 72 74 65 64 20 61 6e 64 20 75  is started and u
9690: 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 5c  sed for logging\
96a0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
96b0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 74              inst
96d0: 65 61 64 20 6f 66 20 61 20 66 69 6c 65 2e 20 20  ead of a file.  
96e0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 5c  The default is \
96f0: 22 25 73 5c 22 2e 5c 6e 22 2c 20 4c 4f 47 5f 46  "%s\".\n", LOG_F
9700: 49 4c 45 29 3b 0a 23 69 66 64 65 66 20 46 49 4c  ILE);.#ifdef FIL
9710: 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 09 09 66 70  ED_DONT_LOG...fp
9720: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 4e 6f 74 65 20 74 68 61 74 20 6c 6f 67     Note that log
9750: 67 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65 74 65  ging is complete
9760: 6c 79 20 64 69 73 61 62 6c 65 64 20 73 6f 20 74  ly disabled so t
9770: 68 69 73 20 6f 70 74 69 6f 6e 20 64 6f 65 73 5c  his option does\
9780: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9790: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 68              noth
97b0: 69 6e 67 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ing in this buil
97c0: 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 09  d.\n");.#endif..
97d0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
97e0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
97f0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9800: 20 2d 75 20 28 6f 72 20 2d 2d 75 73 65 72 29 20   -u (or --user) 
9810: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 75 73  specifies the us
9820: 65 72 20 74 6f 20 73 77 69 74 63 68 20 75 73 65  er to switch use
9830: 72 20 49 44 73 20 74 6f 20 62 65 66 6f 72 65 20  r IDs to before 
9840: 73 65 72 76 69 63 69 6e 67 5c 6e 22 29 3b 0a 09  servicing\n");..
9850: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9860: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9870: 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73 2e         requests.
9880: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
9890: 20 6e 6f 74 20 63 68 61 6e 67 65 20 75 73 65 72   not change user
98a0: 20 49 44 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72   IDs.\n");...fpr
98b0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
98c0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
98d0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 72 20  tput, "      -r 
98e0: 28 6f 72 20 2d 2d 72 6f 6f 74 29 20 73 70 65 63  (or --root) spec
98f0: 69 66 69 65 73 20 74 68 65 20 64 69 72 65 63 74  ifies the direct
9900: 6f 72 79 20 74 6f 20 61 63 74 20 61 73 20 74 68  ory to act as th
9910: 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79  e root directory
9920: 20 66 6f 72 5c 6e 22 29 3b 0a 09 09 66 70 72 69   for\n");...fpri
9930: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9950: 20 20 74 68 65 20 66 69 6c 65 20 73 65 72 76 65    the file serve
9960: 72 2e 20 20 49 66 20 74 68 69 73 20 6f 70 74 69  r.  If this opti
9970: 6f 6e 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  on is specified,
9980: 20 63 68 72 6f 6f 74 28 32 29 5c 6e 22 29 3b 0a   chroot(2)\n");.
9990: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
99a0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
99b0: 20 20 20 20 20 20 20 20 69 73 20 63 61 6c 6c 65          is calle
99c0: 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  d.  The default 
99d0: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 72 6f  is not change ro
99e0: 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73 2c 5c  ot directories,\
99f0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9a00: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
9a20: 74 20 69 73 2c 20 74 68 65 20 5c 22 2f 5c 22 20  t is, the \"/\" 
9a30: 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 68 61  directory is sha
9a40: 72 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20 77  red out.  This w
9a50: 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ill\n");...fprin
9a60: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 6c 69 6b 65 6c 79 20 62 65 20 61 20 73 65 63   likely be a sec
9a90: 75 72 69 74 79 20 69 73 73 75 65 2c 20 73 6f 20  urity issue, so 
9aa0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 73 68 6f 75  this option shou
9ab0: 6c 64 20 61 6c 77 61 79 73 5c 6e 22 29 3b 0a 09  ld always\n");..
9ac0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9ad0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9ae0: 20 20 20 20 20 20 20 62 65 20 75 73 65 64 2e 5c         be used.\
9af0: 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  n");..}...return
9b00: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 67 65  ;.}../* Add a ge
9b10: 74 6f 70 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 73  topt option */.s
9b20: 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64  tatic void filed
9b30: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
9b40: 6f 70 74 28 73 74 72 75 63 74 20 6f 70 74 69 6f  opt(struct optio
9b50: 6e 20 2a 6f 70 74 2c 20 63 6f 6e 73 74 20 63 68  n *opt, const ch
9b60: 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 68 61  ar *name, int ha
9b70: 73 5f 61 72 67 2c 20 69 6e 74 20 76 61 6c 29 20  s_arg, int val) 
9b80: 7b 0a 09 6f 70 74 2d 3e 6e 61 6d 65 20 20 20 20  {..opt->name    
9b90: 20 3d 20 6e 61 6d 65 3b 0a 09 6f 70 74 2d 3e 68   = name;..opt->h
9ba0: 61 73 5f 61 72 67 20 20 3d 20 68 61 73 5f 61 72  as_arg  = has_ar
9bb0: 67 3b 0a 09 6f 70 74 2d 3e 66 6c 61 67 20 20 20  g;..opt->flag   
9bc0: 20 20 3d 20 4e 55 4c 4c 3b 0a 09 6f 70 74 2d 3e    = NULL;..opt->
9bd0: 76 61 6c 20 20 20 20 20 20 3d 20 76 61 6c 3b 0a  val      = val;.
9be0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  ..return;.}../* 
9bf0: 52 65 73 6f 6c 76 65 20 61 20 75 73 65 72 6e 61  Resolve a userna
9c00: 6d 65 20 74 6f 20 61 20 55 49 44 20 2a 2f 0a 73  me to a UID */.s
9c10: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
9c20: 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 63 6f 6e 73  user_lookup(cons
9c30: 74 20 63 68 61 72 20 2a 75 73 65 72 2c 20 75 69  t char *user, ui
9c40: 64 5f 74 20 2a 75 73 65 72 5f 69 64 29 20 7b 0a  d_t *user_id) {.
9c50: 09 63 68 61 72 20 2a 6e 65 78 74 3b 0a 09 75 69  .char *next;..ui
9c60: 64 5f 74 20 75 73 65 72 5f 69 64 5f 63 68 65 63  d_t user_id_chec
9c70: 6b 3b 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 44  k;.#ifndef FILED
9c80: 5f 4e 4f 5f 47 45 54 50 57 4e 41 4d 0a 09 73 74  _NO_GETPWNAM..st
9c90: 72 75 63 74 20 70 61 73 73 77 64 20 2a 65 6e 74  ruct passwd *ent
9ca0: 3b 0a 0a 09 65 6e 74 20 3d 20 67 65 74 70 77 6e  ;...ent = getpwn
9cb0: 61 6d 28 75 73 65 72 29 3b 0a 09 69 66 20 28 65  am(user);..if (e
9cc0: 6e 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt != NULL) {...
9cd0: 2a 75 73 65 72 5f 69 64 20 3d 20 65 6e 74 2d 3e  *user_id = ent->
9ce0: 70 77 5f 75 69 64 3b 0a 0a 09 09 72 65 74 75 72  pw_uid;....retur
9cf0: 6e 28 30 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  n(0);..}.#endif.
9d00: 0a 09 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 20  ..user_id_check 
9d10: 3d 20 73 74 72 74 6f 75 6c 6c 28 75 73 65 72 2c  = strtoull(user,
9d20: 20 26 6e 65 78 74 2c 20 31 30 29 3b 0a 09 69 66   &next, 10);..if
9d30: 20 28 6e 65 78 74 20 3d 3d 20 4e 55 4c 4c 29 20   (next == NULL) 
9d40: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
9d50: 7d 0a 0a 09 69 66 20 28 6e 65 78 74 5b 30 5d 20  }...if (next[0] 
9d60: 21 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74  != '\0') {...ret
9d70: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2a 75 73  urn(1);..}...*us
9d80: 65 72 5f 69 64 20 3d 20 75 73 65 72 5f 69 64 5f  er_id = user_id_
9d90: 63 68 65 63 6b 3b 0a 0a 09 72 65 74 75 72 6e 28  check;...return(
9da0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 61 65 6d 6f 6e  0);.}../* Daemon
9db0: 69 7a 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize */.static in
9dc0: 74 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a  t filed_daemoniz
9dd0: 65 28 76 6f 69 64 29 20 7b 0a 09 70 69 64 5f 74  e(void) {..pid_t
9de0: 20 73 65 74 73 69 64 5f 72 65 74 2c 20 66 6f 72   setsid_ret, for
9df0: 6b 5f 72 65 74 3b 0a 09 69 6e 74 20 63 68 64 69  k_ret;..int chdi
9e00: 72 5f 72 65 74 2c 20 64 75 70 32 5f 72 65 74 3b  r_ret, dup2_ret;
9e10: 0a 09 69 6e 74 20 66 64 5f 69 6e 2c 20 66 64 5f  ..int fd_in, fd_
9e20: 6f 75 74 3b 0a 0a 09 63 68 64 69 72 5f 72 65 74  out;...chdir_ret
9e30: 20 3d 20 63 68 64 69 72 28 22 2f 22 29 3b 0a 09   = chdir("/");..
9e40: 69 66 20 28 63 68 64 69 72 5f 72 65 74 20 21 3d  if (chdir_ret !=
9e50: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31   0) {...return(1
9e60: 29 3b 0a 09 7d 0a 0a 09 66 6f 72 6b 5f 72 65 74  );..}...fork_ret
9e70: 20 3d 20 66 6f 72 6b 28 29 3b 0a 09 69 66 20 28   = fork();..if (
9e80: 66 6f 72 6b 5f 72 65 74 20 3c 20 30 29 20 7b 0a  fork_ret < 0) {.
9e90: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
9ea0: 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74 20 3e  ..if (fork_ret >
9eb0: 20 30 29 20 7b 0a 09 09 2f 2a 20 50 61 72 65 6e   0) {.../* Paren
9ec0: 74 20 2a 2f 0a 09 09 77 61 69 74 70 69 64 28 66  t */...waitpid(f
9ed0: 6f 72 6b 5f 72 65 74 2c 20 4e 55 4c 4c 2c 20 30  ork_ret, NULL, 0
9ee0: 29 3b 0a 0a 09 09 65 78 69 74 28 45 58 49 54 5f  );....exit(EXIT_
9ef0: 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f  SUCCESS);..}.../
9f00: 2a 20 43 68 69 6c 64 20 2a 2f 0a 09 69 66 20 28  * Child */..if (
9f10: 66 6f 72 6b 28 29 20 21 3d 20 30 29 20 7b 0a 09  fork() != 0) {..
9f20: 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09 09 65  ./* Child */...e
9f30: 78 69 74 28 45 58 49 54 5f 53 55 43 43 45 53 53  xit(EXIT_SUCCESS
9f40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 72 61 6e 64  );..}.../* Grand
9f50: 20 63 68 69 6c 64 20 2a 2f 0a 09 73 65 74 73 69   child */..setsi
9f60: 64 5f 72 65 74 20 3d 20 73 65 74 73 69 64 28 29  d_ret = setsid()
9f70: 3b 0a 09 69 66 20 28 73 65 74 73 69 64 5f 72 65  ;..if (setsid_re
9f80: 74 20 3d 3d 20 28 28 70 69 64 5f 74 29 20 2d 31  t == ((pid_t) -1
9f90: 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  )) {...return(1)
9fa0: 3b 0a 09 7d 0a 0a 09 66 64 5f 69 6e 20 3d 20 6f  ;..}...fd_in = o
9fb0: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
9fc0: 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 66 64 5f   O_RDONLY);..fd_
9fd0: 6f 75 74 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76  out = open("/dev
9fe0: 2f 6e 75 6c 6c 22 2c 20 4f 5f 57 52 4f 4e 4c 59  /null", O_WRONLY
9ff0: 29 3b 0a 09 69 66 20 28 66 64 5f 69 6e 20 3c 20  );..if (fd_in < 
a000: 30 20 7c 7c 20 66 64 5f 6f 75 74 20 3c 20 30 29  0 || fd_out < 0)
a010: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
a020: 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20  .}...dup2_ret = 
a030: 64 75 70 32 28 66 64 5f 69 6e 2c 20 53 54 44 49  dup2(fd_in, STDI
a040: 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28  N_FILENO);..if (
a050: 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 49  dup2_ret != STDI
a060: 4e 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65  N_FILENO) {...re
a070: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75  turn(1);..}...du
a080: 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64  p2_ret = dup2(fd
a090: 5f 6f 75 74 2c 20 53 54 44 4f 55 54 5f 46 49 4c  _out, STDOUT_FIL
a0a0: 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f  ENO);..if (dup2_
a0b0: 72 65 74 20 21 3d 20 53 54 44 4f 55 54 5f 46 49  ret != STDOUT_FI
a0c0: 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e  LENO) {...return
a0d0: 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72  (1);..}...dup2_r
a0e0: 65 74 20 3d 20 64 75 70 32 28 66 64 5f 6f 75 74  et = dup2(fd_out
a0f0: 2c 20 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f 29  , STDERR_FILENO)
a100: 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74 20  ;..if (dup2_ret 
a110: 21 3d 20 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f  != STDERR_FILENO
a120: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
a130: 0a 09 7d 0a 0a 09 63 6c 6f 73 65 28 66 64 5f 69  ..}...close(fd_i
a140: 6e 29 3b 0a 09 63 6c 6f 73 65 28 66 64 5f 6f 75  n);..close(fd_ou
a150: 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  t);...return(0);
a160: 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 70 72 6f 63 65  .}../* Run proce
a170: 73 73 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 69  ss */.int main(i
a180: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
a190: 61 72 67 76 29 20 7b 0a 09 73 74 72 75 63 74 20  argv) {..struct 
a1a0: 6f 70 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 5b 31  option options[1
a1b0: 32 5d 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  2];..struct file
a1c0: 64 5f 6f 70 74 69 6f 6e 73 20 74 68 72 65 61 64  d_options thread
a1d0: 5f 6f 70 74 69 6f 6e 73 3b 0a 09 63 6f 6e 73 74  _options;..const
a1e0: 20 63 68 61 72 20 2a 62 69 6e 64 5f 61 64 64 72   char *bind_addr
a1f0: 20 3d 20 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e   = BIND_ADDR, *n
a200: 65 77 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a  ewroot = NULL, *
a210: 6c 6f 67 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46  log_file = LOG_F
a220: 49 4c 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f  ILE;..FILE *log_
a230: 66 70 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 20  fp;..uid_t user 
a240: 3d 20 30 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d  = 0;..int port =
a250: 20 50 4f 52 54 2c 20 74 68 72 65 61 64 5f 63 6f   PORT, thread_co
a260: 75 6e 74 20 3d 20 54 48 52 45 41 44 5f 43 4f 55  unt = THREAD_COU
a270: 4e 54 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 73  NT;..int cache_s
a280: 69 7a 65 20 3d 20 43 41 43 48 45 5f 53 49 5a 45  ize = CACHE_SIZE
a290: 3b 0a 09 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c  ;..int init_ret,
a2a0: 20 63 68 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74   chroot_ret, set
a2b0: 75 69 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f  uid_ret, lookup_
a2c0: 72 65 74 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a  ret, chdir_ret;.
a2d0: 09 69 6e 74 20 73 65 74 75 69 64 5f 65 6e 61 62  .int setuid_enab
a2e0: 6c 65 64 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f  led = 0, daemon_
a2f0: 65 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e  enabled = 0;..in
a300: 74 20 63 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a  t ch;..int fd;..
a310: 09 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 20  ./* Set default 
a320: 76 61 6c 75 65 73 20 2a 2f 0a 09 74 68 72 65 61  values */..threa
a330: 64 5f 6f 70 74 69 6f 6e 73 2e 76 68 6f 73 74 73  d_options.vhosts
a340: 5f 65 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 0a 09  _enabled = 0;...
a350: 2f 2a 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d  /* Process argum
a360: 65 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67  ents */..filed_g
a370: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
a380: 74 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22  t(&options[0], "
a390: 70 6f 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f  port", required_
a3a0: 61 72 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a  argument, 'p');.
a3b0: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
a3c0: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
a3d0: 6e 73 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22  ns[1], "threads"
a3e0: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
a3f0: 65 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65  ent, 't');..file
a400: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
a410: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d  topt(&options[2]
a420: 2c 20 22 63 61 63 68 65 22 2c 20 72 65 71 75 69  , "cache", requi
a430: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63  red_argument, 'c
a440: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
a450: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
a460: 70 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64  ptions[3], "bind
a470: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
a480: 6d 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c  ment, 'b');..fil
a490: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
a4a0: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34  etopt(&options[4
a4b0: 5d 2c 20 22 75 73 65 72 22 2c 20 72 65 71 75 69  ], "user", requi
a4c0: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75  red_argument, 'u
a4d0: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
a4e0: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
a4f0: 70 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74  ptions[5], "root
a500: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
a510: 6d 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c  ment, 'r');..fil
a520: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
a530: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36  etopt(&options[6
a540: 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72  ], "help", no_ar
a550: 67 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66  gument, 'h');..f
a560: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
a570: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
a580: 5b 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e  [7], "daemon", n
a590: 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29  o_argument, 'd')
a5a0: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
a5b0: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
a5c0: 69 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20  ions[8], "log", 
a5d0: 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e  required_argumen
a5e0: 74 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'l');..filed_
a5f0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
a600: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20  pt(&options[9], 
a610: 22 76 65 72 73 69 6f 6e 22 2c 20 6e 6f 5f 61 72  "version", no_ar
a620: 67 75 6d 65 6e 74 2c 20 27 76 27 29 3b 0a 09 66  gument, 'v');..f
a630: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
a640: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
a650: 5b 31 30 5d 2c 20 22 76 68 6f 73 74 22 2c 20 6e  [10], "vhost", n
a660: 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 56 27 29  o_argument, 'V')
a670: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
a680: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
a690: 69 6f 6e 73 5b 31 31 5d 2c 20 4e 55 4c 4c 2c 20  ions[11], NULL, 
a6a0: 30 2c 20 30 29 3b 0a 09 77 68 69 6c 65 20 28 28  0, 0);..while ((
a6b0: 63 68 20 3d 20 67 65 74 6f 70 74 5f 6c 6f 6e 67  ch = getopt_long
a6c0: 28 61 72 67 63 2c 20 61 72 67 76 2c 20 22 70 3a  (argc, argv, "p:
a6d0: 74 3a 63 3a 62 3a 75 3a 72 3a 6c 3a 68 64 76 56  t:c:b:u:r:l:hdvV
a6e0: 22 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e 55 4c 4c  ", options, NULL
a6f0: 29 29 20 21 3d 20 2d 31 29 20 7b 0a 09 09 73 77  )) != -1) {...sw
a700: 69 74 63 68 28 63 68 29 20 7b 0a 09 09 09 63 61  itch(ch) {....ca
a710: 73 65 20 27 70 27 3a 0a 09 09 09 09 70 6f 72 74  se 'p':.....port
a720: 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b   = atoi(optarg);
a730: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
a740: 61 73 65 20 27 74 27 3a 0a 09 09 09 09 74 68 72  ase 't':.....thr
a750: 65 61 64 5f 63 6f 75 6e 74 20 3d 20 61 74 6f 69  ead_count = atoi
a760: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
a770: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 63 27  eak;....case 'c'
a780: 3a 0a 09 09 09 09 63 61 63 68 65 5f 73 69 7a 65  :.....cache_size
a790: 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b   = atoi(optarg);
a7a0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
a7b0: 61 73 65 20 27 62 27 3a 0a 09 09 09 09 62 69 6e  ase 'b':.....bin
a7c0: 64 5f 61 64 64 72 20 3d 20 73 74 72 64 75 70 28  d_addr = strdup(
a7d0: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
a7e0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 75 27 3a  ak;....case 'u':
a7f0: 0a 09 09 09 09 73 65 74 75 69 64 5f 65 6e 61 62  .....setuid_enab
a800: 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 6c 6f 6f  led = 1;.....loo
a810: 6b 75 70 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  kup_ret = filed_
a820: 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f 70 74 61  user_lookup(opta
a830: 72 67 2c 20 26 75 73 65 72 29 3b 0a 09 09 09 09  rg, &user);.....
a840: 69 66 20 28 6c 6f 6f 6b 75 70 5f 72 65 74 20 21  if (lookup_ret !
a850: 3d 20 30 29 20 7b 0a 09 09 09 09 09 66 69 6c 65  = 0) {......file
a860: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64  d_print_help(std
a870: 65 72 72 2c 20 30 2c 20 22 49 6e 76 61 6c 69 64  err, 0, "Invalid
a880: 20 75 73 65 72 6e 61 6d 65 20 73 70 65 63 69 66   username specif
a890: 69 65 64 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  ied");.......ret
a8a0: 75 72 6e 28 31 29 3b 0a 09 09 09 09 7d 0a 09 09  urn(1);.....}...
a8b0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
a8c0: 20 27 72 27 3a 0a 09 09 09 09 6e 65 77 72 6f 6f   'r':.....newroo
a8d0: 74 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72  t = strdup(optar
a8e0: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
a8f0: 09 09 63 61 73 65 20 27 6c 27 3a 0a 09 09 09 09  ..case 'l':.....
a900: 6c 6f 67 5f 66 69 6c 65 20 3d 20 73 74 72 64 75  log_file = strdu
a910: 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  p(optarg);.....b
a920: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 64  reak;....case 'd
a930: 27 3a 0a 09 09 09 09 64 61 65 6d 6f 6e 5f 65 6e  ':.....daemon_en
a940: 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 62  abled = 1;.....b
a950: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 56  reak;....case 'V
a960: 27 3a 0a 09 09 09 09 74 68 72 65 61 64 5f 6f 70  ':.....thread_op
a970: 74 69 6f 6e 73 2e 76 68 6f 73 74 73 5f 65 6e 61  tions.vhosts_ena
a980: 62 6c 65 64 20 3d 20 31 3b 0a 0a 09 09 09 09 62  bled = 1;......b
a990: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 76  reak;....case 'v
a9a0: 27 3a 0a 09 09 09 09 70 72 69 6e 74 66 28 22 66  ':.....printf("f
a9b0: 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 25 73 5c  iled version %s\
a9c0: 6e 22 2c 20 46 49 4c 45 44 5f 56 45 52 53 49 4f  n", FILED_VERSIO
a9d0: 4e 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  N);......return(
a9e0: 30 29 3b 0a 09 09 09 63 61 73 65 20 27 3f 27 3a  0);....case '?':
a9f0: 0a 09 09 09 63 61 73 65 20 27 3a 27 3a 0a 09 09  ....case ':':...
aa00: 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65  ..filed_print_he
aa10: 6c 70 28 73 74 64 65 72 72 2c 20 30 2c 20 4e 55  lp(stderr, 0, NU
aa20: 4c 4c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  LL);......return
aa30: 28 31 29 3b 0a 09 09 09 63 61 73 65 20 27 68 27  (1);....case 'h'
aa40: 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e  :.....filed_prin
aa50: 74 5f 68 65 6c 70 28 73 74 64 6f 75 74 2c 20 31  t_help(stdout, 1
aa60: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09 72 65  , NULL);......re
aa70: 74 75 72 6e 28 30 29 3b 0a 09 09 7d 0a 09 7d 0a  turn(0);...}..}.
aa80: 0a 09 2f 2a 20 4f 70 65 6e 20 6c 6f 67 20 66 69  ../* Open log fi
aa90: 6c 65 20 2a 2f 0a 09 6c 6f 67 5f 66 70 20 3d 20  le */..log_fp = 
aaa0: 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 6c  filed_log_open(l
aab0: 6f 67 5f 66 69 6c 65 29 3b 0a 09 69 66 20 28 6c  og_file);..if (l
aac0: 6f 67 5f 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  og_fp == NULL) {
aad0: 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64  ...perror("filed
aae0: 5f 6c 6f 67 5f 6f 70 65 6e 22 29 3b 0a 0a 09 09  _log_open");....
aaf0: 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09  return(4);..}...
ab00: 2f 2a 20 43 72 65 61 74 65 20 6c 69 73 74 65 6e  /* Create listen
ab10: 69 6e 67 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 66  ing socket */..f
ab20: 64 20 3d 20 66 69 6c 65 64 5f 6c 69 73 74 65 6e  d = filed_listen
ab30: 28 62 69 6e 64 5f 61 64 64 72 2c 20 70 6f 72 74  (bind_addr, port
ab40: 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20  );..if (fd < 0) 
ab50: 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65  {...perror("file
ab60: 64 5f 6c 69 73 74 65 6e 22 29 3b 0a 0a 09 09 72  d_listen");....r
ab70: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f  eturn(1);..}.../
ab80: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 69 6d  * Initialize tim
ab90: 65 6f 75 74 20 73 74 72 75 63 74 75 72 65 73 20  eout structures 
aba0: 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66  */..init_ret = f
abb0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
abc0: 75 74 5f 69 6e 69 74 28 29 3b 0a 09 69 66 20 28  ut_init();..if (
abd0: 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b  init_ret != 0) {
abe0: 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64  ...perror("filed
abf0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69  _sockettimeout_i
ac00: 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  nit");....return
ac10: 28 38 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 63  (8);..}.../* Bec
ac20: 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 2a 2f 0a  ome a daemon */.
ac30: 09 69 66 20 28 64 61 65 6d 6f 6e 5f 65 6e 61 62  .if (daemon_enab
ac40: 6c 65 64 29 20 7b 0a 09 09 69 6e 69 74 5f 72 65  led) {...init_re
ac50: 74 20 3d 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e  t = filed_daemon
ac60: 69 7a 65 28 29 3b 0a 09 09 69 66 20 28 69 6e 69  ize();...if (ini
ac70: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
ac80: 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 64  .perror("filed_d
ac90: 61 65 6d 6f 6e 69 7a 65 22 29 3b 0a 0a 09 09 09  aemonize");.....
aca0: 72 65 74 75 72 6e 28 36 29 3b 0a 09 09 7d 0a 09  return(6);...}..
acb0: 7d 0a 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c 20 69  }.../* Chroot, i
acc0: 66 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  f appropriate */
acd0: 0a 09 69 66 20 28 6e 65 77 72 6f 6f 74 29 20 7b  ..if (newroot) {
ace0: 0a 09 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63  ...chdir_ret = c
acf0: 68 64 69 72 28 6e 65 77 72 6f 6f 74 29 3b 0a 09  hdir(newroot);..
ad00: 09 69 66 20 28 63 68 64 69 72 5f 72 65 74 20 21  .if (chdir_ret !
ad10: 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72  = 0) {....perror
ad20: 28 22 63 68 64 69 72 22 29 3b 0a 0a 09 09 09 72  ("chdir");.....r
ad30: 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09  eturn(1);...}...
ad40: 09 63 68 72 6f 6f 74 5f 72 65 74 20 3d 20 63 68  .chroot_ret = ch
ad50: 72 6f 6f 74 28 22 2e 22 29 3b 0a 09 09 69 66 20  root(".");...if 
ad60: 28 63 68 72 6f 6f 74 5f 72 65 74 20 21 3d 20 30  (chroot_ret != 0
ad70: 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63  ) {....perror("c
ad80: 68 72 6f 6f 74 22 29 3b 0a 0a 09 09 09 72 65 74  hroot");.....ret
ad90: 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  urn(1);...}..}..
ada0: 09 2f 2a 20 44 72 6f 70 20 70 72 69 76 69 6c 65  ./* Drop privile
adb0: 67 65 73 2c 20 69 66 20 61 70 70 72 6f 70 72 69  ges, if appropri
adc0: 61 74 65 20 2a 2f 0a 09 69 66 20 28 73 65 74 75  ate */..if (setu
add0: 69 64 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09  id_enabled) {...
ade0: 73 65 74 75 69 64 5f 72 65 74 20 3d 20 73 65 74  setuid_ret = set
adf0: 75 69 64 28 75 73 65 72 29 3b 0a 09 09 69 66 20  uid(user);...if 
ae00: 28 73 65 74 75 69 64 5f 72 65 74 20 21 3d 20 30  (setuid_ret != 0
ae10: 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 73  ) {....perror("s
ae20: 65 74 75 69 64 22 29 3b 0a 0a 09 09 09 72 65 74  etuid");.....ret
ae30: 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  urn(1);...}..}..
ae40: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 2a  ./* Initialize *
ae50: 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69  /..init_ret = fi
ae60: 6c 65 64 5f 69 6e 69 74 28 63 61 63 68 65 5f 73  led_init(cache_s
ae70: 69 7a 65 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f  ize);..if (init_
ae80: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65  ret != 0) {...pe
ae90: 72 72 6f 72 28 22 66 69 6c 65 64 5f 69 6e 69 74  rror("filed_init
aea0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 33 29  ");....return(3)
aeb0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65  ;..}.../* Create
aec0: 20 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20   logging thread 
aed0: 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66  */..init_ret = f
aee0: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
aef0: 65 61 64 5f 69 6e 69 74 28 6c 6f 67 5f 66 70 29  ead_init(log_fp)
af00: 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20  ;..if (init_ret 
af10: 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72  != 0) {...perror
af20: 28 22 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  ("filed_logging_
af30: 74 68 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a 0a  thread_init");..
af40: 09 09 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a  ..return(4);..}.
af50: 0a 09 2f 2a 20 43 72 65 61 74 65 20 73 6f 63 6b  ../* Create sock
af60: 65 74 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 74  et termination t
af70: 68 72 65 61 64 20 2a 2f 0a 09 69 6e 69 74 5f 72  hread */..init_r
af80: 65 74 20 3d 20 66 69 6c 65 64 5f 73 6f 63 6b 65  et = filed_socke
af90: 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 5f  ttimeout_thread_
afa0: 69 6e 69 74 28 29 3b 0a 09 69 66 20 28 69 6e 69  init();..if (ini
afb0: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
afc0: 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 73 6f  perror("filed_so
afd0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65  ckettimeout_thre
afe0: 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65  ad_init");....re
aff0: 74 75 72 6e 28 37 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(7);..}.../*
b000: 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20 74   Create worker t
b010: 68 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69 74 5f  hreads */..init_
b020: 72 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f 72 6b  ret = filed_work
b030: 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28  er_threads_init(
b040: 66 64 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  fd, thread_count
b050: 2c 20 26 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e  , &thread_option
b060: 73 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65  s);..if (init_re
b070: 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72  t != 0) {...perr
b080: 6f 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b 65 72  or("filed_worker
b090: 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 22 29 3b  _threads_init");
b0a0: 0a 0a 09 09 72 65 74 75 72 6e 28 35 29 3b 0a 09  ....return(5);..
b0b0: 7d 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f 72 20  }.../* Wait for 
b0c0: 74 68 72 65 61 64 73 20 74 6f 20 65 78 69 74 20  threads to exit 
b0d0: 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a  */../* XXX:TODO:
b0e0: 20 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61 64 20   Monitor thread 
b0f0: 75 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c 65 20  usage */..while 
b100: 28 31 29 20 7b 0a 09 09 73 6c 65 65 70 28 36 30  (1) {...sleep(60
b110: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74 75 72  );..}.../* Retur
b120: 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  n in failure */.
b130: 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a        .return(2);.}.