Hex Artifact Content

Artifact 7391155930ca7b6ddf48141c827810ddaa92360b:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 63 29 20 32 30 31 34 20 2d 20 32 30 31 36 2c  (c) 2014 - 2016,
0020: 20 52 6f 79 20 4b 65 65 6e 65 0a 20 2a 20 41 6c   Roy Keene. * Al
0030: 6c 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65  l rights reserve
0040: 64 2e 0a 20 2a 20 0a 20 2a 20 52 65 64 69 73 74  d.. * . * Redist
0050: 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65  ribution and use
0060: 20 69 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 62   in source and b
0070: 69 6e 61 72 79 20 66 6f 72 6d 73 2c 20 77 69 74  inary forms, wit
0080: 68 20 6f 72 20 77 69 74 68 6f 75 74 0a 20 2a 20  h or without. * 
0090: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2c 20 61 72  modification, ar
00a0: 65 20 70 65 72 6d 69 74 74 65 64 20 70 72 6f 76  e permitted prov
00b0: 69 64 65 64 20 74 68 61 74 20 74 68 65 20 66 6f  ided that the fo
00c0: 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f  llowing conditio
00d0: 6e 73 20 61 72 65 20 6d 65 74 3a 0a 20 2a 20 09  ns are met:. * .
00e0: 31 2e 20 52 65 64 69 73 74 72 69 62 75 74 69 6f  1. Redistributio
00f0: 6e 73 20 6f 66 20 73 6f 75 72 63 65 20 63 6f 64  ns of source cod
0100: 65 20 6d 75 73 74 20 72 65 74 61 69 6e 20 74 68  e must retain th
0110: 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68  e above copyrigh
0120: 74 0a 20 2a 20 09 20 20 20 6e 6f 74 69 63 65 2c  t. * .   notice,
0130: 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f   this list of co
0140: 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nditions and the
0150: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c   following discl
0160: 61 69 6d 65 72 2e 0a 20 2a 20 09 32 2e 20 52 65  aimer.. * .2. Re
0170: 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 69 6e  distributions in
0180: 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d 75 73   binary form mus
0190: 74 20 72 65 70 72 6f 64 75 63 65 20 74 68 65 20  t reproduce the 
01a0: 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 0a  above copyright.
01b0: 20 2a 20 09 20 20 20 6e 6f 74 69 63 65 2c 20 74   * .   notice, t
01c0: 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64  his list of cond
01d0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66  itions and the f
01e0: 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69  ollowing disclai
01f0: 6d 65 72 20 69 6e 20 74 68 65 0a 20 2a 20 09 20  mer in the. * . 
0200: 20 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20    documentation 
0210: 61 6e 64 2f 6f 72 20 6f 74 68 65 72 20 6d 61 74  and/or other mat
0220: 65 72 69 61 6c 73 20 70 72 6f 76 69 64 65 64 20  erials provided 
0230: 77 69 74 68 20 74 68 65 20 64 69 73 74 72 69 62  with the distrib
0240: 75 74 69 6f 6e 2e 0a 20 2a 20 0a 20 2a 20 54 48  ution.. * . * TH
0250: 49 53 20 53 4f 46 54 57 41 52 45 20 49 53 20 50  IS SOFTWARE IS P
0260: 52 4f 56 49 44 45 44 20 42 59 20 54 48 45 20 43  ROVIDED BY THE C
0270: 4f 50 59 52 49 47 48 54 20 48 4f 4c 44 45 52 53  OPYRIGHT HOLDERS
0280: 20 41 4e 44 20 43 4f 4e 54 52 49 42 55 54 4f 52   AND CONTRIBUTOR
0290: 53 20 22 41 53 20 49 53 22 20 0a 20 2a 20 41 4e  S "AS IS" . * AN
02a0: 44 20 41 4e 59 20 45 58 50 52 45 53 53 20 4f 52  D ANY EXPRESS OR
02b0: 20 49 4d 50 4c 49 45 44 20 57 41 52 52 41 4e 54   IMPLIED WARRANT
02c0: 49 45 53 2c 20 49 4e 43 4c 55 44 49 4e 47 2c 20  IES, INCLUDING, 
02d0: 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20  BUT NOT LIMITED 
02e0: 54 4f 2c 20 54 48 45 20 0a 20 2a 20 49 4d 50 4c  TO, THE . * IMPL
02f0: 49 45 44 20 57 41 52 52 41 4e 54 49 45 53 20 4f  IED WARRANTIES O
0300: 46 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  F MERCHANTABILIT
0310: 59 20 41 4e 44 20 46 49 54 4e 45 53 53 20 46 4f  Y AND FITNESS FO
0320: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
0330: 55 52 50 4f 53 45 20 0a 20 2a 20 41 52 45 20 44  URPOSE . * ARE D
0340: 49 53 43 4c 41 49 4d 45 44 2e 20 20 49 4e 20 4e  ISCLAIMED.  IN N
0350: 4f 20 45 56 45 4e 54 20 53 48 41 4c 4c 20 54 48  O EVENT SHALL TH
0360: 45 20 43 4f 50 59 52 49 47 48 54 20 48 4f 4c 44  E COPYRIGHT HOLD
0370: 45 52 20 4f 52 20 43 4f 4e 54 52 49 42 55 54 4f  ER OR CONTRIBUTO
0380: 52 53 20 42 45 20 0a 20 2a 20 4c 49 41 42 4c 45  RS BE . * LIABLE
0390: 20 46 4f 52 20 41 4e 59 20 44 49 52 45 43 54 2c   FOR ANY DIRECT,
03a0: 20 49 4e 44 49 52 45 43 54 2c 20 49 4e 43 49 44   INDIRECT, INCID
03b0: 45 4e 54 41 4c 2c 20 53 50 45 43 49 41 4c 2c 20  ENTAL, SPECIAL, 
03c0: 45 58 45 4d 50 4c 41 52 59 2c 20 4f 52 20 0a 20  EXEMPLARY, OR . 
03d0: 2a 20 43 4f 4e 53 45 51 55 45 4e 54 49 41 4c 20  * CONSEQUENTIAL 
03e0: 44 41 4d 41 47 45 53 20 28 49 4e 43 4c 55 44 49  DAMAGES (INCLUDI
03f0: 4e 47 2c 20 42 55 54 20 4e 4f 54 20 4c 49 4d 49  NG, BUT NOT LIMI
0400: 54 45 44 20 54 4f 2c 20 50 52 4f 43 55 52 45 4d  TED TO, PROCUREM
0410: 45 4e 54 20 4f 46 20 0a 20 2a 20 53 55 42 53 54  ENT OF . * SUBST
0420: 49 54 55 54 45 20 47 4f 4f 44 53 20 4f 52 20 53  ITUTE GOODS OR S
0430: 45 52 56 49 43 45 53 3b 20 4c 4f 53 53 20 4f 46  ERVICES; LOSS OF
0440: 20 55 53 45 2c 20 44 41 54 41 2c 20 4f 52 20 50   USE, DATA, OR P
0450: 52 4f 46 49 54 53 3b 20 4f 52 20 42 55 53 49 4e  ROFITS; OR BUSIN
0460: 45 53 53 20 0a 20 2a 20 49 4e 54 45 52 52 55 50  ESS . * INTERRUP
0470: 54 49 4f 4e 29 20 48 4f 57 45 56 45 52 20 43 41  TION) HOWEVER CA
0480: 55 53 45 44 20 41 4e 44 20 4f 4e 20 41 4e 59 20  USED AND ON ANY 
0490: 54 48 45 4f 52 59 20 4f 46 20 4c 49 41 42 49 4c  THEORY OF LIABIL
04a0: 49 54 59 2c 20 57 48 45 54 48 45 52 20 49 4e 20  ITY, WHETHER IN 
04b0: 0a 20 2a 20 43 4f 4e 54 52 41 43 54 2c 20 53 54  . * CONTRACT, ST
04c0: 52 49 43 54 20 4c 49 41 42 49 4c 49 54 59 2c 20  RICT LIABILITY, 
04d0: 4f 52 20 54 4f 52 54 20 28 49 4e 43 4c 55 44 49  OR TORT (INCLUDI
04e0: 4e 47 20 4e 45 47 4c 49 47 45 4e 43 45 20 4f 52  NG NEGLIGENCE OR
04f0: 20 4f 54 48 45 52 57 49 53 45 29 20 0a 20 2a 20   OTHERWISE) . * 
0500: 41 52 49 53 49 4e 47 20 49 4e 20 41 4e 59 20 57  ARISING IN ANY W
0510: 41 59 20 4f 55 54 20 4f 46 20 54 48 45 20 55 53  AY OUT OF THE US
0520: 45 20 4f 46 20 54 48 49 53 20 53 4f 46 54 57 41  E OF THIS SOFTWA
0530: 52 45 2c 20 45 56 45 4e 20 49 46 20 41 44 56 49  RE, EVEN IF ADVI
0540: 53 45 44 20 4f 46 20 54 48 45 20 0a 20 2a 20 50  SED OF THE . * P
0550: 4f 53 53 49 42 49 4c 49 54 59 20 4f 46 20 53 55  OSSIBILITY OF SU
0560: 43 48 20 44 41 4d 41 47 45 2e 0a 20 2a 2f 0a 23  CH DAMAGE.. */.#
0570: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 65 6e  include <sys/sen
0580: 64 66 69 6c 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  dfile.h>.#includ
0590: 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e  e <sys/socket.h>
05a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
05b0: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
05c0: 20 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23   <arpa/inet.h>.#
05d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61  include <sys/mma
05e0: 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  n.h>.#include <s
05f0: 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c  ys/stat.h>.#incl
0600: 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e  ude <sys/wait.h>
0610: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  .#include <pthre
0620: 61 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ad.h>.#include <
0630: 73 74 72 69 6e 67 73 2e 68 3e 0a 23 69 6e 63 6c  strings.h>.#incl
0640: 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23  ude <signal.h>.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0660: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0670: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0680: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0690: 75 64 65 20 3c 67 65 74 6f 70 74 2e 68 3e 0a 23  ude <getopt.h>.#
06a0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
06b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e  h>.#include <fcn
06c0: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
06d0: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  stdio.h>.#includ
06e0: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63  e <errno.h>.#inc
06f0: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69  lude <time.h>.#i
0700: 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 0a  nclude <pwd.h>..
0710: 2f 2a 0a 20 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*. * Determine 
0720: 69 66 20 74 68 65 20 43 20 63 6f 6d 70 69 6c 65  if the C compile
0730: 72 20 73 75 70 70 6f 72 74 73 20 43 31 31 20 61  r supports C11 a
0740: 74 6f 6d 69 63 73 0a 20 2a 2f 0a 23 69 66 20 5f  tomics. */.#if _
0750: 5f 53 54 44 43 5f 56 45 52 53 49 4f 4e 5f 5f 20  _STDC_VERSION__ 
0760: 3e 3d 20 32 30 31 31 31 32 4c 0a 23 20 20 69 66  >= 201112L.#  if
0770: 6e 64 65 66 20 5f 5f 53 54 44 43 5f 4e 4f 5f 41  ndef __STDC_NO_A
0780: 54 4f 4d 49 43 53 5f 5f 0a 23 20 20 20 20 64 65  TOMICS__.#    de
0790: 66 69 6e 65 20 46 49 4c 45 44 5f 46 45 41 54 55  fine FILED_FEATU
07a0: 52 45 5f 43 31 31 5f 41 54 4f 4d 49 43 53 20 31  RE_C11_ATOMICS 1
07b0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
07c0: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 65 20 43  ../*. * If the C
07d0: 20 63 6f 6d 70 69 6c 65 72 20 64 6f 65 73 20 6e   compiler does n
07e0: 6f 74 20 73 75 70 70 6f 72 74 20 43 31 31 20 61  ot support C11 a
07f0: 74 6f 6d 69 63 73 2c 20 64 69 73 61 62 6c 65 20  tomics, disable 
0800: 54 49 4d 45 4f 55 54 20 73 75 70 70 6f 72 74 0a  TIMEOUT support.
0810: 20 2a 20 73 69 6e 63 65 20 69 74 20 72 65 6c 69   * since it reli
0820: 65 73 20 75 70 6f 6e 20 69 74 0a 20 2a 2f 0a 23  es upon it. */.#
0830: 69 66 6e 64 65 66 20 46 49 4c 45 44 5f 46 45 41  ifndef FILED_FEA
0840: 54 55 52 45 5f 43 31 31 5f 41 54 4f 4d 49 43 53  TURE_C11_ATOMICS
0850: 0a 23 20 20 64 65 66 69 6e 65 20 46 49 4c 45 44  .#  define FILED
0860: 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 20 31 0a  _DONT_TIMEOUT 1.
0870: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
0880: 65 73 65 20 68 65 61 64 65 72 73 20 61 72 65 20  ese headers are 
0890: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 66 6f  only required fo
08a0: 72 20 54 49 4d 45 4f 55 54 20 73 75 70 70 6f 72  r TIMEOUT suppor
08b0: 74 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 46 49  t. */.#ifndef FI
08c0: 4c 45 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54  LED_DONT_TIMEOUT
08d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 74  .#include <stdat
08e0: 6f 6d 69 63 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  omic.h>.#include
08f0: 20 3c 73 74 64 62 6f 6f 6c 2e 68 3e 0a 23 65 6e   <stdbool.h>.#en
0900: 64 69 66 0a 0a 2f 2a 20 43 6f 6d 70 69 6c 65 20  dif../* Compile 
0910: 74 69 6d 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a  time constants *
0920: 2f 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f  /.#define FILED_
0930: 56 45 52 53 49 4f 4e 20 22 31 2e 31 37 22 0a 23  VERSION "1.17".#
0940: 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 53 45 4e  define FILED_SEN
0950: 44 46 49 4c 45 5f 4d 41 58 20 31 36 37 37 37 32  DFILE_MAX 167772
0960: 31 35 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44  15.#define FILED
0970: 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43 4f 55  _MAX_FAILURE_COU
0980: 4e 54 20 33 30 0a 23 64 65 66 69 6e 65 20 46 49  NT 30.#define FI
0990: 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45  LED_DEFAULT_TYPE
09a0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63   "application/oc
09b0: 74 65 74 2d 73 74 72 65 61 6d 22 0a 23 64 65 66  tet-stream".#def
09c0: 69 6e 65 20 46 49 4c 45 44 5f 50 41 54 48 5f 42  ine FILED_PATH_B
09d0: 55 46 46 45 52 5f 53 49 5a 45 20 31 30 31 30 0a  UFFER_SIZE 1010.
09e0: 0a 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  ./* Default valu
09f0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f  es */.#define PO
0a00: 52 54 20 38 30 0a 23 64 65 66 69 6e 65 20 54 48  RT 80.#define TH
0a10: 52 45 41 44 5f 43 4f 55 4e 54 20 35 0a 23 64 65  READ_COUNT 5.#de
0a20: 66 69 6e 65 20 42 49 4e 44 5f 41 44 44 52 20 22  fine BIND_ADDR "
0a30: 3a 3a 22 0a 23 64 65 66 69 6e 65 20 43 41 43 48  ::".#define CACH
0a40: 45 5f 53 49 5a 45 20 38 32 30 39 0a 23 64 65 66  E_SIZE 8209.#def
0a50: 69 6e 65 20 4c 4f 47 5f 46 49 4c 45 20 22 2d 22  ine LOG_FILE "-"
0a60: 0a 0a 2f 2a 20 46 75 7a 7a 69 6e 67 20 54 65 73  ../* Fuzzing Tes
0a70: 74 20 43 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66  t Code */.#ifdef
0a80: 20 46 49 4c 45 44 5f 54 45 53 54 5f 41 46 4c 0a   FILED_TEST_AFL.
0a90: 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44 4f  #define FILED_DO
0aa0: 4e 54 5f 4c 4f 47 20 31 0a 23 64 65 66 69 6e 65  NT_LOG 1.#define
0ab0: 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 54 49 4d 45   FILED_DONT_TIME
0ac0: 4f 55 54 20 31 0a 23 64 65 66 69 6e 65 20 70 74  OUT 1.#define pt
0ad0: 68 72 65 61 64 5f 63 72 65 61 74 65 28 61 2c 20  hread_create(a, 
0ae0: 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f 70 74 68  x, y, z) afl_pth
0af0: 72 65 61 64 5f 63 72 65 61 74 65 28 61 2c 20 78  read_create(a, x
0b00: 2c 20 79 2c 20 7a 29 0a 23 64 65 66 69 6e 65 20  , y, z).#define 
0b10: 62 69 6e 64 28 78 2c 20 79 2c 20 7a 29 20 61 66  bind(x, y, z) af
0b20: 6c 5f 62 69 6e 64 28 78 2c 20 79 2c 20 7a 29 0a  l_bind(x, y, z).
0b30: 23 64 65 66 69 6e 65 20 73 6f 63 6b 65 74 28 78  #define socket(x
0b40: 2c 20 79 2c 20 7a 29 20 38 31 39 33 0a 23 64 65  , y, z) 8193.#de
0b50: 66 69 6e 65 20 6c 69 73 74 65 6e 28 78 2c 20 79  fine listen(x, y
0b60: 29 20 30 0a 23 64 65 66 69 6e 65 20 61 63 63 65  ) 0.#define acce
0b70: 70 74 28 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f  pt(x, y, z) afl_
0b80: 61 63 63 65 70 74 28 78 2c 20 79 2c 20 7a 29 0a  accept(x, y, z).
0b90: 23 64 65 66 69 6e 65 20 63 6c 6f 73 65 28 78 29  #define close(x)
0ba0: 20 7b 20 69 66 20 28 73 74 72 63 6d 70 28 23 78   { if (strcmp(#x
0bb0: 2c 20 22 72 61 6e 64 6f 6d 5f 66 64 22 29 20 3d  , "random_fd") =
0bc0: 3d 20 30 29 20 7b 20 63 6c 6f 73 65 28 78 29 3b  = 0) { close(x);
0bd0: 20 7d 20 65 6c 73 65 20 7b 20 65 78 69 74 28 30   } else { exit(0
0be0: 29 3b 20 7d 20 7d 0a 23 64 65 66 69 6e 65 20 66  ); } }.#define f
0bf0: 63 6c 6f 73 65 28 78 29 20 65 78 69 74 28 30 29  close(x) exit(0)
0c00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 6c  ..static int afl
0c10: 5f 61 63 63 65 70 74 28 69 6e 74 20 78 2c 20 76  _accept(int x, v
0c20: 6f 69 64 20 2a 61 64 64 72 2c 20 76 6f 69 64 20  oid *addr, void 
0c30: 2a 7a 29 20 7b 0a 09 28 28 73 74 72 75 63 74 20  *z) {..((struct 
0c40: 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29 20  sockaddr_in6 *) 
0c50: 61 64 64 72 29 2d 3e 73 69 6e 36 5f 66 61 6d 69  addr)->sin6_fami
0c60: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 20 2b 20 41  ly = AF_INET + A
0c70: 46 5f 49 4e 45 54 36 20 2b 20 31 3b 0a 09 72 65  F_INET6 + 1;..re
0c80: 74 75 72 6e 28 53 54 44 49 4e 5f 46 49 4c 45 4e  turn(STDIN_FILEN
0c90: 4f 29 3b 0a 09 78 20 3d 20 78 3b 0a 09 7a 20 3d  O);..x = x;..z =
0ca0: 20 7a 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   z;.}..static in
0cb0: 74 20 61 66 6c 5f 62 69 6e 64 28 69 6e 74 20 78  t afl_bind(int x
0cc0: 2c 20 76 6f 69 64 20 2a 79 2c 20 73 6f 63 6b 6c  , void *y, sockl
0cd0: 65 6e 5f 74 20 7a 29 20 7b 0a 09 72 65 74 75 72  en_t z) {..retur
0ce0: 6e 28 38 31 39 34 29 3b 0a 09 78 20 3d 20 78 3b  n(8194);..x = x;
0cf0: 0a 09 79 20 3d 20 79 3b 0a 09 7a 20 3d 20 7a 3b  ..y = y;..z = z;
0d00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
0d10: 66 6c 5f 70 74 68 72 65 61 64 5f 63 72 65 61 74  fl_pthread_creat
0d20: 65 28 70 74 68 72 65 61 64 5f 74 20 2a 74 68 72  e(pthread_t *thr
0d30: 65 61 64 2c 20 63 6f 6e 73 74 20 70 74 68 72 65  ead, const pthre
0d40: 61 64 5f 61 74 74 72 5f 74 20 2a 61 74 74 72 2c  ad_attr_t *attr,
0d50: 20 76 6f 69 64 20 2a 28 2a 73 74 61 72 74 5f 72   void *(*start_r
0d60: 6f 75 74 69 6e 65 29 20 28 76 6f 69 64 20 2a 29  outine) (void *)
0d70: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 09  , void *arg) {..
0d80: 73 74 61 72 74 5f 72 6f 75 74 69 6e 65 28 61 72  start_routine(ar
0d90: 67 29 3b 0a 09 65 78 69 74 28 33 29 3b 0a 09 74  g);..exit(3);..t
0da0: 68 72 65 61 64 20 3d 20 74 68 72 65 61 64 3b 0a  hread = thread;.
0db0: 09 61 74 74 72 20 3d 20 61 74 74 72 3b 0a 7d 0a  .attr = attr;.}.
0dc0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 43 6f 6e 66 69  #endif../* Confi
0dd0: 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
0de0: 20 74 68 61 74 20 77 6f 72 6b 20 74 68 72 65 61   that work threa
0df0: 64 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 77  ds need to be aw
0e00: 61 72 65 20 6f 66 20 2a 2f 0a 73 74 72 75 63 74  are of */.struct
0e10: 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 7b   filed_options {
0e20: 0a 09 69 6e 74 20 76 68 6f 73 74 73 5f 65 6e 61  ..int vhosts_ena
0e30: 62 6c 65 64 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67  bled;.};../* Arg
0e40: 75 6d 65 6e 74 73 20 66 6f 72 20 77 6f 72 6b 65  uments for worke
0e50: 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72  r threads */.str
0e60: 75 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  uct filed_worker
0e70: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 7b 0a 09  _thread_args {..
0e80: 69 6e 74 20 66 64 3b 0a 09 73 74 72 75 63 74 20  int fd;..struct 
0e90: 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 6f 70  filed_options op
0ea0: 74 69 6f 6e 73 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72  tions;.};../* Ar
0eb0: 67 75 6d 65 6e 74 73 20 66 6f 72 20 6c 6f 67 67  guments for logg
0ec0: 69 6e 67 20 74 68 72 65 61 64 73 20 2a 2f 0a 73  ing threads */.s
0ed0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67  truct filed_logg
0ee0: 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ing_thread_args 
0ef0: 7b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 7d 3b 0a  {..FILE *fp;.};.
0f00: 0a 2f 2a 20 46 69 6c 65 20 69 6e 66 6f 72 6d 61  ./* File informa
0f10: 74 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 66  tion */.struct f
0f20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 7b 0a  iled_fileinfo {.
0f30: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
0f40: 20 6d 75 74 65 78 3b 0a 09 63 68 61 72 20 70 61   mutex;..char pa
0f50: 74 68 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55  th[FILED_PATH_BU
0f60: 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 69 6e 74  FFER_SIZE];..int
0f70: 20 66 64 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e 3b   fd;..off_t len;
0f80: 0a 09 63 68 61 72 20 2a 6c 61 73 74 6d 6f 64 3b  ..char *lastmod;
0f90: 0a 09 63 68 61 72 20 6c 61 73 74 6d 6f 64 5f 62  ..char lastmod_b
0fa0: 5b 36 34 5d 3b 0a 09 63 6f 6e 73 74 20 63 68 61  [64];..const cha
0fb0: 72 20 2a 74 79 70 65 3b 0a 09 63 68 61 72 20 65  r *type;..char e
0fc0: 74 61 67 5b 36 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 20  tag[64];.};../* 
0fd0: 52 65 71 75 65 73 74 20 76 61 72 69 61 62 6c 65  Request variable
0fe0: 73 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65  s */.struct file
0ff0: 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 7b  d_http_request {
1000: 0a 09 2f 2a 2a 20 42 75 66 66 65 72 73 20 2a 2a  ../** Buffers **
1010: 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  /..struct filed_
1020: 66 69 6c 65 69 6e 66 6f 20 66 69 6c 65 69 6e 66  fileinfo fileinf
1030: 6f 3b 0a 09 63 68 61 72 20 74 6d 70 62 75 66 5b  o;..char tmpbuf[
1040: 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45  FILED_PATH_BUFFE
1050: 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 2a 20 48  R_SIZE];.../** H
1060: 54 54 50 20 52 65 71 75 65 73 74 20 69 6e 66 6f  TTP Request info
1070: 72 6d 61 74 69 6f 6e 20 2a 2a 2f 0a 09 2f 2a 2a  rmation **/../**
1080: 2a 20 54 79 70 65 20 6f 66 20 72 65 71 75 65 73  * Type of reques
1090: 74 20 28 48 45 41 44 20 6f 72 20 47 45 54 29 20  t (HEAD or GET) 
10a0: 2a 2a 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46  ***/..enum {...F
10b0: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54  ILED_REQUEST_MET
10c0: 48 4f 44 5f 47 45 54 2c 0a 09 09 46 49 4c 45 44  HOD_GET,...FILED
10d0: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
10e0: 48 45 41 44 0a 09 7d 20 6d 65 74 68 6f 64 3b 0a  HEAD..} method;.
10f0: 0a 09 2f 2a 2a 2a 20 50 61 74 68 20 62 65 69 6e  ../*** Path bein
1100: 67 20 72 65 71 75 65 73 74 65 64 20 2a 2a 2a 2f  g requested ***/
1110: 0a 09 63 68 61 72 20 70 61 74 68 5b 46 49 4c 45  ..char path[FILE
1120: 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49  D_PATH_BUFFER_SI
1130: 5a 45 5d 3b 20 0a 0a 09 2f 2a 2a 2a 20 50 61 74  ZE]; .../*** Pat
1140: 68 20 74 79 70 65 20 2a 2a 2a 2f 0a 09 65 6e 75  h type ***/..enu
1150: 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 52 45 51 55  m {...FILED_REQU
1160: 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f  EST_TYPE_DIRECTO
1170: 52 59 2c 0a 09 09 46 49 4c 45 44 5f 52 45 51 55  RY,...FILED_REQU
1180: 45 53 54 5f 54 59 50 45 5f 4f 54 48 45 52 0a 09  EST_TYPE_OTHER..
1190: 7d 20 74 79 70 65 3b 0a 0a 09 73 74 72 75 63 74  } type;...struct
11a0: 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09   {...struct {...
11b0: 09 69 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09  .int present;...
11c0: 09 6f 66 66 5f 74 20 6f 66 66 73 65 74 3b 20 20  .off_t offset;  
11d0: 20 2f 2a 2a 2a 20 52 61 6e 67 65 20 73 74 61 72   /*** Range star
11e0: 74 20 2a 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20  t ***/....off_t 
11f0: 6c 65 6e 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52  length;   /*** R
1200: 61 6e 67 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f  ange length ***/
1210: 0a 09 09 7d 20 72 61 6e 67 65 3b 0a 0a 09 09 73  ...} range;....s
1220: 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 70  truct {....int p
1230: 72 65 73 65 6e 74 3b 0a 09 09 09 63 68 61 72 20  resent;....char 
1240: 68 6f 73 74 5b 46 49 4c 45 44 5f 50 41 54 48 5f  host[FILED_PATH_
1250: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 09  BUFFER_SIZE];...
1260: 7d 20 68 6f 73 74 3b 0a 0a 09 09 65 6e 75 6d 20  } host;....enum 
1270: 7b 0a 09 09 09 46 49 4c 45 44 5f 43 4f 4e 4e 45  {....FILED_CONNE
1280: 43 54 49 4f 4e 5f 43 4c 4f 53 45 2c 0a 09 09 09  CTION_CLOSE,....
1290: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
12a0: 5f 4b 45 45 50 5f 41 4c 49 56 45 0a 09 09 7d 20  _KEEP_ALIVE...} 
12b0: 63 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 09 7d 20 68  connection;..} h
12c0: 65 61 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c  eaders;.};../* L
12d0: 6f 67 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72  og record */.str
12e0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
12f0: 74 72 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20 6f  try {../* Type o
1300: 66 20 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a 09  f log entry */..
1310: 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 4c  enum {...FILED_L
1320: 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 2c  OG_TYPE_MESSAGE,
1330: 0a 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50  ...FILED_LOG_TYP
1340: 45 5f 54 52 41 4e 53 46 45 52 0a 09 7d 20 74 79  E_TRANSFER..} ty
1350: 70 65 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64 20  pe;.../* Linked 
1360: 6c 69 73 74 20 68 65 61 64 2f 74 61 69 6c 20 2a  list head/tail *
1370: 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  /..struct filed_
1380: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78 74  log_entry *_next
1390: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
13a0: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65 76  log_entry *_prev
13b0: 3b 0a 0a 09 2f 2a 20 54 68 72 65 61 64 20 66 72  ;.../* Thread fr
13c0: 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 6c 6f  om which this lo
13d0: 67 20 65 6e 74 72 79 20 65 6d 69 6e 61 74 65 73  g entry eminates
13e0: 20 2a 2f 0a 09 70 74 68 72 65 61 64 5f 74 20 74   */..pthread_t t
13f0: 68 72 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73 73  hread;.../* Mess
1400: 61 67 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  age buffer for t
1410: 79 70 65 20 3d 20 4d 45 53 53 41 47 45 20 2a 2f  ype = MESSAGE */
1420: 0a 09 2f 2a 20 50 61 74 68 20 62 75 66 66 65 72  ../* Path buffer
1430: 20 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e   for type = TRAN
1440: 53 46 45 52 20 2a 2f 0a 09 63 68 61 72 20 62 75  SFER */..char bu
1450: 66 66 65 72 5b 46 49 4c 45 44 5f 50 41 54 48 5f  ffer[FILED_PATH_
1460: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09  BUFFER_SIZE];...
1470: 2f 2a 20 49 74 65 6d 73 20 66 6f 72 20 74 79 70  /* Items for typ
1480: 65 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a  e = TRANSFER */.
1490: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
14a0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61  .const char *rea
14b0: 73 6f 6e 3b 0a 09 74 69 6d 65 5f 74 20 73 74 61  son;..time_t sta
14c0: 72 74 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74 20  rttime;..time_t 
14d0: 65 6e 64 74 69 6d 65 3b 0a 09 6f 66 66 5f 74 20  endtime;..off_t 
14e0: 72 65 71 5f 6f 66 66 73 65 74 3b 0a 09 6f 66 66  req_offset;..off
14f0: 5f 74 20 72 65 71 5f 6c 65 6e 67 74 68 3b 0a 09  _t req_length;..
1500: 6f 66 66 5f 74 20 73 65 6e 74 5f 6c 65 6e 67 74  off_t sent_lengt
1510: 68 3b 0a 09 6f 66 66 5f 74 20 66 69 6c 65 5f 6c  h;..off_t file_l
1520: 65 6e 67 74 68 3b 0a 09 63 68 61 72 20 69 70 5b  ength;..char ip[
1530: 31 32 38 5d 3b 0a 09 69 6e 74 20 70 6f 72 74 3b  128];..int port;
1540: 0a 09 69 6e 74 20 6d 65 74 68 6f 64 3b 0a 7d 3b  ..int method;.};
1550: 0a 0a 2f 2a 20 47 6c 6f 62 61 6c 20 76 61 72 69  ../* Global vari
1560: 61 62 6c 65 73 20 2a 2f 0a 2f 2a 2a 20 4f 70 65  ables */./** Ope
1570: 6e 20 46 69 6c 65 20 63 61 63 68 65 20 2a 2a 2f  n File cache **/
1580: 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69  .struct filed_fi
1590: 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 66 69  leinfo *filed_fi
15a0: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d  leinfo_fdcache =
15b0: 20 4e 55 4c 4c 3b 0a 75 6e 73 69 67 6e 65 64 20   NULL;.unsigned 
15c0: 69 6e 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  int filed_filein
15d0: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20  fo_fdcache_size 
15e0: 3d 20 30 3b 0a 0a 2f 2a 2a 20 4c 6f 67 67 69 6e  = 0;../** Loggin
15f0: 67 20 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  g **/.struct fil
1600: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66 69  ed_log_entry *fi
1610: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
1620: 3b 0a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ;.pthread_mutex_
1630: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  t filed_log_msg_
1640: 6c 69 73 74 5f 6d 75 74 65 78 3b 0a 70 74 68 72  list_mutex;.pthr
1650: 65 61 64 5f 63 6f 6e 64 5f 74 20 66 69 6c 65 64  ead_cond_t filed
1660: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65  _log_msg_list_re
1670: 61 64 79 3b 0a 0a 2f 2a 20 53 69 67 6e 61 6c 20  ady;../* Signal 
1680: 48 61 6e 64 6c 65 72 20 2a 2f 0a 73 74 61 74 69  Handler */.stati
1690: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 69 67  c void filed_sig
16a0: 6e 61 6c 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  nal_handler(int 
16b0: 73 69 67 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b  signal_number) {
16c0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66  ..struct filed_f
16d0: 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b 0a  ileinfo *cache;.
16e0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64  .unsigned int id
16f0: 78 3b 0a 0a 09 73 77 69 74 63 68 20 28 73 69 67  x;...switch (sig
1700: 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 09  nal_number) {...
1710: 63 61 73 65 20 53 49 47 48 55 50 3a 0a 09 09 09  case SIGHUP:....
1720: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1730: 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  x < filed_filein
1740: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 3b  fo_fdcache_size;
1750: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 61   idx++) {.....ca
1760: 63 68 65 20 3d 20 26 66 69 6c 65 64 5f 66 69 6c  che = &filed_fil
1770: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64  einfo_fdcache[id
1780: 78 5d 3b 0a 0a 09 09 09 09 70 74 68 72 65 61 64  x];......pthread
1790: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63  _mutex_lock(&cac
17a0: 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 09  he->mutex);.....
17b0: 09 63 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20  .cache->path[0] 
17c0: 3d 20 27 5c 30 27 3b 0a 09 09 09 09 69 66 20 28  = '\0';.....if (
17d0: 63 61 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20  cache->fd >= 0) 
17e0: 7b 0a 09 09 09 09 09 63 6c 6f 73 65 28 63 61 63  {......close(cac
17f0: 68 65 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 09 63  he->fd);.......c
1800: 61 63 68 65 2d 3e 66 64 20 3d 20 2d 31 3b 0a 09  ache->fd = -1;..
1810: 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 68 65 2d  ...}......cache-
1820: 3e 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09  >lastmod = "";..
1830: 09 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d  ...cache->type =
1840: 20 22 22 3b 0a 0a 09 09 09 09 70 74 68 72 65 61   "";......pthrea
1850: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
1860: 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 09  cache->mutex);..
1870: 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  ..}....break;..}
1880: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
1890: 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68   Initialize cach
18a0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
18b0: 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65  filed_init_cache
18c0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  (unsigned int ca
18d0: 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e 73  che_size) {..uns
18e0: 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 09  igned int idx;..
18f0: 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
1900: 65 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20 6d  et;.../* Cache m
1910: 61 79 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e 69  ay not be re-ini
1920: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66 20  tialized */..if 
1930: 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  (filed_fileinfo_
1940: 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20  fdcache_size != 
1950: 30 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65 69  0 || filed_filei
1960: 6e 66 6f 5f 66 64 63 61 63 68 65 20 21 3d 20 4e  nfo_fdcache != N
1970: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1980: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 61 63 68  1);..}.../* Cach
1990: 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
19a0: 74 6f 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  to be allocated 
19b0: 69 66 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  if cache is not 
19c0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 09 69 66 20 28  enabled */..if (
19d0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 3d 20 30 29  cache_size == 0)
19e0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
19f0: 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f 63 61 74 65  .}.../* Allocate
1a00: 20 63 61 63 68 65 20 2a 2f 0a 09 66 69 6c 65 64   cache */..filed
1a10: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
1a20: 65 5f 73 69 7a 65 20 3d 20 63 61 63 68 65 5f 73  e_size = cache_s
1a30: 69 7a 65 3b 0a 09 66 69 6c 65 64 5f 66 69 6c 65  ize;..filed_file
1a40: 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d 20 6d  info_fdcache = m
1a50: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 66 69  alloc(sizeof(*fi
1a60: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1a70: 61 63 68 65 29 20 2a 20 66 69 6c 65 64 5f 66 69  ache) * filed_fi
1a80: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73  leinfo_fdcache_s
1a90: 69 7a 65 29 3b 0a 09 69 66 20 28 66 69 6c 65 64  ize);..if (filed
1aa0: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
1ab0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
1ac0: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f  eturn(1);..}.../
1ad0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63  * Initialize cac
1ae0: 68 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a 09 66  he entries */..f
1af0: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1b00: 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66   < filed_fileinf
1b10: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 3b 20  o_fdcache_size; 
1b20: 69 64 78 2b 2b 29 20 7b 0a 09 09 6d 75 74 65 78  idx++) {...mutex
1b30: 5f 69 6e 69 74 5f 72 65 74 20 3d 20 70 74 68 72  _init_ret = pthr
1b40: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
1b50: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
1b60: 64 63 61 63 68 65 5b 69 64 78 5d 2e 6d 75 74 65  dcache[idx].mute
1b70: 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28  x, NULL);...if (
1b80: 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21  mutex_init_ret !
1b90: 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  = 0) {....return
1ba0: 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 66 69 6c 65  (1);...}....file
1bb0: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
1bc0: 68 65 5b 69 64 78 5d 2e 70 61 74 68 5b 30 5d 20  he[idx].path[0] 
1bd0: 3d 20 27 5c 30 27 3b 0a 09 09 66 69 6c 65 64 5f  = '\0';...filed_
1be0: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
1bf0: 5b 69 64 78 5d 2e 66 64 20 3d 20 2d 31 3b 0a 09  [idx].fd = -1;..
1c00: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
1c10: 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 6c 61 73  fdcache[idx].las
1c20: 74 6d 6f 64 20 3d 20 22 22 3b 0a 09 09 66 69 6c  tmod = "";...fil
1c30: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
1c40: 63 68 65 5b 69 64 78 5d 2e 74 79 70 65 20 3d 20  che[idx].type = 
1c50: 22 22 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  "";..}...return(
1c60: 30 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  0);.}../* Initia
1c70: 6c 69 7a 65 20 70 72 6f 63 65 73 73 20 2a 2f 0a  lize process */.
1c80: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
1c90: 5f 69 6e 69 74 28 75 6e 73 69 67 6e 65 64 20 69  _init(unsigned i
1ca0: 6e 74 20 63 61 63 68 65 5f 73 69 7a 65 29 20 7b  nt cache_size) {
1cb0: 0a 09 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c  ..static int cal
1cc0: 6c 65 64 20 3d 20 30 3b 0a 09 73 73 69 7a 65 5f  led = 0;..ssize_
1cd0: 74 20 72 65 61 64 5f 72 65 74 20 3d 20 30 3b 0a  t read_ret = 0;.
1ce0: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 61  .unsigned int ra
1cf0: 6e 64 6f 6d 5f 76 61 6c 75 65 20 3d 20 30 3b 0a  ndom_value = 0;.
1d00: 09 69 6e 74 20 63 61 63 68 65 5f 72 65 74 3b 0a  .int cache_ret;.
1d10: 09 69 6e 74 20 72 61 6e 64 6f 6d 5f 66 64 3b 0a  .int random_fd;.
1d20: 0a 09 69 66 20 28 63 61 6c 6c 65 64 29 20 7b 0a  ..if (called) {.
1d30: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
1d40: 0a 09 63 61 6c 6c 65 64 20 3d 20 31 3b 0a 0a 09  ..called = 1;...
1d50: 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 6f  /* Attempt to lo
1d60: 63 6b 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 74 6f  ck all memory to
1d70: 20 70 68 79 73 69 63 61 6c 20 52 41 4d 20 28 62   physical RAM (b
1d80: 75 74 20 64 6f 6e 27 74 20 63 61 72 65 20 69 66  ut don't care if
1d90: 20 77 65 20 63 61 6e 27 74 29 20 2a 2f 0a 09 6d   we can't) */..m
1da0: 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f 43 55 52 52  lockall(MCL_CURR
1db0: 45 4e 54 20 7c 20 4d 43 4c 5f 46 55 54 55 52 45  ENT | MCL_FUTURE
1dc0: 29 3b 0a 0a 09 2f 2a 20 49 67 6e 6f 72 65 20 53  );.../* Ignore S
1dd0: 49 47 50 49 50 45 20 2a 2f 0a 09 73 69 67 6e 61  IGPIPE */..signa
1de0: 6c 28 53 49 47 50 49 50 45 2c 20 53 49 47 5f 49  l(SIGPIPE, SIG_I
1df0: 47 4e 29 3b 0a 0a 09 2f 2a 20 48 61 6e 64 6c 65  GN);.../* Handle
1e00: 20 53 49 47 48 55 50 20 74 6f 20 72 65 6c 65 61   SIGHUP to relea
1e10: 73 65 20 61 6c 6c 20 63 61 63 68 65 73 20 2a 2f  se all caches */
1e20: 0a 09 73 69 67 6e 61 6c 28 53 49 47 48 55 50 2c  ..signal(SIGHUP,
1e30: 20 66 69 6c 65 64 5f 73 69 67 6e 61 6c 5f 68 61   filed_signal_ha
1e40: 6e 64 6c 65 72 29 3b 0a 0a 09 2f 2a 20 49 6e 69  ndler);.../* Ini
1e50: 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20 73 74  tialize cache st
1e60: 72 75 63 74 75 72 65 20 2a 2f 0a 09 63 61 63 68  ructure */..cach
1e70: 65 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 69 6e  e_ret = filed_in
1e80: 69 74 5f 63 61 63 68 65 28 63 61 63 68 65 5f 73  it_cache(cache_s
1e90: 69 7a 65 29 3b 0a 09 69 66 20 28 63 61 63 68 65  ize);..if (cache
1ea0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72  _ret != 0) {...r
1eb0: 65 74 75 72 6e 28 63 61 63 68 65 5f 72 65 74 29  eturn(cache_ret)
1ec0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61  ;..}.../* Initia
1ed0: 6c 69 7a 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  lize random numb
1ee0: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a  er generator */.
1ef0: 09 72 61 6e 64 6f 6d 5f 66 64 20 3d 20 6f 70 65  .random_fd = ope
1f00: 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
1f10: 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 69 66  , O_RDONLY);..if
1f20: 20 28 72 61 6e 64 6f 6d 5f 66 64 20 3e 3d 20 30   (random_fd >= 0
1f30: 29 20 7b 0a 09 09 72 65 61 64 5f 72 65 74 20 3d  ) {...read_ret =
1f40: 20 72 65 61 64 28 72 61 6e 64 6f 6d 5f 66 64 2c   read(random_fd,
1f50: 20 26 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 2c 20   &random_value, 
1f60: 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 5f 76 61  sizeof(random_va
1f70: 6c 75 65 29 29 3b 0a 0a 09 09 63 6c 6f 73 65 28  lue));....close(
1f80: 72 61 6e 64 6f 6d 5f 66 64 29 3b 0a 09 7d 0a 0a  random_fd);..}..
1f90: 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d  .random_value ^=
1fa0: 20 67 65 74 70 69 64 28 29 3b 0a 09 72 61 6e 64   getpid();..rand
1fb0: 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 67 65 74 75  om_value ^= getu
1fc0: 69 64 28 29 3b 0a 09 72 61 6e 64 6f 6d 5f 76 61  id();..random_va
1fd0: 6c 75 65 20 5e 3d 20 74 69 6d 65 28 4e 55 4c 4c  lue ^= time(NULL
1fe0: 29 3b 0a 0a 09 73 72 61 6e 64 6f 6d 28 72 61 6e  );...srandom(ran
1ff0: 64 6f 6d 5f 76 61 6c 75 65 29 3b 0a 0a 09 72 65  dom_value);...re
2000: 74 75 72 6e 28 30 29 3b 0a 0a 09 2f 2a 20 4e 4f  turn(0);.../* NO
2010: 54 52 45 41 43 48 3a 20 52 65 61 64 20 6d 61 79  TREACH: Read may
2020: 20 66 61 69 6c 20 6f 72 20 73 75 63 63 65 65 64   fail or succeed
2030: 2c 20 77 65 20 64 6f 6e 27 74 20 61 63 74 75 61  , we don't actua
2040: 6c 6c 79 20 63 61 72 65 20 2a 2f 0a 09 72 65 61  lly care */..rea
2050: 64 5f 72 65 74 20 3d 20 72 65 61 64 5f 72 65 74  d_ret = read_ret
2060: 3b 0a 7d 0a 0a 2f 2a 20 4c 69 73 74 65 6e 20 6f  ;.}../* Listen o
2070: 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 61  n a particular a
2080: 64 64 72 65 73 73 2f 70 6f 72 74 20 2a 2f 0a 73  ddress/port */.s
2090: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
20a0: 6c 69 73 74 65 6e 28 63 6f 6e 73 74 20 63 68 61  listen(const cha
20b0: 72 20 2a 61 64 64 72 65 73 73 2c 20 75 6e 73 69  r *address, unsi
20c0: 67 6e 65 64 20 69 6e 74 20 70 6f 72 74 29 20 7b  gned int port) {
20d0: 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ..struct sockadd
20e0: 72 5f 69 6e 36 20 61 64 64 72 5f 76 36 3b 0a 09  r_in6 addr_v6;..
20f0: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
2100: 69 6e 20 61 64 64 72 5f 76 34 3b 0a 09 73 74 72  in addr_v4;..str
2110: 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64  uct sockaddr *ad
2120: 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 61  dr;..socklen_t a
2130: 64 64 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 70 74  ddr_len;..int pt
2140: 6f 6e 5f 72 65 74 2c 20 62 69 6e 64 5f 72 65 74  on_ret, bind_ret
2150: 2c 20 6c 69 73 74 65 6e 5f 72 65 74 3b 0a 09 69  , listen_ret;..i
2160: 6e 74 20 66 61 6d 69 6c 79 3b 0a 09 69 6e 74 20  nt family;..int 
2170: 66 64 3b 0a 0a 09 66 61 6d 69 6c 79 20 3d 20 41  fd;...family = A
2180: 46 5f 49 4e 45 54 36 3b 0a 09 70 74 6f 6e 5f 72  F_INET6;..pton_r
2190: 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66  et = inet_pton(f
21a0: 61 6d 69 6c 79 2c 20 61 64 64 72 65 73 73 2c 20  amily, address, 
21b0: 26 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 61 64  &addr_v6.sin6_ad
21c0: 64 72 2e 73 36 5f 61 64 64 72 29 3b 0a 09 69 66  dr.s6_addr);..if
21d0: 20 28 70 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29   (pton_ret != 1)
21e0: 20 7b 0a 09 09 66 61 6d 69 6c 79 20 3d 20 41 46   {...family = AF
21f0: 5f 49 4e 45 54 3b 0a 09 09 70 74 6f 6e 5f 72 65  _INET;...pton_re
2200: 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61  t = inet_pton(fa
2210: 6d 69 6c 79 2c 20 61 64 64 72 65 73 73 2c 20 26  mily, address, &
2220: 61 64 64 72 5f 76 34 2e 73 69 6e 5f 61 64 64 72  addr_v4.sin_addr
2230: 2e 73 5f 61 64 64 72 29 3b 0a 09 09 69 66 20 28  .s_addr);...if (
2240: 70 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20 7b  pton_ret != 1) {
2250: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
2260: 09 09 7d 0a 0a 09 09 61 64 64 72 5f 76 34 2e 73  ..}....addr_v4.s
2270: 69 6e 5f 66 61 6d 69 6c 79 20 3d 20 66 61 6d 69  in_family = fami
2280: 6c 79 3b 0a 09 09 61 64 64 72 5f 76 34 2e 73 69  ly;...addr_v4.si
2290: 6e 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70  n_port = htons(p
22a0: 6f 72 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20  ort);....addr = 
22b0: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
22c0: 20 2a 29 20 26 61 64 64 72 5f 76 34 3b 0a 09 09   *) &addr_v4;...
22d0: 61 64 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  addr_len = sizeo
22e0: 66 28 61 64 64 72 5f 76 34 29 3b 0a 09 7d 20 65  f(addr_v4);..} e
22f0: 6c 73 65 20 7b 0a 09 09 61 64 64 72 5f 76 36 2e  lse {...addr_v6.
2300: 73 69 6e 36 5f 66 61 6d 69 6c 79 20 3d 20 41 46  sin6_family = AF
2310: 5f 49 4e 45 54 36 3b 0a 09 09 61 64 64 72 5f 76  _INET6;...addr_v
2320: 36 2e 73 69 6e 36 5f 66 6c 6f 77 69 6e 66 6f 20  6.sin6_flowinfo 
2330: 3d 20 30 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73  = 0;...addr_v6.s
2340: 69 6e 36 5f 73 63 6f 70 65 5f 69 64 20 3d 20 30  in6_scope_id = 0
2350: 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36  ;...addr_v6.sin6
2360: 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f  _port = htons(po
2370: 72 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28  rt);....addr = (
2380: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
2390: 2a 29 20 26 61 64 64 72 5f 76 36 3b 0a 09 09 61  *) &addr_v6;...a
23a0: 64 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ddr_len = sizeof
23b0: 28 61 64 64 72 5f 76 36 29 3b 0a 09 7d 0a 0a 09  (addr_v6);..}...
23c0: 66 64 20 3d 20 73 6f 63 6b 65 74 28 66 61 6d 69  fd = socket(fami
23d0: 6c 79 2c 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c  ly, SOCK_STREAM,
23e0: 20 30 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30   0);..if (fd < 0
23f0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29  ) {...return(fd)
2400: 3b 0a 09 7d 0a 0a 09 62 69 6e 64 5f 72 65 74 20  ;..}...bind_ret 
2410: 3d 20 62 69 6e 64 28 66 64 2c 20 61 64 64 72 2c  = bind(fd, addr,
2420: 20 61 64 64 72 5f 6c 65 6e 29 3b 0a 09 69 66 20   addr_len);..if 
2430: 28 62 69 6e 64 5f 72 65 74 20 3c 20 30 29 20 7b  (bind_ret < 0) {
2440: 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09  ...close(fd);...
2450: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
2460: 0a 09 6c 69 73 74 65 6e 5f 72 65 74 20 3d 20 6c  ..listen_ret = l
2470: 69 73 74 65 6e 28 66 64 2c 20 31 32 38 29 3b 0a  isten(fd, 128);.
2480: 09 69 66 20 28 6c 69 73 74 65 6e 5f 72 65 74 20  .if (listen_ret 
2490: 21 3d 20 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28  != 0) {...close(
24a0: 66 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  fd);....return(-
24b0: 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  1);..}...return(
24c0: 66 64 29 3b 0a 7d 0a 0a 2f 2a 20 4c 6f 67 20 61  fd);.}../* Log a
24d0: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 23 69 66 64   message */.#ifd
24e0: 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f  ef FILED_DONT_LO
24f0: 47 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  G.#  define file
2500: 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64  d_logging_thread
2510: 5f 69 6e 69 74 28 78 29 20 30 0a 23 20 20 64 65  _init(x) 0.#  de
2520: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  fine filed_log_m
2530: 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29  sg_debug(x, ...)
2540: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
2550: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 78 2c  filed_log_msg(x,
2560: 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65   ...) /**/.#  de
2570: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  fine filed_log_e
2580: 6e 74 72 79 28 78 29 20 2f 2a 2a 2f 0a 23 20 20  ntry(x) /**/.#  
2590: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
25a0: 5f 69 70 28 78 2c 20 2e 2e 2e 29 20 4e 55 4c 4c  _ip(x, ...) NULL
25b0: 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64  .#  define filed
25c0: 5f 6c 6f 67 5f 6e 65 77 28 78 29 20 26 6c 6f 63  _log_new(x) &loc
25d0: 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 0a 23 20 20  al_dummy_log.#  
25e0: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
25f0: 5f 66 72 65 65 28 78 29 20 2f 2a 2a 2f 0a 0a 2f  _free(x) /**/../
2600: 2a 20 52 65 74 75 72 6e 20 6c 6f 67 67 69 6e 67  * Return logging
2610: 20 68 61 6e 64 6c 65 20 2a 2f 0a 73 74 61 74 69   handle */.stati
2620: 63 20 46 49 4c 45 20 2a 66 69 6c 65 64 5f 6c 6f  c FILE *filed_lo
2630: 67 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  g_open(const cha
2640: 72 20 2a 66 69 6c 65 29 20 7b 0a 09 72 65 74 75  r *file) {..retu
2650: 72 6e 28 73 74 64 6f 75 74 29 3b 0a 09 66 69 6c  rn(stdout);..fil
2660: 65 20 3d 20 66 69 6c 65 3b 0a 7d 0a 23 65 6c 73  e = file;.}.#els
2670: 65 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  e.#  define file
2680: 64 5f 6c 6f 67 5f 66 72 65 65 28 78 29 20 66 72  d_log_free(x) fr
2690: 65 65 28 78 29 0a 23 20 20 69 66 64 65 66 20 46  ee(x).#  ifdef F
26a0: 49 4c 45 44 5f 44 45 42 55 47 0a 23 20 20 20 20  ILED_DEBUG.#    
26b0: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
26c0: 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e  _msg_debug(x, ..
26d0: 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64  .) { fprintf(std
26e0: 65 72 72 2c 20 78 2c 20 5f 5f 56 41 5f 41 52 47  err, x, __VA_ARG
26f0: 53 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74  S__); fprintf(st
2700: 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c  derr, "\n"); ffl
2710: 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23  ush(stderr); }.#
2720: 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69    else.#    defi
2730: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ne filed_log_msg
2740: 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f  _debug(x, ...) /
2750: 2a 2a 2f 0a 23 20 20 65 6e 64 69 66 0a 0a 2f 2a  **/.#  endif../*
2760: 20 49 6e 69 74 69 61 6c 69 7a 65 20 6c 6f 67 67   Initialize logg
2770: 69 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a 73 74  ing thread */.st
2780: 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64  atic void *filed
2790: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 28  _logging_thread(
27a0: 76 6f 69 64 20 2a 61 72 67 5f 70 29 20 7b 0a 09  void *arg_p) {..
27b0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
27c0: 67 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73  ging_thread_args
27d0: 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66   *arg;..struct f
27e0: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a  iled_log_entry *
27f0: 63 75 72 72 2c 20 2a 70 72 65 76 3b 0a 09 63 6f  curr, *prev;..co
2800: 6e 73 74 20 63 68 61 72 20 2a 6d 65 74 68 6f 64  nst char *method
2810: 3b 0a 09 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 09  ;..time_t now;..
2820: 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 61 72 67 20  FILE *fp;...arg 
2830: 3d 20 61 72 67 5f 70 3b 0a 0a 09 66 70 20 3d 20  = arg_p;...fp = 
2840: 61 72 67 2d 3e 66 70 3b 0a 0a 09 77 68 69 6c 65  arg->fp;...while
2850: 20 28 31 29 20 7b 0a 09 09 70 74 68 72 65 61 64   (1) {...pthread
2860: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c  _mutex_lock(&fil
2870: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
2880: 6d 75 74 65 78 29 3b 0a 09 09 70 74 68 72 65 61  mutex);...pthrea
2890: 64 5f 63 6f 6e 64 5f 77 61 69 74 28 26 66 69 6c  d_cond_wait(&fil
28a0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
28b0: 72 65 61 64 79 2c 20 26 66 69 6c 65 64 5f 6c 6f  ready, &filed_lo
28c0: 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78  g_msg_list_mutex
28d0: 29 3b 0a 0a 09 09 63 75 72 72 20 3d 20 66 69 6c  );....curr = fil
28e0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b  ed_log_msg_list;
28f0: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
2900: 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _list = NULL;...
2910: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  .pthread_mutex_u
2920: 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67  nlock(&filed_log
2930: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
2940: 3b 0a 0a 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28  ;....now = time(
2950: 4e 55 4c 4c 29 3b 0a 0a 09 09 70 72 65 76 20 3d  NULL);....prev =
2960: 20 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20 28 3b 20   NULL;...for (; 
2970: 63 75 72 72 3b 20 63 75 72 72 20 3d 20 63 75 72  curr; curr = cur
2980: 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 63  r->_next) {....c
2990: 75 72 72 2d 3e 5f 70 72 65 76 20 3d 20 70 72 65  urr->_prev = pre
29a0: 76 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75  v;.....prev = cu
29b0: 72 72 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72 20  rr;...}....curr 
29c0: 3d 20 70 72 65 76 3b 0a 09 09 77 68 69 6c 65 20  = prev;...while 
29d0: 28 63 75 72 72 29 20 7b 0a 09 09 09 73 77 69 74  (curr) {....swit
29e0: 63 68 20 28 63 75 72 72 2d 3e 74 79 70 65 29 20  ch (curr->type) 
29f0: 7b 0a 09 09 09 09 63 61 73 65 20 46 49 4c 45 44  {.....case FILED
2a00: 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47  _LOG_TYPE_MESSAG
2a10: 45 3a 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28  E:......fprintf(
2a20: 66 70 2c 20 22 25 73 22 2c 20 63 75 72 72 2d 3e  fp, "%s", curr->
2a30: 62 75 66 66 65 72 29 3b 0a 0a 09 09 09 09 09 62  buffer);.......b
2a40: 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 46  reak;.....case F
2a50: 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52  ILED_LOG_TYPE_TR
2a60: 41 4e 53 46 45 52 3a 0a 09 09 09 09 09 73 77 69  ANSFER:......swi
2a70: 74 63 68 20 28 63 75 72 72 2d 3e 6d 65 74 68 6f  tch (curr->metho
2a80: 64 29 20 7b 0a 09 09 09 09 09 09 63 61 73 65 20  d) {.......case 
2a90: 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45  FILED_REQUEST_ME
2aa0: 54 48 4f 44 5f 47 45 54 3a 0a 09 09 09 09 09 09  THOD_GET:.......
2ab0: 09 6d 65 74 68 6f 64 3d 22 47 45 54 22 3b 0a 09  .method="GET";..
2ac0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
2ad0: 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f 52 45  ...case FILED_RE
2ae0: 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41  QUEST_METHOD_HEA
2af0: 44 3a 0a 09 09 09 09 09 09 09 6d 65 74 68 6f 64  D:........method
2b00: 3d 22 48 45 41 44 22 3b 0a 09 09 09 09 09 09 09  ="HEAD";........
2b10: 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 64 65 66  break;.......def
2b20: 61 75 6c 74 3a 0a 09 09 09 09 09 09 09 6d 65 74  ault:........met
2b30: 68 6f 64 3d 22 3c 75 6e 6b 6e 6f 77 6e 3e 22 3b  hod="<unknown>";
2b40: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
2b50: 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
2b60: 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65 20 3d 3d  curr->endtime ==
2b70: 20 28 28 74 69 6d 65 5f 74 29 20 2d 31 29 29 20   ((time_t) -1)) 
2b80: 7b 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 65 6e  {.......curr->en
2b90: 64 74 69 6d 65 20 3d 20 6e 6f 77 3b 0a 09 09 09  dtime = now;....
2ba0: 09 09 7d 0a 0a 09 09 09 09 09 66 70 72 69 6e 74  ..}.......fprint
2bb0: 66 28 66 70 2c 20 22 54 52 41 4e 53 46 45 52 20  f(fp, "TRANSFER 
2bc0: 4d 45 54 48 4f 44 3d 25 73 20 50 41 54 48 3d 25  METHOD=%s PATH=%
2bd0: 73 20 53 52 43 3d 25 73 3a 25 69 20 54 49 4d 45  s SRC=%s:%i TIME
2be0: 2e 53 54 41 52 54 3d 25 6c 6c 75 20 54 49 4d 45  .START=%llu TIME
2bf0: 2e 45 4e 44 3d 25 6c 6c 75 20 43 4f 44 45 2e 56  .END=%llu CODE.V
2c00: 41 4c 55 45 3d 25 75 20 43 4f 44 45 2e 52 45 41  ALUE=%u CODE.REA
2c10: 53 4f 4e 3d 25 73 20 52 45 51 55 45 53 54 2e 4f  SON=%s REQUEST.O
2c20: 46 46 53 45 54 3d 25 6c 6c 75 20 52 45 51 55 45  FFSET=%llu REQUE
2c30: 53 54 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 20 46  ST.LENGTH=%llu F
2c40: 49 4c 45 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 20  ILE.LENGTH=%llu 
2c50: 54 52 41 4e 53 46 45 52 2e 4c 45 4e 47 54 48 3d  TRANSFER.LENGTH=
2c60: 25 6c 6c 75 22 2c 0a 09 09 09 09 09 09 6d 65 74  %llu",.......met
2c70: 68 6f 64 2c 0a 09 09 09 09 09 09 63 75 72 72 2d  hod,.......curr-
2c80: 3e 62 75 66 66 65 72 2c 0a 09 09 09 09 09 09 63  >buffer,.......c
2c90: 75 72 72 2d 3e 69 70 2c 20 63 75 72 72 2d 3e 70  urr->ip, curr->p
2ca0: 6f 72 74 2c 0a 09 09 09 09 09 09 28 75 6e 73 69  ort,.......(unsi
2cb0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2cc0: 63 75 72 72 2d 3e 73 74 61 72 74 74 69 6d 65 2c  curr->starttime,
2cd0: 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64  .......(unsigned
2ce0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72   long long) curr
2cf0: 2d 3e 65 6e 64 74 69 6d 65 2c 0a 09 09 09 09 09  ->endtime,......
2d00: 09 63 75 72 72 2d 3e 68 74 74 70 5f 63 6f 64 65  .curr->http_code
2d10: 2c 20 63 75 72 72 2d 3e 72 65 61 73 6f 6e 2c 0a  , curr->reason,.
2d20: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
2d30: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
2d40: 3e 72 65 71 5f 6f 66 66 73 65 74 2c 0a 09 09 09  >req_offset,....
2d50: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
2d60: 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 72 65  g long) curr->re
2d70: 71 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 09 09 09  q_length,.......
2d80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2d90: 6f 6e 67 29 20 63 75 72 72 2d 3e 66 69 6c 65 5f  ong) curr->file_
2da0: 6c 65 6e 67 74 68 2c 0a 09 09 09 09 09 09 28 75  length,.......(u
2db0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
2dc0: 67 29 20 63 75 72 72 2d 3e 73 65 6e 74 5f 6c 65  g) curr->sent_le
2dd0: 6e 67 74 68 0a 09 09 09 09 09 29 3b 0a 0a 09 09  ngth......);....
2de0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
2df0: 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20  ..fprintf(fp, " 
2e00: 54 48 52 45 41 44 3d 25 6c 6c 75 20 54 49 4d 45  THREAD=%llu TIME
2e10: 3d 25 6c 6c 75 5c 6e 22 2c 0a 09 09 09 09 28 75  =%llu\n",.....(u
2e20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
2e30: 67 29 20 28 28 69 6e 74 70 74 72 5f 74 29 20 63  g) ((intptr_t) c
2e40: 75 72 72 2d 3e 74 68 72 65 61 64 29 2c 0a 09 09  urr->thread),...
2e50: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
2e60: 20 6c 6f 6e 67 29 20 6e 6f 77 0a 09 09 09 29 3b   long) now....);
2e70: 0a 09 09 09 66 66 6c 75 73 68 28 66 70 29 3b 0a  ....fflush(fp);.
2e80: 0a 09 09 09 70 72 65 76 20 3d 20 63 75 72 72 3b  ....prev = curr;
2e90: 0a 09 09 09 63 75 72 72 20 3d 20 63 75 72 72 2d  ....curr = curr-
2ea0: 3e 5f 70 72 65 76 3b 0a 0a 09 09 09 66 72 65 65  >_prev;.....free
2eb0: 28 70 72 65 76 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  (prev);...}..}..
2ec0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d  .return(NULL);.}
2ed0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  ..static void fi
2ee0: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 73 74  led_log_entry(st
2ef0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
2f00: 6e 74 72 79 20 2a 65 6e 74 72 79 29 20 7b 0a 09  ntry *entry) {..
2f10: 65 6e 74 72 79 2d 3e 74 68 72 65 61 64 20 3d 20  entry->thread = 
2f20: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a  pthread_self();.
2f30: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
2f40: 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  lock(&filed_log_
2f50: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
2f60: 0a 0a 09 65 6e 74 72 79 2d 3e 5f 6e 65 78 74 20  ...entry->_next 
2f70: 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  = filed_log_msg_
2f80: 6c 69 73 74 3b 0a 09 66 69 6c 65 64 5f 6c 6f 67  list;..filed_log
2f90: 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 65 6e 74 72  _msg_list = entr
2fa0: 79 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  y;...pthread_mut
2fb0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64  ex_unlock(&filed
2fc0: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
2fd0: 74 65 78 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f  tex);...pthread_
2fe0: 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26 66 69 6c  cond_signal(&fil
2ff0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
3000: 72 65 61 64 79 29 3b 0a 0a 09 72 65 74 75 72 6e  ready);...return
3010: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
3020: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
3030: 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65  ry *filed_log_ne
3040: 77 28 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  w(int initialize
3050: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
3060: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 72 65 74  d_log_entry *ret
3070: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
3080: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 72  malloc(sizeof(*r
3090: 65 74 76 61 6c 29 29 3b 0a 0a 09 69 66 20 28 69  etval));...if (i
30a0: 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 09 72  nitialize) {...r
30b0: 65 74 76 61 6c 2d 3e 62 75 66 66 65 72 5b 30 5d  etval->buffer[0]
30c0: 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65 74 76 61   = '\0';...retva
30d0: 6c 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 2d  l->http_code = -
30e0: 31 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 73 74 61  1;...retval->sta
30f0: 72 74 74 69 6d 65 20 3d 20 30 3b 0a 09 09 72 65  rttime = 0;...re
3100: 74 76 61 6c 2d 3e 65 6e 64 74 69 6d 65 20 3d 20  tval->endtime = 
3110: 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65 71  0;...retval->req
3120: 5f 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09 09 72  _offset = 0;...r
3130: 65 74 76 61 6c 2d 3e 72 65 71 5f 6c 65 6e 67 74  etval->req_lengt
3140: 68 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d  h = 0;...retval-
3150: 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 20 3d 20 30  >sent_length = 0
3160: 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 66 69 6c 65  ;...retval->file
3170: 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72  _length = 0;...r
3180: 65 74 76 61 6c 2d 3e 69 70 5b 30 5d 20 3d 20 27  etval->ip[0] = '
3190: 5c 30 27 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 70  \0';...retval->p
31a0: 6f 72 74 20 3d 20 2d 31 3b 0a 09 09 72 65 74 76  ort = -1;...retv
31b0: 61 6c 2d 3e 6d 65 74 68 6f 64 20 3d 20 2d 31 3b  al->method = -1;
31c0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
31d0: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
31e0: 76 6f 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  void filed_log_m
31f0: 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  sg(const char *f
3200: 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09 73 74 72 75  mt, ...) {..stru
3210: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
3220: 72 79 20 2a 65 6e 74 72 79 3b 0a 09 76 61 5f 6c  ry *entry;..va_l
3230: 69 73 74 20 61 72 67 73 3b 0a 0a 09 65 6e 74 72  ist args;...entr
3240: 79 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65  y = filed_log_ne
3250: 77 28 30 29 3b 0a 0a 09 76 61 5f 73 74 61 72 74  w(0);...va_start
3260: 28 61 72 67 73 2c 20 66 6d 74 29 3b 0a 0a 09 76  (args, fmt);...v
3270: 73 6e 70 72 69 6e 74 66 28 65 6e 74 72 79 2d 3e  snprintf(entry->
3280: 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 65  buffer, sizeof(e
3290: 6e 74 72 79 2d 3e 62 75 66 66 65 72 29 2c 20 66  ntry->buffer), f
32a0: 6d 74 2c 20 61 72 67 73 29 3b 0a 0a 09 76 61 5f  mt, args);...va_
32b0: 65 6e 64 28 61 72 67 73 29 3b 0a 0a 09 65 6e 74  end(args);...ent
32c0: 72 79 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45 44  ry->type = FILED
32d0: 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47  _LOG_TYPE_MESSAG
32e0: 45 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65  E;...filed_log_e
32f0: 6e 74 72 79 28 65 6e 74 72 79 29 3b 0a 0a 09 72  ntry(entry);...r
3300: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
3310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
3320: 65 64 5f 6c 6f 67 5f 69 70 28 73 74 72 75 63 74  ed_log_ip(struct
3330: 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64 72 2c   sockaddr *addr,
3340: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
3350: 69 7a 65 5f 74 20 62 75 66 66 65 72 6c 65 6e 29  ize_t bufferlen)
3360: 20 7b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61   {..struct socka
3370: 64 64 72 5f 69 6e 20 2a 61 64 64 72 5f 76 34 3b  ddr_in *addr_v4;
3380: 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ..struct sockadd
3390: 72 5f 69 6e 36 20 2a 61 64 64 72 5f 76 36 3b 0a  r_in6 *addr_v6;.
33a0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 74  .const char *ret
33b0: 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 61 64  val = NULL;...ad
33c0: 64 72 5f 76 36 20 3d 20 28 73 74 72 75 63 74 20  dr_v6 = (struct 
33d0: 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29 20  sockaddr_in6 *) 
33e0: 61 64 64 72 3b 0a 0a 09 73 77 69 74 63 68 20 28  addr;...switch (
33f0: 61 64 64 72 5f 76 36 2d 3e 73 69 6e 36 5f 66 61  addr_v6->sin6_fa
3400: 6d 69 6c 79 29 20 7b 0a 09 09 63 61 73 65 20 41  mily) {...case A
3410: 46 5f 49 4e 45 54 3a 0a 09 09 09 61 64 64 72 5f  F_INET:....addr_
3420: 76 34 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63  v4 = (struct soc
3430: 6b 61 64 64 72 5f 69 6e 20 2a 29 20 61 64 64 72  kaddr_in *) addr
3440: 3b 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 69 6e  ;....retval = in
3450: 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54 2c  et_ntop(AF_INET,
3460: 20 26 61 64 64 72 5f 76 34 2d 3e 73 69 6e 5f 61   &addr_v4->sin_a
3470: 64 64 72 2c 20 62 75 66 66 65 72 2c 20 62 75 66  ddr, buffer, buf
3480: 66 65 72 6c 65 6e 29 3b 0a 09 09 09 62 72 65 61  ferlen);....brea
3490: 6b 3b 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45  k;...case AF_INE
34a0: 54 36 3a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20  T6:....retval = 
34b0: 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45  inet_ntop(AF_INE
34c0: 54 36 2c 20 26 61 64 64 72 5f 76 36 2d 3e 73 69  T6, &addr_v6->si
34d0: 6e 36 5f 61 64 64 72 2c 20 62 75 66 66 65 72 2c  n6_addr, buffer,
34e0: 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09   bufferlen);....
34f0: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75  break;..}...retu
3500: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
3510: 74 61 74 69 63 20 46 49 4c 45 20 2a 66 69 6c 65  tatic FILE *file
3520: 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73 74  d_log_open(const
3530: 20 63 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a 09   char *file) {..
3540: 46 49 4c 45 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  FILE *retval;...
3550: 69 66 20 28 73 74 72 63 6d 70 28 66 69 6c 65 2c  if (strcmp(file,
3560: 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09   "-") == 0) {...
3570: 72 65 74 76 61 6c 20 3d 20 73 74 64 6f 75 74 3b  retval = stdout;
3580: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 66 69 6c  ..} else if (fil
3590: 65 5b 30 5d 20 3d 3d 20 27 7c 27 29 20 7b 0a 09  e[0] == '|') {..
35a0: 09 66 69 6c 65 2b 2b 3b 0a 09 09 72 65 74 76 61  .file++;...retva
35b0: 6c 20 3d 20 70 6f 70 65 6e 28 66 69 6c 65 2c 20  l = popen(file, 
35c0: 22 77 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  "w");..} else {.
35d0: 09 09 72 65 74 76 61 6c 20 3d 20 66 6f 70 65 6e  ..retval = fopen
35e0: 28 66 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09 7d  (file, "a+");..}
35f0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
3600: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
3610: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
3620: 68 72 65 61 64 5f 69 6e 69 74 28 46 49 4c 45 20  hread_init(FILE 
3630: 2a 6c 6f 67 66 70 29 20 7b 0a 09 73 74 72 75 63  *logfp) {..struc
3640: 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  t filed_logging_
3650: 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67  thread_args *arg
3660: 73 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68  s;..pthread_t th
3670: 72 65 61 64 5f 69 64 3b 0a 0a 09 61 72 67 73 20  read_id;...args 
3680: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
3690: 2a 61 72 67 73 29 29 3b 0a 09 61 72 67 73 2d 3e  *args));..args->
36a0: 66 70 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66 69  fp = logfp;...fi
36b0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
36c0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72 65   = NULL;...pthre
36d0: 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 66  ad_mutex_init(&f
36e0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
36f0: 74 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a  t_mutex, NULL);.
3700: 0a 09 70 74 68 72 65 61 64 5f 63 72 65 61 74 65  ..pthread_create
3710: 28 26 74 68 72 65 61 64 5f 69 64 2c 20 4e 55 4c  (&thread_id, NUL
3720: 4c 2c 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  L, filed_logging
3730: 5f 74 68 72 65 61 64 2c 20 61 72 67 73 29 3b 0a  _thread, args);.
3740: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
3750: 22 53 54 41 52 54 22 29 3b 0a 0a 09 72 65 74 75  "START");...retu
3760: 72 6e 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn(0);.}.#endif.
3770: 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f  .#ifdef FILED_DO
3780: 4e 54 5f 54 49 4d 45 4f 55 54 0a 23 64 65 66 69  NT_TIMEOUT.#defi
3790: 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ne filed_sockett
37a0: 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 5f 69 6e  imeout_thread_in
37b0: 69 74 28 29 20 30 0a 23 64 65 66 69 6e 65 20 66  it() 0.#define f
37c0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
37d0: 75 74 5f 69 6e 69 74 28 29 20 30 0a 23 64 65 66  ut_init() 0.#def
37e0: 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  ine filed_socket
37f0: 74 69 6d 65 6f 75 74 5f 61 63 63 65 70 74 28 78  timeout_accept(x
3800: 29 20 2f 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ) /**/.#define f
3810: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3820: 75 74 5f 70 72 6f 63 65 73 73 69 6e 67 5f 73 74  ut_processing_st
3830: 61 72 74 28 78 29 20 2f 2a 2a 2f 0a 23 64 65 66  art(x) /**/.#def
3840: 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  ine filed_socket
3850: 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69  timeout_processi
3860: 6e 67 5f 65 6e 64 28 78 29 20 2f 2a 2a 2f 0a 23  ng_end(x) /**/.#
3870: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63  define filed_soc
3880: 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65  kettimeout_close
3890: 28 78 29 20 2f 2a 2a 2f 0a 23 65 6c 73 65 0a 5f  (x) /**/.#else._
38a0: 41 74 6f 6d 69 63 20 74 69 6d 65 5f 74 20 66 69  Atomic time_t fi
38b0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
38c0: 74 5f 74 69 6d 65 3b 0a 73 74 72 75 63 74 20 7b  t_time;.struct {
38d0: 0a 09 5f 41 74 6f 6d 69 63 20 74 69 6d 65 5f 74  .._Atomic time_t
38e0: 20 65 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65   expiration_time
38f0: 3b 0a 09 5f 41 74 6f 6d 69 63 20 70 74 68 72 65  ;.._Atomic pthre
3900: 61 64 5f 74 20 74 68 72 65 61 64 5f 69 64 3b 0a  ad_t thread_id;.
3910: 09 62 6f 6f 6c 20 76 61 6c 69 64 3b 0a 7d 2a 20  .bool valid;.}* 
3920: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3930: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 3b 0a  out_sockstatus;.
3940: 6c 6f 6e 67 20 66 69 6c 65 64 5f 73 6f 63 6b 65  long filed_socke
3950: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
3960: 74 75 73 5f 6c 65 6e 67 74 68 3b 0a 69 6e 74 20  tus_length;.int 
3970: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3980: 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 3b 0a  out_devnull_fd;.
3990: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
39a0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
39b0: 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28  sockfd_in_range(
39c0: 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69  int sockfd) {..i
39d0: 66 20 28 73 6f 63 6b 66 64 20 3c 20 33 29 20 7b  f (sockfd < 3) {
39e0: 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
39f0: 0a 0a 09 69 66 20 28 73 6f 63 6b 66 64 20 3e 20  ...if (sockfd > 
3a00: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3a10: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c  out_sockstatus_l
3a20: 65 6e 67 74 68 29 20 7b 0a 09 09 72 65 74 75 72  ength) {...retur
3a30: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  n(0);..}...retur
3a40: 6e 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(1);.}..static 
3a50: 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65  void filed_socke
3a60: 74 74 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28  ttimeout_expire(
3a70: 69 6e 74 20 73 6f 63 6b 66 64 2c 20 69 6e 74 20  int sockfd, int 
3a80: 6c 65 6e 67 74 68 29 20 7b 0a 09 74 69 6d 65 5f  length) {..time_
3a90: 74 20 6e 6f 77 2c 20 65 78 70 69 72 65 3b 0a 0a  t now, expire;..
3aa0: 09 6e 6f 77 20 3d 20 61 74 6f 6d 69 63 5f 6c 6f  .now = atomic_lo
3ab0: 61 64 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74  ad(&filed_socket
3ac0: 74 69 6d 65 6f 75 74 5f 74 69 6d 65 29 3b 0a 0a  timeout_time);..
3ad0: 09 65 78 70 69 72 65 20 3d 20 6e 6f 77 20 2b 20  .expire = now + 
3ae0: 6c 65 6e 67 74 68 3b 0a 0a 09 61 74 6f 6d 69 63  length;...atomic
3af0: 5f 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f  _store(&filed_so
3b00: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
3b10: 73 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 65  status[sockfd].e
3b20: 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 2c 20  xpiration_time, 
3b30: 65 78 70 69 72 65 29 3b 0a 0a 09 72 65 74 75 72  expire);...retur
3b40: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
3b50: 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  d filed_socketti
3b60: 6d 65 6f 75 74 5f 61 63 63 65 70 74 28 69 6e 74  meout_accept(int
3b70: 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28   sockfd) {..if (
3b80: 21 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  !filed_sockettim
3b90: 65 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72  eout_sockfd_in_r
3ba0: 61 6e 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a  ange(sockfd)) {.
3bb0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
3bc0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3bd0: 75 74 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64  ut_expire(sockfd
3be0: 2c 20 36 30 29 3b 0a 0a 09 61 74 6f 6d 69 63 5f  , 60);...atomic_
3bf0: 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63  store(&filed_soc
3c00: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73  kettimeout_socks
3c10: 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 74 68  tatus[sockfd].th
3c20: 72 65 61 64 5f 69 64 2c 20 70 74 68 72 65 61 64  read_id, pthread
3c30: 5f 73 65 6c 66 28 29 29 3b 0a 0a 09 61 74 6f 6d  _self());...atom
3c40: 69 63 5f 73 74 6f 72 65 28 26 66 69 6c 65 64 5f  ic_store(&filed_
3c50: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
3c60: 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d  ckstatus[sockfd]
3c70: 2e 76 61 6c 69 64 2c 20 74 72 75 65 29 3b 0a 0a  .valid, true);..
3c80: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
3c90: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f  ic void filed_so
3ca0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63  ckettimeout_proc
3cb0: 65 73 73 69 6e 67 5f 73 74 61 72 74 28 69 6e 74  essing_start(int
3cc0: 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28   sockfd) {..if (
3cd0: 21 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  !filed_sockettim
3ce0: 65 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72  eout_sockfd_in_r
3cf0: 61 6e 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a  ange(sockfd)) {.
3d00: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
3d10: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3d20: 75 74 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64  ut_expire(sockfd
3d30: 2c 20 38 36 34 30 30 29 3b 0a 0a 09 72 65 74 75  , 86400);...retu
3d40: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  rn;.}..static vo
3d50: 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  id filed_sockett
3d60: 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e  imeout_processin
3d70: 67 5f 65 6e 64 28 69 6e 74 20 73 6f 63 6b 66 64  g_end(int sockfd
3d80: 29 20 7b 0a 09 69 66 20 28 21 66 69 6c 65 64 5f  ) {..if (!filed_
3d90: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
3da0: 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28 73 6f  ckfd_in_range(so
3db0: 63 6b 66 64 29 29 20 7b 0a 09 09 72 65 74 75 72  ckfd)) {...retur
3dc0: 6e 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f  n;..}...filed_so
3dd0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65 78 70 69  ckettimeout_expi
3de0: 72 65 28 73 6f 63 6b 66 64 2c 20 36 30 29 3b 0a  re(sockfd, 60);.
3df0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
3e00: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73  tic void filed_s
3e10: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f  ockettimeout_clo
3e20: 73 65 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b  se(int sockfd) {
3e30: 0a 09 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63  ..if (!filed_soc
3e40: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66  kettimeout_sockf
3e50: 64 5f 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66  d_in_range(sockf
3e60: 64 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a  d)) {...return;.
3e70: 09 7d 0a 0a 09 61 74 6f 6d 69 63 5f 73 74 6f 72  .}...atomic_stor
3e80: 65 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  e(&filed_sockett
3e90: 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75  imeout_sockstatu
3ea0: 73 5b 73 6f 63 6b 66 64 5d 2e 76 61 6c 69 64 2c  s[sockfd].valid,
3eb0: 20 66 61 6c 73 65 29 3b 0a 0a 09 72 65 74 75 72   false);...retur
3ec0: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
3ed0: 64 20 2a 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  d *filed_sockett
3ee0: 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 28 76 6f  imeout_thread(vo
3ef0: 69 64 20 2a 61 72 67 29 20 7b 0a 09 74 69 6d 65  id *arg) {..time
3f00: 5f 74 20 6e 6f 77 2c 20 65 78 70 69 72 61 74 69  _t now, expirati
3f10: 6f 6e 5f 74 69 6d 65 3b 0a 09 70 74 68 72 65 61  on_time;..pthrea
3f20: 64 5f 74 20 74 68 72 65 61 64 5f 69 64 3b 0a 09  d_t thread_id;..
3f30: 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 63  long idx;..int c
3f40: 6f 75 6e 74 3b 0a 09 62 6f 6f 6c 20 76 61 6c 69  ount;..bool vali
3f50: 64 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b  d;...while (1) {
3f60: 0a 09 09 66 6f 72 20 28 63 6f 75 6e 74 20 3d 20  ...for (count = 
3f70: 30 3b 20 63 6f 75 6e 74 20 3c 20 31 30 3b 20 63  0; count < 10; c
3f80: 6f 75 6e 74 2b 2b 29 20 7b 0a 09 09 09 75 73 6c  ount++) {....usl
3f90: 65 65 70 28 33 30 30 30 30 30 30 30 29 3b 0a 0a  eep(30000000);..
3fa0: 09 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e 55  ...now = time(NU
3fb0: 4c 4c 29 3b 0a 0a 09 09 09 61 74 6f 6d 69 63 5f  LL);.....atomic_
3fc0: 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63  store(&filed_soc
3fd0: 6b 65 74 74 69 6d 65 6f 75 74 5f 74 69 6d 65 2c  kettimeout_time,
3fe0: 20 6e 6f 77 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f   now);...}....fo
3ff0: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
4000: 3c 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  < filed_socketti
4010: 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73  meout_sockstatus
4020: 5f 6c 65 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20  _length; idx++) 
4030: 7b 0a 09 09 09 76 61 6c 69 64 20 3d 20 61 74 6f  {....valid = ato
4040: 6d 69 63 5f 6c 6f 61 64 28 26 66 69 6c 65 64 5f  mic_load(&filed_
4050: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
4060: 63 6b 73 74 61 74 75 73 5b 69 64 78 5d 2e 76 61  ckstatus[idx].va
4070: 6c 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 21 76  lid);.....if (!v
4080: 61 6c 69 64 29 20 7b 0a 09 09 09 09 63 6f 6e 74  alid) {.....cont
4090: 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 65  inue;....}.....e
40a0: 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20 3d  xpiration_time =
40b0: 20 61 74 6f 6d 69 63 5f 6c 6f 61 64 28 26 66 69   atomic_load(&fi
40c0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
40d0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69 64 78  t_sockstatus[idx
40e0: 5d 2e 65 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d  ].expiration_tim
40f0: 65 29 3b 0a 0a 09 09 09 74 68 72 65 61 64 5f 69  e);.....thread_i
4100: 64 20 3d 20 61 74 6f 6d 69 63 5f 6c 6f 61 64 28  d = atomic_load(
4110: 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  &filed_sockettim
4120: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b  eout_sockstatus[
4130: 69 64 78 5d 2e 74 68 72 65 61 64 5f 69 64 29 3b  idx].thread_id);
4140: 0a 0a 09 09 09 69 66 20 28 65 78 70 69 72 61 74  .....if (expirat
4150: 69 6f 6e 5f 74 69 6d 65 20 3e 20 6e 6f 77 29 20  ion_time > now) 
4160: 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
4170: 09 09 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 73  ...}.....filed_s
4180: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f  ockettimeout_clo
4190: 73 65 28 69 64 78 29 3b 0a 0a 09 09 09 64 75 70  se(idx);.....dup
41a0: 32 28 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  2(filed_socketti
41b0: 6d 65 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64  meout_devnull_fd
41c0: 2c 20 69 64 78 29 3b 0a 0a 09 09 09 70 74 68 72  , idx);.....pthr
41d0: 65 61 64 5f 6b 69 6c 6c 28 74 68 72 65 61 64 5f  ead_kill(thread_
41e0: 69 64 2c 20 53 49 47 50 49 50 45 29 3b 0a 09 09  id, SIGPIPE);...
41f0: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55  }..}...return(NU
4200: 4c 4c 29 3b 0a 0a 09 2f 2a 20 4e 4f 54 52 45 41  LL);.../* NOTREA
4210: 43 48 3a 20 57 65 20 64 6f 6e 27 74 20 61 63 74  CH: We don't act
4220: 75 61 6c 6c 79 20 74 61 6b 65 20 61 6e 79 20 61  ually take any a
4230: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67  rguments */..arg
4240: 20 3d 20 61 72 67 3b 0a 7d 0a 0a 73 74 61 74 69   = arg;.}..stati
4250: 63 20 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b  c int filed_sock
4260: 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64  ettimeout_thread
4270: 5f 69 6e 69 74 28 76 6f 69 64 29 20 7b 0a 09 70  _init(void) {..p
4280: 74 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f  thread_t thread_
4290: 69 64 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 72  id;...pthread_cr
42a0: 65 61 74 65 28 26 74 68 72 65 61 64 5f 69 64 2c  eate(&thread_id,
42b0: 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 73 6f 63   NULL, filed_soc
42c0: 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61  kettimeout_threa
42d0: 64 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 72 65 74 75  d, NULL);...retu
42e0: 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(0);.}..static
42f0: 20 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65   int filed_socke
4300: 74 74 69 6d 65 6f 75 74 5f 69 6e 69 74 28 76 6f  ttimeout_init(vo
4310: 69 64 29 20 7b 0a 09 6c 6f 6e 67 20 6d 61 78 66  id) {..long maxf
4320: 64 2c 20 69 64 78 3b 0a 0a 09 6d 61 78 66 64 20  d, idx;...maxfd 
4330: 3d 20 73 79 73 63 6f 6e 66 28 5f 53 43 5f 4f 50  = sysconf(_SC_OP
4340: 45 4e 5f 4d 41 58 29 3b 0a 09 69 66 20 28 6d 61  EN_MAX);..if (ma
4350: 78 66 64 20 3c 3d 20 30 29 20 7b 0a 09 09 6d 61  xfd <= 0) {...ma
4360: 78 66 64 20 3d 20 34 30 39 36 3b 0a 09 7d 0a 0a  xfd = 4096;..}..
4370: 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  .filed_sockettim
4380: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 20  eout_sockstatus 
4390: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
43a0: 2a 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  *filed_sockettim
43b0: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 29  eout_sockstatus)
43c0: 20 2a 20 6d 61 78 66 64 29 3b 0a 09 69 66 20 28   * maxfd);..if (
43d0: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
43e0: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 20 3d  out_sockstatus =
43f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
4400: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72  rn(-1);..}...for
4410: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
4420: 20 6d 61 78 66 64 3b 20 69 64 78 2b 2b 29 20 7b   maxfd; idx++) {
4430: 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ...filed_sockett
4440: 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75  imeout_sockstatu
4450: 73 5b 69 64 78 5d 2e 76 61 6c 69 64 20 3d 20 66  s[idx].valid = f
4460: 61 6c 73 65 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64  alse;..}...filed
4470: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73  _sockettimeout_s
4480: 6f 63 6b 73 74 61 74 75 73 5f 6c 65 6e 67 74 68  ockstatus_length
4490: 20 3d 20 6d 61 78 66 64 3b 0a 09 66 69 6c 65 64   = maxfd;..filed
44a0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64  _sockettimeout_d
44b0: 65 76 6e 75 6c 6c 5f 66 64 20 3d 20 6f 70 65 6e  evnull_fd = open
44c0: 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f  ("/dev/null", O_
44d0: 52 44 57 52 29 3b 0a 09 69 66 20 28 66 69 6c 65  RDWR);..if (file
44e0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
44f0: 64 65 76 6e 75 6c 6c 5f 66 64 20 3c 20 30 29 20  devnull_fd < 0) 
4500: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
4510: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  .}...return(0);.
4520: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72  }.#endif../* For
4530: 6d 61 74 20 74 69 6d 65 20 70 65 72 20 52 46 43  mat time per RFC
4540: 32 36 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 63  2616 */.static c
4550: 68 61 72 20 2a 66 69 6c 65 64 5f 66 6f 72 6d 61  har *filed_forma
4560: 74 5f 74 69 6d 65 28 63 68 61 72 20 2a 62 75 66  t_time(char *buf
4570: 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66  fer, size_t buff
4580: 65 72 5f 6c 65 6e 2c 20 63 6f 6e 73 74 20 74 69  er_len, const ti
4590: 6d 65 5f 74 20 74 69 6d 65 69 6e 66 6f 29 20 7b  me_t timeinfo) {
45a0: 0a 09 73 74 72 75 63 74 20 74 6d 20 74 69 6d 65  ..struct tm time
45b0: 69 6e 66 6f 5f 74 6d 2c 20 2a 74 69 6d 65 69 6e  info_tm, *timein
45c0: 66 6f 5f 74 6d 5f 70 3b 0a 0a 09 74 69 6d 65 69  fo_tm_p;...timei
45d0: 6e 66 6f 5f 74 6d 5f 70 20 3d 20 67 6d 74 69 6d  nfo_tm_p = gmtim
45e0: 65 5f 72 28 26 74 69 6d 65 69 6e 66 6f 2c 20 26  e_r(&timeinfo, &
45f0: 74 69 6d 65 69 6e 66 6f 5f 74 6d 29 3b 0a 09 69  timeinfo_tm);..i
4600: 66 20 28 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70  f (timeinfo_tm_p
4610: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
4620: 74 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b  turn("unknown");
4630: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5b 62 75 66  ..}...buffer[buf
4640: 66 65 72 5f 6c 65 6e 20 2d 20 31 5d 20 3d 20 27  fer_len - 1] = '
4650: 5c 30 27 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  \0';..buffer_len
4660: 20 3d 20 73 74 72 66 74 69 6d 65 28 62 75 66 66   = strftime(buff
4670: 65 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 2d  er, buffer_len -
4680: 20 31 2c 20 22 25 61 2c 20 25 64 20 25 62 20 25   1, "%a, %d %b %
4690: 59 20 25 48 3a 25 4d 3a 25 53 20 47 4d 54 22 2c  Y %H:%M:%S GMT",
46a0: 20 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 29 3b   timeinfo_tm_p);
46b0: 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72  ...return(buffer
46c0: 29 3b 0a 7d 0a 0a 2f 2a 20 68 61 73 68 20 2a 2f  );.}../* hash */
46d0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
46e0: 20 69 6e 74 20 66 69 6c 65 64 5f 68 61 73 68 28   int filed_hash(
46f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4700: 68 61 72 20 2a 76 61 6c 75 65 2c 20 75 6e 73 69  har *value, unsi
4710: 67 6e 65 64 20 69 6e 74 20 6d 6f 64 75 6c 75 73  gned int modulus
4720: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
4730: 61 72 20 63 75 72 72 2c 20 70 72 65 76 3b 0a 09  ar curr, prev;..
4740: 69 6e 74 20 64 69 66 66 3b 0a 09 75 6e 73 69 67  int diff;..unsig
4750: 6e 65 64 20 69 6e 74 20 72 65 74 76 61 6c 3b 0a  ned int retval;.
4760: 0a 09 72 65 74 76 61 6c 20 3d 20 6d 6f 64 75 6c  ..retval = modul
4770: 75 73 20 2d 20 31 3b 0a 09 70 72 65 76 20 3d 20  us - 1;..prev = 
4780: 6d 6f 64 75 6c 75 73 20 25 20 32 35 35 3b 0a 0a  modulus % 255;..
4790: 09 77 68 69 6c 65 20 28 28 63 75 72 72 20 3d 20  .while ((curr = 
47a0: 2a 76 61 6c 75 65 29 29 20 7b 0a 09 09 69 66 20  *value)) {...if 
47b0: 28 63 75 72 72 20 3c 20 33 32 29 20 7b 0a 09 09  (curr < 32) {...
47c0: 09 63 75 72 72 20 3d 20 32 35 35 20 2d 20 63 75  .curr = 255 - cu
47d0: 72 72 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  rr;...} else {..
47e0: 09 09 63 75 72 72 20 2d 3d 20 33 32 3b 0a 09 09  ..curr -= 32;...
47f0: 7d 0a 0a 09 09 69 66 20 28 70 72 65 76 20 3c 20  }....if (prev < 
4800: 63 75 72 72 29 20 7b 0a 09 09 09 64 69 66 66 20  curr) {....diff 
4810: 3d 20 63 75 72 72 20 2d 20 70 72 65 76 3b 0a 09  = curr - prev;..
4820: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 64 69 66  .} else {....dif
4830: 66 20 3d 20 70 72 65 76 20 2d 20 63 75 72 72 3b  f = prev - curr;
4840: 0a 09 09 7d 0a 0a 09 09 70 72 65 76 20 3d 20 63  ...}....prev = c
4850: 75 72 72 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3c  urr;....retval <
4860: 3c 3d 20 33 3b 0a 09 09 72 65 74 76 61 6c 20 26  <= 3;...retval &
4870: 3d 20 30 78 46 46 46 46 46 46 46 46 4c 55 3b 0a  = 0xFFFFFFFFLU;.
4880: 09 09 72 65 74 76 61 6c 20 5e 3d 20 64 69 66 66  ..retval ^= diff
4890: 3b 0a 0a 09 09 76 61 6c 75 65 2b 2b 3b 0a 09 7d  ;....value++;..}
48a0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 74 76  ...retval = retv
48b0: 61 6c 20 25 20 6d 6f 64 75 6c 75 73 3b 0a 0a 09  al % modulus;...
48c0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
48d0: 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 6d 69 6d  }../* Find a mim
48e0: 65 2d 74 79 70 65 20 62 61 73 65 64 20 6f 6e 20  e-type based on 
48f0: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  the filename */.
4900: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4910: 72 20 2a 66 69 6c 65 64 5f 64 65 74 65 72 6d 69  r *filed_determi
4920: 6e 65 5f 6d 69 6d 65 74 79 70 65 28 63 6f 6e 73  ne_mimetype(cons
4930: 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a  t char *path) {.
4940: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a  .const char *p;.
4950: 0a 09 70 20 3d 20 73 74 72 72 63 68 72 28 70 61  ..p = strrchr(pa
4960: 74 68 2c 20 27 2e 27 29 3b 0a 09 69 66 20 28 70  th, '.');..if (p
4970: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
4980: 74 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55  turn(FILED_DEFAU
4990: 4c 54 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 70  LT_TYPE);..}...p
49a0: 2b 2b 3b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 27  ++;..if (*p == '
49b0: 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  \0') {...return(
49c0: 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59  FILED_DEFAULT_TY
49d0: 50 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f  PE);..}...filed_
49e0: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c  log_msg_debug("L
49f0: 6f 6f 6b 69 6e 67 20 75 70 20 4d 49 4d 45 20 74  ooking up MIME t
4a00: 79 70 65 20 66 6f 72 20 25 73 20 28 68 61 73 68  ype for %s (hash
4a10: 20 3d 20 25 6c 6c 75 29 22 2c 20 70 2c 20 28 75   = %llu)", p, (u
4a20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
4a30: 67 29 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63  g) filed_hash((c
4a40: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4a50: 61 72 20 2a 29 20 70 2c 20 31 36 37 37 37 32 35  ar *) p, 1677725
4a60: 39 29 29 3b 0a 0a 23 69 6e 63 6c 75 64 65 20 22  9));..#include "
4a70: 66 69 6c 65 64 2d 6d 69 6d 65 2d 74 79 70 65 73  filed-mime-types
4a80: 2e 68 22 0a 0a 09 72 65 74 75 72 6e 28 46 49 4c  .h"...return(FIL
4a90: 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 29  ED_DEFAULT_TYPE)
4aa0: 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
4ab0: 20 61 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69   a unique identi
4ac0: 66 69 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 76  fier */.static v
4ad0: 6f 69 64 20 66 69 6c 65 64 5f 67 65 6e 65 72 61  oid filed_genera
4ae0: 74 65 5f 65 74 61 67 28 63 68 61 72 20 2a 65 74  te_etag(char *et
4af0: 61 67 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 67 74  ag, size_t lengt
4b00: 68 29 20 7b 0a 09 73 6e 70 72 69 6e 74 66 28 65  h) {..snprintf(e
4b10: 74 61 67 2c 20 6c 65 6e 67 74 68 2c 20 22 25 6c  tag, length, "%l
4b20: 6c 78 2d 25 6c 6c 78 25 6c 6c 78 25 6c 6c 78 25  lx-%llx%llx%llx%
4b30: 6c 6c 78 22 2c 0a 09 09 28 75 6e 73 69 67 6e 65  llx",...(unsigne
4b40: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 74 69 6d  d long long) tim
4b50: 65 28 4e 55 4c 4c 29 2c 0a 09 09 28 75 6e 73 69  e(NULL),...(unsi
4b60: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
4b70: 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73  random(),...(uns
4b80: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
4b90: 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e   random(),...(un
4ba0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
4bb0: 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75  ) random(),...(u
4bc0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
4bd0: 67 29 20 72 61 6e 64 6f 6d 28 29 0a 09 29 3b 0a  g) random()..);.
4be0: 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c  }../* Open a fil
4bf0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 66 69 6c  e and return fil
4c00: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
4c10: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 66  .static struct f
4c20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66  iled_fileinfo *f
4c30: 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 63  iled_open_file(c
4c40: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
4c50: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69   struct filed_fi
4c60: 6c 65 69 6e 66 6f 20 2a 62 75 66 66 65 72 29 20  leinfo *buffer) 
4c70: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
4c80: 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b  fileinfo *cache;
4c90: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63  ..unsigned int c
4ca0: 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f 74  ache_idx;..off_t
4cb0: 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a   len;..int fd;..
4cc0: 09 69 66 20 28 66 69 6c 65 64 5f 66 69 6c 65 69  .if (filed_filei
4cd0: 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65  nfo_fdcache_size
4ce0: 20 21 3d 20 30 29 20 7b 0a 09 09 63 61 63 68 65   != 0) {...cache
4cf0: 5f 69 64 78 20 3d 20 66 69 6c 65 64 5f 68 61 73  _idx = filed_has
4d00: 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  h((const unsigne
4d10: 64 20 63 68 61 72 20 2a 29 20 70 61 74 68 2c 20  d char *) path, 
4d20: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
4d30: 64 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 0a 09  dcache_size);...
4d40: 09 63 61 63 68 65 20 3d 20 26 66 69 6c 65 64 5f  .cache = &filed_
4d50: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
4d60: 5b 63 61 63 68 65 5f 69 64 78 5d 3b 0a 0a 09 09  [cache_idx];....
4d70: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
4d80: 62 75 67 28 22 4c 6f 63 6b 69 6e 67 20 6d 75 74  bug("Locking mut
4d90: 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c 75 22  ex for idx: %lu"
4da0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
4db0: 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a 0a 09  ) cache_idx);...
4dc0: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c  .pthread_mutex_l
4dd0: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
4de0: 78 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  x);....filed_log
4df0: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70  _msg_debug("Comp
4e00: 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6d 75  leted locking mu
4e10: 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c 75  tex for idx: %lu
4e20: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
4e30: 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a 09  g) cache_idx);..
4e40: 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 68 65  } else {...cache
4e50: 5f 69 64 78 20 3d 20 30 3b 0a 09 09 63 61 63 68  _idx = 0;...cach
4e60: 65 20 3d 20 62 75 66 66 65 72 3b 0a 09 09 63 61  e = buffer;...ca
4e70: 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20 3d 20 27  che->path[0] = '
4e80: 5c 30 27 3b 0a 09 09 63 61 63 68 65 2d 3e 66 64  \0';...cache->fd
4e90: 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 69 66 20 28   = -1;..}...if (
4ea0: 73 74 72 63 6d 70 28 70 61 74 68 2c 20 63 61 63  strcmp(path, cac
4eb0: 68 65 2d 3e 70 61 74 68 29 20 21 3d 20 30 29 20  he->path) != 0) 
4ec0: 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  {...filed_log_ms
4ed0: 67 5f 64 65 62 75 67 28 22 43 61 63 68 65 20 6d  g_debug("Cache m
4ee0: 69 73 73 20 66 6f 72 20 69 64 78 3a 20 25 6c 75  iss for idx: %lu
4ef0: 3a 20 4f 4c 44 20 5c 22 25 73 5c 22 2c 20 4e 45  : OLD \"%s\", NE
4f00: 57 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73 69  W \"%s\"", (unsi
4f10: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65  gned long) cache
4f20: 5f 69 64 78 2c 20 63 61 63 68 65 2d 3e 70 61 74  _idx, cache->pat
4f30: 68 2c 20 70 61 74 68 29 3b 0a 0a 09 09 66 64 20  h, path);....fd 
4f40: 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 4f 5f 52  = open(path, O_R
4f50: 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52 47 45 46  DONLY | O_LARGEF
4f60: 49 4c 45 29 3b 0a 09 09 69 66 20 28 66 64 20 3c  ILE);...if (fd <
4f70: 20 30 29 20 7b 0a 09 09 09 69 66 20 28 66 69 6c   0) {....if (fil
4f80: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
4f90: 63 68 65 5f 73 69 7a 65 20 21 3d 20 30 29 20 7b  che_size != 0) {
4fa0: 0a 09 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74  .....pthread_mut
4fb0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65  ex_unlock(&cache
4fc0: 2d 3e 6d 75 74 65 78 29 3b 0a 09 09 09 7d 0a 0a  ->mutex);....}..
4fd0: 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
4fe0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 68  ...}....if (cach
4ff0: 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a 09 09  e->fd >= 0) {...
5000: 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66 64  .close(cache->fd
5010: 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20 3d 20  );...}....len = 
5020: 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53 45 45  lseek(fd, 0, SEE
5030: 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65 6b 28  K_END);...lseek(
5040: 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  fd, 0, SEEK_SET)
5050: 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64 20 3d  ;....cache->fd =
5060: 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e 6c 65   fd;...cache->le
5070: 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73 74 72 63 70  n = len;...strcp
5080: 79 28 63 61 63 68 65 2d 3e 70 61 74 68 2c 20 70  y(cache->path, p
5090: 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d 3e 74  ath);...cache->t
50a0: 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65 74 65  ype = filed_dete
50b0: 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28 70  rmine_mimetype(p
50c0: 61 74 68 29 3b 0a 09 09 66 69 6c 65 64 5f 67 65  ath);...filed_ge
50d0: 6e 65 72 61 74 65 5f 65 74 61 67 28 63 61 63 68  nerate_etag(cach
50e0: 65 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66 28  e->etag, sizeof(
50f0: 63 61 63 68 65 2d 3e 65 74 61 67 29 29 3b 0a 0a  cache->etag));..
5100: 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 44  ../* XXX:TODO: D
5110: 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09 09 63 61  etermine */...ca
5120: 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 66  che->lastmod = f
5130: 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65  iled_format_time
5140: 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f  (cache->lastmod_
5150: 62 2c 20 73 69 7a 65 6f 66 28 63 61 63 68 65 2d  b, sizeof(cache-
5160: 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20 74 69 6d  >lastmod_b), tim
5170: 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29 3b 0a 09  e(NULL) - 30);..
5180: 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65 64  } else {...filed
5190: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
51a0: 43 61 63 68 65 20 68 69 74 20 66 6f 72 20 69 64  Cache hit for id
51b0: 78 3a 20 25 6c 75 3a 20 50 41 54 48 20 5c 22 25  x: %lu: PATH \"%
51c0: 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  s\"", (unsigned 
51d0: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 2c  long) cache_idx,
51e0: 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 69 66 20   path);..}...if 
51f0: 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  (filed_fileinfo_
5200: 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20  fdcache_size != 
5210: 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 57  0) {.../*... * W
5220: 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61  e have to make a
5230: 20 64 75 70 6c 69 63 61 74 65 20 46 44 2c 20 62   duplicate FD, b
5240: 65 63 61 75 73 65 20 6f 6e 63 65 20 77 65 20 72  ecause once we r
5250: 65 6c 65 61 73 65 20 74 68 65 20 63 61 63 68 65  elease the cache
5260: 0a 09 09 20 2a 20 6d 75 74 65 78 2c 20 74 68 65  ... * mutex, the
5270: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5280: 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 0a 09   may be closed..
5290: 09 20 2a 2f 0a 09 09 66 64 20 3d 20 64 75 70 28  . */...fd = dup(
52a0: 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09 69 66  cache->fd);...if
52b0: 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 09 70   (fd < 0) {....p
52c0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
52d0: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
52e0: 78 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e  x);.....return(N
52f0: 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 62 75 66  ULL);...}....buf
5300: 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09  fer->fd = fd;...
5310: 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63 61  buffer->len = ca
5320: 63 68 65 2d 3e 6c 65 6e 3b 0a 09 09 62 75 66 66  che->len;...buff
5330: 65 72 2d 3e 74 79 70 65 20 3d 20 63 61 63 68 65  er->type = cache
5340: 2d 3e 74 79 70 65 3b 0a 09 09 6d 65 6d 63 70 79  ->type;...memcpy
5350: 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64  (buffer->lastmod
5360: 5f 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d  _b, cache->lastm
5370: 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62 75 66  od_b, sizeof(buf
5380: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29  fer->lastmod_b))
5390: 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 66 65  ;...memcpy(buffe
53a0: 72 2d 3e 65 74 61 67 2c 20 63 61 63 68 65 2d 3e  r->etag, cache->
53b0: 65 74 61 67 2c 20 73 69 7a 65 6f 66 28 62 75 66  etag, sizeof(buf
53c0: 66 65 72 2d 3e 65 74 61 67 29 29 3b 0a 09 09 62  fer->etag));...b
53d0: 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 20 3d  uffer->lastmod =
53e0: 20 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64   buffer->lastmod
53f0: 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e 6c 61 73  _b + (cache->las
5400: 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d 3e 6c 61  tmod - cache->la
5410: 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 09 70 74 68  stmod_b);....pth
5420: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
5430: 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29  k(&cache->mutex)
5440: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 62 75  ;..}...return(bu
5450: 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f  ffer);.}../* Pro
5460: 63 65 73 73 20 61 6e 20 48 54 54 50 20 72 65 71  cess an HTTP req
5470: 75 65 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20  uest and return 
5480: 74 68 65 20 70 61 74 68 20 72 65 71 75 65 73 74  the path request
5490: 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ed */.static str
54a0: 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72  uct filed_http_r
54b0: 65 71 75 65 73 74 20 2a 66 69 6c 65 64 5f 67 65  equest *filed_ge
54c0: 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28 46  t_http_request(F
54d0: 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20  ILE *fp, struct 
54e0: 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65  filed_http_reque
54f0: 73 74 20 2a 62 75 66 66 65 72 5f 73 74 2c 20 73  st *buffer_st, s
5500: 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69  truct filed_opti
5510: 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a  ons *options) {.
5520: 09 63 68 61 72 20 2a 6d 65 74 68 6f 64 2c 20 2a  .char *method, *
5530: 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 62 75 66  path;..char *buf
5540: 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72  fer, *workbuffer
5550: 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65  , *workbuffer_ne
5560: 78 74 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73  xt;..char *fgets
5570: 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75  _ret;..size_t bu
5580: 66 66 65 72 5f 6c 65 6e 2c 20 70 61 74 68 5f 6c  ffer_len, path_l
5590: 65 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65  en;..off_t range
55a0: 5f 73 74 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e  _start, range_en
55b0: 64 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b  d, range_length;
55c0: 0a 09 69 6e 74 20 72 61 6e 67 65 5f 72 65 71 75  ..int range_requ
55d0: 65 73 74 3b 0a 09 69 6e 74 20 73 6e 70 72 69 6e  est;..int snprin
55e0: 74 66 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a  tf_ret;..int i;.
55f0: 0a 09 2f 2a 20 53 65 74 20 74 6f 20 64 65 66 61  ../* Set to defa
5600: 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a 09 72  ult values */..r
5610: 61 6e 67 65 5f 73 74 61 72 74 20 3d 20 30 3b 0a  ange_start = 0;.
5620: 09 72 61 6e 67 65 5f 65 6e 64 20 20 20 3d 20 30  .range_end   = 0
5630: 3b 0a 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74  ;..range_request
5640: 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 6c 65 6e   = 0;..range_len
5650: 67 74 68 20 3d 20 2d 31 3b 0a 09 62 75 66 66 65  gth = -1;..buffe
5660: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f  r_st->headers.ho
5670: 73 74 2e 70 72 65 73 65 6e 74 20 3d 20 30 3b 0a  st.present = 0;.
5680: 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64  .buffer_st->head
5690: 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d  ers.connection =
56a0: 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f   FILED_CONNECTIO
56b0: 4e 5f 43 4c 4f 53 45 3b 0a 0a 09 62 75 66 66 65  N_CLOSE;...buffe
56c0: 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e 74  r = buffer_st->t
56d0: 6d 70 62 75 66 3b 0a 09 62 75 66 66 65 72 5f 6c  mpbuf;..buffer_l
56e0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66  en = sizeof(buff
56f0: 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 29 3b 0a  er_st->tmpbuf);.
5700: 0a 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67  ..fgets_ret = fg
5710: 65 74 73 28 62 75 66 66 65 72 2c 20 62 75 66 66  ets(buffer, buff
5720: 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 69 66  er_len, fp);..if
5730: 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e   (fgets_ret == N
5740: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
5750: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 6d 65 74 68  NULL);..}...meth
5760: 6f 64 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62  od = buffer;...b
5770: 75 66 66 65 72 20 3d 20 73 74 72 63 68 72 28 62  uffer = strchr(b
5780: 75 66 66 65 72 2c 20 27 20 27 29 3b 0a 09 69 66  uffer, ' ');..if
5790: 20 28 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c   (buffer == NULL
57a0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  ) {...return(NUL
57b0: 4c 29 3b 0a 09 7d 0a 0a 09 2a 62 75 66 66 65 72  L);..}...*buffer
57c0: 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72   = '\0';..buffer
57d0: 2b 2b 3b 0a 0a 09 70 61 74 68 20 3d 20 62 75 66  ++;...path = buf
57e0: 66 65 72 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  fer;.../* Termin
57f0: 61 74 65 20 70 61 74 68 20 63 6f 6d 70 6f 6e 65  ate path compone
5800: 6e 74 20 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20  nt */..buffer = 
5810: 73 74 72 70 62 72 6b 28 70 61 74 68 2c 20 22 5c  strpbrk(path, "\
5820: 72 5c 6e 20 22 29 3b 0a 09 69 66 20 28 62 75 66  r\n ");..if (buf
5830: 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  fer != NULL) {..
5840: 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b  .*buffer = '\0';
5850: 0a 09 09 62 75 66 66 65 72 2b 2b 3b 0a 09 7d 0a  ...buffer++;..}.
5860: 0a 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 68 61 6e  ../* We only han
5870: 64 6c 65 20 74 68 65 20 22 47 45 54 22 20 61 6e  dle the "GET" an
5880: 64 20 22 48 45 41 44 27 20 6d 65 74 68 6f 64 73  d "HEAD' methods
5890: 20 2a 2f 0a 09 69 66 20 28 73 74 72 63 61 73 65   */..if (strcase
58a0: 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22 68 65 61  cmp(method, "hea
58b0: 64 22 29 20 21 3d 20 30 29 20 7b 0a 09 09 69 66  d") != 0) {...if
58c0: 20 28 73 74 72 63 61 73 65 63 6d 70 28 6d 65 74   (strcasecmp(met
58d0: 68 6f 64 2c 20 22 67 65 74 22 29 20 21 3d 20 30  hod, "get") != 0
58e0: 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55  ) {....return(NU
58f0: 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 47  LL);...}..../* G
5900: 45 54 20 72 65 71 75 65 73 74 20 2a 2f 0a 09 09  ET request */...
5910: 62 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f  buffer_st->metho
5920: 64 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53  d = FILED_REQUES
5930: 54 5f 4d 45 54 48 4f 44 5f 47 45 54 3b 0a 09 7d  T_METHOD_GET;..}
5940: 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 48 45 41   else {.../* HEA
5950: 44 20 72 65 71 75 65 73 74 20 2a 2f 0a 09 09 62  D request */...b
5960: 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f 64  uffer_st->method
5970: 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54   = FILED_REQUEST
5980: 5f 4d 45 54 48 4f 44 5f 48 45 41 44 3b 0a 09 7d  _METHOD_HEAD;..}
5990: 0a 0a 09 2f 2a 20 4e 6f 74 65 20 70 61 74 68 20  .../* Note path 
59a0: 2a 2f 0a 09 70 61 74 68 5f 6c 65 6e 20 3d 20 73  */..path_len = s
59b0: 74 72 6c 65 6e 28 70 61 74 68 29 3b 0a 09 6d 65  trlen(path);..me
59c0: 6d 63 70 79 28 62 75 66 66 65 72 5f 73 74 2d 3e  mcpy(buffer_st->
59d0: 70 61 74 68 2c 20 70 61 74 68 2c 20 70 61 74 68  path, path, path
59e0: 5f 6c 65 6e 20 2b 20 31 29 3b 0a 0a 09 2f 2a 20  _len + 1);.../* 
59f0: 44 65 74 65 72 6d 69 6e 65 20 74 79 70 65 20 6f  Determine type o
5a00: 66 20 72 65 71 75 65 73 74 20 66 72 6f 6d 20 70  f request from p
5a10: 61 74 68 20 2a 2f 0a 09 69 66 20 28 70 61 74 68  ath */..if (path
5a20: 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 62  _len == 0) {...b
5a30: 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d  uffer_st->type =
5a40: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54   FILED_REQUEST_T
5a50: 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09  YPE_DIRECTORY;..
5a60: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 70  } else {...if (p
5a70: 61 74 68 5b 70 61 74 68 5f 6c 65 6e 20 2d 20 31  ath[path_len - 1
5a80: 5d 20 3d 3d 20 27 2f 27 29 20 7b 0a 09 09 09 62  ] == '/') {....b
5a90: 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d  uffer_st->type =
5aa0: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54   FILED_REQUEST_T
5ab0: 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09  YPE_DIRECTORY;..
5ac0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 75 66  .} else {....buf
5ad0: 66 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d 20 46  fer_st->type = F
5ae0: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50  ILED_REQUEST_TYP
5af0: 45 5f 4f 54 48 45 52 3b 0a 09 09 7d 0a 09 7d 0a  E_OTHER;...}..}.
5b00: 0a 09 2f 2a 20 52 65 73 65 74 20 62 75 66 66 65  ../* Reset buffe
5b10: 72 20 66 6f 72 20 6c 61 74 65 72 20 75 73 65 20  r for later use 
5b20: 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20 62 75 66  */..buffer = buf
5b30: 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a  fer_st->tmpbuf;.
5b40: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
5b50: 3c 20 31 30 30 3b 20 69 2b 2b 29 20 7b 0a 09 09  < 100; i++) {...
5b60: 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74  fgets_ret = fget
5b70: 73 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  s(buffer, buffer
5b80: 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 09 69 66 20  _len, fp);...if 
5b90: 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55  (fgets_ret == NU
5ba0: 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a  LL) {....break;.
5bb0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 74 72 6e 63  ..}....if (strnc
5bc0: 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c 20 22  asecmp(buffer, "
5bd0: 52 61 6e 67 65 3a 20 22 2c 20 37 29 20 3d 3d 20  Range: ", 7) == 
5be0: 30 29 20 7b 0a 09 09 09 77 6f 72 6b 62 75 66 66  0) {....workbuff
5bf0: 65 72 20 3d 20 62 75 66 66 65 72 20 2b 20 37 3b  er = buffer + 7;
5c00: 0a 0a 09 09 09 69 66 20 28 73 74 72 6e 63 61 73  .....if (strncas
5c10: 65 63 6d 70 28 77 6f 72 6b 62 75 66 66 65 72 2c  ecmp(workbuffer,
5c20: 20 22 62 79 74 65 73 3d 22 2c 20 36 29 20 3d 3d   "bytes=", 6) ==
5c30: 20 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75   0) {.....workbu
5c40: 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09 09 09  ffer += 6;......
5c50: 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d 20  range_request = 
5c60: 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f 73 74  1;......range_st
5c70: 61 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77  art = strtoull(w
5c80: 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72 6b  orkbuffer, &work
5c90: 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30 29  buffer_next, 10)
5ca0: 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65  ;......workbuffe
5cb0: 72 20 3d 20 77 6f 72 6b 62 75 66 66 65 72 5f 6e  r = workbuffer_n
5cc0: 65 78 74 3b 0a 0a 09 09 09 09 69 66 20 28 2a 77  ext;......if (*w
5cd0: 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 2d 27  orkbuffer == '-'
5ce0: 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62 75 66  ) {......workbuf
5cf0: 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69 66 20  fer++;.......if 
5d00: 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20  (*workbuffer != 
5d10: 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62 75 66  '\r' && *workbuf
5d20: 66 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b 0a 09  fer != '\n') {..
5d30: 09 09 09 09 09 72 61 6e 67 65 5f 65 6e 64 20 3d  .....range_end =
5d40: 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75   strtoull(workbu
5d50: 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65  ffer, &workbuffe
5d60: 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09 09 09  r_next, 10);....
5d70: 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09  ..}.....}....}..
5d80: 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 6e  .} else if (strn
5d90: 63 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c 20  casecmp(buffer, 
5da0: 22 48 6f 73 74 3a 20 22 2c 20 35 29 20 3d 3d 20  "Host: ", 5) == 
5db0: 30 29 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 73  0) {....buffer_s
5dc0: 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e  t->headers.host.
5dd0: 70 72 65 73 65 6e 74 20 3d 20 31 3b 0a 0a 09 09  present = 1;....
5de0: 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 73 74  .workbuffer = st
5df0: 72 70 62 72 6b 28 62 75 66 66 65 72 20 2b 20 35  rpbrk(buffer + 5
5e00: 2c 20 22 5c 72 5c 6e 3a 22 29 3b 0a 09 09 09 69  , "\r\n:");....i
5e10: 66 20 28 77 6f 72 6b 62 75 66 66 65 72 20 21 3d  f (workbuffer !=
5e20: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 77 6f   NULL) {.....*wo
5e30: 72 6b 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b  rkbuffer = '\0';
5e40: 0a 09 09 09 7d 0a 0a 09 09 09 77 6f 72 6b 62 75  ....}.....workbu
5e50: 66 66 65 72 20 3d 20 62 75 66 66 65 72 20 2b 20  ffer = buffer + 
5e60: 35 3b 0a 09 09 09 77 68 69 6c 65 20 28 2a 77 6f  5;....while (*wo
5e70: 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 20 27 29  rkbuffer == ' ')
5e80: 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65   {.....workbuffe
5e90: 72 2b 2b 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 74  r++;....}.....st
5ea0: 72 63 70 79 28 62 75 66 66 65 72 5f 73 74 2d 3e  rcpy(buffer_st->
5eb0: 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 68 6f 73  headers.host.hos
5ec0: 74 2c 20 77 6f 72 6b 62 75 66 66 65 72 29 3b 0a  t, workbuffer);.
5ed0: 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72  ..} else if (str
5ee0: 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c  ncasecmp(buffer,
5ef0: 20 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 4b 65   "Connection: Ke
5f00: 65 70 2d 41 6c 69 76 65 22 2c 20 32 32 29 20 3d  ep-Alive", 22) =
5f10: 3d 20 30 29 20 7b 0a 09 09 09 62 75 66 66 65 72  = 0) {....buffer
5f20: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e  _st->headers.con
5f30: 6e 65 63 74 69 6f 6e 20 3d 20 46 49 4c 45 44 5f  nection = FILED_
5f40: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f  CONNECTION_KEEP_
5f50: 41 4c 49 56 45 3b 0a 09 09 7d 0a 0a 09 09 69 66  ALIVE;...}....if
5f60: 20 28 6d 65 6d 63 6d 70 28 62 75 66 66 65 72 2c   (memcmp(buffer,
5f70: 20 22 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d 20 30   "\r\n", 2) == 0
5f80: 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ) {....break;...
5f90: 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  }..}.../* Determ
5fa0: 69 6e 65 20 72 61 6e 67 65 20 2a 2f 0a 09 69 66  ine range */..if
5fb0: 20 28 72 61 6e 67 65 5f 65 6e 64 20 21 3d 20 30   (range_end != 0
5fc0: 29 20 7b 0a 09 09 69 66 20 28 72 61 6e 67 65 5f  ) {...if (range_
5fd0: 65 6e 64 20 3c 3d 20 72 61 6e 67 65 5f 73 74 61  end <= range_sta
5fe0: 72 74 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28  rt) {....return(
5ff0: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 72 61  NULL);...}....ra
6000: 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 72 61 6e  nge_length = ran
6010: 67 65 5f 65 6e 64 20 2d 20 72 61 6e 67 65 5f 73  ge_end - range_s
6020: 74 61 72 74 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c  tart;....filed_l
6030: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f  og_msg_debug("Co
6040: 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68 20 70  mputing length p
6050: 61 72 61 6d 65 74 65 72 3a 20 25 6c 6c 75 20 3d  arameter: %llu =
6060: 20 25 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c 0a 09   %llu - %llu",..
6070: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
6080: 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 6c 65 6e   long) range_len
6090: 67 74 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65  gth,....(unsigne
60a0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e  d long long) ran
60b0: 67 65 5f 65 6e 64 2c 0a 09 09 09 28 75 6e 73 69  ge_end,....(unsi
60c0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
60d0: 72 61 6e 67 65 5f 73 74 61 72 74 0a 09 09 29 3b  range_start...);
60e0: 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20 75 70  ..}.../* Fill up
60f0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 72 65   structure to re
6100: 74 75 72 6e 20 2a 2f 0a 09 62 75 66 66 65 72 5f  turn */..buffer_
6110: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
6120: 65 2e 70 72 65 73 65 6e 74 20 3d 20 72 61 6e 67  e.present = rang
6130: 65 5f 72 65 71 75 65 73 74 3b 0a 09 62 75 66 66  e_request;..buff
6140: 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  er_st->headers.r
6150: 61 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d 20 72  ange.offset  = r
6160: 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62 75 66  ange_start;..buf
6170: 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e  fer_st->headers.
6180: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20 3d 20  range.length  = 
6190: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 0a 09  range_length;...
61a0: 2f 2a 20 49 66 20 76 68 6f 73 74 73 20 61 72 65  /* If vhosts are
61b0: 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6d 70 75 74   enabled, comput
61c0: 65 20 6e 65 77 20 70 61 74 68 20 2a 2f 0a 09 69  e new path */..i
61d0: 66 20 28 6f 70 74 69 6f 6e 73 2d 3e 76 68 6f 73  f (options->vhos
61e0: 74 73 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09  ts_enabled) {...
61f0: 69 66 20 28 62 75 66 66 65 72 5f 73 74 2d 3e 68  if (buffer_st->h
6200: 65 61 64 65 72 73 2e 68 6f 73 74 2e 70 72 65 73  eaders.host.pres
6210: 65 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 62  ent == 1) {....b
6220: 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73  uffer = buffer_s
6230: 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 09 09 62 75  t->tmpbuf;....bu
6240: 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  ffer_len = sizeo
6250: 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70  f(buffer_st->tmp
6260: 62 75 66 29 3b 0a 0a 09 09 09 73 6e 70 72 69 6e  buf);.....snprin
6270: 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74  tf_ret = snprint
6280: 66 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  f(buffer, buffer
6290: 5f 6c 65 6e 2c 20 22 2f 25 73 25 73 25 73 22 2c  _len, "/%s%s%s",
62a0: 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  .....buffer_st->
62b0: 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 68 6f 73  headers.host.hos
62c0: 74 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74  t,.....buffer_st
62d0: 2d 3e 70 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27  ->path[0] == '/'
62e0: 20 3f 20 22 22 20 3a 20 22 2f 22 2c 0a 09 09 09   ? "" : "/",....
62f0: 09 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68  .buffer_st->path
6300: 0a 09 09 09 29 3b 0a 09 09 09 69 66 20 28 73 6e  ....);....if (sn
6310: 70 72 69 6e 74 66 5f 72 65 74 20 3e 3d 20 30 29  printf_ret >= 0)
6320: 20 7b 0a 09 09 09 09 69 66 20 28 28 28 75 6e 73   {.....if (((uns
6330: 69 67 6e 65 64 20 69 6e 74 29 20 73 6e 70 72 69  igned int) snpri
6340: 6e 74 66 5f 72 65 74 29 20 3c 20 62 75 66 66 65  ntf_ret) < buffe
6350: 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 09 73 74  r_len) {......st
6360: 72 63 70 79 28 62 75 66 66 65 72 5f 73 74 2d 3e  rcpy(buffer_st->
6370: 70 61 74 68 2c 20 62 75 66 66 65 72 29 3b 0a 09  path, buffer);..
6380: 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  ...}....}...}..}
6390: 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72  ...return(buffer
63a0: 5f 73 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  _st);.}../* Retu
63b0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 70 61 67 65  rn an error page
63c0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
63d0: 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65  filed_error_page
63e0: 28 46 49 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74  (FILE *fp, const
63f0: 20 63 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72   char *date_curr
6400: 65 6e 74 2c 20 69 6e 74 20 65 72 72 6f 72 5f 6e  ent, int error_n
6410: 75 6d 62 65 72 2c 20 69 6e 74 20 6d 65 74 68 6f  umber, int metho
6420: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72  d, const char *r
6430: 65 61 73 6f 6e 2c 20 73 74 72 75 63 74 20 66 69  eason, struct fi
6440: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c  led_log_entry *l
6450: 6f 67 29 20 7b 0a 09 63 68 61 72 20 2a 65 72 72  og) {..char *err
6460: 6f 72 5f 73 74 72 69 6e 67 20 3d 20 22 3c 68 74  or_string = "<ht
6470: 6d 6c 3e 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e  ml><head><title>
6480: 45 52 52 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f 68  ERROR</title></h
6490: 65 61 64 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c 65  ead><body>Unable
64a0: 20 74 6f 20 70 72 6f 63 65 73 73 20 72 65 71 75   to process requ
64b0: 65 73 74 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c  est</body></html
64c0: 3e 22 3b 0a 0a 09 66 70 72 69 6e 74 66 28 66 70  >";...fprintf(fp
64d0: 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69 20 4e  , "HTTP/1.1 %i N
64e0: 6f 74 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25  ot OK\r\nDate: %
64f0: 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c  s\r\nServer: fil
6500: 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66  ed\r\nLast-Modif
6510: 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65  ied: %s\r\nConte
6520: 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c  nt-Length: %llu\
6530: 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a  r\nContent-Type:
6540: 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f   %s\r\nConnectio
6550: 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c 6e  n: close\r\n\r\n
6560: 22 2c 0a 09 09 65 72 72 6f 72 5f 6e 75 6d 62 65  ",...error_numbe
6570: 72 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e  r,...date_curren
6580: 74 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e  t,...date_curren
6590: 74 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  t,...(unsigned l
65a0: 6f 6e 67 20 6c 6f 6e 67 29 20 73 74 72 6c 65 6e  ong long) strlen
65b0: 28 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 2c 0a  (error_string),.
65c0: 09 09 22 74 65 78 74 2f 68 74 6d 6c 22 0a 09 29  .."text/html"..)
65d0: 3b 0a 0a 09 2f 2a 20 73 69 6c 65 6e 63 65 20 65  ;.../* silence e
65e0: 72 72 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20  rror string for 
65f0: 48 45 41 44 20 72 65 71 75 65 73 74 73 20 2a 2f  HEAD requests */
6600: 0a 09 69 66 20 28 6d 65 74 68 6f 64 20 21 3d 20  ..if (method != 
6610: 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45  FILED_REQUEST_ME
6620: 54 48 4f 44 5f 48 45 41 44 29 20 7b 0a 09 09 66  THOD_HEAD) {...f
6630: 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73 22 2c  printf(fp, "%s",
6640: 20 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 3b 0a   error_string);.
6650: 09 7d 0a 0a 09 2f 2a 20 4c 6f 67 20 65 72 72 6f  .}.../* Log erro
6660: 72 20 2a 2f 0a 09 2f 2a 2a 20 72 65 61 73 6f 6e  r */../** reason
6670: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
6680: 20 67 6c 6f 62 61 6c 6c 79 20 61 6c 6c 6f 63 61   globally alloca
6690: 74 65 64 20 76 61 6c 75 65 20 2a 2a 2f 0a 09 6c  ted value **/..l
66a0: 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 72 65 61  og->reason = rea
66b0: 73 6f 6e 3b 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f  son;..log->http_
66c0: 63 6f 64 65 20 3d 20 65 72 72 6f 72 5f 6e 75 6d  code = error_num
66d0: 62 65 72 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  ber;...filed_log
66e0: 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 2f  _entry(log);.../
66f0: 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69  * Close connecti
6700: 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64 5f 73 6f 63  on */..filed_soc
6710: 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65  kettimeout_close
6720: 28 66 69 6c 65 6e 6f 28 66 70 29 29 3b 0a 0a 09  (fileno(fp));...
6730: 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65  fclose(fp);...re
6740: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  turn;.}../* Retu
6750: 72 6e 20 61 20 72 65 64 69 72 65 63 74 20 74 6f  rn a redirect to
6760: 20 69 6e 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 73   index.html */.s
6770: 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64  tatic void filed
6780: 5f 72 65 64 69 72 65 63 74 5f 69 6e 64 65 78 28  _redirect_index(
6790: 46 49 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20  FILE *fp, const 
67a0: 63 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65  char *date_curre
67b0: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  nt, const char *
67c0: 70 61 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c  path, struct fil
67d0: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f  ed_log_entry *lo
67e0: 67 29 20 7b 0a 09 69 6e 74 20 68 74 74 70 5f 63  g) {..int http_c
67f0: 6f 64 65 20 3d 20 33 30 31 3b 0a 09 66 70 72 69  ode = 301;..fpri
6800: 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f 31 2e  ntf(fp, "HTTP/1.
6810: 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a  1 %i OK\r\nDate:
6820: 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66   %s\r\nServer: f
6830: 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64  iled\r\nLast-Mod
6840: 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e  ified: %s\r\nCon
6850: 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 30 5c 72  tent-Length: 0\r
6860: 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c  \nConnection: cl
6870: 6f 73 65 5c 72 5c 6e 4c 6f 63 61 74 69 6f 6e 3a  ose\r\nLocation:
6880: 20 25 73 5c 72 5c 6e 5c 72 5c 6e 22 2c 0a 09 09   %s\r\n\r\n",...
6890: 68 74 74 70 5f 63 6f 64 65 2c 0a 09 09 64 61 74  http_code,...dat
68a0: 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74  e_current,...dat
68b0: 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09 22 69 6e  e_current,..."in
68c0: 64 65 78 2e 68 74 6d 6c 22 0a 09 29 3b 0a 0a 09  dex.html"..);...
68d0: 2f 2a 20 4c 6f 67 20 72 65 64 69 72 65 63 74 20  /* Log redirect 
68e0: 2a 2f 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20  */..log->reason 
68f0: 3d 20 22 72 65 64 69 72 65 63 74 22 3b 0a 09 6c  = "redirect";..l
6900: 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20  og->http_code = 
6910: 68 74 74 70 5f 63 6f 64 65 3b 0a 0a 09 66 69 6c  http_code;...fil
6920: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67  ed_log_entry(log
6930: 29 3b 0a 0a 09 2f 2a 20 43 6c 6f 73 65 20 63 6f  );.../* Close co
6940: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09 66 69 6c  nnection */..fil
6950: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
6960: 5f 63 6c 6f 73 65 28 66 69 6c 65 6e 6f 28 66 70  _close(fileno(fp
6970: 29 29 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29  ));...fclose(fp)
6980: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 0a 09 2f 2a  ;...return;.../*
6990: 20 43 75 72 72 65 6e 74 6c 79 20 75 6e 75 73 65   Currently unuse
69a0: 64 3a 20 70 61 74 68 20 2a 2f 0a 09 70 61 74 68  d: path */..path
69b0: 20 3d 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 43   = path;.}../* C
69c0: 6f 6e 76 65 72 74 20 61 6e 20 65 6e 75 6d 20 72  onvert an enum r
69d0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
69e0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 22 20 68 65 61  "Connection" hea
69f0: 64 65 72 20 76 61 6c 75 65 20 74 6f 20 61 20 73  der value to a s
6a00: 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  tring */.static 
6a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
6a20: 64 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 72  d_connection_str
6a30: 28 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 5f  (int connection_
6a40: 76 61 6c 75 65 29 20 7b 0a 09 73 77 69 74 63 68  value) {..switch
6a50: 20 28 63 6f 6e 6e 65 63 74 69 6f 6e 5f 76 61 6c   (connection_val
6a60: 75 65 29 20 7b 0a 09 09 63 61 73 65 20 46 49 4c  ue) {...case FIL
6a70: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c  ED_CONNECTION_CL
6a80: 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OSE:....return("
6a90: 63 6c 6f 73 65 22 29 3b 0a 09 09 63 61 73 65 20  close");...case 
6aa0: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
6ab0: 5f 4b 45 45 50 5f 41 4c 49 56 45 3a 0a 09 09 09  _KEEP_ALIVE:....
6ac0: 72 65 74 75 72 6e 28 22 6b 65 65 70 2d 61 6c 69  return("keep-ali
6ad0: 76 65 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ve");..}...retur
6ae0: 6e 28 22 63 6c 6f 73 65 22 29 3b 0a 7d 0a 0a 2f  n("close");.}../
6af0: 2a 20 48 61 6e 64 6c 65 20 61 20 73 69 6e 67 6c  * Handle a singl
6b00: 65 20 72 65 71 75 65 73 74 20 66 72 6f 6d 20 61  e request from a
6b10: 20 63 6c 69 65 6e 74 20 2a 2f 0a 73 74 61 74 69   client */.stati
6b20: 63 20 69 6e 74 20 66 69 6c 65 64 5f 68 61 6e 64  c int filed_hand
6b30: 6c 65 5f 63 6c 69 65 6e 74 28 69 6e 74 20 66 64  le_client(int fd
6b40: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68  , struct filed_h
6b50: 74 74 70 5f 72 65 71 75 65 73 74 20 2a 72 65 71  ttp_request *req
6b60: 75 65 73 74 2c 20 73 74 72 75 63 74 20 66 69 6c  uest, struct fil
6b70: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f  ed_log_entry *lo
6b80: 67 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  g, struct filed_
6b90: 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73  options *options
6ba0: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
6bb0: 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c 65  d_fileinfo *file
6bc0: 69 6e 66 6f 3b 0a 09 73 73 69 7a 65 5f 74 20 73  info;..ssize_t s
6bd0: 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 73 69  endfile_ret;..si
6be0: 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 73 69  ze_t sendfile_si
6bf0: 7a 65 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 64 66  ze;..off_t sendf
6c00: 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e 64  ile_offset, send
6c10: 66 69 6c 65 5f 73 65 6e 74 2c 20 73 65 6e 64 66  file_sent, sendf
6c20: 69 6c 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 20 2a  ile_len;..char *
6c30: 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 64 61 74  path;..char *dat
6c40: 65 5f 63 75 72 72 65 6e 74 2c 20 64 61 74 65 5f  e_current, date_
6c50: 63 75 72 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a 09  current_b[64];..
6c60: 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09  int http_code;..
6c70: 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20 44  FILE *fp;.../* D
6c80: 65 74 65 72 6d 69 6e 65 20 63 75 72 72 65 6e 74  etermine current
6c90: 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f 63   time */..date_c
6ca0: 75 72 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f 66  urrent = filed_f
6cb0: 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61 74 65 5f  ormat_time(date_
6cc0: 63 75 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65 6f  current_b, sizeo
6cd0: 66 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62  f(date_current_b
6ce0: 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b 0a  ), time(NULL));.
6cf0: 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65 74  ../* Open socket
6d00: 20 61 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f 72   as ANSI I/O for
6d10: 20 65 61 73 65 20 6f 66 20 75 73 65 20 2a 2f 0a   ease of use */.
6d20: 09 66 70 20 3d 20 66 64 6f 70 65 6e 28 66 64 2c  .fp = fdopen(fd,
6d30: 20 22 77 2b 62 22 29 3b 0a 09 69 66 20 28 66 70   "w+b");..if (fp
6d40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69   == NULL) {...fi
6d50: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
6d60: 74 5f 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09  t_close(fd);....
6d70: 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 6c 6f  close(fd);....lo
6d80: 67 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d 20 27  g->buffer[0] = '
6d90: 5c 30 27 3b 0a 09 09 6c 6f 67 2d 3e 68 74 74 70  \0';...log->http
6da0: 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a 09 09 6c 6f  _code = -1;...lo
6db0: 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 66 64 6f  g->reason = "fdo
6dc0: 70 65 6e 5f 66 61 69 6c 65 64 22 3b 0a 0a 09 09  pen_failed";....
6dd0: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28  filed_log_entry(
6de0: 6c 6f 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  log);....return(
6df0: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
6e00: 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09 72 65  _CLOSE);..}...re
6e10: 71 75 65 73 74 20 3d 20 66 69 6c 65 64 5f 67 65  quest = filed_ge
6e20: 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28 66  t_http_request(f
6e30: 70 2c 20 72 65 71 75 65 73 74 2c 20 6f 70 74 69  p, request, opti
6e40: 6f 6e 73 29 3b 0a 0a 09 69 66 20 28 72 65 71 75  ons);...if (requ
6e50: 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  est == NULL) {..
6e60: 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d 20  .log->buffer[0] 
6e70: 3d 20 27 5c 30 27 3b 0a 0a 09 09 66 69 6c 65 64  = '\0';....filed
6e80: 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20  _error_page(fp, 
6e90: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 35 30  date_current, 50
6ea0: 30 2c 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54  0, FILED_REQUEST
6eb0: 5f 4d 45 54 48 4f 44 5f 47 45 54 2c 20 22 66 6f  _METHOD_GET, "fo
6ec0: 72 6d 61 74 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09  rmat", log);....
6ed0: 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e  return(FILED_CON
6ee0: 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a  NECTION_CLOSE);.
6ef0: 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65  .}...filed_socke
6f00: 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73  ttimeout_process
6f10: 69 6e 67 5f 73 74 61 72 74 28 66 64 29 3b 0a 0a  ing_start(fd);..
6f20: 09 70 61 74 68 20 3d 20 72 65 71 75 65 73 74 2d  .path = request-
6f30: 3e 70 61 74 68 3b 0a 09 73 74 72 63 70 79 28 6c  >path;..strcpy(l
6f40: 6f 67 2d 3e 62 75 66 66 65 72 2c 20 70 61 74 68  og->buffer, path
6f50: 29 3b 0a 09 6c 6f 67 2d 3e 6d 65 74 68 6f 64 20  );..log->method 
6f60: 3d 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f  = request->metho
6f70: 64 3b 0a 0a 09 2f 2a 20 49 66 20 74 68 65 20 72  d;.../* If the r
6f80: 65 71 75 65 73 74 65 64 20 70 61 74 68 20 69 73  equested path is
6f90: 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 72 65   a directory, re
6fa0: 64 69 72 65 63 74 20 74 6f 20 69 6e 64 65 78 20  direct to index 
6fb0: 70 61 67 65 20 2a 2f 0a 09 69 66 20 28 72 65 71  page */..if (req
6fc0: 75 65 73 74 2d 3e 74 79 70 65 20 3d 3d 20 46 49  uest->type == FI
6fd0: 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45  LED_REQUEST_TYPE
6fe0: 5f 44 49 52 45 43 54 4f 52 59 29 20 7b 0a 09 09  _DIRECTORY) {...
6ff0: 66 69 6c 65 64 5f 72 65 64 69 72 65 63 74 5f 69  filed_redirect_i
7000: 6e 64 65 78 28 66 70 2c 20 64 61 74 65 5f 63 75  ndex(fp, date_cu
7010: 72 72 65 6e 74 2c 20 70 61 74 68 2c 20 6c 6f 67  rrent, path, log
7020: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c  );....return(FIL
7030: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c  ED_CONNECTION_CL
7040: 4f 53 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 69  OSE);..}...filei
7050: 6e 66 6f 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e  nfo = filed_open
7060: 5f 66 69 6c 65 28 70 61 74 68 2c 20 26 72 65 71  _file(path, &req
7070: 75 65 73 74 2d 3e 66 69 6c 65 69 6e 66 6f 29 3b  uest->fileinfo);
7080: 0a 09 69 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d  ..if (fileinfo =
7090: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65  = NULL) {...file
70a0: 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c  d_error_page(fp,
70b0: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34   date_current, 4
70c0: 30 34 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65 74  04, request->met
70d0: 68 6f 64 2c 20 22 6f 70 65 6e 5f 66 61 69 6c 65  hod, "open_faile
70e0: 64 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72 65 74  d", log);....ret
70f0: 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  urn(FILED_CONNEC
7100: 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a  TION_CLOSE);..}.
7110: 0a 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
7120: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 70 72 65  eaders.range.pre
7130: 73 65 6e 74 29 20 7b 0a 09 09 69 66 20 28 72 65  sent) {...if (re
7140: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
7150: 61 6e 67 65 2e 6f 66 66 73 65 74 20 21 3d 20 30  ange.offset != 0
7160: 20 7c 7c 20 72 65 71 75 65 73 74 2d 3e 68 65 61   || request->hea
7170: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
7180: 68 20 3e 3d 20 30 29 20 7b 0a 09 09 09 69 66 20  h >= 0) {....if 
7190: 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72  (request->header
71a0: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3e  s.range.offset >
71b0: 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 29  = fileinfo->len)
71c0: 20 7b 0a 09 09 09 09 66 69 6c 65 64 5f 65 72 72   {.....filed_err
71d0: 6f 72 5f 70 61 67 65 28 66 70 2c 20 64 61 74 65  or_page(fp, date
71e0: 5f 63 75 72 72 65 6e 74 2c 20 34 31 36 2c 20 72  _current, 416, r
71f0: 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 2c 20  equest->method, 
7200: 22 72 61 6e 67 65 5f 69 6e 76 61 6c 69 64 22 2c  "range_invalid",
7210: 20 6c 6f 67 29 3b 0a 0a 09 09 09 09 63 6c 6f 73   log);......clos
7220: 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b  e(fileinfo->fd);
7230: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 46 49 4c  ......return(FIL
7240: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c  ED_CONNECTION_CL
7250: 4f 53 45 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  OSE);....}.....i
7260: 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  f (request->head
7270: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
7280: 20 3d 3d 20 28 28 6f 66 66 5f 74 29 20 2d 31 29   == ((off_t) -1)
7290: 29 20 7b 0a 09 09 09 09 66 69 6c 65 64 5f 6c 6f  ) {.....filed_lo
72a0: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d  g_msg_debug("Com
72b0: 70 75 74 69 6e 67 20 6c 65 6e 67 74 68 20 74 6f  puting length to
72c0: 20 66 69 74 20 69 6e 20 62 6f 75 6e 64 73 3a 20   fit in bounds: 
72d0: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 3d 20  fileinfo->len = 
72e0: 25 6c 6c 75 2c 20 72 65 71 75 65 73 74 2d 3e 68  %llu, request->h
72f0: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
7300: 73 65 74 20 3d 20 25 6c 6c 75 22 2c 0a 09 09 09  set = %llu",....
7310: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
7320: 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d   long) fileinfo-
7330: 3e 6c 65 6e 2c 0a 09 09 09 09 09 28 75 6e 73 69  >len,......(unsi
7340: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
7350: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7360: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09  .range.offset...
7370: 09 09 29 3b 0a 0a 09 09 09 09 72 65 71 75 65 73  ..);......reques
7380: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
7390: 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e  .length = filein
73a0: 66 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75 65 73  fo->len - reques
73b0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
73c0: 2e 6f 66 66 73 65 74 3b 0a 09 09 09 7d 0a 0a 09  .offset;....}...
73d0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
73e0: 64 65 62 75 67 28 22 50 61 72 74 69 61 6c 20 72  debug("Partial r
73f0: 65 71 75 65 73 74 2c 20 73 74 61 72 74 69 6e 67  equest, starting
7400: 20 61 74 3a 20 25 6c 6c 75 20 61 6e 64 20 72 75   at: %llu and ru
7410: 6e 6e 69 6e 67 20 66 6f 72 20 25 6c 6c 69 20 62  nning for %lli b
7420: 79 74 65 73 22 2c 0a 09 09 09 09 28 75 6e 73 69  ytes",.....(unsi
7430: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
7440: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7450: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09  .range.offset,..
7460: 09 09 09 28 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ...(long long) r
7470: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
7480: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 0a 09 09 09  range.length....
7490: 29 3b 0a 0a 09 09 7d 0a 0a 09 09 68 74 74 70 5f  );....}....http_
74a0: 63 6f 64 65 20 3d 20 32 30 36 3b 0a 09 7d 20 65  code = 206;..} e
74b0: 6c 73 65 20 7b 0a 09 09 68 74 74 70 5f 63 6f 64  lse {...http_cod
74c0: 65 20 3d 20 32 30 30 3b 0a 0a 09 09 2f 2a 20 43  e = 200;..../* C
74d0: 6f 6d 70 75 74 65 20 66 61 6b 65 20 72 61 6e 67  ompute fake rang
74e0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  e parameters tha
74f0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 65  t includes the e
7500: 6e 74 69 72 65 20 66 69 6c 65 20 2a 2f 0a 09 09  ntire file */...
7510: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7520: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20  .range.offset = 
7530: 30 3b 0a 09 09 72 65 71 75 65 73 74 2d 3e 68 65  0;...request->he
7540: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
7550: 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  th = fileinfo->l
7560: 65 6e 3b 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66  en;..}...fprintf
7570: 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25  (fp, "HTTP/1.1 %
7580: 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73  i OK\r\nDate: %s
7590: 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65  \r\nServer: file
75a0: 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69  d\r\nLast-Modifi
75b0: 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e  ed: %s\r\nConten
75c0: 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72  t-Length: %llu\r
75d0: 5c 6e 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a  \nAccept-Ranges:
75e0: 20 62 79 74 65 73 5c 72 5c 6e 43 6f 6e 74 65 6e   bytes\r\nConten
75f0: 74 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f  t-Type: %s\r\nCo
7600: 6e 6e 65 63 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e  nnection: %s\r\n
7610: 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e  ETag: \"%s\"\r\n
7620: 22 2c 0a 09 09 68 74 74 70 5f 63 6f 64 65 2c 0a  ",...http_code,.
7630: 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a  ..date_current,.
7640: 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c 61 73 74  ..fileinfo->last
7650: 6d 6f 64 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64  mod,...(unsigned
7660: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75   long long) requ
7670: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
7680: 67 65 2e 6c 65 6e 67 74 68 2c 0a 09 09 66 69 6c  ge.length,...fil
7690: 65 69 6e 66 6f 2d 3e 74 79 70 65 2c 0a 09 09 66  einfo->type,...f
76a0: 69 6c 65 64 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f  iled_connection_
76b0: 73 74 72 28 72 65 71 75 65 73 74 2d 3e 68 65 61  str(request->hea
76c0: 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 29  ders.connection)
76d0: 2c 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 65 74  ,...fileinfo->et
76e0: 61 67 0a 09 29 3b 0a 0a 09 69 66 20 28 68 74 74  ag..);...if (htt
76f0: 70 5f 63 6f 64 65 20 3d 3d 20 32 30 36 29 20 7b  p_code == 206) {
7700: 0a 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  ...fprintf(fp, "
7710: 43 6f 6e 74 65 6e 74 2d 52 61 6e 67 65 3a 20 62  Content-Range: b
7720: 79 74 65 73 20 25 6c 6c 75 2d 25 6c 6c 75 2f 25  ytes %llu-%llu/%
7730: 6c 6c 75 5c 72 5c 6e 22 2c 0a 09 09 09 28 75 6e  llu\r\n",....(un
7740: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
7750: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
7760: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c  rs.range.offset,
7770: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
7780: 6e 67 20 6c 6f 6e 67 29 20 28 72 65 71 75 65 73  ng long) (reques
7790: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
77a0: 2e 6f 66 66 73 65 74 20 2b 20 72 65 71 75 65 73  .offset + reques
77b0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
77c0: 2e 6c 65 6e 67 74 68 20 2d 20 31 29 2c 0a 09 09  .length - 1),...
77d0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
77e0: 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e  long) fileinfo->
77f0: 6c 65 6e 0a 09 09 29 3b 0a 09 7d 0a 09 66 70 72  len...);..}..fpr
7800: 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c 6e 22 29  intf(fp, "\r\n")
7810: 3b 0a 09 66 66 6c 75 73 68 28 66 70 29 3b 0a 0a  ;..fflush(fp);..
7820: 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20  .log->http_code 
7830: 3d 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09 6c 6f  = http_code;..lo
7840: 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 4f 4b 22  g->reason = "OK"
7850: 3b 0a 09 6c 6f 67 2d 3e 73 74 61 72 74 74 69 6d  ;..log->starttim
7860: 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a  e = time(NULL);.
7870: 09 6c 6f 67 2d 3e 72 65 71 5f 6f 66 66 73 65 74  .log->req_offset
7880: 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64   = request->head
7890: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
78a0: 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f 6c 65 6e 67  ;..log->req_leng
78b0: 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65  th = request->he
78c0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
78d0: 74 68 3b 0a 09 6c 6f 67 2d 3e 66 69 6c 65 5f 6c  th;..log->file_l
78e0: 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f  ength = fileinfo
78f0: 2d 3e 6c 65 6e 3b 0a 0a 23 69 66 64 65 66 20 46  ->len;..#ifdef F
7900: 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48 54  ILED_NONBLOCK_HT
7910: 54 50 0a 09 69 6e 74 20 73 6f 63 6b 65 74 5f 66  TP..int socket_f
7920: 6c 61 67 73 3b 0a 09 66 64 5f 73 65 74 20 72 66  lags;..fd_set rf
7930: 64 2c 20 77 66 64 3b 0a 09 63 68 61 72 20 73 69  d, wfd;..char si
7940: 6e 6b 62 75 66 5b 38 31 39 32 5d 3b 0a 09 73 73  nkbuf[8192];..ss
7950: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
7960: 0a 09 46 44 5f 5a 45 52 4f 28 26 72 66 64 29 3b  ..FD_ZERO(&rfd);
7970: 0a 09 46 44 5f 5a 45 52 4f 28 26 77 66 64 29 3b  ..FD_ZERO(&wfd);
7980: 0a 09 46 44 5f 53 45 54 28 66 64 2c 20 26 72 66  ..FD_SET(fd, &rf
7990: 64 29 3b 0a 09 46 44 5f 53 45 54 28 66 64 2c 20  d);..FD_SET(fd, 
79a0: 26 77 66 64 29 3b 0a 0a 09 73 6f 63 6b 65 74 5f  &wfd);...socket_
79b0: 66 6c 61 67 73 20 3d 20 66 63 6e 74 6c 28 66 64  flags = fcntl(fd
79c0: 2c 20 46 5f 47 45 54 46 4c 29 3b 0a 09 66 63 6e  , F_GETFL);..fcn
79d0: 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 4c 2c 20  tl(fd, F_SETFL, 
79e0: 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 7c 20 4f  socket_flags | O
79f0: 5f 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a 23 65 6e 64  _NONBLOCK);.#end
7a00: 69 66 0a 09 73 65 6e 64 66 69 6c 65 5f 6f 66 66  if..sendfile_off
7a10: 73 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68  set = request->h
7a20: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
7a30: 73 65 74 3b 0a 09 73 65 6e 64 66 69 6c 65 5f 6c  set;..sendfile_l
7a40: 65 6e 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65  en = request->he
7a50: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
7a60: 74 68 3b 0a 09 73 65 6e 64 66 69 6c 65 5f 73 65  th;..sendfile_se
7a70: 6e 74 20 3d 20 30 3b 0a 09 77 68 69 6c 65 20 28  nt = 0;..while (
7a80: 72 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 20  request->method 
7a90: 3d 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54  == FILED_REQUEST
7aa0: 5f 4d 45 54 48 4f 44 5f 47 45 54 29 20 7b 0a 09  _METHOD_GET) {..
7ab0: 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65  .if (sendfile_le
7ac0: 6e 20 3e 20 46 49 4c 45 44 5f 53 45 4e 44 46 49  n > FILED_SENDFI
7ad0: 4c 45 5f 4d 41 58 29 20 7b 0a 09 09 09 73 65 6e  LE_MAX) {....sen
7ae0: 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 46 49 4c  dfile_size = FIL
7af0: 45 44 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 3b  ED_SENDFILE_MAX;
7b00: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73  ...} else {....s
7b10: 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 73  endfile_size = s
7b20: 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09 09 7d  endfile_len;...}
7b30: 0a 0a 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74  ....sendfile_ret
7b40: 20 3d 20 73 65 6e 64 66 69 6c 65 28 66 64 2c 20   = sendfile(fd, 
7b50: 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c 20 26 73  fileinfo->fd, &s
7b60: 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20  endfile_offset, 
7b70: 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 29 3b 0a  sendfile_size);.
7b80: 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 72  ..if (sendfile_r
7b90: 65 74 20 3c 3d 20 30 29 20 7b 0a 23 69 66 64 65  et <= 0) {.#ifde
7ba0: 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b  f FILED_NONBLOCK
7bb0: 5f 48 54 54 50 0a 09 09 09 69 66 20 28 65 72 72  _HTTP....if (err
7bc0: 6e 6f 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a  no == EAGAIN) {.
7bd0: 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74  ....sendfile_ret
7be0: 20 3d 20 30 3b 0a 0a 09 09 09 09 77 68 69 6c 65   = 0;......while
7bf0: 20 28 31 29 20 7b 0a 09 09 09 09 09 73 65 6c 65   (1) {......sele
7c00: 63 74 28 66 64 20 2b 20 31 2c 20 26 72 66 64 2c  ct(fd + 1, &rfd,
7c10: 20 26 77 66 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   &wfd, NULL, NUL
7c20: 4c 29 3b 0a 09 09 09 09 09 69 66 20 28 46 44 5f  L);......if (FD_
7c30: 49 53 53 45 54 28 66 64 2c 20 26 72 66 64 29 29  ISSET(fd, &rfd))
7c40: 20 7b 0a 09 09 09 09 09 09 72 65 61 64 5f 72 65   {.......read_re
7c50: 74 20 3d 20 72 65 61 64 28 66 64 2c 20 73 69 6e  t = read(fd, sin
7c60: 6b 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 6e  kbuf, sizeof(sin
7c70: 6b 62 75 66 29 29 3b 0a 0a 09 09 09 09 09 09 69  kbuf));........i
7c80: 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  f (read_ret <= 0
7c90: 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  ) {........break
7ca0: 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
7cb0: 0a 0a 09 09 09 09 09 69 66 20 28 46 44 5f 49 53  .......if (FD_IS
7cc0: 53 45 54 28 66 64 2c 20 26 77 66 64 29 29 20 7b  SET(fd, &wfd)) {
7cd0: 0a 09 09 09 09 09 09 72 65 61 64 5f 72 65 74 20  .......read_ret 
7ce0: 3d 20 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  = 1;........brea
7cf0: 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
7d00: 0a 09 09 09 09 69 66 20 28 72 65 61 64 5f 72 65  .....if (read_re
7d10: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 62  t <= 0) {......b
7d20: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
7d30: 20 65 6c 73 65 20 7b 0a 09 09 09 09 62 72 65 61   else {.....brea
7d40: 6b 3b 0a 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09  k;....}.#else...
7d50: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09  .break;.#endif..
7d60: 09 7d 0a 0a 09 09 73 65 6e 64 66 69 6c 65 5f 6c  .}....sendfile_l
7d70: 65 6e 20 2d 3d 20 73 65 6e 64 66 69 6c 65 5f 72  en -= sendfile_r
7d80: 65 74 3b 0a 09 09 73 65 6e 64 66 69 6c 65 5f 73  et;...sendfile_s
7d90: 65 6e 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 5f  ent += sendfile_
7da0: 72 65 74 3b 0a 09 09 69 66 20 28 73 65 6e 64 66  ret;...if (sendf
7db0: 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  ile_len == 0) {.
7dc0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
7dd0: 0a 0a 09 6c 6f 67 2d 3e 65 6e 64 74 69 6d 65 20  ...log->endtime 
7de0: 3d 20 28 74 69 6d 65 5f 74 29 20 2d 31 3b 0a 09  = (time_t) -1;..
7df0: 6c 6f 67 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68  log->sent_length
7e00: 20 3d 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74   = sendfile_sent
7e10: 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  ;...filed_log_en
7e20: 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 63 6c 6f 73  try(log);...clos
7e30: 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b  e(fileinfo->fd);
7e40: 0a 0a 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e  ...if (request->
7e50: 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69  headers.connecti
7e60: 6f 6e 20 21 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e  on != FILED_CONN
7e70: 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56  ECTION_KEEP_ALIV
7e80: 45 29 20 7b 0a 09 09 66 69 6c 65 64 5f 73 6f 63  E) {...filed_soc
7e90: 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65  kettimeout_close
7ea0: 28 66 64 29 3b 0a 0a 09 09 66 63 6c 6f 73 65 28  (fd);....fclose(
7eb0: 66 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46  fp);....return(F
7ec0: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
7ed0: 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c  CLOSE);..}...fil
7ee0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
7ef0: 5f 70 72 6f 63 65 73 73 69 6e 67 5f 65 6e 64 28  _processing_end(
7f00: 66 64 29 3b 0a 0a 09 72 65 74 75 72 6e 28 46 49  fd);...return(FI
7f10: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b  LED_CONNECTION_K
7f20: 45 45 50 5f 41 4c 49 56 45 29 3b 0a 7d 0a 0a 2f  EEP_ALIVE);.}../
7f30: 2a 20 48 61 6e 64 6c 65 20 69 6e 63 6f 6d 69 6e  * Handle incomin
7f40: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
7f50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69  .static void *fi
7f60: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
7f70: 64 28 76 6f 69 64 20 2a 61 72 67 5f 76 29 20 7b  d(void *arg_v) {
7f80: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  ..struct filed_w
7f90: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
7fa0: 73 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20  s *arg;..struct 
7fb0: 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65  filed_http_reque
7fc0: 73 74 20 72 65 71 75 65 73 74 3b 0a 09 73 74 72  st request;..str
7fd0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
7fe0: 74 72 79 20 2a 6c 6f 67 2c 20 6c 6f 63 61 6c 5f  try *log, local_
7ff0: 64 75 6d 6d 79 5f 6c 6f 67 3b 0a 09 73 74 72 75  dummy_log;..stru
8000: 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73  ct filed_options
8010: 20 2a 6f 70 74 69 6f 6e 73 3b 0a 09 73 74 72 75   *options;..stru
8020: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  ct sockaddr_in6 
8030: 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74  addr;..socklen_t
8040: 20 61 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66   addrlen;..int f
8050: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30  ailure_count = 0
8060: 2c 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f  , max_failure_co
8070: 75 6e 74 20 3d 20 46 49 4c 45 44 5f 4d 41 58 5f  unt = FILED_MAX_
8080: 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a 09  FAILURE_COUNT;..
8090: 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73  int connection_s
80a0: 74 61 74 65 20 3d 20 46 49 4c 45 44 5f 43 4f 4e  tate = FILED_CON
80b0: 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 3b 0a 09  NECTION_CLOSE;..
80c0: 69 6e 74 20 6d 61 73 74 65 72 5f 66 64 2c 20 66  int master_fd, f
80d0: 64 20 3d 20 2d 31 3b 0a 0a 09 2f 2a 20 52 65 61  d = -1;.../* Rea
80e0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09  d arguments */..
80f0: 61 72 67 20 3d 20 61 72 67 5f 76 3b 0a 0a 09 6d  arg = arg_v;...m
8100: 61 73 74 65 72 5f 66 64 20 3d 20 61 72 67 2d 3e  aster_fd = arg->
8110: 66 64 3b 0a 09 6f 70 74 69 6f 6e 73 20 3d 20 26  fd;..options = &
8120: 61 72 67 2d 3e 6f 70 74 69 6f 6e 73 3b 0a 0a 09  arg->options;...
8130: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 2f 2a  while (1) {.../*
8140: 20 46 61 69 6c 75 72 65 20 6c 6f 6f 70 20 70 72   Failure loop pr
8150: 65 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 09 69 66  evention */...if
8160: 20 28 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20   (failure_count 
8170: 3e 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f  > max_failure_co
8180: 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b  unt) {....break;
8190: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 41 6c 6c 6f 63  ...}..../* Alloc
81a0: 61 74 65 20 61 20 6e 65 77 20 6c 6f 67 20 62 75  ate a new log bu
81b0: 66 66 65 72 20 2a 2f 0a 09 09 6c 6f 67 20 3d 20  ffer */...log = 
81c0: 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 31 29  filed_log_new(1)
81d0: 3b 0a 09 09 69 66 20 28 6c 6f 67 20 3d 3d 20 4e  ;...if (log == N
81e0: 55 4c 4c 29 20 7b 0a 09 09 09 66 69 6c 65 64 5f  ULL) {....filed_
81f0: 6c 6f 67 5f 6d 73 67 28 22 41 4c 4c 4f 43 41 54  log_msg("ALLOCAT
8200: 45 5f 4c 4f 47 5f 4d 53 47 5f 46 41 49 4c 45 44  E_LOG_MSG_FAILED
8210: 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ");.....break;..
8220: 09 7d 0a 0a 09 09 6c 6f 67 2d 3e 74 79 70 65 20  .}....log->type 
8230: 3d 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45  = FILED_LOG_TYPE
8240: 5f 54 52 41 4e 53 46 45 52 3b 0a 0a 09 09 2f 2a  _TRANSFER;..../*
8250: 20 49 66 20 77 65 20 63 6c 6f 73 65 64 20 74 68   If we closed th
8260: 65 20 6f 6c 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  e old connection
8270: 2c 20 61 63 63 65 70 74 20 61 20 6e 65 77 20 6f  , accept a new o
8280: 6e 65 20 2a 2f 0a 09 09 69 66 20 28 63 6f 6e 6e  ne */...if (conn
8290: 65 63 74 69 6f 6e 5f 73 74 61 74 65 20 3d 3d 20  ection_state == 
82a0: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
82b0: 5f 43 4c 4f 53 45 29 20 7b 0a 09 09 09 2f 2a 20  _CLOSE) {..../* 
82c0: 41 63 63 65 70 74 20 61 20 6e 65 77 20 63 6c 69  Accept a new cli
82d0: 65 6e 74 20 2a 2f 0a 09 09 09 61 64 64 72 6c 65  ent */....addrle
82e0: 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 29  n = sizeof(addr)
82f0: 3b 0a 0a 09 09 09 66 64 20 3d 20 61 63 63 65 70  ;.....fd = accep
8300: 74 28 6d 61 73 74 65 72 5f 66 64 2c 20 28 73 74  t(master_fd, (st
8310: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29  ruct sockaddr *)
8320: 20 26 61 64 64 72 2c 20 26 61 64 64 72 6c 65 6e   &addr, &addrlen
8330: 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 0a 09 09 20  );...}..../*... 
8340: 2a 20 49 66 20 77 65 20 66 61 69 6c 2c 20 6d 61  * If we fail, ma
8350: 6b 65 20 61 20 6e 6f 74 65 20 6f 66 20 69 74 20  ke a note of it 
8360: 73 6f 20 77 65 20 64 6f 6e 27 74 20 67 6f 20 69  so we don't go i
8370: 6e 74 6f 20 61 20 6c 6f 6f 70 20 6f 66 0a 09 09  nto a loop of...
8380: 20 2a 20 61 63 63 65 70 74 28 29 20 66 61 69 6c   * accept() fail
8390: 69 6e 67 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28  ing... */...if (
83a0: 66 64 20 3c 20 30 29 20 7b 0a 09 09 09 2f 2a 20  fd < 0) {..../* 
83b0: 4c 6f 67 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  Log the new conn
83c0: 65 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 66 69 6c  ection */....fil
83d0: 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 41 43 43 45  ed_log_msg("ACCE
83e0: 50 54 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09  PT_FAILED");....
83f0: 09 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 2b 2b  .failure_count++
8400: 3b 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ;.....filed_log_
8410: 66 72 65 65 28 6c 6f 67 29 3b 0a 0a 09 09 09 63  free(log);.....c
8420: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
8430: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
8440: 6f 75 74 5f 61 63 63 65 70 74 28 66 64 29 3b 0a  out_accept(fd);.
8450: 0a 09 09 2f 2a 20 46 69 6c 6c 20 69 6e 20 6c 6f  .../* Fill in lo
8460: 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 09  g structure */..
8470: 09 69 66 20 28 66 69 6c 65 64 5f 6c 6f 67 5f 69  .if (filed_log_i
8480: 70 28 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64  p((struct sockad
8490: 64 72 20 2a 29 20 26 61 64 64 72 2c 20 6c 6f 67  dr *) &addr, log
84a0: 2d 3e 69 70 2c 20 73 69 7a 65 6f 66 28 6c 6f 67  ->ip, sizeof(log
84b0: 2d 3e 69 70 29 29 20 3d 3d 20 4e 55 4c 4c 29 20  ->ip)) == NULL) 
84c0: 7b 0a 09 09 09 6c 6f 67 2d 3e 69 70 5b 30 5d 20  {....log->ip[0] 
84d0: 3d 20 27 5c 30 27 3b 0a 09 09 09 6c 6f 67 2d 3e  = '\0';....log->
84e0: 70 6f 72 74 20 3d 20 30 3b 0a 09 09 7d 20 65 6c  port = 0;...} el
84f0: 73 65 20 7b 0a 09 09 09 6c 6f 67 2d 3e 70 6f 72  se {....log->por
8500: 74 20 3d 20 61 64 64 72 2e 73 69 6e 36 5f 70 6f  t = addr.sin6_po
8510: 72 74 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 52 65  rt;...}..../* Re
8520: 73 65 74 20 66 61 69 6c 75 72 65 20 63 6f 75 6e  set failure coun
8530: 74 2a 2f 0a 09 09 66 61 69 6c 75 72 65 5f 63 6f  t*/...failure_co
8540: 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 2f 2a 20 48  unt = 0;..../* H
8550: 61 6e 64 6c 65 20 73 6f 63 6b 65 74 20 2a 2f 0a  andle socket */.
8560: 09 09 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 61  ..connection_sta
8570: 74 65 20 3d 20 66 69 6c 65 64 5f 68 61 6e 64 6c  te = filed_handl
8580: 65 5f 63 6c 69 65 6e 74 28 66 64 2c 20 26 72 65  e_client(fd, &re
8590: 71 75 65 73 74 2c 20 6c 6f 67 2c 20 6f 70 74 69  quest, log, opti
85a0: 6f 6e 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65  ons);..}.../* Re
85b0: 70 6f 72 74 20 65 72 72 6f 72 20 2a 2f 0a 09 66  port error */..f
85c0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 54 48  iled_log_msg("TH
85d0: 52 45 41 44 5f 44 49 45 44 20 41 42 4e 4f 52 4d  READ_DIED ABNORM
85e0: 41 4c 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 4e  AL");...return(N
85f0: 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 6c 6f 63 61 6c  ULL);.../* local
8600: 5f 64 75 6d 6d 79 5f 6c 6f 67 20 69 73 20 6f 6e  _dummy_log is on
8610: 6c 79 20 75 73 65 64 20 69 66 20 46 49 4c 45 44  ly used if FILED
8620: 5f 44 4f 4e 54 5f 4c 4f 47 20 69 73 20 65 6e 61  _DONT_LOG is ena
8630: 62 6c 65 64 2c 20 6f 74 68 65 72 77 69 73 65 20  bled, otherwise 
8640: 69 74 27 73 20 6e 6f 74 20 75 73 65 64 2c 20 62  it's not used, b
8650: 75 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ut the compiler 
8660: 68 61 74 65 73 20 74 68 61 74 20 69 64 65 61 2e  hates that idea.
8670: 20 2a 2f 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d 79   */..local_dummy
8680: 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 30 3b 0a 09  _log.type = 0;..
8690: 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e  local_dummy_log.
86a0: 74 79 70 65 20 3d 20 6c 6f 63 61 6c 5f 64 75 6d  type = local_dum
86b0: 6d 79 5f 6c 6f 67 2e 74 79 70 65 3b 0a 7d 0a 0a  my_log.type;.}..
86c0: 2f 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72  /* Create worker
86d0: 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 61 74   threads */.stat
86e0: 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 77 6f 72  ic int filed_wor
86f0: 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74  ker_threads_init
8700: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 74 68 72  (int fd, int thr
8710: 65 61 64 5f 63 6f 75 6e 74 2c 20 73 74 72 75 63  ead_count, struc
8720: 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20  t filed_options 
8730: 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 72  *options) {..str
8740: 75 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  uct filed_worker
8750: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72  _thread_args *ar
8760: 67 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68  g;..pthread_t th
8770: 72 65 61 64 69 64 3b 0a 09 69 6e 74 20 70 74 68  readid;..int pth
8780: 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69  read_ret;..int i
8790: 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  ;...for (i = 0; 
87a0: 69 20 3c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  i < thread_count
87b0: 3b 20 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d  ; i++) {...arg =
87c0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
87d0: 61 72 67 29 29 3b 0a 0a 09 09 61 72 67 2d 3e 66  arg));....arg->f
87e0: 64 20 3d 20 66 64 3b 0a 09 09 6d 65 6d 63 70 79  d = fd;...memcpy
87f0: 28 26 61 72 67 2d 3e 6f 70 74 69 6f 6e 73 2c 20  (&arg->options, 
8800: 6f 70 74 69 6f 6e 73 2c 20 73 69 7a 65 6f 66 28  options, sizeof(
8810: 2a 6f 70 74 69 6f 6e 73 29 29 3b 0a 0a 09 09 70  *options));....p
8820: 74 68 72 65 61 64 5f 72 65 74 20 3d 20 70 74 68  thread_ret = pth
8830: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 68 72  read_create(&thr
8840: 65 61 64 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c  eadid, NULL, fil
8850: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
8860: 2c 20 61 72 67 29 3b 0a 09 09 69 66 20 28 70 74  , arg);...if (pt
8870: 68 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20  hread_ret != 0) 
8880: 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  {....return(-1);
8890: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
88a0: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 69 73 70 6c  (0);.}../* Displ
88b0: 61 79 20 68 65 6c 70 20 2a 2f 0a 73 74 61 74 69  ay help */.stati
88c0: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 70 72 69  c void filed_pri
88d0: 6e 74 5f 68 65 6c 70 28 46 49 4c 45 20 2a 6f 75  nt_help(FILE *ou
88e0: 74 70 75 74 2c 20 69 6e 74 20 6c 6f 6e 67 5f 68  tput, int long_h
88f0: 65 6c 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  elp, const char 
8900: 2a 65 78 74 72 61 29 20 7b 0a 09 69 66 20 28 65  *extra) {..if (e
8910: 78 74 72 61 29 20 7b 0a 09 09 66 70 72 69 6e 74  xtra) {...fprint
8920: 66 28 6f 75 74 70 75 74 2c 20 22 25 73 5c 6e 22  f(output, "%s\n"
8930: 2c 20 65 78 74 72 61 29 3b 0a 09 7d 0a 0a 09 66  , extra);..}...f
8940: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
8950: 55 73 61 67 65 3a 20 66 69 6c 65 64 20 5b 3c 6f  Usage: filed [<o
8960: 70 74 69 6f 6e 73 3e 5d 5c 6e 22 29 3b 0a 09 66  ptions>]\n");..f
8970: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
8980: 20 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b 0a    Options:\n");.
8990: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
89a0: 20 22 20 20 20 20 20 20 2d 68 2c 20 2d 2d 68 65   "      -h, --he
89b0: 6c 70 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  lp\n");..fprintf
89c0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
89d0: 2d 64 2c 20 2d 2d 64 61 65 6d 6f 6e 5c 6e 22 29  -d, --daemon\n")
89e0: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
89f0: 74 2c 20 22 20 20 20 20 20 20 2d 76 2c 20 2d 2d  t, "      -v, --
8a00: 76 65 72 73 69 6f 6e 5c 6e 22 29 3b 0a 09 66 70  version\n");..fp
8a10: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
8a20: 20 20 20 20 20 2d 56 2c 20 2d 2d 76 68 6f 73 74       -V, --vhost
8a30: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
8a40: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62  utput, "      -b
8a50: 20 3c 61 64 64 72 65 73 73 3e 2c 20 2d 2d 62 69   <address>, --bi
8a60: 6e 64 20 3c 61 64 64 72 65 73 73 3e 5c 6e 22 29  nd <address>\n")
8a70: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
8a80: 74 2c 20 22 20 20 20 20 20 20 2d 70 20 3c 70 6f  t, "      -p <po
8a90: 72 74 3e 2c 20 2d 2d 70 6f 72 74 20 3c 70 6f 72  rt>, --port <por
8aa0: 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  t>\n");..fprintf
8ab0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
8ac0: 2d 74 20 3c 63 6f 75 6e 74 3e 2c 20 2d 2d 74 68  -t <count>, --th
8ad0: 72 65 61 64 73 20 3c 63 6f 75 6e 74 3e 5c 6e 22  reads <count>\n"
8ae0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
8af0: 75 74 2c 20 22 20 20 20 20 20 20 2d 63 20 3c 65  ut, "      -c <e
8b00: 6e 74 72 69 65 73 3e 2c 20 2d 2d 63 61 63 68 65  ntries>, --cache
8b10: 20 3c 65 6e 74 72 69 65 73 3e 5c 6e 22 29 3b 0a   <entries>\n");.
8b20: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8b30: 20 22 20 20 20 20 20 20 2d 6c 20 3c 66 69 6c 65   "      -l <file
8b40: 3e 2c 20 2d 2d 6c 6f 67 20 3c 66 69 6c 65 3e 5c  >, --log <file>\
8b50: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
8b60: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 75 20  tput, "      -u 
8b70: 3c 75 73 65 72 3e 2c 20 2d 2d 75 73 65 72 20 3c  <user>, --user <
8b80: 75 73 65 72 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  user>\n");..fpri
8b90: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
8ba0: 20 20 20 2d 72 20 3c 64 69 72 65 63 74 6f 72 79     -r <directory
8bb0: 3e 2c 20 2d 2d 72 6f 6f 74 20 3c 64 69 72 65 63  >, --root <direc
8bc0: 74 6f 72 79 3e 5c 6e 22 29 3b 0a 0a 09 69 66 20  tory>\n");...if 
8bd0: 28 6c 6f 6e 67 5f 68 65 6c 70 29 20 7b 0a 09 09  (long_help) {...
8be0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
8bf0: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
8c00: 28 6f 75 74 70 75 74 2c 20 22 20 20 55 73 61 67  (output, "  Usag
8c10: 65 3a 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  e:\n");...fprint
8c20: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
8c30: 20 2d 68 20 28 6f 72 20 2d 2d 68 65 6c 70 29 20   -h (or --help) 
8c40: 70 72 69 6e 74 73 20 74 68 69 73 20 75 73 61 67  prints this usag
8c50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 5c 6e  e information.\n
8c60: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
8c70: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
8c80: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
8c90: 20 20 20 20 20 20 2d 64 20 28 6f 72 20 2d 2d 64        -d (or --d
8ca0: 61 65 6d 6f 6e 29 20 69 6e 73 74 72 75 63 74 73  aemon) instructs
8cb0: 20 66 69 6c 65 64 20 74 6f 20 62 65 63 6f 6d 65   filed to become
8cc0: 20 61 20 64 61 65 6d 6f 6e 20 61 66 74 65 72 20   a daemon after 
8cd0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 5c 6e 22 29  initializing\n")
8ce0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
8cf0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
8d10: 6c 69 73 74 65 6e 69 6e 67 20 54 43 50 20 73 6f  listening TCP so
8d20: 63 6b 65 74 20 61 6e 64 20 6c 6f 67 20 66 69 6c  cket and log fil
8d30: 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  es.\n");...fprin
8d40: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
8d50: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
8d60: 75 74 2c 20 22 20 20 20 20 20 20 2d 76 20 28 6f  ut, "      -v (o
8d70: 72 20 2d 2d 76 65 72 73 69 6f 6e 29 20 69 6e 73  r --version) ins
8d80: 74 72 75 63 74 73 20 66 69 6c 65 64 20 70 72 69  tructs filed pri
8d90: 6e 74 20 6f 75 74 20 74 68 65 20 76 65 72 73 69  nt out the versi
8da0: 6f 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 65 78  on number and ex
8db0: 69 74 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  it.\n");...fprin
8dc0: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
8dd0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
8de0: 75 74 2c 20 22 20 20 20 20 20 20 2d 56 20 28 6f  ut, "      -V (o
8df0: 72 20 2d 2d 76 68 6f 73 74 29 20 69 6e 73 74 72  r --vhost) instr
8e00: 75 63 74 73 20 66 69 6c 65 64 20 74 6f 20 70 72  ucts filed to pr
8e10: 65 70 65 6e 64 20 61 6c 6c 20 72 65 71 75 65 73  epend all reques
8e20: 74 73 20 77 69 74 68 20 74 68 65 69 72 20 48 54  ts with their HT
8e30: 54 50 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  TP\n");...fprint
8e40: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 48 6f 73 74 20 68 65 61 64 65 72 2e 5c 6e 22   Host header.\n"
8e70: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
8e80: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
8e90: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
8ea0: 20 20 20 20 20 2d 62 20 28 6f 72 20 2d 2d 62 69       -b (or --bi
8eb0: 6e 64 29 20 73 70 65 63 69 66 69 65 73 20 74 68  nd) specifies th
8ec0: 65 20 61 64 64 72 65 73 73 20 74 6f 20 6c 69 73  e address to lis
8ed0: 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e 67  ten for incoming
8ee0: 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70 72   HTTP\n");...fpr
8ef0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 72 65 71 75 65 73 74 73 20 6f 6e 2e 20     requests on. 
8f20: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
8f30: 75 65 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22  ue is \"%s\".\n"
8f40: 2c 20 42 49 4e 44 5f 41 44 44 52 29 3b 0a 09 09  , BIND_ADDR);...
8f50: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
8f60: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
8f70: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
8f80: 2d 70 20 28 6f 72 20 2d 2d 70 6f 72 74 29 20 73  -p (or --port) s
8f90: 70 65 63 69 66 69 65 73 20 74 68 65 20 54 43 50  pecifies the TCP
8fa0: 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 20   port number to 
8fb0: 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d  listen for incom
8fc0: 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09  ing HTTP\n");...
8fd0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
8fe0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8ff0: 20 20 20 20 20 20 72 65 71 75 65 73 74 73 20 6f        requests o
9000: 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  n.  The default 
9010: 69 73 20 25 75 2e 5c 6e 22 2c 20 28 75 6e 73 69  is %u.\n", (unsi
9020: 67 6e 65 64 20 69 6e 74 29 20 50 4f 52 54 29 3b  gned int) PORT);
9030: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9040: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
9050: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
9060: 20 20 20 2d 74 20 28 6f 72 20 2d 2d 74 68 72 65     -t (or --thre
9070: 61 64 73 29 20 73 70 65 63 69 66 69 65 73 20 74  ads) specifies t
9080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72  he number of wor
9090: 6b 65 72 20 74 68 72 65 61 64 73 20 74 6f 20 63  ker threads to c
90a0: 72 65 61 74 65 2e 20 45 61 63 68 5c 6e 22 29 3b  reate. Each\n");
90b0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
90c0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b              work
90e0: 65 72 20 74 68 72 65 61 64 20 63 61 6e 20 73 65  er thread can se
90f0: 72 76 69 63 65 20 6f 6e 65 20 63 6f 6e 63 75 72  rvice one concur
9100: 72 65 6e 74 20 48 54 54 50 20 73 65 73 73 69 6f  rent HTTP sessio
9110: 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  n.\n");...fprint
9120: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 20 54 68 75 73 20 74 68 65 20 6e 75 6d 62     Thus the numb
9150: 65 72 20 6f 66 20 74 68 72 65 61 64 73 20 63 72  er of threads cr
9160: 65 61 74 65 64 20 77 69 6c 6c 20 64 65 74 65 72  eated will deter
9170: 6d 69 6e 65 20 68 6f 77 5c 6e 22 29 3b 0a 09 09  mine how\n");...
9180: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9190: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
91a0: 20 20 20 20 20 20 20 20 20 6d 61 6e 79 20 73 69           many si
91b0: 6d 75 6c 74 61 6e 65 6f 75 73 20 74 72 61 6e 73  multaneous trans
91c0: 66 65 72 73 20 77 69 6c 6c 20 62 65 20 70 6f 73  fers will be pos
91d0: 73 69 62 6c 65 2e 20 54 68 65 5c 6e 22 29 3b 0a  sible. The\n");.
91e0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
91f0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9200: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
9210: 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28  lt is %lu.\n", (
9220: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54  unsigned long) T
9230: 48 52 45 41 44 5f 43 4f 55 4e 54 29 3b 0a 09 09  HREAD_COUNT);...
9240: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9250: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
9260: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9270: 2d 63 20 28 6f 72 20 2d 2d 63 61 63 68 65 29 20  -c (or --cache) 
9280: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
9290: 6d 62 65 72 20 6f 66 20 66 69 6c 65 20 69 6e 66  mber of file inf
92a0: 6f 72 6d 61 74 69 6f 6e 20 63 61 63 68 65 20 65  ormation cache e
92b0: 6e 74 72 69 65 73 5c 6e 22 29 3b 0a 09 09 66 70  ntries\n");...fp
92c0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92e0: 20 20 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65       to allocate
92f0: 2e 20 20 45 61 63 68 20 63 61 63 68 65 20 65 6e  .  Each cache en
9300: 74 72 79 20 68 6f 6c 64 73 20 66 69 6c 65 20 69  try holds file i
9310: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 5c 6e 22  nformation as\n"
9320: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9330: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
9340: 20 20 20 20 20 20 20 20 20 20 20 20 77 65 6c 6c              well
9350: 20 61 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65   as an open file
9360: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
9370: 68 65 20 66 69 6c 65 2c 20 73 6f 20 72 65 73 6f  he file, so reso
9380: 75 72 63 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69  urce\n");...fpri
9390: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 6c 69 6d 69 74 73 20 28 69 2e 65 2e 2c     limits (i.e.,
93c0: 20 75 6c 69 6d 69 74 29 20 73 68 6f 75 6c 64 20   ulimit) should 
93d0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 20  be considered.  
93e0: 54 68 69 73 20 73 68 6f 75 6c 64 5c 6e 22 29 3b  This should\n");
93f0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9400: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
9410: 20 20 20 20 20 20 20 20 20 20 62 65 20 61 20 70            be a p
9420: 72 69 6d 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  rime number for 
9430: 69 64 65 61 6c 20 75 73 65 20 77 69 74 68 20 74  ideal use with t
9440: 68 65 20 6c 6f 6f 6b 75 70 20 6d 65 74 68 6f 64  he lookup method
9450: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
9460: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 25  The default is %
9490: 6c 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65  lu.\n", (unsigne
94a0: 64 20 6c 6f 6e 67 29 20 43 41 43 48 45 5f 53 49  d long) CACHE_SI
94b0: 5a 45 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  ZE);...fprintf(o
94c0: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
94d0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
94e0: 22 20 20 20 20 20 20 2d 6c 20 28 6f 72 20 2d 2d  "      -l (or --
94f0: 6c 6f 67 29 20 73 70 65 63 69 66 69 65 73 20 61  log) specifies a
9500: 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 6f 70 65   filename to ope
9510: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6c 6f  n for writing lo
9520: 67 20 65 6e 74 72 69 65 73 2e 20 20 4c 6f 67 5c  g entries.  Log\
9530: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9540: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
9550: 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 72              entr
9560: 69 65 73 20 61 72 65 20 6d 61 64 65 20 66 6f 72  ies are made for
9570: 20 76 61 72 69 6f 75 73 20 73 74 61 67 65 73 20   various stages 
9580: 69 6e 20 74 72 61 6e 73 66 65 72 69 6e 67 20 66  in transfering f
9590: 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72  iles.\n");...fpr
95a0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 69    The log file i
95d0: 73 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  s opened before 
95e0: 73 77 69 74 63 68 69 6e 67 20 75 73 65 72 73 20  switching users 
95f0: 28 73 65 65 20 5c 22 2d 75 5c 22 29 5c 6e 22 29  (see \"-u\")\n")
9600: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9610: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
9620: 20 20 20 20 20 20 20 20 20 61 6e 64 20 72 6f 6f           and roo
9630: 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 28 73  t directories (s
9640: 65 65 20 5c 22 2d 72 5c 22 29 2e 20 20 54 68 65  ee \"-r\").  The
9650: 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 65 76   log file is nev
9660: 65 72 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  er\n");...fprint
9670: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
9690: 6c 6f 73 65 64 20 73 6f 20 6c 6f 67 20 72 6f 74  losed so log rot
96a0: 61 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 73 74  ation without st
96b0: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 65 6d 6f  opping the daemo
96c0: 6e 20 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09  n is will\n");..
96d0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
96e0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
96f0: 20 20 20 20 20 20 6e 6f 74 20 77 6f 72 6b 2e 20        not work. 
9700: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 5c 22   The value of \"
9710: 2d 5c 22 20 69 6e 64 69 63 61 74 65 73 20 74 68  -\" indicates th
9720: 61 74 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  at standard outp
9730: 75 74 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ut\n");...fprint
9740: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9760: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
9770: 72 20 6c 6f 67 67 69 6e 67 2e 20 20 49 66 20 74  r logging.  If t
9780: 68 65 20 66 69 6c 65 6e 61 6d 65 20 62 65 67 69  he filename begi
9790: 6e 73 20 77 69 74 68 20 61 5c 6e 22 29 3b 0a 09  ns with a\n");..
97a0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
97b0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
97c0: 20 20 20 20 20 20 70 69 70 65 20 28 5c 22 7c 5c        pipe (\"|\
97d0: 22 29 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  ") then a proces
97e0: 73 20 69 73 20 73 74 61 72 74 65 64 20 61 6e 64  s is started and
97f0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e   used for loggin
9800: 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  g\n");...fprintf
9810: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
9830: 73 74 65 61 64 20 6f 66 20 61 20 66 69 6c 65 2e  stead of a file.
9840: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
9850: 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 20 4c 4f 47   \"%s\".\n", LOG
9860: 5f 46 49 4c 45 29 3b 0a 23 69 66 64 65 66 20 46  _FILE);.#ifdef F
9870: 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 09 09  ILED_DONT_LOG...
9880: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9890: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
98a0: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 6c       Note that l
98b0: 6f 67 67 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65  ogging is comple
98c0: 74 65 6c 79 20 64 69 73 61 62 6c 65 64 20 73 6f  tely disabled so
98d0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 64 6f 65   this option doe
98e0: 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  s\n");...fprintf
98f0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f                no
9910: 74 68 69 6e 67 20 69 6e 20 74 68 69 73 20 62 75  thing in this bu
9920: 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66  ild.\n");.#endif
9930: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9940: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
9950: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
9960: 20 20 20 2d 75 20 28 6f 72 20 2d 2d 75 73 65 72     -u (or --user
9970: 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  ) specifies the 
9980: 75 73 65 72 20 74 6f 20 73 77 69 74 63 68 20 75  user to switch u
9990: 73 65 72 20 49 44 73 20 74 6f 20 62 65 66 6f 72  ser IDs to befor
99a0: 65 20 73 65 72 76 69 63 69 6e 67 5c 6e 22 29 3b  e servicing\n");
99b0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
99c0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
99d0: 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74           request
99e0: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
99f0: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 75 73  is not change us
9a00: 65 72 20 49 44 73 2e 5c 6e 22 29 3b 0a 09 09 66  er IDs.\n");...f
9a10: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9a20: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9a30: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
9a40: 72 20 28 6f 72 20 2d 2d 72 6f 6f 74 29 20 73 70  r (or --root) sp
9a50: 65 63 69 66 69 65 73 20 74 68 65 20 64 69 72 65  ecifies the dire
9a60: 63 74 6f 72 79 20 74 6f 20 61 63 74 20 61 73 20  ctory to act as 
9a70: 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f  the root directo
9a80: 72 79 20 66 6f 72 5c 6e 22 29 3b 0a 09 09 66 70  ry for\n");...fp
9a90: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 74 68 65 20 66 69 6c 65 20 73 65 72      the file ser
9ac0: 76 65 72 2e 20 20 49 66 20 74 68 69 73 20 6f 70  ver.  If this op
9ad0: 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66 69 65  tion is specifie
9ae0: 64 2c 20 63 68 72 6f 6f 74 28 32 29 5c 6e 22 29  d, chroot(2)\n")
9af0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9b00: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
9b10: 20 20 20 20 20 20 20 20 20 20 69 73 20 63 61 6c            is cal
9b20: 6c 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  led.  The defaul
9b30: 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  t is not change 
9b40: 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73  root directories
9b50: 2c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  ,\n");...fprintf
9b60: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
9b80: 68 61 74 20 69 73 2c 20 74 68 65 20 5c 22 2f 5c  hat is, the \"/\
9b90: 22 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  " directory is s
9ba0: 68 61 72 65 64 20 6f 75 74 2e 20 20 54 68 69 73  hared out.  This
9bb0: 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66 70 72   will\n");...fpr
9bc0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 6c 69 6b 65 6c 79 20 62 65 20 61 20 73     likely be a s
9bf0: 65 63 75 72 69 74 79 20 69 73 73 75 65 2c 20 73  ecurity issue, s
9c00: 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 73 68  o this option sh
9c10: 6f 75 6c 64 20 61 6c 77 61 79 73 5c 6e 22 29 3b  ould always\n");
9c20: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9c30: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
9c40: 20 20 20 20 20 20 20 20 20 62 65 20 75 73 65 64           be used
9c50: 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  .\n");..}...retu
9c60: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20  rn;.}../* Add a 
9c70: 67 65 74 6f 70 74 20 6f 70 74 69 6f 6e 20 2a 2f  getopt option */
9c80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
9c90: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
9ca0: 65 74 6f 70 74 28 73 74 72 75 63 74 20 6f 70 74  etopt(struct opt
9cb0: 69 6f 6e 20 2a 6f 70 74 2c 20 63 6f 6e 73 74 20  ion *opt, const 
9cc0: 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20  char *name, int 
9cd0: 68 61 73 5f 61 72 67 2c 20 69 6e 74 20 76 61 6c  has_arg, int val
9ce0: 29 20 7b 0a 09 6f 70 74 2d 3e 6e 61 6d 65 20 20  ) {..opt->name  
9cf0: 20 20 20 3d 20 6e 61 6d 65 3b 0a 09 6f 70 74 2d     = name;..opt-
9d00: 3e 68 61 73 5f 61 72 67 20 20 3d 20 68 61 73 5f  >has_arg  = has_
9d10: 61 72 67 3b 0a 09 6f 70 74 2d 3e 66 6c 61 67 20  arg;..opt->flag 
9d20: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 09 6f 70 74      = NULL;..opt
9d30: 2d 3e 76 61 6c 20 20 20 20 20 20 3d 20 76 61 6c  ->val      = val
9d40: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
9d50: 2a 20 52 65 73 6f 6c 76 65 20 61 20 75 73 65 72  * Resolve a user
9d60: 6e 61 6d 65 20 74 6f 20 61 20 55 49 44 20 2a 2f  name to a UID */
9d70: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
9d80: 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 63 6f  d_user_lookup(co
9d90: 6e 73 74 20 63 68 61 72 20 2a 75 73 65 72 2c 20  nst char *user, 
9da0: 75 69 64 5f 74 20 2a 75 73 65 72 5f 69 64 29 20  uid_t *user_id) 
9db0: 7b 0a 09 63 68 61 72 20 2a 6e 65 78 74 3b 0a 09  {..char *next;..
9dc0: 75 69 64 5f 74 20 75 73 65 72 5f 69 64 5f 63 68  uid_t user_id_ch
9dd0: 65 63 6b 3b 0a 23 69 66 6e 64 65 66 20 46 49 4c  eck;.#ifndef FIL
9de0: 45 44 5f 4e 4f 5f 47 45 54 50 57 4e 41 4d 0a 09  ED_NO_GETPWNAM..
9df0: 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 65  struct passwd *e
9e00: 6e 74 3b 0a 0a 09 65 6e 74 20 3d 20 67 65 74 70  nt;...ent = getp
9e10: 77 6e 61 6d 28 75 73 65 72 29 3b 0a 09 69 66 20  wnam(user);..if 
9e20: 28 65 6e 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (ent != NULL) {.
9e30: 09 09 2a 75 73 65 72 5f 69 64 20 3d 20 65 6e 74  ..*user_id = ent
9e40: 2d 3e 70 77 5f 75 69 64 3b 0a 0a 09 09 72 65 74  ->pw_uid;....ret
9e50: 75 72 6e 28 30 29 3b 0a 09 7d 0a 23 65 6e 64 69  urn(0);..}.#endi
9e60: 66 0a 0a 09 75 73 65 72 5f 69 64 5f 63 68 65 63  f...user_id_chec
9e70: 6b 20 3d 20 73 74 72 74 6f 75 6c 6c 28 75 73 65  k = strtoull(use
9e80: 72 2c 20 26 6e 65 78 74 2c 20 31 30 29 3b 0a 09  r, &next, 10);..
9e90: 69 66 20 28 6e 65 78 74 20 3d 3d 20 4e 55 4c 4c  if (next == NULL
9ea0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
9eb0: 0a 09 7d 0a 0a 09 69 66 20 28 6e 65 78 74 5b 30  ..}...if (next[0
9ec0: 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72  ] != '\0') {...r
9ed0: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2a  eturn(1);..}...*
9ee0: 75 73 65 72 5f 69 64 20 3d 20 75 73 65 72 5f 69  user_id = user_i
9ef0: 64 5f 63 68 65 63 6b 3b 0a 0a 09 72 65 74 75 72  d_check;...retur
9f00: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 61 65 6d  n(0);.}../* Daem
9f10: 6f 6e 69 7a 65 20 2a 2f 0a 73 74 61 74 69 63 20  onize */.static 
9f20: 69 6e 74 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e  int filed_daemon
9f30: 69 7a 65 28 76 6f 69 64 29 20 7b 0a 09 70 69 64  ize(void) {..pid
9f40: 5f 74 20 73 65 74 73 69 64 5f 72 65 74 2c 20 66  _t setsid_ret, f
9f50: 6f 72 6b 5f 72 65 74 3b 0a 09 69 6e 74 20 63 68  ork_ret;..int ch
9f60: 64 69 72 5f 72 65 74 2c 20 64 75 70 32 5f 72 65  dir_ret, dup2_re
9f70: 74 3b 0a 09 69 6e 74 20 66 64 5f 69 6e 2c 20 66  t;..int fd_in, f
9f80: 64 5f 6f 75 74 3b 0a 0a 09 63 68 64 69 72 5f 72  d_out;...chdir_r
9f90: 65 74 20 3d 20 63 68 64 69 72 28 22 2f 22 29 3b  et = chdir("/");
9fa0: 0a 09 69 66 20 28 63 68 64 69 72 5f 72 65 74 20  ..if (chdir_ret 
9fb0: 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  != 0) {...return
9fc0: 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 6b 5f 72  (1);..}...fork_r
9fd0: 65 74 20 3d 20 66 6f 72 6b 28 29 3b 0a 09 69 66  et = fork();..if
9fe0: 20 28 66 6f 72 6b 5f 72 65 74 20 3c 20 30 29 20   (fork_ret < 0) 
9ff0: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
a000: 7d 0a 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74  }...if (fork_ret
a010: 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 20 50 61 72   > 0) {.../* Par
a020: 65 6e 74 20 2a 2f 0a 09 09 77 61 69 74 70 69 64  ent */...waitpid
a030: 28 66 6f 72 6b 5f 72 65 74 2c 20 4e 55 4c 4c 2c  (fork_ret, NULL,
a040: 20 30 29 3b 0a 0a 09 09 65 78 69 74 28 45 58 49   0);....exit(EXI
a050: 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a  T_SUCCESS);..}..
a060: 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09 69 66  ./* Child */..if
a070: 20 28 66 6f 72 6b 28 29 20 21 3d 20 30 29 20 7b   (fork() != 0) {
a080: 0a 09 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09  .../* Child */..
a090: 09 65 78 69 74 28 45 58 49 54 5f 53 55 43 43 45  .exit(EXIT_SUCCE
a0a0: 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 72 61  SS);..}.../* Gra
a0b0: 6e 64 20 63 68 69 6c 64 20 2a 2f 0a 09 73 65 74  nd child */..set
a0c0: 73 69 64 5f 72 65 74 20 3d 20 73 65 74 73 69 64  sid_ret = setsid
a0d0: 28 29 3b 0a 09 69 66 20 28 73 65 74 73 69 64 5f  ();..if (setsid_
a0e0: 72 65 74 20 3d 3d 20 28 28 70 69 64 5f 74 29 20  ret == ((pid_t) 
a0f0: 2d 31 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  -1)) {...return(
a100: 31 29 3b 0a 09 7d 0a 0a 09 66 64 5f 69 6e 20 3d  1);..}...fd_in =
a110: 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c   open("/dev/null
a120: 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 66  ", O_RDONLY);..f
a130: 64 5f 6f 75 74 20 3d 20 6f 70 65 6e 28 22 2f 64  d_out = open("/d
a140: 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 57 52 4f 4e  ev/null", O_WRON
a150: 4c 59 29 3b 0a 09 69 66 20 28 66 64 5f 69 6e 20  LY);..if (fd_in 
a160: 3c 20 30 20 7c 7c 20 66 64 5f 6f 75 74 20 3c 20  < 0 || fd_out < 
a170: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  0) {...return(1)
a180: 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20  ;..}...dup2_ret 
a190: 3d 20 64 75 70 32 28 66 64 5f 69 6e 2c 20 53 54  = dup2(fd_in, ST
a1a0: 44 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66  DIN_FILENO);..if
a1b0: 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54   (dup2_ret != ST
a1c0: 44 49 4e 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09  DIN_FILENO) {...
a1d0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
a1e0: 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28  dup2_ret = dup2(
a1f0: 66 64 5f 6f 75 74 2c 20 53 54 44 4f 55 54 5f 46  fd_out, STDOUT_F
a200: 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70  ILENO);..if (dup
a210: 32 5f 72 65 74 20 21 3d 20 53 54 44 4f 55 54 5f  2_ret != STDOUT_
a220: 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75  FILENO) {...retu
a230: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32  rn(1);..}...dup2
a240: 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f 6f  _ret = dup2(fd_o
a250: 75 74 2c 20 53 54 44 45 52 52 5f 46 49 4c 45 4e  ut, STDERR_FILEN
a260: 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65  O);..if (dup2_re
a270: 74 20 21 3d 20 53 54 44 45 52 52 5f 46 49 4c 45  t != STDERR_FILE
a280: 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  NO) {...return(1
a290: 29 3b 0a 09 7d 0a 0a 09 63 6c 6f 73 65 28 66 64  );..}...close(fd
a2a0: 5f 69 6e 29 3b 0a 09 63 6c 6f 73 65 28 66 64 5f  _in);..close(fd_
a2b0: 6f 75 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  out);...return(0
a2c0: 29 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 70 72 6f  );.}../* Run pro
a2d0: 63 65 73 73 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e  cess */.int main
a2e0: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
a2f0: 2a 2a 61 72 67 76 29 20 7b 0a 09 73 74 72 75 63  **argv) {..struc
a300: 74 20 6f 70 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  t option options
a310: 5b 31 32 5d 3b 0a 09 73 74 72 75 63 74 20 66 69  [12];..struct fi
a320: 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 74 68 72 65  led_options thre
a330: 61 64 5f 6f 70 74 69 6f 6e 73 3b 0a 09 63 6f 6e  ad_options;..con
a340: 73 74 20 63 68 61 72 20 2a 62 69 6e 64 5f 61 64  st char *bind_ad
a350: 64 72 20 3d 20 42 49 4e 44 5f 41 44 44 52 2c 20  dr = BIND_ADDR, 
a360: 2a 6e 65 77 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c  *newroot = NULL,
a370: 20 2a 6c 6f 67 5f 66 69 6c 65 20 3d 20 4c 4f 47   *log_file = LOG
a380: 5f 46 49 4c 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f  _FILE;..FILE *lo
a390: 67 5f 66 70 3b 0a 09 75 69 64 5f 74 20 75 73 65  g_fp;..uid_t use
a3a0: 72 20 3d 20 30 3b 0a 09 69 6e 74 20 70 6f 72 74  r = 0;..int port
a3b0: 20 3d 20 50 4f 52 54 2c 20 74 68 72 65 61 64 5f   = PORT, thread_
a3c0: 63 6f 75 6e 74 20 3d 20 54 48 52 45 41 44 5f 43  count = THREAD_C
a3d0: 4f 55 4e 54 3b 0a 09 69 6e 74 20 63 61 63 68 65  OUNT;..int cache
a3e0: 5f 73 69 7a 65 20 3d 20 43 41 43 48 45 5f 53 49  _size = CACHE_SI
a3f0: 5a 45 3b 0a 09 69 6e 74 20 69 6e 69 74 5f 72 65  ZE;..int init_re
a400: 74 2c 20 63 68 72 6f 6f 74 5f 72 65 74 2c 20 73  t, chroot_ret, s
a410: 65 74 75 69 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75  etuid_ret, looku
a420: 70 5f 72 65 74 2c 20 63 68 64 69 72 5f 72 65 74  p_ret, chdir_ret
a430: 3b 0a 09 69 6e 74 20 73 65 74 75 69 64 5f 65 6e  ;..int setuid_en
a440: 61 62 6c 65 64 20 3d 20 30 2c 20 64 61 65 6d 6f  abled = 0, daemo
a450: 6e 5f 65 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 09  n_enabled = 0;..
a460: 69 6e 74 20 63 68 3b 0a 09 69 6e 74 20 66 64 3b  int ch;..int fd;
a470: 0a 0a 09 2f 2a 20 53 65 74 20 64 65 66 61 75 6c  .../* Set defaul
a480: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 09 74 68 72  t values */..thr
a490: 65 61 64 5f 6f 70 74 69 6f 6e 73 2e 76 68 6f 73  ead_options.vhos
a4a0: 74 73 5f 65 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  ts_enabled = 0;.
a4b0: 0a 09 2f 2a 20 50 72 6f 63 65 73 73 20 61 72 67  ../* Process arg
a4c0: 75 6d 65 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64  uments */..filed
a4d0: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
a4e0: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c  opt(&options[0],
a4f0: 20 22 70 6f 72 74 22 2c 20 72 65 71 75 69 72 65   "port", require
a500: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 70 27 29  d_argument, 'p')
a510: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
a520: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
a530: 69 6f 6e 73 5b 31 5d 2c 20 22 74 68 72 65 61 64  ions[1], "thread
a540: 73 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67  s", required_arg
a550: 75 6d 65 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69  ument, 't');..fi
a560: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
a570: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
a580: 32 5d 2c 20 22 63 61 63 68 65 22 2c 20 72 65 71  2], "cache", req
a590: 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20  uired_argument, 
a5a0: 27 63 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'c');..filed_get
a5b0: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
a5c0: 26 6f 70 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69  &options[3], "bi
a5d0: 6e 64 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72  nd", required_ar
a5e0: 67 75 6d 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66  gument, 'b');..f
a5f0: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
a600: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
a610: 5b 34 5d 2c 20 22 75 73 65 72 22 2c 20 72 65 71  [4], "user", req
a620: 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20  uired_argument, 
a630: 27 75 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'u');..filed_get
a640: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
a650: 26 6f 70 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f  &options[5], "ro
a660: 6f 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72  ot", required_ar
a670: 67 75 6d 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66  gument, 'r');..f
a680: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
a690: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
a6a0: 5b 36 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f  [6], "help", no_
a6b0: 61 72 67 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a  argument, 'h');.
a6c0: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
a6d0: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
a6e0: 6e 73 5b 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c  ns[7], "daemon",
a6f0: 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64   no_argument, 'd
a700: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
a710: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
a720: 70 74 69 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22  ptions[8], "log"
a730: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
a740: 65 6e 74 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65  ent, 'l');..file
a750: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
a760: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d  topt(&options[9]
a770: 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20 6e 6f 5f  , "version", no_
a780: 61 72 67 75 6d 65 6e 74 2c 20 27 76 27 29 3b 0a  argument, 'v');.
a790: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
a7a0: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
a7b0: 6e 73 5b 31 30 5d 2c 20 22 76 68 6f 73 74 22 2c  ns[10], "vhost",
a7c0: 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 56   no_argument, 'V
a7d0: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
a7e0: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
a7f0: 70 74 69 6f 6e 73 5b 31 31 5d 2c 20 4e 55 4c 4c  ptions[11], NULL
a800: 2c 20 30 2c 20 30 29 3b 0a 09 77 68 69 6c 65 20  , 0, 0);..while 
a810: 28 28 63 68 20 3d 20 67 65 74 6f 70 74 5f 6c 6f  ((ch = getopt_lo
a820: 6e 67 28 61 72 67 63 2c 20 61 72 67 76 2c 20 22  ng(argc, argv, "
a830: 70 3a 74 3a 63 3a 62 3a 75 3a 72 3a 6c 3a 68 64  p:t:c:b:u:r:l:hd
a840: 76 56 22 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e 55  vV", options, NU
a850: 4c 4c 29 29 20 21 3d 20 2d 31 29 20 7b 0a 09 09  LL)) != -1) {...
a860: 73 77 69 74 63 68 28 63 68 29 20 7b 0a 09 09 09  switch(ch) {....
a870: 63 61 73 65 20 27 70 27 3a 0a 09 09 09 09 70 6f  case 'p':.....po
a880: 72 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67  rt = atoi(optarg
a890: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
a8a0: 09 63 61 73 65 20 27 74 27 3a 0a 09 09 09 09 74  .case 't':.....t
a8b0: 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 61 74  hread_count = at
a8c0: 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09  oi(optarg);.....
a8d0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
a8e0: 63 27 3a 0a 09 09 09 09 63 61 63 68 65 5f 73 69  c':.....cache_si
a8f0: 7a 65 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67  ze = atoi(optarg
a900: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
a910: 09 63 61 73 65 20 27 62 27 3a 0a 09 09 09 09 62  .case 'b':.....b
a920: 69 6e 64 5f 61 64 64 72 20 3d 20 73 74 72 64 75  ind_addr = strdu
a930: 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  p(optarg);.....b
a940: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 75  reak;....case 'u
a950: 27 3a 0a 09 09 09 09 73 65 74 75 69 64 5f 65 6e  ':.....setuid_en
a960: 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 6c  abled = 1;.....l
a970: 6f 6f 6b 75 70 5f 72 65 74 20 3d 20 66 69 6c 65  ookup_ret = file
a980: 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f 70  d_user_lookup(op
a990: 74 61 72 67 2c 20 26 75 73 65 72 29 3b 0a 09 09  targ, &user);...
a9a0: 09 09 69 66 20 28 6c 6f 6f 6b 75 70 5f 72 65 74  ..if (lookup_ret
a9b0: 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 66 69   != 0) {......fi
a9c0: 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73  led_print_help(s
a9d0: 74 64 65 72 72 2c 20 30 2c 20 22 49 6e 76 61 6c  tderr, 0, "Inval
a9e0: 69 64 20 75 73 65 72 6e 61 6d 65 20 73 70 65 63  id username spec
a9f0: 69 66 69 65 64 22 29 3b 0a 0a 09 09 09 09 09 72  ified");.......r
aa00: 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 09 7d 0a  eturn(1);.....}.
aa10: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
aa20: 73 65 20 27 72 27 3a 0a 09 09 09 09 6e 65 77 72  se 'r':.....newr
aa30: 6f 6f 74 20 3d 20 73 74 72 64 75 70 28 6f 70 74  oot = strdup(opt
aa40: 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  arg);.....break;
aa50: 0a 09 09 09 63 61 73 65 20 27 6c 27 3a 0a 09 09  ....case 'l':...
aa60: 09 09 6c 6f 67 5f 66 69 6c 65 20 3d 20 73 74 72  ..log_file = str
aa70: 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09  dup(optarg);....
aa80: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
aa90: 27 64 27 3a 0a 09 09 09 09 64 61 65 6d 6f 6e 5f  'd':.....daemon_
aaa0: 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09  enabled = 1;....
aab0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
aac0: 27 56 27 3a 0a 09 09 09 09 74 68 72 65 61 64 5f  'V':.....thread_
aad0: 6f 70 74 69 6f 6e 73 2e 76 68 6f 73 74 73 5f 65  options.vhosts_e
aae0: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 0a 09 09 09  nabled = 1;.....
aaf0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
ab00: 27 76 27 3a 0a 09 09 09 09 70 72 69 6e 74 66 28  'v':.....printf(
ab10: 22 66 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 25  "filed version %
ab20: 73 5c 6e 22 2c 20 46 49 4c 45 44 5f 56 45 52 53  s\n", FILED_VERS
ab30: 49 4f 4e 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  ION);......retur
ab40: 6e 28 30 29 3b 0a 09 09 09 63 61 73 65 20 27 3f  n(0);....case '?
ab50: 27 3a 0a 09 09 09 63 61 73 65 20 27 3a 27 3a 0a  ':....case ':':.
ab60: 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f  ....filed_print_
ab70: 68 65 6c 70 28 73 74 64 65 72 72 2c 20 30 2c 20  help(stderr, 0, 
ab80: 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09 72 65 74 75  NULL);......retu
ab90: 72 6e 28 31 29 3b 0a 09 09 09 63 61 73 65 20 27  rn(1);....case '
aba0: 68 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 72  h':.....filed_pr
abb0: 69 6e 74 5f 68 65 6c 70 28 73 74 64 6f 75 74 2c  int_help(stdout,
abc0: 20 31 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09   1, NULL);......
abd0: 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 7d 0a 09  return(0);...}..
abe0: 7d 0a 0a 09 2f 2a 20 4f 70 65 6e 20 6c 6f 67 20  }.../* Open log 
abf0: 66 69 6c 65 20 2a 2f 0a 09 6c 6f 67 5f 66 70 20  file */..log_fp 
ac00: 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e  = filed_log_open
ac10: 28 6c 6f 67 5f 66 69 6c 65 29 3b 0a 09 69 66 20  (log_file);..if 
ac20: 28 6c 6f 67 5f 66 70 20 3d 3d 20 4e 55 4c 4c 29  (log_fp == NULL)
ac30: 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c   {...perror("fil
ac40: 65 64 5f 6c 6f 67 5f 6f 70 65 6e 22 29 3b 0a 0a  ed_log_open");..
ac50: 09 09 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a  ..return(4);..}.
ac60: 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c 69 73 74  ../* Create list
ac70: 65 6e 69 6e 67 20 73 6f 63 6b 65 74 20 2a 2f 0a  ening socket */.
ac80: 09 66 64 20 3d 20 66 69 6c 65 64 5f 6c 69 73 74  .fd = filed_list
ac90: 65 6e 28 62 69 6e 64 5f 61 64 64 72 2c 20 70 6f  en(bind_addr, po
aca0: 72 74 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30  rt);..if (fd < 0
acb0: 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69  ) {...perror("fi
acc0: 6c 65 64 5f 6c 69 73 74 65 6e 22 29 3b 0a 0a 09  led_listen");...
acd0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
ace0: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  ./* Initialize t
acf0: 69 6d 65 6f 75 74 20 73 74 72 75 63 74 75 72 65  imeout structure
ad00: 73 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d  s */..init_ret =
ad10: 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d   filed_sockettim
ad20: 65 6f 75 74 5f 69 6e 69 74 28 29 3b 0a 09 69 66  eout_init();..if
ad30: 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29   (init_ret != 0)
ad40: 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c   {...perror("fil
ad50: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
ad60: 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75  _init");....retu
ad70: 72 6e 28 38 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42  rn(8);..}.../* B
ad80: 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 2a  ecome a daemon *
ad90: 2f 0a 09 69 66 20 28 64 61 65 6d 6f 6e 5f 65 6e  /..if (daemon_en
ada0: 61 62 6c 65 64 29 20 7b 0a 09 09 69 6e 69 74 5f  abled) {...init_
adb0: 72 65 74 20 3d 20 66 69 6c 65 64 5f 64 61 65 6d  ret = filed_daem
adc0: 6f 6e 69 7a 65 28 29 3b 0a 09 09 69 66 20 28 69  onize();...if (i
add0: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
ade0: 09 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64  ...perror("filed
adf0: 5f 64 61 65 6d 6f 6e 69 7a 65 22 29 3b 0a 0a 09  _daemonize");...
ae00: 09 09 72 65 74 75 72 6e 28 36 29 3b 0a 09 09 7d  ..return(6);...}
ae10: 0a 09 7d 0a 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c  ..}.../* Chroot,
ae20: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 20   if appropriate 
ae30: 2a 2f 0a 09 69 66 20 28 6e 65 77 72 6f 6f 74 29  */..if (newroot)
ae40: 20 7b 0a 09 09 63 68 64 69 72 5f 72 65 74 20 3d   {...chdir_ret =
ae50: 20 63 68 64 69 72 28 6e 65 77 72 6f 6f 74 29 3b   chdir(newroot);
ae60: 0a 09 09 69 66 20 28 63 68 64 69 72 5f 72 65 74  ...if (chdir_ret
ae70: 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72   != 0) {....perr
ae80: 6f 72 28 22 63 68 64 69 72 22 29 3b 0a 0a 09 09  or("chdir");....
ae90: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a  .return(1);...}.
aea0: 0a 09 09 63 68 72 6f 6f 74 5f 72 65 74 20 3d 20  ...chroot_ret = 
aeb0: 63 68 72 6f 6f 74 28 22 2e 22 29 3b 0a 09 09 69  chroot(".");...i
aec0: 66 20 28 63 68 72 6f 6f 74 5f 72 65 74 20 21 3d  f (chroot_ret !=
aed0: 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28   0) {....perror(
aee0: 22 63 68 72 6f 6f 74 22 29 3b 0a 0a 09 09 09 72  "chroot");.....r
aef0: 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d  eturn(1);...}..}
af00: 0a 0a 09 2f 2a 20 44 72 6f 70 20 70 72 69 76 69  .../* Drop privi
af10: 6c 65 67 65 73 2c 20 69 66 20 61 70 70 72 6f 70  leges, if approp
af20: 72 69 61 74 65 20 2a 2f 0a 09 69 66 20 28 73 65  riate */..if (se
af30: 74 75 69 64 5f 65 6e 61 62 6c 65 64 29 20 7b 0a  tuid_enabled) {.
af40: 09 09 73 65 74 75 69 64 5f 72 65 74 20 3d 20 73  ..setuid_ret = s
af50: 65 74 75 69 64 28 75 73 65 72 29 3b 0a 09 09 69  etuid(user);...i
af60: 66 20 28 73 65 74 75 69 64 5f 72 65 74 20 21 3d  f (setuid_ret !=
af70: 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28   0) {....perror(
af80: 22 73 65 74 75 69 64 22 29 3b 0a 0a 09 09 09 72  "setuid");.....r
af90: 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d  eturn(1);...}..}
afa0: 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .../* Initialize
afb0: 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20   */..init_ret = 
afc0: 66 69 6c 65 64 5f 69 6e 69 74 28 63 61 63 68 65  filed_init(cache
afd0: 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 69 6e 69  _size);..if (ini
afe0: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
aff0: 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 69 6e  perror("filed_in
b000: 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  it");....return(
b010: 33 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  3);..}.../* Crea
b020: 74 65 20 6c 6f 67 67 69 6e 67 20 74 68 72 65 61  te logging threa
b030: 64 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d  d */..init_ret =
b040: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
b050: 68 72 65 61 64 5f 69 6e 69 74 28 6c 6f 67 5f 66  hread_init(log_f
b060: 70 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65  p);..if (init_re
b070: 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72  t != 0) {...perr
b080: 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  or("filed_loggin
b090: 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29 3b  g_thread_init");
b0a0: 0a 0a 09 09 72 65 74 75 72 6e 28 34 29 3b 0a 09  ....return(4);..
b0b0: 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 73 6f  }.../* Create so
b0c0: 63 6b 65 74 20 74 65 72 6d 69 6e 61 74 69 6f 6e  cket termination
b0d0: 20 74 68 72 65 61 64 20 2a 2f 0a 09 69 6e 69 74   thread */..init
b0e0: 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 73 6f 63  _ret = filed_soc
b0f0: 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61  kettimeout_threa
b100: 64 5f 69 6e 69 74 28 29 3b 0a 09 69 66 20 28 69  d_init();..if (i
b110: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
b120: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
b130: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68  sockettimeout_th
b140: 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09  read_init");....
b150: 72 65 74 75 72 6e 28 37 29 3b 0a 09 7d 0a 0a 09  return(7);..}...
b160: 2f 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72  /* Create worker
b170: 20 74 68 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69   threads */..ini
b180: 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f  t_ret = filed_wo
b190: 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69  rker_threads_ini
b1a0: 74 28 66 64 2c 20 74 68 72 65 61 64 5f 63 6f 75  t(fd, thread_cou
b1b0: 6e 74 2c 20 26 74 68 72 65 61 64 5f 6f 70 74 69  nt, &thread_opti
b1c0: 6f 6e 73 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f  ons);..if (init_
b1d0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65  ret != 0) {...pe
b1e0: 72 72 6f 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b  rror("filed_work
b1f0: 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 22  er_threads_init"
b200: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 35 29 3b  );....return(5);
b210: 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f  ..}.../* Wait fo
b220: 72 20 74 68 72 65 61 64 73 20 74 6f 20 65 78 69  r threads to exi
b230: 74 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44  t */../* XXX:TOD
b240: 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61  O: Monitor threa
b250: 64 20 75 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c  d usage */..whil
b260: 65 20 28 31 29 20 7b 0a 09 09 73 6c 65 65 70 28  e (1) {...sleep(
b270: 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74  60);..}.../* Ret
b280: 75 72 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  urn in failure *
b290: 2f 0a 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a  /..return(2);.}.