Hex Artifact Content

Artifact b6a9efc10716a6deeeb20523ce3966eb4f59359e:


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 32 31 22 0a 23  VERSION "1.21".#
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 09 63 6f 6e 73 74 20 63 68 61  bled;..const cha
0e40: 72 20 2a 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 3b  r *fake_newroot;
0e50: 0a 7d 3b 0a 0a 2f 2a 20 41 72 67 75 6d 65 6e 74  .};../* Argument
0e60: 73 20 66 6f 72 20 77 6f 72 6b 65 72 20 74 68 72  s for worker thr
0e70: 65 61 64 73 20 2a 2f 0a 73 74 72 75 63 74 20 66  eads */.struct f
0e80: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
0e90: 61 64 5f 61 72 67 73 20 7b 0a 09 69 6e 74 20 66  ad_args {..int f
0ea0: 64 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  d;..struct filed
0eb0: 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73  _options options
0ec0: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67 75 6d 65 6e  ;.};../* Argumen
0ed0: 74 73 20 66 6f 72 20 6c 6f 67 67 69 6e 67 20 74  ts for logging t
0ee0: 68 72 65 61 64 73 20 2a 2f 0a 73 74 72 75 63 74  hreads */.struct
0ef0: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
0f00: 68 72 65 61 64 5f 61 72 67 73 20 7b 0a 09 46 49  hread_args {..FI
0f10: 4c 45 20 2a 66 70 3b 0a 7d 3b 0a 0a 2f 2a 20 46  LE *fp;.};../* F
0f20: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
0f30: 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f  */.struct filed_
0f40: 66 69 6c 65 69 6e 66 6f 20 7b 0a 09 70 74 68 72  fileinfo {..pthr
0f50: 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65  ead_mutex_t mute
0f60: 78 3b 0a 09 63 68 61 72 20 70 61 74 68 5b 46 49  x;..char path[FI
0f70: 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f  LED_PATH_BUFFER_
0f80: 53 49 5a 45 5d 3b 0a 09 69 6e 74 20 66 64 3b 0a  SIZE];..int fd;.
0f90: 09 6f 66 66 5f 74 20 6c 65 6e 3b 0a 09 63 68 61  .off_t len;..cha
0fa0: 72 20 2a 6c 61 73 74 6d 6f 64 3b 0a 09 63 68 61  r *lastmod;..cha
0fb0: 72 20 6c 61 73 74 6d 6f 64 5f 62 5b 36 34 5d 3b  r lastmod_b[64];
0fc0: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 79  ..const char *ty
0fd0: 70 65 3b 0a 09 63 68 61 72 20 65 74 61 67 5b 36  pe;..char etag[6
0fe0: 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 20 52 65 71 75 65  4];.};../* Reque
0ff0: 73 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  st variables */.
1000: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74  struct filed_htt
1010: 70 5f 72 65 71 75 65 73 74 20 7b 0a 09 2f 2a 2a  p_request {../**
1020: 20 42 75 66 66 65 72 73 20 2a 2a 2f 0a 09 73 74   Buffers **/..st
1030: 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69  ruct filed_filei
1040: 6e 66 6f 20 66 69 6c 65 69 6e 66 6f 3b 0a 09 63  nfo fileinfo;..c
1050: 68 61 72 20 74 6d 70 62 75 66 5b 46 49 4c 45 44  har tmpbuf[FILED
1060: 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a  _PATH_BUFFER_SIZ
1070: 45 5d 3b 0a 0a 09 2f 2a 2a 20 48 54 54 50 20 52  E];.../** HTTP R
1080: 65 71 75 65 73 74 20 69 6e 66 6f 72 6d 61 74 69  equest informati
1090: 6f 6e 20 2a 2a 2f 0a 09 2f 2a 2a 2a 20 54 79 70  on **/../*** Typ
10a0: 65 20 6f 66 20 72 65 71 75 65 73 74 20 28 48 45  e of request (HE
10b0: 41 44 20 6f 72 20 47 45 54 29 20 2a 2a 2a 2f 0a  AD or GET) ***/.
10c0: 09 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f  .enum {...FILED_
10d0: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47  REQUEST_METHOD_G
10e0: 45 54 2c 0a 09 09 46 49 4c 45 44 5f 52 45 51 55  ET,...FILED_REQU
10f0: 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 0a  EST_METHOD_HEAD.
1100: 09 7d 20 6d 65 74 68 6f 64 3b 0a 0a 09 2f 2a 2a  .} method;.../**
1110: 2a 20 50 61 74 68 20 62 65 69 6e 67 20 72 65 71  * Path being req
1120: 75 65 73 74 65 64 20 2a 2a 2a 2f 0a 09 63 68 61  uested ***/..cha
1130: 72 20 70 61 74 68 5b 46 49 4c 45 44 5f 50 41 54  r path[FILED_PAT
1140: 48 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 20  H_BUFFER_SIZE]; 
1150: 0a 0a 09 2f 2a 2a 2a 20 50 61 74 68 20 74 79 70  .../*** Path typ
1160: 65 20 2a 2a 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09  e ***/..enum {..
1170: 09 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54  .FILED_REQUEST_T
1180: 59 50 45 5f 44 49 52 45 43 54 4f 52 59 2c 0a 09  YPE_DIRECTORY,..
1190: 09 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54  .FILED_REQUEST_T
11a0: 59 50 45 5f 4f 54 48 45 52 0a 09 7d 20 74 79 70  YPE_OTHER..} typ
11b0: 65 3b 0a 0a 09 73 74 72 75 63 74 20 7b 0a 09 09  e;...struct {...
11c0: 73 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20  struct {....int 
11d0: 70 72 65 73 65 6e 74 3b 0a 09 09 09 6f 66 66 5f  present;....off_
11e0: 74 20 6f 66 66 73 65 74 3b 20 20 20 2f 2a 2a 2a  t offset;   /***
11f0: 20 52 61 6e 67 65 20 73 74 61 72 74 20 2a 2a 2a   Range start ***
1200: 2f 0a 09 09 09 6f 66 66 5f 74 20 6c 65 6e 67 74  /....off_t lengt
1210: 68 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e 67 65 20  h;   /*** Range 
1220: 6c 65 6e 67 74 68 20 2a 2a 2a 2f 0a 09 09 7d 20  length ***/...} 
1230: 72 61 6e 67 65 3b 0a 0a 09 09 73 74 72 75 63 74  range;....struct
1240: 20 7b 0a 09 09 09 69 6e 74 20 70 72 65 73 65 6e   {....int presen
1250: 74 3b 0a 09 09 09 63 68 61 72 20 68 6f 73 74 5b  t;....char host[
1260: 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45  FILED_PATH_BUFFE
1270: 52 5f 53 49 5a 45 5d 3b 0a 09 09 7d 20 68 6f 73  R_SIZE];...} hos
1280: 74 3b 0a 0a 09 09 65 6e 75 6d 20 7b 0a 09 09 09  t;....enum {....
1290: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
12a0: 5f 43 4c 4f 53 45 2c 0a 09 09 09 46 49 4c 45 44  _CLOSE,....FILED
12b0: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50  _CONNECTION_KEEP
12c0: 5f 41 4c 49 56 45 0a 09 09 7d 20 63 6f 6e 6e 65  _ALIVE...} conne
12d0: 63 74 69 6f 6e 3b 0a 09 7d 20 68 65 61 64 65 72  ction;..} header
12e0: 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c 6f 67 20 72 65  s;.};../* Log re
12f0: 63 6f 72 64 20 2a 2f 0a 73 74 72 75 63 74 20 66  cord */.struct f
1300: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 7b  iled_log_entry {
1310: 0a 09 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 67  ../* Type of log
1320: 20 65 6e 74 72 79 20 2a 2f 0a 09 65 6e 75 6d 20   entry */..enum 
1330: 7b 0a 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59  {...FILED_LOG_TY
1340: 50 45 5f 4d 45 53 53 41 47 45 2c 0a 09 09 46 49  PE_MESSAGE,...FI
1350: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41  LED_LOG_TYPE_TRA
1360: 4e 53 46 45 52 0a 09 7d 20 74 79 70 65 3b 0a 0a  NSFER..} type;..
1370: 09 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20  ./* Linked list 
1380: 68 65 61 64 2f 74 61 69 6c 20 2a 2f 0a 09 73 74  head/tail */..st
1390: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
13a0: 6e 74 72 79 20 2a 5f 6e 65 78 74 3b 0a 09 73 74  ntry *_next;..st
13b0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
13c0: 6e 74 72 79 20 2a 5f 70 72 65 76 3b 0a 0a 09 2f  ntry *_prev;.../
13d0: 2a 20 54 68 72 65 61 64 20 66 72 6f 6d 20 77 68  * Thread from wh
13e0: 69 63 68 20 74 68 69 73 20 6c 6f 67 20 65 6e 74  ich this log ent
13f0: 72 79 20 65 6d 69 6e 61 74 65 73 20 2a 2f 0a 09  ry eminates */..
1400: 70 74 68 72 65 61 64 5f 74 20 74 68 72 65 61 64  pthread_t thread
1410: 3b 0a 0a 09 2f 2a 20 4d 65 73 73 61 67 65 20 62  ;.../* Message b
1420: 75 66 66 65 72 20 66 6f 72 20 74 79 70 65 20 3d  uffer for type =
1430: 20 4d 45 53 53 41 47 45 20 2a 2f 0a 09 2f 2a 20   MESSAGE */../* 
1440: 50 61 74 68 20 62 75 66 66 65 72 20 66 6f 72 20  Path buffer for 
1450: 74 79 70 65 20 3d 20 54 52 41 4e 53 46 45 52 20  type = TRANSFER 
1460: 2a 2f 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b  */..char buffer[
1470: 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45  FILED_PATH_BUFFE
1480: 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 20 49 74  R_SIZE];.../* It
1490: 65 6d 73 20 66 6f 72 20 74 79 70 65 20 3d 20 54  ems for type = T
14a0: 52 41 4e 53 46 45 52 20 2a 2f 0a 09 69 6e 74 20  RANSFER */..int 
14b0: 68 74 74 70 5f 63 6f 64 65 3b 0a 09 63 6f 6e 73  http_code;..cons
14c0: 74 20 63 68 61 72 20 2a 72 65 61 73 6f 6e 3b 0a  t char *reason;.
14d0: 09 74 69 6d 65 5f 74 20 73 74 61 72 74 74 69 6d  .time_t starttim
14e0: 65 3b 0a 09 74 69 6d 65 5f 74 20 65 6e 64 74 69  e;..time_t endti
14f0: 6d 65 3b 0a 09 6f 66 66 5f 74 20 72 65 71 5f 6f  me;..off_t req_o
1500: 66 66 73 65 74 3b 0a 09 6f 66 66 5f 74 20 72 65  ffset;..off_t re
1510: 71 5f 6c 65 6e 67 74 68 3b 0a 09 6f 66 66 5f 74  q_length;..off_t
1520: 20 73 65 6e 74 5f 6c 65 6e 67 74 68 3b 0a 09 6f   sent_length;..o
1530: 66 66 5f 74 20 66 69 6c 65 5f 6c 65 6e 67 74 68  ff_t file_length
1540: 3b 0a 09 63 68 61 72 20 69 70 5b 31 32 38 5d 3b  ;..char ip[128];
1550: 0a 09 69 6e 74 20 70 6f 72 74 3b 0a 09 69 6e 74  ..int port;..int
1560: 20 6d 65 74 68 6f 64 3b 0a 7d 3b 0a 0a 2f 2a 20   method;.};../* 
1570: 47 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  Global variables
1580: 20 2a 2f 0a 2f 2a 2a 20 4f 70 65 6e 20 46 69 6c   */./** Open Fil
1590: 65 20 63 61 63 68 65 20 2a 2a 2f 0a 73 74 72 75  e cache **/.stru
15a0: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
15b0: 6f 20 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  o *filed_fileinf
15c0: 6f 5f 66 64 63 61 63 68 65 20 3d 20 4e 55 4c 4c  o_fdcache = NULL
15d0: 3b 0a 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66  ;.unsigned int f
15e0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
15f0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 30 3b 0a  cache_size = 0;.
1600: 0a 2f 2a 2a 20 4c 6f 67 67 69 6e 67 20 2a 2a 2f  ./** Logging **/
1610: 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  .struct filed_lo
1620: 67 5f 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c  g_entry *filed_l
1630: 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 70 74 68  og_msg_list;.pth
1640: 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 66 69 6c  read_mutex_t fil
1650: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
1660: 6d 75 74 65 78 3b 0a 70 74 68 72 65 61 64 5f 63  mutex;.pthread_c
1670: 6f 6e 64 5f 74 20 66 69 6c 65 64 5f 6c 6f 67 5f  ond_t filed_log_
1680: 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64 79 3b 0a  msg_list_ready;.
1690: 0a 2f 2a 20 53 69 67 6e 61 6c 20 48 61 6e 64 6c  ./* Signal Handl
16a0: 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  er */.static voi
16b0: 64 20 66 69 6c 65 64 5f 73 69 67 6e 61 6c 5f 68  d filed_signal_h
16c0: 61 6e 64 6c 65 72 28 69 6e 74 20 73 69 67 6e 61  andler(int signa
16d0: 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 73 74 72  l_number) {..str
16e0: 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  uct filed_filein
16f0: 66 6f 20 2a 63 61 63 68 65 3b 0a 09 75 6e 73 69  fo *cache;..unsi
1700: 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 0a 09  gned int idx;...
1710: 73 77 69 74 63 68 20 28 73 69 67 6e 61 6c 5f 6e  switch (signal_n
1720: 75 6d 62 65 72 29 20 7b 0a 09 09 63 61 73 65 20  umber) {...case 
1730: 53 49 47 48 55 50 3a 0a 09 09 09 66 6f 72 20 28  SIGHUP:....for (
1740: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 66  idx = 0; idx < f
1750: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1760: 63 61 63 68 65 5f 73 69 7a 65 3b 20 69 64 78 2b  cache_size; idx+
1770: 2b 29 20 7b 0a 09 09 09 09 63 61 63 68 65 20 3d  +) {.....cache =
1780: 20 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f   &filed_fileinfo
1790: 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 3b 0a 0a  _fdcache[idx];..
17a0: 09 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ....pthread_mute
17b0: 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  x_lock(&cache->m
17c0: 75 74 65 78 29 3b 0a 0a 09 09 09 09 63 61 63 68  utex);......cach
17d0: 65 2d 3e 70 61 74 68 5b 30 5d 20 3d 20 27 5c 30  e->path[0] = '\0
17e0: 27 3b 0a 09 09 09 09 69 66 20 28 63 61 63 68 65  ';.....if (cache
17f0: 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a 09 09 09  ->fd >= 0) {....
1800: 09 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66  ..close(cache->f
1810: 64 29 3b 0a 0a 09 09 09 09 09 63 61 63 68 65 2d  d);.......cache-
1820: 3e 66 64 20 3d 20 2d 31 3b 0a 09 09 09 09 7d 0a  >fd = -1;.....}.
1830: 0a 09 09 09 09 63 61 63 68 65 2d 3e 6c 61 73 74  .....cache->last
1840: 6d 6f 64 20 3d 20 22 22 3b 0a 09 09 09 09 63 61  mod = "";.....ca
1850: 63 68 65 2d 3e 74 79 70 65 20 3d 20 22 22 3b 0a  che->type = "";.
1860: 0a 09 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74  .....pthread_mut
1870: 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65  ex_unlock(&cache
1880: 2d 3e 6d 75 74 65 78 29 3b 0a 09 09 09 7d 0a 09  ->mutex);....}..
1890: 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
18a0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  turn;.}../* Init
18b0: 69 61 6c 69 7a 65 20 63 61 63 68 65 20 2a 2f 0a  ialize cache */.
18c0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
18d0: 5f 69 6e 69 74 5f 63 61 63 68 65 28 75 6e 73 69  _init_cache(unsi
18e0: 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 5f 73  gned int cache_s
18f0: 69 7a 65 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  ize) {..unsigned
1900: 20 69 6e 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d   int idx;..int m
1910: 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a  utex_init_ret;..
1920: 09 2f 2a 20 43 61 63 68 65 20 6d 61 79 20 6e 6f  ./* Cache may no
1930: 74 20 62 65 20 72 65 2d 69 6e 69 74 69 61 6c 69  t be re-initiali
1940: 7a 65 64 20 2a 2f 0a 09 69 66 20 28 66 69 6c 65  zed */..if (file
1950: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
1960: 68 65 5f 73 69 7a 65 20 21 3d 20 30 20 7c 7c 20  he_size != 0 || 
1970: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
1980: 64 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 20  dcache != NULL) 
1990: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
19a0: 7d 0a 0a 09 2f 2a 20 43 61 63 68 65 20 64 6f 65  }.../* Cache doe
19b0: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
19c0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 66 20 63 61   allocated if ca
19d0: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
19e0: 65 64 20 2a 2f 0a 09 69 66 20 28 63 61 63 68 65  ed */..if (cache
19f0: 5f 73 69 7a 65 20 3d 3d 20 30 29 20 7b 0a 09 09  _size == 0) {...
1a00: 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
1a10: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 61 63 68  /* Allocate cach
1a20: 65 20 2a 2f 0a 09 66 69 6c 65 64 5f 66 69 6c 65  e */..filed_file
1a30: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
1a40: 65 20 3d 20 63 61 63 68 65 5f 73 69 7a 65 3b 0a  e = cache_size;.
1a50: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
1a60: 66 64 63 61 63 68 65 20 3d 20 6d 61 6c 6c 6f 63  fdcache = malloc
1a70: 28 73 69 7a 65 6f 66 28 2a 66 69 6c 65 64 5f 66  (sizeof(*filed_f
1a80: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 29  ileinfo_fdcache)
1a90: 20 2a 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66   * filed_fileinf
1aa0: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29 3b  o_fdcache_size);
1ab0: 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69 6c 65  ..if (filed_file
1ac0: 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d 3d 20  info_fdcache == 
1ad0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
1ae0: 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69  (1);..}.../* Ini
1af0: 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20 65 6e  tialize cache en
1b00: 74 72 69 65 73 20 2a 2f 0a 09 66 6f 72 20 28 69  tries */..for (i
1b10: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 66 69  dx = 0; idx < fi
1b20: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1b30: 61 63 68 65 5f 73 69 7a 65 3b 20 69 64 78 2b 2b  ache_size; idx++
1b40: 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74  ) {...mutex_init
1b50: 5f 72 65 74 20 3d 20 70 74 68 72 65 61 64 5f 6d  _ret = pthread_m
1b60: 75 74 65 78 5f 69 6e 69 74 28 26 66 69 6c 65 64  utex_init(&filed
1b70: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
1b80: 65 5b 69 64 78 5d 2e 6d 75 74 65 78 2c 20 4e 55  e[idx].mutex, NU
1b90: 4c 4c 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 78  LL);...if (mutex
1ba0: 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  _init_ret != 0) 
1bb0: 7b 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  {....return(1);.
1bc0: 09 09 7d 0a 0a 09 09 66 69 6c 65 64 5f 66 69 6c  ..}....filed_fil
1bd0: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64  einfo_fdcache[id
1be0: 78 5d 2e 70 61 74 68 5b 30 5d 20 3d 20 27 5c 30  x].path[0] = '\0
1bf0: 27 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69  ';...filed_filei
1c00: 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d  nfo_fdcache[idx]
1c10: 2e 66 64 20 3d 20 2d 31 3b 0a 09 09 66 69 6c 65  .fd = -1;...file
1c20: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
1c30: 68 65 5b 69 64 78 5d 2e 6c 61 73 74 6d 6f 64 20  he[idx].lastmod 
1c40: 3d 20 22 22 3b 0a 09 09 66 69 6c 65 64 5f 66 69  = "";...filed_fi
1c50: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69  leinfo_fdcache[i
1c60: 64 78 5d 2e 74 79 70 65 20 3d 20 22 22 3b 0a 09  dx].type = "";..
1c70: 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  }...return(0);.}
1c80: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
1c90: 70 72 6f 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  process */.stati
1ca0: 63 20 69 6e 74 20 66 69 6c 65 64 5f 69 6e 69 74  c int filed_init
1cb0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  (unsigned int ca
1cc0: 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 73 74 61  che_size) {..sta
1cd0: 74 69 63 20 69 6e 74 20 63 61 6c 6c 65 64 20 3d  tic int called =
1ce0: 20 30 3b 0a 09 73 74 72 75 63 74 20 73 69 67 61   0;..struct siga
1cf0: 63 74 69 6f 6e 20 73 69 67 6e 61 6c 5f 68 61 6e  ction signal_han
1d00: 64 6c 65 72 5f 69 6e 66 6f 3b 0a 09 73 69 67 73  dler_info;..sigs
1d10: 65 74 5f 74 20 73 69 67 6e 61 6c 5f 68 61 6e 64  et_t signal_hand
1d20: 6c 65 72 5f 6d 61 73 6b 3b 0a 09 73 73 69 7a 65  ler_mask;..ssize
1d30: 5f 74 20 72 65 61 64 5f 72 65 74 20 3d 20 30 3b  _t read_ret = 0;
1d40: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72  ..unsigned int r
1d50: 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 3d 20 30 3b  andom_value = 0;
1d60: 0a 09 69 6e 74 20 63 61 63 68 65 5f 72 65 74 3b  ..int cache_ret;
1d70: 0a 09 69 6e 74 20 72 61 6e 64 6f 6d 5f 66 64 3b  ..int random_fd;
1d80: 0a 0a 09 69 66 20 28 63 61 6c 6c 65 64 29 20 7b  ...if (called) {
1d90: 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
1da0: 0a 0a 09 63 61 6c 6c 65 64 20 3d 20 31 3b 0a 0a  ...called = 1;..
1db0: 09 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c  ./* Attempt to l
1dc0: 6f 63 6b 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 74  ock all memory t
1dd0: 6f 20 70 68 79 73 69 63 61 6c 20 52 41 4d 20 28  o physical RAM (
1de0: 62 75 74 20 64 6f 6e 27 74 20 63 61 72 65 20 69  but don't care i
1df0: 66 20 77 65 20 63 61 6e 27 74 29 20 2a 2f 0a 09  f we can't) */..
1e00: 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f 43 55 52  mlockall(MCL_CUR
1e10: 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55 54 55 52  RENT | MCL_FUTUR
1e20: 45 29 3b 0a 0a 09 2f 2a 20 45 73 74 61 62 6c 69  E);.../* Establi
1e30: 73 68 20 73 69 67 6e 61 6c 20 68 61 6e 64 6c 65  sh signal handle
1e40: 72 73 20 2a 2f 0a 09 2f 2a 20 53 49 47 50 49 50  rs */../* SIGPIP
1e50: 45 20 73 68 6f 75 6c 64 20 69 6e 74 65 72 72 75  E should interru
1e60: 70 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  pt system calls 
1e70: 2a 2f 0a 09 73 69 67 66 69 6c 6c 73 65 74 28 26  */..sigfillset(&
1e80: 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 6d  signal_handler_m
1e90: 61 73 6b 29 3b 0a 09 73 69 67 6e 61 6c 5f 68 61  ask);..signal_ha
1ea0: 6e 64 6c 65 72 5f 69 6e 66 6f 2e 73 61 5f 68 61  ndler_info.sa_ha
1eb0: 6e 64 6c 65 72 20 3d 20 66 69 6c 65 64 5f 73 69  ndler = filed_si
1ec0: 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 3b 0a 09 73  gnal_handler;..s
1ed0: 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e  ignal_handler_in
1ee0: 66 6f 2e 73 61 5f 6d 61 73 6b 20 3d 20 73 69 67  fo.sa_mask = sig
1ef0: 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 6d 61 73 6b  nal_handler_mask
1f00: 3b 0a 09 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65  ;..signal_handle
1f10: 72 5f 69 6e 66 6f 2e 73 61 5f 66 6c 61 67 73 20  r_info.sa_flags 
1f20: 3d 20 53 41 5f 52 45 53 54 41 52 54 3b 0a 09 73  = SA_RESTART;..s
1f30: 69 67 61 63 74 69 6f 6e 28 53 49 47 50 49 50 45  igaction(SIGPIPE
1f40: 2c 20 26 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65  , &signal_handle
1f50: 72 5f 69 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 0a  r_info, NULL);..
1f60: 09 2f 2a 20 48 61 6e 64 6c 65 20 53 49 47 48 55  ./* Handle SIGHU
1f70: 50 20 74 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c  P to release all
1f80: 20 63 61 63 68 65 73 20 2a 2f 0a 09 73 69 67 66   caches */..sigf
1f90: 69 6c 6c 73 65 74 28 26 73 69 67 6e 61 6c 5f 68  illset(&signal_h
1fa0: 61 6e 64 6c 65 72 5f 6d 61 73 6b 29 3b 0a 09 73  andler_mask);..s
1fb0: 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e  ignal_handler_in
1fc0: 66 6f 2e 73 61 5f 68 61 6e 64 6c 65 72 20 3d 20  fo.sa_handler = 
1fd0: 66 69 6c 65 64 5f 73 69 67 6e 61 6c 5f 68 61 6e  filed_signal_han
1fe0: 64 6c 65 72 3b 0a 09 73 69 67 6e 61 6c 5f 68 61  dler;..signal_ha
1ff0: 6e 64 6c 65 72 5f 69 6e 66 6f 2e 73 61 5f 6d 61  ndler_info.sa_ma
2000: 73 6b 20 3d 20 73 69 67 6e 61 6c 5f 68 61 6e 64  sk = signal_hand
2010: 6c 65 72 5f 6d 61 73 6b 3b 0a 09 73 69 67 6e 61  ler_mask;..signa
2020: 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e 66 6f 2e 73  l_handler_info.s
2030: 61 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 73 69  a_flags = 0;..si
2040: 67 61 63 74 69 6f 6e 28 53 49 47 48 55 50 2c 20  gaction(SIGHUP, 
2050: 26 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f  &signal_handler_
2060: 69 6e 66 6f 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f  info, NULL);.../
2070: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63  * Initialize cac
2080: 68 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  he structure */.
2090: 09 63 61 63 68 65 5f 72 65 74 20 3d 20 66 69 6c  .cache_ret = fil
20a0: 65 64 5f 69 6e 69 74 5f 63 61 63 68 65 28 63 61  ed_init_cache(ca
20b0: 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28  che_size);..if (
20c0: 63 61 63 68 65 5f 72 65 74 20 21 3d 20 30 29 20  cache_ret != 0) 
20d0: 7b 0a 09 09 72 65 74 75 72 6e 28 63 61 63 68 65  {...return(cache
20e0: 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49  _ret);..}.../* I
20f0: 6e 69 74 69 61 6c 69 7a 65 20 72 61 6e 64 6f 6d  nitialize random
2100: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
2110: 72 20 2a 2f 0a 09 72 61 6e 64 6f 6d 5f 66 64 20  r */..random_fd 
2120: 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61  = open("/dev/ura
2130: 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29  ndom", O_RDONLY)
2140: 3b 0a 09 69 66 20 28 72 61 6e 64 6f 6d 5f 66 64  ;..if (random_fd
2150: 20 3e 3d 20 30 29 20 7b 0a 09 09 72 65 61 64 5f   >= 0) {...read_
2160: 72 65 74 20 3d 20 72 65 61 64 28 72 61 6e 64 6f  ret = read(rando
2170: 6d 5f 66 64 2c 20 26 72 61 6e 64 6f 6d 5f 76 61  m_fd, &random_va
2180: 6c 75 65 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64  lue, sizeof(rand
2190: 6f 6d 5f 76 61 6c 75 65 29 29 3b 0a 0a 09 09 63  om_value));....c
21a0: 6c 6f 73 65 28 72 61 6e 64 6f 6d 5f 66 64 29 3b  lose(random_fd);
21b0: 0a 09 7d 0a 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c  ..}...random_val
21c0: 75 65 20 5e 3d 20 67 65 74 70 69 64 28 29 3b 0a  ue ^= getpid();.
21d0: 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d  .random_value ^=
21e0: 20 67 65 74 75 69 64 28 29 3b 0a 09 72 61 6e 64   getuid();..rand
21f0: 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 74 69 6d 65  om_value ^= time
2200: 28 4e 55 4c 4c 29 3b 0a 0a 09 73 72 61 6e 64 6f  (NULL);...srando
2210: 6d 28 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 29 3b  m(random_value);
2220: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 0a 09  ...return(0);...
2230: 2f 2a 20 4e 4f 54 52 45 41 43 48 3a 20 52 65 61  /* NOTREACH: Rea
2240: 64 20 6d 61 79 20 66 61 69 6c 20 6f 72 20 73 75  d may fail or su
2250: 63 63 65 65 64 2c 20 77 65 20 64 6f 6e 27 74 20  cceed, we don't 
2260: 61 63 74 75 61 6c 6c 79 20 63 61 72 65 20 2a 2f  actually care */
2270: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61  ..read_ret = rea
2280: 64 5f 72 65 74 3b 0a 7d 0a 0a 2f 2a 20 4c 69 73  d_ret;.}../* Lis
2290: 74 65 6e 20 6f 6e 20 61 20 70 61 72 74 69 63 75  ten on a particu
22a0: 6c 61 72 20 61 64 64 72 65 73 73 2f 70 6f 72 74  lar address/port
22b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
22c0: 69 6c 65 64 5f 6c 69 73 74 65 6e 28 63 6f 6e 73  iled_listen(cons
22d0: 74 20 63 68 61 72 20 2a 61 64 64 72 65 73 73 2c  t char *address,
22e0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 6f   unsigned int po
22f0: 72 74 29 20 7b 0a 09 73 74 72 75 63 74 20 73 6f  rt) {..struct so
2300: 63 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72 5f  ckaddr_in6 addr_
2310: 76 36 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b  v6;..struct sock
2320: 61 64 64 72 5f 69 6e 20 61 64 64 72 5f 76 34 3b  addr_in addr_v4;
2330: 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ..struct sockadd
2340: 72 20 2a 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65  r *addr;..sockle
2350: 6e 5f 74 20 61 64 64 72 5f 6c 65 6e 3b 0a 09 69  n_t addr_len;..i
2360: 6e 74 20 70 74 6f 6e 5f 72 65 74 2c 20 62 69 6e  nt pton_ret, bin
2370: 64 5f 72 65 74 2c 20 6c 69 73 74 65 6e 5f 72 65  d_ret, listen_re
2380: 74 3b 0a 09 69 6e 74 20 66 61 6d 69 6c 79 3b 0a  t;..int family;.
2390: 09 69 6e 74 20 66 64 3b 0a 0a 09 66 61 6d 69 6c  .int fd;...famil
23a0: 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09 70  y = AF_INET6;..p
23b0: 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70  ton_ret = inet_p
23c0: 74 6f 6e 28 66 61 6d 69 6c 79 2c 20 61 64 64 72  ton(family, addr
23d0: 65 73 73 2c 20 26 61 64 64 72 5f 76 36 2e 73 69  ess, &addr_v6.si
23e0: 6e 36 5f 61 64 64 72 2e 73 36 5f 61 64 64 72 29  n6_addr.s6_addr)
23f0: 3b 0a 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20  ;..if (pton_ret 
2400: 21 3d 20 31 29 20 7b 0a 09 09 66 61 6d 69 6c 79  != 1) {...family
2410: 20 3d 20 41 46 5f 49 4e 45 54 3b 0a 09 09 70 74   = AF_INET;...pt
2420: 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70 74  on_ret = inet_pt
2430: 6f 6e 28 66 61 6d 69 6c 79 2c 20 61 64 64 72 65  on(family, addre
2440: 73 73 2c 20 26 61 64 64 72 5f 76 34 2e 73 69 6e  ss, &addr_v4.sin
2450: 5f 61 64 64 72 2e 73 5f 61 64 64 72 29 3b 0a 09  _addr.s_addr);..
2460: 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20 21 3d  .if (pton_ret !=
2470: 20 31 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28   1) {....return(
2480: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 61 64 64 72  -1);...}....addr
2490: 5f 76 34 2e 73 69 6e 5f 66 61 6d 69 6c 79 20 3d  _v4.sin_family =
24a0: 20 66 61 6d 69 6c 79 3b 0a 09 09 61 64 64 72 5f   family;...addr_
24b0: 76 34 2e 73 69 6e 5f 70 6f 72 74 20 3d 20 68 74  v4.sin_port = ht
24c0: 6f 6e 73 28 70 6f 72 74 29 3b 0a 0a 09 09 61 64  ons(port);....ad
24d0: 64 72 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63  dr = (struct soc
24e0: 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72 5f 76  kaddr *) &addr_v
24f0: 34 3b 0a 09 09 61 64 64 72 5f 6c 65 6e 20 3d 20  4;...addr_len = 
2500: 73 69 7a 65 6f 66 28 61 64 64 72 5f 76 34 29 3b  sizeof(addr_v4);
2510: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 61 64 64  ..} else {...add
2520: 72 5f 76 36 2e 73 69 6e 36 5f 66 61 6d 69 6c 79  r_v6.sin6_family
2530: 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09 09 61   = AF_INET6;...a
2540: 64 64 72 5f 76 36 2e 73 69 6e 36 5f 66 6c 6f 77  ddr_v6.sin6_flow
2550: 69 6e 66 6f 20 3d 20 30 3b 0a 09 09 61 64 64 72  info = 0;...addr
2560: 5f 76 36 2e 73 69 6e 36 5f 73 63 6f 70 65 5f 69  _v6.sin6_scope_i
2570: 64 20 3d 20 30 3b 0a 09 09 61 64 64 72 5f 76 36  d = 0;...addr_v6
2580: 2e 73 69 6e 36 5f 70 6f 72 74 20 3d 20 68 74 6f  .sin6_port = hto
2590: 6e 73 28 70 6f 72 74 29 3b 0a 0a 09 09 61 64 64  ns(port);....add
25a0: 72 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b  r = (struct sock
25b0: 61 64 64 72 20 2a 29 20 26 61 64 64 72 5f 76 36  addr *) &addr_v6
25c0: 3b 0a 09 09 61 64 64 72 5f 6c 65 6e 20 3d 20 73  ;...addr_len = s
25d0: 69 7a 65 6f 66 28 61 64 64 72 5f 76 36 29 3b 0a  izeof(addr_v6);.
25e0: 09 7d 0a 0a 09 66 64 20 3d 20 73 6f 63 6b 65 74  .}...fd = socket
25f0: 28 66 61 6d 69 6c 79 2c 20 53 4f 43 4b 5f 53 54  (family, SOCK_ST
2600: 52 45 41 4d 2c 20 30 29 3b 0a 09 69 66 20 28 66  REAM, 0);..if (f
2610: 64 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72  d < 0) {...retur
2620: 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 62 69 6e 64  n(fd);..}...bind
2630: 5f 72 65 74 20 3d 20 62 69 6e 64 28 66 64 2c 20  _ret = bind(fd, 
2640: 61 64 64 72 2c 20 61 64 64 72 5f 6c 65 6e 29 3b  addr, addr_len);
2650: 0a 09 69 66 20 28 62 69 6e 64 5f 72 65 74 20 3c  ..if (bind_ret <
2660: 20 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64   0) {...close(fd
2670: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
2680: 3b 0a 09 7d 0a 0a 09 6c 69 73 74 65 6e 5f 72 65  ;..}...listen_re
2690: 74 20 3d 20 6c 69 73 74 65 6e 28 66 64 2c 20 31  t = listen(fd, 1
26a0: 32 38 29 3b 0a 09 69 66 20 28 6c 69 73 74 65 6e  28);..if (listen
26b0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 63  _ret != 0) {...c
26c0: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74  lose(fd);....ret
26d0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65  urn(-1);..}...re
26e0: 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 2f 2a 20  turn(fd);.}../* 
26f0: 4c 6f 67 20 61 20 6d 65 73 73 61 67 65 20 2a 2f  Log a message */
2700: 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f  .#ifdef FILED_DO
2710: 4e 54 5f 4c 4f 47 0a 23 20 20 64 65 66 69 6e 65  NT_LOG.#  define
2720: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
2730: 68 72 65 61 64 5f 69 6e 69 74 28 78 29 20 30 0a  hread_init(x) 0.
2740: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
2750: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c  log_msg_debug(x,
2760: 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65   ...) /**/.#  de
2770: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  fine filed_log_m
2780: 73 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a  sg(x, ...) /**/.
2790: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
27a0: 6c 6f 67 5f 65 6e 74 72 79 28 78 29 20 2f 2a 2a  log_entry(x) /**
27b0: 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  /.#  define file
27c0: 64 5f 6c 6f 67 5f 69 70 28 78 2c 20 2e 2e 2e 29  d_log_ip(x, ...)
27d0: 20 4e 55 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20   NULL.#  define 
27e0: 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 78 29  filed_log_new(x)
27f0: 20 26 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f   &local_dummy_lo
2800: 67 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  g.#  define file
2810: 64 5f 6c 6f 67 5f 66 72 65 65 28 78 29 20 2f 2a  d_log_free(x) /*
2820: 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 6c 6f  */../* Return lo
2830: 67 67 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a  gging handle */.
2840: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 69 6c  static FILE *fil
2850: 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73  ed_log_open(cons
2860: 74 20 63 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a  t char *file) {.
2870: 09 72 65 74 75 72 6e 28 73 74 64 6f 75 74 29 3b  .return(stdout);
2880: 0a 09 66 69 6c 65 20 3d 20 66 69 6c 65 3b 0a 7d  ..file = file;.}
2890: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
28a0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 66 72 65 65 28   filed_log_free(
28b0: 78 29 20 66 72 65 65 28 78 29 0a 23 20 20 69 66  x) free(x).#  if
28c0: 64 65 66 20 46 49 4c 45 44 5f 44 45 42 55 47 0a  def FILED_DEBUG.
28d0: 23 20 20 20 20 64 65 66 69 6e 65 20 66 69 6c 65  #    define file
28e0: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
28f0: 78 2c 20 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74  x, ...) { fprint
2900: 66 28 73 74 64 65 72 72 2c 20 78 2c 20 5f 5f 56  f(stderr, x, __V
2910: 41 5f 41 52 47 53 5f 5f 29 3b 20 66 70 72 69 6e  A_ARGS__); fprin
2920: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
2930: 3b 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29  ; fflush(stderr)
2940: 3b 20 7d 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  ; }.#  else.#   
2950: 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f   define filed_lo
2960: 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e  g_msg_debug(x, .
2970: 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69  ..) /**/.#  endi
2980: 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  f../* Initialize
2990: 20 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20   logging thread 
29a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
29b0: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
29c0: 72 65 61 64 28 76 6f 69 64 20 2a 61 72 67 5f 70  read(void *arg_p
29d0: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
29e0: 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64  d_logging_thread
29f0: 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09 73 74 72  _args *arg;..str
2a00: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
2a10: 74 72 79 20 2a 63 75 72 72 2c 20 2a 70 72 65 76  try *curr, *prev
2a20: 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d  ;..const char *m
2a30: 65 74 68 6f 64 3b 0a 09 74 69 6d 65 5f 74 20 6e  ethod;..time_t n
2a40: 6f 77 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 0a  ow;..FILE *fp;..
2a50: 09 61 72 67 20 3d 20 61 72 67 5f 70 3b 0a 0a 09  .arg = arg_p;...
2a60: 66 70 20 3d 20 61 72 67 2d 3e 66 70 3b 0a 0a 09  fp = arg->fp;...
2a70: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 70 74  while (1) {...pt
2a80: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
2a90: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
2aa0: 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 09 09 70  list_mutex);...p
2ab0: 74 68 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69 74  thread_cond_wait
2ac0: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
2ad0: 6c 69 73 74 5f 72 65 61 64 79 2c 20 26 66 69 6c  list_ready, &fil
2ae0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
2af0: 6d 75 74 65 78 29 3b 0a 0a 09 09 63 75 72 72 20  mutex);....curr 
2b00: 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  = filed_log_msg_
2b10: 6c 69 73 74 3b 0a 09 09 66 69 6c 65 64 5f 6c 6f  list;...filed_lo
2b20: 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 4e 55 4c  g_msg_list = NUL
2b30: 4c 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  L;....pthread_mu
2b40: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65  tex_unlock(&file
2b50: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
2b60: 75 74 65 78 29 3b 0a 0a 09 09 6e 6f 77 20 3d 20  utex);....now = 
2b70: 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 09 70  time(NULL);....p
2b80: 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 09 66 6f  rev = NULL;...fo
2b90: 72 20 28 3b 20 63 75 72 72 3b 20 63 75 72 72 20  r (; curr; curr 
2ba0: 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  = curr->_next) {
2bb0: 0a 09 09 09 63 75 72 72 2d 3e 5f 70 72 65 76 20  ....curr->_prev 
2bc0: 3d 20 70 72 65 76 3b 0a 0a 09 09 09 70 72 65 76  = prev;.....prev
2bd0: 20 3d 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09 09   = curr;...}....
2be0: 63 75 72 72 20 3d 20 70 72 65 76 3b 0a 09 09 77  curr = prev;...w
2bf0: 68 69 6c 65 20 28 63 75 72 72 29 20 7b 0a 09 09  hile (curr) {...
2c00: 09 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74  .switch (curr->t
2c10: 79 70 65 29 20 7b 0a 09 09 09 09 63 61 73 65 20  ype) {.....case 
2c20: 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d  FILED_LOG_TYPE_M
2c30: 45 53 53 41 47 45 3a 0a 09 09 09 09 09 66 70 72  ESSAGE:......fpr
2c40: 69 6e 74 66 28 66 70 2c 20 22 25 73 22 2c 20 63  intf(fp, "%s", c
2c50: 75 72 72 2d 3e 62 75 66 66 65 72 29 3b 0a 0a 09  urr->buffer);...
2c60: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63  ....break;.....c
2c70: 61 73 65 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59  ase FILED_LOG_TY
2c80: 50 45 5f 54 52 41 4e 53 46 45 52 3a 0a 09 09 09  PE_TRANSFER:....
2c90: 09 09 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e  ..switch (curr->
2ca0: 6d 65 74 68 6f 64 29 20 7b 0a 09 09 09 09 09 09  method) {.......
2cb0: 63 61 73 65 20 46 49 4c 45 44 5f 52 45 51 55 45  case FILED_REQUE
2cc0: 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 3a 0a 09  ST_METHOD_GET:..
2cd0: 09 09 09 09 09 09 6d 65 74 68 6f 64 3d 22 47 45  ......method="GE
2ce0: 54 22 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  T";........break
2cf0: 3b 0a 09 09 09 09 09 09 63 61 73 65 20 46 49 4c  ;.......case FIL
2d00: 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f  ED_REQUEST_METHO
2d10: 44 5f 48 45 41 44 3a 0a 09 09 09 09 09 09 09 6d  D_HEAD:........m
2d20: 65 74 68 6f 64 3d 22 48 45 41 44 22 3b 0a 09 09  ethod="HEAD";...
2d30: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2d40: 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09  ..default:......
2d50: 09 09 6d 65 74 68 6f 64 3d 22 3c 75 6e 6b 6e 6f  ..method="<unkno
2d60: 77 6e 3e 22 3b 0a 09 09 09 09 09 09 09 62 72 65  wn>";........bre
2d70: 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
2d80: 09 69 66 20 28 63 75 72 72 2d 3e 65 6e 64 74 69  .if (curr->endti
2d90: 6d 65 20 3d 3d 20 28 28 74 69 6d 65 5f 74 29 20  me == ((time_t) 
2da0: 2d 31 29 29 20 7b 0a 09 09 09 09 09 09 63 75 72  -1)) {.......cur
2db0: 72 2d 3e 65 6e 64 74 69 6d 65 20 3d 20 6e 6f 77  r->endtime = now
2dc0: 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 66  ;......}.......f
2dd0: 70 72 69 6e 74 66 28 66 70 2c 20 22 54 52 41 4e  printf(fp, "TRAN
2de0: 53 46 45 52 20 4d 45 54 48 4f 44 3d 25 73 20 50  SFER METHOD=%s P
2df0: 41 54 48 3d 25 73 20 53 52 43 3d 25 73 3a 25 69  ATH=%s SRC=%s:%i
2e00: 20 54 49 4d 45 2e 53 54 41 52 54 3d 25 6c 6c 75   TIME.START=%llu
2e10: 20 54 49 4d 45 2e 45 4e 44 3d 25 6c 6c 75 20 43   TIME.END=%llu C
2e20: 4f 44 45 2e 56 41 4c 55 45 3d 25 75 20 43 4f 44  ODE.VALUE=%u COD
2e30: 45 2e 52 45 41 53 4f 4e 3d 25 73 20 52 45 51 55  E.REASON=%s REQU
2e40: 45 53 54 2e 4f 46 46 53 45 54 3d 25 6c 6c 75 20  EST.OFFSET=%llu 
2e50: 52 45 51 55 45 53 54 2e 4c 45 4e 47 54 48 3d 25  REQUEST.LENGTH=%
2e60: 6c 6c 75 20 46 49 4c 45 2e 4c 45 4e 47 54 48 3d  llu FILE.LENGTH=
2e70: 25 6c 6c 75 20 54 52 41 4e 53 46 45 52 2e 4c 45  %llu TRANSFER.LE
2e80: 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 09  NGTH=%llu",.....
2e90: 09 09 6d 65 74 68 6f 64 2c 0a 09 09 09 09 09 09  ..method,.......
2ea0: 63 75 72 72 2d 3e 62 75 66 66 65 72 2c 0a 09 09  curr->buffer,...
2eb0: 09 09 09 09 63 75 72 72 2d 3e 69 70 2c 20 63 75  ....curr->ip, cu
2ec0: 72 72 2d 3e 70 6f 72 74 2c 0a 09 09 09 09 09 09  rr->port,.......
2ed0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2ee0: 6f 6e 67 29 20 63 75 72 72 2d 3e 73 74 61 72 74  ong) curr->start
2ef0: 74 69 6d 65 2c 0a 09 09 09 09 09 09 28 75 6e 73  time,.......(uns
2f00: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
2f10: 20 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65 2c 0a   curr->endtime,.
2f20: 09 09 09 09 09 09 63 75 72 72 2d 3e 68 74 74 70  ......curr->http
2f30: 5f 63 6f 64 65 2c 20 63 75 72 72 2d 3e 72 65 61  _code, curr->rea
2f40: 73 6f 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69  son,.......(unsi
2f50: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2f60: 63 75 72 72 2d 3e 72 65 71 5f 6f 66 66 73 65 74  curr->req_offset
2f70: 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65  ,.......(unsigne
2f80: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72  d long long) cur
2f90: 72 2d 3e 72 65 71 5f 6c 65 6e 67 74 68 2c 0a 09  r->req_length,..
2fa0: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
2fb0: 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e  ong long) curr->
2fc0: 66 69 6c 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09  file_length,....
2fd0: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
2fe0: 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73 65  g long) curr->se
2ff0: 6e 74 5f 6c 65 6e 67 74 68 0a 09 09 09 09 09 29  nt_length......)
3000: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
3010: 09 09 7d 0a 09 09 09 66 70 72 69 6e 74 66 28 66  ..}....fprintf(f
3020: 70 2c 20 22 20 54 48 52 45 41 44 3d 25 6c 6c 75  p, " THREAD=%llu
3030: 20 54 49 4d 45 3d 25 6c 6c 75 5c 6e 22 2c 0a 09   TIME=%llu\n",..
3040: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
3050: 67 20 6c 6f 6e 67 29 20 28 28 69 6e 74 70 74 72  g long) ((intptr
3060: 5f 74 29 20 63 75 72 72 2d 3e 74 68 72 65 61 64  _t) curr->thread
3070: 29 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64  ),.....(unsigned
3080: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 6e 6f 77 0a   long long) now.
3090: 09 09 09 29 3b 0a 09 09 09 66 66 6c 75 73 68 28  ...);....fflush(
30a0: 66 70 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20  fp);.....prev = 
30b0: 63 75 72 72 3b 0a 09 09 09 63 75 72 72 20 3d 20  curr;....curr = 
30c0: 63 75 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09  curr->_prev;....
30d0: 09 66 72 65 65 28 70 72 65 76 29 3b 0a 09 09 7d  .free(prev);...}
30e0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c  ..}...return(NUL
30f0: 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  L);.}..static vo
3100: 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  id filed_log_ent
3110: 72 79 28 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ry(struct filed_
3120: 6c 6f 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79  log_entry *entry
3130: 29 20 7b 0a 09 65 6e 74 72 79 2d 3e 74 68 72 65  ) {..entry->thre
3140: 61 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  ad = pthread_sel
3150: 66 28 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d  f();...pthread_m
3160: 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64  utex_lock(&filed
3170: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
3180: 74 65 78 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f  tex);...entry->_
3190: 6e 65 78 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67  next = filed_log
31a0: 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 66 69 6c 65  _msg_list;..file
31b0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d  d_log_msg_list =
31c0: 20 65 6e 74 72 79 3b 0a 0a 09 70 74 68 72 65 61   entry;...pthrea
31d0: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
31e0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
31f0: 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 70 74 68  st_mutex);...pth
3200: 72 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c  read_cond_signal
3210: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
3220: 6c 69 73 74 5f 72 65 61 64 79 29 3b 0a 0a 09 72  list_ready);...r
3230: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
3240: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f   struct filed_lo
3250: 67 5f 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c  g_entry *filed_l
3260: 6f 67 5f 6e 65 77 28 69 6e 74 20 69 6e 69 74 69  og_new(int initi
3270: 61 6c 69 7a 65 29 20 7b 0a 09 73 74 72 75 63 74  alize) {..struct
3280: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
3290: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
32a0: 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  al = malloc(size
32b0: 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09  of(*retval));...
32c0: 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 29 20  if (initialize) 
32d0: 7b 0a 09 09 72 65 74 76 61 6c 2d 3e 62 75 66 66  {...retval->buff
32e0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  er[0] = '\0';...
32f0: 72 65 74 76 61 6c 2d 3e 68 74 74 70 5f 63 6f 64  retval->http_cod
3300: 65 20 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c  e = -1;...retval
3310: 2d 3e 73 74 61 72 74 74 69 6d 65 20 3d 20 30 3b  ->starttime = 0;
3320: 0a 09 09 72 65 74 76 61 6c 2d 3e 65 6e 64 74 69  ...retval->endti
3330: 6d 65 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c  me = 0;...retval
3340: 2d 3e 72 65 71 5f 6f 66 66 73 65 74 20 3d 20 30  ->req_offset = 0
3350: 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65 71 5f  ;...retval->req_
3360: 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72 65  length = 0;...re
3370: 74 76 61 6c 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74  tval->sent_lengt
3380: 68 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d  h = 0;...retval-
3390: 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 30  >file_length = 0
33a0: 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 69 70 5b 30  ;...retval->ip[0
33b0: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65 74 76  ] = '\0';...retv
33c0: 61 6c 2d 3e 70 6f 72 74 20 3d 20 2d 31 3b 0a 09  al->port = -1;..
33d0: 09 72 65 74 76 61 6c 2d 3e 6d 65 74 68 6f 64 20  .retval->method 
33e0: 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  = -1;..}...retur
33f0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
3400: 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f  atic void filed_
3410: 6c 6f 67 5f 6d 73 67 28 63 6f 6e 73 74 20 63 68  log_msg(const ch
3420: 61 72 20 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a  ar *fmt, ...) {.
3430: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  .struct filed_lo
3440: 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a  g_entry *entry;.
3450: 09 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a 0a  .va_list args;..
3460: 09 65 6e 74 72 79 20 3d 20 66 69 6c 65 64 5f 6c  .entry = filed_l
3470: 6f 67 5f 6e 65 77 28 30 29 3b 0a 0a 09 76 61 5f  og_new(0);...va_
3480: 73 74 61 72 74 28 61 72 67 73 2c 20 66 6d 74 29  start(args, fmt)
3490: 3b 0a 0a 09 76 73 6e 70 72 69 6e 74 66 28 65 6e  ;...vsnprintf(en
34a0: 74 72 79 2d 3e 62 75 66 66 65 72 2c 20 73 69 7a  try->buffer, siz
34b0: 65 6f 66 28 65 6e 74 72 79 2d 3e 62 75 66 66 65  eof(entry->buffe
34c0: 72 29 2c 20 66 6d 74 2c 20 61 72 67 73 29 3b 0a  r), fmt, args);.
34d0: 0a 09 76 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a  ..va_end(args);.
34e0: 0a 09 65 6e 74 72 79 2d 3e 74 79 70 65 20 3d 20  ..entry->type = 
34f0: 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d  FILED_LOG_TYPE_M
3500: 45 53 53 41 47 45 3b 0a 0a 09 66 69 6c 65 64 5f  ESSAGE;...filed_
3510: 6c 6f 67 5f 65 6e 74 72 79 28 65 6e 74 72 79 29  log_entry(entry)
3520: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73  ;...return;.}..s
3530: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3540: 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 73   *filed_log_ip(s
3550: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
3560: 61 64 64 72 2c 20 63 68 61 72 20 2a 62 75 66 66  addr, char *buff
3570: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65  er, size_t buffe
3580: 72 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20  rlen) {..struct 
3590: 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 61 64 64  sockaddr_in *add
35a0: 72 5f 76 34 3b 0a 09 73 74 72 75 63 74 20 73 6f  r_v4;..struct so
35b0: 63 6b 61 64 64 72 5f 69 6e 36 20 2a 61 64 64 72  ckaddr_in6 *addr
35c0: 5f 76 36 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72  _v6;..const char
35d0: 20 2a 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b   *retval = NULL;
35e0: 0a 0a 09 61 64 64 72 5f 76 36 20 3d 20 28 73 74  ...addr_v6 = (st
35f0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
3600: 36 20 2a 29 20 61 64 64 72 3b 0a 0a 09 73 77 69  6 *) addr;...swi
3610: 74 63 68 20 28 61 64 64 72 5f 76 36 2d 3e 73 69  tch (addr_v6->si
3620: 6e 36 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 63  n6_family) {...c
3630: 61 73 65 20 41 46 5f 49 4e 45 54 3a 0a 09 09 09  ase AF_INET:....
3640: 61 64 64 72 5f 76 34 20 3d 20 28 73 74 72 75 63  addr_v4 = (struc
3650: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 29  t sockaddr_in *)
3660: 20 61 64 64 72 3b 0a 09 09 09 72 65 74 76 61 6c   addr;....retval
3670: 20 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f   = inet_ntop(AF_
3680: 49 4e 45 54 2c 20 26 61 64 64 72 5f 76 34 2d 3e  INET, &addr_v4->
3690: 73 69 6e 5f 61 64 64 72 2c 20 62 75 66 66 65 72  sin_addr, buffer
36a0: 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09  , bufferlen);...
36b0: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41  .break;...case A
36c0: 46 5f 49 4e 45 54 36 3a 0a 09 09 09 72 65 74 76  F_INET6:....retv
36d0: 61 6c 20 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41  al = inet_ntop(A
36e0: 46 5f 49 4e 45 54 36 2c 20 26 61 64 64 72 5f 76  F_INET6, &addr_v
36f0: 36 2d 3e 73 69 6e 36 5f 61 64 64 72 2c 20 62 75  6->sin6_addr, bu
3700: 66 66 65 72 2c 20 62 75 66 66 65 72 6c 65 6e 29  ffer, bufferlen)
3710: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
3720: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
3730: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20  .}..static FILE 
3740: 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28  *filed_log_open(
3750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
3760: 29 20 7b 0a 09 46 49 4c 45 20 2a 72 65 74 76 61  ) {..FILE *retva
3770: 6c 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28  l;...if (strcmp(
3780: 66 69 6c 65 2c 20 22 2d 22 29 20 3d 3d 20 30 29  file, "-") == 0)
3790: 20 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20 73 74   {...retval = st
37a0: 64 6f 75 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66  dout;..} else if
37b0: 20 28 66 69 6c 65 5b 30 5d 20 3d 3d 20 27 7c 27   (file[0] == '|'
37c0: 29 20 7b 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09 09  ) {...file++;...
37d0: 72 65 74 76 61 6c 20 3d 20 70 6f 70 65 6e 28 66  retval = popen(f
37e0: 69 6c 65 2c 20 22 77 22 29 3b 0a 09 7d 20 65 6c  ile, "w");..} el
37f0: 73 65 20 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20  se {...retval = 
3800: 66 6f 70 65 6e 28 66 69 6c 65 2c 20 22 61 2b 22  fopen(file, "a+"
3810: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  );..}...return(r
3820: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
3830: 63 20 69 6e 74 20 66 69 6c 65 64 5f 6c 6f 67 67  c int filed_logg
3840: 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28  ing_thread_init(
3850: 46 49 4c 45 20 2a 6c 6f 67 66 70 29 20 7b 0a 09  FILE *logfp) {..
3860: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
3870: 67 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73  ging_thread_args
3880: 20 2a 61 72 67 73 3b 0a 09 70 74 68 72 65 61 64   *args;..pthread
3890: 5f 74 20 74 68 72 65 61 64 5f 69 64 3b 0a 0a 09  _t thread_id;...
38a0: 61 72 67 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  args = malloc(si
38b0: 7a 65 6f 66 28 2a 61 72 67 73 29 29 3b 0a 09 61  zeof(*args));..a
38c0: 72 67 73 2d 3e 66 70 20 3d 20 6c 6f 67 66 70 3b  rgs->fp = logfp;
38d0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
38e0: 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _list = NULL;...
38f0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
3900: 69 74 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  it(&filed_log_ms
3910: 67 5f 6c 69 73 74 5f 6d 75 74 65 78 2c 20 4e 55  g_list_mutex, NU
3920: 4c 4c 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63  LL);...pthread_c
3930: 72 65 61 74 65 28 26 74 68 72 65 61 64 5f 69 64  reate(&thread_id
3940: 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f  , NULL, filed_lo
3950: 67 67 69 6e 67 5f 74 68 72 65 61 64 2c 20 61 72  gging_thread, ar
3960: 67 73 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  gs);...filed_log
3970: 5f 6d 73 67 28 22 53 54 41 52 54 22 29 3b 0a 0a  _msg("START");..
3980: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 65  .return(0);.}.#e
3990: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 46 49 4c  ndif..#ifdef FIL
39a0: 45 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 0a  ED_DONT_TIMEOUT.
39b0: 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f  #define filed_so
39c0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65  ckettimeout_thre
39d0: 61 64 5f 69 6e 69 74 28 29 20 30 0a 23 64 65 66  ad_init() 0.#def
39e0: 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  ine filed_socket
39f0: 74 69 6d 65 6f 75 74 5f 69 6e 69 74 28 29 20 30  timeout_init() 0
3a00: 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73  .#define filed_s
3a10: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 61 63 63  ockettimeout_acc
3a20: 65 70 74 28 78 29 20 2f 2a 2a 2f 0a 23 64 65 66  ept(x) /**/.#def
3a30: 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  ine filed_socket
3a40: 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69  timeout_processi
3a50: 6e 67 5f 73 74 61 72 74 28 78 29 20 2f 2a 2a 2f  ng_start(x) /**/
3a60: 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73  .#define filed_s
3a70: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f  ockettimeout_pro
3a80: 63 65 73 73 69 6e 67 5f 65 6e 64 28 78 29 20 2f  cessing_end(x) /
3a90: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6c 65  **/.#define file
3aa0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3ab0: 63 6c 6f 73 65 28 78 29 20 2f 2a 2a 2f 0a 23 65  close(x) /**/.#e
3ac0: 6c 73 65 0a 5f 41 74 6f 6d 69 63 20 74 69 6d 65  lse._Atomic time
3ad0: 5f 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  _t filed_sockett
3ae0: 69 6d 65 6f 75 74 5f 74 69 6d 65 3b 0a 73 74 72  imeout_time;.str
3af0: 75 63 74 20 7b 0a 09 5f 41 74 6f 6d 69 63 20 74  uct {.._Atomic t
3b00: 69 6d 65 5f 74 20 65 78 70 69 72 61 74 69 6f 6e  ime_t expiration
3b10: 5f 74 69 6d 65 3b 0a 09 5f 41 74 6f 6d 69 63 20  _time;.._Atomic 
3b20: 70 74 68 72 65 61 64 5f 74 20 74 68 72 65 61 64  pthread_t thread
3b30: 5f 69 64 3b 0a 09 62 6f 6f 6c 20 76 61 6c 69 64  _id;..bool valid
3b40: 3b 0a 7d 2a 20 66 69 6c 65 64 5f 73 6f 63 6b 65  ;.}* filed_socke
3b50: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
3b60: 74 75 73 3b 0a 6c 6f 6e 67 20 66 69 6c 65 64 5f  tus;.long filed_
3b70: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
3b80: 63 6b 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 3b  ckstatus_length;
3b90: 0a 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65  .int filed_socke
3ba0: 74 74 69 6d 65 6f 75 74 5f 64 65 76 6e 75 6c 6c  ttimeout_devnull
3bb0: 5f 66 64 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  _fd;..static int
3bc0: 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d   filed_sockettim
3bd0: 65 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72  eout_sockfd_in_r
3be0: 61 6e 67 65 28 69 6e 74 20 73 6f 63 6b 66 64 29  ange(int sockfd)
3bf0: 20 7b 0a 09 69 66 20 28 73 6f 63 6b 66 64 20 3c   {..if (sockfd <
3c00: 20 33 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30   3) {...return(0
3c10: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b  );..}...if (sock
3c20: 66 64 20 3e 20 66 69 6c 65 64 5f 73 6f 63 6b 65  fd > filed_socke
3c30: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
3c40: 74 75 73 5f 6c 65 6e 67 74 68 29 20 7b 0a 09 09  tus_length) {...
3c50: 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
3c60: 72 65 74 75 72 6e 28 31 29 3b 0a 7d 0a 0a 73 74  return(1);.}..st
3c70: 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f  atic void filed_
3c80: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65 78  sockettimeout_ex
3c90: 70 69 72 65 28 69 6e 74 20 73 6f 63 6b 66 64 2c  pire(int sockfd,
3ca0: 20 69 6e 74 20 6c 65 6e 67 74 68 29 20 7b 0a 09   int length) {..
3cb0: 74 69 6d 65 5f 74 20 6e 6f 77 2c 20 65 78 70 69  time_t now, expi
3cc0: 72 65 3b 0a 0a 09 6e 6f 77 20 3d 20 61 74 6f 6d  re;...now = atom
3cd0: 69 63 5f 6c 6f 61 64 28 26 66 69 6c 65 64 5f 73  ic_load(&filed_s
3ce0: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 69 6d  ockettimeout_tim
3cf0: 65 29 3b 0a 0a 09 65 78 70 69 72 65 20 3d 20 6e  e);...expire = n
3d00: 6f 77 20 2b 20 6c 65 6e 67 74 68 3b 0a 0a 09 61  ow + length;...a
3d10: 74 6f 6d 69 63 5f 73 74 6f 72 65 28 26 66 69 6c  tomic_store(&fil
3d20: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3d30: 5f 73 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b  _sockstatus[sock
3d40: 66 64 5d 2e 65 78 70 69 72 61 74 69 6f 6e 5f 74  fd].expiration_t
3d50: 69 6d 65 2c 20 65 78 70 69 72 65 29 3b 0a 0a 09  ime, expire);...
3d60: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
3d70: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63  c void filed_soc
3d80: 6b 65 74 74 69 6d 65 6f 75 74 5f 61 63 63 65 70  kettimeout_accep
3d90: 74 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b 0a  t(int sockfd) {.
3da0: 09 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63 6b  .if (!filed_sock
3db0: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66 64  ettimeout_sockfd
3dc0: 5f 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66 64  _in_range(sockfd
3dd0: 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  )) {...return;..
3de0: 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74  }...filed_socket
3df0: 74 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28 73  timeout_expire(s
3e00: 6f 63 6b 66 64 2c 20 36 30 29 3b 0a 0a 09 61 74  ockfd, 60);...at
3e10: 6f 6d 69 63 5f 73 74 6f 72 65 28 26 66 69 6c 65  omic_store(&file
3e20: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3e30: 73 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66  sockstatus[sockf
3e40: 64 5d 2e 74 68 72 65 61 64 5f 69 64 2c 20 70 74  d].thread_id, pt
3e50: 68 72 65 61 64 5f 73 65 6c 66 28 29 29 3b 0a 0a  hread_self());..
3e60: 09 61 74 6f 6d 69 63 5f 73 74 6f 72 65 28 26 66  .atomic_store(&f
3e70: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3e80: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 73 6f  ut_sockstatus[so
3e90: 63 6b 66 64 5d 2e 76 61 6c 69 64 2c 20 74 72 75  ckfd].valid, tru
3ea0: 65 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  e);...return;.}.
3eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
3ec0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3ed0: 5f 70 72 6f 63 65 73 73 69 6e 67 5f 73 74 61 72  _processing_star
3ee0: 74 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b 0a  t(int sockfd) {.
3ef0: 09 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63 6b  .if (!filed_sock
3f00: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66 64  ettimeout_sockfd
3f10: 5f 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66 64  _in_range(sockfd
3f20: 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  )) {...return;..
3f30: 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74  }...filed_socket
3f40: 74 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28 73  timeout_expire(s
3f50: 6f 63 6b 66 64 2c 20 38 36 34 30 30 29 3b 0a 0a  ockfd, 86400);..
3f60: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
3f70: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f  ic void filed_so
3f80: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63  ckettimeout_proc
3f90: 65 73 73 69 6e 67 5f 65 6e 64 28 69 6e 74 20 73  essing_end(int s
3fa0: 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28 21 66  ockfd) {..if (!f
3fb0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3fc0: 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e  ut_sockfd_in_ran
3fd0: 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a 09 09  ge(sockfd)) {...
3fe0: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 69 6c  return;..}...fil
3ff0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
4000: 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64 2c 20  _expire(sockfd, 
4010: 36 30 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  60);...return;.}
4020: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  ..static void fi
4030: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
4040: 74 5f 63 6c 6f 73 65 28 69 6e 74 20 73 6f 63 6b  t_close(int sock
4050: 66 64 29 20 7b 0a 09 69 66 20 28 21 66 69 6c 65  fd) {..if (!file
4060: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
4070: 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28  sockfd_in_range(
4080: 73 6f 63 6b 66 64 29 29 20 7b 0a 09 09 72 65 74  sockfd)) {...ret
4090: 75 72 6e 3b 0a 09 7d 0a 0a 09 61 74 6f 6d 69 63  urn;..}...atomic
40a0: 5f 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f  _store(&filed_so
40b0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
40c0: 73 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 76  status[sockfd].v
40d0: 61 6c 69 64 2c 20 66 61 6c 73 65 29 3b 0a 0a 09  alid, false);...
40e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
40f0: 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 73 6f  c void *filed_so
4100: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65  ckettimeout_thre
4110: 61 64 28 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  ad(void *arg) {.
4120: 09 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63  .struct timespec
4130: 20 73 6c 65 65 70 5f 74 69 6d 65 3b 0a 09 74 69   sleep_time;..ti
4140: 6d 65 5f 74 20 6e 6f 77 2c 20 65 78 70 69 72 61  me_t now, expira
4150: 74 69 6f 6e 5f 74 69 6d 65 3b 0a 09 70 74 68 72  tion_time;..pthr
4160: 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69 64 3b  ead_t thread_id;
4170: 0a 09 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74  ..long idx;..int
4180: 20 63 6f 75 6e 74 3b 0a 09 62 6f 6f 6c 20 76 61   count;..bool va
4190: 6c 69 64 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  lid;...while (1)
41a0: 20 7b 0a 09 09 66 6f 72 20 28 63 6f 75 6e 74 20   {...for (count 
41b0: 3d 20 30 3b 20 63 6f 75 6e 74 20 3c 20 31 30 3b  = 0; count < 10;
41c0: 20 63 6f 75 6e 74 2b 2b 29 20 7b 0a 09 09 09 73   count++) {....s
41d0: 6c 65 65 70 5f 74 69 6d 65 2e 74 76 5f 73 65 63  leep_time.tv_sec
41e0: 20 3d 20 33 30 3b 0a 09 09 09 73 6c 65 65 70 5f   = 30;....sleep_
41f0: 74 69 6d 65 2e 74 76 5f 6e 73 65 63 20 3d 20 30  time.tv_nsec = 0
4200: 3b 0a 09 09 09 6e 61 6e 6f 73 6c 65 65 70 28 26  ;....nanosleep(&
4210: 73 6c 65 65 70 5f 74 69 6d 65 2c 20 4e 55 4c 4c  sleep_time, NULL
4220: 29 3b 0a 0a 09 09 09 6e 6f 77 20 3d 20 74 69 6d  );.....now = tim
4230: 65 28 4e 55 4c 4c 29 3b 0a 0a 09 09 09 61 74 6f  e(NULL);.....ato
4240: 6d 69 63 5f 73 74 6f 72 65 28 26 66 69 6c 65 64  mic_store(&filed
4250: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74  _sockettimeout_t
4260: 69 6d 65 2c 20 6e 6f 77 29 3b 0a 09 09 7d 0a 0a  ime, now);...}..
4270: 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
4280: 69 64 78 20 3c 20 66 69 6c 65 64 5f 73 6f 63 6b  idx < filed_sock
4290: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74  ettimeout_sockst
42a0: 61 74 75 73 5f 6c 65 6e 67 74 68 3b 20 69 64 78  atus_length; idx
42b0: 2b 2b 29 20 7b 0a 09 09 09 76 61 6c 69 64 20 3d  ++) {....valid =
42c0: 20 61 74 6f 6d 69 63 5f 6c 6f 61 64 28 26 66 69   atomic_load(&fi
42d0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
42e0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69 64 78  t_sockstatus[idx
42f0: 5d 2e 76 61 6c 69 64 29 3b 0a 0a 09 09 09 69 66  ].valid);.....if
4300: 20 28 21 76 61 6c 69 64 29 20 7b 0a 09 09 09 09   (!valid) {.....
4310: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
4320: 09 09 09 65 78 70 69 72 61 74 69 6f 6e 5f 74 69  ...expiration_ti
4330: 6d 65 20 3d 20 61 74 6f 6d 69 63 5f 6c 6f 61 64  me = atomic_load
4340: 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  (&filed_socketti
4350: 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73  meout_sockstatus
4360: 5b 69 64 78 5d 2e 65 78 70 69 72 61 74 69 6f 6e  [idx].expiration
4370: 5f 74 69 6d 65 29 3b 0a 0a 09 09 09 74 68 72 65  _time);.....thre
4380: 61 64 5f 69 64 20 3d 20 61 74 6f 6d 69 63 5f 6c  ad_id = atomic_l
4390: 6f 61 64 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65  oad(&filed_socke
43a0: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
43b0: 74 75 73 5b 69 64 78 5d 2e 74 68 72 65 61 64 5f  tus[idx].thread_
43c0: 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 65 78 70  id);.....if (exp
43d0: 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20 3e 20 6e  iration_time > n
43e0: 6f 77 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ow) {.....contin
43f0: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 69 6c  ue;....}.....fil
4400: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
4410: 5f 63 6c 6f 73 65 28 69 64 78 29 3b 0a 0a 09 09  _close(idx);....
4420: 09 64 75 70 32 28 66 69 6c 65 64 5f 73 6f 63 6b  .dup2(filed_sock
4430: 65 74 74 69 6d 65 6f 75 74 5f 64 65 76 6e 75 6c  ettimeout_devnul
4440: 6c 5f 66 64 2c 20 69 64 78 29 3b 0a 0a 09 09 09  l_fd, idx);.....
4450: 70 74 68 72 65 61 64 5f 6b 69 6c 6c 28 74 68 72  pthread_kill(thr
4460: 65 61 64 5f 69 64 2c 20 53 49 47 50 49 50 45 29  ead_id, SIGPIPE)
4470: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
4480: 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 4e 4f  n(NULL);.../* NO
4490: 54 52 45 41 43 48 3a 20 57 65 20 64 6f 6e 27 74  TREACH: We don't
44a0: 20 61 63 74 75 61 6c 6c 79 20 74 61 6b 65 20 61   actually take a
44b0: 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ny arguments */.
44c0: 09 61 72 67 20 3d 20 61 72 67 3b 0a 7d 0a 0a 73  .arg = arg;.}..s
44d0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
44e0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68  sockettimeout_th
44f0: 72 65 61 64 5f 69 6e 69 74 28 76 6f 69 64 29 20  read_init(void) 
4500: 7b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72  {..pthread_t thr
4510: 65 61 64 5f 69 64 3b 0a 0a 09 70 74 68 72 65 61  ead_id;...pthrea
4520: 64 5f 63 72 65 61 74 65 28 26 74 68 72 65 61 64  d_create(&thread
4530: 5f 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65 64  _id, NULL, filed
4540: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74  _sockettimeout_t
4550: 68 72 65 61 64 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  hread, NULL);...
4560: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
4570: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 73  atic int filed_s
4580: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69 6e 69  ockettimeout_ini
4590: 74 28 76 6f 69 64 29 20 7b 0a 09 6c 6f 6e 67 20  t(void) {..long 
45a0: 6d 61 78 66 64 2c 20 69 64 78 3b 0a 0a 09 6d 61  maxfd, idx;...ma
45b0: 78 66 64 20 3d 20 73 79 73 63 6f 6e 66 28 5f 53  xfd = sysconf(_S
45c0: 43 5f 4f 50 45 4e 5f 4d 41 58 29 3b 0a 09 69 66  C_OPEN_MAX);..if
45d0: 20 28 6d 61 78 66 64 20 3c 3d 20 30 29 20 7b 0a   (maxfd <= 0) {.
45e0: 09 09 6d 61 78 66 64 20 3d 20 34 30 39 36 3b 0a  ..maxfd = 4096;.
45f0: 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65  .}...filed_socke
4600: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
4610: 74 75 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tus = malloc(siz
4620: 65 6f 66 28 2a 66 69 6c 65 64 5f 73 6f 63 6b 65  eof(*filed_socke
4630: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
4640: 74 75 73 29 20 2a 20 6d 61 78 66 64 29 3b 0a 09  tus) * maxfd);..
4650: 69 66 20 28 66 69 6c 65 64 5f 73 6f 63 6b 65 74  if (filed_socket
4660: 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74  timeout_sockstat
4670: 75 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  us == NULL) {...
4680: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
4690: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
46a0: 64 78 20 3c 20 6d 61 78 66 64 3b 20 69 64 78 2b  dx < maxfd; idx+
46b0: 2b 29 20 7b 0a 09 09 66 69 6c 65 64 5f 73 6f 63  +) {...filed_soc
46c0: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73  kettimeout_socks
46d0: 74 61 74 75 73 5b 69 64 78 5d 2e 76 61 6c 69 64  tatus[idx].valid
46e0: 20 3d 20 66 61 6c 73 65 3b 0a 09 7d 0a 0a 09 66   = false;..}...f
46f0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4700: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c 65  ut_sockstatus_le
4710: 6e 67 74 68 20 3d 20 6d 61 78 66 64 3b 0a 09 66  ngth = maxfd;..f
4720: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4730: 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 20 3d 20  ut_devnull_fd = 
4740: 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  open("/dev/null"
4750: 2c 20 4f 5f 52 44 57 52 29 3b 0a 09 69 66 20 28  , O_RDWR);..if (
4760: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
4770: 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 20 3c  out_devnull_fd <
4780: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
4790: 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  1);..}...return(
47a0: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0);.}.#endif../*
47b0: 20 46 6f 72 6d 61 74 20 74 69 6d 65 20 70 65 72   Format time per
47c0: 20 52 46 43 32 36 31 36 20 2a 2f 0a 73 74 61 74   RFC2616 */.stat
47d0: 69 63 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 66  ic char *filed_f
47e0: 6f 72 6d 61 74 5f 74 69 6d 65 28 63 68 61 72 20  ormat_time(char 
47f0: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
4800: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 63 6f 6e 73  buffer_len, cons
4810: 74 20 74 69 6d 65 5f 74 20 74 69 6d 65 69 6e 66  t time_t timeinf
4820: 6f 29 20 7b 0a 09 73 74 72 75 63 74 20 74 6d 20  o) {..struct tm 
4830: 74 69 6d 65 69 6e 66 6f 5f 74 6d 2c 20 2a 74 69  timeinfo_tm, *ti
4840: 6d 65 69 6e 66 6f 5f 74 6d 5f 70 3b 0a 0a 09 74  meinfo_tm_p;...t
4850: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 20 67  imeinfo_tm_p = g
4860: 6d 74 69 6d 65 5f 72 28 26 74 69 6d 65 69 6e 66  mtime_r(&timeinf
4870: 6f 2c 20 26 74 69 6d 65 69 6e 66 6f 5f 74 6d 29  o, &timeinfo_tm)
4880: 3b 0a 09 69 66 20 28 74 69 6d 65 69 6e 66 6f 5f  ;..if (timeinfo_
4890: 74 6d 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tm_p == NULL) {.
48a0: 09 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f 77  ..return("unknow
48b0: 6e 22 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72  n");..}...buffer
48c0: 5b 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31 5d  [buffer_len - 1]
48d0: 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72   = '\0';..buffer
48e0: 5f 6c 65 6e 20 3d 20 73 74 72 66 74 69 6d 65 28  _len = strftime(
48f0: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c  buffer, buffer_l
4900: 65 6e 20 2d 20 31 2c 20 22 25 61 2c 20 25 64 20  en - 1, "%a, %d 
4910: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 47  %b %Y %H:%M:%S G
4920: 4d 54 22 2c 20 74 69 6d 65 69 6e 66 6f 5f 74 6d  MT", timeinfo_tm
4930: 5f 70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75  _p);...return(bu
4940: 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 68 61 73  ffer);.}../* has
4950: 68 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  h */.static unsi
4960: 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f 68  gned int filed_h
4970: 61 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ash(const unsign
4980: 65 64 20 63 68 61 72 20 2a 76 61 6c 75 65 2c 20  ed char *value, 
4990: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 6f 64  unsigned int mod
49a0: 75 6c 75 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65  ulus) {..unsigne
49b0: 64 20 63 68 61 72 20 63 75 72 72 2c 20 70 72 65  d char curr, pre
49c0: 76 3b 0a 09 69 6e 74 20 64 69 66 66 3b 0a 09 75  v;..int diff;..u
49d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 65 74 76  nsigned int retv
49e0: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d  al;...retval = m
49f0: 6f 64 75 6c 75 73 20 2d 20 31 3b 0a 09 70 72 65  odulus - 1;..pre
4a00: 76 20 3d 20 6d 6f 64 75 6c 75 73 20 25 20 32 35  v = modulus % 25
4a10: 35 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 75 72  5;...while ((cur
4a20: 72 20 3d 20 2a 76 61 6c 75 65 29 29 20 7b 0a 09  r = *value)) {..
4a30: 09 69 66 20 28 63 75 72 72 20 3c 20 33 32 29 20  .if (curr < 32) 
4a40: 7b 0a 09 09 09 63 75 72 72 20 3d 20 32 35 35 20  {....curr = 255 
4a50: 2d 20 63 75 72 72 3b 0a 09 09 7d 20 65 6c 73 65  - curr;...} else
4a60: 20 7b 0a 09 09 09 63 75 72 72 20 2d 3d 20 33 32   {....curr -= 32
4a70: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 72 65  ;...}....if (pre
4a80: 76 20 3c 20 63 75 72 72 29 20 7b 0a 09 09 09 64  v < curr) {....d
4a90: 69 66 66 20 3d 20 63 75 72 72 20 2d 20 70 72 65  iff = curr - pre
4aa0: 76 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  v;...} else {...
4ab0: 09 64 69 66 66 20 3d 20 70 72 65 76 20 2d 20 63  .diff = prev - c
4ac0: 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 70 72 65 76  urr;...}....prev
4ad0: 20 3d 20 63 75 72 72 3b 0a 0a 09 09 72 65 74 76   = curr;....retv
4ae0: 61 6c 20 3c 3c 3d 20 33 3b 0a 09 09 72 65 74 76  al <<= 3;...retv
4af0: 61 6c 20 26 3d 20 30 78 46 46 46 46 46 46 46 46  al &= 0xFFFFFFFF
4b00: 4c 55 3b 0a 09 09 72 65 74 76 61 6c 20 5e 3d 20  LU;...retval ^= 
4b10: 64 69 66 66 3b 0a 0a 09 09 76 61 6c 75 65 2b 2b  diff;....value++
4b20: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
4b30: 72 65 74 76 61 6c 20 25 20 6d 6f 64 75 6c 75 73  retval % modulus
4b40: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
4b50: 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  l);.}../* Find a
4b60: 20 6d 69 6d 65 2d 74 79 70 65 20 62 61 73 65 64   mime-type based
4b70: 20 6f 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   on the filename
4b80: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
4b90: 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 64 65 74   char *filed_det
4ba0: 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28  ermine_mimetype(
4bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
4bc0: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ) {..const char 
4bd0: 2a 70 3b 0a 0a 09 70 20 3d 20 73 74 72 72 63 68  *p;...p = strrch
4be0: 72 28 70 61 74 68 2c 20 27 2e 27 29 3b 0a 09 69  r(path, '.');..i
4bf0: 66 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  f (p == NULL) {.
4c00: 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44  ..return(FILED_D
4c10: 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d  EFAULT_TYPE);..}
4c20: 0a 0a 09 70 2b 2b 3b 0a 09 69 66 20 28 2a 70 20  ...p++;..if (*p 
4c30: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74  == '\0') {...ret
4c40: 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c  urn(FILED_DEFAUL
4c50: 54 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 66 69  T_TYPE);..}...fi
4c60: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
4c70: 67 28 22 4c 6f 6f 6b 69 6e 67 20 75 70 20 4d 49  g("Looking up MI
4c80: 4d 45 20 74 79 70 65 20 66 6f 72 20 25 73 20 28  ME type for %s (
4c90: 68 61 73 68 20 3d 20 25 6c 6c 75 29 22 2c 20 70  hash = %llu)", p
4ca0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
4cb0: 20 6c 6f 6e 67 29 20 66 69 6c 65 64 5f 68 61 73   long) filed_has
4cc0: 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  h((const unsigne
4cd0: 64 20 63 68 61 72 20 2a 29 20 70 2c 20 31 36 37  d char *) p, 167
4ce0: 37 37 32 35 39 29 29 3b 0a 0a 23 69 6e 63 6c 75  77259));..#inclu
4cf0: 64 65 20 22 66 69 6c 65 64 2d 6d 69 6d 65 2d 74  de "filed-mime-t
4d00: 79 70 65 73 2e 68 22 0a 0a 09 72 65 74 75 72 6e  ypes.h"...return
4d10: 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54  (FILED_DEFAULT_T
4d20: 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  YPE);.}../* Gene
4d30: 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 69 64  rate a unique id
4d40: 65 6e 74 69 66 69 65 72 20 2a 2f 0a 73 74 61 74  entifier */.stat
4d50: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 67 65  ic void filed_ge
4d60: 6e 65 72 61 74 65 5f 65 74 61 67 28 63 68 61 72  nerate_etag(char
4d70: 20 2a 65 74 61 67 2c 20 73 69 7a 65 5f 74 20 6c   *etag, size_t l
4d80: 65 6e 67 74 68 29 20 7b 0a 09 73 6e 70 72 69 6e  ength) {..snprin
4d90: 74 66 28 65 74 61 67 2c 20 6c 65 6e 67 74 68 2c  tf(etag, length,
4da0: 20 22 25 6c 6c 78 2d 25 6c 6c 78 25 6c 6c 78 25   "%llx-%llx%llx%
4db0: 6c 6c 78 25 6c 6c 78 22 2c 0a 09 09 28 75 6e 73  llx%llx",...(uns
4dc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
4dd0: 20 74 69 6d 65 28 4e 55 4c 4c 29 2c 0a 09 09 28   time(NULL),...(
4de0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
4df0: 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09  ng) random(),...
4e00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
4e10: 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09  ong) random(),..
4e20: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
4e30: 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a  long) random(),.
4e40: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
4e50: 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 0a   long) random().
4e60: 09 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 46 49  .);.}..#ifdef FI
4e70: 4c 45 44 5f 46 41 4b 45 5f 43 48 52 4f 4f 54 0a  LED_FAKE_CHROOT.
4e80: 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 61 20 70  /* Translate a p
4e90: 61 74 68 20 69 6e 74 6f 20 61 20 66 61 6b 65 20  ath into a fake 
4ea0: 63 68 72 6f 6f 74 20 70 61 74 68 20 2a 2f 0a 73  chroot path */.s
4eb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4ec0: 20 2a 66 69 6c 65 64 5f 70 61 74 68 5f 74 72 61   *filed_path_tra
4ed0: 6e 73 6c 61 74 65 28 63 6f 6e 73 74 20 63 68 61  nslate(const cha
4ee0: 72 20 2a 70 61 74 68 2c 20 73 74 72 75 63 74 20  r *path, struct 
4ef0: 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f  filed_options *o
4f00: 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 61 74 69  ptions) {..stati
4f10: 63 20 5f 5f 74 68 72 65 61 64 20 63 68 61 72 20  c __thread char 
4f20: 70 61 74 68 42 75 66 66 65 72 5b 38 31 39 32 5d  pathBuffer[8192]
4f30: 3b 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f  ;..int snprintf_
4f40: 72 65 74 3b 0a 0a 09 2f 2a 20 49 66 20 6e 6f 20  ret;.../* If no 
4f50: 61 6c 74 65 72 6e 61 74 69 76 65 20 72 6f 6f 74  alternative root
4f60: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 72   is specified, r
4f70: 65 74 75 72 6e 20 74 68 65 20 75 6e 61 64 6f 72  eturn the unador
4f80: 6e 65 64 20 70 61 74 68 20 2a 2f 0a 09 69 66 20  ned path */..if 
4f90: 28 21 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b 65 5f  (!options->fake_
4fa0: 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09 72 65 74  newroot) {...ret
4fb0: 75 72 6e 28 70 61 74 68 29 3b 0a 09 7d 0a 0a 09  urn(path);..}...
4fc0: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
4fd0: 68 69 73 20 72 65 71 75 65 73 74 20 77 69 6c 6c  his request will
4fe0: 20 6e 6f 74 20 67 6f 20 6f 75 74 73 69 64 65 20   not go outside 
4ff0: 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
5000: 20 72 6f 6f 74 20 2a 2f 0a 09 69 66 20 28 73 74   root */..if (st
5010: 72 73 74 72 28 70 61 74 68 2c 20 22 2f 2e 2e 2f  rstr(path, "/../
5020: 22 29 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 70 61  ") != NULL || pa
5030: 74 68 5b 30 5d 20 21 3d 20 27 2f 27 29 20 7b 0a  th[0] != '/') {.
5040: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
5050: 64 65 62 75 67 28 22 55 6e 61 62 6c 65 20 74 6f  debug("Unable to
5060: 20 74 72 61 6e 73 6c 61 74 65 20 70 61 74 68 20   translate path 
5070: 5c 22 25 73 5c 22 2c 20 63 6f 6e 74 61 69 6e 73  \"%s\", contains
5080: 20 69 6e 76 61 6c 69 64 20 63 68 61 72 61 63 74   invalid charact
5090: 65 72 73 22 2c 20 70 61 74 68 29 3b 0a 0a 09 09  ers", path);....
50a0: 72 65 74 75 72 6e 28 6f 70 74 69 6f 6e 73 2d 3e  return(options->
50b0: 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 29 3b 0a 09  fake_newroot);..
50c0: 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 74 68  }.../* Create th
50d0: 65 20 6e 65 77 20 70 61 74 68 20 69 6e 74 6f 20  e new path into 
50e0: 6f 75 72 20 6c 6f 63 61 6c 20 28 54 4c 53 29 20  our local (TLS) 
50f0: 73 74 61 74 69 63 20 62 75 66 66 65 72 20 2a 2f  static buffer */
5100: 0a 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d  ..snprintf_ret =
5110: 20 73 6e 70 72 69 6e 74 66 28 70 61 74 68 42 75   snprintf(pathBu
5120: 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 70 61 74  ffer, sizeof(pat
5130: 68 42 75 66 66 65 72 29 2c 20 22 25 73 2f 25 73  hBuffer), "%s/%s
5140: 22 2c 20 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b 65  ", options->fake
5150: 5f 6e 65 77 72 6f 6f 74 2c 20 70 61 74 68 29 3b  _newroot, path);
5160: 0a 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
5170: 65 74 20 3c 20 30 20 7c 7c 20 28 28 75 6e 73 69  et < 0 || ((unsi
5180: 67 6e 65 64 20 69 6e 74 29 20 73 6e 70 72 69 6e  gned int) snprin
5190: 74 66 5f 72 65 74 29 20 3e 3d 20 73 69 7a 65 6f  tf_ret) >= sizeo
51a0: 66 28 70 61 74 68 42 75 66 66 65 72 29 29 20 7b  f(pathBuffer)) {
51b0: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
51c0: 5f 64 65 62 75 67 28 22 55 6e 61 62 6c 65 20 74  _debug("Unable t
51d0: 6f 20 74 72 61 6e 73 6c 61 74 65 20 70 61 74 68  o translate path
51e0: 20 5c 22 25 73 5c 22 2c 20 77 69 6c 6c 20 6e 6f   \"%s\", will no
51f0: 74 20 66 69 74 20 69 6e 74 6f 20 6e 65 77 20 62  t fit into new b
5200: 75 66 66 65 72 22 2c 20 70 61 74 68 29 3b 0a 0a  uffer", path);..
5210: 09 09 72 65 74 75 72 6e 28 6f 70 74 69 6f 6e 73  ..return(options
5220: 2d 3e 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 29 3b  ->fake_newroot);
5230: 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  ..}...filed_log_
5240: 6d 73 67 5f 64 65 62 75 67 28 22 54 72 61 6e 73  msg_debug("Trans
5250: 6c 61 74 69 6e 67 20 70 61 74 68 20 5c 22 25 73  lating path \"%s
5260: 5c 22 20 69 6e 74 6f 20 5c 22 25 73 5c 22 22 2c  \" into \"%s\"",
5270: 20 70 61 74 68 2c 20 70 61 74 68 42 75 66 66 65   path, pathBuffe
5280: 72 29 3b 0a 0a 09 2f 2a 20 52 65 74 75 72 6e 20  r);.../* Return 
5290: 74 68 65 20 6e 65 77 20 70 61 74 68 20 2a 2f 0a  the new path */.
52a0: 09 72 65 74 75 72 6e 28 70 61 74 68 42 75 66 66  .return(pathBuff
52b0: 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  er);.}..static v
52c0: 6f 69 64 20 66 69 6c 65 64 5f 70 61 74 68 5f 74  oid filed_path_t
52d0: 72 61 6e 73 6c 61 74 65 5f 73 65 74 5f 72 6f 6f  ranslate_set_roo
52e0: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61  t(const char *va
52f0: 72 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  r, struct filed_
5300: 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73  options *options
5310: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61  , const char *va
5320: 6c 29 20 7b 0a 09 6f 70 74 69 6f 6e 73 2d 3e 66  l) {..options->f
5330: 61 6b 65 5f 6e 65 77 72 6f 6f 74 20 3d 20 73 74  ake_newroot = st
5340: 72 64 75 70 28 76 61 6c 29 3b 0a 0a 09 72 65 74  rdup(val);...ret
5350: 75 72 6e 3b 0a 0a 09 2f 2a 20 76 61 72 20 69 73  urn;.../* var is
5360: 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 74 68   only used in th
5370: 65 20 6d 61 63 72 6f 20 2d 2d 20 64 69 73 63 61  e macro -- disca
5380: 72 64 20 69 74 20 68 65 72 65 20 2a 2f 0a 09 76  rd it here */..v
5390: 61 72 20 3d 20 76 61 72 3b 0a 7d 0a 23 65 6c 73  ar = var;.}.#els
53a0: 65 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  e.#define filed_
53b0: 70 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 28 70  path_translate(p
53c0: 61 74 68 2c 20 6f 70 74 69 6f 6e 73 29 20 70 61  ath, options) pa
53d0: 74 68 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64  th.#define filed
53e0: 5f 70 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 5f  _path_translate_
53f0: 73 65 74 5f 72 6f 6f 74 28 76 61 72 2c 20 6f 70  set_root(var, op
5400: 74 69 6f 6e 73 2c 20 76 61 6c 29 20 76 61 72 20  tions, val) var 
5410: 3d 20 73 74 72 64 75 70 28 76 61 6c 29 0a 23 65  = strdup(val).#e
5420: 6e 64 69 66 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20  ndif../* Open a 
5430: 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  file and return 
5440: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
5450: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
5460: 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  t filed_fileinfo
5470: 20 2a 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c   *filed_open_fil
5480: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  e(const char *pa
5490: 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  th, struct filed
54a0: 5f 66 69 6c 65 69 6e 66 6f 20 2a 62 75 66 66 65  _fileinfo *buffe
54b0: 72 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  r, struct filed_
54c0: 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73  options *options
54d0: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
54e0: 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68  d_fileinfo *cach
54f0: 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  e;..unsigned int
5500: 20 63 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66 66   cache_idx;..off
5510: 5f 74 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64 3b  _t len;..int fd;
5520: 0a 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69 6c  ...if (filed_fil
5530: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69  einfo_fdcache_si
5540: 7a 65 20 21 3d 20 30 29 20 7b 0a 09 09 63 61 63  ze != 0) {...cac
5550: 68 65 5f 69 64 78 20 3d 20 66 69 6c 65 64 5f 68  he_idx = filed_h
5560: 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67  ash((const unsig
5570: 6e 65 64 20 63 68 61 72 20 2a 29 20 70 61 74 68  ned char *) path
5580: 2c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  , filed_fileinfo
5590: 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  _fdcache_size);.
55a0: 0a 09 09 63 61 63 68 65 20 3d 20 26 66 69 6c 65  ...cache = &file
55b0: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
55c0: 68 65 5b 63 61 63 68 65 5f 69 64 78 5d 3b 0a 0a  he[cache_idx];..
55d0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
55e0: 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67 20 6d  debug("Locking m
55f0: 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c  utex for idx: %l
5600: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
5610: 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a  ng) cache_idx);.
5620: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
5630: 5f 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75  _lock(&cache->mu
5640: 74 65 78 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c  tex);....filed_l
5650: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f  og_msg_debug("Co
5660: 6d 70 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20  mpleted locking 
5670: 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25  mutex for idx: %
5680: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
5690: 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b  ong) cache_idx);
56a0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63  ..} else {...cac
56b0: 68 65 5f 69 64 78 20 3d 20 30 3b 0a 09 09 63 61  he_idx = 0;...ca
56c0: 63 68 65 20 3d 20 62 75 66 66 65 72 3b 0a 09 09  che = buffer;...
56d0: 63 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20 3d  cache->path[0] =
56e0: 20 27 5c 30 27 3b 0a 09 09 63 61 63 68 65 2d 3e   '\0';...cache->
56f0: 66 64 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 69 66  fd = -1;..}...if
5700: 20 28 73 74 72 63 6d 70 28 70 61 74 68 2c 20 63   (strcmp(path, c
5710: 61 63 68 65 2d 3e 70 61 74 68 29 20 21 3d 20 30  ache->path) != 0
5720: 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ) {...filed_log_
5730: 6d 73 67 5f 64 65 62 75 67 28 22 43 61 63 68 65  msg_debug("Cache
5740: 20 6d 69 73 73 20 66 6f 72 20 69 64 78 3a 20 25   miss for idx: %
5750: 6c 75 3a 20 4f 4c 44 20 5c 22 25 73 5c 22 2c 20  lu: OLD \"%s\", 
5760: 4e 45 57 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e  NEW \"%s\"", (un
5770: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
5780: 68 65 5f 69 64 78 2c 20 63 61 63 68 65 2d 3e 70  he_idx, cache->p
5790: 61 74 68 2c 20 70 61 74 68 29 3b 0a 0a 09 09 66  ath, path);....f
57a0: 64 20 3d 20 6f 70 65 6e 28 66 69 6c 65 64 5f 70  d = open(filed_p
57b0: 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 28 70 61  ath_translate(pa
57c0: 74 68 2c 20 6f 70 74 69 6f 6e 73 29 2c 20 4f 5f  th, options), O_
57d0: 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52 47 45  RDONLY | O_LARGE
57e0: 46 49 4c 45 29 3b 0a 09 09 69 66 20 28 66 64 20  FILE);...if (fd 
57f0: 3c 20 30 29 20 7b 0a 09 09 09 69 66 20 28 66 69  < 0) {....if (fi
5800: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
5810: 61 63 68 65 5f 73 69 7a 65 20 21 3d 20 30 29 20  ache_size != 0) 
5820: 7b 0a 09 09 09 09 70 74 68 72 65 61 64 5f 6d 75  {.....pthread_mu
5830: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68  tex_unlock(&cach
5840: 65 2d 3e 6d 75 74 65 78 29 3b 0a 09 09 09 7d 0a  e->mutex);....}.
5850: 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
5860: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
5870: 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a 09  he->fd >= 0) {..
5880: 09 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66  ..close(cache->f
5890: 64 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20 3d  d);...}....len =
58a0: 20 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53 45   lseek(fd, 0, SE
58b0: 45 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65 6b  EK_END);...lseek
58c0: 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  (fd, 0, SEEK_SET
58d0: 29 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64 20  );....cache->fd 
58e0: 3d 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e 6c  = fd;...cache->l
58f0: 65 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73 74 72 63  en = len;...strc
5900: 70 79 28 63 61 63 68 65 2d 3e 70 61 74 68 2c 20  py(cache->path, 
5910: 70 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d 3e  path);...cache->
5920: 74 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65 74  type = filed_det
5930: 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28  ermine_mimetype(
5940: 70 61 74 68 29 3b 0a 09 09 66 69 6c 65 64 5f 67  path);...filed_g
5950: 65 6e 65 72 61 74 65 5f 65 74 61 67 28 63 61 63  enerate_etag(cac
5960: 68 65 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66  he->etag, sizeof
5970: 28 63 61 63 68 65 2d 3e 65 74 61 67 29 29 3b 0a  (cache->etag));.
5980: 0a 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20  .../* XXX:TODO: 
5990: 44 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09 09 63  Determine */...c
59a0: 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20  ache->lastmod = 
59b0: 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d  filed_format_tim
59c0: 65 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64  e(cache->lastmod
59d0: 5f 62 2c 20 73 69 7a 65 6f 66 28 63 61 63 68 65  _b, sizeof(cache
59e0: 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20 74 69  ->lastmod_b), ti
59f0: 6d 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29 3b 0a  me(NULL) - 30);.
5a00: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65  .} else {...file
5a10: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
5a20: 22 43 61 63 68 65 20 68 69 74 20 66 6f 72 20 69  "Cache hit for i
5a30: 64 78 3a 20 25 6c 75 3a 20 50 41 54 48 20 5c 22  dx: %lu: PATH \"
5a40: 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64  %s\"", (unsigned
5a50: 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78   long) cache_idx
5a60: 2c 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 69 66  , path);..}...if
5a70: 20 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f   (filed_fileinfo
5a80: 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d  _fdcache_size !=
5a90: 20 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20   0) {.../*... * 
5aa0: 57 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  We have to make 
5ab0: 61 20 64 75 70 6c 69 63 61 74 65 20 46 44 2c 20  a duplicate FD, 
5ac0: 62 65 63 61 75 73 65 20 6f 6e 63 65 20 77 65 20  because once we 
5ad0: 72 65 6c 65 61 73 65 20 74 68 65 20 63 61 63 68  release the cach
5ae0: 65 0a 09 09 20 2a 20 6d 75 74 65 78 2c 20 74 68  e... * mutex, th
5af0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
5b00: 72 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 0a  r may be closed.
5b10: 09 09 20 2a 2f 0a 09 09 66 64 20 3d 20 64 75 70  .. */...fd = dup
5b20: 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09 69  (cache->fd);...i
5b30: 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 09  f (fd < 0) {....
5b40: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
5b50: 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74  lock(&cache->mut
5b60: 65 78 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ex);.....return(
5b70: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 62 75  NULL);...}....bu
5b80: 66 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 09  ffer->fd = fd;..
5b90: 09 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63  .buffer->len = c
5ba0: 61 63 68 65 2d 3e 6c 65 6e 3b 0a 09 09 62 75 66  ache->len;...buf
5bb0: 66 65 72 2d 3e 74 79 70 65 20 3d 20 63 61 63 68  fer->type = cach
5bc0: 65 2d 3e 74 79 70 65 3b 0a 09 09 6d 65 6d 63 70  e->type;...memcp
5bd0: 79 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f  y(buffer->lastmo
5be0: 64 5f 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73 74  d_b, cache->last
5bf0: 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62 75  mod_b, sizeof(bu
5c00: 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29  ffer->lastmod_b)
5c10: 29 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 66  );...memcpy(buff
5c20: 65 72 2d 3e 65 74 61 67 2c 20 63 61 63 68 65 2d  er->etag, cache-
5c30: 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66 28 62 75  >etag, sizeof(bu
5c40: 66 66 65 72 2d 3e 65 74 61 67 29 29 3b 0a 09 09  ffer->etag));...
5c50: 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 20  buffer->lastmod 
5c60: 3d 20 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f  = buffer->lastmo
5c70: 64 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e 6c 61  d_b + (cache->la
5c80: 73 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d 3e 6c  stmod - cache->l
5c90: 61 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 09 70 74  astmod_b);....pt
5ca0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
5cb0: 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78  ck(&cache->mutex
5cc0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 62  );..}...return(b
5cd0: 75 66 66 65 72 29 3b 0a 0a 09 2f 2a 20 6f 70 74  uffer);.../* opt
5ce0: 69 6f 6e 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  ions is only use
5cf0: 64 20 69 66 20 66 61 6b 65 20 63 68 72 6f 6f 74  d if fake chroot
5d00: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6e   is enabled, con
5d10: 66 75 73 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  fuse the compile
5d20: 72 20 2a 2f 0a 09 6f 70 74 69 6f 6e 73 20 3d 20  r */..options = 
5d30: 6f 70 74 69 6f 6e 73 3b 0a 7d 0a 0a 2f 2a 20 50  options;.}../* P
5d40: 72 6f 63 65 73 73 20 61 6e 20 48 54 54 50 20 72  rocess an HTTP r
5d50: 65 71 75 65 73 74 20 61 6e 64 20 72 65 74 75 72  equest and retur
5d60: 6e 20 74 68 65 20 70 61 74 68 20 72 65 71 75 65  n the path reque
5d70: 73 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 73  sted */.static s
5d80: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
5d90: 5f 72 65 71 75 65 73 74 20 2a 66 69 6c 65 64 5f  _request *filed_
5da0: 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74  get_http_request
5db0: 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63  (FILE *fp, struc
5dc0: 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71  t filed_http_req
5dd0: 75 65 73 74 20 2a 62 75 66 66 65 72 5f 73 74 2c  uest *buffer_st,
5de0: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70   struct filed_op
5df0: 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20  tions *options) 
5e00: 7b 0a 09 63 68 61 72 20 2a 6d 65 74 68 6f 64 2c  {..char *method,
5e10: 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 62   *path;..char *b
5e20: 75 66 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66  uffer, *workbuff
5e30: 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72 5f  er, *workbuffer_
5e40: 6e 65 78 74 3b 0a 09 63 68 61 72 20 2a 66 67 65  next;..char *fge
5e50: 74 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ts_ret;..size_t 
5e60: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 70 61 74 68  buffer_len, path
5e70: 5f 6c 65 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e  _len;..off_t ran
5e80: 67 65 5f 73 74 61 72 74 2c 20 72 61 6e 67 65 5f  ge_start, range_
5e90: 65 6e 64 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74  end, range_lengt
5ea0: 68 3b 0a 09 69 6e 74 20 72 61 6e 67 65 5f 72 65  h;..int range_re
5eb0: 71 75 65 73 74 3b 0a 09 69 6e 74 20 73 6e 70 72  quest;..int snpr
5ec0: 69 6e 74 66 5f 72 65 74 3b 0a 09 69 6e 74 20 69  intf_ret;..int i
5ed0: 3b 0a 0a 09 2f 2a 20 53 65 74 20 74 6f 20 64 65  ;.../* Set to de
5ee0: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a  fault values */.
5ef0: 09 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20 30  .range_start = 0
5f00: 3b 0a 09 72 61 6e 67 65 5f 65 6e 64 20 20 20 3d  ;..range_end   =
5f10: 20 30 3b 0a 09 72 61 6e 67 65 5f 72 65 71 75 65   0;..range_reque
5f20: 73 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 6c  st = 0;..range_l
5f30: 65 6e 67 74 68 20 3d 20 2d 31 3b 0a 09 62 75 66  ength = -1;..buf
5f40: 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e  fer_st->headers.
5f50: 68 6f 73 74 2e 70 72 65 73 65 6e 74 20 3d 20 30  host.present = 0
5f60: 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  ;..buffer_st->he
5f70: 61 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e  aders.connection
5f80: 20 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54   = FILED_CONNECT
5f90: 49 4f 4e 5f 43 4c 4f 53 45 3b 0a 0a 09 62 75 66  ION_CLOSE;...buf
5fa0: 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d  fer = buffer_st-
5fb0: 3e 74 6d 70 62 75 66 3b 0a 09 62 75 66 66 65 72  >tmpbuf;..buffer
5fc0: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75  _len = sizeof(bu
5fd0: 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 29  ffer_st->tmpbuf)
5fe0: 3b 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d 20  ;...fgets_ret = 
5ff0: 66 67 65 74 73 28 62 75 66 66 65 72 2c 20 62 75  fgets(buffer, bu
6000: 66 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09  ffer_len, fp);..
6010: 69 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d  if (fgets_ret ==
6020: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
6030: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 6d 65  n(NULL);..}...me
6040: 74 68 6f 64 20 3d 20 62 75 66 66 65 72 3b 0a 0a  thod = buffer;..
6050: 09 62 75 66 66 65 72 20 3d 20 73 74 72 63 68 72  .buffer = strchr
6060: 28 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a 09  (buffer, ' ');..
6070: 69 66 20 28 62 75 66 66 65 72 20 3d 3d 20 4e 55  if (buffer == NU
6080: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e  LL) {...return(N
6090: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 62 75 66 66  ULL);..}...*buff
60a0: 65 72 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66  er = '\0';..buff
60b0: 65 72 2b 2b 3b 0a 0a 09 70 61 74 68 20 3d 20 62  er++;...path = b
60c0: 75 66 66 65 72 3b 0a 0a 09 2f 2a 20 54 65 72 6d  uffer;.../* Term
60d0: 69 6e 61 74 65 20 70 61 74 68 20 63 6f 6d 70 6f  inate path compo
60e0: 6e 65 6e 74 20 2a 2f 0a 09 62 75 66 66 65 72 20  nent */..buffer 
60f0: 3d 20 73 74 72 70 62 72 6b 28 70 61 74 68 2c 20  = strpbrk(path, 
6100: 22 5c 72 5c 6e 20 22 29 3b 0a 09 69 66 20 28 62  "\r\n ");..if (b
6110: 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  uffer != NULL) {
6120: 0a 09 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30  ...*buffer = '\0
6130: 27 3b 0a 09 09 62 75 66 66 65 72 2b 2b 3b 0a 09  ';...buffer++;..
6140: 7d 0a 0a 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 68  }.../* We only h
6150: 61 6e 64 6c 65 20 74 68 65 20 22 47 45 54 22 20  andle the "GET" 
6160: 61 6e 64 20 22 48 45 41 44 27 20 6d 65 74 68 6f  and "HEAD' metho
6170: 64 73 20 2a 2f 0a 09 69 66 20 28 73 74 72 63 61  ds */..if (strca
6180: 73 65 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22 68  secmp(method, "h
6190: 65 61 64 22 29 20 21 3d 20 30 29 20 7b 0a 09 09  ead") != 0) {...
61a0: 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 28 6d  if (strcasecmp(m
61b0: 65 74 68 6f 64 2c 20 22 67 65 74 22 29 20 21 3d  ethod, "get") !=
61c0: 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28   0) {....return(
61d0: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  NULL);...}..../*
61e0: 20 47 45 54 20 72 65 71 75 65 73 74 20 2a 2f 0a   GET request */.
61f0: 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74  ..buffer_st->met
6200: 68 6f 64 20 3d 20 46 49 4c 45 44 5f 52 45 51 55  hod = FILED_REQU
6210: 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 3b 0a  EST_METHOD_GET;.
6220: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 48  .} else {.../* H
6230: 45 41 44 20 72 65 71 75 65 73 74 20 2a 2f 0a 09  EAD request */..
6240: 09 62 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68  .buffer_st->meth
6250: 6f 64 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45  od = FILED_REQUE
6260: 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 3b 0a  ST_METHOD_HEAD;.
6270: 09 7d 0a 0a 09 2f 2a 20 4e 6f 74 65 20 70 61 74  .}.../* Note pat
6280: 68 20 2a 2f 0a 09 70 61 74 68 5f 6c 65 6e 20 3d  h */..path_len =
6290: 20 73 74 72 6c 65 6e 28 70 61 74 68 29 3b 0a 09   strlen(path);..
62a0: 6d 65 6d 63 70 79 28 62 75 66 66 65 72 5f 73 74  memcpy(buffer_st
62b0: 2d 3e 70 61 74 68 2c 20 70 61 74 68 2c 20 70 61  ->path, path, pa
62c0: 74 68 5f 6c 65 6e 20 2b 20 31 29 3b 0a 0a 09 2f  th_len + 1);.../
62d0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 79 70 65  * Determine type
62e0: 20 6f 66 20 72 65 71 75 65 73 74 20 66 72 6f 6d   of request from
62f0: 20 70 61 74 68 20 2a 2f 0a 09 69 66 20 28 70 61   path */..if (pa
6300: 74 68 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  th_len == 0) {..
6310: 09 62 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65  .buffer_st->type
6320: 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54   = FILED_REQUEST
6330: 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b  _TYPE_DIRECTORY;
6340: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
6350: 28 70 61 74 68 5b 70 61 74 68 5f 6c 65 6e 20 2d  (path[path_len -
6360: 20 31 5d 20 3d 3d 20 27 2f 27 29 20 7b 0a 09 09   1] == '/') {...
6370: 09 62 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65  .buffer_st->type
6380: 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54   = FILED_REQUEST
6390: 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b  _TYPE_DIRECTORY;
63a0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62  ...} else {....b
63b0: 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d  uffer_st->type =
63c0: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54   FILED_REQUEST_T
63d0: 59 50 45 5f 4f 54 48 45 52 3b 0a 09 09 7d 0a 09  YPE_OTHER;...}..
63e0: 7d 0a 0a 09 2f 2a 20 52 65 73 65 74 20 62 75 66  }.../* Reset buf
63f0: 66 65 72 20 66 6f 72 20 6c 61 74 65 72 20 75 73  fer for later us
6400: 65 20 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20 62  e */..buffer = b
6410: 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66  uffer_st->tmpbuf
6420: 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  ;...for (i = 0; 
6430: 69 20 3c 20 31 30 30 3b 20 69 2b 2b 29 20 7b 0a  i < 100; i++) {.
6440: 09 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67  ..fgets_ret = fg
6450: 65 74 73 28 62 75 66 66 65 72 2c 20 62 75 66 66  ets(buffer, buff
6460: 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 09 69  er_len, fp);...i
6470: 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20  f (fgets_ret == 
6480: 4e 55 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61 6b  NULL) {....break
6490: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 74 72  ;...}....if (str
64a0: 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c  ncasecmp(buffer,
64b0: 20 22 52 61 6e 67 65 3a 20 22 2c 20 37 29 20 3d   "Range: ", 7) =
64c0: 3d 20 30 29 20 7b 0a 09 09 09 77 6f 72 6b 62 75  = 0) {....workbu
64d0: 66 66 65 72 20 3d 20 62 75 66 66 65 72 20 2b 20  ffer = buffer + 
64e0: 37 3b 0a 0a 09 09 09 69 66 20 28 73 74 72 6e 63  7;.....if (strnc
64f0: 61 73 65 63 6d 70 28 77 6f 72 6b 62 75 66 66 65  asecmp(workbuffe
6500: 72 2c 20 22 62 79 74 65 73 3d 22 2c 20 36 29 20  r, "bytes=", 6) 
6510: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b  == 0) {.....work
6520: 62 75 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09  buffer += 6;....
6530: 09 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20  ..range_request 
6540: 3d 20 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f  = 1;......range_
6550: 73 74 61 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c  start = strtoull
6560: 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f  (workbuffer, &wo
6570: 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31  rkbuffer_next, 1
6580: 30 29 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66  0);......workbuf
6590: 66 65 72 20 3d 20 77 6f 72 6b 62 75 66 66 65 72  fer = workbuffer
65a0: 5f 6e 65 78 74 3b 0a 0a 09 09 09 09 69 66 20 28  _next;......if (
65b0: 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27  *workbuffer == '
65c0: 2d 27 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62  -') {......workb
65d0: 75 66 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69  uffer++;.......i
65e0: 66 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 21  f (*workbuffer !
65f0: 3d 20 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62  = '\r' && *workb
6600: 75 66 66 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b  uffer != '\n') {
6610: 0a 09 09 09 09 09 09 72 61 6e 67 65 5f 65 6e 64  .......range_end
6620: 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b   = strtoull(work
6630: 62 75 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66  buffer, &workbuf
6640: 66 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09  fer_next, 10);..
6650: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
6660: 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74  ...} else if (st
6670: 72 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65 72  rncasecmp(buffer
6680: 2c 20 22 48 6f 73 74 3a 20 22 2c 20 35 29 20 3d  , "Host: ", 5) =
6690: 3d 20 30 29 20 7b 0a 09 09 09 62 75 66 66 65 72  = 0) {....buffer
66a0: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73  _st->headers.hos
66b0: 74 2e 70 72 65 73 65 6e 74 20 3d 20 31 3b 0a 0a  t.present = 1;..
66c0: 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20  ...workbuffer = 
66d0: 73 74 72 70 62 72 6b 28 62 75 66 66 65 72 20 2b  strpbrk(buffer +
66e0: 20 35 2c 20 22 5c 72 5c 6e 3a 22 29 3b 0a 09 09   5, "\r\n:");...
66f0: 09 69 66 20 28 77 6f 72 6b 62 75 66 66 65 72 20  .if (workbuffer 
6700: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 2a  != NULL) {.....*
6710: 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 27 5c 30  workbuffer = '\0
6720: 27 3b 0a 09 09 09 7d 0a 0a 09 09 09 77 6f 72 6b  ';....}.....work
6730: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 20  buffer = buffer 
6740: 2b 20 35 3b 0a 09 09 09 77 68 69 6c 65 20 28 2a  + 5;....while (*
6750: 77 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 20  workbuffer == ' 
6760: 27 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75 66  ') {.....workbuf
6770: 66 65 72 2b 2b 3b 0a 09 09 09 7d 0a 0a 09 09 09  fer++;....}.....
6780: 73 74 72 63 70 79 28 62 75 66 66 65 72 5f 73 74  strcpy(buffer_st
6790: 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 68  ->headers.host.h
67a0: 6f 73 74 2c 20 77 6f 72 6b 62 75 66 66 65 72 29  ost, workbuffer)
67b0: 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73  ;...} else if (s
67c0: 74 72 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65  trncasecmp(buffe
67d0: 72 2c 20 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  r, "Connection: 
67e0: 4b 65 65 70 2d 41 6c 69 76 65 22 2c 20 32 32 29  Keep-Alive", 22)
67f0: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 75 66 66   == 0) {....buff
6800: 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 63  er_st->headers.c
6810: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 46 49 4c 45  onnection = FILE
6820: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45  D_CONNECTION_KEE
6830: 50 5f 41 4c 49 56 45 3b 0a 09 09 7d 0a 0a 09 09  P_ALIVE;...}....
6840: 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 66 65  if (memcmp(buffe
6850: 72 2c 20 22 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d  r, "\r\n", 2) ==
6860: 20 30 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a   0) {....break;.
6870: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
6880: 72 6d 69 6e 65 20 72 61 6e 67 65 20 2a 2f 0a 09  rmine range */..
6890: 69 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 21 3d  if (range_end !=
68a0: 20 30 29 20 7b 0a 09 09 69 66 20 28 72 61 6e 67   0) {...if (rang
68b0: 65 5f 65 6e 64 20 3c 3d 20 72 61 6e 67 65 5f 73  e_end <= range_s
68c0: 74 61 72 74 29 20 7b 0a 09 09 09 72 65 74 75 72  tart) {....retur
68d0: 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09  n(NULL);...}....
68e0: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 72  range_length = r
68f0: 61 6e 67 65 5f 65 6e 64 20 2d 20 72 61 6e 67 65  ange_end - range
6900: 5f 73 74 61 72 74 3b 0a 0a 09 09 66 69 6c 65 64  _start;....filed
6910: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
6920: 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68  Computing length
6930: 20 70 61 72 61 6d 65 74 65 72 3a 20 25 6c 6c 75   parameter: %llu
6940: 20 3d 20 25 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c   = %llu - %llu",
6950: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
6960: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 6c  ng long) range_l
6970: 65 6e 67 74 68 2c 0a 09 09 09 28 75 6e 73 69 67  ength,....(unsig
6980: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
6990: 61 6e 67 65 5f 65 6e 64 2c 0a 09 09 09 28 75 6e  ange_end,....(un
69a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
69b0: 29 20 72 61 6e 67 65 5f 73 74 61 72 74 0a 09 09  ) range_start...
69c0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20  );..}.../* Fill 
69d0: 75 70 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  up structure to 
69e0: 72 65 74 75 72 6e 20 2a 2f 0a 09 62 75 66 66 65  return */..buffe
69f0: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  r_st->headers.ra
6a00: 6e 67 65 2e 70 72 65 73 65 6e 74 20 3d 20 72 61  nge.present = ra
6a10: 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 62 75  nge_request;..bu
6a20: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
6a30: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d  .range.offset  =
6a40: 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62   range_start;..b
6a50: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
6a60: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20  s.range.length  
6a70: 3d 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  = range_length;.
6a80: 0a 09 2f 2a 20 49 66 20 76 68 6f 73 74 73 20 61  ../* If vhosts a
6a90: 72 65 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6d 70  re enabled, comp
6aa0: 75 74 65 20 6e 65 77 20 70 61 74 68 20 2a 2f 0a  ute new path */.
6ab0: 09 69 66 20 28 6f 70 74 69 6f 6e 73 2d 3e 76 68  .if (options->vh
6ac0: 6f 73 74 73 5f 65 6e 61 62 6c 65 64 29 20 7b 0a  osts_enabled) {.
6ad0: 09 09 69 66 20 28 62 75 66 66 65 72 5f 73 74 2d  ..if (buffer_st-
6ae0: 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 70 72  >headers.host.pr
6af0: 65 73 65 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  esent == 1) {...
6b00: 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  .buffer = buffer
6b10: 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 09 09  _st->tmpbuf;....
6b20: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a  buffer_len = siz
6b30: 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74  eof(buffer_st->t
6b40: 6d 70 62 75 66 29 3b 0a 0a 09 09 09 73 6e 70 72  mpbuf);.....snpr
6b50: 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69  intf_ret = snpri
6b60: 6e 74 66 28 62 75 66 66 65 72 2c 20 62 75 66 66  ntf(buffer, buff
6b70: 65 72 5f 6c 65 6e 2c 20 22 2f 25 73 25 73 25 73  er_len, "/%s%s%s
6b80: 22 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74  ",.....buffer_st
6b90: 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 68  ->headers.host.h
6ba0: 6f 73 74 2c 0a 09 09 09 09 62 75 66 66 65 72 5f  ost,.....buffer_
6bb0: 73 74 2d 3e 70 61 74 68 5b 30 5d 20 3d 3d 20 27  st->path[0] == '
6bc0: 2f 27 20 3f 20 22 22 20 3a 20 22 2f 22 2c 0a 09  /' ? "" : "/",..
6bd0: 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 70 61  ...buffer_st->pa
6be0: 74 68 0a 09 09 09 29 3b 0a 09 09 09 69 66 20 28  th....);....if (
6bf0: 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3e 3d 20  snprintf_ret >= 
6c00: 30 29 20 7b 0a 09 09 09 09 69 66 20 28 28 28 75  0) {.....if (((u
6c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 6e 70  nsigned int) snp
6c20: 72 69 6e 74 66 5f 72 65 74 29 20 3c 20 62 75 66  rintf_ret) < buf
6c30: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 09  fer_len) {......
6c40: 73 74 72 63 70 79 28 62 75 66 66 65 72 5f 73 74  strcpy(buffer_st
6c50: 2d 3e 70 61 74 68 2c 20 62 75 66 66 65 72 29 3b  ->path, buffer);
6c60: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a  .....}....}...}.
6c70: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66  .}...return(buff
6c80: 65 72 5f 73 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  er_st);.}../* Re
6c90: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 70 61  turn an error pa
6ca0: 67 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ge */.static voi
6cb0: 64 20 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61  d filed_error_pa
6cc0: 67 65 28 46 49 4c 45 20 2a 66 70 2c 20 63 6f 6e  ge(FILE *fp, con
6cd0: 73 74 20 63 68 61 72 20 2a 64 61 74 65 5f 63 75  st char *date_cu
6ce0: 72 72 65 6e 74 2c 20 69 6e 74 20 65 72 72 6f 72  rrent, int error
6cf0: 5f 6e 75 6d 62 65 72 2c 20 69 6e 74 20 6d 65 74  _number, int met
6d00: 68 6f 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  hod, const char 
6d10: 2a 72 65 61 73 6f 6e 2c 20 73 74 72 75 63 74 20  *reason, struct 
6d20: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20  filed_log_entry 
6d30: 2a 6c 6f 67 29 20 7b 0a 09 63 68 61 72 20 2a 65  *log) {..char *e
6d40: 72 72 6f 72 5f 73 74 72 69 6e 67 20 3d 20 22 3c  rror_string = "<
6d50: 68 74 6d 6c 3e 3c 68 65 61 64 3e 3c 74 69 74 6c  html><head><titl
6d60: 65 3e 45 52 52 4f 52 3c 2f 74 69 74 6c 65 3e 3c  e>ERROR</title><
6d70: 2f 68 65 61 64 3e 3c 62 6f 64 79 3e 55 6e 61 62  /head><body>Unab
6d80: 6c 65 20 74 6f 20 70 72 6f 63 65 73 73 20 72 65  le to process re
6d90: 71 75 65 73 74 3c 2f 62 6f 64 79 3e 3c 2f 68 74  quest</body></ht
6da0: 6d 6c 3e 22 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ml>";...fprintf(
6db0: 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69  fp, "HTTP/1.1 %i
6dc0: 20 4e 6f 74 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a   Not OK\r\nDate:
6dd0: 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66   %s\r\nServer: f
6de0: 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64  iled\r\nLast-Mod
6df0: 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e  ified: %s\r\nCon
6e00: 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c  tent-Length: %ll
6e10: 75 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70  u\r\nContent-Typ
6e20: 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74  e: %s\r\nConnect
6e30: 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 5c 72  ion: close\r\n\r
6e40: 5c 6e 22 2c 0a 09 09 65 72 72 6f 72 5f 6e 75 6d  \n",...error_num
6e50: 62 65 72 2c 0a 09 09 64 61 74 65 5f 63 75 72 72  ber,...date_curr
6e60: 65 6e 74 2c 0a 09 09 64 61 74 65 5f 63 75 72 72  ent,...date_curr
6e70: 65 6e 74 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64  ent,...(unsigned
6e80: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 74 72 6c   long long) strl
6e90: 65 6e 28 65 72 72 6f 72 5f 73 74 72 69 6e 67 29  en(error_string)
6ea0: 2c 0a 09 09 22 74 65 78 74 2f 68 74 6d 6c 22 0a  ,..."text/html".
6eb0: 09 29 3b 0a 0a 09 2f 2a 20 73 69 6c 65 6e 63 65  .);.../* silence
6ec0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20 66 6f   error string fo
6ed0: 72 20 48 45 41 44 20 72 65 71 75 65 73 74 73 20  r HEAD requests 
6ee0: 2a 2f 0a 09 69 66 20 28 6d 65 74 68 6f 64 20 21  */..if (method !
6ef0: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
6f00: 4d 45 54 48 4f 44 5f 48 45 41 44 29 20 7b 0a 09  METHOD_HEAD) {..
6f10: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73  .fprintf(fp, "%s
6f20: 22 2c 20 65 72 72 6f 72 5f 73 74 72 69 6e 67 29  ", error_string)
6f30: 3b 0a 09 7d 0a 0a 09 2f 2a 20 4c 6f 67 20 65 72  ;..}.../* Log er
6f40: 72 6f 72 20 2a 2f 0a 09 2f 2a 2a 20 72 65 61 73  ror */../** reas
6f50: 6f 6e 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  on must point to
6f60: 20 61 20 67 6c 6f 62 61 6c 6c 79 20 61 6c 6c 6f   a globally allo
6f70: 63 61 74 65 64 20 76 61 6c 75 65 20 2a 2a 2f 0a  cated value **/.
6f80: 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 72  .log->reason = r
6f90: 65 61 73 6f 6e 3b 0a 09 6c 6f 67 2d 3e 68 74 74  eason;..log->htt
6fa0: 70 5f 63 6f 64 65 20 3d 20 65 72 72 6f 72 5f 6e  p_code = error_n
6fb0: 75 6d 62 65 72 3b 0a 0a 09 66 69 6c 65 64 5f 6c  umber;...filed_l
6fc0: 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a  og_entry(log);..
6fd0: 09 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65 63  ./* Close connec
6fe0: 74 69 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64 5f 73  tion */..filed_s
6ff0: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f  ockettimeout_clo
7000: 73 65 28 66 69 6c 65 6e 6f 28 66 70 29 29 3b 0a  se(fileno(fp));.
7010: 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09  ..fclose(fp);...
7020: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
7030: 74 75 72 6e 20 61 20 72 65 64 69 72 65 63 74 20  turn a redirect 
7040: 74 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 20 2a 2f  to index.html */
7050: 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 44 5f 44  .#ifndef FILED_D
7060: 4f 4e 54 5f 52 45 44 49 52 45 43 54 5f 44 49 52  ONT_REDIRECT_DIR
7070: 45 43 54 4f 52 49 45 53 0a 73 74 61 74 69 63 20  ECTORIES.static 
7080: 76 6f 69 64 20 66 69 6c 65 64 5f 72 65 64 69 72  void filed_redir
7090: 65 63 74 5f 69 6e 64 65 78 28 46 49 4c 45 20 2a  ect_index(FILE *
70a0: 66 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fp, const char *
70b0: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 63 6f  date_current, co
70c0: 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
70d0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
70e0: 5f 65 6e 74 72 79 20 2a 6c 6f 67 29 20 7b 0a 09  _entry *log) {..
70f0: 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 20 3d 20  int http_code = 
7100: 33 30 32 3b 0a 09 66 70 72 69 6e 74 66 28 66 70  302;..fprintf(fp
7110: 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69 20 4f  , "HTTP/1.1 %i O
7120: 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c 72 5c  K\r\nDate: %s\r\
7130: 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64 5c 72  nServer: filed\r
7140: 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64 3a  \nLast-Modified:
7150: 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c   %s\r\nContent-L
7160: 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 43 6f 6e 6e  ength: 0\r\nConn
7170: 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c  ection: close\r\
7180: 6e 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72 5c  nLocation: %s\r\
7190: 6e 5c 72 5c 6e 22 2c 0a 09 09 68 74 74 70 5f 63  n\r\n",...http_c
71a0: 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63 75 72 72  ode,...date_curr
71b0: 65 6e 74 2c 0a 09 09 64 61 74 65 5f 63 75 72 72  ent,...date_curr
71c0: 65 6e 74 2c 0a 09 09 22 69 6e 64 65 78 2e 68 74  ent,..."index.ht
71d0: 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a 20 4c 6f 67  ml"..);.../* Log
71e0: 20 72 65 64 69 72 65 63 74 20 2a 2f 0a 09 6c 6f   redirect */..lo
71f0: 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 72 65 64  g->reason = "red
7200: 69 72 65 63 74 22 3b 0a 09 6c 6f 67 2d 3e 68 74  irect";..log->ht
7210: 74 70 5f 63 6f 64 65 20 3d 20 68 74 74 70 5f 63  tp_code = http_c
7220: 6f 64 65 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  ode;...filed_log
7230: 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 2f  _entry(log);.../
7240: 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69  * Close connecti
7250: 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64 5f 73 6f 63  on */..filed_soc
7260: 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65  kettimeout_close
7270: 28 66 69 6c 65 6e 6f 28 66 70 29 29 3b 0a 0a 09  (fileno(fp));...
7280: 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65  fclose(fp);...re
7290: 74 75 72 6e 3b 0a 0a 09 2f 2a 20 43 75 72 72 65  turn;.../* Curre
72a0: 6e 74 6c 79 20 75 6e 75 73 65 64 3a 20 70 61 74  ntly unused: pat
72b0: 68 20 2a 2f 0a 09 70 61 74 68 20 3d 20 70 61 74  h */..path = pat
72c0: 68 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  h;.}.#endif../* 
72d0: 43 6f 6e 76 65 72 74 20 61 6e 20 65 6e 75 6d 20  Convert an enum 
72e0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
72f0: 20 22 43 6f 6e 6e 65 63 74 69 6f 6e 22 20 68 65   "Connection" he
7300: 61 64 65 72 20 76 61 6c 75 65 20 74 6f 20 61 20  ader value to a 
7310: 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  string */.static
7320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
7330: 65 64 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74  ed_connection_st
7340: 72 28 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  r(int connection
7350: 5f 76 61 6c 75 65 29 20 7b 0a 09 73 77 69 74 63  _value) {..switc
7360: 68 20 28 63 6f 6e 6e 65 63 74 69 6f 6e 5f 76 61  h (connection_va
7370: 6c 75 65 29 20 7b 0a 09 09 63 61 73 65 20 46 49  lue) {...case FI
7380: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43  LED_CONNECTION_C
7390: 4c 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  LOSE:....return(
73a0: 22 63 6c 6f 73 65 22 29 3b 0a 09 09 63 61 73 65  "close");...case
73b0: 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f   FILED_CONNECTIO
73c0: 4e 5f 4b 45 45 50 5f 41 4c 49 56 45 3a 0a 09 09  N_KEEP_ALIVE:...
73d0: 09 72 65 74 75 72 6e 28 22 6b 65 65 70 2d 61 6c  .return("keep-al
73e0: 69 76 65 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  ive");..}...retu
73f0: 72 6e 28 22 63 6c 6f 73 65 22 29 3b 0a 7d 0a 0a  rn("close");.}..
7400: 2f 2a 20 48 61 6e 64 6c 65 20 61 20 73 69 6e 67  /* Handle a sing
7410: 6c 65 20 72 65 71 75 65 73 74 20 66 72 6f 6d 20  le request from 
7420: 61 20 63 6c 69 65 6e 74 20 2a 2f 0a 73 74 61 74  a client */.stat
7430: 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 68 61 6e  ic int filed_han
7440: 64 6c 65 5f 63 6c 69 65 6e 74 28 69 6e 74 20 66  dle_client(int f
7450: 64 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  d, struct filed_
7460: 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a 72 65  http_request *re
7470: 71 75 65 73 74 2c 20 73 74 72 75 63 74 20 66 69  quest, struct fi
7480: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c  led_log_entry *l
7490: 6f 67 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  og, struct filed
74a0: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e  _options *option
74b0: 73 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c  s) {..struct fil
74c0: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c  ed_fileinfo *fil
74d0: 65 69 6e 66 6f 3b 0a 09 73 73 69 7a 65 5f 74 20  einfo;..ssize_t 
74e0: 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 73  sendfile_ret;..s
74f0: 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 73  ize_t sendfile_s
7500: 69 7a 65 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 64  ize;..off_t send
7510: 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e  file_offset, sen
7520: 64 66 69 6c 65 5f 73 65 6e 74 2c 20 73 65 6e 64  dfile_sent, send
7530: 66 69 6c 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 20  file_len;..char 
7540: 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 64 61  *path;..char *da
7550: 74 65 5f 63 75 72 72 65 6e 74 2c 20 64 61 74 65  te_current, date
7560: 5f 63 75 72 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a  _current_b[64];.
7570: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
7580: 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20  .FILE *fp;.../* 
7590: 44 65 74 65 72 6d 69 6e 65 20 63 75 72 72 65 6e  Determine curren
75a0: 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f  t time */..date_
75b0: 63 75 72 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f  current = filed_
75c0: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61 74 65  format_time(date
75d0: 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65  _current_b, size
75e0: 6f 66 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  of(date_current_
75f0: 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b  b), time(NULL));
7600: 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65  .../* Open socke
7610: 74 20 61 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f  t as ANSI I/O fo
7620: 72 20 65 61 73 65 20 6f 66 20 75 73 65 20 2a 2f  r ease of use */
7630: 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e 28 66 64  ..fp = fdopen(fd
7640: 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66 20 28 66  , "w+b");..if (f
7650: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  p == NULL) {...f
7660: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
7670: 75 74 5f 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09  ut_close(fd);...
7680: 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 6c  .close(fd);....l
7690: 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d 20  og->buffer[0] = 
76a0: 27 5c 30 27 3b 0a 09 09 6c 6f 67 2d 3e 68 74 74  '\0';...log->htt
76b0: 70 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a 09 09 6c  p_code = -1;...l
76c0: 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 66 64  og->reason = "fd
76d0: 6f 70 65 6e 5f 66 61 69 6c 65 64 22 3b 0a 0a 09  open_failed";...
76e0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79  .filed_log_entry
76f0: 28 6c 6f 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e  (log);....return
7700: 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f  (FILED_CONNECTIO
7710: 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09 72  N_CLOSE);..}...r
7720: 65 71 75 65 73 74 20 3d 20 66 69 6c 65 64 5f 67  equest = filed_g
7730: 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28  et_http_request(
7740: 66 70 2c 20 72 65 71 75 65 73 74 2c 20 6f 70 74  fp, request, opt
7750: 69 6f 6e 73 29 3b 0a 0a 09 69 66 20 28 72 65 71  ions);...if (req
7760: 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  uest == NULL) {.
7770: 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d  ..log->buffer[0]
7780: 20 3d 20 27 5c 30 27 3b 0a 0a 09 09 66 69 6c 65   = '\0';....file
7790: 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c  d_error_page(fp,
77a0: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 35   date_current, 5
77b0: 30 30 2c 20 46 49 4c 45 44 5f 52 45 51 55 45 53  00, FILED_REQUES
77c0: 54 5f 4d 45 54 48 4f 44 5f 47 45 54 2c 20 22 66  T_METHOD_GET, "f
77d0: 6f 72 6d 61 74 22 2c 20 6c 6f 67 29 3b 0a 0a 09  ormat", log);...
77e0: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f  .return(FILED_CO
77f0: 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b  NNECTION_CLOSE);
7800: 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b  ..}...filed_sock
7810: 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73  ettimeout_proces
7820: 73 69 6e 67 5f 73 74 61 72 74 28 66 64 29 3b 0a  sing_start(fd);.
7830: 0a 09 70 61 74 68 20 3d 20 72 65 71 75 65 73 74  ..path = request
7840: 2d 3e 70 61 74 68 3b 0a 09 73 74 72 63 70 79 28  ->path;..strcpy(
7850: 6c 6f 67 2d 3e 62 75 66 66 65 72 2c 20 70 61 74  log->buffer, pat
7860: 68 29 3b 0a 09 6c 6f 67 2d 3e 6d 65 74 68 6f 64  h);..log->method
7870: 20 3d 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68   = request->meth
7880: 6f 64 3b 0a 0a 09 2f 2a 20 49 66 20 74 68 65 20  od;.../* If the 
7890: 72 65 71 75 65 73 74 65 64 20 70 61 74 68 20 69  requested path i
78a0: 73 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 72  s a directory, r
78b0: 65 64 69 72 65 63 74 20 74 6f 20 69 6e 64 65 78  edirect to index
78c0: 20 70 61 67 65 20 2a 2f 0a 09 69 66 20 28 72 65   page */..if (re
78d0: 71 75 65 73 74 2d 3e 74 79 70 65 20 3d 3d 20 46  quest->type == F
78e0: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50  ILED_REQUEST_TYP
78f0: 45 5f 44 49 52 45 43 54 4f 52 59 29 20 7b 0a 23  E_DIRECTORY) {.#
7900: 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54  ifdef FILED_DONT
7910: 5f 52 45 44 49 52 45 43 54 5f 44 49 52 45 43 54  _REDIRECT_DIRECT
7920: 4f 52 49 45 53 0a 09 09 63 68 61 72 20 6c 6f 63  ORIES...char loc
7930: 61 6c 70 61 74 68 5b 38 31 39 32 5d 3b 0a 09 09  alpath[8192];...
7940: 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74  int snprintf_ret
7950: 3b 0a 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65  ;....snprintf_re
7960: 74 20 3d 20 73 6e 70 72 69 6e 74 66 28 6c 6f 63  t = snprintf(loc
7970: 61 6c 70 61 74 68 2c 20 73 69 7a 65 6f 66 28 6c  alpath, sizeof(l
7980: 6f 63 61 6c 70 61 74 68 29 2c 20 22 25 73 2f 69  ocalpath), "%s/i
7990: 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 70 61 74 68  ndex.html", path
79a0: 29 3b 0a 0a 09 09 69 66 20 28 73 6e 70 72 69 6e  );....if (snprin
79b0: 74 66 5f 72 65 74 20 3c 3d 20 30 20 7c 7c 20 73  tf_ret <= 0 || s
79c0: 6e 70 72 69 6e 74 66 5f 72 65 74 20 3e 20 28 73  nprintf_ret > (s
79d0: 69 7a 65 6f 66 28 6c 6f 63 61 6c 70 61 74 68 29  izeof(localpath)
79e0: 20 2d 20 31 29 29 20 7b 0a 09 09 09 66 69 6c 65   - 1)) {....file
79f0: 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c  d_error_page(fp,
7a00: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 35   date_current, 5
7a10: 30 30 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65 74  00, request->met
7a20: 68 6f 64 2c 20 22 70 61 74 68 5f 66 6f 72 6d 61  hod, "path_forma
7a30: 74 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 09 72 65  t", log);.....re
7a40: 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45  turn(FILED_CONNE
7a50: 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 09  CTION_CLOSE);...
7a60: 7d 0a 0a 09 09 70 61 74 68 20 3d 20 6c 6f 63 61  }....path = loca
7a70: 6c 70 61 74 68 3b 0a 23 65 6c 73 65 0a 09 09 66  lpath;.#else...f
7a80: 69 6c 65 64 5f 72 65 64 69 72 65 63 74 5f 69 6e  iled_redirect_in
7a90: 64 65 78 28 66 70 2c 20 64 61 74 65 5f 63 75 72  dex(fp, date_cur
7aa0: 72 65 6e 74 2c 20 70 61 74 68 2c 20 6c 6f 67 29  rent, path, log)
7ab0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45  ;....return(FILE
7ac0: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f  D_CONNECTION_CLO
7ad0: 53 45 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a  SE);.#endif..}..
7ae0: 09 66 69 6c 65 69 6e 66 6f 20 3d 20 66 69 6c 65  .fileinfo = file
7af0: 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 70 61 74 68  d_open_file(path
7b00: 2c 20 26 72 65 71 75 65 73 74 2d 3e 66 69 6c 65  , &request->file
7b10: 69 6e 66 6f 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a  info, options);.
7b20: 09 69 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d 3d  .if (fileinfo ==
7b30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64   NULL) {...filed
7b40: 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20  _error_page(fp, 
7b50: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 30  date_current, 40
7b60: 34 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68  4, request->meth
7b70: 6f 64 2c 20 22 6f 70 65 6e 5f 66 61 69 6c 65 64  od, "open_failed
7b80: 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72 65 74 75  ", log);....retu
7b90: 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  rn(FILED_CONNECT
7ba0: 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a  ION_CLOSE);..}..
7bb0: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
7bc0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73  aders.range.pres
7bd0: 65 6e 74 29 20 7b 0a 09 09 69 66 20 28 72 65 71  ent) {...if (req
7be0: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
7bf0: 6e 67 65 2e 6f 66 66 73 65 74 20 21 3d 20 30 20  nge.offset != 0 
7c00: 7c 7c 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  || request->head
7c10: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
7c20: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 69 66 20 28   >= 0) {....if (
7c30: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7c40: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3e 3d  .range.offset >=
7c50: 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 29 20   fileinfo->len) 
7c60: 7b 0a 09 09 09 09 66 69 6c 65 64 5f 65 72 72 6f  {.....filed_erro
7c70: 72 5f 70 61 67 65 28 66 70 2c 20 64 61 74 65 5f  r_page(fp, date_
7c80: 63 75 72 72 65 6e 74 2c 20 34 31 36 2c 20 72 65  current, 416, re
7c90: 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 2c 20 22  quest->method, "
7ca0: 72 61 6e 67 65 5f 69 6e 76 61 6c 69 64 22 2c 20  range_invalid", 
7cb0: 6c 6f 67 29 3b 0a 0a 09 09 09 09 63 6c 6f 73 65  log);......close
7cc0: 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a  (fileinfo->fd);.
7cd0: 0a 09 09 09 09 72 65 74 75 72 6e 28 46 49 4c 45  .....return(FILE
7ce0: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f  D_CONNECTION_CLO
7cf0: 53 45 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  SE);....}.....if
7d00: 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65   (request->heade
7d10: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
7d20: 3d 3d 20 28 28 6f 66 66 5f 74 29 20 2d 31 29 29  == ((off_t) -1))
7d30: 20 7b 0a 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67   {.....filed_log
7d40: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70  _msg_debug("Comp
7d50: 75 74 69 6e 67 20 6c 65 6e 67 74 68 20 74 6f 20  uting length to 
7d60: 66 69 74 20 69 6e 20 62 6f 75 6e 64 73 3a 20 66  fit in bounds: f
7d70: 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 3d 20 25  ileinfo->len = %
7d80: 6c 6c 75 2c 20 72 65 71 75 65 73 74 2d 3e 68 65  llu, request->he
7d90: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
7da0: 65 74 20 3d 20 25 6c 6c 75 22 2c 0a 09 09 09 09  et = %llu",.....
7db0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
7dc0: 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e  long) fileinfo->
7dd0: 6c 65 6e 2c 0a 09 09 09 09 09 28 75 6e 73 69 67  len,......(unsig
7de0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
7df0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
7e00: 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09 09  range.offset....
7e10: 09 29 3b 0a 0a 09 09 09 09 72 65 71 75 65 73 74  .);......request
7e20: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
7e30: 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66  length = fileinf
7e40: 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75 65 73 74  o->len - request
7e50: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
7e60: 6f 66 66 73 65 74 3b 0a 09 09 09 7d 0a 0a 09 09  offset;....}....
7e70: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64  .filed_log_msg_d
7e80: 65 62 75 67 28 22 50 61 72 74 69 61 6c 20 72 65  ebug("Partial re
7e90: 71 75 65 73 74 2c 20 73 74 61 72 74 69 6e 67 20  quest, starting 
7ea0: 61 74 3a 20 25 6c 6c 75 20 61 6e 64 20 72 75 6e  at: %llu and run
7eb0: 6e 69 6e 67 20 66 6f 72 20 25 6c 6c 69 20 62 79  ning for %lli by
7ec0: 74 65 73 22 2c 0a 09 09 09 09 28 75 6e 73 69 67  tes",.....(unsig
7ed0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
7ee0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
7ef0: 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09 09  range.offset,...
7f00: 09 09 28 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65  ..(long long) re
7f10: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
7f20: 61 6e 67 65 2e 6c 65 6e 67 74 68 0a 09 09 09 29  ange.length....)
7f30: 3b 0a 0a 09 09 7d 0a 0a 09 09 68 74 74 70 5f 63  ;....}....http_c
7f40: 6f 64 65 20 3d 20 32 30 36 3b 0a 09 7d 20 65 6c  ode = 206;..} el
7f50: 73 65 20 7b 0a 09 09 68 74 74 70 5f 63 6f 64 65  se {...http_code
7f60: 20 3d 20 32 30 30 3b 0a 0a 09 09 2f 2a 20 43 6f   = 200;..../* Co
7f70: 6d 70 75 74 65 20 66 61 6b 65 20 72 61 6e 67 65  mpute fake range
7f80: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
7f90: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 65 6e   includes the en
7fa0: 74 69 72 65 20 66 69 6c 65 20 2a 2f 0a 09 09 72  tire file */...r
7fb0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
7fc0: 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20 30  range.offset = 0
7fd0: 3b 0a 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61  ;...request->hea
7fe0: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
7ff0: 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65  h = fileinfo->le
8000: 6e 3b 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28  n;..}...fprintf(
8010: 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69  fp, "HTTP/1.1 %i
8020: 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c   OK\r\nDate: %s\
8030: 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64  r\nServer: filed
8040: 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65  \r\nLast-Modifie
8050: 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74  d: %s\r\nContent
8060: 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c  -Length: %llu\r\
8070: 6e 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a 20  nAccept-Ranges: 
8080: 62 79 74 65 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74  bytes\r\nContent
8090: 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e  -Type: %s\r\nCon
80a0: 6e 65 63 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 45  nection: %s\r\nE
80b0: 54 61 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e 22  Tag: \"%s\"\r\n"
80c0: 2c 0a 09 09 68 74 74 70 5f 63 6f 64 65 2c 0a 09  ,...http_code,..
80d0: 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09  .date_current,..
80e0: 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c 61 73 74 6d  .fileinfo->lastm
80f0: 6f 64 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20  od,...(unsigned 
8100: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65  long long) reque
8110: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
8120: 65 2e 6c 65 6e 67 74 68 2c 0a 09 09 66 69 6c 65  e.length,...file
8130: 69 6e 66 6f 2d 3e 74 79 70 65 2c 0a 09 09 66 69  info->type,...fi
8140: 6c 65 64 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73  led_connection_s
8150: 74 72 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  tr(request->head
8160: 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 29 2c  ers.connection),
8170: 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 65 74 61  ...fileinfo->eta
8180: 67 0a 09 29 3b 0a 0a 09 69 66 20 28 68 74 74 70  g..);...if (http
8190: 5f 63 6f 64 65 20 3d 3d 20 32 30 36 29 20 7b 0a  _code == 206) {.
81a0: 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 43  ..fprintf(fp, "C
81b0: 6f 6e 74 65 6e 74 2d 52 61 6e 67 65 3a 20 62 79  ontent-Range: by
81c0: 74 65 73 20 25 6c 6c 75 2d 25 6c 6c 75 2f 25 6c  tes %llu-%llu/%l
81d0: 6c 75 5c 72 5c 6e 22 2c 0a 09 09 09 28 75 6e 73  lu\r\n",....(uns
81e0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
81f0: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
8200: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a  s.range.offset,.
8210: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
8220: 67 20 6c 6f 6e 67 29 20 28 72 65 71 75 65 73 74  g long) (request
8230: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
8240: 6f 66 66 73 65 74 20 2b 20 72 65 71 75 65 73 74  offset + request
8250: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
8260: 6c 65 6e 67 74 68 20 2d 20 31 29 2c 0a 09 09 09  length - 1),....
8270: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
8280: 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  ong) fileinfo->l
8290: 65 6e 0a 09 09 29 3b 0a 09 7d 0a 09 66 70 72 69  en...);..}..fpri
82a0: 6e 74 66 28 66 70 2c 20 22 5c 72 5c 6e 22 29 3b  ntf(fp, "\r\n");
82b0: 0a 09 66 66 6c 75 73 68 28 66 70 29 3b 0a 0a 09  ..fflush(fp);...
82c0: 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d  log->http_code =
82d0: 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09 6c 6f 67   http_code;..log
82e0: 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 4f 4b 22 3b  ->reason = "OK";
82f0: 0a 09 6c 6f 67 2d 3e 73 74 61 72 74 74 69 6d 65  ..log->starttime
8300: 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 09   = time(NULL);..
8310: 6c 6f 67 2d 3e 72 65 71 5f 6f 66 66 73 65 74 20  log->req_offset 
8320: 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  = request->heade
8330: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b  rs.range.offset;
8340: 0a 09 6c 6f 67 2d 3e 72 65 71 5f 6c 65 6e 67 74  ..log->req_lengt
8350: 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61  h = request->hea
8360: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
8370: 68 3b 0a 09 6c 6f 67 2d 3e 66 69 6c 65 5f 6c 65  h;..log->file_le
8380: 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d  ngth = fileinfo-
8390: 3e 6c 65 6e 3b 0a 0a 23 69 66 64 65 66 20 46 49  >len;..#ifdef FI
83a0: 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54  LED_NONBLOCK_HTT
83b0: 50 0a 09 69 6e 74 20 73 6f 63 6b 65 74 5f 66 6c  P..int socket_fl
83c0: 61 67 73 3b 0a 09 66 64 5f 73 65 74 20 72 66 64  ags;..fd_set rfd
83d0: 2c 20 77 66 64 3b 0a 09 63 68 61 72 20 73 69 6e  , wfd;..char sin
83e0: 6b 62 75 66 5b 38 31 39 32 5d 3b 0a 09 73 73 69  kbuf[8192];..ssi
83f0: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a  ze_t read_ret;..
8400: 09 46 44 5f 5a 45 52 4f 28 26 72 66 64 29 3b 0a  .FD_ZERO(&rfd);.
8410: 09 46 44 5f 5a 45 52 4f 28 26 77 66 64 29 3b 0a  .FD_ZERO(&wfd);.
8420: 09 46 44 5f 53 45 54 28 66 64 2c 20 26 72 66 64  .FD_SET(fd, &rfd
8430: 29 3b 0a 09 46 44 5f 53 45 54 28 66 64 2c 20 26  );..FD_SET(fd, &
8440: 77 66 64 29 3b 0a 0a 09 73 6f 63 6b 65 74 5f 66  wfd);...socket_f
8450: 6c 61 67 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c  lags = fcntl(fd,
8460: 20 46 5f 47 45 54 46 4c 29 3b 0a 09 66 63 6e 74   F_GETFL);..fcnt
8470: 6c 28 66 64 2c 20 46 5f 53 45 54 46 4c 2c 20 73  l(fd, F_SETFL, s
8480: 6f 63 6b 65 74 5f 66 6c 61 67 73 20 7c 20 4f 5f  ocket_flags | O_
8490: 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  NONBLOCK);.#endi
84a0: 66 0a 09 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73  f..sendfile_offs
84b0: 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65  et = request->he
84c0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
84d0: 65 74 3b 0a 09 73 65 6e 64 66 69 6c 65 5f 6c 65  et;..sendfile_le
84e0: 6e 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61  n = request->hea
84f0: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
8500: 68 3b 0a 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e  h;..sendfile_sen
8510: 74 20 3d 20 30 3b 0a 09 77 68 69 6c 65 20 28 72  t = 0;..while (r
8520: 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 20 3d  equest->method =
8530: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
8540: 4d 45 54 48 4f 44 5f 47 45 54 29 20 7b 0a 09 09  METHOD_GET) {...
8550: 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  if (sendfile_len
8560: 20 3e 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c   > FILED_SENDFIL
8570: 45 5f 4d 41 58 29 20 7b 0a 09 09 09 73 65 6e 64  E_MAX) {....send
8580: 66 69 6c 65 5f 73 69 7a 65 20 3d 20 46 49 4c 45  file_size = FILE
8590: 44 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 3b 0a  D_SENDFILE_MAX;.
85a0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73 65  ..} else {....se
85b0: 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 73 65  ndfile_size = se
85c0: 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09 09 7d 0a  ndfile_len;...}.
85d0: 0a 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74 20  ...sendfile_ret 
85e0: 3d 20 73 65 6e 64 66 69 6c 65 28 66 64 2c 20 66  = sendfile(fd, f
85f0: 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c 20 26 73 65  ileinfo->fd, &se
8600: 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73  ndfile_offset, s
8610: 65 6e 64 66 69 6c 65 5f 73 69 7a 65 29 3b 0a 09  endfile_size);..
8620: 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 72 65  .if (sendfile_re
8630: 74 20 3c 3d 20 30 29 20 7b 0a 23 69 66 64 65 66  t <= 0) {.#ifdef
8640: 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f   FILED_NONBLOCK_
8650: 48 54 54 50 0a 09 09 09 69 66 20 28 65 72 72 6e  HTTP....if (errn
8660: 6f 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09  o == EAGAIN) {..
8670: 09 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74 20  ...sendfile_ret 
8680: 3d 20 30 3b 0a 0a 09 09 09 09 77 68 69 6c 65 20  = 0;......while 
8690: 28 31 29 20 7b 0a 09 09 09 09 09 73 65 6c 65 63  (1) {......selec
86a0: 74 28 66 64 20 2b 20 31 2c 20 26 72 66 64 2c 20  t(fd + 1, &rfd, 
86b0: 26 77 66 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  &wfd, NULL, NULL
86c0: 29 3b 0a 09 09 09 09 09 69 66 20 28 46 44 5f 49  );......if (FD_I
86d0: 53 53 45 54 28 66 64 2c 20 26 72 66 64 29 29 20  SSET(fd, &rfd)) 
86e0: 7b 0a 09 09 09 09 09 09 72 65 61 64 5f 72 65 74  {.......read_ret
86f0: 20 3d 20 72 65 61 64 28 66 64 2c 20 73 69 6e 6b   = read(fd, sink
8700: 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 6e 6b  buf, sizeof(sink
8710: 62 75 66 29 29 3b 0a 0a 09 09 09 09 09 09 69 66  buf));........if
8720: 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29   (read_ret <= 0)
8730: 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b   {........break;
8740: 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
8750: 0a 09 09 09 09 09 69 66 20 28 46 44 5f 49 53 53  ......if (FD_ISS
8760: 45 54 28 66 64 2c 20 26 77 66 64 29 29 20 7b 0a  ET(fd, &wfd)) {.
8770: 09 09 09 09 09 09 72 65 61 64 5f 72 65 74 20 3d  ......read_ret =
8780: 20 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b   1;........break
8790: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
87a0: 09 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74  ....if (read_ret
87b0: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72   <= 0) {......br
87c0: 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  eak;.....}....} 
87d0: 65 6c 73 65 20 7b 0a 09 09 09 09 62 72 65 61 6b  else {.....break
87e0: 3b 0a 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09  ;....}.#else....
87f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 09  break;.#endif...
8800: 7d 0a 0a 09 09 73 65 6e 64 66 69 6c 65 5f 6c 65  }....sendfile_le
8810: 6e 20 2d 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65  n -= sendfile_re
8820: 74 3b 0a 09 09 73 65 6e 64 66 69 6c 65 5f 73 65  t;...sendfile_se
8830: 6e 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 5f 72  nt += sendfile_r
8840: 65 74 3b 0a 09 09 69 66 20 28 73 65 6e 64 66 69  et;...if (sendfi
8850: 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  le_len == 0) {..
8860: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a  ..break;...}..}.
8870: 0a 09 6c 6f 67 2d 3e 65 6e 64 74 69 6d 65 20 3d  ..log->endtime =
8880: 20 28 74 69 6d 65 5f 74 29 20 2d 31 3b 0a 09 6c   (time_t) -1;..l
8890: 6f 67 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 20  og->sent_length 
88a0: 3d 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 3b  = sendfile_sent;
88b0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ...filed_log_ent
88c0: 72 79 28 6c 6f 67 29 3b 0a 0a 09 63 6c 6f 73 65  ry(log);...close
88d0: 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a  (fileinfo->fd);.
88e0: 0a 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
88f0: 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f  eaders.connectio
8900: 6e 20 21 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45  n != FILED_CONNE
8910: 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56 45  CTION_KEEP_ALIVE
8920: 29 20 7b 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b  ) {...filed_sock
8930: 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65 28  ettimeout_close(
8940: 66 64 29 3b 0a 0a 09 09 66 63 6c 6f 73 65 28 66  fd);....fclose(f
8950: 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49  p);....return(FI
8960: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43  LED_CONNECTION_C
8970: 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65  LOSE);..}...file
8980: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
8990: 70 72 6f 63 65 73 73 69 6e 67 5f 65 6e 64 28 66  processing_end(f
89a0: 64 29 3b 0a 0a 09 72 65 74 75 72 6e 28 46 49 4c  d);...return(FIL
89b0: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45  ED_CONNECTION_KE
89c0: 45 50 5f 41 4c 49 56 45 29 3b 0a 7d 0a 0a 2f 2a  EP_ALIVE);.}../*
89d0: 20 48 61 6e 64 6c 65 20 69 6e 63 6f 6d 69 6e 67   Handle incoming
89e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
89f0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c  static void *fil
8a00: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
8a10: 28 76 6f 69 64 20 2a 61 72 67 5f 76 29 20 7b 0a  (void *arg_v) {.
8a20: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77 6f  .struct filed_wo
8a30: 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67 73  rker_thread_args
8a40: 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66   *arg;..struct f
8a50: 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73  iled_http_reques
8a60: 74 20 72 65 71 75 65 73 74 3b 0a 09 73 74 72 75  t request;..stru
8a70: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
8a80: 72 79 20 2a 6c 6f 67 2c 20 6c 6f 63 61 6c 5f 64  ry *log, local_d
8a90: 75 6d 6d 79 5f 6c 6f 67 3b 0a 09 73 74 72 75 63  ummy_log;..struc
8aa0: 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20  t filed_options 
8ab0: 2a 6f 70 74 69 6f 6e 73 3b 0a 09 73 74 72 75 63  *options;..struc
8ac0: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61  t sockaddr_in6 a
8ad0: 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20  ddr;..socklen_t 
8ae0: 61 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66 61  addrlen;..int fa
8af0: 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 2c  ilure_count = 0,
8b00: 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75   max_failure_cou
8b10: 6e 74 20 3d 20 46 49 4c 45 44 5f 4d 41 58 5f 46  nt = FILED_MAX_F
8b20: 41 49 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a 09 69  AILURE_COUNT;..i
8b30: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74  nt connection_st
8b40: 61 74 65 20 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e  ate = FILED_CONN
8b50: 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 3b 0a 09 69  ECTION_CLOSE;..i
8b60: 6e 74 20 6d 61 73 74 65 72 5f 66 64 2c 20 66 64  nt master_fd, fd
8b70: 20 3d 20 2d 31 3b 0a 0a 09 2f 2a 20 52 65 61 64   = -1;.../* Read
8b80: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 61   arguments */..a
8b90: 72 67 20 3d 20 61 72 67 5f 76 3b 0a 0a 09 6d 61  rg = arg_v;...ma
8ba0: 73 74 65 72 5f 66 64 20 3d 20 61 72 67 2d 3e 66  ster_fd = arg->f
8bb0: 64 3b 0a 09 6f 70 74 69 6f 6e 73 20 3d 20 26 61  d;..options = &a
8bc0: 72 67 2d 3e 6f 70 74 69 6f 6e 73 3b 0a 0a 09 77  rg->options;...w
8bd0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 2f 2a 20  hile (1) {.../* 
8be0: 46 61 69 6c 75 72 65 20 6c 6f 6f 70 20 70 72 65  Failure loop pre
8bf0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 09 69 66 20  vention */...if 
8c00: 28 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3e  (failure_count >
8c10: 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75   max_failure_cou
8c20: 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a  nt) {....break;.
8c30: 09 09 7d 0a 0a 09 09 2f 2a 20 41 6c 6c 6f 63 61  ..}..../* Alloca
8c40: 74 65 20 61 20 6e 65 77 20 6c 6f 67 20 62 75 66  te a new log buf
8c50: 66 65 72 20 2a 2f 0a 09 09 6c 6f 67 20 3d 20 66  fer */...log = f
8c60: 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 31 29 3b  iled_log_new(1);
8c70: 0a 09 09 69 66 20 28 6c 6f 67 20 3d 3d 20 4e 55  ...if (log == NU
8c80: 4c 4c 29 20 7b 0a 09 09 09 66 69 6c 65 64 5f 6c  LL) {....filed_l
8c90: 6f 67 5f 6d 73 67 28 22 41 4c 4c 4f 43 41 54 45  og_msg("ALLOCATE
8ca0: 5f 4c 4f 47 5f 4d 53 47 5f 46 41 49 4c 45 44 22  _LOG_MSG_FAILED"
8cb0: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
8cc0: 7d 0a 0a 09 09 6c 6f 67 2d 3e 74 79 70 65 20 3d  }....log->type =
8cd0: 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f   FILED_LOG_TYPE_
8ce0: 54 52 41 4e 53 46 45 52 3b 0a 0a 09 09 2f 2a 20  TRANSFER;..../* 
8cf0: 49 66 20 77 65 20 63 6c 6f 73 65 64 20 74 68 65  If we closed the
8d00: 20 6f 6c 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c   old connection,
8d10: 20 61 63 63 65 70 74 20 61 20 6e 65 77 20 6f 6e   accept a new on
8d20: 65 20 2a 2f 0a 09 09 69 66 20 28 63 6f 6e 6e 65  e */...if (conne
8d30: 63 74 69 6f 6e 5f 73 74 61 74 65 20 3d 3d 20 46  ction_state == F
8d40: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
8d50: 43 4c 4f 53 45 29 20 7b 0a 09 09 09 2f 2a 20 41  CLOSE) {..../* A
8d60: 63 63 65 70 74 20 61 20 6e 65 77 20 63 6c 69 65  ccept a new clie
8d70: 6e 74 20 2a 2f 0a 09 09 09 61 64 64 72 6c 65 6e  nt */....addrlen
8d80: 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 29 3b   = sizeof(addr);
8d90: 0a 0a 09 09 09 66 64 20 3d 20 61 63 63 65 70 74  .....fd = accept
8da0: 28 6d 61 73 74 65 72 5f 66 64 2c 20 28 73 74 72  (master_fd, (str
8db0: 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20  uct sockaddr *) 
8dc0: 26 61 64 64 72 2c 20 26 61 64 64 72 6c 65 6e 29  &addr, &addrlen)
8dd0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a 09 09 20 2a  ;...}..../*... *
8de0: 20 49 66 20 77 65 20 66 61 69 6c 2c 20 6d 61 6b   If we fail, mak
8df0: 65 20 61 20 6e 6f 74 65 20 6f 66 20 69 74 20 73  e a note of it s
8e00: 6f 20 77 65 20 64 6f 6e 27 74 20 67 6f 20 69 6e  o we don't go in
8e10: 74 6f 20 61 20 6c 6f 6f 70 20 6f 66 0a 09 09 20  to a loop of... 
8e20: 2a 20 61 63 63 65 70 74 28 29 20 66 61 69 6c 69  * accept() faili
8e30: 6e 67 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 66  ng... */...if (f
8e40: 64 20 3c 20 30 29 20 7b 0a 09 09 09 2f 2a 20 4c  d < 0) {..../* L
8e50: 6f 67 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  og the new conne
8e60: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 66 69 6c 65  ction */....file
8e70: 64 5f 6c 6f 67 5f 6d 73 67 28 22 41 43 43 45 50  d_log_msg("ACCEP
8e80: 54 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09  T_FAILED");.....
8e90: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 2b 2b 3b  failure_count++;
8ea0: 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 66  .....filed_log_f
8eb0: 72 65 65 28 6c 6f 67 29 3b 0a 0a 09 09 09 63 6f  ree(log);.....co
8ec0: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 66  ntinue;...}....f
8ed0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
8ee0: 75 74 5f 61 63 63 65 70 74 28 66 64 29 3b 0a 0a  ut_accept(fd);..
8ef0: 09 09 2f 2a 20 46 69 6c 6c 20 69 6e 20 6c 6f 67  ../* Fill in log
8f00: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 09 09   structure */...
8f10: 69 66 20 28 66 69 6c 65 64 5f 6c 6f 67 5f 69 70  if (filed_log_ip
8f20: 28 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ((struct sockadd
8f30: 72 20 2a 29 20 26 61 64 64 72 2c 20 6c 6f 67 2d  r *) &addr, log-
8f40: 3e 69 70 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 2d  >ip, sizeof(log-
8f50: 3e 69 70 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  >ip)) == NULL) {
8f60: 0a 09 09 09 6c 6f 67 2d 3e 69 70 5b 30 5d 20 3d  ....log->ip[0] =
8f70: 20 27 5c 30 27 3b 0a 09 09 09 6c 6f 67 2d 3e 70   '\0';....log->p
8f80: 6f 72 74 20 3d 20 30 3b 0a 09 09 7d 20 65 6c 73  ort = 0;...} els
8f90: 65 20 7b 0a 09 09 09 6c 6f 67 2d 3e 70 6f 72 74  e {....log->port
8fa0: 20 3d 20 61 64 64 72 2e 73 69 6e 36 5f 70 6f 72   = addr.sin6_por
8fb0: 74 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 52 65 73  t;...}..../* Res
8fc0: 65 74 20 66 61 69 6c 75 72 65 20 63 6f 75 6e 74  et failure count
8fd0: 2a 2f 0a 09 09 66 61 69 6c 75 72 65 5f 63 6f 75  */...failure_cou
8fe0: 6e 74 20 3d 20 30 3b 0a 0a 09 09 2f 2a 20 48 61  nt = 0;..../* Ha
8ff0: 6e 64 6c 65 20 73 6f 63 6b 65 74 20 2a 2f 0a 09  ndle socket */..
9000: 09 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 61 74  .connection_stat
9010: 65 20 3d 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65  e = filed_handle
9020: 5f 63 6c 69 65 6e 74 28 66 64 2c 20 26 72 65 71  _client(fd, &req
9030: 75 65 73 74 2c 20 6c 6f 67 2c 20 6f 70 74 69 6f  uest, log, optio
9040: 6e 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 70  ns);..}.../* Rep
9050: 6f 72 74 20 65 72 72 6f 72 20 2a 2f 0a 09 66 69  ort error */..fi
9060: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 54 48 52  led_log_msg("THR
9070: 45 41 44 5f 44 49 45 44 20 41 42 4e 4f 52 4d 41  EAD_DIED ABNORMA
9080: 4c 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 4e 55  L");...return(NU
9090: 4c 4c 29 3b 0a 0a 09 2f 2a 20 6c 6f 63 61 6c 5f  LL);.../* local_
90a0: 64 75 6d 6d 79 5f 6c 6f 67 20 69 73 20 6f 6e 6c  dummy_log is onl
90b0: 79 20 75 73 65 64 20 69 66 20 46 49 4c 45 44 5f  y used if FILED_
90c0: 44 4f 4e 54 5f 4c 4f 47 20 69 73 20 65 6e 61 62  DONT_LOG is enab
90d0: 6c 65 64 2c 20 6f 74 68 65 72 77 69 73 65 20 69  led, otherwise i
90e0: 74 27 73 20 6e 6f 74 20 75 73 65 64 2c 20 62 75  t's not used, bu
90f0: 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 68  t the compiler h
9100: 61 74 65 73 20 74 68 61 74 20 69 64 65 61 2e 20  ates that idea. 
9110: 2a 2f 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f  */..local_dummy_
9120: 6c 6f 67 2e 74 79 70 65 20 3d 20 30 3b 0a 09 6c  log.type = 0;..l
9130: 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74  ocal_dummy_log.t
9140: 79 70 65 20 3d 20 6c 6f 63 61 6c 5f 64 75 6d 6d  ype = local_dumm
9150: 79 5f 6c 6f 67 2e 74 79 70 65 3b 0a 7d 0a 0a 2f  y_log.type;.}../
9160: 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20  * Create worker 
9170: 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 61 74 69  threads */.stati
9180: 63 20 69 6e 74 20 66 69 6c 65 64 5f 77 6f 72 6b  c int filed_work
9190: 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28  er_threads_init(
91a0: 69 6e 74 20 66 64 2c 20 69 6e 74 20 74 68 72 65  int fd, int thre
91b0: 61 64 5f 63 6f 75 6e 74 2c 20 73 74 72 75 63 74  ad_count, struct
91c0: 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a   filed_options *
91d0: 6f 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 72 75  options) {..stru
91e0: 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f  ct filed_worker_
91f0: 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67  thread_args *arg
9200: 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72  ;..pthread_t thr
9210: 65 61 64 69 64 3b 0a 09 69 6e 74 20 70 74 68 72  eadid;..int pthr
9220: 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b  ead_ret;..int i;
9230: 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  ...for (i = 0; i
9240: 20 3c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 3b   < thread_count;
9250: 20 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d 20   i++) {...arg = 
9260: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 61  malloc(sizeof(*a
9270: 72 67 29 29 3b 0a 0a 09 09 61 72 67 2d 3e 66 64  rg));....arg->fd
9280: 20 3d 20 66 64 3b 0a 09 09 6d 65 6d 63 70 79 28   = fd;...memcpy(
9290: 26 61 72 67 2d 3e 6f 70 74 69 6f 6e 73 2c 20 6f  &arg->options, o
92a0: 70 74 69 6f 6e 73 2c 20 73 69 7a 65 6f 66 28 2a  ptions, sizeof(*
92b0: 6f 70 74 69 6f 6e 73 29 29 3b 0a 0a 09 09 70 74  options));....pt
92c0: 68 72 65 61 64 5f 72 65 74 20 3d 20 70 74 68 72  hread_ret = pthr
92d0: 65 61 64 5f 63 72 65 61 74 65 28 26 74 68 72 65  ead_create(&thre
92e0: 61 64 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65  adid, NULL, file
92f0: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 2c  d_worker_thread,
9300: 20 61 72 67 29 3b 0a 09 09 69 66 20 28 70 74 68   arg);...if (pth
9310: 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b  read_ret != 0) {
9320: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
9330: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
9340: 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 69 73 70 6c 61  0);.}../* Displa
9350: 79 20 68 65 6c 70 20 2a 2f 0a 73 74 61 74 69 63  y help */.static
9360: 20 76 6f 69 64 20 66 69 6c 65 64 5f 70 72 69 6e   void filed_prin
9370: 74 5f 68 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74  t_help(FILE *out
9380: 70 75 74 2c 20 69 6e 74 20 6c 6f 6e 67 5f 68 65  put, int long_he
9390: 6c 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  lp, const char *
93a0: 65 78 74 72 61 29 20 7b 0a 09 69 66 20 28 65 78  extra) {..if (ex
93b0: 74 72 61 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  tra) {...fprintf
93c0: 28 6f 75 74 70 75 74 2c 20 22 25 73 5c 6e 22 2c  (output, "%s\n",
93d0: 20 65 78 74 72 61 29 3b 0a 09 7d 0a 0a 09 66 70   extra);..}...fp
93e0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 55  rintf(output, "U
93f0: 73 61 67 65 3a 20 66 69 6c 65 64 20 5b 3c 6f 70  sage: filed [<op
9400: 74 69 6f 6e 73 3e 5d 5c 6e 22 29 3b 0a 09 66 70  tions>]\n");..fp
9410: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9420: 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b 0a 09   Options:\n");..
9430: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9440: 22 20 20 20 20 20 20 2d 68 2c 20 2d 2d 68 65 6c  "      -h, --hel
9450: 70 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  p\n");..fprintf(
9460: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
9470: 64 2c 20 2d 2d 64 61 65 6d 6f 6e 5c 6e 22 29 3b  d, --daemon\n");
9480: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9490: 2c 20 22 20 20 20 20 20 20 2d 76 2c 20 2d 2d 76  , "      -v, --v
94a0: 65 72 73 69 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72  ersion\n");..fpr
94b0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
94c0: 20 20 20 20 2d 56 2c 20 2d 2d 76 68 6f 73 74 5c      -V, --vhost\
94d0: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
94e0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20  tput, "      -b 
94f0: 3c 61 64 64 72 65 73 73 3e 2c 20 2d 2d 62 69 6e  <address>, --bin
9500: 64 20 3c 61 64 64 72 65 73 73 3e 5c 6e 22 29 3b  d <address>\n");
9510: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9520: 2c 20 22 20 20 20 20 20 20 2d 70 20 3c 70 6f 72  , "      -p <por
9530: 74 3e 2c 20 2d 2d 70 6f 72 74 20 3c 70 6f 72 74  t>, --port <port
9540: 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  >\n");..fprintf(
9550: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
9560: 74 20 3c 63 6f 75 6e 74 3e 2c 20 2d 2d 74 68 72  t <count>, --thr
9570: 65 61 64 73 20 3c 63 6f 75 6e 74 3e 5c 6e 22 29  eads <count>\n")
9580: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
9590: 74 2c 20 22 20 20 20 20 20 20 2d 63 20 3c 65 6e  t, "      -c <en
95a0: 74 72 69 65 73 3e 2c 20 2d 2d 63 61 63 68 65 20  tries>, --cache 
95b0: 3c 65 6e 74 72 69 65 73 3e 5c 6e 22 29 3b 0a 09  <entries>\n");..
95c0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
95d0: 22 20 20 20 20 20 20 2d 6c 20 3c 66 69 6c 65 3e  "      -l <file>
95e0: 2c 20 2d 2d 6c 6f 67 20 3c 66 69 6c 65 3e 5c 6e  , --log <file>\n
95f0: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
9600: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 75 20 3c  put, "      -u <
9610: 75 73 65 72 3e 2c 20 2d 2d 75 73 65 72 20 3c 75  user>, --user <u
9620: 73 65 72 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  ser>\n");..fprin
9630: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9640: 20 20 2d 72 20 3c 64 69 72 65 63 74 6f 72 79 3e    -r <directory>
9650: 2c 20 2d 2d 72 6f 6f 74 20 3c 64 69 72 65 63 74  , --root <direct
9660: 6f 72 79 3e 5c 6e 22 29 3b 0a 0a 09 69 66 20 28  ory>\n");...if (
9670: 6c 6f 6e 67 5f 68 65 6c 70 29 20 7b 0a 09 09 66  long_help) {...f
9680: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9690: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
96a0: 6f 75 74 70 75 74 2c 20 22 20 20 55 73 61 67 65  output, "  Usage
96b0: 3a 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  :\n");...fprintf
96c0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
96d0: 2d 68 20 28 6f 72 20 2d 2d 68 65 6c 70 29 20 70  -h (or --help) p
96e0: 72 69 6e 74 73 20 74 68 69 73 20 75 73 61 67 65  rints this usage
96f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 5c 6e 22   information.\n"
9700: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9710: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...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 2d 64 20 28 6f 72 20 2d 2d 64 61       -d (or --da
9740: 65 6d 6f 6e 29 20 69 6e 73 74 72 75 63 74 73 20  emon) instructs 
9750: 66 69 6c 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  filed to become 
9760: 61 20 64 61 65 6d 6f 6e 20 61 66 74 65 72 20 69  a daemon after i
9770: 6e 69 74 69 61 6c 69 7a 69 6e 67 5c 6e 22 29 3b  nitializing\n");
9780: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9790: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
97a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6c             the l
97b0: 69 73 74 65 6e 69 6e 67 20 54 43 50 20 73 6f 63  istening TCP soc
97c0: 6b 65 74 20 61 6e 64 20 6c 6f 67 20 66 69 6c 65  ket and log file
97d0: 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  s.\n");...fprint
97e0: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
97f0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9800: 74 2c 20 22 20 20 20 20 20 20 2d 76 20 28 6f 72  t, "      -v (or
9810: 20 2d 2d 76 65 72 73 69 6f 6e 29 20 69 6e 73 74   --version) inst
9820: 72 75 63 74 73 20 66 69 6c 65 64 20 70 72 69 6e  ructs filed prin
9830: 74 20 6f 75 74 20 74 68 65 20 76 65 72 73 69 6f  t out the versio
9840: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 65 78 69  n number and exi
9850: 74 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  t.\n");...fprint
9860: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
9870: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9880: 74 2c 20 22 20 20 20 20 20 20 2d 56 20 28 6f 72  t, "      -V (or
9890: 20 2d 2d 76 68 6f 73 74 29 20 69 6e 73 74 72 75   --vhost) instru
98a0: 63 74 73 20 66 69 6c 65 64 20 74 6f 20 70 72 65  cts filed to pre
98b0: 70 65 6e 64 20 61 6c 6c 20 72 65 71 75 65 73 74  pend all request
98c0: 73 20 77 69 74 68 20 74 68 65 69 72 20 48 54 54  s with their HTT
98d0: 50 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  P\n");...fprintf
98e0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 48 6f 73 74 20 68 65 61 64 65 72 2e 5c 6e 22 29  Host header.\n")
9910: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9920: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
9930: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
9940: 20 20 20 20 2d 62 20 28 6f 72 20 2d 2d 62 69 6e      -b (or --bin
9950: 64 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65  d) specifies the
9960: 20 61 64 64 72 65 73 73 20 74 6f 20 6c 69 73 74   address to list
9970: 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e 67 20  en for incoming 
9980: 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70 72 69  HTTP\n");...fpri
9990: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 72 65 71 75 65 73 74 73 20 6f 6e 2e 20 20    requests on.  
99c0: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
99d0: 65 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  e is \"%s\".\n",
99e0: 20 42 49 4e 44 5f 41 44 44 52 29 3b 0a 09 09 66   BIND_ADDR);...f
99f0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9a00: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9a10: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
9a20: 70 20 28 6f 72 20 2d 2d 70 6f 72 74 29 20 73 70  p (or --port) sp
9a30: 65 63 69 66 69 65 73 20 74 68 65 20 54 43 50 20  ecifies the TCP 
9a40: 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 20 6c  port number to l
9a50: 69 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69  isten for incomi
9a60: 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66  ng HTTP\n");...f
9a70: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 72 65 71 75 65 73 74 73 20 6f 6e       requests on
9aa0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
9ab0: 73 20 25 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67  s %u.\n", (unsig
9ac0: 6e 65 64 20 69 6e 74 29 20 50 4f 52 54 29 3b 0a  ned int) PORT);.
9ad0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9ae0: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  , "\n");...fprin
9af0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9b00: 20 20 2d 74 20 28 6f 72 20 2d 2d 74 68 72 65 61    -t (or --threa
9b10: 64 73 29 20 73 70 65 63 69 66 69 65 73 20 74 68  ds) specifies th
9b20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  e number of work
9b30: 65 72 20 74 68 72 65 61 64 73 20 74 6f 20 63 72  er threads to cr
9b40: 65 61 74 65 2e 20 45 61 63 68 5c 6e 22 29 3b 0a  eate. Each\n");.
9b50: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9b60: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9b70: 20 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 65             worke
9b80: 72 20 74 68 72 65 61 64 20 63 61 6e 20 73 65 72  r thread can ser
9b90: 76 69 63 65 20 6f 6e 65 20 63 6f 6e 63 75 72 72  vice one concurr
9ba0: 65 6e 74 20 48 54 54 50 20 73 65 73 73 69 6f 6e  ent HTTP session
9bb0: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
9bc0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 54 68 75 73 20 74 68 65 20 6e 75 6d 62 65    Thus the numbe
9bf0: 72 20 6f 66 20 74 68 72 65 61 64 73 20 63 72 65  r of threads cre
9c00: 61 74 65 64 20 77 69 6c 6c 20 64 65 74 65 72 6d  ated will determ
9c10: 69 6e 65 20 68 6f 77 5c 6e 22 29 3b 0a 09 09 66  ine how\n");...f
9c20: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 20 20 20 20 6d 61 6e 79 20 73 69 6d          many sim
9c50: 75 6c 74 61 6e 65 6f 75 73 20 74 72 61 6e 73 66  ultaneous transf
9c60: 65 72 73 20 77 69 6c 6c 20 62 65 20 70 6f 73 73  ers will be poss
9c70: 69 62 6c 65 2e 20 54 68 65 5c 6e 22 29 3b 0a 09  ible. The\n");..
9c80: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9c90: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9ca0: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
9cb0: 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75  t is %lu.\n", (u
9cc0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 48  nsigned long) TH
9cd0: 52 45 41 44 5f 43 4f 55 4e 54 29 3b 0a 09 09 66  READ_COUNT);...f
9ce0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9cf0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9d00: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
9d10: 63 20 28 6f 72 20 2d 2d 63 61 63 68 65 29 20 73  c (or --cache) s
9d20: 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
9d30: 62 65 72 20 6f 66 20 66 69 6c 65 20 69 6e 66 6f  ber of file info
9d40: 72 6d 61 74 69 6f 6e 20 63 61 63 68 65 20 65 6e  rmation cache en
9d50: 74 72 69 65 73 5c 6e 22 29 3b 0a 09 09 66 70 72  tries\n");...fpr
9d60: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e      to allocate.
9d90: 20 20 45 61 63 68 20 63 61 63 68 65 20 65 6e 74    Each cache ent
9da0: 72 79 20 68 6f 6c 64 73 20 66 69 6c 65 20 69 6e  ry holds file in
9db0: 66 6f 72 6d 61 74 69 6f 6e 20 61 73 5c 6e 22 29  formation as\n")
9dc0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9dd0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
9de0: 20 20 20 20 20 20 20 20 20 20 20 77 65 6c 6c 20             well 
9df0: 61 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  as an open file 
9e00: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
9e10: 65 20 66 69 6c 65 2c 20 73 6f 20 72 65 73 6f 75  e file, so resou
9e20: 72 63 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  rce\n");...fprin
9e30: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 6c 69 6d 69 74 73 20 28 69 2e 65 2e 2c 20    limits (i.e., 
9e60: 75 6c 69 6d 69 74 29 20 73 68 6f 75 6c 64 20 62  ulimit) should b
9e70: 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 20 54  e considered.  T
9e80: 68 69 73 20 73 68 6f 75 6c 64 5c 6e 22 29 3b 0a  his should\n");.
9e90: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9ea0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9eb0: 20 20 20 20 20 20 20 20 20 62 65 20 61 20 70 72           be a pr
9ec0: 69 6d 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 69  ime number for i
9ed0: 64 65 61 6c 20 75 73 65 20 77 69 74 68 20 74 68  deal use with th
9ee0: 65 20 6c 6f 6f 6b 75 70 20 6d 65 74 68 6f 64 2e  e lookup method.
9ef0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9f00: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
9f20: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c  he default is %l
9f30: 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64  u.\n", (unsigned
9f40: 20 6c 6f 6e 67 29 20 43 41 43 48 45 5f 53 49 5a   long) CACHE_SIZ
9f50: 45 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  E);...fprintf(ou
9f60: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
9f70: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9f80: 20 20 20 20 20 20 2d 6c 20 28 6f 72 20 2d 2d 6c        -l (or --l
9f90: 6f 67 29 20 73 70 65 63 69 66 69 65 73 20 61 20  og) specifies a 
9fa0: 66 69 6c 65 6e 61 6d 65 20 74 6f 20 6f 70 65 6e  filename to open
9fb0: 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6c 6f 67   for writing log
9fc0: 20 65 6e 74 72 69 65 73 2e 20 20 4c 6f 67 5c 6e   entries.  Log\n
9fd0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
9fe0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
9ff0: 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 72 69             entri
a000: 65 73 20 61 72 65 20 6d 61 64 65 20 66 6f 72 20  es are made for 
a010: 76 61 72 69 6f 75 73 20 73 74 61 67 65 73 20 69  various stages i
a020: 6e 20 74 72 61 6e 73 66 65 72 69 6e 67 20 66 69  n transfering fi
a030: 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69  les.\n");...fpri
a040: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73   The log file is
a070: 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 73   opened before s
a080: 77 69 74 63 68 69 6e 67 20 75 73 65 72 73 20 28  witching users (
a090: 73 65 65 20 5c 22 2d 75 5c 22 29 5c 6e 22 29 3b  see \"-u\")\n");
a0a0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
a0b0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
a0c0: 20 20 20 20 20 20 20 20 61 6e 64 20 72 6f 6f 74          and root
a0d0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 28 73 65   directories (se
a0e0: 65 20 5c 22 2d 72 5c 22 29 2e 20 20 54 68 65 20  e \"-r\").  The 
a0f0: 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 65 76 65  log file is neve
a100: 72 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  r\n");...fprintf
a110: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
a130: 6f 73 65 64 20 73 6f 20 6c 6f 67 20 72 6f 74 61  osed so log rota
a140: 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 73 74 6f  tion without sto
a150: 70 70 69 6e 67 20 74 68 65 20 64 61 65 6d 6f 6e  pping the daemon
a160: 20 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09   is will\n");...
a170: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
a180: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a190: 20 20 20 20 20 6e 6f 74 20 77 6f 72 6b 2e 20 20       not work.  
a1a0: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 5c 22 2d  The value of \"-
a1b0: 5c 22 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  \" indicates tha
a1c0: 74 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  t standard outpu
a1d0: 74 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  t\n");...fprintf
a1e0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
a200: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
a210: 20 6c 6f 67 67 69 6e 67 2e 20 20 49 66 20 74 68   logging.  If th
a220: 65 20 66 69 6c 65 6e 61 6d 65 20 62 65 67 69 6e  e filename begin
a230: 73 20 77 69 74 68 20 61 5c 6e 22 29 3b 0a 09 09  s with a\n");...
a240: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
a250: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a260: 20 20 20 20 20 70 69 70 65 20 28 5c 22 7c 5c 22       pipe (\"|\"
a270: 29 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  ) then a process
a280: 20 69 73 20 73 74 61 72 74 65 64 20 61 6e 64 20   is started and 
a290: 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67  used for logging
a2a0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a2b0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73               ins
a2d0: 74 65 61 64 20 6f 66 20 61 20 66 69 6c 65 2e 20  tead of a file. 
a2e0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
a2f0: 5c 22 25 73 5c 22 2e 5c 6e 22 2c 20 4c 4f 47 5f  \"%s\".\n", LOG_
a300: 46 49 4c 45 29 3b 0a 23 69 66 64 65 66 20 46 49  FILE);.#ifdef FI
a310: 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 09 09 66  LED_DONT_LOG...f
a320: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 6c 6f      Note that lo
a350: 67 67 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65 74  gging is complet
a360: 65 6c 79 20 64 69 73 61 62 6c 65 64 20 73 6f 20  ely disabled so 
a370: 74 68 69 73 20 6f 70 74 69 6f 6e 20 64 6f 65 73  this option does
a380: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a390: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74               not
a3b0: 68 69 6e 67 20 69 6e 20 74 68 69 73 20 62 75 69  hing in this bui
a3c0: 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a  ld.\n");.#endif.
a3d0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
a3e0: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  , "\n");...fprin
a3f0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
a400: 20 20 2d 75 20 28 6f 72 20 2d 2d 75 73 65 72 29    -u (or --user)
a410: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 75   specifies the u
a420: 73 65 72 20 74 6f 20 73 77 69 74 63 68 20 75 73  ser to switch us
a430: 65 72 20 49 44 73 20 74 6f 20 62 65 66 6f 72 65  er IDs to before
a440: 20 73 65 72 76 69 63 69 6e 67 5c 6e 22 29 3b 0a   servicing\n");.
a450: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
a460: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
a470: 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73          requests
a480: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
a490: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 75 73 65  s not change use
a4a0: 72 20 49 44 73 2e 5c 6e 22 29 3b 0a 09 09 66 70  r IDs.\n");...fp
a4b0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
a4c0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
a4d0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 72  utput, "      -r
a4e0: 20 28 6f 72 20 2d 2d 72 6f 6f 74 29 20 73 70 65   (or --root) spe
a4f0: 63 69 66 69 65 73 20 74 68 65 20 64 69 72 65 63  cifies the direc
a500: 74 6f 72 79 20 74 6f 20 61 63 74 20 61 73 20 74  tory to act as t
a510: 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72  he root director
a520: 79 20 66 6f 72 5c 6e 22 29 3b 0a 09 09 66 70 72  y for\n");...fpr
a530: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 74 68 65 20 66 69 6c 65 20 73 65 72 76     the file serv
a560: 65 72 2e 20 20 49 66 20 74 68 69 73 20 6f 70 74  er.  If this opt
a570: 69 6f 6e 20 69 73 20 73 70 65 63 69 66 69 65 64  ion is specified
a580: 2c 20 63 68 72 6f 6f 74 28 32 29 5c 6e 22 29 3b  , chroot(2)\n");
a590: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
a5a0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
a5b0: 20 20 20 20 20 20 20 20 20 69 73 20 63 61 6c 6c           is call
a5c0: 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  ed.  The default
a5d0: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 72   is not change r
a5e0: 6f 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73 2c  oot directories,
a5f0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a600: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
a620: 61 74 20 69 73 2c 20 74 68 65 20 5c 22 2f 5c 22  at is, the \"/\"
a630: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 68   directory is sh
a640: 61 72 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20  ared out.  This 
a650: 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66 70 72 69  will\n");...fpri
a660: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 20 20 6c 69 6b 65 6c 79 20 62 65 20 61 20 73 65    likely be a se
a690: 63 75 72 69 74 79 20 69 73 73 75 65 2c 20 73 6f  curity issue, so
a6a0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 73 68 6f   this option sho
a6b0: 75 6c 64 20 61 6c 77 61 79 73 5c 6e 22 29 3b 0a  uld always\n");.
a6c0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
a6d0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
a6e0: 20 20 20 20 20 20 20 20 62 65 20 75 73 65 64 2e          be used.
a6f0: 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  \n");..}...retur
a700: 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 67  n;.}../* Add a g
a710: 65 74 6f 70 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a  etopt option */.
a720: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
a730: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
a740: 74 6f 70 74 28 73 74 72 75 63 74 20 6f 70 74 69  topt(struct opti
a750: 6f 6e 20 2a 6f 70 74 2c 20 63 6f 6e 73 74 20 63  on *opt, const c
a760: 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 68  har *name, int h
a770: 61 73 5f 61 72 67 2c 20 69 6e 74 20 76 61 6c 29  as_arg, int val)
a780: 20 7b 0a 09 6f 70 74 2d 3e 6e 61 6d 65 20 20 20   {..opt->name   
a790: 20 20 3d 20 6e 61 6d 65 3b 0a 09 6f 70 74 2d 3e    = name;..opt->
a7a0: 68 61 73 5f 61 72 67 20 20 3d 20 68 61 73 5f 61  has_arg  = has_a
a7b0: 72 67 3b 0a 09 6f 70 74 2d 3e 66 6c 61 67 20 20  rg;..opt->flag  
a7c0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 09 6f 70 74 2d     = NULL;..opt-
a7d0: 3e 76 61 6c 20 20 20 20 20 20 3d 20 76 61 6c 3b  >val      = val;
a7e0: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
a7f0: 20 52 65 73 6f 6c 76 65 20 61 20 75 73 65 72 6e   Resolve a usern
a800: 61 6d 65 20 74 6f 20 61 20 55 49 44 20 2a 2f 0a  ame to a UID */.
a810: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
a820: 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 63 6f 6e  _user_lookup(con
a830: 73 74 20 63 68 61 72 20 2a 75 73 65 72 2c 20 75  st char *user, u
a840: 69 64 5f 74 20 2a 75 73 65 72 5f 69 64 29 20 7b  id_t *user_id) {
a850: 0a 09 63 68 61 72 20 2a 6e 65 78 74 3b 0a 09 75  ..char *next;..u
a860: 69 64 5f 74 20 75 73 65 72 5f 69 64 5f 63 68 65  id_t user_id_che
a870: 63 6b 3b 0a 23 69 66 6e 64 65 66 20 46 49 4c 45  ck;.#ifndef FILE
a880: 44 5f 4e 4f 5f 47 45 54 50 57 4e 41 4d 0a 09 73  D_NO_GETPWNAM..s
a890: 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 65 6e  truct passwd *en
a8a0: 74 3b 0a 0a 09 65 6e 74 20 3d 20 67 65 74 70 77  t;...ent = getpw
a8b0: 6e 61 6d 28 75 73 65 72 29 3b 0a 09 69 66 20 28  nam(user);..if (
a8c0: 65 6e 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ent != NULL) {..
a8d0: 09 2a 75 73 65 72 5f 69 64 20 3d 20 65 6e 74 2d  .*user_id = ent-
a8e0: 3e 70 77 5f 75 69 64 3b 0a 0a 09 09 72 65 74 75  >pw_uid;....retu
a8f0: 72 6e 28 30 29 3b 0a 09 7d 0a 23 65 6e 64 69 66  rn(0);..}.#endif
a900: 0a 0a 09 75 73 65 72 5f 69 64 5f 63 68 65 63 6b  ...user_id_check
a910: 20 3d 20 73 74 72 74 6f 75 6c 6c 28 75 73 65 72   = strtoull(user
a920: 2c 20 26 6e 65 78 74 2c 20 31 30 29 3b 0a 09 69  , &next, 10);..i
a930: 66 20 28 6e 65 78 74 20 3d 3d 20 4e 55 4c 4c 29  f (next == NULL)
a940: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
a950: 09 7d 0a 0a 09 69 66 20 28 6e 65 78 74 5b 30 5d  .}...if (next[0]
a960: 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65   != '\0') {...re
a970: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2a 75  turn(1);..}...*u
a980: 73 65 72 5f 69 64 20 3d 20 75 73 65 72 5f 69 64  ser_id = user_id
a990: 5f 63 68 65 63 6b 3b 0a 0a 09 72 65 74 75 72 6e  _check;...return
a9a0: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 61 65 6d 6f  (0);.}../* Daemo
a9b0: 6e 69 7a 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  nize */.static i
a9c0: 6e 74 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69  nt filed_daemoni
a9d0: 7a 65 28 76 6f 69 64 29 20 7b 0a 09 70 69 64 5f  ze(void) {..pid_
a9e0: 74 20 73 65 74 73 69 64 5f 72 65 74 2c 20 66 6f  t setsid_ret, fo
a9f0: 72 6b 5f 72 65 74 3b 0a 09 69 6e 74 20 63 68 64  rk_ret;..int chd
aa00: 69 72 5f 72 65 74 2c 20 64 75 70 32 5f 72 65 74  ir_ret, dup2_ret
aa10: 3b 0a 09 69 6e 74 20 66 64 5f 69 6e 2c 20 66 64  ;..int fd_in, fd
aa20: 5f 6f 75 74 3b 0a 0a 09 63 68 64 69 72 5f 72 65  _out;...chdir_re
aa30: 74 20 3d 20 63 68 64 69 72 28 22 2f 22 29 3b 0a  t = chdir("/");.
aa40: 09 69 66 20 28 63 68 64 69 72 5f 72 65 74 20 21  .if (chdir_ret !
aa50: 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  = 0) {...return(
aa60: 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 6b 5f 72 65  1);..}...fork_re
aa70: 74 20 3d 20 66 6f 72 6b 28 29 3b 0a 09 69 66 20  t = fork();..if 
aa80: 28 66 6f 72 6b 5f 72 65 74 20 3c 20 30 29 20 7b  (fork_ret < 0) {
aa90: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
aaa0: 0a 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74 20  ...if (fork_ret 
aab0: 3e 20 30 29 20 7b 0a 09 09 2f 2a 20 50 61 72 65  > 0) {.../* Pare
aac0: 6e 74 20 2a 2f 0a 09 09 77 61 69 74 70 69 64 28  nt */...waitpid(
aad0: 66 6f 72 6b 5f 72 65 74 2c 20 4e 55 4c 4c 2c 20  fork_ret, NULL, 
aae0: 30 29 3b 0a 0a 09 09 65 78 69 74 28 45 58 49 54  0);....exit(EXIT
aaf0: 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09  _SUCCESS);..}...
ab00: 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09 69 66 20  /* Child */..if 
ab10: 28 66 6f 72 6b 28 29 20 21 3d 20 30 29 20 7b 0a  (fork() != 0) {.
ab20: 09 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09 09  ../* Child */...
ab30: 65 78 69 74 28 45 58 49 54 5f 53 55 43 43 45 53  exit(EXIT_SUCCES
ab40: 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 72 61 6e  S);..}.../* Gran
ab50: 64 20 63 68 69 6c 64 20 2a 2f 0a 09 73 65 74 73  d child */..sets
ab60: 69 64 5f 72 65 74 20 3d 20 73 65 74 73 69 64 28  id_ret = setsid(
ab70: 29 3b 0a 09 69 66 20 28 73 65 74 73 69 64 5f 72  );..if (setsid_r
ab80: 65 74 20 3d 3d 20 28 28 70 69 64 5f 74 29 20 2d  et == ((pid_t) -
ab90: 31 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  1)) {...return(1
aba0: 29 3b 0a 09 7d 0a 0a 09 66 64 5f 69 6e 20 3d 20  );..}...fd_in = 
abb0: 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  open("/dev/null"
abc0: 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 66 64  , O_RDONLY);..fd
abd0: 5f 6f 75 74 20 3d 20 6f 70 65 6e 28 22 2f 64 65  _out = open("/de
abe0: 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 57 52 4f 4e 4c  v/null", O_WRONL
abf0: 59 29 3b 0a 09 69 66 20 28 66 64 5f 69 6e 20 3c  Y);..if (fd_in <
ac00: 20 30 20 7c 7c 20 66 64 5f 6f 75 74 20 3c 20 30   0 || fd_out < 0
ac10: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
ac20: 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d  ..}...dup2_ret =
ac30: 20 64 75 70 32 28 66 64 5f 69 6e 2c 20 53 54 44   dup2(fd_in, STD
ac40: 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20  IN_FILENO);..if 
ac50: 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44  (dup2_ret != STD
ac60: 49 4e 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72  IN_FILENO) {...r
ac70: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64  eturn(1);..}...d
ac80: 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66  up2_ret = dup2(f
ac90: 64 5f 6f 75 74 2c 20 53 54 44 4f 55 54 5f 46 49  d_out, STDOUT_FI
aca0: 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32  LENO);..if (dup2
acb0: 5f 72 65 74 20 21 3d 20 53 54 44 4f 55 54 5f 46  _ret != STDOUT_F
acc0: 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72  ILENO) {...retur
acd0: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f  n(1);..}...dup2_
ace0: 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f 6f 75  ret = dup2(fd_ou
acf0: 74 2c 20 53 54 44 45 52 52 5f 46 49 4c 45 4e 4f  t, STDERR_FILENO
ad00: 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74  );..if (dup2_ret
ad10: 20 21 3d 20 53 54 44 45 52 52 5f 46 49 4c 45 4e   != STDERR_FILEN
ad20: 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  O) {...return(1)
ad30: 3b 0a 09 7d 0a 0a 09 63 6c 6f 73 65 28 66 64 5f  ;..}...close(fd_
ad40: 69 6e 29 3b 0a 09 63 6c 6f 73 65 28 66 64 5f 6f  in);..close(fd_o
ad50: 75 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  ut);...return(0)
ad60: 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 70 72 6f 63  ;.}../* Run proc
ad70: 65 73 73 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28  ess */.int main(
ad80: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
ad90: 2a 61 72 67 76 29 20 7b 0a 09 73 74 72 75 63 74  *argv) {..struct
ada0: 20 6f 70 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 5b   option options[
adb0: 31 32 5d 3b 0a 09 73 74 72 75 63 74 20 66 69 6c  12];..struct fil
adc0: 65 64 5f 6f 70 74 69 6f 6e 73 20 74 68 72 65 61  ed_options threa
add0: 64 5f 6f 70 74 69 6f 6e 73 20 3d 20 7b 30 7d 3b  d_options = {0};
ade0: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 69  ..const char *bi
adf0: 6e 64 5f 61 64 64 72 20 3d 20 42 49 4e 44 5f 41  nd_addr = BIND_A
ae00: 44 44 52 2c 20 2a 6e 65 77 72 6f 6f 74 20 3d 20  DDR, *newroot = 
ae10: 4e 55 4c 4c 2c 20 2a 6c 6f 67 5f 66 69 6c 65 20  NULL, *log_file 
ae20: 3d 20 4c 4f 47 5f 46 49 4c 45 3b 0a 09 46 49 4c  = LOG_FILE;..FIL
ae30: 45 20 2a 6c 6f 67 5f 66 70 3b 0a 09 75 69 64 5f  E *log_fp;..uid_
ae40: 74 20 75 73 65 72 20 3d 20 30 3b 0a 09 69 6e 74  t user = 0;..int
ae50: 20 70 6f 72 74 20 3d 20 50 4f 52 54 2c 20 74 68   port = PORT, th
ae60: 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 54 48 52  read_count = THR
ae70: 45 41 44 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20  EAD_COUNT;..int 
ae80: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 43 41 43  cache_size = CAC
ae90: 48 45 5f 53 49 5a 45 3b 0a 09 69 6e 74 20 69 6e  HE_SIZE;..int in
aea0: 69 74 5f 72 65 74 2c 20 63 68 72 6f 6f 74 5f 72  it_ret, chroot_r
aeb0: 65 74 2c 20 73 65 74 75 69 64 5f 72 65 74 2c 20  et, setuid_ret, 
aec0: 6c 6f 6f 6b 75 70 5f 72 65 74 2c 20 63 68 64 69  lookup_ret, chdi
aed0: 72 5f 72 65 74 3b 0a 09 69 6e 74 20 73 65 74 75  r_ret;..int setu
aee0: 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 30 2c 20  id_enabled = 0, 
aef0: 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d  daemon_enabled =
af00: 20 30 3b 0a 09 69 6e 74 20 63 68 3b 0a 09 69 6e   0;..int ch;..in
af10: 74 20 66 64 3b 0a 0a 09 2f 2a 20 50 72 6f 63 65  t fd;.../* Proce
af20: 73 73 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ss arguments */.
af30: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
af40: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
af50: 6e 73 5b 30 5d 2c 20 22 70 6f 72 74 22 2c 20 72  ns[0], "port", r
af60: 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74  equired_argument
af70: 2c 20 27 70 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'p');..filed_g
af80: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
af90: 74 28 26 6f 70 74 69 6f 6e 73 5b 31 5d 2c 20 22  t(&options[1], "
afa0: 74 68 72 65 61 64 73 22 2c 20 72 65 71 75 69 72  threads", requir
afb0: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 74 27  ed_argument, 't'
afc0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
afd0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
afe0: 74 69 6f 6e 73 5b 32 5d 2c 20 22 63 61 63 68 65  tions[2], "cache
aff0: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
b000: 6d 65 6e 74 2c 20 27 63 27 29 3b 0a 09 66 69 6c  ment, 'c');..fil
b010: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
b020: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 33  etopt(&options[3
b030: 5d 2c 20 22 62 69 6e 64 22 2c 20 72 65 71 75 69  ], "bind", requi
b040: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 62  red_argument, 'b
b050: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
b060: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
b070: 70 74 69 6f 6e 73 5b 34 5d 2c 20 22 75 73 65 72  ptions[4], "user
b080: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
b090: 6d 65 6e 74 2c 20 27 75 27 29 3b 0a 09 66 69 6c  ment, 'u');..fil
b0a0: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
b0b0: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 35  etopt(&options[5
b0c0: 5d 2c 20 22 72 6f 6f 74 22 2c 20 72 65 71 75 69  ], "root", requi
b0d0: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 72  red_argument, 'r
b0e0: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
b0f0: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
b100: 70 74 69 6f 6e 73 5b 36 5d 2c 20 22 68 65 6c 70  ptions[6], "help
b110: 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20  ", no_argument, 
b120: 27 68 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'h');..filed_get
b130: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
b140: 26 6f 70 74 69 6f 6e 73 5b 37 5d 2c 20 22 64 61  &options[7], "da
b150: 65 6d 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65  emon", no_argume
b160: 6e 74 2c 20 27 64 27 29 3b 0a 09 66 69 6c 65 64  nt, 'd');..filed
b170: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
b180: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 38 5d 2c  opt(&options[8],
b190: 20 22 6c 6f 67 22 2c 20 72 65 71 75 69 72 65 64   "log", required
b1a0: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 6c 27 29 3b  _argument, 'l');
b1b0: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
b1c0: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
b1d0: 6f 6e 73 5b 39 5d 2c 20 22 76 65 72 73 69 6f 6e  ons[9], "version
b1e0: 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20  ", no_argument, 
b1f0: 27 76 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'v');..filed_get
b200: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
b210: 26 6f 70 74 69 6f 6e 73 5b 31 30 5d 2c 20 22 76  &options[10], "v
b220: 68 6f 73 74 22 2c 20 6e 6f 5f 61 72 67 75 6d 65  host", no_argume
b230: 6e 74 2c 20 27 56 27 29 3b 0a 09 66 69 6c 65 64  nt, 'V');..filed
b240: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
b250: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31 31 5d  opt(&options[11]
b260: 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 09  , NULL, 0, 0);..
b270: 77 68 69 6c 65 20 28 28 63 68 20 3d 20 67 65 74  while ((ch = get
b280: 6f 70 74 5f 6c 6f 6e 67 28 61 72 67 63 2c 20 61  opt_long(argc, a
b290: 72 67 76 2c 20 22 70 3a 74 3a 63 3a 62 3a 75 3a  rgv, "p:t:c:b:u:
b2a0: 72 3a 6c 3a 68 64 76 56 22 2c 20 6f 70 74 69 6f  r:l:hdvV", optio
b2b0: 6e 73 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 2d 31  ns, NULL)) != -1
b2c0: 29 20 7b 0a 09 09 73 77 69 74 63 68 28 63 68 29  ) {...switch(ch)
b2d0: 20 7b 0a 09 09 09 63 61 73 65 20 27 70 27 3a 0a   {....case 'p':.
b2e0: 09 09 09 09 70 6f 72 74 20 3d 20 61 74 6f 69 28  ....port = atoi(
b2f0: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
b300: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 74 27 3a  ak;....case 't':
b310: 0a 09 09 09 09 74 68 72 65 61 64 5f 63 6f 75 6e  .....thread_coun
b320: 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29  t = atoi(optarg)
b330: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
b340: 63 61 73 65 20 27 63 27 3a 0a 09 09 09 09 63 61  case 'c':.....ca
b350: 63 68 65 5f 73 69 7a 65 20 3d 20 61 74 6f 69 28  che_size = atoi(
b360: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
b370: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 62 27 3a  ak;....case 'b':
b380: 0a 09 09 09 09 62 69 6e 64 5f 61 64 64 72 20 3d  .....bind_addr =
b390: 20 73 74 72 64 75 70 28 6f 70 74 61 72 67 29 3b   strdup(optarg);
b3a0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
b3b0: 61 73 65 20 27 75 27 3a 0a 09 09 09 09 73 65 74  ase 'u':.....set
b3c0: 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b  uid_enabled = 1;
b3d0: 0a 09 09 09 09 6c 6f 6f 6b 75 70 5f 72 65 74 20  .....lookup_ret 
b3e0: 3d 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f  = filed_user_loo
b3f0: 6b 75 70 28 6f 70 74 61 72 67 2c 20 26 75 73 65  kup(optarg, &use
b400: 72 29 3b 0a 09 09 09 09 69 66 20 28 6c 6f 6f 6b  r);.....if (look
b410: 75 70 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  up_ret != 0) {..
b420: 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f  ....filed_print_
b430: 68 65 6c 70 28 73 74 64 65 72 72 2c 20 30 2c 20  help(stderr, 0, 
b440: 22 49 6e 76 61 6c 69 64 20 75 73 65 72 6e 61 6d  "Invalid usernam
b450: 65 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 0a  e specified");..
b460: 09 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  .....return(1);.
b470: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
b480: 0a 09 09 09 63 61 73 65 20 27 72 27 3a 0a 09 09  ....case 'r':...
b490: 09 09 66 69 6c 65 64 5f 70 61 74 68 5f 74 72 61  ..filed_path_tra
b4a0: 6e 73 6c 61 74 65 5f 73 65 74 5f 72 6f 6f 74 28  nslate_set_root(
b4b0: 6e 65 77 72 6f 6f 74 2c 20 26 74 68 72 65 61 64  newroot, &thread
b4c0: 5f 6f 70 74 69 6f 6e 73 2c 20 6f 70 74 61 72 67  _options, optarg
b4d0: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
b4e0: 09 63 61 73 65 20 27 6c 27 3a 0a 09 09 09 09 6c  .case 'l':.....l
b4f0: 6f 67 5f 66 69 6c 65 20 3d 20 73 74 72 64 75 70  og_file = strdup
b500: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
b510: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 64 27  eak;....case 'd'
b520: 3a 0a 09 09 09 09 64 61 65 6d 6f 6e 5f 65 6e 61  :.....daemon_ena
b530: 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 62 72  bled = 1;.....br
b540: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 56 27  eak;....case 'V'
b550: 3a 0a 09 09 09 09 74 68 72 65 61 64 5f 6f 70 74  :.....thread_opt
b560: 69 6f 6e 73 2e 76 68 6f 73 74 73 5f 65 6e 61 62  ions.vhosts_enab
b570: 6c 65 64 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72  led = 1;......br
b580: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 76 27  eak;....case 'v'
b590: 3a 0a 09 09 09 09 70 72 69 6e 74 66 28 22 66 69  :.....printf("fi
b5a0: 6c 65 64 20 76 65 72 73 69 6f 6e 20 25 73 5c 6e  led version %s\n
b5b0: 22 2c 20 46 49 4c 45 44 5f 56 45 52 53 49 4f 4e  ", FILED_VERSION
b5c0: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 30  );......return(0
b5d0: 29 3b 0a 09 09 09 63 61 73 65 20 27 3f 27 3a 0a  );....case '?':.
b5e0: 09 09 09 63 61 73 65 20 27 3a 27 3a 0a 09 09 09  ...case ':':....
b5f0: 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c  .filed_print_hel
b600: 70 28 73 74 64 65 72 72 2c 20 30 2c 20 4e 55 4c  p(stderr, 0, NUL
b610: 4c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  L);......return(
b620: 31 29 3b 0a 09 09 09 63 61 73 65 20 27 68 27 3a  1);....case 'h':
b630: 0a 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74  .....filed_print
b640: 5f 68 65 6c 70 28 73 74 64 6f 75 74 2c 20 31 2c  _help(stdout, 1,
b650: 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09 72 65 74   NULL);......ret
b660: 75 72 6e 28 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  urn(0);...}..}..
b670: 09 2f 2a 20 4f 70 65 6e 20 6c 6f 67 20 66 69 6c  ./* Open log fil
b680: 65 20 2a 2f 0a 09 6c 6f 67 5f 66 70 20 3d 20 66  e */..log_fp = f
b690: 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 6c 6f  iled_log_open(lo
b6a0: 67 5f 66 69 6c 65 29 3b 0a 09 69 66 20 28 6c 6f  g_file);..if (lo
b6b0: 67 5f 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  g_fp == NULL) {.
b6c0: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
b6d0: 6c 6f 67 5f 6f 70 65 6e 22 29 3b 0a 0a 09 09 72  log_open");....r
b6e0: 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09 2f  eturn(4);..}.../
b6f0: 2a 20 43 72 65 61 74 65 20 6c 69 73 74 65 6e 69  * Create listeni
b700: 6e 67 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 66 64  ng socket */..fd
b710: 20 3d 20 66 69 6c 65 64 5f 6c 69 73 74 65 6e 28   = filed_listen(
b720: 62 69 6e 64 5f 61 64 64 72 2c 20 70 6f 72 74 29  bind_addr, port)
b730: 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b  ;..if (fd < 0) {
b740: 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64  ...perror("filed
b750: 5f 6c 69 73 74 65 6e 22 29 3b 0a 0a 09 09 72 65  _listen");....re
b760: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(1);..}.../*
b770: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 69 6d 65   Initialize time
b780: 6f 75 74 20 73 74 72 75 63 74 75 72 65 73 20 2a  out structures *
b790: 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69  /..init_ret = fi
b7a0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
b7b0: 74 5f 69 6e 69 74 28 29 3b 0a 09 69 66 20 28 69  t_init();..if (i
b7c0: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
b7d0: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
b7e0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69 6e  sockettimeout_in
b7f0: 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  it");....return(
b800: 38 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 63 6f  8);..}.../* Beco
b810: 6d 65 20 61 20 64 61 65 6d 6f 6e 20 2a 2f 0a 09  me a daemon */..
b820: 69 66 20 28 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c  if (daemon_enabl
b830: 65 64 29 20 7b 0a 09 09 69 6e 69 74 5f 72 65 74  ed) {...init_ret
b840: 20 3d 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69   = filed_daemoni
b850: 7a 65 28 29 3b 0a 09 09 69 66 20 28 69 6e 69 74  ze();...if (init
b860: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
b870: 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 64 61  perror("filed_da
b880: 65 6d 6f 6e 69 7a 65 22 29 3b 0a 0a 09 09 09 72  emonize");.....r
b890: 65 74 75 72 6e 28 36 29 3b 0a 09 09 7d 0a 09 7d  eturn(6);...}..}
b8a0: 0a 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66  .../* Chroot, if
b8b0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
b8c0: 09 69 66 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a  .if (newroot) {.
b8d0: 09 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68  ..chdir_ret = ch
b8e0: 64 69 72 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09  dir(newroot);...
b8f0: 69 66 20 28 63 68 64 69 72 5f 72 65 74 20 21 3d  if (chdir_ret !=
b900: 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28   0) {....perror(
b910: 22 63 68 64 69 72 22 29 3b 0a 0a 09 09 09 72 65  "chdir");.....re
b920: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09  turn(1);...}....
b930: 63 68 72 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72  chroot_ret = chr
b940: 6f 6f 74 28 22 2e 22 29 3b 0a 09 09 69 66 20 28  oot(".");...if (
b950: 63 68 72 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29  chroot_ret != 0)
b960: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68   {....perror("ch
b970: 72 6f 6f 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  root");.....retu
b980: 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  rn(1);...}..}...
b990: 2f 2a 20 44 72 6f 70 20 70 72 69 76 69 6c 65 67  /* Drop privileg
b9a0: 65 73 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61  es, if appropria
b9b0: 74 65 20 2a 2f 0a 09 69 66 20 28 73 65 74 75 69  te */..if (setui
b9c0: 64 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73  d_enabled) {...s
b9d0: 65 74 75 69 64 5f 72 65 74 20 3d 20 73 65 74 75  etuid_ret = setu
b9e0: 69 64 28 75 73 65 72 29 3b 0a 09 09 69 66 20 28  id(user);...if (
b9f0: 73 65 74 75 69 64 5f 72 65 74 20 21 3d 20 30 29  setuid_ret != 0)
ba00: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 73 65   {....perror("se
ba10: 74 75 69 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  tuid");.....retu
ba20: 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  rn(1);...}..}...
ba30: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 2a 2f  /* Initialize */
ba40: 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c  ..init_ret = fil
ba50: 65 64 5f 69 6e 69 74 28 63 61 63 68 65 5f 73 69  ed_init(cache_si
ba60: 7a 65 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  ze);..if (init_r
ba70: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
ba80: 72 6f 72 28 22 66 69 6c 65 64 5f 69 6e 69 74 22  ror("filed_init"
ba90: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 33 29 3b  );....return(3);
baa0: 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20  ..}.../* Create 
bab0: 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a  logging thread *
bac0: 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69  /..init_ret = fi
bad0: 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65  led_logging_thre
bae0: 61 64 5f 69 6e 69 74 28 6c 6f 67 5f 66 70 29 3b  ad_init(log_fp);
baf0: 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21  ..if (init_ret !
bb00: 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28  = 0) {...perror(
bb10: 22 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74  "filed_logging_t
bb20: 68 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09  hread_init");...
bb30: 09 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a  .return(4);..}..
bb40: 09 2f 2a 20 43 72 65 61 74 65 20 73 6f 63 6b 65  ./* Create socke
bb50: 74 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 74 68  t termination th
bb60: 72 65 61 64 20 2a 2f 0a 09 69 6e 69 74 5f 72 65  read */..init_re
bb70: 74 20 3d 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  t = filed_socket
bb80: 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 5f 69  timeout_thread_i
bb90: 6e 69 74 28 29 3b 0a 09 69 66 20 28 69 6e 69 74  nit();..if (init
bba0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70  _ret != 0) {...p
bbb0: 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 73 6f 63  error("filed_soc
bbc0: 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61  kettimeout_threa
bbd0: 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74  d_init");....ret
bbe0: 75 72 6e 28 37 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  urn(7);..}.../* 
bbf0: 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20 74 68  Create worker th
bc00: 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69 74 5f 72  reads */..init_r
bc10: 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f 72 6b 65  et = filed_worke
bc20: 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28 66  r_threads_init(f
bc30: 64 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 2c  d, thread_count,
bc40: 20 26 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73   &thread_options
bc50: 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74  );..if (init_ret
bc60: 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f   != 0) {...perro
bc70: 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f  r("filed_worker_
bc80: 74 68 72 65 61 64 73 5f 69 6e 69 74 22 29 3b 0a  threads_init");.
bc90: 0a 09 09 72 65 74 75 72 6e 28 35 29 3b 0a 09 7d  ...return(5);..}
bca0: 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f 72 20 74  .../* Wait for t
bcb0: 68 72 65 61 64 73 20 74 6f 20 65 78 69 74 20 2a  hreads to exit *
bcc0: 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20  /../* XXX:TODO: 
bcd0: 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61 64 20 75  Monitor thread u
bce0: 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c 65 20 28  sage */..while (
bcf0: 31 29 20 7b 0a 09 09 73 6c 65 65 70 28 38 36 34  1) {...sleep(864
bd00: 30 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74  00);..}.../* Ret
bd10: 75 72 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  urn in failure *
bd20: 2f 0a 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a  /..return(2);.}.