Hex Artifact Content

Artifact 61d8dcb4f560133280abe1a216f4d4799b495391:


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 73 79 73 2f 70 72 63 74 6c 2e 68 3e 0a 23   <sys/prctl.h>.#
05d0: 69 6e 63 6c 75 64 65 20 3c 61 72 70 61 2f 69 6e  include <arpa/in
05e0: 65 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  et.h>.#include <
05f0: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 69 6e 63  sys/mman.h>.#inc
0600: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
0610: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0620: 77 61 69 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  wait.h>.#include
0630: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 69 6e   <pthread.h>.#in
0640: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 73 2e 68  clude <strings.h
0650: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e  >.#include <sign
0660: 61 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  al.h>.#include <
0670: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
0680: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
0690: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
06a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 67 65 74 6f  >.#include <geto
06b0: 70 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  pt.h>.#include <
06c0: 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75  stdarg.h>.#inclu
06d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
06e0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
06f0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0700: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  h>.#include <tim
0710: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70  e.h>.#include <p
0720: 77 64 2e 68 3e 0a 0a 2f 2a 20 43 6f 6d 70 69 6c  wd.h>../* Compil
0730: 65 20 74 69 6d 65 20 63 6f 6e 73 74 61 6e 74 73  e time constants
0740: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 49 4c 45   */.#define FILE
0750: 44 5f 56 45 52 53 49 4f 4e 20 22 31 2e 32 31 22  D_VERSION "1.21"
0760: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 53  .#define FILED_S
0770: 45 4e 44 46 49 4c 45 5f 4d 41 58 20 31 36 37 37  ENDFILE_MAX 1677
0780: 37 32 31 35 0a 23 64 65 66 69 6e 65 20 46 49 4c  7215.#define FIL
0790: 45 44 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43  ED_MAX_FAILURE_C
07a0: 4f 55 4e 54 20 33 30 0a 23 64 65 66 69 6e 65 20  OUNT 30.#define 
07b0: 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59  FILED_DEFAULT_TY
07c0: 50 45 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  PE "application/
07d0: 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 0a 23 64  octet-stream".#d
07e0: 65 66 69 6e 65 20 46 49 4c 45 44 5f 50 41 54 48  efine FILED_PATH
07f0: 5f 42 55 46 46 45 52 5f 53 49 5a 45 20 31 30 31  _BUFFER_SIZE 101
0800: 30 0a 0a 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  0../* Default va
0810: 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lues */.#define 
0820: 50 4f 52 54 20 38 30 0a 23 64 65 66 69 6e 65 20  PORT 80.#define 
0830: 54 48 52 45 41 44 5f 43 4f 55 4e 54 20 35 0a 23  THREAD_COUNT 5.#
0840: 64 65 66 69 6e 65 20 42 49 4e 44 5f 41 44 44 52  define BIND_ADDR
0850: 20 22 3a 3a 22 0a 23 64 65 66 69 6e 65 20 43 41   "::".#define CA
0860: 43 48 45 5f 53 49 5a 45 20 38 32 30 39 0a 23 64  CHE_SIZE 8209.#d
0870: 65 66 69 6e 65 20 4c 4f 47 5f 46 49 4c 45 20 22  efine LOG_FILE "
0880: 2d 22 0a 0a 2f 2a 20 46 75 7a 7a 69 6e 67 20 54  -"../* Fuzzing T
0890: 65 73 74 20 43 6f 64 65 20 2a 2f 0a 23 69 66 64  est Code */.#ifd
08a0: 65 66 20 46 49 4c 45 44 5f 54 45 53 54 5f 41 46  ef FILED_TEST_AF
08b0: 4c 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f  L.#define FILED_
08c0: 44 4f 4e 54 5f 4c 4f 47 20 31 0a 23 64 65 66 69  DONT_LOG 1.#defi
08d0: 6e 65 20 70 74 68 72 65 61 64 5f 63 72 65 61 74  ne pthread_creat
08e0: 65 28 61 2c 20 78 2c 20 79 2c 20 7a 29 20 61 66  e(a, x, y, z) af
08f0: 6c 5f 70 74 68 72 65 61 64 5f 63 72 65 61 74 65  l_pthread_create
0900: 28 61 2c 20 78 2c 20 79 2c 20 7a 29 0a 23 64 65  (a, x, y, z).#de
0910: 66 69 6e 65 20 62 69 6e 64 28 78 2c 20 79 2c 20  fine bind(x, y, 
0920: 7a 29 20 61 66 6c 5f 62 69 6e 64 28 78 2c 20 79  z) afl_bind(x, y
0930: 2c 20 7a 29 0a 23 64 65 66 69 6e 65 20 73 6f 63  , z).#define soc
0940: 6b 65 74 28 78 2c 20 79 2c 20 7a 29 20 38 31 39  ket(x, y, z) 819
0950: 33 0a 23 64 65 66 69 6e 65 20 6c 69 73 74 65 6e  3.#define listen
0960: 28 78 2c 20 79 29 20 30 0a 23 64 65 66 69 6e 65  (x, y) 0.#define
0970: 20 61 63 63 65 70 74 28 78 2c 20 79 2c 20 7a 29   accept(x, y, z)
0980: 20 61 66 6c 5f 61 63 63 65 70 74 28 78 2c 20 79   afl_accept(x, y
0990: 2c 20 7a 29 0a 23 64 65 66 69 6e 65 20 63 6c 6f  , z).#define clo
09a0: 73 65 28 78 29 20 7b 20 69 66 20 28 73 74 72 63  se(x) { if (strc
09b0: 6d 70 28 23 78 2c 20 22 72 61 6e 64 6f 6d 5f 66  mp(#x, "random_f
09c0: 64 22 29 20 3d 3d 20 30 29 20 7b 20 63 6c 6f 73  d") == 0) { clos
09d0: 65 28 78 29 3b 20 7d 20 65 6c 73 65 20 7b 20 65  e(x); } else { e
09e0: 78 69 74 28 30 29 3b 20 7d 20 7d 0a 23 64 65 66  xit(0); } }.#def
09f0: 69 6e 65 20 66 63 6c 6f 73 65 28 78 29 20 65 78  ine fclose(x) ex
0a00: 69 74 28 30 29 0a 0a 73 74 61 74 69 63 20 69 6e  it(0)..static in
0a10: 74 20 61 66 6c 5f 61 63 63 65 70 74 28 69 6e 74  t afl_accept(int
0a20: 20 78 2c 20 76 6f 69 64 20 2a 61 64 64 72 2c 20   x, void *addr, 
0a30: 76 6f 69 64 20 2a 7a 29 20 7b 0a 09 28 28 73 74  void *z) {..((st
0a40: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
0a50: 36 20 2a 29 20 61 64 64 72 29 2d 3e 73 69 6e 36  6 *) addr)->sin6
0a60: 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45  _family = AF_INE
0a70: 54 20 2b 20 41 46 5f 49 4e 45 54 36 20 2b 20 31  T + AF_INET6 + 1
0a80: 3b 0a 09 72 65 74 75 72 6e 28 53 54 44 49 4e 5f  ;..return(STDIN_
0a90: 46 49 4c 45 4e 4f 29 3b 0a 09 78 20 3d 20 78 3b  FILENO);..x = x;
0aa0: 0a 09 7a 20 3d 20 7a 3b 0a 7d 0a 0a 73 74 61 74  ..z = z;.}..stat
0ab0: 69 63 20 69 6e 74 20 61 66 6c 5f 62 69 6e 64 28  ic int afl_bind(
0ac0: 69 6e 74 20 78 2c 20 76 6f 69 64 20 2a 79 2c 20  int x, void *y, 
0ad0: 73 6f 63 6b 6c 65 6e 5f 74 20 7a 29 20 7b 0a 09  socklen_t z) {..
0ae0: 72 65 74 75 72 6e 28 38 31 39 34 29 3b 0a 09 78  return(8194);..x
0af0: 20 3d 20 78 3b 0a 09 79 20 3d 20 79 3b 0a 09 7a   = x;..y = y;..z
0b00: 20 3d 20 7a 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = z;.}..static 
0b10: 69 6e 74 20 61 66 6c 5f 70 74 68 72 65 61 64 5f  int afl_pthread_
0b20: 63 72 65 61 74 65 28 70 74 68 72 65 61 64 5f 74  create(pthread_t
0b30: 20 2a 74 68 72 65 61 64 2c 20 63 6f 6e 73 74 20   *thread, const 
0b40: 70 74 68 72 65 61 64 5f 61 74 74 72 5f 74 20 2a  pthread_attr_t *
0b50: 61 74 74 72 2c 20 76 6f 69 64 20 2a 28 2a 73 74  attr, void *(*st
0b60: 61 72 74 5f 72 6f 75 74 69 6e 65 29 20 28 76 6f  art_routine) (vo
0b70: 69 64 20 2a 29 2c 20 76 6f 69 64 20 2a 61 72 67  id *), void *arg
0b80: 29 20 7b 0a 09 73 74 61 72 74 5f 72 6f 75 74 69  ) {..start_routi
0b90: 6e 65 28 61 72 67 29 3b 0a 09 65 78 69 74 28 33  ne(arg);..exit(3
0ba0: 29 3b 0a 09 74 68 72 65 61 64 20 3d 20 74 68 72  );..thread = thr
0bb0: 65 61 64 3b 0a 09 61 74 74 72 20 3d 20 61 74 74  ead;..attr = att
0bc0: 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  r;.}.#endif../* 
0bd0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  Configuration op
0be0: 74 69 6f 6e 73 20 74 68 61 74 20 77 6f 72 6b 20  tions that work 
0bf0: 74 68 72 65 61 64 73 20 6e 65 65 64 20 74 6f 20  threads need to 
0c00: 62 65 20 61 77 61 72 65 20 6f 66 20 2a 2f 0a 73  be aware of */.s
0c10: 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69  truct filed_opti
0c20: 6f 6e 73 20 7b 0a 09 69 6e 74 20 76 68 6f 73 74  ons {..int vhost
0c30: 73 5f 65 6e 61 62 6c 65 64 3b 0a 09 63 6f 6e 73  s_enabled;..cons
0c40: 74 20 63 68 61 72 20 2a 66 61 6b 65 5f 6e 65 77  t char *fake_new
0c50: 72 6f 6f 74 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67  root;.};../* Arg
0c60: 75 6d 65 6e 74 73 20 66 6f 72 20 77 6f 72 6b 65  uments for worke
0c70: 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72  r threads */.str
0c80: 75 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  uct filed_worker
0c90: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 7b 0a 09  _thread_args {..
0ca0: 69 6e 74 20 66 64 3b 0a 09 73 74 72 75 63 74 20  int fd;..struct 
0cb0: 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 6f 70  filed_options op
0cc0: 74 69 6f 6e 73 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72  tions;.};../* Ar
0cd0: 67 75 6d 65 6e 74 73 20 66 6f 72 20 6c 6f 67 67  guments for logg
0ce0: 69 6e 67 20 74 68 72 65 61 64 73 20 2a 2f 0a 73  ing threads */.s
0cf0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67  truct filed_logg
0d00: 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ing_thread_args 
0d10: 7b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 7d 3b 0a  {..FILE *fp;.};.
0d20: 0a 2f 2a 20 46 69 6c 65 20 69 6e 66 6f 72 6d 61  ./* File informa
0d30: 74 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 66  tion */.struct f
0d40: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 7b 0a  iled_fileinfo {.
0d50: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
0d60: 20 6d 75 74 65 78 3b 0a 09 63 68 61 72 20 70 61   mutex;..char pa
0d70: 74 68 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55  th[FILED_PATH_BU
0d80: 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 69 6e 74  FFER_SIZE];..int
0d90: 20 66 64 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e 3b   fd;..off_t len;
0da0: 0a 09 63 68 61 72 20 2a 6c 61 73 74 6d 6f 64 3b  ..char *lastmod;
0db0: 0a 09 63 68 61 72 20 6c 61 73 74 6d 6f 64 5f 62  ..char lastmod_b
0dc0: 5b 36 34 5d 3b 0a 09 63 6f 6e 73 74 20 63 68 61  [64];..const cha
0dd0: 72 20 2a 74 79 70 65 3b 0a 09 63 68 61 72 20 65  r *type;..char e
0de0: 74 61 67 5b 36 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 20  tag[64];.};../* 
0df0: 52 65 71 75 65 73 74 20 76 61 72 69 61 62 6c 65  Request variable
0e00: 73 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65  s */.struct file
0e10: 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 7b  d_http_request {
0e20: 0a 09 2f 2a 2a 20 42 75 66 66 65 72 73 20 2a 2a  ../** Buffers **
0e30: 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  /..struct filed_
0e40: 66 69 6c 65 69 6e 66 6f 20 66 69 6c 65 69 6e 66  fileinfo fileinf
0e50: 6f 3b 0a 09 63 68 61 72 20 74 6d 70 62 75 66 5b  o;..char tmpbuf[
0e60: 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45  FILED_PATH_BUFFE
0e70: 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 2a 20 48  R_SIZE];.../** H
0e80: 54 54 50 20 52 65 71 75 65 73 74 20 69 6e 66 6f  TTP Request info
0e90: 72 6d 61 74 69 6f 6e 20 2a 2a 2f 0a 09 2f 2a 2a  rmation **/../**
0ea0: 2a 20 54 79 70 65 20 6f 66 20 72 65 71 75 65 73  * Type of reques
0eb0: 74 20 28 48 45 41 44 20 6f 72 20 47 45 54 29 20  t (HEAD or GET) 
0ec0: 2a 2a 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46  ***/..enum {...F
0ed0: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54  ILED_REQUEST_MET
0ee0: 48 4f 44 5f 47 45 54 2c 0a 09 09 46 49 4c 45 44  HOD_GET,...FILED
0ef0: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
0f00: 48 45 41 44 0a 09 7d 20 6d 65 74 68 6f 64 3b 0a  HEAD..} method;.
0f10: 0a 09 2f 2a 2a 2a 20 50 61 74 68 20 62 65 69 6e  ../*** Path bein
0f20: 67 20 72 65 71 75 65 73 74 65 64 20 2a 2a 2a 2f  g requested ***/
0f30: 0a 09 63 68 61 72 20 70 61 74 68 5b 46 49 4c 45  ..char path[FILE
0f40: 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49  D_PATH_BUFFER_SI
0f50: 5a 45 5d 3b 20 0a 0a 09 2f 2a 2a 2a 20 50 61 74  ZE]; .../*** Pat
0f60: 68 20 74 79 70 65 20 2a 2a 2a 2f 0a 09 65 6e 75  h type ***/..enu
0f70: 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 52 45 51 55  m {...FILED_REQU
0f80: 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f  EST_TYPE_DIRECTO
0f90: 52 59 2c 0a 09 09 46 49 4c 45 44 5f 52 45 51 55  RY,...FILED_REQU
0fa0: 45 53 54 5f 54 59 50 45 5f 4f 54 48 45 52 0a 09  EST_TYPE_OTHER..
0fb0: 7d 20 74 79 70 65 3b 0a 0a 09 73 74 72 75 63 74  } type;...struct
0fc0: 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09   {...struct {...
0fd0: 09 69 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09  .int present;...
0fe0: 09 6f 66 66 5f 74 20 6f 66 66 73 65 74 3b 20 20  .off_t offset;  
0ff0: 20 2f 2a 2a 2a 20 52 61 6e 67 65 20 73 74 61 72   /*** Range star
1000: 74 20 2a 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20  t ***/....off_t 
1010: 6c 65 6e 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52  length;   /*** R
1020: 61 6e 67 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f  ange length ***/
1030: 0a 09 09 7d 20 72 61 6e 67 65 3b 0a 0a 09 09 73  ...} range;....s
1040: 74 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 70  truct {....int p
1050: 72 65 73 65 6e 74 3b 0a 09 09 09 63 68 61 72 20  resent;....char 
1060: 68 6f 73 74 5b 46 49 4c 45 44 5f 50 41 54 48 5f  host[FILED_PATH_
1070: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 09  BUFFER_SIZE];...
1080: 7d 20 68 6f 73 74 3b 0a 0a 09 09 65 6e 75 6d 20  } host;....enum 
1090: 7b 0a 09 09 09 46 49 4c 45 44 5f 43 4f 4e 4e 45  {....FILED_CONNE
10a0: 43 54 49 4f 4e 5f 43 4c 4f 53 45 2c 0a 09 09 09  CTION_CLOSE,....
10b0: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
10c0: 5f 4b 45 45 50 5f 41 4c 49 56 45 0a 09 09 7d 20  _KEEP_ALIVE...} 
10d0: 63 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 09 7d 20 68  connection;..} h
10e0: 65 61 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c  eaders;.};../* L
10f0: 6f 67 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72  og record */.str
1100: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
1110: 74 72 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20 6f  try {../* Type o
1120: 66 20 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a 09  f log entry */..
1130: 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 4c  enum {...FILED_L
1140: 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 2c  OG_TYPE_MESSAGE,
1150: 0a 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50  ...FILED_LOG_TYP
1160: 45 5f 54 52 41 4e 53 46 45 52 0a 09 7d 20 74 79  E_TRANSFER..} ty
1170: 70 65 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64 20  pe;.../* Linked 
1180: 6c 69 73 74 20 68 65 61 64 2f 74 61 69 6c 20 2a  list head/tail *
1190: 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  /..struct filed_
11a0: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78 74  log_entry *_next
11b0: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
11c0: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65 76  log_entry *_prev
11d0: 3b 0a 0a 09 2f 2a 20 54 68 72 65 61 64 20 66 72  ;.../* Thread fr
11e0: 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 6c 6f  om which this lo
11f0: 67 20 65 6e 74 72 79 20 65 6d 69 6e 61 74 65 73  g entry eminates
1200: 20 2a 2f 0a 09 70 74 68 72 65 61 64 5f 74 20 74   */..pthread_t t
1210: 68 72 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73 73  hread;.../* Mess
1220: 61 67 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  age buffer for t
1230: 79 70 65 20 3d 20 4d 45 53 53 41 47 45 20 2a 2f  ype = MESSAGE */
1240: 0a 09 2f 2a 20 50 61 74 68 20 62 75 66 66 65 72  ../* Path buffer
1250: 20 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e   for type = TRAN
1260: 53 46 45 52 20 2a 2f 0a 09 63 68 61 72 20 62 75  SFER */..char bu
1270: 66 66 65 72 5b 46 49 4c 45 44 5f 50 41 54 48 5f  ffer[FILED_PATH_
1280: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09  BUFFER_SIZE];...
1290: 2f 2a 20 49 74 65 6d 73 20 66 6f 72 20 74 79 70  /* Items for typ
12a0: 65 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a  e = TRANSFER */.
12b0: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
12c0: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61  .const char *rea
12d0: 73 6f 6e 3b 0a 09 74 69 6d 65 5f 74 20 63 6f 6e  son;..time_t con
12e0: 6e 65 63 74 74 69 6d 65 3b 0a 09 74 69 6d 65 5f  necttime;..time_
12f0: 74 20 73 74 61 72 74 74 69 6d 65 3b 0a 09 74 69  t starttime;..ti
1300: 6d 65 5f 74 20 65 6e 64 74 69 6d 65 3b 0a 09 6f  me_t endtime;..o
1310: 66 66 5f 74 20 72 65 71 5f 6f 66 66 73 65 74 3b  ff_t req_offset;
1320: 0a 09 6f 66 66 5f 74 20 72 65 71 5f 6c 65 6e 67  ..off_t req_leng
1330: 74 68 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 74 5f  th;..off_t sent_
1340: 6c 65 6e 67 74 68 3b 0a 09 6f 66 66 5f 74 20 66  length;..off_t f
1350: 69 6c 65 5f 6c 65 6e 67 74 68 3b 0a 09 63 68 61  ile_length;..cha
1360: 72 20 69 70 5b 31 32 38 5d 3b 0a 09 69 6e 74 20  r ip[128];..int 
1370: 70 6f 72 74 3b 0a 09 69 6e 74 20 6d 65 74 68 6f  port;..int metho
1380: 64 3b 0a 7d 3b 0a 0a 2f 2a 20 47 6c 6f 62 61 6c  d;.};../* Global
1390: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 2f 2a   variables */./*
13a0: 2a 20 4f 70 65 6e 20 46 69 6c 65 20 63 61 63 68  * Open File cach
13b0: 65 20 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  e **/.struct fil
13c0: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c  ed_fileinfo *fil
13d0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
13e0: 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 75 6e 73 69  che = NULL;.unsi
13f0: 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f 66  gned int filed_f
1400: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f  ileinfo_fdcache_
1410: 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 2a 20 4c  size = 0;../** L
1420: 6f 67 67 69 6e 67 20 2a 2a 2f 0a 73 74 72 75 63  ogging **/.struc
1430: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  t filed_log_entr
1440: 79 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  y *filed_log_msg
1450: 5f 6c 69 73 74 3b 0a 70 74 68 72 65 61 64 5f 6d  _list;.pthread_m
1460: 75 74 65 78 5f 74 20 66 69 6c 65 64 5f 6c 6f 67  utex_t filed_log
1470: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 3b  _msg_list_mutex;
1480: 0a 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 74 20  .pthread_cond_t 
1490: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
14a0: 73 74 5f 72 65 61 64 79 3b 0a 0a 2f 2a 20 53 69  st_ready;../* Si
14b0: 67 6e 61 6c 20 48 61 6e 64 6c 65 72 20 2a 2f 0a  gnal Handler */.
14c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
14d0: 64 5f 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72  d_signal_handler
14e0: 28 69 6e 74 20 73 69 67 6e 61 6c 5f 6e 75 6d 62  (int signal_numb
14f0: 65 72 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69  er) {..struct fi
1500: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 63 61  led_fileinfo *ca
1510: 63 68 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  che;..unsigned i
1520: 6e 74 20 69 64 78 3b 0a 0a 09 73 77 69 74 63 68  nt idx;...switch
1530: 20 28 73 69 67 6e 61 6c 5f 6e 75 6d 62 65 72 29   (signal_number)
1540: 20 7b 0a 09 09 63 61 73 65 20 53 49 47 48 55 50   {...case SIGHUP
1550: 3a 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20  :....for (idx = 
1560: 30 3b 20 69 64 78 20 3c 20 66 69 6c 65 64 5f 66  0; idx < filed_f
1570: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f  ileinfo_fdcache_
1580: 73 69 7a 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  size; idx++) {..
1590: 09 09 09 63 61 63 68 65 20 3d 20 26 66 69 6c 65  ...cache = &file
15a0: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
15b0: 68 65 5b 69 64 78 5d 3b 0a 0a 09 09 09 09 70 74  he[idx];......pt
15c0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
15d0: 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b  (&cache->mutex);
15e0: 0a 0a 09 09 09 09 63 61 63 68 65 2d 3e 70 61 74  ......cache->pat
15f0: 68 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 09  h[0] = '\0';....
1600: 09 69 66 20 28 63 61 63 68 65 2d 3e 66 64 20 3e  .if (cache->fd >
1610: 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 6c 6f 73  = 0) {......clos
1620: 65 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 0a 09  e(cache->fd);...
1630: 09 09 09 09 63 61 63 68 65 2d 3e 66 64 20 3d 20  ....cache->fd = 
1640: 2d 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  -1;.....}......c
1650: 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20  ache->lastmod = 
1660: 22 22 3b 0a 09 09 09 09 63 61 63 68 65 2d 3e 74  "";.....cache->t
1670: 79 70 65 20 3d 20 22 22 3b 0a 0a 09 09 09 09 70  ype = "";......p
1680: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
1690: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
16a0: 78 29 3b 0a 09 09 09 7d 0a 09 09 09 62 72 65 61  x);....}....brea
16b0: 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  k;..}...return;.
16c0: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
16d0: 20 63 61 63 68 65 20 2a 2f 0a 73 74 61 74 69 63   cache */.static
16e0: 20 69 6e 74 20 66 69 6c 65 64 5f 69 6e 69 74 5f   int filed_init_
16f0: 63 61 63 68 65 28 75 6e 73 69 67 6e 65 64 20 69  cache(unsigned i
1700: 6e 74 20 63 61 63 68 65 5f 73 69 7a 65 29 20 7b  nt cache_size) {
1710: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69  ..unsigned int i
1720: 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69  dx;..int mutex_i
1730: 6e 69 74 5f 72 65 74 3b 0a 0a 09 2f 2a 20 43 61  nit_ret;.../* Ca
1740: 63 68 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 72  che may not be r
1750: 65 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e-initialized */
1760: 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69 6c 65  ..if (filed_file
1770: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
1780: 65 20 21 3d 20 30 20 7c 7c 20 66 69 6c 65 64 5f  e != 0 || filed_
1790: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
17a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   != NULL) {...re
17b0: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(1);..}.../*
17c0: 20 43 61 63 68 65 20 64 6f 65 73 20 6e 6f 74 20   Cache does not 
17d0: 6e 65 65 64 20 74 6f 20 62 65 20 61 6c 6c 6f 63  need to be alloc
17e0: 61 74 65 64 20 69 66 20 63 61 63 68 65 20 69 73  ated if cache is
17f0: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
1800: 09 69 66 20 28 63 61 63 68 65 5f 73 69 7a 65 20  .if (cache_size 
1810: 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  == 0) {...return
1820: 28 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c  (0);..}.../* All
1830: 6f 63 61 74 65 20 63 61 63 68 65 20 2a 2f 0a 09  ocate cache */..
1840: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
1850: 64 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 63 61  dcache_size = ca
1860: 63 68 65 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64  che_size;..filed
1870: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
1880: 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  e = malloc(sizeo
1890: 66 28 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  f(*filed_fileinf
18a0: 6f 5f 66 64 63 61 63 68 65 29 20 2a 20 66 69 6c  o_fdcache) * fil
18b0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
18c0: 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28  che_size);..if (
18d0: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
18e0: 64 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20  dcache == NULL) 
18f0: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
1900: 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  }.../* Initializ
1910: 65 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 20  e cache entries 
1920: 2a 2f 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  */..for (idx = 0
1930: 3b 20 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69  ; idx < filed_fi
1940: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73  leinfo_fdcache_s
1950: 69 7a 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ize; idx++) {...
1960: 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d  mutex_init_ret =
1970: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69   pthread_mutex_i
1980: 6e 69 74 28 26 66 69 6c 65 64 5f 66 69 6c 65 69  nit(&filed_filei
1990: 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d  nfo_fdcache[idx]
19a0: 2e 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09  .mutex, NULL);..
19b0: 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f  .if (mutex_init_
19c0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72  ret != 0) {....r
19d0: 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09  eturn(1);...}...
19e0: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
19f0: 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 70 61 74  fdcache[idx].pat
1a00: 68 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 66  h[0] = '\0';...f
1a10: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1a20: 63 61 63 68 65 5b 69 64 78 5d 2e 66 64 20 3d 20  cache[idx].fd = 
1a30: 2d 31 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65  -1;...filed_file
1a40: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78  info_fdcache[idx
1a50: 5d 2e 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a  ].lastmod = "";.
1a60: 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  ..filed_fileinfo
1a70: 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 74 79  _fdcache[idx].ty
1a80: 70 65 20 3d 20 22 22 3b 0a 09 7d 0a 0a 09 72 65  pe = "";..}...re
1a90: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 49  turn(0);.}../* I
1aa0: 6e 69 74 69 61 6c 69 7a 65 20 70 72 6f 63 65 73  nitialize proces
1ab0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1ac0: 66 69 6c 65 64 5f 69 6e 69 74 28 75 6e 73 69 67  filed_init(unsig
1ad0: 6e 65 64 20 69 6e 74 20 63 61 63 68 65 5f 73 69  ned int cache_si
1ae0: 7a 65 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e  ze) {..static in
1af0: 74 20 63 61 6c 6c 65 64 20 3d 20 30 3b 0a 09 73  t called = 0;..s
1b00: 74 72 75 63 74 20 73 69 67 61 63 74 69 6f 6e 20  truct sigaction 
1b10: 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69  signal_handler_i
1b20: 6e 66 6f 3b 0a 09 73 69 67 73 65 74 5f 74 20 73  nfo;..sigset_t s
1b30: 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 6d 61  ignal_handler_ma
1b40: 73 6b 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  sk;..ssize_t rea
1b50: 64 5f 72 65 74 20 3d 20 30 3b 0a 09 75 6e 73 69  d_ret = 0;..unsi
1b60: 67 6e 65 64 20 69 6e 74 20 72 61 6e 64 6f 6d 5f  gned int random_
1b70: 76 61 6c 75 65 20 3d 20 30 3b 0a 09 69 6e 74 20  value = 0;..int 
1b80: 63 61 63 68 65 5f 72 65 74 3b 0a 09 69 6e 74 20  cache_ret;..int 
1b90: 72 61 6e 64 6f 6d 5f 66 64 3b 0a 0a 09 69 66 20  random_fd;...if 
1ba0: 28 63 61 6c 6c 65 64 29 20 7b 0a 09 09 72 65 74  (called) {...ret
1bb0: 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 63 61 6c  urn(0);..}...cal
1bc0: 6c 65 64 20 3d 20 31 3b 0a 0a 09 2f 2a 20 41 74  led = 1;.../* At
1bd0: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 61 6c  tempt to lock al
1be0: 6c 20 6d 65 6d 6f 72 79 20 74 6f 20 70 68 79 73  l memory to phys
1bf0: 69 63 61 6c 20 52 41 4d 20 28 62 75 74 20 64 6f  ical RAM (but do
1c00: 6e 27 74 20 63 61 72 65 20 69 66 20 77 65 20 63  n't care if we c
1c10: 61 6e 27 74 29 20 2a 2f 0a 09 6d 6c 6f 63 6b 61  an't) */..mlocka
1c20: 6c 6c 28 4d 43 4c 5f 43 55 52 52 45 4e 54 20 7c  ll(MCL_CURRENT |
1c30: 20 4d 43 4c 5f 46 55 54 55 52 45 29 3b 0a 0a 09   MCL_FUTURE);...
1c40: 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 73 69 67  /* Establish sig
1c50: 6e 61 6c 20 68 61 6e 64 6c 65 72 73 20 2a 2f 0a  nal handlers */.
1c60: 09 2f 2a 20 53 49 47 50 49 50 45 20 73 68 6f 75  ./* SIGPIPE shou
1c70: 6c 64 20 69 6e 74 65 72 72 75 70 74 20 73 79 73  ld interrupt sys
1c80: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 09 73 69  tem calls */..si
1c90: 67 66 69 6c 6c 73 65 74 28 26 73 69 67 6e 61 6c  gfillset(&signal
1ca0: 5f 68 61 6e 64 6c 65 72 5f 6d 61 73 6b 29 3b 0a  _handler_mask);.
1cb0: 09 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f  .signal_handler_
1cc0: 69 6e 66 6f 2e 73 61 5f 68 61 6e 64 6c 65 72 20  info.sa_handler 
1cd0: 3d 20 66 69 6c 65 64 5f 73 69 67 6e 61 6c 5f 68  = filed_signal_h
1ce0: 61 6e 64 6c 65 72 3b 0a 09 73 69 67 6e 61 6c 5f  andler;..signal_
1cf0: 68 61 6e 64 6c 65 72 5f 69 6e 66 6f 2e 73 61 5f  handler_info.sa_
1d00: 6d 61 73 6b 20 3d 20 73 69 67 6e 61 6c 5f 68 61  mask = signal_ha
1d10: 6e 64 6c 65 72 5f 6d 61 73 6b 3b 0a 09 73 69 67  ndler_mask;..sig
1d20: 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e 66 6f  nal_handler_info
1d30: 2e 73 61 5f 66 6c 61 67 73 20 3d 20 53 41 5f 52  .sa_flags = SA_R
1d40: 45 53 54 41 52 54 3b 0a 09 73 69 67 61 63 74 69  ESTART;..sigacti
1d50: 6f 6e 28 53 49 47 50 49 50 45 2c 20 26 73 69 67  on(SIGPIPE, &sig
1d60: 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e 66 6f  nal_handler_info
1d70: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 48 61  , NULL);.../* Ha
1d80: 6e 64 6c 65 20 53 49 47 48 55 50 20 74 6f 20 72  ndle SIGHUP to r
1d90: 65 6c 65 61 73 65 20 61 6c 6c 20 63 61 63 68 65  elease all cache
1da0: 73 20 2a 2f 0a 09 73 69 67 66 69 6c 6c 73 65 74  s */..sigfillset
1db0: 28 26 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72  (&signal_handler
1dc0: 5f 6d 61 73 6b 29 3b 0a 09 73 69 67 6e 61 6c 5f  _mask);..signal_
1dd0: 68 61 6e 64 6c 65 72 5f 69 6e 66 6f 2e 73 61 5f  handler_info.sa_
1de0: 68 61 6e 64 6c 65 72 20 3d 20 66 69 6c 65 64 5f  handler = filed_
1df0: 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 3b 0a  signal_handler;.
1e00: 09 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f  .signal_handler_
1e10: 69 6e 66 6f 2e 73 61 5f 6d 61 73 6b 20 3d 20 73  info.sa_mask = s
1e20: 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 6d 61  ignal_handler_ma
1e30: 73 6b 3b 0a 09 73 69 67 6e 61 6c 5f 68 61 6e 64  sk;..signal_hand
1e40: 6c 65 72 5f 69 6e 66 6f 2e 73 61 5f 66 6c 61 67  ler_info.sa_flag
1e50: 73 20 3d 20 30 3b 0a 09 73 69 67 61 63 74 69 6f  s = 0;..sigactio
1e60: 6e 28 53 49 47 48 55 50 2c 20 26 73 69 67 6e 61  n(SIGHUP, &signa
1e70: 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e 66 6f 2c 20  l_handler_info, 
1e80: 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 49 6e 69 74  NULL);.../* Init
1e90: 69 61 6c 69 7a 65 20 63 61 63 68 65 20 73 74 72  ialize cache str
1ea0: 75 63 74 75 72 65 20 2a 2f 0a 09 63 61 63 68 65  ucture */..cache
1eb0: 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 69 6e 69  _ret = filed_ini
1ec0: 74 5f 63 61 63 68 65 28 63 61 63 68 65 5f 73 69  t_cache(cache_si
1ed0: 7a 65 29 3b 0a 09 69 66 20 28 63 61 63 68 65 5f  ze);..if (cache_
1ee0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  ret != 0) {...re
1ef0: 74 75 72 6e 28 63 61 63 68 65 5f 72 65 74 29 3b  turn(cache_ret);
1f00: 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c  ..}.../* Initial
1f10: 69 7a 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ize random numbe
1f20: 72 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 09  r generator */..
1f30: 72 61 6e 64 6f 6d 5f 66 64 20 3d 20 6f 70 65 6e  random_fd = open
1f40: 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c  ("/dev/urandom",
1f50: 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 69 66 20   O_RDONLY);..if 
1f60: 28 72 61 6e 64 6f 6d 5f 66 64 20 3e 3d 20 30 29  (random_fd >= 0)
1f70: 20 7b 0a 09 09 72 65 61 64 5f 72 65 74 20 3d 20   {...read_ret = 
1f80: 72 65 61 64 28 72 61 6e 64 6f 6d 5f 66 64 2c 20  read(random_fd, 
1f90: 26 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 2c 20 73  &random_value, s
1fa0: 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 5f 76 61 6c  izeof(random_val
1fb0: 75 65 29 29 3b 0a 0a 09 09 63 6c 6f 73 65 28 72  ue));....close(r
1fc0: 61 6e 64 6f 6d 5f 66 64 29 3b 0a 09 7d 0a 0a 09  andom_fd);..}...
1fd0: 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20  random_value ^= 
1fe0: 67 65 74 70 69 64 28 29 3b 0a 09 72 61 6e 64 6f  getpid();..rando
1ff0: 6d 5f 76 61 6c 75 65 20 5e 3d 20 67 65 74 75 69  m_value ^= getui
2000: 64 28 29 3b 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c  d();..random_val
2010: 75 65 20 5e 3d 20 74 69 6d 65 28 4e 55 4c 4c 29  ue ^= time(NULL)
2020: 3b 0a 0a 09 73 72 61 6e 64 6f 6d 28 72 61 6e 64  ;...srandom(rand
2030: 6f 6d 5f 76 61 6c 75 65 29 3b 0a 0a 09 72 65 74  om_value);...ret
2040: 75 72 6e 28 30 29 3b 0a 0a 09 2f 2a 20 4e 4f 54  urn(0);.../* NOT
2050: 52 45 41 43 48 3a 20 52 65 61 64 20 6d 61 79 20  REACH: Read may 
2060: 66 61 69 6c 20 6f 72 20 73 75 63 63 65 65 64 2c  fail or succeed,
2070: 20 77 65 20 64 6f 6e 27 74 20 61 63 74 75 61 6c   we don't actual
2080: 6c 79 20 63 61 72 65 20 2a 2f 0a 09 72 65 61 64  ly care */..read
2090: 5f 72 65 74 20 3d 20 72 65 61 64 5f 72 65 74 3b  _ret = read_ret;
20a0: 0a 7d 0a 0a 2f 2a 20 4c 69 73 74 65 6e 20 6f 6e  .}../* Listen on
20b0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 61 64   a particular ad
20c0: 64 72 65 73 73 2f 70 6f 72 74 20 2a 2f 0a 73 74  dress/port */.st
20d0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 6c  atic int filed_l
20e0: 69 73 74 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  isten(const char
20f0: 20 2a 61 64 64 72 65 73 73 2c 20 75 6e 73 69 67   *address, unsig
2100: 6e 65 64 20 69 6e 74 20 70 6f 72 74 29 20 7b 0a  ned int port) {.
2110: 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  .struct sockaddr
2120: 5f 69 6e 36 20 61 64 64 72 5f 76 36 3b 0a 09 73  _in6 addr_v6;..s
2130: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
2140: 6e 20 61 64 64 72 5f 76 34 3b 0a 09 73 74 72 75  n addr_v4;..stru
2150: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64  ct sockaddr *add
2160: 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 61 64  r;..socklen_t ad
2170: 64 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 70 74 6f  dr_len;..int pto
2180: 6e 5f 72 65 74 2c 20 62 69 6e 64 5f 72 65 74 2c  n_ret, bind_ret,
2190: 20 6c 69 73 74 65 6e 5f 72 65 74 3b 0a 09 69 6e   listen_ret;..in
21a0: 74 20 66 61 6d 69 6c 79 3b 0a 09 69 6e 74 20 66  t family;..int f
21b0: 64 3b 0a 0a 09 66 61 6d 69 6c 79 20 3d 20 41 46  d;...family = AF
21c0: 5f 49 4e 45 54 36 3b 0a 09 70 74 6f 6e 5f 72 65  _INET6;..pton_re
21d0: 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61  t = inet_pton(fa
21e0: 6d 69 6c 79 2c 20 61 64 64 72 65 73 73 2c 20 26  mily, address, &
21f0: 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 61 64 64  addr_v6.sin6_add
2200: 72 2e 73 36 5f 61 64 64 72 29 3b 0a 09 69 66 20  r.s6_addr);..if 
2210: 28 70 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20  (pton_ret != 1) 
2220: 7b 0a 09 09 66 61 6d 69 6c 79 20 3d 20 41 46 5f  {...family = AF_
2230: 49 4e 45 54 3b 0a 09 09 70 74 6f 6e 5f 72 65 74  INET;...pton_ret
2240: 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61 6d   = inet_pton(fam
2250: 69 6c 79 2c 20 61 64 64 72 65 73 73 2c 20 26 61  ily, address, &a
2260: 64 64 72 5f 76 34 2e 73 69 6e 5f 61 64 64 72 2e  ddr_v4.sin_addr.
2270: 73 5f 61 64 64 72 29 3b 0a 09 09 69 66 20 28 70  s_addr);...if (p
2280: 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20 7b 0a  ton_ret != 1) {.
2290: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
22a0: 09 7d 0a 0a 09 09 61 64 64 72 5f 76 34 2e 73 69  .}....addr_v4.si
22b0: 6e 5f 66 61 6d 69 6c 79 20 3d 20 66 61 6d 69 6c  n_family = famil
22c0: 79 3b 0a 09 09 61 64 64 72 5f 76 34 2e 73 69 6e  y;...addr_v4.sin
22d0: 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f  _port = htons(po
22e0: 72 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28  rt);....addr = (
22f0: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
2300: 2a 29 20 26 61 64 64 72 5f 76 34 3b 0a 09 09 61  *) &addr_v4;...a
2310: 64 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ddr_len = sizeof
2320: 28 61 64 64 72 5f 76 34 29 3b 0a 09 7d 20 65 6c  (addr_v4);..} el
2330: 73 65 20 7b 0a 09 09 61 64 64 72 5f 76 36 2e 73  se {...addr_v6.s
2340: 69 6e 36 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f  in6_family = AF_
2350: 49 4e 45 54 36 3b 0a 09 09 61 64 64 72 5f 76 36  INET6;...addr_v6
2360: 2e 73 69 6e 36 5f 66 6c 6f 77 69 6e 66 6f 20 3d  .sin6_flowinfo =
2370: 20 30 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69   0;...addr_v6.si
2380: 6e 36 5f 73 63 6f 70 65 5f 69 64 20 3d 20 30 3b  n6_scope_id = 0;
2390: 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f  ...addr_v6.sin6_
23a0: 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f 72  port = htons(por
23b0: 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28 73  t);....addr = (s
23c0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
23d0: 29 20 26 61 64 64 72 5f 76 36 3b 0a 09 09 61 64  ) &addr_v6;...ad
23e0: 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  dr_len = sizeof(
23f0: 61 64 64 72 5f 76 36 29 3b 0a 09 7d 0a 0a 09 66  addr_v6);..}...f
2400: 64 20 3d 20 73 6f 63 6b 65 74 28 66 61 6d 69 6c  d = socket(famil
2410: 79 2c 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20  y, SOCK_STREAM, 
2420: 30 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29  0);..if (fd < 0)
2430: 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29 3b   {...return(fd);
2440: 0a 09 7d 0a 0a 09 62 69 6e 64 5f 72 65 74 20 3d  ..}...bind_ret =
2450: 20 62 69 6e 64 28 66 64 2c 20 61 64 64 72 2c 20   bind(fd, addr, 
2460: 61 64 64 72 5f 6c 65 6e 29 3b 0a 09 69 66 20 28  addr_len);..if (
2470: 62 69 6e 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  bind_ret < 0) {.
2480: 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09  ..close(fd);....
2490: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
24a0: 09 6c 69 73 74 65 6e 5f 72 65 74 20 3d 20 6c 69  .listen_ret = li
24b0: 73 74 65 6e 28 66 64 2c 20 31 32 38 29 3b 0a 09  sten(fd, 128);..
24c0: 69 66 20 28 6c 69 73 74 65 6e 5f 72 65 74 20 21  if (listen_ret !
24d0: 3d 20 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66  = 0) {...close(f
24e0: 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  d);....return(-1
24f0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 66  );..}...return(f
2500: 64 29 3b 0a 7d 0a 0a 2f 2a 20 4c 6f 67 20 61 20  d);.}../* Log a 
2510: 6d 65 73 73 61 67 65 20 2a 2f 0a 23 69 66 64 65  message */.#ifde
2520: 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47  f FILED_DONT_LOG
2530: 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64  .#  define filed
2540: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
2550: 69 6e 69 74 28 78 29 20 30 0a 23 20 20 64 65 66  init(x) 0.#  def
2560: 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ine filed_log_ms
2570: 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20  g_debug(x, ...) 
2580: 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 66  /**/.#  define f
2590: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 78 2c 20  iled_log_msg(x, 
25a0: 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66  ...) /**/.#  def
25b0: 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  ine filed_log_en
25c0: 74 72 79 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64  try(x) /**/.#  d
25d0: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
25e0: 69 70 28 78 2c 20 2e 2e 2e 29 20 4e 55 4c 4c 0a  ip(x, ...) NULL.
25f0: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
2600: 6c 6f 67 5f 6e 65 77 28 78 29 20 26 6c 6f 63 61  log_new(x) &loca
2610: 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 0a 23 20 20 64  l_dummy_log.#  d
2620: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
2630: 66 72 65 65 28 78 29 20 2f 2a 2a 2f 0a 0a 2f 2a  free(x) /**/../*
2640: 20 52 65 74 75 72 6e 20 6c 6f 67 67 69 6e 67 20   Return logging 
2650: 68 61 6e 64 6c 65 20 2a 2f 0a 73 74 61 74 69 63  handle */.static
2660: 20 46 49 4c 45 20 2a 66 69 6c 65 64 5f 6c 6f 67   FILE *filed_log
2670: 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
2680: 20 2a 66 69 6c 65 29 20 7b 0a 09 72 65 74 75 72   *file) {..retur
2690: 6e 28 73 74 64 6f 75 74 29 3b 0a 09 66 69 6c 65  n(stdout);..file
26a0: 20 3d 20 66 69 6c 65 3b 0a 7d 0a 23 65 6c 73 65   = file;.}.#else
26b0: 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64  .#  define filed
26c0: 5f 6c 6f 67 5f 66 72 65 65 28 78 29 20 66 72 65  _log_free(x) fre
26d0: 65 28 78 29 0a 23 20 20 69 66 64 65 66 20 46 49  e(x).#  ifdef FI
26e0: 4c 45 44 5f 44 45 42 55 47 0a 23 20 20 20 20 64  LED_DEBUG.#    d
26f0: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
2700: 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e  msg_debug(x, ...
2710: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
2720: 72 72 2c 20 78 2c 20 5f 5f 56 41 5f 41 52 47 53  rr, x, __VA_ARGS
2730: 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64  __); fprintf(std
2740: 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75  err, "\n"); fflu
2750: 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20  sh(stderr); }.# 
2760: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
2770: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  e filed_log_msg_
2780: 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a  debug(x, ...) /*
2790: 2a 2f 0a 23 20 20 65 6e 64 69 66 0a 0a 2f 2a 20  */.#  endif../* 
27a0: 49 6e 69 74 69 61 6c 69 7a 65 20 6c 6f 67 67 69  Initialize loggi
27b0: 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a 73 74 61  ng thread */.sta
27c0: 74 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f  tic void *filed_
27d0: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 28 76  logging_thread(v
27e0: 6f 69 64 20 2a 61 72 67 5f 70 29 20 7b 0a 09 73  oid *arg_p) {..s
27f0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67  truct filed_logg
2800: 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ing_thread_args 
2810: 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66 69  *arg;..struct fi
2820: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 63  led_log_entry *c
2830: 75 72 72 2c 20 2a 70 72 65 76 3b 0a 09 63 6f 6e  urr, *prev;..con
2840: 73 74 20 63 68 61 72 20 2a 6d 65 74 68 6f 64 3b  st char *method;
2850: 0a 09 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 09 46  ..time_t now;..F
2860: 49 4c 45 20 2a 66 70 3b 0a 0a 09 61 72 67 20 3d  ILE *fp;...arg =
2870: 20 61 72 67 5f 70 3b 0a 0a 09 66 70 20 3d 20 61   arg_p;...fp = a
2880: 72 67 2d 3e 66 70 3b 0a 0a 09 77 68 69 6c 65 20  rg->fp;...while 
2890: 28 31 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  (1) {...pthread_
28a0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65  mutex_lock(&file
28b0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
28c0: 75 74 65 78 29 3b 0a 09 09 70 74 68 72 65 61 64  utex);...pthread
28d0: 5f 63 6f 6e 64 5f 77 61 69 74 28 26 66 69 6c 65  _cond_wait(&file
28e0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72  d_log_msg_list_r
28f0: 65 61 64 79 2c 20 26 66 69 6c 65 64 5f 6c 6f 67  eady, &filed_log
2900: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
2910: 3b 0a 0a 09 09 63 75 72 72 20 3d 20 66 69 6c 65  ;....curr = file
2920: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a  d_log_msg_list;.
2930: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
2940: 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  list = NULL;....
2950: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
2960: 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  lock(&filed_log_
2970: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
2980: 0a 0a 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e  ....now = time(N
2990: 55 4c 4c 29 3b 0a 0a 09 09 70 72 65 76 20 3d 20  ULL);....prev = 
29a0: 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20 28 3b 20 63  NULL;...for (; c
29b0: 75 72 72 3b 20 63 75 72 72 20 3d 20 63 75 72 72  urr; curr = curr
29c0: 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 63 75  ->_next) {....cu
29d0: 72 72 2d 3e 5f 70 72 65 76 20 3d 20 70 72 65 76  rr->_prev = prev
29e0: 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75 72  ;.....prev = cur
29f0: 72 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72 20 3d  r;...}....curr =
2a00: 20 70 72 65 76 3b 0a 09 09 77 68 69 6c 65 20 28   prev;...while (
2a10: 63 75 72 72 29 20 7b 0a 09 09 09 73 77 69 74 63  curr) {....switc
2a20: 68 20 28 63 75 72 72 2d 3e 74 79 70 65 29 20 7b  h (curr->type) {
2a30: 0a 09 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f  .....case FILED_
2a40: 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45  LOG_TYPE_MESSAGE
2a50: 3a 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28 66  :......fprintf(f
2a60: 70 2c 20 22 25 73 22 2c 20 63 75 72 72 2d 3e 62  p, "%s", curr->b
2a70: 75 66 66 65 72 29 3b 0a 0a 09 09 09 09 09 62 72  uffer);.......br
2a80: 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 46 49  eak;.....case FI
2a90: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41  LED_LOG_TYPE_TRA
2aa0: 4e 53 46 45 52 3a 0a 09 09 09 09 09 73 77 69 74  NSFER:......swit
2ab0: 63 68 20 28 63 75 72 72 2d 3e 6d 65 74 68 6f 64  ch (curr->method
2ac0: 29 20 7b 0a 09 09 09 09 09 09 63 61 73 65 20 46  ) {.......case F
2ad0: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54  ILED_REQUEST_MET
2ae0: 48 4f 44 5f 47 45 54 3a 0a 09 09 09 09 09 09 09  HOD_GET:........
2af0: 6d 65 74 68 6f 64 3d 22 47 45 54 22 3b 0a 09 09  method="GET";...
2b00: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2b10: 09 09 63 61 73 65 20 46 49 4c 45 44 5f 52 45 51  ..case FILED_REQ
2b20: 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44  UEST_METHOD_HEAD
2b30: 3a 0a 09 09 09 09 09 09 09 6d 65 74 68 6f 64 3d  :........method=
2b40: 22 48 45 41 44 22 3b 0a 09 09 09 09 09 09 09 62  "HEAD";........b
2b50: 72 65 61 6b 3b 0a 09 09 09 09 09 09 64 65 66 61  reak;.......defa
2b60: 75 6c 74 3a 0a 09 09 09 09 09 09 09 6d 65 74 68  ult:........meth
2b70: 6f 64 3d 22 3c 75 6e 6b 6e 6f 77 6e 3e 22 3b 0a  od="<unknown>";.
2b80: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
2b90: 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
2ba0: 75 72 72 2d 3e 65 6e 64 74 69 6d 65 20 3d 3d 20  urr->endtime == 
2bb0: 28 28 74 69 6d 65 5f 74 29 20 2d 31 29 29 20 7b  ((time_t) -1)) {
2bc0: 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 65 6e 64  .......curr->end
2bd0: 74 69 6d 65 20 3d 20 6e 6f 77 3b 0a 09 09 09 09  time = now;.....
2be0: 09 7d 0a 0a 09 09 09 09 09 66 70 72 69 6e 74 66  .}.......fprintf
2bf0: 28 66 70 2c 20 22 54 52 41 4e 53 46 45 52 20 4d  (fp, "TRANSFER M
2c00: 45 54 48 4f 44 3d 25 73 20 50 41 54 48 3d 25 73  ETHOD=%s PATH=%s
2c10: 20 53 52 43 3d 25 73 3a 25 69 20 43 4c 49 45 4e   SRC=%s:%i CLIEN
2c20: 54 2e 54 49 4d 45 2e 43 4f 4e 4e 45 43 54 3d 25  T.TIME.CONNECT=%
2c30: 6c 6c 75 20 52 45 51 55 45 53 54 2e 54 49 4d 45  llu REQUEST.TIME
2c40: 2e 53 54 41 52 54 3d 25 6c 6c 75 20 52 45 51 55  .START=%llu REQU
2c50: 45 53 54 2e 54 49 4d 45 2e 45 4e 44 3d 25 6c 6c  EST.TIME.END=%ll
2c60: 75 20 43 4f 44 45 2e 56 41 4c 55 45 3d 25 75 20  u CODE.VALUE=%u 
2c70: 43 4f 44 45 2e 52 45 41 53 4f 4e 3d 25 73 20 52  CODE.REASON=%s R
2c80: 45 51 55 45 53 54 2e 4f 46 46 53 45 54 3d 25 6c  EQUEST.OFFSET=%l
2c90: 6c 75 20 52 45 51 55 45 53 54 2e 4c 45 4e 47 54  lu REQUEST.LENGT
2ca0: 48 3d 25 6c 6c 75 20 46 49 4c 45 2e 4c 45 4e 47  H=%llu FILE.LENG
2cb0: 54 48 3d 25 6c 6c 75 20 54 52 41 4e 53 46 45 52  TH=%llu TRANSFER
2cc0: 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a 09  .LENGTH=%llu",..
2cd0: 09 09 09 09 09 6d 65 74 68 6f 64 2c 0a 09 09 09  .....method,....
2ce0: 09 09 09 63 75 72 72 2d 3e 62 75 66 66 65 72 2c  ...curr->buffer,
2cf0: 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 69 70 2c  .......curr->ip,
2d00: 20 63 75 72 72 2d 3e 70 6f 72 74 2c 0a 09 09 09   curr->port,....
2d10: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
2d20: 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 63 6f  g long) curr->co
2d30: 6e 6e 65 63 74 74 69 6d 65 2c 0a 09 09 09 09 09  nnecttime,......
2d40: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
2d50: 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73 74 61 72  long) curr->star
2d60: 74 74 69 6d 65 2c 0a 09 09 09 09 09 09 28 75 6e  ttime,.......(un
2d70: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
2d80: 29 20 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65 2c  ) curr->endtime,
2d90: 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 68 74 74  .......curr->htt
2da0: 70 5f 63 6f 64 65 2c 20 63 75 72 72 2d 3e 72 65  p_code, curr->re
2db0: 61 73 6f 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73  ason,.......(uns
2dc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
2dd0: 20 63 75 72 72 2d 3e 72 65 71 5f 6f 66 66 73 65   curr->req_offse
2de0: 74 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  t,.......(unsign
2df0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
2e00: 72 72 2d 3e 72 65 71 5f 6c 65 6e 67 74 68 2c 0a  rr->req_length,.
2e10: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
2e20: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
2e30: 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 2c 0a 09 09  >file_length,...
2e40: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
2e50: 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73  ng long) curr->s
2e60: 65 6e 74 5f 6c 65 6e 67 74 68 0a 09 09 09 09 09  ent_length......
2e70: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
2e80: 09 09 09 7d 0a 09 09 09 66 70 72 69 6e 74 66 28  ...}....fprintf(
2e90: 66 70 2c 20 22 20 54 48 52 45 41 44 3d 25 6c 6c  fp, " THREAD=%ll
2ea0: 75 20 54 49 4d 45 3d 25 6c 6c 75 5c 6e 22 2c 0a  u TIME=%llu\n",.
2eb0: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
2ec0: 6e 67 20 6c 6f 6e 67 29 20 28 28 69 6e 74 70 74  ng long) ((intpt
2ed0: 72 5f 74 29 20 63 75 72 72 2d 3e 74 68 72 65 61  r_t) curr->threa
2ee0: 64 29 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65  d),.....(unsigne
2ef0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 6e 6f 77  d long long) now
2f00: 0a 09 09 09 29 3b 0a 09 09 09 66 66 6c 75 73 68  ....);....fflush
2f10: 28 66 70 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d  (fp);.....prev =
2f20: 20 63 75 72 72 3b 0a 09 09 09 63 75 72 72 20 3d   curr;....curr =
2f30: 20 63 75 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09   curr->_prev;...
2f40: 09 09 66 72 65 65 28 70 72 65 76 29 3b 0a 09 09  ..free(prev);...
2f50: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55  }..}...return(NU
2f60: 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  LL);.}..static v
2f70: 6f 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  oid filed_log_en
2f80: 74 72 79 28 73 74 72 75 63 74 20 66 69 6c 65 64  try(struct filed
2f90: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72  _log_entry *entr
2fa0: 79 29 20 7b 0a 09 65 6e 74 72 79 2d 3e 74 68 72  y) {..entry->thr
2fb0: 65 61 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65  ead = pthread_se
2fc0: 6c 66 28 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f  lf();...pthread_
2fd0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65  mutex_lock(&file
2fe0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
2ff0: 75 74 65 78 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e  utex);...entry->
3000: 5f 6e 65 78 74 20 3d 20 66 69 6c 65 64 5f 6c 6f  _next = filed_lo
3010: 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 66 69 6c  g_msg_list;..fil
3020: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20  ed_log_msg_list 
3030: 3d 20 65 6e 74 72 79 3b 0a 0a 09 70 74 68 72 65  = entry;...pthre
3040: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
3050: 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  &filed_log_msg_l
3060: 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 70 74  ist_mutex);...pt
3070: 68 72 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61  hread_cond_signa
3080: 6c 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  l(&filed_log_msg
3090: 5f 6c 69 73 74 5f 72 65 61 64 79 29 3b 0a 0a 09  _list_ready);...
30a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
30b0: 63 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  c struct filed_l
30c0: 6f 67 5f 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f  og_entry *filed_
30d0: 6c 6f 67 5f 6e 65 77 28 69 6e 74 20 69 6e 69 74  log_new(int init
30e0: 69 61 6c 69 7a 65 29 20 7b 0a 09 73 74 72 75 63  ialize) {..struc
30f0: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  t filed_log_entr
3100: 79 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74  y *retval;...ret
3110: 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  val = malloc(siz
3120: 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a  eof(*retval));..
3130: 09 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 29  .if (initialize)
3140: 20 7b 0a 09 09 72 65 74 76 61 6c 2d 3e 62 75 66   {...retval->buf
3150: 66 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09  fer[0] = '\0';..
3160: 09 72 65 74 76 61 6c 2d 3e 68 74 74 70 5f 63 6f  .retval->http_co
3170: 64 65 20 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61  de = -1;...retva
3180: 6c 2d 3e 63 6f 6e 6e 65 63 74 74 69 6d 65 20 3d  l->connecttime =
3190: 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 73 74   0;...retval->st
31a0: 61 72 74 74 69 6d 65 20 3d 20 30 3b 0a 09 09 72  arttime = 0;...r
31b0: 65 74 76 61 6c 2d 3e 65 6e 64 74 69 6d 65 20 3d  etval->endtime =
31c0: 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65   0;...retval->re
31d0: 71 5f 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09 09  q_offset = 0;...
31e0: 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6c 65 6e 67  retval->req_leng
31f0: 74 68 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c  th = 0;...retval
3200: 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 20 3d 20  ->sent_length = 
3210: 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 66 69 6c  0;...retval->fil
3220: 65 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09  e_length = 0;...
3230: 72 65 74 76 61 6c 2d 3e 69 70 5b 30 5d 20 3d 20  retval->ip[0] = 
3240: 27 5c 30 27 3b 0a 09 09 72 65 74 76 61 6c 2d 3e  '\0';...retval->
3250: 70 6f 72 74 20 3d 20 2d 31 3b 0a 09 09 72 65 74  port = -1;...ret
3260: 76 61 6c 2d 3e 6d 65 74 68 6f 64 20 3d 20 2d 31  val->method = -1
3270: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
3280: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
3290: 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f   void filed_log_
32a0: 6d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  msg(const char *
32b0: 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09 73 74 72  fmt, ...) {..str
32c0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
32d0: 74 72 79 20 2a 65 6e 74 72 79 3b 0a 09 76 61 5f  try *entry;..va_
32e0: 6c 69 73 74 20 61 72 67 73 3b 0a 0a 09 65 6e 74  list args;...ent
32f0: 72 79 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e  ry = filed_log_n
3300: 65 77 28 30 29 3b 0a 0a 09 76 61 5f 73 74 61 72  ew(0);...va_star
3310: 74 28 61 72 67 73 2c 20 66 6d 74 29 3b 0a 0a 09  t(args, fmt);...
3320: 76 73 6e 70 72 69 6e 74 66 28 65 6e 74 72 79 2d  vsnprintf(entry-
3330: 3e 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28  >buffer, sizeof(
3340: 65 6e 74 72 79 2d 3e 62 75 66 66 65 72 29 2c 20  entry->buffer), 
3350: 66 6d 74 2c 20 61 72 67 73 29 3b 0a 0a 09 76 61  fmt, args);...va
3360: 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a 09 65 6e  _end(args);...en
3370: 74 72 79 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45  try->type = FILE
3380: 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41  D_LOG_TYPE_MESSA
3390: 47 45 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  GE;...filed_log_
33a0: 65 6e 74 72 79 28 65 6e 74 72 79 29 3b 0a 0a 09  entry(entry);...
33b0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
33c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69  c const char *fi
33d0: 6c 65 64 5f 6c 6f 67 5f 69 70 28 73 74 72 75 63  led_log_ip(struc
33e0: 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64 72  t sockaddr *addr
33f0: 2c 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  , char *buffer, 
3400: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 6c 65 6e  size_t bufferlen
3410: 29 20 7b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b  ) {..struct sock
3420: 61 64 64 72 5f 69 6e 20 2a 61 64 64 72 5f 76 34  addr_in *addr_v4
3430: 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ;..struct sockad
3440: 64 72 5f 69 6e 36 20 2a 61 64 64 72 5f 76 36 3b  dr_in6 *addr_v6;
3450: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65  ..const char *re
3460: 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 61  tval = NULL;...a
3470: 64 64 72 5f 76 36 20 3d 20 28 73 74 72 75 63 74  ddr_v6 = (struct
3480: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29   sockaddr_in6 *)
3490: 20 61 64 64 72 3b 0a 0a 09 73 77 69 74 63 68 20   addr;...switch 
34a0: 28 61 64 64 72 5f 76 36 2d 3e 73 69 6e 36 5f 66  (addr_v6->sin6_f
34b0: 61 6d 69 6c 79 29 20 7b 0a 09 09 63 61 73 65 20  amily) {...case 
34c0: 41 46 5f 49 4e 45 54 3a 0a 09 09 09 61 64 64 72  AF_INET:....addr
34d0: 5f 76 34 20 3d 20 28 73 74 72 75 63 74 20 73 6f  _v4 = (struct so
34e0: 63 6b 61 64 64 72 5f 69 6e 20 2a 29 20 61 64 64  ckaddr_in *) add
34f0: 72 3b 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 69  r;....retval = i
3500: 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54  net_ntop(AF_INET
3510: 2c 20 26 61 64 64 72 5f 76 34 2d 3e 73 69 6e 5f  , &addr_v4->sin_
3520: 61 64 64 72 2c 20 62 75 66 66 65 72 2c 20 62 75  addr, buffer, bu
3530: 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09 62 72 65  fferlen);....bre
3540: 61 6b 3b 0a 09 09 63 61 73 65 20 41 46 5f 49 4e  ak;...case AF_IN
3550: 45 54 36 3a 0a 09 09 09 72 65 74 76 61 6c 20 3d  ET6:....retval =
3560: 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e   inet_ntop(AF_IN
3570: 45 54 36 2c 20 26 61 64 64 72 5f 76 36 2d 3e 73  ET6, &addr_v6->s
3580: 69 6e 36 5f 61 64 64 72 2c 20 62 75 66 66 65 72  in6_addr, buffer
3590: 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09  , bufferlen);...
35a0: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74  .break;..}...ret
35b0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
35c0: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 69 6c  static FILE *fil
35d0: 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73  ed_log_open(cons
35e0: 74 20 63 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a  t char *file) {.
35f0: 09 46 49 4c 45 20 2a 72 65 74 76 61 6c 3b 0a 0a  .FILE *retval;..
3600: 09 69 66 20 28 73 74 72 63 6d 70 28 66 69 6c 65  .if (strcmp(file
3610: 2c 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b 0a 09  , "-") == 0) {..
3620: 09 72 65 74 76 61 6c 20 3d 20 73 74 64 6f 75 74  .retval = stdout
3630: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 66 69  ;..} else if (fi
3640: 6c 65 5b 30 5d 20 3d 3d 20 27 7c 27 29 20 7b 0a  le[0] == '|') {.
3650: 09 09 66 69 6c 65 2b 2b 3b 0a 09 09 72 65 74 76  ..file++;...retv
3660: 61 6c 20 3d 20 70 6f 70 65 6e 28 66 69 6c 65 2c  al = popen(file,
3670: 20 22 77 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b   "w");..} else {
3680: 0a 09 09 72 65 74 76 61 6c 20 3d 20 66 6f 70 65  ...retval = fope
3690: 6e 28 66 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09  n(file, "a+");..
36a0: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
36b0: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  l);.}..static in
36c0: 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  t filed_logging_
36d0: 74 68 72 65 61 64 5f 69 6e 69 74 28 46 49 4c 45  thread_init(FILE
36e0: 20 2a 6c 6f 67 66 70 29 20 7b 0a 09 73 74 72 75   *logfp) {..stru
36f0: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  ct filed_logging
3700: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72  _thread_args *ar
3710: 67 73 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74  gs;..pthread_t t
3720: 68 72 65 61 64 5f 69 64 3b 0a 0a 09 61 72 67 73  hread_id;...args
3730: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
3740: 28 2a 61 72 67 73 29 29 3b 0a 09 61 72 67 73 2d  (*args));..args-
3750: 3e 66 70 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66  >fp = logfp;...f
3760: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
3770: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72  t = NULL;...pthr
3780: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
3790: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
37a0: 73 74 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  st_mutex, NULL);
37b0: 0a 0a 09 70 74 68 72 65 61 64 5f 63 72 65 61 74  ...pthread_creat
37c0: 65 28 26 74 68 72 65 61 64 5f 69 64 2c 20 4e 55  e(&thread_id, NU
37d0: 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  LL, filed_loggin
37e0: 67 5f 74 68 72 65 61 64 2c 20 61 72 67 73 29 3b  g_thread, args);
37f0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
3800: 28 22 53 54 41 52 54 22 29 3b 0a 0a 09 72 65 74  ("START");...ret
3810: 75 72 6e 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  urn(0);.}.#endif
3820: 0a 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44  ..#ifdef FILED_D
3830: 4f 4e 54 5f 54 49 4d 45 4f 55 54 0a 23 64 65 66  ONT_TIMEOUT.#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 74 68 72 65 61 64 5f 69  timeout_thread_i
3860: 6e 69 74 28 29 20 30 0a 23 64 65 66 69 6e 65 20  nit() 0.#define 
3870: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3880: 6f 75 74 5f 69 6e 69 74 28 29 20 30 0a 23 64 65  out_init() 0.#de
3890: 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65  fine filed_socke
38a0: 74 74 69 6d 65 6f 75 74 5f 61 63 63 65 70 74 28  ttimeout_accept(
38b0: 78 29 20 2f 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  x) /**/.#define 
38c0: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
38d0: 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e 67 5f 73  out_processing_s
38e0: 74 61 72 74 28 78 29 20 2f 2a 2a 2f 0a 23 64 65  tart(x) /**/.#de
38f0: 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b 65  fine filed_socke
3900: 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73  ttimeout_process
3910: 69 6e 67 5f 65 6e 64 28 78 29 20 2f 2a 2a 2f 0a  ing_end(x) /**/.
3920: 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f  #define filed_so
3930: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73  ckettimeout_clos
3940: 65 28 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 65 6c  e(x, y) /**/.#el
3950: 73 65 0a 74 69 6d 65 5f 74 20 66 69 6c 65 64 5f  se.time_t filed_
3960: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 69  sockettimeout_ti
3970: 6d 65 3b 0a 73 74 72 75 63 74 20 7b 0a 09 74 69  me;.struct {..ti
3980: 6d 65 5f 74 20 65 78 70 69 72 61 74 69 6f 6e 5f  me_t expiration_
3990: 74 69 6d 65 3b 0a 09 70 74 68 72 65 61 64 5f 74  time;..pthread_t
39a0: 20 74 68 72 65 61 64 5f 69 64 3b 0a 09 65 6e 75   thread_id;..enu
39b0: 6d 20 7b 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b  m {...filed_sock
39c0: 65 74 74 69 6d 65 6f 75 74 5f 76 61 6c 69 64 2c  ettimeout_valid,
39d0: 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ...filed_sockett
39e0: 69 6d 65 6f 75 74 5f 69 6e 76 61 6c 69 64 2c 0a  imeout_invalid,.
39f0: 09 7d 20 76 61 6c 69 64 3b 0a 7d 20 2a 66 69 6c  .} valid;.} *fil
3a00: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3a10: 5f 73 6f 63 6b 73 74 61 74 75 73 3b 0a 6c 6f 6e  _sockstatus;.lon
3a20: 67 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  g filed_socketti
3a30: 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73  meout_sockstatus
3a40: 5f 6c 65 6e 67 74 68 3b 0a 69 6e 74 20 66 69 6c  _length;.int fil
3a50: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3a60: 5f 64 65 76 6e 75 6c 6c 5f 66 64 3b 0a 70 74 68  _devnull_fd;.pth
3a70: 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 66 69 6c  read_mutex_t fil
3a80: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3a90: 5f 6d 75 74 65 78 20 3d 20 50 54 48 52 45 41 44  _mutex = PTHREAD
3aa0: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
3ab0: 45 52 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ER;..static int 
3ac0: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3ad0: 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61  out_sockfd_in_ra
3ae0: 6e 67 65 28 69 6e 74 20 73 6f 63 6b 66 64 29 20  nge(int sockfd) 
3af0: 7b 0a 09 69 66 20 28 73 6f 63 6b 66 64 20 3c 20  {..if (sockfd < 
3b00: 33 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  3) {...return(0)
3b10: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6f 63 6b 66  ;..}...if (sockf
3b20: 64 20 3e 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  d > filed_socket
3b30: 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74  timeout_sockstat
3b40: 75 73 5f 6c 65 6e 67 74 68 29 20 7b 0a 09 09 72  us_length) {...r
3b50: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72  eturn(0);..}...r
3b60: 65 74 75 72 6e 28 31 29 3b 0a 7d 0a 0a 73 74 61  eturn(1);.}..sta
3b70: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73  tic void filed_s
3b80: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65 78 70  ockettimeout_exp
3b90: 69 72 65 28 69 6e 74 20 73 6f 63 6b 66 64 2c 20  ire(int sockfd, 
3ba0: 69 6e 74 20 6c 65 6e 67 74 68 2c 20 69 6e 74 20  int length, int 
3bb0: 6c 6f 63 6b 68 65 6c 64 29 20 7b 0a 09 74 69 6d  lockheld) {..tim
3bc0: 65 5f 74 20 6e 6f 77 2c 20 65 78 70 69 72 65 3b  e_t now, expire;
3bd0: 0a 0a 09 69 66 20 28 21 6c 6f 63 6b 68 65 6c 64  ...if (!lockheld
3be0: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
3bf0: 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f  tex_lock(&filed_
3c00: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 6d 75  sockettimeout_mu
3c10: 74 65 78 29 3b 0a 09 7d 0a 0a 09 6e 6f 77 20 3d  tex);..}...now =
3c20: 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d   filed_sockettim
3c30: 65 6f 75 74 5f 74 69 6d 65 3b 0a 0a 09 65 78 70  eout_time;...exp
3c40: 69 72 65 20 3d 20 6e 6f 77 20 2b 20 6c 65 6e 67  ire = now + leng
3c50: 74 68 3b 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b  th;...filed_sock
3c60: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74  ettimeout_sockst
3c70: 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 65 78 70  atus[sockfd].exp
3c80: 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20 3d 20 65  iration_time = e
3c90: 78 70 69 72 65 3b 0a 0a 09 69 66 20 28 21 6c 6f  xpire;...if (!lo
3ca0: 63 6b 68 65 6c 64 29 20 7b 0a 09 09 70 74 68 72  ckheld) {...pthr
3cb0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
3cc0: 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  (&filed_socketti
3cd0: 6d 65 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 09 7d  meout_mutex);..}
3ce0: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74  ...return;.}..st
3cf0: 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f  atic void filed_
3d00: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 61 63  sockettimeout_ac
3d10: 63 65 70 74 28 69 6e 74 20 73 6f 63 6b 66 64 29  cept(int sockfd)
3d20: 20 7b 0a 09 69 66 20 28 21 66 69 6c 65 64 5f 73   {..if (!filed_s
3d30: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63  ockettimeout_soc
3d40: 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28 73 6f 63  kfd_in_range(soc
3d50: 6b 66 64 29 29 20 7b 0a 09 09 72 65 74 75 72 6e  kfd)) {...return
3d60: 3b 0a 09 7d 0a 0a 09 70 74 68 72 65 61 64 5f 6d  ;..}...pthread_m
3d70: 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64  utex_lock(&filed
3d80: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 6d  _sockettimeout_m
3d90: 75 74 65 78 29 3b 0a 0a 09 66 69 6c 65 64 5f 73  utex);...filed_s
3da0: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65 78 70  ockettimeout_exp
3db0: 69 72 65 28 73 6f 63 6b 66 64 2c 20 36 30 2c 20  ire(sockfd, 60, 
3dc0: 31 29 3b 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b  1);...filed_sock
3dd0: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74  ettimeout_sockst
3de0: 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 74 68 72  atus[sockfd].thr
3df0: 65 61 64 5f 69 64 20 3d 20 70 74 68 72 65 61 64  ead_id = pthread
3e00: 5f 73 65 6c 66 28 29 3b 0a 0a 09 66 69 6c 65 64  _self();...filed
3e10: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73  _sockettimeout_s
3e20: 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66 64  ockstatus[sockfd
3e30: 5d 2e 76 61 6c 69 64 20 3d 20 66 69 6c 65 64 5f  ].valid = filed_
3e40: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 76 61  sockettimeout_va
3e50: 6c 69 64 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d  lid;...pthread_m
3e60: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c  utex_unlock(&fil
3e70: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3e80: 5f 6d 75 74 65 78 29 3b 0a 0a 09 72 65 74 75 72  _mutex);...retur
3e90: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
3ea0: 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  d filed_socketti
3eb0: 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e 67  meout_processing
3ec0: 5f 73 74 61 72 74 28 69 6e 74 20 73 6f 63 6b 66  _start(int sockf
3ed0: 64 29 20 7b 0a 09 69 66 20 28 21 66 69 6c 65 64  d) {..if (!filed
3ee0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73  _sockettimeout_s
3ef0: 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28 73  ockfd_in_range(s
3f00: 6f 63 6b 66 64 29 29 20 7b 0a 09 09 72 65 74 75  ockfd)) {...retu
3f10: 72 6e 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73  rn;..}...filed_s
3f20: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65 78 70  ockettimeout_exp
3f30: 69 72 65 28 73 6f 63 6b 66 64 2c 20 38 36 34 30  ire(sockfd, 8640
3f40: 30 2c 20 30 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  0, 0);...return;
3f50: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
3f60: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3f70: 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e 67 5f 65  out_processing_e
3f80: 6e 64 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b  nd(int sockfd) {
3f90: 0a 09 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63  ..if (!filed_soc
3fa0: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66  kettimeout_sockf
3fb0: 64 5f 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66  d_in_range(sockf
3fc0: 64 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a  d)) {...return;.
3fd0: 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65  .}...filed_socke
3fe0: 74 74 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28  ttimeout_expire(
3ff0: 73 6f 63 6b 66 64 2c 20 36 30 2c 20 30 29 3b 0a  sockfd, 60, 0);.
4000: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
4010: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73  tic void filed_s
4020: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f  ockettimeout_clo
4030: 73 65 28 69 6e 74 20 73 6f 63 6b 66 64 2c 20 69  se(int sockfd, i
4040: 6e 74 20 6c 6f 63 6b 68 65 6c 64 29 20 7b 0a 09  nt lockheld) {..
4050: 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63 6b 65  if (!filed_socke
4060: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66 64 5f  ttimeout_sockfd_
4070: 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66 64 29  in_range(sockfd)
4080: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
4090: 0a 0a 09 69 66 20 28 21 6c 6f 63 6b 68 65 6c 64  ...if (!lockheld
40a0: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
40b0: 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f  tex_lock(&filed_
40c0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 6d 75  sockettimeout_mu
40d0: 74 65 78 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64  tex);..}...filed
40e0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73  _sockettimeout_s
40f0: 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66 64  ockstatus[sockfd
4100: 5d 2e 76 61 6c 69 64 20 3d 20 66 69 6c 65 64 5f  ].valid = filed_
4110: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69 6e  sockettimeout_in
4120: 76 61 6c 69 64 3b 0a 0a 09 69 66 20 28 21 6c 6f  valid;...if (!lo
4130: 63 6b 68 65 6c 64 29 20 7b 0a 09 09 70 74 68 72  ckheld) {...pthr
4140: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
4150: 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  (&filed_socketti
4160: 6d 65 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 09 7d  meout_mutex);..}
4170: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74  ...return;.}..st
4180: 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64  atic void *filed
4190: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74  _sockettimeout_t
41a0: 68 72 65 61 64 28 76 6f 69 64 20 2a 61 72 67 29  hread(void *arg)
41b0: 20 7b 0a 09 73 74 72 75 63 74 20 74 69 6d 65 73   {..struct times
41c0: 70 65 63 20 73 6c 65 65 70 5f 74 69 6d 65 3b 0a  pec sleep_time;.
41d0: 09 74 69 6d 65 5f 74 20 6e 6f 77 2c 20 65 78 70  .time_t now, exp
41e0: 69 72 61 74 69 6f 6e 5f 74 69 6d 65 3b 0a 09 70  iration_time;..p
41f0: 74 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f  thread_t thread_
4200: 69 64 3b 0a 09 6c 6f 6e 67 20 69 64 78 3b 0a 09  id;..long idx;..
4210: 69 6e 74 20 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  int count;..int 
4220: 76 61 6c 69 64 3b 0a 09 69 6e 74 20 74 69 6d 65  valid;..int time
4230: 5f 69 6e 74 65 72 76 61 6c 20 3d 20 33 30 3b 0a  _interval = 30;.
4240: 09 69 6e 74 20 63 68 65 63 6b 5f 70 65 72 69 6f  .int check_perio
4250: 64 20 3d 20 39 30 3b 0a 0a 09 77 68 69 6c 65 20  d = 90;...while 
4260: 28 31 29 20 7b 0a 09 09 66 6f 72 20 28 63 6f 75  (1) {...for (cou
4270: 6e 74 20 3d 20 30 3b 20 63 6f 75 6e 74 20 3c 20  nt = 0; count < 
4280: 28 63 68 65 63 6b 5f 70 65 72 69 6f 64 20 2f 20  (check_period / 
4290: 74 69 6d 65 5f 69 6e 74 65 72 76 61 6c 29 3b 20  time_interval); 
42a0: 63 6f 75 6e 74 2b 2b 29 20 7b 0a 09 09 09 73 6c  count++) {....sl
42b0: 65 65 70 5f 74 69 6d 65 2e 74 76 5f 73 65 63 20  eep_time.tv_sec 
42c0: 3d 20 74 69 6d 65 5f 69 6e 74 65 72 76 61 6c 3b  = time_interval;
42d0: 0a 09 09 09 73 6c 65 65 70 5f 74 69 6d 65 2e 74  ....sleep_time.t
42e0: 76 5f 6e 73 65 63 20 3d 20 30 3b 0a 09 09 09 6e  v_nsec = 0;....n
42f0: 61 6e 6f 73 6c 65 65 70 28 26 73 6c 65 65 70 5f  anosleep(&sleep_
4300: 74 69 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  time, NULL);....
4310: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c  .pthread_mutex_l
4320: 6f 63 6b 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65  ock(&filed_socke
4330: 74 74 69 6d 65 6f 75 74 5f 6d 75 74 65 78 29 3b  ttimeout_mutex);
4340: 0a 0a 09 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28  .....now = time(
4350: 4e 55 4c 4c 29 3b 0a 0a 09 09 09 66 69 6c 65 64  NULL);.....filed
4360: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74  _sockettimeout_t
4370: 69 6d 65 20 3d 20 6e 6f 77 3b 0a 0a 09 09 09 70  ime = now;.....p
4380: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
4390: 6f 63 6b 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65  ock(&filed_socke
43a0: 74 74 69 6d 65 6f 75 74 5f 6d 75 74 65 78 29 3b  ttimeout_mutex);
43b0: 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f  ...}....pthread_
43c0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65  mutex_lock(&file
43d0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
43e0: 6d 75 74 65 78 29 3b 0a 0a 09 09 66 6f 72 20 28  mutex);....for (
43f0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 66  idx = 0; idx < f
4400: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4410: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c 65  ut_sockstatus_le
4420: 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ngth; idx++) {..
4430: 09 09 76 61 6c 69 64 20 3d 20 66 69 6c 65 64 5f  ..valid = filed_
4440: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
4450: 63 6b 73 74 61 74 75 73 5b 69 64 78 5d 2e 76 61  ckstatus[idx].va
4460: 6c 69 64 3b 0a 0a 09 09 09 69 66 20 28 76 61 6c  lid;.....if (val
4470: 69 64 20 21 3d 20 66 69 6c 65 64 5f 73 6f 63 6b  id != filed_sock
4480: 65 74 74 69 6d 65 6f 75 74 5f 76 61 6c 69 64 29  ettimeout_valid)
4490: 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
44a0: 0a 09 09 09 7d 0a 0a 09 09 09 65 78 70 69 72 61  ....}.....expira
44b0: 74 69 6f 6e 5f 74 69 6d 65 20 3d 20 66 69 6c 65  tion_time = file
44c0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
44d0: 73 6f 63 6b 73 74 61 74 75 73 5b 69 64 78 5d 2e  sockstatus[idx].
44e0: 65 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 3b  expiration_time;
44f0: 0a 0a 09 09 09 74 68 72 65 61 64 5f 69 64 20 3d  .....thread_id =
4500: 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d   filed_sockettim
4510: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b  eout_sockstatus[
4520: 69 64 78 5d 2e 74 68 72 65 61 64 5f 69 64 3b 0a  idx].thread_id;.
4530: 0a 09 09 09 69 66 20 28 65 78 70 69 72 61 74 69  ....if (expirati
4540: 6f 6e 5f 74 69 6d 65 20 3e 20 6e 6f 77 29 20 7b  on_time > now) {
4550: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
4560: 09 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 73 6f  ..}.....filed_so
4570: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73  ckettimeout_clos
4580: 65 28 69 64 78 2c 20 31 29 3b 0a 0a 09 09 09 64  e(idx, 1);.....d
4590: 75 70 32 28 66 69 6c 65 64 5f 73 6f 63 6b 65 74  up2(filed_socket
45a0: 74 69 6d 65 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f  timeout_devnull_
45b0: 66 64 2c 20 69 64 78 29 3b 0a 0a 09 09 09 70 74  fd, idx);.....pt
45c0: 68 72 65 61 64 5f 6b 69 6c 6c 28 74 68 72 65 61  hread_kill(threa
45d0: 64 5f 69 64 2c 20 53 49 47 50 49 50 45 29 3b 0a  d_id, SIGPIPE);.
45e0: 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 6d  ..}....pthread_m
45f0: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c  utex_unlock(&fil
4600: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
4610: 5f 6d 75 74 65 78 29 3b 0a 09 7d 0a 0a 09 72 65  _mutex);..}...re
4620: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a  turn(NULL);.../*
4630: 20 4e 4f 54 52 45 41 43 48 3a 20 57 65 20 64 6f   NOTREACH: We do
4640: 6e 27 74 20 61 63 74 75 61 6c 6c 79 20 74 61 6b  n't actually tak
4650: 65 20 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20  e any arguments 
4660: 2a 2f 0a 09 61 72 67 20 3d 20 61 72 67 3b 0a 7d  */..arg = arg;.}
4670: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  ..static int fil
4680: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
4690: 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 76 6f 69  _thread_init(voi
46a0: 64 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 74 20  d) {..pthread_t 
46b0: 74 68 72 65 61 64 5f 69 64 3b 0a 0a 09 70 74 68  thread_id;...pth
46c0: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 68 72  read_create(&thr
46d0: 65 61 64 5f 69 64 2c 20 4e 55 4c 4c 2c 20 66 69  ead_id, NULL, fi
46e0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
46f0: 74 5f 74 68 72 65 61 64 2c 20 4e 55 4c 4c 29 3b  t_thread, NULL);
4700: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
4710: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
4720: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
4730: 69 6e 69 74 28 76 6f 69 64 29 20 7b 0a 09 6c 6f  init(void) {..lo
4740: 6e 67 20 6d 61 78 66 64 2c 20 69 64 78 3b 0a 0a  ng maxfd, idx;..
4750: 09 6d 61 78 66 64 20 3d 20 73 79 73 63 6f 6e 66  .maxfd = sysconf
4760: 28 5f 53 43 5f 4f 50 45 4e 5f 4d 41 58 29 3b 0a  (_SC_OPEN_MAX);.
4770: 09 69 66 20 28 6d 61 78 66 64 20 3c 3d 20 30 29  .if (maxfd <= 0)
4780: 20 7b 0a 09 09 6d 61 78 66 64 20 3d 20 34 30 39   {...maxfd = 409
4790: 36 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f  6;..}...filed_so
47a0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
47b0: 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 20 3d 20  status_length = 
47c0: 6d 61 78 66 64 3b 0a 09 66 69 6c 65 64 5f 73 6f  maxfd;..filed_so
47d0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
47e0: 73 74 61 74 75 73 20 3d 20 6d 61 6c 6c 6f 63 28  status = malloc(
47f0: 73 69 7a 65 6f 66 28 2a 66 69 6c 65 64 5f 73 6f  sizeof(*filed_so
4800: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
4810: 73 74 61 74 75 73 29 20 2a 20 66 69 6c 65 64 5f  status) * filed_
4820: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
4830: 63 6b 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 29  ckstatus_length)
4840: 3b 0a 09 69 66 20 28 66 69 6c 65 64 5f 73 6f 63  ;..if (filed_soc
4850: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73  kettimeout_socks
4860: 74 61 74 75 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tatus == NULL) {
4870: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
4880: 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
4890: 3b 20 69 64 78 20 3c 20 6d 61 78 66 64 3b 20 69  ; idx < maxfd; i
48a0: 64 78 2b 2b 29 20 7b 0a 09 09 66 69 6c 65 64 5f  dx++) {...filed_
48b0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
48c0: 63 6b 73 74 61 74 75 73 5b 69 64 78 5d 2e 76 61  ckstatus[idx].va
48d0: 6c 69 64 20 3d 20 66 69 6c 65 64 5f 73 6f 63 6b  lid = filed_sock
48e0: 65 74 74 69 6d 65 6f 75 74 5f 69 6e 76 61 6c 69  ettimeout_invali
48f0: 64 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f  d;..}...filed_so
4900: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64 65 76 6e  ckettimeout_devn
4910: 75 6c 6c 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f  ull_fd = open("/
4920: 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 57  dev/null", O_RDW
4930: 52 29 3b 0a 09 69 66 20 28 66 69 6c 65 64 5f 73  R);..if (filed_s
4940: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64 65 76  ockettimeout_dev
4950: 6e 75 6c 6c 5f 66 64 20 3c 20 30 29 20 7b 0a 09  null_fd < 0) {..
4960: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
4970: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 23  ..return(0);.}.#
4980: 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20  endif..#include 
4990: 3c 6c 69 6e 75 78 2f 73 65 63 63 6f 6d 70 2e 68  <linux/seccomp.h
49a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 69 6e 75  >.#include <linu
49b0: 78 2f 66 69 6c 74 65 72 2e 68 3e 0a 23 69 6e 63  x/filter.h>.#inc
49c0: 6c 75 64 65 20 3c 6c 69 6e 75 78 2f 61 75 64 69  lude <linux/audi
49d0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
49e0: 79 73 2f 70 74 72 61 63 65 2e 68 3e 0a 23 69 6e  ys/ptrace.h>.#in
49f0: 63 6c 75 64 65 20 3c 73 74 64 64 65 66 2e 68 3e  clude <stddef.h>
4a00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  ..static int fil
4a10: 65 64 5f 69 6e 69 74 5f 73 65 63 63 6f 6d 70 28  ed_init_seccomp(
4a20: 76 6f 69 64 29 20 7b 0a 09 73 74 72 75 63 74 20  void) {..struct 
4a30: 73 6f 63 6b 5f 66 70 72 6f 67 20 66 69 6c 74 65  sock_fprog filte
4a40: 72 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 5f  r;..struct sock_
4a50: 66 69 6c 74 65 72 20 72 75 6c 65 73 5b 5d 20 3d  filter rules[] =
4a60: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 66 69 6c   {.#include "fil
4a70: 65 64 2e 73 65 63 63 6f 6d 70 2e 68 22 0a 09 7d  ed.seccomp.h"..}
4a80: 3b 0a 09 69 6e 74 20 70 72 63 74 6c 5f 72 65 74  ;..int prctl_ret
4a90: 3b 0a 0a 09 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ;.../* Do not al
4aa0: 6c 6f 77 20 61 6e 79 20 70 72 69 76 69 6c 65 67  low any privileg
4ab0: 65 20 63 68 61 6e 67 65 73 20 62 65 79 6f 6e 64  e changes beyond
4ac0: 20 74 68 69 73 20 70 6f 69 6e 74 20 2a 2f 0a 20   this point */. 
4ad0: 09 70 72 63 74 6c 5f 72 65 74 20 3d 20 70 72 63  .prctl_ret = prc
4ae0: 74 6c 28 50 52 5f 53 45 54 5f 4e 4f 5f 4e 45 57  tl(PR_SET_NO_NEW
4af0: 5f 50 52 49 56 53 2c 20 31 2c 20 30 2c 20 30 2c  _PRIVS, 1, 0, 0,
4b00: 20 30 29 3b 0a 09 69 66 20 28 70 72 63 74 6c 5f   0);..if (prctl_
4b10: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  ret != 0) {...re
4b20: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 66  turn(-1);..}...f
4b30: 69 6c 74 65 72 2e 6c 65 6e 20 3d 20 73 69 7a 65  ilter.len = size
4b40: 6f 66 28 72 75 6c 65 73 29 20 2f 20 73 69 7a 65  of(rules) / size
4b50: 6f 66 28 2a 72 75 6c 65 73 29 3b 0a 09 66 69 6c  of(*rules);..fil
4b60: 74 65 72 2e 66 69 6c 74 65 72 20 3d 20 72 75 6c  ter.filter = rul
4b70: 65 73 3b 0a 0a 09 70 72 63 74 6c 5f 72 65 74 20  es;...prctl_ret 
4b80: 3d 20 70 72 63 74 6c 28 50 52 5f 53 45 54 5f 53  = prctl(PR_SET_S
4b90: 45 43 43 4f 4d 50 2c 20 53 45 43 43 4f 4d 50 5f  ECCOMP, SECCOMP_
4ba0: 4d 4f 44 45 5f 46 49 4c 54 45 52 2c 20 26 66 69  MODE_FILTER, &fi
4bb0: 6c 74 65 72 29 3b 0a 09 69 66 20 28 70 72 63 74  lter);..if (prct
4bc0: 6c 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  l_ret != 0) {...
4bd0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
4be0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
4bf0: 2a 20 46 6f 72 6d 61 74 20 74 69 6d 65 20 70 65  * Format time pe
4c00: 72 20 52 46 43 32 36 31 36 20 2a 2f 0a 73 74 61  r RFC2616 */.sta
4c10: 74 69 63 20 63 68 61 72 20 2a 66 69 6c 65 64 5f  tic char *filed_
4c20: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 63 68 61 72  format_time(char
4c30: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
4c40: 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 63 6f 6e   buffer_len, con
4c50: 73 74 20 74 69 6d 65 5f 74 20 74 69 6d 65 69 6e  st time_t timein
4c60: 66 6f 29 20 7b 0a 09 73 74 72 75 63 74 20 74 6d  fo) {..struct tm
4c70: 20 74 69 6d 65 69 6e 66 6f 5f 74 6d 2c 20 2a 74   timeinfo_tm, *t
4c80: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 3b 0a 0a 09  imeinfo_tm_p;...
4c90: 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 20  timeinfo_tm_p = 
4ca0: 67 6d 74 69 6d 65 5f 72 28 26 74 69 6d 65 69 6e  gmtime_r(&timein
4cb0: 66 6f 2c 20 26 74 69 6d 65 69 6e 66 6f 5f 74 6d  fo, &timeinfo_tm
4cc0: 29 3b 0a 09 69 66 20 28 74 69 6d 65 69 6e 66 6f  );..if (timeinfo
4cd0: 5f 74 6d 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  _tm_p == NULL) {
4ce0: 0a 09 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f  ...return("unkno
4cf0: 77 6e 22 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65  wn");..}...buffe
4d00: 72 5b 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31  r[buffer_len - 1
4d10: 5d 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65  ] = '\0';..buffe
4d20: 72 5f 6c 65 6e 20 3d 20 73 74 72 66 74 69 6d 65  r_len = strftime
4d30: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f  (buffer, buffer_
4d40: 6c 65 6e 20 2d 20 31 2c 20 22 25 61 2c 20 25 64  len - 1, "%a, %d
4d50: 20 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20   %b %Y %H:%M:%S 
4d60: 47 4d 54 22 2c 20 74 69 6d 65 69 6e 66 6f 5f 74  GMT", timeinfo_t
4d70: 6d 5f 70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62  m_p);...return(b
4d80: 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 68 61  uffer);.}../* ha
4d90: 73 68 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  sh */.static uns
4da0: 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f  igned int filed_
4db0: 68 61 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67  hash(const unsig
4dc0: 6e 65 64 20 63 68 61 72 20 2a 76 61 6c 75 65 2c  ned char *value,
4dd0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 6f   unsigned int mo
4de0: 64 75 6c 75 73 29 20 7b 0a 09 75 6e 73 69 67 6e  dulus) {..unsign
4df0: 65 64 20 63 68 61 72 20 63 75 72 72 2c 20 70 72  ed char curr, pr
4e00: 65 76 3b 0a 09 69 6e 74 20 64 69 66 66 3b 0a 09  ev;..int diff;..
4e10: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 65 74  unsigned int ret
4e20: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
4e30: 6d 6f 64 75 6c 75 73 20 2d 20 31 3b 0a 09 70 72  modulus - 1;..pr
4e40: 65 76 20 3d 20 6d 6f 64 75 6c 75 73 20 25 20 32  ev = modulus % 2
4e50: 35 35 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 75  55;...while ((cu
4e60: 72 72 20 3d 20 2a 76 61 6c 75 65 29 29 20 7b 0a  rr = *value)) {.
4e70: 09 09 69 66 20 28 63 75 72 72 20 3c 20 33 32 29  ..if (curr < 32)
4e80: 20 7b 0a 09 09 09 63 75 72 72 20 3d 20 32 35 35   {....curr = 255
4e90: 20 2d 20 63 75 72 72 3b 0a 09 09 7d 20 65 6c 73   - curr;...} els
4ea0: 65 20 7b 0a 09 09 09 63 75 72 72 20 2d 3d 20 33  e {....curr -= 3
4eb0: 32 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 72  2;...}....if (pr
4ec0: 65 76 20 3c 20 63 75 72 72 29 20 7b 0a 09 09 09  ev < curr) {....
4ed0: 64 69 66 66 20 3d 20 63 75 72 72 20 2d 20 70 72  diff = curr - pr
4ee0: 65 76 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ev;...} else {..
4ef0: 09 09 64 69 66 66 20 3d 20 70 72 65 76 20 2d 20  ..diff = prev - 
4f00: 63 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 70 72 65  curr;...}....pre
4f10: 76 20 3d 20 63 75 72 72 3b 0a 0a 09 09 72 65 74  v = curr;....ret
4f20: 76 61 6c 20 3c 3c 3d 20 33 3b 0a 09 09 72 65 74  val <<= 3;...ret
4f30: 76 61 6c 20 26 3d 20 30 78 46 46 46 46 46 46 46  val &= 0xFFFFFFF
4f40: 46 4c 55 3b 0a 09 09 72 65 74 76 61 6c 20 5e 3d  FLU;...retval ^=
4f50: 20 64 69 66 66 3b 0a 0a 09 09 76 61 6c 75 65 2b   diff;....value+
4f60: 2b 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  +;..}...retval =
4f70: 20 72 65 74 76 61 6c 20 25 20 6d 6f 64 75 6c 75   retval % modulu
4f80: 73 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  s;...return(retv
4f90: 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20  al);.}../* Find 
4fa0: 61 20 6d 69 6d 65 2d 74 79 70 65 20 62 61 73 65  a mime-type base
4fb0: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  d on the filenam
4fc0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  e */.static cons
4fd0: 74 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 64 65  t char *filed_de
4fe0: 74 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65  termine_mimetype
4ff0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
5000: 68 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72  h) {..const char
5010: 20 2a 70 3b 0a 0a 09 70 20 3d 20 73 74 72 72 63   *p;...p = strrc
5020: 68 72 28 70 61 74 68 2c 20 27 2e 27 29 3b 0a 09  hr(path, '.');..
5030: 69 66 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  if (p == NULL) {
5040: 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f  ...return(FILED_
5050: 44 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09  DEFAULT_TYPE);..
5060: 7d 0a 0a 09 70 2b 2b 3b 0a 09 69 66 20 28 2a 70  }...p++;..if (*p
5070: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65   == '\0') {...re
5080: 74 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55  turn(FILED_DEFAU
5090: 4c 54 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 66  LT_TYPE);..}...f
50a0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62  iled_log_msg_deb
50b0: 75 67 28 22 4c 6f 6f 6b 69 6e 67 20 75 70 20 4d  ug("Looking up M
50c0: 49 4d 45 20 74 79 70 65 20 66 6f 72 20 25 73 20  IME type for %s 
50d0: 28 68 61 73 68 20 3d 20 25 6c 6c 75 29 22 2c 20  (hash = %llu)", 
50e0: 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  p, (unsigned lon
50f0: 67 20 6c 6f 6e 67 29 20 66 69 6c 65 64 5f 68 61  g long) filed_ha
5100: 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sh((const unsign
5110: 65 64 20 63 68 61 72 20 2a 29 20 70 2c 20 31 36  ed char *) p, 16
5120: 37 37 37 32 35 39 29 29 3b 0a 0a 23 69 6e 63 6c  777259));..#incl
5130: 75 64 65 20 22 66 69 6c 65 64 2d 6d 69 6d 65 2d  ude "filed-mime-
5140: 74 79 70 65 73 2e 68 22 0a 0a 09 72 65 74 75 72  types.h"...retur
5150: 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f  n(FILED_DEFAULT_
5160: 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  TYPE);.}../* Gen
5170: 65 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 69  erate a unique i
5180: 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 73 74 61  dentifier */.sta
5190: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 67  tic void filed_g
51a0: 65 6e 65 72 61 74 65 5f 65 74 61 67 28 63 68 61  enerate_etag(cha
51b0: 72 20 2a 65 74 61 67 2c 20 73 69 7a 65 5f 74 20  r *etag, size_t 
51c0: 6c 65 6e 67 74 68 29 20 7b 0a 09 73 6e 70 72 69  length) {..snpri
51d0: 6e 74 66 28 65 74 61 67 2c 20 6c 65 6e 67 74 68  ntf(etag, length
51e0: 2c 20 22 25 6c 6c 78 2d 25 6c 6c 78 25 6c 6c 78  , "%llx-%llx%llx
51f0: 25 6c 6c 78 25 6c 6c 78 22 2c 0a 09 09 28 75 6e  %llx%llx",...(un
5200: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
5210: 29 20 74 69 6d 65 28 4e 55 4c 4c 29 2c 0a 09 09  ) time(NULL),...
5220: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
5230: 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09  ong) random(),..
5240: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
5250: 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a  long) random(),.
5260: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
5270: 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c   long) random(),
5280: 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
5290: 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29  g long) random()
52a0: 0a 09 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 46  ..);.}..#ifdef F
52b0: 49 4c 45 44 5f 46 41 4b 45 5f 43 48 52 4f 4f 54  ILED_FAKE_CHROOT
52c0: 0a 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 61 20  ./* Translate a 
52d0: 70 61 74 68 20 69 6e 74 6f 20 61 20 66 61 6b 65  path into a fake
52e0: 20 63 68 72 6f 6f 74 20 70 61 74 68 20 2a 2f 0a   chroot path */.
52f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5300: 72 20 2a 66 69 6c 65 64 5f 70 61 74 68 5f 74 72  r *filed_path_tr
5310: 61 6e 73 6c 61 74 65 28 63 6f 6e 73 74 20 63 68  anslate(const ch
5320: 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75 63 74  ar *path, struct
5330: 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a   filed_options *
5340: 6f 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 61 74  options) {..stat
5350: 69 63 20 5f 5f 74 68 72 65 61 64 20 63 68 61 72  ic __thread char
5360: 20 70 61 74 68 42 75 66 66 65 72 5b 38 31 39 32   pathBuffer[8192
5370: 5d 3b 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74 66  ];..int snprintf
5380: 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 66 20 6e 6f  _ret;.../* If no
5390: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 72 6f 6f   alternative roo
53a0: 74 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  t is specified, 
53b0: 72 65 74 75 72 6e 20 74 68 65 20 75 6e 61 64 6f  return the unado
53c0: 72 6e 65 64 20 70 61 74 68 20 2a 2f 0a 09 69 66  rned path */..if
53d0: 20 28 21 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b 65   (!options->fake
53e0: 5f 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09 72 65  _newroot) {...re
53f0: 74 75 72 6e 28 70 61 74 68 29 3b 0a 09 7d 0a 0a  turn(path);..}..
5400: 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5410: 74 68 69 73 20 72 65 71 75 65 73 74 20 77 69 6c  this request wil
5420: 6c 20 6e 6f 74 20 67 6f 20 6f 75 74 73 69 64 65  l not go outside
5430: 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65   of the specifie
5440: 64 20 72 6f 6f 74 20 2a 2f 0a 09 69 66 20 28 73  d root */..if (s
5450: 74 72 73 74 72 28 70 61 74 68 2c 20 22 2f 2e 2e  trstr(path, "/..
5460: 2f 22 29 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 70  /") != NULL || p
5470: 61 74 68 5b 30 5d 20 21 3d 20 27 2f 27 29 20 7b  ath[0] != '/') {
5480: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
5490: 5f 64 65 62 75 67 28 22 55 6e 61 62 6c 65 20 74  _debug("Unable t
54a0: 6f 20 74 72 61 6e 73 6c 61 74 65 20 70 61 74 68  o translate path
54b0: 20 5c 22 25 73 5c 22 2c 20 63 6f 6e 74 61 69 6e   \"%s\", contain
54c0: 73 20 69 6e 76 61 6c 69 64 20 63 68 61 72 61 63  s invalid charac
54d0: 74 65 72 73 22 2c 20 70 61 74 68 29 3b 0a 0a 09  ters", path);...
54e0: 09 72 65 74 75 72 6e 28 6f 70 74 69 6f 6e 73 2d  .return(options-
54f0: 3e 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 29 3b 0a  >fake_newroot);.
5500: 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 74  .}.../* Create t
5510: 68 65 20 6e 65 77 20 70 61 74 68 20 69 6e 74 6f  he new path into
5520: 20 6f 75 72 20 6c 6f 63 61 6c 20 28 54 4c 53 29   our local (TLS)
5530: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 20 2a   static buffer *
5540: 2f 0a 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  /..snprintf_ret 
5550: 3d 20 73 6e 70 72 69 6e 74 66 28 70 61 74 68 42  = snprintf(pathB
5560: 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 70 61  uffer, sizeof(pa
5570: 74 68 42 75 66 66 65 72 29 2c 20 22 25 73 2f 25  thBuffer), "%s/%
5580: 73 22 2c 20 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b  s", options->fak
5590: 65 5f 6e 65 77 72 6f 6f 74 2c 20 70 61 74 68 29  e_newroot, path)
55a0: 3b 0a 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f  ;..if (snprintf_
55b0: 72 65 74 20 3c 20 30 20 7c 7c 20 28 28 75 6e 73  ret < 0 || ((uns
55c0: 69 67 6e 65 64 20 69 6e 74 29 20 73 6e 70 72 69  igned int) snpri
55d0: 6e 74 66 5f 72 65 74 29 20 3e 3d 20 73 69 7a 65  ntf_ret) >= size
55e0: 6f 66 28 70 61 74 68 42 75 66 66 65 72 29 29 20  of(pathBuffer)) 
55f0: 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  {...filed_log_ms
5600: 67 5f 64 65 62 75 67 28 22 55 6e 61 62 6c 65 20  g_debug("Unable 
5610: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 70 61 74  to translate pat
5620: 68 20 5c 22 25 73 5c 22 2c 20 77 69 6c 6c 20 6e  h \"%s\", will n
5630: 6f 74 20 66 69 74 20 69 6e 74 6f 20 6e 65 77 20  ot fit into new 
5640: 62 75 66 66 65 72 22 2c 20 70 61 74 68 29 3b 0a  buffer", path);.
5650: 0a 09 09 72 65 74 75 72 6e 28 6f 70 74 69 6f 6e  ...return(option
5660: 73 2d 3e 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 29  s->fake_newroot)
5670: 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  ;..}...filed_log
5680: 5f 6d 73 67 5f 64 65 62 75 67 28 22 54 72 61 6e  _msg_debug("Tran
5690: 73 6c 61 74 69 6e 67 20 70 61 74 68 20 5c 22 25  slating path \"%
56a0: 73 5c 22 20 69 6e 74 6f 20 5c 22 25 73 5c 22 22  s\" into \"%s\""
56b0: 2c 20 70 61 74 68 2c 20 70 61 74 68 42 75 66 66  , path, pathBuff
56c0: 65 72 29 3b 0a 0a 09 2f 2a 20 52 65 74 75 72 6e  er);.../* Return
56d0: 20 74 68 65 20 6e 65 77 20 70 61 74 68 20 2a 2f   the new path */
56e0: 0a 09 72 65 74 75 72 6e 28 70 61 74 68 42 75 66  ..return(pathBuf
56f0: 66 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  fer);.}..static 
5700: 76 6f 69 64 20 66 69 6c 65 64 5f 70 61 74 68 5f  void filed_path_
5710: 74 72 61 6e 73 6c 61 74 65 5f 73 65 74 5f 72 6f  translate_set_ro
5720: 6f 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 76  ot(const char *v
5730: 61 72 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  ar, struct filed
5740: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e  _options *option
5750: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76  s, const char *v
5760: 61 6c 29 20 7b 0a 09 6f 70 74 69 6f 6e 73 2d 3e  al) {..options->
5770: 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 20 3d 20 73  fake_newroot = s
5780: 74 72 64 75 70 28 76 61 6c 29 3b 0a 0a 09 72 65  trdup(val);...re
5790: 74 75 72 6e 3b 0a 0a 09 2f 2a 20 76 61 72 20 69  turn;.../* var i
57a0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 74  s only used in t
57b0: 68 65 20 6d 61 63 72 6f 20 2d 2d 20 64 69 73 63  he macro -- disc
57c0: 61 72 64 20 69 74 20 68 65 72 65 20 2a 2f 0a 09  ard it here */..
57d0: 76 61 72 20 3d 20 76 61 72 3b 0a 7d 0a 23 65 6c  var = var;.}.#el
57e0: 73 65 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64  se.#define filed
57f0: 5f 70 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 28  _path_translate(
5800: 70 61 74 68 2c 20 6f 70 74 69 6f 6e 73 29 20 70  path, options) p
5810: 61 74 68 0a 23 64 65 66 69 6e 65 20 66 69 6c 65  ath.#define file
5820: 64 5f 70 61 74 68 5f 74 72 61 6e 73 6c 61 74 65  d_path_translate
5830: 5f 73 65 74 5f 72 6f 6f 74 28 76 61 72 2c 20 6f  _set_root(var, o
5840: 70 74 69 6f 6e 73 2c 20 76 61 6c 29 20 76 61 72  ptions, val) var
5850: 20 3d 20 73 74 72 64 75 70 28 76 61 6c 29 0a 23   = strdup(val).#
5860: 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 65 6e 20 61  endif../* Open a
5870: 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e   file and return
5880: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
5890: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
58a0: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
58b0: 6f 20 2a 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69  o *filed_open_fi
58c0: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  le(const char *p
58d0: 61 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65  ath, struct file
58e0: 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 62 75 66 66  d_fileinfo *buff
58f0: 65 72 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  er, struct filed
5900: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e  _options *option
5910: 73 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c  s) {..struct fil
5920: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63  ed_fileinfo *cac
5930: 68 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  he;..unsigned in
5940: 74 20 63 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66  t cache_idx;..of
5950: 66 5f 74 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64  f_t len;..int fd
5960: 3b 0a 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69  ;...if (filed_fi
5970: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73  leinfo_fdcache_s
5980: 69 7a 65 20 21 3d 20 30 29 20 7b 0a 09 09 63 61  ize != 0) {...ca
5990: 63 68 65 5f 69 64 78 20 3d 20 66 69 6c 65 64 5f  che_idx = filed_
59a0: 68 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69  hash((const unsi
59b0: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70 61 74  gned char *) pat
59c0: 68 2c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  h, filed_fileinf
59d0: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29 3b  o_fdcache_size);
59e0: 0a 0a 09 09 63 61 63 68 65 20 3d 20 26 66 69 6c  ....cache = &fil
59f0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
5a00: 63 68 65 5b 63 61 63 68 65 5f 69 64 78 5d 3b 0a  che[cache_idx];.
5a10: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
5a20: 5f 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67 20  _debug("Locking 
5a30: 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25  mutex for idx: %
5a40: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
5a50: 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b  ong) cache_idx);
5a60: 0a 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ....pthread_mute
5a70: 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  x_lock(&cache->m
5a80: 75 74 65 78 29 3b 0a 0a 09 09 66 69 6c 65 64 5f  utex);....filed_
5a90: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43  log_msg_debug("C
5aa0: 6f 6d 70 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67  ompleted locking
5ab0: 20 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20   mutex for idx: 
5ac0: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
5ad0: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29  long) cache_idx)
5ae0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  ;..} else {...ca
5af0: 63 68 65 5f 69 64 78 20 3d 20 30 3b 0a 09 09 63  che_idx = 0;...c
5b00: 61 63 68 65 20 3d 20 62 75 66 66 65 72 3b 0a 09  ache = buffer;..
5b10: 09 63 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20  .cache->path[0] 
5b20: 3d 20 27 5c 30 27 3b 0a 09 09 63 61 63 68 65 2d  = '\0';...cache-
5b30: 3e 66 64 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 69  >fd = -1;..}...i
5b40: 66 20 28 73 74 72 63 6d 70 28 70 61 74 68 2c 20  f (strcmp(path, 
5b50: 63 61 63 68 65 2d 3e 70 61 74 68 29 20 21 3d 20  cache->path) != 
5b60: 30 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  0) {...filed_log
5b70: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 61 63 68  _msg_debug("Cach
5b80: 65 20 6d 69 73 73 20 66 6f 72 20 69 64 78 3a 20  e miss for idx: 
5b90: 25 6c 75 3a 20 4f 4c 44 20 5c 22 25 73 5c 22 2c  %lu: OLD \"%s\",
5ba0: 20 4e 45 57 20 5c 22 25 73 5c 22 22 2c 20 28 75   NEW \"%s\"", (u
5bb0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
5bc0: 63 68 65 5f 69 64 78 2c 20 63 61 63 68 65 2d 3e  che_idx, cache->
5bd0: 70 61 74 68 2c 20 70 61 74 68 29 3b 0a 0a 09 09  path, path);....
5be0: 66 64 20 3d 20 6f 70 65 6e 28 66 69 6c 65 64 5f  fd = open(filed_
5bf0: 70 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 28 70  path_translate(p
5c00: 61 74 68 2c 20 6f 70 74 69 6f 6e 73 29 2c 20 4f  ath, options), O
5c10: 5f 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52 47  _RDONLY | O_LARG
5c20: 45 46 49 4c 45 29 3b 0a 09 09 69 66 20 28 66 64  EFILE);...if (fd
5c30: 20 3c 20 30 29 20 7b 0a 09 09 09 69 66 20 28 66   < 0) {....if (f
5c40: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
5c50: 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20 30 29  cache_size != 0)
5c60: 20 7b 0a 09 09 09 09 70 74 68 72 65 61 64 5f 6d   {.....pthread_m
5c70: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63  utex_unlock(&cac
5c80: 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 09 09 09 7d  he->mutex);....}
5c90: 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
5ca0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61  );...}....if (ca
5cb0: 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a  che->fd >= 0) {.
5cc0: 09 09 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e  ...close(cache->
5cd0: 66 64 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20  fd);...}....len 
5ce0: 3d 20 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53  = lseek(fd, 0, S
5cf0: 45 45 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65  EEK_END);...lsee
5d00: 6b 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45  k(fd, 0, SEEK_SE
5d10: 54 29 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64  T);....cache->fd
5d20: 20 3d 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e   = fd;...cache->
5d30: 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73 74 72  len = len;...str
5d40: 63 70 79 28 63 61 63 68 65 2d 3e 70 61 74 68 2c  cpy(cache->path,
5d50: 20 70 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d   path);...cache-
5d60: 3e 74 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65  >type = filed_de
5d70: 74 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65  termine_mimetype
5d80: 28 70 61 74 68 29 3b 0a 09 09 66 69 6c 65 64 5f  (path);...filed_
5d90: 67 65 6e 65 72 61 74 65 5f 65 74 61 67 28 63 61  generate_etag(ca
5da0: 63 68 65 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f  che->etag, sizeo
5db0: 66 28 63 61 63 68 65 2d 3e 65 74 61 67 29 29 3b  f(cache->etag));
5dc0: 0a 0a 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a  ..../* XXX:TODO:
5dd0: 20 44 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09 09   Determine */...
5de0: 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d  cache->lastmod =
5df0: 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69   filed_format_ti
5e00: 6d 65 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  me(cache->lastmo
5e10: 64 5f 62 2c 20 73 69 7a 65 6f 66 28 63 61 63 68  d_b, sizeof(cach
5e20: 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20 74  e->lastmod_b), t
5e30: 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29 3b  ime(NULL) - 30);
5e40: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69 6c  ..} else {...fil
5e50: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
5e60: 28 22 43 61 63 68 65 20 68 69 74 20 66 6f 72 20  ("Cache hit for 
5e70: 69 64 78 3a 20 25 6c 75 3a 20 50 41 54 48 20 5c  idx: %lu: PATH \
5e80: 22 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65  "%s\"", (unsigne
5e90: 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64  d long) cache_id
5ea0: 78 2c 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 69  x, path);..}...i
5eb0: 66 20 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  f (filed_fileinf
5ec0: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21  o_fdcache_size !
5ed0: 3d 20 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a  = 0) {.../*... *
5ee0: 20 57 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   We have to make
5ef0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 46 44 2c   a duplicate FD,
5f00: 20 62 65 63 61 75 73 65 20 6f 6e 63 65 20 77 65   because once we
5f10: 20 72 65 6c 65 61 73 65 20 74 68 65 20 63 61 63   release the cac
5f20: 68 65 0a 09 09 20 2a 20 6d 75 74 65 78 2c 20 74  he... * mutex, t
5f30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5f40: 6f 72 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64  or may be closed
5f50: 0a 09 09 20 2a 2f 0a 09 09 66 64 20 3d 20 64 75  ... */...fd = du
5f60: 70 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09  p(cache->fd);...
5f70: 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09  if (fd < 0) {...
5f80: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  .pthread_mutex_u
5f90: 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75  nlock(&cache->mu
5fa0: 74 65 78 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  tex);.....return
5fb0: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 62  (NULL);...}....b
5fc0: 75 66 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  uffer->fd = fd;.
5fd0: 09 09 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20  ..buffer->len = 
5fe0: 63 61 63 68 65 2d 3e 6c 65 6e 3b 0a 09 09 62 75  cache->len;...bu
5ff0: 66 66 65 72 2d 3e 74 79 70 65 20 3d 20 63 61 63  ffer->type = cac
6000: 68 65 2d 3e 74 79 70 65 3b 0a 09 09 6d 65 6d 63  he->type;...memc
6010: 70 79 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d  py(buffer->lastm
6020: 6f 64 5f 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73  od_b, cache->las
6030: 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62  tmod_b, sizeof(b
6040: 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62  uffer->lastmod_b
6050: 29 29 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66  ));...memcpy(buf
6060: 66 65 72 2d 3e 65 74 61 67 2c 20 63 61 63 68 65  fer->etag, cache
6070: 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66 28 62  ->etag, sizeof(b
6080: 75 66 66 65 72 2d 3e 65 74 61 67 29 29 3b 0a 09  uffer->etag));..
6090: 09 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64  .buffer->lastmod
60a0: 20 3d 20 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d   = buffer->lastm
60b0: 6f 64 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e 6c  od_b + (cache->l
60c0: 61 73 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d 3e  astmod - cache->
60d0: 6c 61 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 09 70  lastmod_b);....p
60e0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
60f0: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
6100: 78 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  x);..}...return(
6110: 62 75 66 66 65 72 29 3b 0a 0a 09 2f 2a 20 6f 70  buffer);.../* op
6120: 74 69 6f 6e 73 20 69 73 20 6f 6e 6c 79 20 75 73  tions is only us
6130: 65 64 20 69 66 20 66 61 6b 65 20 63 68 72 6f 6f  ed if fake chroo
6140: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 63 6f  t is enabled, co
6150: 6e 66 75 73 65 20 74 68 65 20 63 6f 6d 70 69 6c  nfuse the compil
6160: 65 72 20 2a 2f 0a 09 6f 70 74 69 6f 6e 73 20 3d  er */..options =
6170: 20 6f 70 74 69 6f 6e 73 3b 0a 7d 0a 0a 2f 2a 20   options;.}../* 
6180: 50 72 6f 63 65 73 73 20 61 6e 20 48 54 54 50 20  Process an HTTP 
6190: 72 65 71 75 65 73 74 20 61 6e 64 20 72 65 74 75  request and retu
61a0: 72 6e 20 74 68 65 20 70 61 74 68 20 72 65 71 75  rn the path requ
61b0: 65 73 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  ested */.static 
61c0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74  struct filed_htt
61d0: 70 5f 72 65 71 75 65 73 74 20 2a 66 69 6c 65 64  p_request *filed
61e0: 5f 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73  _get_http_reques
61f0: 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75  t(FILE *fp, stru
6200: 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65  ct filed_http_re
6210: 71 75 65 73 74 20 2a 62 75 66 66 65 72 5f 73 74  quest *buffer_st
6220: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f  , struct filed_o
6230: 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29  ptions *options)
6240: 20 7b 0a 09 63 68 61 72 20 2a 6d 65 74 68 6f 64   {..char *method
6250: 2c 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a  , *path;..char *
6260: 62 75 66 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66  buffer, *workbuf
6270: 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72  fer, *workbuffer
6280: 5f 6e 65 78 74 3b 0a 09 63 68 61 72 20 2a 66 67  _next;..char *fg
6290: 65 74 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74  ets_ret;..size_t
62a0: 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 70 61 74   buffer_len, pat
62b0: 68 5f 6c 65 6e 3b 0a 09 6f 66 66 5f 74 20 72 61  h_len;..off_t ra
62c0: 6e 67 65 5f 73 74 61 72 74 2c 20 72 61 6e 67 65  nge_start, range
62d0: 5f 65 6e 64 2c 20 72 61 6e 67 65 5f 6c 65 6e 67  _end, range_leng
62e0: 74 68 3b 0a 09 69 6e 74 20 72 61 6e 67 65 5f 72  th;..int range_r
62f0: 65 71 75 65 73 74 3b 0a 09 69 6e 74 20 73 6e 70  equest;..int snp
6300: 72 69 6e 74 66 5f 72 65 74 3b 0a 09 69 6e 74 20  rintf_ret;..int 
6310: 69 3b 0a 0a 09 2f 2a 20 53 65 74 20 74 6f 20 64  i;.../* Set to d
6320: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f  efault values */
6330: 0a 09 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20  ..range_start = 
6340: 30 3b 0a 09 72 61 6e 67 65 5f 65 6e 64 20 20 20  0;..range_end   
6350: 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 72 65 71 75  = 0;..range_requ
6360: 65 73 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f  est = 0;..range_
6370: 6c 65 6e 67 74 68 20 3d 20 2d 31 3b 0a 09 62 75  length = -1;..bu
6380: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
6390: 2e 68 6f 73 74 2e 70 72 65 73 65 6e 74 20 3d 20  .host.present = 
63a0: 30 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68  0;..buffer_st->h
63b0: 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f  eaders.connectio
63c0: 6e 20 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  n = FILED_CONNEC
63d0: 54 49 4f 4e 5f 43 4c 4f 53 45 3b 0a 0a 09 62 75  TION_CLOSE;...bu
63e0: 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74  ffer = buffer_st
63f0: 2d 3e 74 6d 70 62 75 66 3b 0a 09 62 75 66 66 65  ->tmpbuf;..buffe
6400: 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62  r_len = sizeof(b
6410: 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66  uffer_st->tmpbuf
6420: 29 3b 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d  );...fgets_ret =
6430: 20 66 67 65 74 73 28 62 75 66 66 65 72 2c 20 62   fgets(buffer, b
6440: 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a  uffer_len, fp);.
6450: 09 69 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d  .if (fgets_ret =
6460: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
6470: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 6d  rn(NULL);..}...m
6480: 65 74 68 6f 64 20 3d 20 62 75 66 66 65 72 3b 0a  ethod = buffer;.
6490: 0a 09 62 75 66 66 65 72 20 3d 20 73 74 72 63 68  ..buffer = strch
64a0: 72 28 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a  r(buffer, ' ');.
64b0: 09 69 66 20 28 62 75 66 66 65 72 20 3d 3d 20 4e  .if (buffer == N
64c0: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
64d0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 62 75 66  NULL);..}...*buf
64e0: 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66  fer = '\0';..buf
64f0: 66 65 72 2b 2b 3b 0a 0a 09 70 61 74 68 20 3d 20  fer++;...path = 
6500: 62 75 66 66 65 72 3b 0a 0a 09 2f 2a 20 54 65 72  buffer;.../* Ter
6510: 6d 69 6e 61 74 65 20 70 61 74 68 20 63 6f 6d 70  minate path comp
6520: 6f 6e 65 6e 74 20 2a 2f 0a 09 62 75 66 66 65 72  onent */..buffer
6530: 20 3d 20 73 74 72 70 62 72 6b 28 70 61 74 68 2c   = strpbrk(path,
6540: 20 22 5c 72 5c 6e 20 22 29 3b 0a 09 69 66 20 28   "\r\n ");..if (
6550: 62 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20  buffer != NULL) 
6560: 7b 0a 09 09 2a 62 75 66 66 65 72 20 3d 20 27 5c  {...*buffer = '\
6570: 30 27 3b 0a 09 09 62 75 66 66 65 72 2b 2b 3b 0a  0';...buffer++;.
6580: 09 7d 0a 0a 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  .}.../* We only 
6590: 68 61 6e 64 6c 65 20 74 68 65 20 22 47 45 54 22  handle the "GET"
65a0: 20 61 6e 64 20 22 48 45 41 44 27 20 6d 65 74 68   and "HEAD' meth
65b0: 6f 64 73 20 2a 2f 0a 09 69 66 20 28 73 74 72 63  ods */..if (strc
65c0: 61 73 65 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22  asecmp(method, "
65d0: 68 65 61 64 22 29 20 21 3d 20 30 29 20 7b 0a 09  head") != 0) {..
65e0: 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70 28  .if (strcasecmp(
65f0: 6d 65 74 68 6f 64 2c 20 22 67 65 74 22 29 20 21  method, "get") !
6600: 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  = 0) {....return
6610: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 2f  (NULL);...}..../
6620: 2a 20 47 45 54 20 72 65 71 75 65 73 74 20 2a 2f  * GET request */
6630: 0a 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 6d 65  ...buffer_st->me
6640: 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f 52 45 51  thod = FILED_REQ
6650: 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 3b  UEST_METHOD_GET;
6660: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20  ..} else {.../* 
6670: 48 45 41 44 20 72 65 71 75 65 73 74 20 2a 2f 0a  HEAD request */.
6680: 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74  ..buffer_st->met
6690: 68 6f 64 20 3d 20 46 49 4c 45 44 5f 52 45 51 55  hod = FILED_REQU
66a0: 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 3b  EST_METHOD_HEAD;
66b0: 0a 09 7d 0a 0a 09 2f 2a 20 4e 6f 74 65 20 70 61  ..}.../* Note pa
66c0: 74 68 20 2a 2f 0a 09 70 61 74 68 5f 6c 65 6e 20  th */..path_len 
66d0: 3d 20 73 74 72 6c 65 6e 28 70 61 74 68 29 3b 0a  = strlen(path);.
66e0: 09 6d 65 6d 63 70 79 28 62 75 66 66 65 72 5f 73  .memcpy(buffer_s
66f0: 74 2d 3e 70 61 74 68 2c 20 70 61 74 68 2c 20 70  t->path, path, p
6700: 61 74 68 5f 6c 65 6e 20 2b 20 31 29 3b 0a 0a 09  ath_len + 1);...
6710: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 79 70  /* Determine typ
6720: 65 20 6f 66 20 72 65 71 75 65 73 74 20 66 72 6f  e of request fro
6730: 6d 20 70 61 74 68 20 2a 2f 0a 09 69 66 20 28 70  m path */..if (p
6740: 61 74 68 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  ath_len == 0) {.
6750: 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 74 79 70  ..buffer_st->typ
6760: 65 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53  e = FILED_REQUES
6770: 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  T_TYPE_DIRECTORY
6780: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
6790: 20 28 70 61 74 68 5b 70 61 74 68 5f 6c 65 6e 20   (path[path_len 
67a0: 2d 20 31 5d 20 3d 3d 20 27 2f 27 29 20 7b 0a 09  - 1] == '/') {..
67b0: 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 74 79 70  ..buffer_st->typ
67c0: 65 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53  e = FILED_REQUES
67d0: 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  T_TYPE_DIRECTORY
67e0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
67f0: 62 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65 20  buffer_st->type 
6800: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
6810: 54 59 50 45 5f 4f 54 48 45 52 3b 0a 09 09 7d 0a  TYPE_OTHER;...}.
6820: 09 7d 0a 0a 09 2f 2a 20 52 65 73 65 74 20 62 75  .}.../* Reset bu
6830: 66 66 65 72 20 66 6f 72 20 6c 61 74 65 72 20 75  ffer for later u
6840: 73 65 20 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20  se */..buffer = 
6850: 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75  buffer_st->tmpbu
6860: 66 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b  f;...for (i = 0;
6870: 20 69 20 3c 20 31 30 30 3b 20 69 2b 2b 29 20 7b   i < 100; i++) {
6880: 0a 09 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66  ...fgets_ret = f
6890: 67 65 74 73 28 62 75 66 66 65 72 2c 20 62 75 66  gets(buffer, buf
68a0: 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 09  fer_len, fp);...
68b0: 69 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d  if (fgets_ret ==
68c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61   NULL) {....brea
68d0: 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 74  k;...}....if (st
68e0: 72 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65 72  rncasecmp(buffer
68f0: 2c 20 22 52 61 6e 67 65 3a 20 22 2c 20 37 29 20  , "Range: ", 7) 
6900: 3d 3d 20 30 29 20 7b 0a 09 09 09 77 6f 72 6b 62  == 0) {....workb
6910: 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 20 2b  uffer = buffer +
6920: 20 37 3b 0a 0a 09 09 09 69 66 20 28 73 74 72 6e   7;.....if (strn
6930: 63 61 73 65 63 6d 70 28 77 6f 72 6b 62 75 66 66  casecmp(workbuff
6940: 65 72 2c 20 22 62 79 74 65 73 3d 22 2c 20 36 29  er, "bytes=", 6)
6950: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 77 6f 72   == 0) {.....wor
6960: 6b 62 75 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09  kbuffer += 6;...
6970: 09 09 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74  ...range_request
6980: 20 3d 20 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65   = 1;......range
6990: 5f 73 74 61 72 74 20 3d 20 73 74 72 74 6f 75 6c  _start = strtoul
69a0: 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77  l(workbuffer, &w
69b0: 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20  orkbuffer_next, 
69c0: 31 30 29 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75  10);......workbu
69d0: 66 66 65 72 20 3d 20 77 6f 72 6b 62 75 66 66 65  ffer = workbuffe
69e0: 72 5f 6e 65 78 74 3b 0a 0a 09 09 09 09 69 66 20  r_next;......if 
69f0: 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20  (*workbuffer == 
6a00: 27 2d 27 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b  '-') {......work
6a10: 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09  buffer++;.......
6a20: 69 66 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20  if (*workbuffer 
6a30: 21 3d 20 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b  != '\r' && *work
6a40: 62 75 66 66 65 72 20 21 3d 20 27 5c 6e 27 29 20  buffer != '\n') 
6a50: 7b 0a 09 09 09 09 09 09 72 61 6e 67 65 5f 65 6e  {.......range_en
6a60: 64 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72  d = strtoull(wor
6a70: 6b 62 75 66 66 65 72 2c 20 26 77 6f 72 6b 62 75  kbuffer, &workbu
6a80: 66 66 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a  ffer_next, 10);.
6a90: 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
6aa0: 7d 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73  }...} else if (s
6ab0: 74 72 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65  trncasecmp(buffe
6ac0: 72 2c 20 22 48 6f 73 74 3a 20 22 2c 20 35 29 20  r, "Host: ", 5) 
6ad0: 3d 3d 20 30 29 20 7b 0a 09 09 09 62 75 66 66 65  == 0) {....buffe
6ae0: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f  r_st->headers.ho
6af0: 73 74 2e 70 72 65 73 65 6e 74 20 3d 20 31 3b 0a  st.present = 1;.
6b00: 0a 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d  ....workbuffer =
6b10: 20 73 74 72 70 62 72 6b 28 62 75 66 66 65 72 20   strpbrk(buffer 
6b20: 2b 20 35 2c 20 22 5c 72 5c 6e 3a 22 29 3b 0a 09  + 5, "\r\n:");..
6b30: 09 09 69 66 20 28 77 6f 72 6b 62 75 66 66 65 72  ..if (workbuffer
6b40: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
6b50: 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 27 5c  *workbuffer = '\
6b60: 30 27 3b 0a 09 09 09 7d 0a 0a 09 09 09 77 6f 72  0';....}.....wor
6b70: 6b 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  kbuffer = buffer
6b80: 20 2b 20 35 3b 0a 09 09 09 77 68 69 6c 65 20 28   + 5;....while (
6b90: 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27  *workbuffer == '
6ba0: 20 27 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75   ') {.....workbu
6bb0: 66 66 65 72 2b 2b 3b 0a 09 09 09 7d 0a 0a 09 09  ffer++;....}....
6bc0: 09 73 74 72 63 70 79 28 62 75 66 66 65 72 5f 73  .strcpy(buffer_s
6bd0: 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e  t->headers.host.
6be0: 68 6f 73 74 2c 20 77 6f 72 6b 62 75 66 66 65 72  host, workbuffer
6bf0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
6c00: 73 74 72 6e 63 61 73 65 63 6d 70 28 62 75 66 66  strncasecmp(buff
6c10: 65 72 2c 20 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a  er, "Connection:
6c20: 20 4b 65 65 70 2d 41 6c 69 76 65 22 2c 20 32 32   Keep-Alive", 22
6c30: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 75 66  ) == 0) {....buf
6c40: 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e  fer_st->headers.
6c50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 46 49 4c  connection = FIL
6c60: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45  ED_CONNECTION_KE
6c70: 45 50 5f 41 4c 49 56 45 3b 0a 09 09 7d 0a 0a 09  EP_ALIVE;...}...
6c80: 09 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 66  .if (memcmp(buff
6c90: 65 72 2c 20 22 5c 72 5c 6e 22 2c 20 32 29 20 3d  er, "\r\n", 2) =
6ca0: 3d 20 30 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b  = 0) {....break;
6cb0: 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ...}..}.../* Det
6cc0: 65 72 6d 69 6e 65 20 72 61 6e 67 65 20 2a 2f 0a  ermine range */.
6cd0: 09 69 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 21  .if (range_end !
6ce0: 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 72 61 6e  = 0) {...if (ran
6cf0: 67 65 5f 65 6e 64 20 3c 3d 20 72 61 6e 67 65 5f  ge_end <= range_
6d00: 73 74 61 72 74 29 20 7b 0a 09 09 09 72 65 74 75  start) {....retu
6d10: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09  rn(NULL);...}...
6d20: 09 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20  .range_length = 
6d30: 72 61 6e 67 65 5f 65 6e 64 20 2d 20 72 61 6e 67  range_end - rang
6d40: 65 5f 73 74 61 72 74 3b 0a 0a 09 09 66 69 6c 65  e_start;....file
6d50: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
6d60: 22 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74  "Computing lengt
6d70: 68 20 70 61 72 61 6d 65 74 65 72 3a 20 25 6c 6c  h parameter: %ll
6d80: 75 20 3d 20 25 6c 6c 75 20 2d 20 25 6c 6c 75 22  u = %llu - %llu"
6d90: 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ,....(unsigned l
6da0: 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f  ong long) range_
6db0: 6c 65 6e 67 74 68 2c 0a 09 09 09 28 75 6e 73 69  length,....(unsi
6dc0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
6dd0: 72 61 6e 67 65 5f 65 6e 64 2c 0a 09 09 09 28 75  range_end,....(u
6de0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
6df0: 67 29 20 72 61 6e 67 65 5f 73 74 61 72 74 0a 09  g) range_start..
6e00: 09 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c  .);..}.../* Fill
6e10: 20 75 70 20 73 74 72 75 63 74 75 72 65 20 74 6f   up structure to
6e20: 20 72 65 74 75 72 6e 20 2a 2f 0a 09 62 75 66 66   return */..buff
6e30: 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  er_st->headers.r
6e40: 61 6e 67 65 2e 70 72 65 73 65 6e 74 20 3d 20 72  ange.present = r
6e50: 61 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 62  ange_request;..b
6e60: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
6e70: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 20  s.range.offset  
6e80: 3d 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09  = range_start;..
6e90: 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65  buffer_st->heade
6ea0: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
6eb0: 20 3d 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b   = range_length;
6ec0: 0a 0a 09 2f 2a 20 49 66 20 76 68 6f 73 74 73 20  .../* If vhosts 
6ed0: 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6d  are enabled, com
6ee0: 70 75 74 65 20 6e 65 77 20 70 61 74 68 20 2a 2f  pute new path */
6ef0: 0a 09 69 66 20 28 6f 70 74 69 6f 6e 73 2d 3e 76  ..if (options->v
6f00: 68 6f 73 74 73 5f 65 6e 61 62 6c 65 64 29 20 7b  hosts_enabled) {
6f10: 0a 09 09 69 66 20 28 62 75 66 66 65 72 5f 73 74  ...if (buffer_st
6f20: 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 70  ->headers.host.p
6f30: 72 65 73 65 6e 74 20 3d 3d 20 31 29 20 7b 0a 09  resent == 1) {..
6f40: 09 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65  ..buffer = buffe
6f50: 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 09  r_st->tmpbuf;...
6f60: 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69  .buffer_len = si
6f70: 7a 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e  zeof(buffer_st->
6f80: 74 6d 70 62 75 66 29 3b 0a 0a 09 09 09 73 6e 70  tmpbuf);.....snp
6f90: 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72  rintf_ret = snpr
6fa0: 69 6e 74 66 28 62 75 66 66 65 72 2c 20 62 75 66  intf(buffer, buf
6fb0: 66 65 72 5f 6c 65 6e 2c 20 22 2f 25 73 25 73 25  fer_len, "/%s%s%
6fc0: 73 22 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73  s",.....buffer_s
6fd0: 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e  t->headers.host.
6fe0: 68 6f 73 74 2c 0a 09 09 09 09 62 75 66 66 65 72  host,.....buffer
6ff0: 5f 73 74 2d 3e 70 61 74 68 5b 30 5d 20 3d 3d 20  _st->path[0] == 
7000: 27 2f 27 20 3f 20 22 22 20 3a 20 22 2f 22 2c 0a  '/' ? "" : "/",.
7010: 09 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 70  ....buffer_st->p
7020: 61 74 68 0a 09 09 09 29 3b 0a 09 09 09 69 66 20  ath....);....if 
7030: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3e 3d  (snprintf_ret >=
7040: 20 30 29 20 7b 0a 09 09 09 09 69 66 20 28 28 28   0) {.....if (((
7050: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 6e  unsigned int) sn
7060: 70 72 69 6e 74 66 5f 72 65 74 29 20 3c 20 62 75  printf_ret) < bu
7070: 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 09  ffer_len) {.....
7080: 09 73 74 72 63 70 79 28 62 75 66 66 65 72 5f 73  .strcpy(buffer_s
7090: 74 2d 3e 70 61 74 68 2c 20 62 75 66 66 65 72 29  t->path, buffer)
70a0: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  ;.....}....}...}
70b0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 62 75 66  ..}...return(buf
70c0: 66 65 72 5f 73 74 29 3b 0a 7d 0a 0a 2f 2a 20 52  fer_st);.}../* R
70d0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 70  eturn an error p
70e0: 61 67 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  age */.static vo
70f0: 69 64 20 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70  id filed_error_p
7100: 61 67 65 28 46 49 4c 45 20 2a 66 70 2c 20 63 6f  age(FILE *fp, co
7110: 6e 73 74 20 63 68 61 72 20 2a 64 61 74 65 5f 63  nst char *date_c
7120: 75 72 72 65 6e 74 2c 20 69 6e 74 20 65 72 72 6f  urrent, int erro
7130: 72 5f 6e 75 6d 62 65 72 2c 20 69 6e 74 20 6d 65  r_number, int me
7140: 74 68 6f 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  thod, const char
7150: 20 2a 72 65 61 73 6f 6e 2c 20 73 74 72 75 63 74   *reason, struct
7160: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
7170: 20 2a 6c 6f 67 29 20 7b 0a 09 63 68 61 72 20 2a   *log) {..char *
7180: 65 72 72 6f 72 5f 73 74 72 69 6e 67 20 3d 20 22  error_string = "
7190: 3c 68 74 6d 6c 3e 3c 68 65 61 64 3e 3c 74 69 74  <html><head><tit
71a0: 6c 65 3e 45 52 52 4f 52 3c 2f 74 69 74 6c 65 3e  le>ERROR</title>
71b0: 3c 2f 68 65 61 64 3e 3c 62 6f 64 79 3e 55 6e 61  </head><body>Una
71c0: 62 6c 65 20 74 6f 20 70 72 6f 63 65 73 73 20 72  ble to process r
71d0: 65 71 75 65 73 74 3c 2f 62 6f 64 79 3e 3c 2f 68  equest</body></h
71e0: 74 6d 6c 3e 22 3b 0a 0a 09 66 70 72 69 6e 74 66  tml>";...fprintf
71f0: 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25  (fp, "HTTP/1.1 %
7200: 69 20 4e 6f 74 20 4f 4b 5c 72 5c 6e 44 61 74 65  i Not OK\r\nDate
7210: 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20  : %s\r\nServer: 
7220: 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f  filed\r\nLast-Mo
7230: 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f  dified: %s\r\nCo
7240: 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c  ntent-Length: %l
7250: 6c 75 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79  lu\r\nContent-Ty
7260: 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63  pe: %s\r\nConnec
7270: 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 5c  tion: close\r\n\
7280: 72 5c 6e 22 2c 0a 09 09 65 72 72 6f 72 5f 6e 75  r\n",...error_nu
7290: 6d 62 65 72 2c 0a 09 09 64 61 74 65 5f 63 75 72  mber,...date_cur
72a0: 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f 63 75 72  rent,...date_cur
72b0: 72 65 6e 74 2c 0a 09 09 28 75 6e 73 69 67 6e 65  rent,...(unsigne
72c0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 74 72  d long long) str
72d0: 6c 65 6e 28 65 72 72 6f 72 5f 73 74 72 69 6e 67  len(error_string
72e0: 29 2c 0a 09 09 22 74 65 78 74 2f 68 74 6d 6c 22  ),..."text/html"
72f0: 0a 09 29 3b 0a 0a 09 2f 2a 20 73 69 6c 65 6e 63  ..);.../* silenc
7300: 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20 66  e error string f
7310: 6f 72 20 48 45 41 44 20 72 65 71 75 65 73 74 73  or HEAD requests
7320: 20 2a 2f 0a 09 69 66 20 28 6d 65 74 68 6f 64 20   */..if (method 
7330: 21 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54  != FILED_REQUEST
7340: 5f 4d 45 54 48 4f 44 5f 48 45 41 44 29 20 7b 0a  _METHOD_HEAD) {.
7350: 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25  ..fprintf(fp, "%
7360: 73 22 2c 20 65 72 72 6f 72 5f 73 74 72 69 6e 67  s", error_string
7370: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 4c 6f 67 20 65  );..}.../* Log e
7380: 72 72 6f 72 20 2a 2f 0a 09 2f 2a 2a 20 72 65 61  rror */../** rea
7390: 73 6f 6e 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  son must point t
73a0: 6f 20 61 20 67 6c 6f 62 61 6c 6c 79 20 61 6c 6c  o a globally all
73b0: 6f 63 61 74 65 64 20 76 61 6c 75 65 20 2a 2a 2f  ocated value **/
73c0: 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20  ..log->reason = 
73d0: 72 65 61 73 6f 6e 3b 0a 09 6c 6f 67 2d 3e 68 74  reason;..log->ht
73e0: 74 70 5f 63 6f 64 65 20 3d 20 65 72 72 6f 72 5f  tp_code = error_
73f0: 6e 75 6d 62 65 72 3b 0a 0a 09 66 69 6c 65 64 5f  number;...filed_
7400: 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a  log_entry(log);.
7410: 0a 09 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65  ../* Close conne
7420: 63 74 69 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64 5f  ction */..filed_
7430: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c  sockettimeout_cl
7440: 6f 73 65 28 66 69 6c 65 6e 6f 28 66 70 29 2c 20  ose(fileno(fp), 
7450: 30 29 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29  0);...fclose(fp)
7460: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
7470: 2a 20 52 65 74 75 72 6e 20 61 20 72 65 64 69 72  * Return a redir
7480: 65 63 74 20 74 6f 20 69 6e 64 65 78 2e 68 74 6d  ect to index.htm
7490: 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 46 49 4c  l */.#ifndef FIL
74a0: 45 44 5f 44 4f 4e 54 5f 52 45 44 49 52 45 43 54  ED_DONT_REDIRECT
74b0: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 73 74 61  _DIRECTORIES.sta
74c0: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 72  tic void filed_r
74d0: 65 64 69 72 65 63 74 5f 69 6e 64 65 78 28 46 49  edirect_index(FI
74e0: 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20 63 68  LE *fp, const ch
74f0: 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74  ar *date_current
7500: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  , const char *pa
7510: 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  th, struct filed
7520: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 29  _log_entry *log)
7530: 20 7b 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64   {..int http_cod
7540: 65 20 3d 20 33 30 32 3b 0a 09 66 70 72 69 6e 74  e = 302;..fprint
7550: 66 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20  f(fp, "HTTP/1.1 
7560: 25 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25  %i OK\r\nDate: %
7570: 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c  s\r\nServer: fil
7580: 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66  ed\r\nLast-Modif
7590: 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65  ied: %s\r\nConte
75a0: 6e 74 2d 4c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e  nt-Length: 0\r\n
75b0: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73  Connection: clos
75c0: 65 5c 72 5c 6e 4c 6f 63 61 74 69 6f 6e 3a 20 25  e\r\nLocation: %
75d0: 73 5c 72 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 68 74  s\r\n\r\n",...ht
75e0: 74 70 5f 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f  tp_code,...date_
75f0: 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f  current,...date_
7600: 63 75 72 72 65 6e 74 2c 0a 09 09 22 69 6e 64 65  current,..."inde
7610: 78 2e 68 74 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a  x.html"..);.../*
7620: 20 4c 6f 67 20 72 65 64 69 72 65 63 74 20 2a 2f   Log redirect */
7630: 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20  ..log->reason = 
7640: 22 72 65 64 69 72 65 63 74 22 3b 0a 09 6c 6f 67  "redirect";..log
7650: 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 68 74  ->http_code = ht
7660: 74 70 5f 63 6f 64 65 3b 0a 0a 09 66 69 6c 65 64  tp_code;...filed
7670: 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b  _log_entry(log);
7680: 0a 0a 09 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e  .../* Close conn
7690: 65 63 74 69 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64  ection */..filed
76a0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63  _sockettimeout_c
76b0: 6c 6f 73 65 28 66 69 6c 65 6e 6f 28 66 70 29 2c  lose(fileno(fp),
76c0: 20 30 29 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70   0);...fclose(fp
76d0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 0a 09 2f  );...return;.../
76e0: 2a 20 43 75 72 72 65 6e 74 6c 79 20 75 6e 75 73  * Currently unus
76f0: 65 64 3a 20 70 61 74 68 20 2a 2f 0a 09 70 61 74  ed: path */..pat
7700: 68 20 3d 20 70 61 74 68 3b 0a 7d 0a 23 65 6e 64  h = path;.}.#end
7710: 69 66 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  if../* Convert a
7720: 6e 20 65 6e 75 6d 20 72 65 70 72 65 73 65 6e 74  n enum represent
7730: 69 6e 67 20 74 68 65 20 22 43 6f 6e 6e 65 63 74  ing the "Connect
7740: 69 6f 6e 22 20 68 65 61 64 65 72 20 76 61 6c 75  ion" header valu
7750: 65 20 74 6f 20 61 20 73 74 72 69 6e 67 20 2a 2f  e to a string */
7760: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7770: 61 72 20 2a 66 69 6c 65 64 5f 63 6f 6e 6e 65 63  ar *filed_connec
7780: 74 69 6f 6e 5f 73 74 72 28 69 6e 74 20 63 6f 6e  tion_str(int con
7790: 6e 65 63 74 69 6f 6e 5f 76 61 6c 75 65 29 20 7b  nection_value) {
77a0: 0a 09 73 77 69 74 63 68 20 28 63 6f 6e 6e 65 63  ..switch (connec
77b0: 74 69 6f 6e 5f 76 61 6c 75 65 29 20 7b 0a 09 09  tion_value) {...
77c0: 63 61 73 65 20 46 49 4c 45 44 5f 43 4f 4e 4e 45  case FILED_CONNE
77d0: 43 54 49 4f 4e 5f 43 4c 4f 53 45 3a 0a 09 09 09  CTION_CLOSE:....
77e0: 72 65 74 75 72 6e 28 22 63 6c 6f 73 65 22 29 3b  return("close");
77f0: 0a 09 09 63 61 73 65 20 46 49 4c 45 44 5f 43 4f  ...case FILED_CO
7800: 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c  NNECTION_KEEP_AL
7810: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
7820: 6b 65 65 70 2d 61 6c 69 76 65 22 29 3b 0a 09 7d  keep-alive");..}
7830: 0a 0a 09 72 65 74 75 72 6e 28 22 63 6c 6f 73 65  ...return("close
7840: 22 29 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65  ");.}../* Handle
7850: 20 61 20 73 69 6e 67 6c 65 20 72 65 71 75 65 73   a single reques
7860: 74 20 66 72 6f 6d 20 61 20 63 6c 69 65 6e 74 20  t from a client 
7870: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
7880: 6c 65 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e  led_handle_clien
7890: 74 28 69 6e 74 20 66 64 2c 20 73 74 72 75 63 74  t(int fd, struct
78a0: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
78b0: 65 73 74 20 2a 72 65 71 75 65 73 74 2c 20 73 74  est *request, st
78c0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
78d0: 6e 74 72 79 20 2a 6c 6f 67 2c 20 73 74 72 75 63  ntry *log, struc
78e0: 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20  t filed_options 
78f0: 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 72  *options) {..str
7900: 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  uct filed_filein
7910: 66 6f 20 2a 66 69 6c 65 69 6e 66 6f 3b 0a 09 73  fo *fileinfo;..s
7920: 73 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f  size_t sendfile_
7930: 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 73 65 6e  ret;..size_t sen
7940: 64 66 69 6c 65 5f 73 69 7a 65 3b 0a 09 6f 66 66  dfile_size;..off
7950: 5f 74 20 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73  _t sendfile_offs
7960: 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e  et, sendfile_sen
7970: 74 2c 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b  t, sendfile_len;
7980: 0a 09 63 68 61 72 20 2a 70 61 74 68 3b 0a 09 63  ..char *path;..c
7990: 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e  har *date_curren
79a0: 74 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  t, date_current_
79b0: 62 5b 36 34 5d 3b 0a 09 69 6e 74 20 68 74 74 70  b[64];..int http
79c0: 5f 63 6f 64 65 3b 0a 09 46 49 4c 45 20 2a 66 70  _code;..FILE *fp
79d0: 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20  ;.../* Indicate 
79e0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
79f0: 74 61 72 74 20 74 69 6d 65 20 2a 2f 0a 09 6c 6f  tart time */..lo
7a00: 67 2d 3e 63 6f 6e 6e 65 63 74 74 69 6d 65 20 3d  g->connecttime =
7a10: 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 2f   time(NULL);.../
7a20: 2a 20 44 65 74 65 72 6d 69 6e 65 20 63 75 72 72  * Determine curr
7a30: 65 6e 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74  ent time */..dat
7a40: 65 5f 63 75 72 72 65 6e 74 20 3d 20 66 69 6c 65  e_current = file
7a50: 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61  d_format_time(da
7a60: 74 65 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73 69  te_current_b, si
7a70: 7a 65 6f 66 28 64 61 74 65 5f 63 75 72 72 65 6e  zeof(date_curren
7a80: 74 5f 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29  t_b), time(NULL)
7a90: 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63  );.../* Open soc
7aa0: 6b 65 74 20 61 73 20 41 4e 53 49 20 49 2f 4f 20  ket as ANSI I/O 
7ab0: 66 6f 72 20 65 61 73 65 20 6f 66 20 75 73 65 20  for ease of use 
7ac0: 2a 2f 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e 28  */..fp = fdopen(
7ad0: 66 64 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66 20  fd, "w+b");..if 
7ae0: 28 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fp == NULL) {..
7af0: 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  .filed_sockettim
7b00: 65 6f 75 74 5f 63 6c 6f 73 65 28 66 64 2c 20 30  eout_close(fd, 0
7b10: 29 3b 0a 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b  );....close(fd);
7b20: 0a 0a 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b  ....log->buffer[
7b30: 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 6c 6f 67  0] = '\0';...log
7b40: 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 2d 31  ->http_code = -1
7b50: 3b 0a 09 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20  ;...log->reason 
7b60: 3d 20 22 66 64 6f 70 65 6e 5f 66 61 69 6c 65 64  = "fdopen_failed
7b70: 22 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ";....filed_log_
7b80: 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 09 72  entry(log);....r
7b90: 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e  eturn(FILED_CONN
7ba0: 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09  ECTION_CLOSE);..
7bb0: 7d 0a 0a 09 72 65 71 75 65 73 74 20 3d 20 66 69  }...request = fi
7bc0: 6c 65 64 5f 67 65 74 5f 68 74 74 70 5f 72 65 71  led_get_http_req
7bd0: 75 65 73 74 28 66 70 2c 20 72 65 71 75 65 73 74  uest(fp, request
7be0: 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a 0a 09 69 66  , options);...if
7bf0: 20 28 72 65 71 75 65 73 74 20 3d 3d 20 4e 55 4c   (request == NUL
7c00: 4c 29 20 7b 0a 09 09 6c 6f 67 2d 3e 62 75 66 66  L) {...log->buff
7c10: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 09  er[0] = '\0';...
7c20: 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67  .filed_error_pag
7c30: 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65  e(fp, date_curre
7c40: 6e 74 2c 20 35 30 30 2c 20 46 49 4c 45 44 5f 52  nt, 500, FILED_R
7c50: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45  EQUEST_METHOD_GE
7c60: 54 2c 20 22 66 6f 72 6d 61 74 22 2c 20 6c 6f 67  T, "format", log
7c70: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c  );....return(FIL
7c80: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c  ED_CONNECTION_CL
7c90: 4f 53 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64  OSE);..}...filed
7ca0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70  _sockettimeout_p
7cb0: 72 6f 63 65 73 73 69 6e 67 5f 73 74 61 72 74 28  rocessing_start(
7cc0: 66 64 29 3b 0a 0a 09 70 61 74 68 20 3d 20 72 65  fd);...path = re
7cd0: 71 75 65 73 74 2d 3e 70 61 74 68 3b 0a 09 73 74  quest->path;..st
7ce0: 72 63 70 79 28 6c 6f 67 2d 3e 62 75 66 66 65 72  rcpy(log->buffer
7cf0: 2c 20 70 61 74 68 29 3b 0a 09 6c 6f 67 2d 3e 6d  , path);..log->m
7d00: 65 74 68 6f 64 20 3d 20 72 65 71 75 65 73 74 2d  ethod = request-
7d10: 3e 6d 65 74 68 6f 64 3b 0a 0a 09 2f 2a 20 49 66  >method;.../* If
7d20: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
7d30: 61 74 68 20 69 73 20 61 20 64 69 72 65 63 74 6f  ath is a directo
7d40: 72 79 2c 20 72 65 64 69 72 65 63 74 20 74 6f 20  ry, redirect to 
7d50: 69 6e 64 65 78 20 70 61 67 65 20 2a 2f 0a 09 69  index page */..i
7d60: 66 20 28 72 65 71 75 65 73 74 2d 3e 74 79 70 65  f (request->type
7d70: 20 3d 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53   == FILED_REQUES
7d80: 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  T_TYPE_DIRECTORY
7d90: 29 20 7b 0a 23 69 66 64 65 66 20 46 49 4c 45 44  ) {.#ifdef FILED
7da0: 5f 44 4f 4e 54 5f 52 45 44 49 52 45 43 54 5f 44  _DONT_REDIRECT_D
7db0: 49 52 45 43 54 4f 52 49 45 53 0a 09 09 63 68 61  IRECTORIES...cha
7dc0: 72 20 6c 6f 63 61 6c 70 61 74 68 5b 38 31 39 32  r localpath[8192
7dd0: 5d 3b 0a 09 09 69 6e 74 20 73 6e 70 72 69 6e 74  ];...int snprint
7de0: 66 5f 72 65 74 3b 0a 0a 09 09 73 6e 70 72 69 6e  f_ret;....snprin
7df0: 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74  tf_ret = snprint
7e00: 66 28 6c 6f 63 61 6c 70 61 74 68 2c 20 73 69 7a  f(localpath, siz
7e10: 65 6f 66 28 6c 6f 63 61 6c 70 61 74 68 29 2c 20  eof(localpath), 
7e20: 22 25 73 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 2c  "%s/index.html",
7e30: 20 70 61 74 68 29 3b 0a 0a 09 09 69 66 20 28 73   path);....if (s
7e40: 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d 20 30  nprintf_ret <= 0
7e50: 20 7c 7c 20 73 6e 70 72 69 6e 74 66 5f 72 65 74   || snprintf_ret
7e60: 20 3e 20 28 73 69 7a 65 6f 66 28 6c 6f 63 61 6c   > (sizeof(local
7e70: 70 61 74 68 29 20 2d 20 31 29 29 20 7b 0a 09 09  path) - 1)) {...
7e80: 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67  .filed_error_pag
7e90: 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65  e(fp, date_curre
7ea0: 6e 74 2c 20 35 30 30 2c 20 72 65 71 75 65 73 74  nt, 500, request
7eb0: 2d 3e 6d 65 74 68 6f 64 2c 20 22 70 61 74 68 5f  ->method, "path_
7ec0: 66 6f 72 6d 61 74 22 2c 20 6c 6f 67 29 3b 0a 0a  format", log);..
7ed0: 09 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f  ...return(FILED_
7ee0: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45  CONNECTION_CLOSE
7ef0: 29 3b 0a 09 09 7d 0a 0a 09 09 70 61 74 68 20 3d  );...}....path =
7f00: 20 6c 6f 63 61 6c 70 61 74 68 3b 0a 23 65 6c 73   localpath;.#els
7f10: 65 0a 09 09 66 69 6c 65 64 5f 72 65 64 69 72 65  e...filed_redire
7f20: 63 74 5f 69 6e 64 65 78 28 66 70 2c 20 64 61 74  ct_index(fp, dat
7f30: 65 5f 63 75 72 72 65 6e 74 2c 20 70 61 74 68 2c  e_current, path,
7f40: 20 6c 6f 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e   log);....return
7f50: 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f  (FILED_CONNECTIO
7f60: 4e 5f 43 4c 4f 53 45 29 3b 0a 23 65 6e 64 69 66  N_CLOSE);.#endif
7f70: 0a 09 7d 0a 0a 09 66 69 6c 65 69 6e 66 6f 20 3d  ..}...fileinfo =
7f80: 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65   filed_open_file
7f90: 28 70 61 74 68 2c 20 26 72 65 71 75 65 73 74 2d  (path, &request-
7fa0: 3e 66 69 6c 65 69 6e 66 6f 2c 20 6f 70 74 69 6f  >fileinfo, optio
7fb0: 6e 73 29 3b 0a 09 69 66 20 28 66 69 6c 65 69 6e  ns);..if (filein
7fc0: 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
7fd0: 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65  filed_error_page
7fe0: 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e  (fp, date_curren
7ff0: 74 2c 20 34 30 34 2c 20 72 65 71 75 65 73 74 2d  t, 404, request-
8000: 3e 6d 65 74 68 6f 64 2c 20 22 6f 70 65 6e 5f 66  >method, "open_f
8010: 61 69 6c 65 64 22 2c 20 6c 6f 67 29 3b 0a 0a 09  ailed", log);...
8020: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f  .return(FILED_CO
8030: 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b  NNECTION_CLOSE);
8040: 0a 09 7d 0a 0a 09 69 66 20 28 72 65 71 75 65 73  ..}...if (reques
8050: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
8060: 2e 70 72 65 73 65 6e 74 29 20 7b 0a 09 09 69 66  .present) {...if
8070: 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65   (request->heade
8080: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20  rs.range.offset 
8090: 21 3d 20 30 20 7c 7c 20 72 65 71 75 65 73 74 2d  != 0 || request-
80a0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
80b0: 65 6e 67 74 68 20 3e 3d 20 30 29 20 7b 0a 09 09  ength >= 0) {...
80c0: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
80d0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
80e0: 65 74 20 3e 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e  et >= fileinfo->
80f0: 6c 65 6e 29 20 7b 0a 09 09 09 09 66 69 6c 65 64  len) {.....filed
8100: 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20  _error_page(fp, 
8110: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 31  date_current, 41
8120: 36 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68  6, request->meth
8130: 6f 64 2c 20 22 72 61 6e 67 65 5f 69 6e 76 61 6c  od, "range_inval
8140: 69 64 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 09 09  id", log);......
8150: 63 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f 2d 3e  close(fileinfo->
8160: 66 64 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  fd);......return
8170: 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f  (FILED_CONNECTIO
8180: 4e 5f 43 4c 4f 53 45 29 3b 0a 09 09 09 7d 0a 0a  N_CLOSE);....}..
8190: 09 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e  ...if (request->
81a0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
81b0: 6e 67 74 68 20 3d 3d 20 28 28 6f 66 66 5f 74 29  ngth == ((off_t)
81c0: 20 2d 31 29 29 20 7b 0a 09 09 09 09 66 69 6c 65   -1)) {.....file
81d0: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
81e0: 22 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74  "Computing lengt
81f0: 68 20 74 6f 20 66 69 74 20 69 6e 20 62 6f 75 6e  h to fit in boun
8200: 64 73 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65  ds: fileinfo->le
8210: 6e 20 3d 20 25 6c 6c 75 2c 20 72 65 71 75 65 73  n = %llu, reques
8220: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
8230: 2e 6f 66 66 73 65 74 20 3d 20 25 6c 6c 75 22 2c  .offset = %llu",
8240: 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
8250: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69  long long) filei
8260: 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09 09 28  nfo->len,......(
8270: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
8280: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
8290: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
82a0: 74 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09 72 65  t.....);......re
82b0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
82c0: 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69  ange.length = fi
82d0: 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 2d 20 72 65  leinfo->len - re
82e0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
82f0: 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09  ange.offset;....
8300: 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  }.....filed_log_
8310: 6d 73 67 5f 64 65 62 75 67 28 22 50 61 72 74 69  msg_debug("Parti
8320: 61 6c 20 72 65 71 75 65 73 74 2c 20 73 74 61 72  al request, star
8330: 74 69 6e 67 20 61 74 3a 20 25 6c 6c 75 20 61 6e  ting at: %llu an
8340: 64 20 72 75 6e 6e 69 6e 67 20 66 6f 72 20 25 6c  d running for %l
8350: 6c 69 20 62 79 74 65 73 22 2c 0a 09 09 09 09 28  li bytes",.....(
8360: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
8370: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
8380: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
8390: 74 2c 0a 09 09 09 09 28 6c 6f 6e 67 20 6c 6f 6e  t,.....(long lon
83a0: 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  g) request->head
83b0: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
83c0: 0a 09 09 09 29 3b 0a 0a 09 09 7d 0a 0a 09 09 68  ....);....}....h
83d0: 74 74 70 5f 63 6f 64 65 20 3d 20 32 30 36 3b 0a  ttp_code = 206;.
83e0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 74 74 70  .} else {...http
83f0: 5f 63 6f 64 65 20 3d 20 32 30 30 3b 0a 0a 09 09  _code = 200;....
8400: 2f 2a 20 43 6f 6d 70 75 74 65 20 66 61 6b 65 20  /* Compute fake 
8410: 72 61 6e 67 65 20 70 61 72 61 6d 65 74 65 72 73  range parameters
8420: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
8430: 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 20 2a  he entire file *
8440: 2f 0a 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61  /...request->hea
8450: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
8460: 74 20 3d 20 30 3b 0a 09 09 72 65 71 75 65 73 74  t = 0;...request
8470: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
8480: 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66  length = fileinf
8490: 6f 2d 3e 6c 65 6e 3b 0a 09 7d 0a 0a 09 66 70 72  o->len;..}...fpr
84a0: 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f 31  intf(fp, "HTTP/1
84b0: 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74 65  .1 %i OK\r\nDate
84c0: 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20  : %s\r\nServer: 
84d0: 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f  filed\r\nLast-Mo
84e0: 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f  dified: %s\r\nCo
84f0: 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c  ntent-Length: %l
8500: 6c 75 5c 72 5c 6e 41 63 63 65 70 74 2d 52 61 6e  lu\r\nAccept-Ran
8510: 67 65 73 3a 20 62 79 74 65 73 5c 72 5c 6e 43 6f  ges: bytes\r\nCo
8520: 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 73 5c 72  ntent-Type: %s\r
8530: 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 25 73  \nConnection: %s
8540: 5c 72 5c 6e 45 54 61 67 3a 20 5c 22 25 73 5c 22  \r\nETag: \"%s\"
8550: 5c 72 5c 6e 22 2c 0a 09 09 68 74 74 70 5f 63 6f  \r\n",...http_co
8560: 64 65 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65  de,...date_curre
8570: 6e 74 2c 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e  nt,...fileinfo->
8580: 6c 61 73 74 6d 6f 64 2c 0a 09 09 28 75 6e 73 69  lastmod,...(unsi
8590: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
85a0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
85b0: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09  .range.length,..
85c0: 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79 70 65 2c  .fileinfo->type,
85d0: 0a 09 09 66 69 6c 65 64 5f 63 6f 6e 6e 65 63 74  ...filed_connect
85e0: 69 6f 6e 5f 73 74 72 28 72 65 71 75 65 73 74 2d  ion_str(request-
85f0: 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63 74  >headers.connect
8600: 69 6f 6e 29 2c 0a 09 09 66 69 6c 65 69 6e 66 6f  ion),...fileinfo
8610: 2d 3e 65 74 61 67 0a 09 29 3b 0a 0a 09 69 66 20  ->etag..);...if 
8620: 28 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32 30  (http_code == 20
8630: 36 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 66  6) {...fprintf(f
8640: 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61 6e 67  p, "Content-Rang
8650: 65 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d 25 6c  e: bytes %llu-%l
8660: 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a 09 09  lu/%llu\r\n",...
8670: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
8680: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
8690: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
86a0: 73 65 74 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65  set,....(unsigne
86b0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 28 72 65  d long long) (re
86c0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
86d0: 61 6e 67 65 2e 6f 66 66 73 65 74 20 2b 20 72 65  ange.offset + re
86e0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
86f0: 61 6e 67 65 2e 6c 65 6e 67 74 68 20 2d 20 31 29  ange.length - 1)
8700: 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ,....(unsigned l
8710: 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e  ong long) filein
8720: 66 6f 2d 3e 6c 65 6e 0a 09 09 29 3b 0a 09 7d 0a  fo->len...);..}.
8730: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 72  .fprintf(fp, "\r
8740: 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 66 70  \n");..fflush(fp
8750: 29 3b 0a 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f 63  );...log->http_c
8760: 6f 64 65 20 3d 20 68 74 74 70 5f 63 6f 64 65 3b  ode = http_code;
8770: 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20  ..log->reason = 
8780: 22 4f 4b 22 3b 0a 09 6c 6f 67 2d 3e 73 74 61 72  "OK";..log->star
8790: 74 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  ttime = time(NUL
87a0: 4c 29 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f 6f 66  L);..log->req_of
87b0: 66 73 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e  fset = request->
87c0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
87d0: 66 73 65 74 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f  fset;..log->req_
87e0: 6c 65 6e 67 74 68 20 3d 20 72 65 71 75 65 73 74  length = request
87f0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
8800: 6c 65 6e 67 74 68 3b 0a 09 6c 6f 67 2d 3e 66 69  length;..log->fi
8810: 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65  le_length = file
8820: 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 0a 23 69 66 64  info->len;..#ifd
8830: 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43  ef FILED_NONBLOC
8840: 4b 5f 48 54 54 50 0a 09 69 6e 74 20 73 6f 63 6b  K_HTTP..int sock
8850: 65 74 5f 66 6c 61 67 73 3b 0a 09 66 64 5f 73 65  et_flags;..fd_se
8860: 74 20 72 66 64 2c 20 77 66 64 3b 0a 09 63 68 61  t rfd, wfd;..cha
8870: 72 20 73 69 6e 6b 62 75 66 5b 38 31 39 32 5d 3b  r sinkbuf[8192];
8880: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
8890: 65 74 3b 0a 0a 09 46 44 5f 5a 45 52 4f 28 26 72  et;...FD_ZERO(&r
88a0: 66 64 29 3b 0a 09 46 44 5f 5a 45 52 4f 28 26 77  fd);..FD_ZERO(&w
88b0: 66 64 29 3b 0a 09 46 44 5f 53 45 54 28 66 64 2c  fd);..FD_SET(fd,
88c0: 20 26 72 66 64 29 3b 0a 09 46 44 5f 53 45 54 28   &rfd);..FD_SET(
88d0: 66 64 2c 20 26 77 66 64 29 3b 0a 0a 09 73 6f 63  fd, &wfd);...soc
88e0: 6b 65 74 5f 66 6c 61 67 73 20 3d 20 66 63 6e 74  ket_flags = fcnt
88f0: 6c 28 66 64 2c 20 46 5f 47 45 54 46 4c 29 3b 0a  l(fd, F_GETFL);.
8900: 09 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54  .fcntl(fd, F_SET
8910: 46 4c 2c 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73  FL, socket_flags
8920: 20 7c 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a   | O_NONBLOCK);.
8930: 23 65 6e 64 69 66 0a 09 73 65 6e 64 66 69 6c 65  #endif..sendfile
8940: 5f 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65 73  _offset = reques
8950: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
8960: 2e 6f 66 66 73 65 74 3b 0a 09 73 65 6e 64 66 69  .offset;..sendfi
8970: 6c 65 5f 6c 65 6e 20 3d 20 72 65 71 75 65 73 74  le_len = request
8980: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
8990: 6c 65 6e 67 74 68 3b 0a 09 73 65 6e 64 66 69 6c  length;..sendfil
89a0: 65 5f 73 65 6e 74 20 3d 20 30 3b 0a 09 77 68 69  e_sent = 0;..whi
89b0: 6c 65 20 28 72 65 71 75 65 73 74 2d 3e 6d 65 74  le (request->met
89c0: 68 6f 64 20 3d 3d 20 46 49 4c 45 44 5f 52 45 51  hod == FILED_REQ
89d0: 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 29  UEST_METHOD_GET)
89e0: 20 7b 0a 09 09 69 66 20 28 73 65 6e 64 66 69 6c   {...if (sendfil
89f0: 65 5f 6c 65 6e 20 3e 20 46 49 4c 45 44 5f 53 45  e_len > FILED_SE
8a00: 4e 44 46 49 4c 45 5f 4d 41 58 29 20 7b 0a 09 09  NDFILE_MAX) {...
8a10: 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d  .sendfile_size =
8a20: 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45 5f   FILED_SENDFILE_
8a30: 4d 41 58 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  MAX;...} else {.
8a40: 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  ...sendfile_size
8a50: 20 3d 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b   = sendfile_len;
8a60: 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 66 69 6c 65  ...}....sendfile
8a70: 5f 72 65 74 20 3d 20 73 65 6e 64 66 69 6c 65 28  _ret = sendfile(
8a80: 66 64 2c 20 66 69 6c 65 69 6e 66 6f 2d 3e 66 64  fd, fileinfo->fd
8a90: 2c 20 26 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73  , &sendfile_offs
8aa0: 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a  et, sendfile_siz
8ab0: 65 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 66 69  e);...if (sendfi
8ac0: 6c 65 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 23  le_ret <= 0) {.#
8ad0: 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42  ifdef FILED_NONB
8ae0: 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69 66 20  LOCK_HTTP....if 
8af0: 28 65 72 72 6e 6f 20 3d 3d 20 45 41 47 41 49 4e  (errno == EAGAIN
8b00: 29 20 7b 0a 09 09 09 09 73 65 6e 64 66 69 6c 65  ) {.....sendfile
8b10: 5f 72 65 74 20 3d 20 30 3b 0a 0a 09 09 09 09 77  _ret = 0;......w
8b20: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 09 09 09  hile (1) {......
8b30: 73 65 6c 65 63 74 28 66 64 20 2b 20 31 2c 20 26  select(fd + 1, &
8b40: 72 66 64 2c 20 26 77 66 64 2c 20 4e 55 4c 4c 2c  rfd, &wfd, NULL,
8b50: 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 09 69 66 20   NULL);......if 
8b60: 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20 26 72  (FD_ISSET(fd, &r
8b70: 66 64 29 29 20 7b 0a 09 09 09 09 09 09 72 65 61  fd)) {.......rea
8b80: 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66 64 2c  d_ret = read(fd,
8b90: 20 73 69 6e 6b 62 75 66 2c 20 73 69 7a 65 6f 66   sinkbuf, sizeof
8ba0: 28 73 69 6e 6b 62 75 66 29 29 3b 0a 0a 09 09 09  (sinkbuf));.....
8bb0: 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ...if (read_ret 
8bc0: 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 62  <= 0) {........b
8bd0: 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09  reak;.......}...
8be0: 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 46  ...}.......if (F
8bf0: 44 5f 49 53 53 45 54 28 66 64 2c 20 26 77 66 64  D_ISSET(fd, &wfd
8c00: 29 29 20 7b 0a 09 09 09 09 09 09 72 65 61 64 5f  )) {.......read_
8c10: 72 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 09 09  ret = 1;........
8c20: 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
8c30: 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 72 65 61  ..}......if (rea
8c40: 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
8c50: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
8c60: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
8c70: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 23 65 6c 73  break;....}.#els
8c80: 65 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64  e....break;.#end
8c90: 69 66 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 66 69  if...}....sendfi
8ca0: 6c 65 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64 66 69  le_len -= sendfi
8cb0: 6c 65 5f 72 65 74 3b 0a 09 09 73 65 6e 64 66 69  le_ret;...sendfi
8cc0: 6c 65 5f 73 65 6e 74 20 2b 3d 20 73 65 6e 64 66  le_sent += sendf
8cd0: 69 6c 65 5f 72 65 74 3b 0a 09 09 69 66 20 28 73  ile_ret;...if (s
8ce0: 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30  endfile_len == 0
8cf0: 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ) {....break;...
8d00: 7d 0a 09 7d 0a 0a 09 6c 6f 67 2d 3e 65 6e 64 74  }..}...log->endt
8d10: 69 6d 65 20 3d 20 28 74 69 6d 65 5f 74 29 20 2d  ime = (time_t) -
8d20: 31 3b 0a 09 6c 6f 67 2d 3e 73 65 6e 74 5f 6c 65  1;..log->sent_le
8d30: 6e 67 74 68 20 3d 20 73 65 6e 64 66 69 6c 65 5f  ngth = sendfile_
8d40: 73 65 6e 74 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f  sent;...filed_lo
8d50: 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09  g_entry(log);...
8d60: 63 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f 2d 3e  close(fileinfo->
8d70: 66 64 29 3b 0a 0a 09 69 66 20 28 72 65 71 75 65  fd);...if (reque
8d80: 73 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e  st->headers.conn
8d90: 65 63 74 69 6f 6e 20 21 3d 20 46 49 4c 45 44 5f  ection != FILED_
8da0: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f  CONNECTION_KEEP_
8db0: 41 4c 49 56 45 29 20 7b 0a 09 09 66 69 6c 65 64  ALIVE) {...filed
8dc0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63  _sockettimeout_c
8dd0: 6c 6f 73 65 28 66 64 2c 20 30 29 3b 0a 0a 09 09  lose(fd, 0);....
8de0: 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 09 72  fclose(fp);....r
8df0: 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e  eturn(FILED_CONN
8e00: 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09  ECTION_CLOSE);..
8e10: 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74  }...filed_socket
8e20: 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69  timeout_processi
8e30: 6e 67 5f 65 6e 64 28 66 64 29 3b 0a 0a 09 72 65  ng_end(fd);...re
8e40: 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45  turn(FILED_CONNE
8e50: 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56 45  CTION_KEEP_ALIVE
8e60: 29 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20  );.}../* Handle 
8e70: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74  incoming connect
8e80: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
8e90: 6f 69 64 20 2a 66 69 6c 65 64 5f 77 6f 72 6b 65  oid *filed_worke
8ea0: 72 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a 61  r_thread(void *a
8eb0: 72 67 5f 76 29 20 7b 0a 09 73 74 72 75 63 74 20  rg_v) {..struct 
8ec0: 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72  filed_worker_thr
8ed0: 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09  ead_args *arg;..
8ee0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74  struct filed_htt
8ef0: 70 5f 72 65 71 75 65 73 74 20 72 65 71 75 65 73  p_request reques
8f00: 74 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  t;..struct filed
8f10: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 2c  _log_entry *log,
8f20: 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67   local_dummy_log
8f30: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
8f40: 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73  options *options
8f50: 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ;..struct sockad
8f60: 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a 09 73 6f  dr_in6 addr;..so
8f70: 63 6b 6c 65 6e 5f 74 20 61 64 64 72 6c 65 6e 3b  cklen_t addrlen;
8f80: 0a 09 69 6e 74 20 66 61 69 6c 75 72 65 5f 63 6f  ..int failure_co
8f90: 75 6e 74 20 3d 20 30 2c 20 6d 61 78 5f 66 61 69  unt = 0, max_fai
8fa0: 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 46 49 4c  lure_count = FIL
8fb0: 45 44 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43  ED_MAX_FAILURE_C
8fc0: 4f 55 4e 54 3b 0a 09 69 6e 74 20 63 6f 6e 6e 65  OUNT;..int conne
8fd0: 63 74 69 6f 6e 5f 73 74 61 74 65 20 3d 20 46 49  ction_state = FI
8fe0: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43  LED_CONNECTION_C
8ff0: 4c 4f 53 45 3b 0a 09 69 6e 74 20 6d 61 73 74 65  LOSE;..int maste
9000: 72 5f 66 64 2c 20 66 64 20 3d 20 2d 31 3b 0a 0a  r_fd, fd = -1;..
9010: 09 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e  ./* Read argumen
9020: 74 73 20 2a 2f 0a 09 61 72 67 20 3d 20 61 72 67  ts */..arg = arg
9030: 5f 76 3b 0a 0a 09 6d 61 73 74 65 72 5f 66 64 20  _v;...master_fd 
9040: 3d 20 61 72 67 2d 3e 66 64 3b 0a 09 6f 70 74 69  = arg->fd;..opti
9050: 6f 6e 73 20 3d 20 26 61 72 67 2d 3e 6f 70 74 69  ons = &arg->opti
9060: 6f 6e 73 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  ons;...while (1)
9070: 20 7b 0a 09 09 2f 2a 20 46 61 69 6c 75 72 65 20   {.../* Failure 
9080: 6c 6f 6f 70 20 70 72 65 76 65 6e 74 69 6f 6e 20  loop prevention 
9090: 2a 2f 0a 09 09 69 66 20 28 66 61 69 6c 75 72 65  */...if (failure
90a0: 5f 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 66 61 69  _count > max_fai
90b0: 6c 75 72 65 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  lure_count) {...
90c0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f  .break;...}..../
90d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
90e0: 20 6c 6f 67 20 62 75 66 66 65 72 20 2a 2f 0a 09   log buffer */..
90f0: 09 6c 6f 67 20 3d 20 66 69 6c 65 64 5f 6c 6f 67  .log = filed_log
9100: 5f 6e 65 77 28 31 29 3b 0a 09 09 69 66 20 28 6c  _new(1);...if (l
9110: 6f 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  og == NULL) {...
9120: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22  .filed_log_msg("
9130: 41 4c 4c 4f 43 41 54 45 5f 4c 4f 47 5f 4d 53 47  ALLOCATE_LOG_MSG
9140: 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09 62  _FAILED");.....b
9150: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 6c 6f 67  reak;...}....log
9160: 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 4c  ->type = FILED_L
9170: 4f 47 5f 54 59 50 45 5f 54 52 41 4e 53 46 45 52  OG_TYPE_TRANSFER
9180: 3b 0a 0a 09 09 2f 2a 20 49 66 20 77 65 20 63 6c  ;..../* If we cl
9190: 6f 73 65 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  osed the old con
91a0: 6e 65 63 74 69 6f 6e 2c 20 61 63 63 65 70 74 20  nection, accept 
91b0: 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 09 09 69  a new one */...i
91c0: 66 20 28 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74  f (connection_st
91d0: 61 74 65 20 3d 3d 20 46 49 4c 45 44 5f 43 4f 4e  ate == FILED_CON
91e0: 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 20 7b  NECTION_CLOSE) {
91f0: 0a 09 09 09 2f 2a 20 41 63 63 65 70 74 20 61 20  ..../* Accept a 
9200: 6e 65 77 20 63 6c 69 65 6e 74 20 2a 2f 0a 09 09  new client */...
9210: 09 61 64 64 72 6c 65 6e 20 3d 20 73 69 7a 65 6f  .addrlen = sizeo
9220: 66 28 61 64 64 72 29 3b 0a 0a 09 09 09 66 64 20  f(addr);.....fd 
9230: 3d 20 61 63 63 65 70 74 28 6d 61 73 74 65 72 5f  = accept(master_
9240: 66 64 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b  fd, (struct sock
9250: 61 64 64 72 20 2a 29 20 26 61 64 64 72 2c 20 26  addr *) &addr, &
9260: 61 64 64 72 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09  addrlen);...}...
9270: 09 2f 2a 0a 09 09 20 2a 20 49 66 20 77 65 20 66  ./*... * If we f
9280: 61 69 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74 65  ail, make a note
9290: 20 6f 66 20 69 74 20 73 6f 20 77 65 20 64 6f 6e   of it so we don
92a0: 27 74 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f 6f  't go into a loo
92b0: 70 20 6f 66 0a 09 09 20 2a 20 61 63 63 65 70 74  p of... * accept
92c0: 28 29 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a 2f  () failing... */
92d0: 0a 09 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b  ...if (fd < 0) {
92e0: 0a 09 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e  ..../* Log the n
92f0: 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  ew connection */
9300: 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ....filed_log_ms
9310: 67 28 22 41 43 43 45 50 54 5f 46 41 49 4c 45 44  g("ACCEPT_FAILED
9320: 22 29 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65 5f  ");.....failure_
9330: 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 66 69 6c  count++;.....fil
9340: 65 64 5f 6c 6f 67 5f 66 72 65 65 28 6c 6f 67 29  ed_log_free(log)
9350: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
9360: 09 09 7d 0a 0a 09 09 66 69 6c 65 64 5f 73 6f 63  ..}....filed_soc
9370: 6b 65 74 74 69 6d 65 6f 75 74 5f 61 63 63 65 70  kettimeout_accep
9380: 74 28 66 64 29 3b 0a 0a 09 09 2f 2a 20 46 69 6c  t(fd);..../* Fil
9390: 6c 20 69 6e 20 6c 6f 67 20 73 74 72 75 63 74 75  l in log structu
93a0: 72 65 20 2a 2f 0a 09 09 69 66 20 28 66 69 6c 65  re */...if (file
93b0: 64 5f 6c 6f 67 5f 69 70 28 28 73 74 72 75 63 74  d_log_ip((struct
93c0: 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64   sockaddr *) &ad
93d0: 64 72 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73 69 7a  dr, log->ip, siz
93e0: 65 6f 66 28 6c 6f 67 2d 3e 69 70 29 29 20 3d 3d  eof(log->ip)) ==
93f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 2d   NULL) {....log-
9400: 3e 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09  >ip[0] = '\0';..
9410: 09 09 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 30 3b  ..log->port = 0;
9420: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
9430: 6f 67 2d 3e 70 6f 72 74 20 3d 20 61 64 64 72 2e  og->port = addr.
9440: 73 69 6e 36 5f 70 6f 72 74 3b 0a 09 09 7d 0a 0a  sin6_port;...}..
9450: 09 09 2f 2a 20 52 65 73 65 74 20 66 61 69 6c 75  ../* Reset failu
9460: 72 65 20 63 6f 75 6e 74 2a 2f 0a 09 09 66 61 69  re count*/...fai
9470: 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  lure_count = 0;.
9480: 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20 73 6f 63  .../* Handle soc
9490: 6b 65 74 20 2a 2f 0a 09 09 63 6f 6e 6e 65 63 74  ket */...connect
94a0: 69 6f 6e 5f 73 74 61 74 65 20 3d 20 66 69 6c 65  ion_state = file
94b0: 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28  d_handle_client(
94c0: 66 64 2c 20 26 72 65 71 75 65 73 74 2c 20 6c 6f  fd, &request, lo
94d0: 67 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a 09 7d 0a  g, options);..}.
94e0: 0a 09 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f  ../* Report erro
94f0: 72 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  r */..filed_log_
9500: 6d 73 67 28 22 54 48 52 45 41 44 5f 44 49 45 44  msg("THREAD_DIED
9510: 20 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72   ABNORMAL");...r
9520: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f  eturn(NULL);.../
9530: 2a 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f  * local_dummy_lo
9540: 67 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  g is only used i
9550: 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47  f FILED_DONT_LOG
9560: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74 68   is enabled, oth
9570: 65 72 77 69 73 65 20 69 74 27 73 20 6e 6f 74 20  erwise it's not 
9580: 75 73 65 64 2c 20 62 75 74 20 74 68 65 20 63 6f  used, but the co
9590: 6d 70 69 6c 65 72 20 68 61 74 65 73 20 74 68 61  mpiler hates tha
95a0: 74 20 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61  t idea. */..loca
95b0: 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65  l_dummy_log.type
95c0: 20 3d 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d   = 0;..local_dum
95d0: 6d 79 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f  my_log.type = lo
95e0: 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79  cal_dummy_log.ty
95f0: 70 65 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65  pe;.}../* Create
9600: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20   worker threads 
9610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
9620: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
9630: 64 73 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c 20  ds_init(int fd, 
9640: 69 6e 74 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  int thread_count
9650: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f  , struct filed_o
9660: 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29  ptions *options)
9670: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
9680: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61  _worker_thread_a
9690: 72 67 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65  rgs *arg;..pthre
96a0: 61 64 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09  ad_t threadid;..
96b0: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b  int pthread_ret;
96c0: 0a 09 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28  ..int i;...for (
96d0: 69 20 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61  i = 0; i < threa
96e0: 64 5f 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a  d_count; i++) {.
96f0: 09 09 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73  ..arg = malloc(s
9700: 69 7a 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09  izeof(*arg));...
9710: 09 61 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 09  .arg->fd = fd;..
9720: 09 6d 65 6d 63 70 79 28 26 61 72 67 2d 3e 6f 70  .memcpy(&arg->op
9730: 74 69 6f 6e 73 2c 20 6f 70 74 69 6f 6e 73 2c 20  tions, options, 
9740: 73 69 7a 65 6f 66 28 2a 6f 70 74 69 6f 6e 73 29  sizeof(*options)
9750: 29 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  );....pthread_re
9760: 74 20 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61  t = pthread_crea
9770: 74 65 28 26 74 68 72 65 61 64 69 64 2c 20 4e 55  te(&threadid, NU
9780: 4c 4c 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  LL, filed_worker
9790: 5f 74 68 72 65 61 64 2c 20 61 72 67 29 3b 0a 09  _thread, arg);..
97a0: 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
97b0: 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   != 0) {....retu
97c0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
97d0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
97e0: 2a 20 44 69 73 70 6c 61 79 20 68 65 6c 70 20 2a  * Display help *
97f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
9800: 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46  led_print_help(F
9810: 49 4c 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74  ILE *output, int
9820: 20 6c 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73   long_help, cons
9830: 74 20 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b  t char *extra) {
9840: 0a 09 69 66 20 28 65 78 74 72 61 29 20 7b 0a 09  ..if (extra) {..
9850: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9860: 20 22 25 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b   "%s\n", extra);
9870: 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75  ..}...fprintf(ou
9880: 74 70 75 74 2c 20 22 55 73 61 67 65 3a 20 66 69  tput, "Usage: fi
9890: 6c 65 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c  led [<options>]\
98a0: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
98b0: 74 70 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73  tput, "  Options
98c0: 3a 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  :\n");..fprintf(
98d0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
98e0: 68 2c 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09  h, --help\n");..
98f0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9900: 22 20 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65  "      -d, --dae
9910: 6d 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  mon\n");..fprint
9920: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9930: 20 2d 76 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c 6e   -v, --version\n
9940: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
9950: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 56 2c 20  put, "      -V, 
9960: 2d 2d 76 68 6f 73 74 5c 6e 22 29 3b 0a 09 66 70  --vhost\n");..fp
9970: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9980: 20 20 20 20 20 2d 62 20 3c 61 64 64 72 65 73 73       -b <address
9990: 3e 2c 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72 65  >, --bind <addre
99a0: 73 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  ss>\n");..fprint
99b0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
99c0: 20 2d 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f   -p <port>, --po
99d0: 72 74 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09  rt <port>\n");..
99e0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
99f0: 22 20 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e 74  "      -t <count
9a00: 3e 2c 20 2d 2d 74 68 72 65 61 64 73 20 3c 63 6f  >, --threads <co
9a10: 75 6e 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  unt>\n");..fprin
9a20: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9a30: 20 20 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c 20    -c <entries>, 
9a40: 2d 2d 63 61 63 68 65 20 3c 65 6e 74 72 69 65 73  --cache <entries
9a50: 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  >\n");..fprintf(
9a60: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
9a70: 6c 20 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20  l <file>, --log 
9a80: 3c 66 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70 72  <file>\n");..fpr
9a90: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
9aa0: 20 20 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20 2d      -u <user>, -
9ab0: 2d 75 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22 29  -user <user>\n")
9ac0: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
9ad0: 74 2c 20 22 20 20 20 20 20 20 2d 72 20 3c 64 69  t, "      -r <di
9ae0: 72 65 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74  rectory>, --root
9af0: 20 3c 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22 29   <directory>\n")
9b00: 3b 0a 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65 6c  ;...if (long_hel
9b10: 70 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f  p) {...fprintf(o
9b20: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
9b30: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9b40: 22 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 09  "  Usage:\n");..
9b50: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9b60: 20 22 20 20 20 20 20 20 2d 68 20 28 6f 72 20 2d   "      -h (or -
9b70: 2d 68 65 6c 70 29 20 70 72 69 6e 74 73 20 74 68  -help) prints th
9b80: 69 73 20 75 73 61 67 65 20 69 6e 66 6f 72 6d 61  is usage informa
9b90: 74 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72  tion.\n");...fpr
9ba0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
9bb0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
9bc0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64 20  tput, "      -d 
9bd0: 28 6f 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e  (or --daemon) in
9be0: 73 74 72 75 63 74 73 20 66 69 6c 65 64 20 74 6f  structs filed to
9bf0: 20 62 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e   become a daemon
9c00: 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a   after initializ
9c10: 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ing\n");...fprin
9c20: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 74 68 65 20 6c 69 73 74 65 6e 69 6e 67     the listening
9c50: 20 54 43 50 20 73 6f 63 6b 65 74 20 61 6e 64 20   TCP socket and 
9c60: 6c 6f 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a  log files.\n");.
9c70: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9c80: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  , "\n");...fprin
9c90: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9ca0: 20 20 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73 69    -v (or --versi
9cb0: 6f 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66 69  on) instructs fi
9cc0: 6c 65 64 20 70 72 69 6e 74 20 6f 75 74 20 74 68  led print out th
9cd0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
9ce0: 20 61 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b 0a   and exit.\n");.
9cf0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9d00: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  , "\n");...fprin
9d10: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9d20: 20 20 2d 56 20 28 6f 72 20 2d 2d 76 68 6f 73 74    -V (or --vhost
9d30: 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65  ) instructs file
9d40: 64 20 74 6f 20 70 72 65 70 65 6e 64 20 61 6c 6c  d to prepend all
9d50: 20 72 65 71 75 65 73 74 73 20 77 69 74 68 20 74   requests with t
9d60: 68 65 69 72 20 48 54 54 50 5c 6e 22 29 3b 0a 09  heir HTTP\n");..
9d70: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9d80: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
9d90: 20 20 20 20 20 20 20 20 48 6f 73 74 20 68 65 61          Host hea
9da0: 64 65 72 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69  der.\n");...fpri
9db0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
9dc0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9dd0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20 28  put, "      -b (
9de0: 6f 72 20 2d 2d 62 69 6e 64 29 20 73 70 65 63 69  or --bind) speci
9df0: 66 69 65 73 20 74 68 65 20 61 64 64 72 65 73 73  fies the address
9e00: 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69   to listen for i
9e10: 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29  ncoming HTTP\n")
9e20: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9e30: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
9e40: 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73            reques
9e50: 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61  ts on.  The defa
9e60: 75 6c 74 20 76 61 6c 75 65 20 69 73 20 5c 22 25  ult value is \"%
9e70: 73 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41 44  s\".\n", BIND_AD
9e80: 44 52 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  DR);...fprintf(o
9e90: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
9ea0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9eb0: 22 20 20 20 20 20 20 2d 70 20 28 6f 72 20 2d 2d  "      -p (or --
9ec0: 70 6f 72 74 29 20 73 70 65 63 69 66 69 65 73 20  port) specifies 
9ed0: 74 68 65 20 54 43 50 20 70 6f 72 74 20 6e 75 6d  the TCP port num
9ee0: 62 65 72 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f  ber to listen fo
9ef0: 72 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c  r incoming HTTP\
9f00: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9f10: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71               req
9f30: 75 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64  uests on.  The d
9f40: 65 66 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e 22  efault is %u.\n"
9f50: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
9f60: 20 50 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e 74   PORT);...fprint
9f70: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
9f80: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9f90: 74 2c 20 22 20 20 20 20 20 20 2d 74 20 28 6f 72  t, "      -t (or
9fa0: 20 2d 2d 74 68 72 65 61 64 73 29 20 73 70 65 63   --threads) spec
9fb0: 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
9fc0: 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
9fd0: 64 73 20 74 6f 20 63 72 65 61 74 65 2e 20 45 61  ds to create. Ea
9fe0: 63 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ch\n");...fprint
9ff0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64     worker thread
a020: 20 63 61 6e 20 73 65 72 76 69 63 65 20 6f 6e 65   can service one
a030: 20 63 6f 6e 63 75 72 72 65 6e 74 20 48 54 54 50   concurrent HTTP
a040: 20 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09   session.\n");..
a050: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
a060: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
a070: 20 20 20 20 20 20 20 20 20 20 54 68 75 73 20 74            Thus t
a080: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72  he number of thr
a090: 65 61 64 73 20 63 72 65 61 74 65 64 20 77 69 6c  eads created wil
a0a0: 6c 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 5c  l determine how\
a0b0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
a0c0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 6d 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f 75  many simultaneou
a0f0: 73 20 74 72 61 6e 73 66 65 72 73 20 77 69 6c 6c  s transfers will
a100: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   be possible. Th
a110: 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  e\n");...fprintf
a120: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75    default is %lu
a150: 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  .\n", (unsigned 
a160: 6c 6f 6e 67 29 20 54 48 52 45 41 44 5f 43 4f 55  long) THREAD_COU
a170: 4e 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  NT);...fprintf(o
a180: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
a190: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
a1a0: 22 20 20 20 20 20 20 2d 63 20 28 6f 72 20 2d 2d  "      -c (or --
a1b0: 63 61 63 68 65 29 20 73 70 65 63 69 66 69 65 73  cache) specifies
a1c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
a1d0: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
a1e0: 63 61 63 68 65 20 65 6e 74 72 69 65 73 5c 6e 22  cache entries\n"
a1f0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
a200: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
a210: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 61              to a
a220: 6c 6c 6f 63 61 74 65 2e 20 20 45 61 63 68 20 63  llocate.  Each c
a230: 61 63 68 65 20 65 6e 74 72 79 20 68 6f 6c 64 73  ache entry holds
a240: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
a250: 6e 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69  n as\n");...fpri
a260: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f 70     well as an op
a290: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
a2a0: 6f 72 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  or to the file, 
a2b0: 73 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22 29 3b  so resource\n");
a2c0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
a2d0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
a2e0: 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 73            limits
a2f0: 20 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29 20   (i.e., ulimit) 
a300: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64  should be consid
a310: 65 72 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75  ered.  This shou
a320: 6c 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ld\n");...fprint
a330: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62   be a prime numb
a360: 65 72 20 66 6f 72 20 69 64 65 61 6c 20 75 73 65  er for ideal use
a370: 20 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75 70   with the lookup
a380: 20 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09   method.\n");...
a390: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
a3a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a3b0: 20 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75         The defau
a3c0: 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28  lt is %lu.\n", (
a3d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43  unsigned long) C
a3e0: 41 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66 70  ACHE_SIZE);...fp
a3f0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
a400: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
a410: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c  utput, "      -l
a420: 20 28 6f 72 20 2d 2d 6c 6f 67 29 20 73 70 65 63   (or --log) spec
a430: 69 66 69 65 73 20 61 20 66 69 6c 65 6e 61 6d 65  ifies a filename
a440: 20 74 6f 20 6f 70 65 6e 20 66 6f 72 20 77 72 69   to open for wri
a450: 74 69 6e 67 20 6c 6f 67 20 65 6e 74 72 69 65 73  ting log entries
a460: 2e 20 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09 66 70  .  Log\n");...fp
a470: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d     entries are m
a4a0: 61 64 65 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ade for various 
a4b0: 73 74 61 67 65 73 20 69 6e 20 74 72 61 6e 73 66  stages in transf
a4c0: 65 72 69 6e 67 20 66 69 6c 65 73 2e 5c 6e 22 29  ering files.\n")
a4d0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
a4e0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
a4f0: 20 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67           The log
a500: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
a510: 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
a520: 20 75 73 65 72 73 20 28 73 65 65 20 5c 22 2d 75   users (see \"-u
a530: 5c 22 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  \")\n");...fprin
a540: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 61 6e 64 20 72 6f 6f 74 20 64 69 72 65 63 74 6f  and root directo
a570: 72 69 65 73 20 28 73 65 65 20 5c 22 2d 72 5c 22  ries (see \"-r\"
a580: 29 2e 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65  ).  The log file
a590: 20 69 73 20 6e 65 76 65 72 5c 6e 22 29 3b 0a 09   is never\n");..
a5a0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
a5b0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
a5c0: 20 20 20 20 20 20 63 6c 6f 73 65 64 20 73 6f 20        closed so 
a5d0: 6c 6f 67 20 72 6f 74 61 74 69 6f 6e 20 77 69 74  log rotation wit
a5e0: 68 6f 75 74 20 73 74 6f 70 70 69 6e 67 20 74 68  hout stopping th
a5f0: 65 20 64 61 65 6d 6f 6e 20 69 73 20 77 69 6c 6c  e daemon is will
a600: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a610: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74               not
a630: 20 77 6f 72 6b 2e 20 20 54 68 65 20 76 61 6c 75   work.  The valu
a640: 65 20 6f 66 20 5c 22 2d 5c 22 20 69 6e 64 69 63  e of \"-\" indic
a650: 61 74 65 73 20 74 68 61 74 20 73 74 61 6e 64 61  ates that standa
a660: 72 64 20 6f 75 74 70 75 74 5c 6e 22 29 3b 0a 09  rd output\n");..
a670: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
a680: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
a690: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
a6a0: 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67  used for logging
a6b0: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 6e 61  .  If the filena
a6c0: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  me begins with a
a6d0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a6e0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 69 70               pip
a700: 65 20 28 5c 22 7c 5c 22 29 20 74 68 65 6e 20 61  e (\"|\") then a
a710: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 61 72   process is star
a720: 74 65 64 20 61 6e 64 20 75 73 65 64 20 66 6f 72  ted and used for
a730: 20 6c 6f 67 67 69 6e 67 5c 6e 22 29 3b 0a 09 09   logging\n");...
a740: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
a750: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a760: 20 20 20 20 20 69 6e 73 74 65 61 64 20 6f 66 20       instead of 
a770: 61 20 66 69 6c 65 2e 20 20 54 68 65 20 64 65 66  a file.  The def
a780: 61 75 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e 5c  ault is \"%s\".\
a790: 6e 22 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a 23  n", LOG_FILE);.#
a7a0: 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54  ifdef FILED_DONT
a7b0: 5f 4c 4f 47 0a 09 09 66 70 72 69 6e 74 66 28 6f  _LOG...fprintf(o
a7c0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 65              Note
a7e0: 20 74 68 61 74 20 6c 6f 67 67 69 6e 67 20 69 73   that logging is
a7f0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 61   completely disa
a800: 62 6c 65 64 20 73 6f 20 74 68 69 73 20 6f 70 74  bled so this opt
a810: 69 6f 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09 09  ion does\n");...
a820: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
a830: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
a840: 20 20 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e 20       nothing in 
a850: 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b  this build.\n");
a860: 0a 23 65 6e 64 69 66 0a 09 09 66 70 72 69 6e 74  .#endif...fprint
a870: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
a880: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
a890: 74 2c 20 22 20 20 20 20 20 20 2d 75 20 28 6f 72  t, "      -u (or
a8a0: 20 2d 2d 75 73 65 72 29 20 73 70 65 63 69 66 69   --user) specifi
a8b0: 65 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 73  es the user to s
a8c0: 77 69 74 63 68 20 75 73 65 72 20 49 44 73 20 74  witch user IDs t
a8d0: 6f 20 62 65 66 6f 72 65 20 73 65 72 76 69 63 69  o before servici
a8e0: 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ng\n");...fprint
a8f0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 72 65 71 75 65 73 74 73 2e 20 20 54 68 65 20 64  requests.  The d
a920: 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68  efault is not ch
a930: 61 6e 67 65 20 75 73 65 72 20 49 44 73 2e 5c 6e  ange user IDs.\n
a940: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
a950: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
a960: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
a970: 20 20 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d 72        -r (or --r
a980: 6f 6f 74 29 20 73 70 65 63 69 66 69 65 73 20 74  oot) specifies t
a990: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
a9a0: 61 63 74 20 61 73 20 74 68 65 20 72 6f 6f 74 20  act as the root 
a9b0: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e 22  directory for\n"
a9c0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
a9d0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
a9e0: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 66             the f
a9f0: 69 6c 65 20 73 65 72 76 65 72 2e 20 20 49 66 20  ile server.  If 
aa00: 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 73  this option is s
aa10: 70 65 63 69 66 69 65 64 2c 20 63 68 72 6f 6f 74  pecified, chroot
aa20: 28 32 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  (2)\n");...fprin
aa30: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 65   is called.  The
aa60: 20 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20   default is not 
aa70: 63 68 61 6e 67 65 20 72 6f 6f 74 20 64 69 72 65  change root dire
aa80: 63 74 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09 09  ctories,\n");...
aa90: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
aaa0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
aab0: 20 20 20 20 20 20 74 68 61 74 20 69 73 2c 20 74        that is, t
aac0: 68 65 20 5c 22 2f 5c 22 20 64 69 72 65 63 74 6f  he \"/\" directo
aad0: 72 79 20 69 73 20 73 68 61 72 65 64 20 6f 75 74  ry is shared out
aae0: 2e 20 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22 29  .  This will\n")
aaf0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
ab00: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
ab10: 20 20 20 20 20 20 20 20 20 20 6c 69 6b 65 6c 79            likely
ab20: 20 62 65 20 61 20 73 65 63 75 72 69 74 79 20 69   be a security i
ab30: 73 73 75 65 2c 20 73 6f 20 74 68 69 73 20 6f 70  ssue, so this op
ab40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
ab50: 79 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ys\n");...fprint
ab60: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 62 65 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09 7d  be used.\n");..}
ab90: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
aba0: 20 41 64 64 20 61 20 67 65 74 6f 70 74 20 6f 70   Add a getopt op
abb0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
abc0: 6f 69 64 20 66 69 6c 65 64 5f 67 65 74 6f 70 74  oid filed_getopt
abd0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74 72  _long_setopt(str
abe0: 75 63 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74 2c  uct option *opt,
abf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
ac00: 65 2c 20 69 6e 74 20 68 61 73 5f 61 72 67 2c 20  e, int has_arg, 
ac10: 69 6e 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74 2d  int val) {..opt-
ac20: 3e 6e 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d 65  >name     = name
ac30: 3b 0a 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67 20  ;..opt->has_arg 
ac40: 20 3d 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70 74   = has_arg;..opt
ac50: 2d 3e 66 6c 61 67 20 20 20 20 20 3d 20 4e 55 4c  ->flag     = NUL
ac60: 4c 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20 20  L;..opt->val    
ac70: 20 20 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75 72    = val;...retur
ac80: 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65  n;.}../* Resolve
ac90: 20 61 20 75 73 65 72 6e 61 6d 65 20 74 6f 20 61   a username to a
aca0: 20 55 49 44 20 2a 2f 0a 73 74 61 74 69 63 20 69   UID */.static i
acb0: 6e 74 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f  nt filed_user_lo
acc0: 6f 6b 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  okup(const char 
acd0: 2a 75 73 65 72 2c 20 75 69 64 5f 74 20 2a 75 73  *user, uid_t *us
ace0: 65 72 5f 69 64 29 20 7b 0a 09 63 68 61 72 20 2a  er_id) {..char *
acf0: 6e 65 78 74 3b 0a 09 75 69 64 5f 74 20 75 73 65  next;..uid_t use
ad00: 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66 6e  r_id_check;.#ifn
ad10: 64 65 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45 54  def FILED_NO_GET
ad20: 50 57 4e 41 4d 0a 09 73 74 72 75 63 74 20 70 61  PWNAM..struct pa
ad30: 73 73 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e 74  sswd *ent;...ent
ad40: 20 3d 20 67 65 74 70 77 6e 61 6d 28 75 73 65 72   = getpwnam(user
ad50: 29 3b 0a 09 69 66 20 28 65 6e 74 20 21 3d 20 4e  );..if (ent != N
ad60: 55 4c 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f 69  ULL) {...*user_i
ad70: 64 20 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64 3b  d = ent->pw_uid;
ad80: 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
ad90: 7d 0a 23 65 6e 64 69 66 0a 0a 09 75 73 65 72 5f  }.#endif...user_
ada0: 69 64 5f 63 68 65 63 6b 20 3d 20 73 74 72 74 6f  id_check = strto
adb0: 75 6c 6c 28 75 73 65 72 2c 20 26 6e 65 78 74 2c  ull(user, &next,
adc0: 20 31 30 29 3b 0a 09 69 66 20 28 6e 65 78 74 20   10);..if (next 
add0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
ade0: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  urn(1);..}...if 
adf0: 28 6e 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30 27  (next[0] != '\0'
ae00: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
ae10: 0a 09 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20 3d  ..}...*user_id =
ae20: 20 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a   user_id_check;.
ae30: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
ae40: 2f 2a 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f 0a  /* Daemonize */.
ae50: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
ae60: 5f 64 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29  _daemonize(void)
ae70: 20 7b 0a 09 70 69 64 5f 74 20 73 65 74 73 69 64   {..pid_t setsid
ae80: 5f 72 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b 0a  _ret, fork_ret;.
ae90: 09 69 6e 74 20 63 68 64 69 72 5f 72 65 74 2c 20  .int chdir_ret, 
aea0: 64 75 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20 66  dup2_ret;..int f
aeb0: 64 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a 09  d_in, fd_out;...
aec0: 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69  chdir_ret = chdi
aed0: 72 28 22 2f 22 29 3b 0a 09 69 66 20 28 63 68 64  r("/");..if (chd
aee0: 69 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  ir_ret != 0) {..
aef0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
af00: 09 66 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72 6b  .fork_ret = fork
af10: 28 29 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65  ();..if (fork_re
af20: 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72  t < 0) {...retur
af30: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  n(1);..}...if (f
af40: 6f 72 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09  ork_ret > 0) {..
af50: 09 2f 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09 09  ./* Parent */...
af60: 77 61 69 74 70 69 64 28 66 6f 72 6b 5f 72 65 74  waitpid(fork_ret
af70: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 65  , NULL, 0);....e
af80: 78 69 74 28 45 58 49 54 5f 53 55 43 43 45 53 53  xit(EXIT_SUCCESS
af90: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c 64  );..}.../* Child
afa0: 20 2a 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29 20   */..if (fork() 
afb0: 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68 69  != 0) {.../* Chi
afc0: 6c 64 20 2a 2f 0a 09 09 65 78 69 74 28 45 58 49  ld */...exit(EXI
afd0: 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a  T_SUCCESS);..}..
afe0: 09 2f 2a 20 47 72 61 6e 64 20 63 68 69 6c 64 20  ./* Grand child 
aff0: 2a 2f 0a 09 73 65 74 73 69 64 5f 72 65 74 20 3d  */..setsid_ret =
b000: 20 73 65 74 73 69 64 28 29 3b 0a 09 69 66 20 28   setsid();..if (
b010: 73 65 74 73 69 64 5f 72 65 74 20 3d 3d 20 28 28  setsid_ret == ((
b020: 70 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09  pid_t) -1)) {...
b030: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
b040: 66 64 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f 64  fd_in = open("/d
b050: 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e  ev/null", O_RDON
b060: 4c 59 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20 6f  LY);..fd_out = o
b070: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
b080: 20 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66 20   O_WRONLY);..if 
b090: 28 66 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66 64  (fd_in < 0 || fd
b0a0: 5f 6f 75 74 20 3c 20 30 29 20 7b 0a 09 09 72 65  _out < 0) {...re
b0b0: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75  turn(1);..}...du
b0c0: 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64  p2_ret = dup2(fd
b0d0: 5f 69 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45 4e  _in, STDIN_FILEN
b0e0: 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65  O);..if (dup2_re
b0f0: 74 20 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45 4e  t != STDIN_FILEN
b100: 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  O) {...return(1)
b110: 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20  ;..}...dup2_ret 
b120: 3d 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53  = dup2(fd_out, S
b130: 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09  TDOUT_FILENO);..
b140: 69 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20  if (dup2_ret != 
b150: 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20 7b  STDOUT_FILENO) {
b160: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
b170: 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75  ...dup2_ret = du
b180: 70 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 45 52  p2(fd_out, STDER
b190: 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28  R_FILENO);..if (
b1a0: 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 45  dup2_ret != STDE
b1b0: 52 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72  RR_FILENO) {...r
b1c0: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 63  eturn(1);..}...c
b1d0: 6c 6f 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63 6c  lose(fd_in);..cl
b1e0: 6f 73 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09 72  ose(fd_out);...r
b1f0: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
b200: 52 75 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a 69  Run process */.i
b210: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
b220: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b  , char **argv) {
b230: 0a 09 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20  ..struct option 
b240: 6f 70 74 69 6f 6e 73 5b 31 32 5d 3b 0a 09 73 74  options[12];..st
b250: 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f  ruct filed_optio
b260: 6e 73 20 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e  ns thread_option
b270: 73 20 3d 20 7b 30 7d 3b 0a 09 63 6f 6e 73 74 20  s = {0};..const 
b280: 63 68 61 72 20 2a 62 69 6e 64 5f 61 64 64 72 20  char *bind_addr 
b290: 3d 20 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e 65  = BIND_ADDR, *ne
b2a0: 77 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  wroot = NULL, *l
b2b0: 6f 67 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46 49  og_file = LOG_FI
b2c0: 4c 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f 66  LE;..FILE *log_f
b2d0: 70 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 20 3d  p;..uid_t user =
b2e0: 20 30 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d 20   0;..int port = 
b2f0: 50 4f 52 54 2c 20 74 68 72 65 61 64 5f 63 6f 75  PORT, thread_cou
b300: 6e 74 20 3d 20 54 48 52 45 41 44 5f 43 4f 55 4e  nt = THREAD_COUN
b310: 54 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 73 69  T;..int cache_si
b320: 7a 65 20 3d 20 43 41 43 48 45 5f 53 49 5a 45 3b  ze = CACHE_SIZE;
b330: 0a 09 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c 20  ..int init_ret, 
b340: 63 68 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74 75  chroot_ret, setu
b350: 69 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f 72  id_ret, lookup_r
b360: 65 74 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a 09  et, chdir_ret;..
b370: 69 6e 74 20 73 65 74 75 69 64 5f 65 6e 61 62 6c  int setuid_enabl
b380: 65 64 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f 65  ed = 0, daemon_e
b390: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e 74  nabled = 0;..int
b3a0: 20 63 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09   ch;..int fd;...
b3b0: 2f 2a 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d  /* Process argum
b3c0: 65 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67  ents */..filed_g
b3d0: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
b3e0: 74 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22  t(&options[0], "
b3f0: 70 6f 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f  port", required_
b400: 61 72 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a  argument, 'p');.
b410: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
b420: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
b430: 6e 73 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22  ns[1], "threads"
b440: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
b450: 65 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65  ent, 't');..file
b460: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
b470: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d  topt(&options[2]
b480: 2c 20 22 63 61 63 68 65 22 2c 20 72 65 71 75 69  , "cache", requi
b490: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63  red_argument, 'c
b4a0: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
b4b0: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
b4c0: 70 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64  ptions[3], "bind
b4d0: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
b4e0: 6d 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c  ment, 'b');..fil
b4f0: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
b500: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34  etopt(&options[4
b510: 5d 2c 20 22 75 73 65 72 22 2c 20 72 65 71 75 69  ], "user", requi
b520: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75  red_argument, 'u
b530: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
b540: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
b550: 70 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74  ptions[5], "root
b560: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
b570: 6d 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c  ment, 'r');..fil
b580: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
b590: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36  etopt(&options[6
b5a0: 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72  ], "help", no_ar
b5b0: 67 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66  gument, 'h');..f
b5c0: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
b5d0: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
b5e0: 5b 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e  [7], "daemon", n
b5f0: 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29  o_argument, 'd')
b600: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
b610: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
b620: 69 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20  ions[8], "log", 
b630: 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e  required_argumen
b640: 74 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'l');..filed_
b650: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
b660: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20  pt(&options[9], 
b670: 22 76 65 72 73 69 6f 6e 22 2c 20 6e 6f 5f 61 72  "version", no_ar
b680: 67 75 6d 65 6e 74 2c 20 27 76 27 29 3b 0a 09 66  gument, 'v');..f
b690: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
b6a0: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
b6b0: 5b 31 30 5d 2c 20 22 76 68 6f 73 74 22 2c 20 6e  [10], "vhost", n
b6c0: 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 56 27 29  o_argument, 'V')
b6d0: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
b6e0: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
b6f0: 69 6f 6e 73 5b 31 31 5d 2c 20 4e 55 4c 4c 2c 20  ions[11], NULL, 
b700: 30 2c 20 30 29 3b 0a 09 77 68 69 6c 65 20 28 28  0, 0);..while ((
b710: 63 68 20 3d 20 67 65 74 6f 70 74 5f 6c 6f 6e 67  ch = getopt_long
b720: 28 61 72 67 63 2c 20 61 72 67 76 2c 20 22 70 3a  (argc, argv, "p:
b730: 74 3a 63 3a 62 3a 75 3a 72 3a 6c 3a 68 64 76 56  t:c:b:u:r:l:hdvV
b740: 22 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e 55 4c 4c  ", options, NULL
b750: 29 29 20 21 3d 20 2d 31 29 20 7b 0a 09 09 73 77  )) != -1) {...sw
b760: 69 74 63 68 28 63 68 29 20 7b 0a 09 09 09 63 61  itch(ch) {....ca
b770: 73 65 20 27 70 27 3a 0a 09 09 09 09 70 6f 72 74  se 'p':.....port
b780: 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b   = atoi(optarg);
b790: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
b7a0: 61 73 65 20 27 74 27 3a 0a 09 09 09 09 74 68 72  ase 't':.....thr
b7b0: 65 61 64 5f 63 6f 75 6e 74 20 3d 20 61 74 6f 69  ead_count = atoi
b7c0: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
b7d0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 63 27  eak;....case 'c'
b7e0: 3a 0a 09 09 09 09 63 61 63 68 65 5f 73 69 7a 65  :.....cache_size
b7f0: 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b   = atoi(optarg);
b800: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
b810: 61 73 65 20 27 62 27 3a 0a 09 09 09 09 62 69 6e  ase 'b':.....bin
b820: 64 5f 61 64 64 72 20 3d 20 73 74 72 64 75 70 28  d_addr = strdup(
b830: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
b840: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 75 27 3a  ak;....case 'u':
b850: 0a 09 09 09 09 73 65 74 75 69 64 5f 65 6e 61 62  .....setuid_enab
b860: 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 6c 6f 6f  led = 1;.....loo
b870: 6b 75 70 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  kup_ret = filed_
b880: 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f 70 74 61  user_lookup(opta
b890: 72 67 2c 20 26 75 73 65 72 29 3b 0a 09 09 09 09  rg, &user);.....
b8a0: 69 66 20 28 6c 6f 6f 6b 75 70 5f 72 65 74 20 21  if (lookup_ret !
b8b0: 3d 20 30 29 20 7b 0a 09 09 09 09 09 66 69 6c 65  = 0) {......file
b8c0: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64  d_print_help(std
b8d0: 65 72 72 2c 20 30 2c 20 22 49 6e 76 61 6c 69 64  err, 0, "Invalid
b8e0: 20 75 73 65 72 6e 61 6d 65 20 73 70 65 63 69 66   username specif
b8f0: 69 65 64 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  ied");.......ret
b900: 75 72 6e 28 31 29 3b 0a 09 09 09 09 7d 0a 09 09  urn(1);.....}...
b910: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
b920: 20 27 72 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f   'r':.....filed_
b930: 70 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 5f 73  path_translate_s
b940: 65 74 5f 72 6f 6f 74 28 6e 65 77 72 6f 6f 74 2c  et_root(newroot,
b950: 20 26 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73   &thread_options
b960: 2c 20 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  , optarg);.....b
b970: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 6c  reak;....case 'l
b980: 27 3a 0a 09 09 09 09 6c 6f 67 5f 66 69 6c 65 20  ':.....log_file 
b990: 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72 67 29  = strdup(optarg)
b9a0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
b9b0: 63 61 73 65 20 27 64 27 3a 0a 09 09 09 09 64 61  case 'd':.....da
b9c0: 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20 31  emon_enabled = 1
b9d0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
b9e0: 63 61 73 65 20 27 56 27 3a 0a 09 09 09 09 74 68  case 'V':.....th
b9f0: 72 65 61 64 5f 6f 70 74 69 6f 6e 73 2e 76 68 6f  read_options.vho
ba00: 73 74 73 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b  sts_enabled = 1;
ba10: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
ba20: 63 61 73 65 20 27 76 27 3a 0a 09 09 09 09 70 72  case 'v':.....pr
ba30: 69 6e 74 66 28 22 66 69 6c 65 64 20 76 65 72 73  intf("filed vers
ba40: 69 6f 6e 20 25 73 5c 6e 22 2c 20 46 49 4c 45 44  ion %s\n", FILED
ba50: 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 09 09 09  _VERSION);......
ba60: 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 09 63 61  return(0);....ca
ba70: 73 65 20 27 3f 27 3a 0a 09 09 09 63 61 73 65 20  se '?':....case 
ba80: 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70  ':':.....filed_p
ba90: 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72  rint_help(stderr
baa0: 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09  , 0, NULL);.....
bab0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 63  .return(1);....c
bac0: 61 73 65 20 27 68 27 3a 0a 09 09 09 09 66 69 6c  ase 'h':.....fil
bad0: 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74  ed_print_help(st
bae0: 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b 0a  dout, 1, NULL);.
baf0: 0a 09 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  .....return(0);.
bb00: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65 6e  ..}..}.../* Open
bb10: 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 6c 6f   log file */..lo
bb20: 67 5f 66 70 20 3d 20 66 69 6c 65 64 5f 6c 6f 67  g_fp = filed_log
bb30: 5f 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c 65 29 3b  _open(log_file);
bb40: 0a 09 69 66 20 28 6c 6f 67 5f 66 70 20 3d 3d 20  ..if (log_fp == 
bb50: 4e 55 4c 4c 29 20 7b 0a 09 09 70 65 72 72 6f 72  NULL) {...perror
bb60: 28 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e  ("filed_log_open
bb70: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29  ");....return(4)
bb80: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65  ;..}.../* Create
bb90: 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65   listening socke
bba0: 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69 6c 65 64  t */..fd = filed
bbb0: 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f 61 64 64  _listen(bind_add
bbc0: 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66 20 28 66  r, port);..if (f
bbd0: 64 20 3c 20 30 29 20 7b 0a 09 09 70 65 72 72 6f  d < 0) {...perro
bbe0: 72 28 22 66 69 6c 65 64 5f 6c 69 73 74 65 6e 22  r("filed_listen"
bbf0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
bc00: 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c  ..}.../* Initial
bc10: 69 7a 65 20 74 69 6d 65 6f 75 74 20 73 74 72 75  ize timeout stru
bc20: 63 74 75 72 65 73 20 2a 2f 0a 09 69 6e 69 74 5f  ctures */..init_
bc30: 72 65 74 20 3d 20 66 69 6c 65 64 5f 73 6f 63 6b  ret = filed_sock
bc40: 65 74 74 69 6d 65 6f 75 74 5f 69 6e 69 74 28 29  ettimeout_init()
bc50: 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20  ;..if (init_ret 
bc60: 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72  != 0) {...perror
bc70: 28 22 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  ("filed_socketti
bc80: 6d 65 6f 75 74 5f 69 6e 69 74 22 29 3b 0a 0a 09  meout_init");...
bc90: 09 72 65 74 75 72 6e 28 38 29 3b 0a 09 7d 0a 0a  .return(8);..}..
bca0: 09 2f 2a 20 42 65 63 6f 6d 65 20 61 20 64 61 65  ./* Become a dae
bcb0: 6d 6f 6e 20 2a 2f 0a 09 69 66 20 28 64 61 65 6d  mon */..if (daem
bcc0: 6f 6e 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09  on_enabled) {...
bcd0: 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64  init_ret = filed
bce0: 5f 64 61 65 6d 6f 6e 69 7a 65 28 29 3b 0a 09 09  _daemonize();...
bcf0: 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20  if (init_ret != 
bd00: 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  0) {....perror("
bd10: 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 22  filed_daemonize"
bd20: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 36 29  );.....return(6)
bd30: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 43 68  ;...}..}.../* Ch
bd40: 72 6f 6f 74 2c 20 69 66 20 61 70 70 72 6f 70 72  root, if appropr
bd50: 69 61 74 65 20 2a 2f 0a 09 69 66 20 28 6e 65 77  iate */..if (new
bd60: 72 6f 6f 74 29 20 7b 0a 09 09 63 68 64 69 72 5f  root) {...chdir_
bd70: 72 65 74 20 3d 20 63 68 64 69 72 28 6e 65 77 72  ret = chdir(newr
bd80: 6f 6f 74 29 3b 0a 09 09 69 66 20 28 63 68 64 69  oot);...if (chdi
bd90: 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  r_ret != 0) {...
bda0: 09 70 65 72 72 6f 72 28 22 63 68 64 69 72 22 29  .perror("chdir")
bdb0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b  ;.....return(1);
bdc0: 0a 09 09 7d 0a 0a 09 09 63 68 72 6f 6f 74 5f 72  ...}....chroot_r
bdd0: 65 74 20 3d 20 63 68 72 6f 6f 74 28 22 2e 22 29  et = chroot(".")
bde0: 3b 0a 09 09 69 66 20 28 63 68 72 6f 6f 74 5f 72  ;...if (chroot_r
bdf0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65  et != 0) {....pe
be00: 72 72 6f 72 28 22 63 68 72 6f 6f 74 22 29 3b 0a  rror("chroot");.
be10: 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
be20: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 72 6f 70 20  .}..}.../* Drop 
be30: 70 72 69 76 69 6c 65 67 65 73 2c 20 69 66 20 61  privileges, if a
be40: 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69  ppropriate */..i
be50: 66 20 28 73 65 74 75 69 64 5f 65 6e 61 62 6c 65  f (setuid_enable
be60: 64 29 20 7b 0a 09 09 73 65 74 75 69 64 5f 72 65  d) {...setuid_re
be70: 74 20 3d 20 73 65 74 75 69 64 28 75 73 65 72 29  t = setuid(user)
be80: 3b 0a 09 09 69 66 20 28 73 65 74 75 69 64 5f 72  ;...if (setuid_r
be90: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65  et != 0) {....pe
bea0: 72 72 6f 72 28 22 73 65 74 75 69 64 22 29 3b 0a  rror("setuid");.
beb0: 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
bec0: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69  .}..}.../* Initi
bed0: 61 6c 69 7a 65 20 2a 2f 0a 09 69 6e 69 74 5f 72  alize */..init_r
bee0: 65 74 20 3d 20 66 69 6c 65 64 5f 69 6e 69 74 28  et = filed_init(
bef0: 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66  cache_size);..if
bf00: 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29   (init_ret != 0)
bf10: 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c   {...perror("fil
bf20: 65 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65  ed_init");....re
bf30: 74 75 72 6e 28 33 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(3);..}.../*
bf40: 20 43 72 65 61 74 65 20 6c 6f 67 67 69 6e 67 20   Create logging 
bf50: 74 68 72 65 61 64 20 2a 2f 0a 09 69 6e 69 74 5f  thread */..init_
bf60: 72 65 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 67  ret = filed_logg
bf70: 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28  ing_thread_init(
bf80: 6c 6f 67 5f 66 70 29 3b 0a 09 69 66 20 28 69 6e  log_fp);..if (in
bf90: 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
bfa0: 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 6c  .perror("filed_l
bfb0: 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e  ogging_thread_in
bfc0: 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  it");....return(
bfd0: 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  4);..}.../* Crea
bfe0: 74 65 20 73 6f 63 6b 65 74 20 74 65 72 6d 69 6e  te socket termin
bff0: 61 74 69 6f 6e 20 74 68 72 65 61 64 20 2a 2f 0a  ation thread */.
c000: 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65  .init_ret = file
c010: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
c020: 74 68 72 65 61 64 5f 69 6e 69 74 28 29 3b 0a 09  thread_init();..
c030: 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20  if (init_ret != 
c040: 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66  0) {...perror("f
c050: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
c060: 75 74 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29  ut_thread_init")
c070: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 37 29 3b 0a  ;....return(7);.
c080: 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69  .}.../* Initiali
c090: 7a 65 20 73 65 63 63 6f 6d 70 20 2a 2f 0a 09 69  ze seccomp */..i
c0a0: 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  nit_ret = filed_
c0b0: 69 6e 69 74 5f 73 65 63 63 6f 6d 70 28 29 3b 0a  init_seccomp();.
c0c0: 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d  .if (init_ret !=
c0d0: 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22   0) {...perror("
c0e0: 66 69 6c 65 64 5f 69 6e 69 74 5f 73 65 63 63 6f  filed_init_secco
c0f0: 6d 70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  mp");....return(
c100: 39 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  9);..}.../* Crea
c110: 74 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  te worker thread
c120: 73 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d  s */..init_ret =
c130: 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68   filed_worker_th
c140: 72 65 61 64 73 5f 69 6e 69 74 28 66 64 2c 20 74  reads_init(fd, t
c150: 68 72 65 61 64 5f 63 6f 75 6e 74 2c 20 26 74 68  hread_count, &th
c160: 72 65 61 64 5f 6f 70 74 69 6f 6e 73 29 3b 0a 09  read_options);..
c170: 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20  if (init_ret != 
c180: 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66  0) {...perror("f
c190: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
c1a0: 61 64 73 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72  ads_init");....r
c1b0: 65 74 75 72 6e 28 35 29 3b 0a 09 7d 0a 0a 09 2f  eturn(5);..}.../
c1c0: 2a 20 57 61 69 74 20 66 6f 72 20 74 68 72 65 61  * Wait for threa
c1d0: 64 73 20 74 6f 20 65 78 69 74 20 2a 2f 0a 09 2f  ds to exit */../
c1e0: 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4d 6f 6e 69  * XXX:TODO: Moni
c1f0: 74 6f 72 20 74 68 72 65 61 64 20 75 73 61 67 65  tor thread usage
c200: 20 2a 2f 0a 09 77 68 69 6c 65 20 28 31 29 20 7b   */..while (1) {
c210: 0a 09 09 73 6c 65 65 70 28 38 36 34 30 30 29 3b  ...sleep(86400);
c220: 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74 75 72 6e 20  ..}.../* Return 
c230: 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 72  in failure */..r
c240: 65 74 75 72 6e 28 32 29 3b 0a 7d 0a              eturn(2);.}.