Hex Artifact Content

Artifact a92c173e7ca48468d43bb9e6172dcfd1b83db90e:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 63 29 20 32 30 31 34 20 2d 20 32 30 31 36 2c  (c) 2014 - 2016,
0020: 20 52 6f 79 20 4b 65 65 6e 65 0a 20 2a 20 41 6c   Roy Keene. * Al
0030: 6c 20 72 69 67 68 74 73 20 72 65 73 65 72 76 65  l rights reserve
0040: 64 2e 0a 20 2a 20 0a 20 2a 20 52 65 64 69 73 74  d.. * . * Redist
0050: 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65  ribution and use
0060: 20 69 6e 20 73 6f 75 72 63 65 20 61 6e 64 20 62   in source and b
0070: 69 6e 61 72 79 20 66 6f 72 6d 73 2c 20 77 69 74  inary forms, wit
0080: 68 20 6f 72 20 77 69 74 68 6f 75 74 0a 20 2a 20  h or without. * 
0090: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2c 20 61 72  modification, ar
00a0: 65 20 70 65 72 6d 69 74 74 65 64 20 70 72 6f 76  e permitted prov
00b0: 69 64 65 64 20 74 68 61 74 20 74 68 65 20 66 6f  ided that the fo
00c0: 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f  llowing conditio
00d0: 6e 73 20 61 72 65 20 6d 65 74 3a 0a 20 2a 20 09  ns are met:. * .
00e0: 31 2e 20 52 65 64 69 73 74 72 69 62 75 74 69 6f  1. Redistributio
00f0: 6e 73 20 6f 66 20 73 6f 75 72 63 65 20 63 6f 64  ns of source cod
0100: 65 20 6d 75 73 74 20 72 65 74 61 69 6e 20 74 68  e must retain th
0110: 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68  e above copyrigh
0120: 74 0a 20 2a 20 09 20 20 20 6e 6f 74 69 63 65 2c  t. * .   notice,
0130: 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f   this list of co
0140: 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nditions and the
0150: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c   following discl
0160: 61 69 6d 65 72 2e 0a 20 2a 20 09 32 2e 20 52 65  aimer.. * .2. Re
0170: 64 69 73 74 72 69 62 75 74 69 6f 6e 73 20 69 6e  distributions in
0180: 20 62 69 6e 61 72 79 20 66 6f 72 6d 20 6d 75 73   binary form mus
0190: 74 20 72 65 70 72 6f 64 75 63 65 20 74 68 65 20  t reproduce the 
01a0: 61 62 6f 76 65 20 63 6f 70 79 72 69 67 68 74 0a  above copyright.
01b0: 20 2a 20 09 20 20 20 6e 6f 74 69 63 65 2c 20 74   * .   notice, t
01c0: 68 69 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64  his list of cond
01d0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 66  itions and the f
01e0: 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c 61 69  ollowing disclai
01f0: 6d 65 72 20 69 6e 20 74 68 65 0a 20 2a 20 09 20  mer in the. * . 
0200: 20 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20    documentation 
0210: 61 6e 64 2f 6f 72 20 6f 74 68 65 72 20 6d 61 74  and/or other mat
0220: 65 72 69 61 6c 73 20 70 72 6f 76 69 64 65 64 20  erials provided 
0230: 77 69 74 68 20 74 68 65 20 64 69 73 74 72 69 62  with the distrib
0240: 75 74 69 6f 6e 2e 0a 20 2a 20 0a 20 2a 20 54 48  ution.. * . * TH
0250: 49 53 20 53 4f 46 54 57 41 52 45 20 49 53 20 50  IS SOFTWARE IS P
0260: 52 4f 56 49 44 45 44 20 42 59 20 54 48 45 20 43  ROVIDED BY THE C
0270: 4f 50 59 52 49 47 48 54 20 48 4f 4c 44 45 52 53  OPYRIGHT HOLDERS
0280: 20 41 4e 44 20 43 4f 4e 54 52 49 42 55 54 4f 52   AND CONTRIBUTOR
0290: 53 20 22 41 53 20 49 53 22 20 0a 20 2a 20 41 4e  S "AS IS" . * AN
02a0: 44 20 41 4e 59 20 45 58 50 52 45 53 53 20 4f 52  D ANY EXPRESS OR
02b0: 20 49 4d 50 4c 49 45 44 20 57 41 52 52 41 4e 54   IMPLIED WARRANT
02c0: 49 45 53 2c 20 49 4e 43 4c 55 44 49 4e 47 2c 20  IES, INCLUDING, 
02d0: 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44 20  BUT NOT LIMITED 
02e0: 54 4f 2c 20 54 48 45 20 0a 20 2a 20 49 4d 50 4c  TO, THE . * IMPL
02f0: 49 45 44 20 57 41 52 52 41 4e 54 49 45 53 20 4f  IED WARRANTIES O
0300: 46 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  F MERCHANTABILIT
0310: 59 20 41 4e 44 20 46 49 54 4e 45 53 53 20 46 4f  Y AND FITNESS FO
0320: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
0330: 55 52 50 4f 53 45 20 0a 20 2a 20 41 52 45 20 44  URPOSE . * ARE D
0340: 49 53 43 4c 41 49 4d 45 44 2e 20 20 49 4e 20 4e  ISCLAIMED.  IN N
0350: 4f 20 45 56 45 4e 54 20 53 48 41 4c 4c 20 54 48  O EVENT SHALL TH
0360: 45 20 43 4f 50 59 52 49 47 48 54 20 48 4f 4c 44  E COPYRIGHT HOLD
0370: 45 52 20 4f 52 20 43 4f 4e 54 52 49 42 55 54 4f  ER OR CONTRIBUTO
0380: 52 53 20 42 45 20 0a 20 2a 20 4c 49 41 42 4c 45  RS BE . * LIABLE
0390: 20 46 4f 52 20 41 4e 59 20 44 49 52 45 43 54 2c   FOR ANY DIRECT,
03a0: 20 49 4e 44 49 52 45 43 54 2c 20 49 4e 43 49 44   INDIRECT, INCID
03b0: 45 4e 54 41 4c 2c 20 53 50 45 43 49 41 4c 2c 20  ENTAL, SPECIAL, 
03c0: 45 58 45 4d 50 4c 41 52 59 2c 20 4f 52 20 0a 20  EXEMPLARY, OR . 
03d0: 2a 20 43 4f 4e 53 45 51 55 45 4e 54 49 41 4c 20  * CONSEQUENTIAL 
03e0: 44 41 4d 41 47 45 53 20 28 49 4e 43 4c 55 44 49  DAMAGES (INCLUDI
03f0: 4e 47 2c 20 42 55 54 20 4e 4f 54 20 4c 49 4d 49  NG, BUT NOT LIMI
0400: 54 45 44 20 54 4f 2c 20 50 52 4f 43 55 52 45 4d  TED TO, PROCUREM
0410: 45 4e 54 20 4f 46 20 0a 20 2a 20 53 55 42 53 54  ENT OF . * SUBST
0420: 49 54 55 54 45 20 47 4f 4f 44 53 20 4f 52 20 53  ITUTE GOODS OR S
0430: 45 52 56 49 43 45 53 3b 20 4c 4f 53 53 20 4f 46  ERVICES; LOSS OF
0440: 20 55 53 45 2c 20 44 41 54 41 2c 20 4f 52 20 50   USE, DATA, OR P
0450: 52 4f 46 49 54 53 3b 20 4f 52 20 42 55 53 49 4e  ROFITS; OR BUSIN
0460: 45 53 53 20 0a 20 2a 20 49 4e 54 45 52 52 55 50  ESS . * INTERRUP
0470: 54 49 4f 4e 29 20 48 4f 57 45 56 45 52 20 43 41  TION) HOWEVER CA
0480: 55 53 45 44 20 41 4e 44 20 4f 4e 20 41 4e 59 20  USED AND ON ANY 
0490: 54 48 45 4f 52 59 20 4f 46 20 4c 49 41 42 49 4c  THEORY OF LIABIL
04a0: 49 54 59 2c 20 57 48 45 54 48 45 52 20 49 4e 20  ITY, WHETHER IN 
04b0: 0a 20 2a 20 43 4f 4e 54 52 41 43 54 2c 20 53 54  . * CONTRACT, ST
04c0: 52 49 43 54 20 4c 49 41 42 49 4c 49 54 59 2c 20  RICT LIABILITY, 
04d0: 4f 52 20 54 4f 52 54 20 28 49 4e 43 4c 55 44 49  OR TORT (INCLUDI
04e0: 4e 47 20 4e 45 47 4c 49 47 45 4e 43 45 20 4f 52  NG NEGLIGENCE OR
04f0: 20 4f 54 48 45 52 57 49 53 45 29 20 0a 20 2a 20   OTHERWISE) . * 
0500: 41 52 49 53 49 4e 47 20 49 4e 20 41 4e 59 20 57  ARISING IN ANY W
0510: 41 59 20 4f 55 54 20 4f 46 20 54 48 45 20 55 53  AY OUT OF THE US
0520: 45 20 4f 46 20 54 48 49 53 20 53 4f 46 54 57 41  E OF THIS SOFTWA
0530: 52 45 2c 20 45 56 45 4e 20 49 46 20 41 44 56 49  RE, EVEN IF ADVI
0540: 53 45 44 20 4f 46 20 54 48 45 20 0a 20 2a 20 50  SED OF THE . * P
0550: 4f 53 53 49 42 49 4c 49 54 59 20 4f 46 20 53 55  OSSIBILITY OF SU
0560: 43 48 20 44 41 4d 41 47 45 2e 0a 20 2a 2f 0a 23  CH DAMAGE.. */.#
0570: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 65 6e  include <sys/sen
0580: 64 66 69 6c 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  dfile.h>.#includ
0590: 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e  e <sys/socket.h>
05a0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
05b0: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
05c0: 20 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a 23   <arpa/inet.h>.#
05d0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61  include <sys/mma
05e0: 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  n.h>.#include <s
05f0: 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c  ys/stat.h>.#incl
0600: 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e 68 3e  ude <sys/wait.h>
0610: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  .#include <pthre
0620: 61 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ad.h>.#include <
0630: 73 74 72 69 6e 67 73 2e 68 3e 0a 23 69 6e 63 6c  strings.h>.#incl
0640: 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23  ude <signal.h>.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0660: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0670: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0680: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0690: 75 64 65 20 3c 67 65 74 6f 70 74 2e 68 3e 0a 23  ude <getopt.h>.#
06a0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
06b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e  h>.#include <fcn
06c0: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
06d0: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  stdio.h>.#includ
06e0: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63  e <errno.h>.#inc
06f0: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69  lude <time.h>.#i
0700: 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a 0a  nclude <pwd.h>..
0710: 2f 2a 20 43 6f 6d 70 69 6c 65 20 74 69 6d 65 20  /* Compile time 
0720: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 23 64 65  constants */.#de
0730: 66 69 6e 65 20 46 49 4c 45 44 5f 56 45 52 53 49  fine FILED_VERSI
0740: 4f 4e 20 22 31 2e 31 39 22 0a 23 64 65 66 69 6e  ON "1.19".#defin
0750: 65 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45  e FILED_SENDFILE
0760: 5f 4d 41 58 20 31 36 37 37 37 32 31 35 0a 23 64  _MAX 16777215.#d
0770: 65 66 69 6e 65 20 46 49 4c 45 44 5f 4d 41 58 5f  efine FILED_MAX_
0780: 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 20 33 30  FAILURE_COUNT 30
0790: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44  .#define FILED_D
07a0: 45 46 41 55 4c 54 5f 54 59 50 45 20 22 61 70 70  EFAULT_TYPE "app
07b0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
07c0: 74 72 65 61 6d 22 0a 23 64 65 66 69 6e 65 20 46  tream".#define F
07d0: 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52  ILED_PATH_BUFFER
07e0: 5f 53 49 5a 45 20 31 30 31 30 0a 0a 2f 2a 20 44  _SIZE 1010../* D
07f0: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f  efault values */
0800: 0a 23 64 65 66 69 6e 65 20 50 4f 52 54 20 38 30  .#define PORT 80
0810: 0a 23 64 65 66 69 6e 65 20 54 48 52 45 41 44 5f  .#define THREAD_
0820: 43 4f 55 4e 54 20 35 0a 23 64 65 66 69 6e 65 20  COUNT 5.#define 
0830: 42 49 4e 44 5f 41 44 44 52 20 22 3a 3a 22 0a 23  BIND_ADDR "::".#
0840: 64 65 66 69 6e 65 20 43 41 43 48 45 5f 53 49 5a  define CACHE_SIZ
0850: 45 20 38 32 30 39 0a 23 64 65 66 69 6e 65 20 4c  E 8209.#define L
0860: 4f 47 5f 46 49 4c 45 20 22 2d 22 0a 0a 2f 2a 20  OG_FILE "-"../* 
0870: 46 75 7a 7a 69 6e 67 20 54 65 73 74 20 43 6f 64  Fuzzing Test Cod
0880: 65 20 2a 2f 0a 23 69 66 64 65 66 20 46 49 4c 45  e */.#ifdef FILE
0890: 44 5f 54 45 53 54 5f 41 46 4c 0a 23 64 65 66 69  D_TEST_AFL.#defi
08a0: 6e 65 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f  ne FILED_DONT_LO
08b0: 47 20 31 0a 23 64 65 66 69 6e 65 20 70 74 68 72  G 1.#define pthr
08c0: 65 61 64 5f 63 72 65 61 74 65 28 61 2c 20 78 2c  ead_create(a, x,
08d0: 20 79 2c 20 7a 29 20 61 66 6c 5f 70 74 68 72 65   y, z) afl_pthre
08e0: 61 64 5f 63 72 65 61 74 65 28 61 2c 20 78 2c 20  ad_create(a, x, 
08f0: 79 2c 20 7a 29 0a 23 64 65 66 69 6e 65 20 62 69  y, z).#define bi
0900: 6e 64 28 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f  nd(x, y, z) afl_
0910: 62 69 6e 64 28 78 2c 20 79 2c 20 7a 29 0a 23 64  bind(x, y, z).#d
0920: 65 66 69 6e 65 20 73 6f 63 6b 65 74 28 78 2c 20  efine socket(x, 
0930: 79 2c 20 7a 29 20 38 31 39 33 0a 23 64 65 66 69  y, z) 8193.#defi
0940: 6e 65 20 6c 69 73 74 65 6e 28 78 2c 20 79 29 20  ne listen(x, y) 
0950: 30 0a 23 64 65 66 69 6e 65 20 61 63 63 65 70 74  0.#define accept
0960: 28 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f 61 63  (x, y, z) afl_ac
0970: 63 65 70 74 28 78 2c 20 79 2c 20 7a 29 0a 23 64  cept(x, y, z).#d
0980: 65 66 69 6e 65 20 63 6c 6f 73 65 28 78 29 20 7b  efine close(x) {
0990: 20 69 66 20 28 73 74 72 63 6d 70 28 23 78 2c 20   if (strcmp(#x, 
09a0: 22 72 61 6e 64 6f 6d 5f 66 64 22 29 20 3d 3d 20  "random_fd") == 
09b0: 30 29 20 7b 20 63 6c 6f 73 65 28 78 29 3b 20 7d  0) { close(x); }
09c0: 20 65 6c 73 65 20 7b 20 65 78 69 74 28 30 29 3b   else { exit(0);
09d0: 20 7d 20 7d 0a 23 64 65 66 69 6e 65 20 66 63 6c   } }.#define fcl
09e0: 6f 73 65 28 78 29 20 65 78 69 74 28 30 29 0a 0a  ose(x) exit(0)..
09f0: 73 74 61 74 69 63 20 69 6e 74 20 61 66 6c 5f 61  static int afl_a
0a00: 63 63 65 70 74 28 69 6e 74 20 78 2c 20 76 6f 69  ccept(int x, voi
0a10: 64 20 2a 61 64 64 72 2c 20 76 6f 69 64 20 2a 7a  d *addr, void *z
0a20: 29 20 7b 0a 09 28 28 73 74 72 75 63 74 20 73 6f  ) {..((struct so
0a30: 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29 20 61 64  ckaddr_in6 *) ad
0a40: 64 72 29 2d 3e 73 69 6e 36 5f 66 61 6d 69 6c 79  dr)->sin6_family
0a50: 20 3d 20 41 46 5f 49 4e 45 54 20 2b 20 41 46 5f   = AF_INET + AF_
0a60: 49 4e 45 54 36 20 2b 20 31 3b 0a 09 72 65 74 75  INET6 + 1;..retu
0a70: 72 6e 28 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29  rn(STDIN_FILENO)
0a80: 3b 0a 09 78 20 3d 20 78 3b 0a 09 7a 20 3d 20 7a  ;..x = x;..z = z
0a90: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
0aa0: 61 66 6c 5f 62 69 6e 64 28 69 6e 74 20 78 2c 20  afl_bind(int x, 
0ab0: 76 6f 69 64 20 2a 79 2c 20 73 6f 63 6b 6c 65 6e  void *y, socklen
0ac0: 5f 74 20 7a 29 20 7b 0a 09 72 65 74 75 72 6e 28  _t z) {..return(
0ad0: 38 31 39 34 29 3b 0a 09 78 20 3d 20 78 3b 0a 09  8194);..x = x;..
0ae0: 79 20 3d 20 79 3b 0a 09 7a 20 3d 20 7a 3b 0a 7d  y = y;..z = z;.}
0af0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 6c  ..static int afl
0b00: 5f 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28  _pthread_create(
0b10: 70 74 68 72 65 61 64 5f 74 20 2a 74 68 72 65 61  pthread_t *threa
0b20: 64 2c 20 63 6f 6e 73 74 20 70 74 68 72 65 61 64  d, const pthread
0b30: 5f 61 74 74 72 5f 74 20 2a 61 74 74 72 2c 20 76  _attr_t *attr, v
0b40: 6f 69 64 20 2a 28 2a 73 74 61 72 74 5f 72 6f 75  oid *(*start_rou
0b50: 74 69 6e 65 29 20 28 76 6f 69 64 20 2a 29 2c 20  tine) (void *), 
0b60: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 09 73 74  void *arg) {..st
0b70: 61 72 74 5f 72 6f 75 74 69 6e 65 28 61 72 67 29  art_routine(arg)
0b80: 3b 0a 09 65 78 69 74 28 33 29 3b 0a 09 74 68 72  ;..exit(3);..thr
0b90: 65 61 64 20 3d 20 74 68 72 65 61 64 3b 0a 09 61  ead = thread;..a
0ba0: 74 74 72 20 3d 20 61 74 74 72 3b 0a 7d 0a 23 65  ttr = attr;.}.#e
0bb0: 6e 64 69 66 0a 0a 2f 2a 20 43 6f 6e 66 69 67 75  ndif../* Configu
0bc0: 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 74  ration options t
0bd0: 68 61 74 20 77 6f 72 6b 20 74 68 72 65 61 64 73  hat work threads
0be0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 77 61 72   need to be awar
0bf0: 65 20 6f 66 20 2a 2f 0a 73 74 72 75 63 74 20 66  e of */.struct f
0c00: 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 7b 0a 09  iled_options {..
0c10: 69 6e 74 20 76 68 6f 73 74 73 5f 65 6e 61 62 6c  int vhosts_enabl
0c20: 65 64 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ed;..const char 
0c30: 2a 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 3b 0a 7d  *fake_newroot;.}
0c40: 3b 0a 0a 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20  ;../* Arguments 
0c50: 66 6f 72 20 77 6f 72 6b 65 72 20 74 68 72 65 61  for worker threa
0c60: 64 73 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  ds */.struct fil
0c70: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
0c80: 5f 61 72 67 73 20 7b 0a 09 69 6e 74 20 66 64 3b  _args {..int fd;
0c90: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f  ..struct filed_o
0ca0: 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 3b 0a  ptions options;.
0cb0: 7d 3b 0a 0a 2f 2a 20 41 72 67 75 6d 65 6e 74 73  };../* Arguments
0cc0: 20 66 6f 72 20 6c 6f 67 67 69 6e 67 20 74 68 72   for logging thr
0cd0: 65 61 64 73 20 2a 2f 0a 73 74 72 75 63 74 20 66  eads */.struct f
0ce0: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
0cf0: 65 61 64 5f 61 72 67 73 20 7b 0a 09 46 49 4c 45  ead_args {..FILE
0d00: 20 2a 66 70 3b 0a 7d 3b 0a 0a 2f 2a 20 46 69 6c   *fp;.};../* Fil
0d10: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
0d20: 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69  .struct filed_fi
0d30: 6c 65 69 6e 66 6f 20 7b 0a 09 70 74 68 72 65 61  leinfo {..pthrea
0d40: 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 3b  d_mutex_t mutex;
0d50: 0a 09 63 68 61 72 20 70 61 74 68 5b 46 49 4c 45  ..char path[FILE
0d60: 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49  D_PATH_BUFFER_SI
0d70: 5a 45 5d 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 6f  ZE];..int fd;..o
0d80: 66 66 5f 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20  ff_t len;..char 
0d90: 2a 6c 61 73 74 6d 6f 64 3b 0a 09 63 68 61 72 20  *lastmod;..char 
0da0: 6c 61 73 74 6d 6f 64 5f 62 5b 36 34 5d 3b 0a 09  lastmod_b[64];..
0db0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 79 70 65  const char *type
0dc0: 3b 0a 09 63 68 61 72 20 65 74 61 67 5b 36 34 5d  ;..char etag[64]
0dd0: 3b 0a 7d 3b 0a 0a 2f 2a 20 52 65 71 75 65 73 74  ;.};../* Request
0de0: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 73 74   variables */.st
0df0: 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f  ruct filed_http_
0e00: 72 65 71 75 65 73 74 20 7b 0a 09 2f 2a 2a 20 42  request {../** B
0e10: 75 66 66 65 72 73 20 2a 2a 2f 0a 09 73 74 72 75  uffers **/..stru
0e20: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
0e30: 6f 20 66 69 6c 65 69 6e 66 6f 3b 0a 09 63 68 61  o fileinfo;..cha
0e40: 72 20 74 6d 70 62 75 66 5b 46 49 4c 45 44 5f 50  r tmpbuf[FILED_P
0e50: 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d  ATH_BUFFER_SIZE]
0e60: 3b 0a 0a 09 2f 2a 2a 20 48 54 54 50 20 52 65 71  ;.../** HTTP Req
0e70: 75 65 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  uest information
0e80: 20 2a 2a 2f 0a 09 2f 2a 2a 2a 20 54 79 70 65 20   **/../*** Type 
0e90: 6f 66 20 72 65 71 75 65 73 74 20 28 48 45 41 44  of request (HEAD
0ea0: 20 6f 72 20 47 45 54 29 20 2a 2a 2a 2f 0a 09 65   or GET) ***/..e
0eb0: 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 52 45  num {...FILED_RE
0ec0: 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54  QUEST_METHOD_GET
0ed0: 2c 0a 09 09 46 49 4c 45 44 5f 52 45 51 55 45 53  ,...FILED_REQUES
0ee0: 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 0a 09 7d  T_METHOD_HEAD..}
0ef0: 20 6d 65 74 68 6f 64 3b 0a 0a 09 2f 2a 2a 2a 20   method;.../*** 
0f00: 50 61 74 68 20 62 65 69 6e 67 20 72 65 71 75 65  Path being reque
0f10: 73 74 65 64 20 2a 2a 2a 2f 0a 09 63 68 61 72 20  sted ***/..char 
0f20: 70 61 74 68 5b 46 49 4c 45 44 5f 50 41 54 48 5f  path[FILED_PATH_
0f30: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 20 0a 0a  BUFFER_SIZE]; ..
0f40: 09 2f 2a 2a 2a 20 50 61 74 68 20 74 79 70 65 20  ./*** Path type 
0f50: 2a 2a 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46  ***/..enum {...F
0f60: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50  ILED_REQUEST_TYP
0f70: 45 5f 44 49 52 45 43 54 4f 52 59 2c 0a 09 09 46  E_DIRECTORY,...F
0f80: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50  ILED_REQUEST_TYP
0f90: 45 5f 4f 54 48 45 52 0a 09 7d 20 74 79 70 65 3b  E_OTHER..} type;
0fa0: 0a 0a 09 73 74 72 75 63 74 20 7b 0a 09 09 73 74  ...struct {...st
0fb0: 72 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 70 72  ruct {....int pr
0fc0: 65 73 65 6e 74 3b 0a 09 09 09 6f 66 66 5f 74 20  esent;....off_t 
0fd0: 6f 66 66 73 65 74 3b 20 20 20 2f 2a 2a 2a 20 52  offset;   /*** R
0fe0: 61 6e 67 65 20 73 74 61 72 74 20 2a 2a 2a 2f 0a  ange start ***/.
0ff0: 09 09 09 6f 66 66 5f 74 20 6c 65 6e 67 74 68 3b  ...off_t length;
1000: 20 20 20 2f 2a 2a 2a 20 52 61 6e 67 65 20 6c 65     /*** Range le
1010: 6e 67 74 68 20 2a 2a 2a 2f 0a 09 09 7d 20 72 61  ngth ***/...} ra
1020: 6e 67 65 3b 0a 0a 09 09 73 74 72 75 63 74 20 7b  nge;....struct {
1030: 0a 09 09 09 69 6e 74 20 70 72 65 73 65 6e 74 3b  ....int present;
1040: 0a 09 09 09 63 68 61 72 20 68 6f 73 74 5b 46 49  ....char host[FI
1050: 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f  LED_PATH_BUFFER_
1060: 53 49 5a 45 5d 3b 0a 09 09 7d 20 68 6f 73 74 3b  SIZE];...} host;
1070: 0a 0a 09 09 65 6e 75 6d 20 7b 0a 09 09 09 46 49  ....enum {....FI
1080: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43  LED_CONNECTION_C
1090: 4c 4f 53 45 2c 0a 09 09 09 46 49 4c 45 44 5f 43  LOSE,....FILED_C
10a0: 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41  ONNECTION_KEEP_A
10b0: 4c 49 56 45 0a 09 09 7d 20 63 6f 6e 6e 65 63 74  LIVE...} connect
10c0: 69 6f 6e 3b 0a 09 7d 20 68 65 61 64 65 72 73 3b  ion;..} headers;
10d0: 0a 7d 3b 0a 0a 2f 2a 20 4c 6f 67 20 72 65 63 6f  .};../* Log reco
10e0: 72 64 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  rd */.struct fil
10f0: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 7b 0a 09  ed_log_entry {..
1100: 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 67 20 65  /* Type of log e
1110: 6e 74 72 79 20 2a 2f 0a 09 65 6e 75 6d 20 7b 0a  ntry */..enum {.
1120: 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45  ..FILED_LOG_TYPE
1130: 5f 4d 45 53 53 41 47 45 2c 0a 09 09 46 49 4c 45  _MESSAGE,...FILE
1140: 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41 4e 53  D_LOG_TYPE_TRANS
1150: 46 45 52 0a 09 7d 20 74 79 70 65 3b 0a 0a 09 2f  FER..} type;.../
1160: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65  * Linked list he
1170: 61 64 2f 74 61 69 6c 20 2a 2f 0a 09 73 74 72 75  ad/tail */..stru
1180: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
1190: 72 79 20 2a 5f 6e 65 78 74 3b 0a 09 73 74 72 75  ry *_next;..stru
11a0: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
11b0: 72 79 20 2a 5f 70 72 65 76 3b 0a 0a 09 2f 2a 20  ry *_prev;.../* 
11c0: 54 68 72 65 61 64 20 66 72 6f 6d 20 77 68 69 63  Thread from whic
11d0: 68 20 74 68 69 73 20 6c 6f 67 20 65 6e 74 72 79  h this log entry
11e0: 20 65 6d 69 6e 61 74 65 73 20 2a 2f 0a 09 70 74   eminates */..pt
11f0: 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 3b 0a  hread_t thread;.
1200: 0a 09 2f 2a 20 4d 65 73 73 61 67 65 20 62 75 66  ../* Message buf
1210: 66 65 72 20 66 6f 72 20 74 79 70 65 20 3d 20 4d  fer for type = M
1220: 45 53 53 41 47 45 20 2a 2f 0a 09 2f 2a 20 50 61  ESSAGE */../* Pa
1230: 74 68 20 62 75 66 66 65 72 20 66 6f 72 20 74 79  th buffer for ty
1240: 70 65 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f  pe = TRANSFER */
1250: 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 46 49  ..char buffer[FI
1260: 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f  LED_PATH_BUFFER_
1270: 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 20 49 74 65 6d  SIZE];.../* Item
1280: 73 20 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41  s for type = TRA
1290: 4e 53 46 45 52 20 2a 2f 0a 09 69 6e 74 20 68 74  NSFER */..int ht
12a0: 74 70 5f 63 6f 64 65 3b 0a 09 63 6f 6e 73 74 20  tp_code;..const 
12b0: 63 68 61 72 20 2a 72 65 61 73 6f 6e 3b 0a 09 74  char *reason;..t
12c0: 69 6d 65 5f 74 20 73 74 61 72 74 74 69 6d 65 3b  ime_t starttime;
12d0: 0a 09 74 69 6d 65 5f 74 20 65 6e 64 74 69 6d 65  ..time_t endtime
12e0: 3b 0a 09 6f 66 66 5f 74 20 72 65 71 5f 6f 66 66  ;..off_t req_off
12f0: 73 65 74 3b 0a 09 6f 66 66 5f 74 20 72 65 71 5f  set;..off_t req_
1300: 6c 65 6e 67 74 68 3b 0a 09 6f 66 66 5f 74 20 73  length;..off_t s
1310: 65 6e 74 5f 6c 65 6e 67 74 68 3b 0a 09 6f 66 66  ent_length;..off
1320: 5f 74 20 66 69 6c 65 5f 6c 65 6e 67 74 68 3b 0a  _t file_length;.
1330: 09 63 68 61 72 20 69 70 5b 31 32 38 5d 3b 0a 09  .char ip[128];..
1340: 69 6e 74 20 70 6f 72 74 3b 0a 09 69 6e 74 20 6d  int port;..int m
1350: 65 74 68 6f 64 3b 0a 7d 3b 0a 0a 2f 2a 20 47 6c  ethod;.};../* Gl
1360: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 2a  obal variables *
1370: 2f 0a 2f 2a 2a 20 4f 70 65 6e 20 46 69 6c 65 20  /./** Open File 
1380: 63 61 63 68 65 20 2a 2a 2f 0a 73 74 72 75 63 74  cache **/.struct
1390: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20   filed_fileinfo 
13a0: 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  *filed_fileinfo_
13b0: 66 64 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a  fdcache = NULL;.
13c0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c  unsigned int 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 5f 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f  che_size = 0;../
13f0: 2a 2a 20 4c 6f 67 67 69 6e 67 20 2a 2a 2f 0a 73  ** Logging **/.s
1400: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f  truct filed_log_
1410: 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67  entry *filed_log
1420: 5f 6d 73 67 5f 6c 69 73 74 3b 0a 70 74 68 72 65  _msg_list;.pthre
1430: 61 64 5f 6d 75 74 65 78 5f 74 20 66 69 6c 65 64  ad_mutex_t filed
1440: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
1450: 74 65 78 3b 0a 70 74 68 72 65 61 64 5f 63 6f 6e  tex;.pthread_con
1460: 64 5f 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  d_t filed_log_ms
1470: 67 5f 6c 69 73 74 5f 72 65 61 64 79 3b 0a 0a 2f  g_list_ready;../
1480: 2a 20 53 69 67 6e 61 6c 20 48 61 6e 64 6c 65 72  * Signal Handler
1490: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
14a0: 66 69 6c 65 64 5f 73 69 67 6e 61 6c 5f 68 61 6e  filed_signal_han
14b0: 64 6c 65 72 28 69 6e 74 20 73 69 67 6e 61 6c 5f  dler(int signal_
14c0: 6e 75 6d 62 65 72 29 20 7b 0a 09 73 74 72 75 63  number) {..struc
14d0: 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  t filed_fileinfo
14e0: 20 2a 63 61 63 68 65 3b 0a 09 75 6e 73 69 67 6e   *cache;..unsign
14f0: 65 64 20 69 6e 74 20 69 64 78 3b 0a 0a 09 73 77  ed int idx;...sw
1500: 69 74 63 68 20 28 73 69 67 6e 61 6c 5f 6e 75 6d  itch (signal_num
1510: 62 65 72 29 20 7b 0a 09 09 63 61 73 65 20 53 49  ber) {...case SI
1520: 47 48 55 50 3a 0a 09 09 09 66 6f 72 20 28 69 64  GHUP:....for (id
1530: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 66 69 6c  x = 0; idx < fil
1540: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
1550: 63 68 65 5f 73 69 7a 65 3b 20 69 64 78 2b 2b 29  che_size; idx++)
1560: 20 7b 0a 09 09 09 09 63 61 63 68 65 20 3d 20 26   {.....cache = &
1570: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
1580: 64 63 61 63 68 65 5b 69 64 78 5d 3b 0a 0a 09 09  dcache[idx];....
1590: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
15a0: 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74  lock(&cache->mut
15b0: 65 78 29 3b 0a 0a 09 09 09 09 63 61 63 68 65 2d  ex);......cache-
15c0: 3e 70 61 74 68 5b 30 5d 20 3d 20 27 5c 30 27 3b  >path[0] = '\0';
15d0: 0a 09 09 09 09 69 66 20 28 63 61 63 68 65 2d 3e  .....if (cache->
15e0: 66 64 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  fd >= 0) {......
15f0: 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66 64 29  close(cache->fd)
1600: 3b 0a 0a 09 09 09 09 09 63 61 63 68 65 2d 3e 66  ;.......cache->f
1610: 64 20 3d 20 2d 31 3b 0a 09 09 09 09 7d 0a 0a 09  d = -1;.....}...
1620: 09 09 09 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  ...cache->lastmo
1630: 64 20 3d 20 22 22 3b 0a 09 09 09 09 63 61 63 68  d = "";.....cach
1640: 65 2d 3e 74 79 70 65 20 3d 20 22 22 3b 0a 0a 09  e->type = "";...
1650: 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
1660: 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e  _unlock(&cache->
1670: 6d 75 74 65 78 29 3b 0a 09 09 09 7d 0a 09 09 09  mutex);....}....
1680: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75  break;..}...retu
1690: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  rn;.}../* Initia
16a0: 6c 69 7a 65 20 63 61 63 68 65 20 2a 2f 0a 73 74  lize cache */.st
16b0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 69  atic int filed_i
16c0: 6e 69 74 5f 63 61 63 68 65 28 75 6e 73 69 67 6e  nit_cache(unsign
16d0: 65 64 20 69 6e 74 20 63 61 63 68 65 5f 73 69 7a  ed int cache_siz
16e0: 65 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 69  e) {..unsigned i
16f0: 6e 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  nt idx;..int mut
1700: 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 2f  ex_init_ret;.../
1710: 2a 20 43 61 63 68 65 20 6d 61 79 20 6e 6f 74 20  * Cache may not 
1720: 62 65 20 72 65 2d 69 6e 69 74 69 61 6c 69 7a 65  be re-initialize
1730: 64 20 2a 2f 0a 09 69 66 20 28 66 69 6c 65 64 5f  d */..if (filed_
1740: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
1750: 5f 73 69 7a 65 20 21 3d 20 30 20 7c 7c 20 66 69  _size != 0 || fi
1760: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1770: 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ache != NULL) {.
1780: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
1790: 0a 09 2f 2a 20 43 61 63 68 65 20 64 6f 65 73 20  ../* Cache does 
17a0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  not need to be a
17b0: 6c 6c 6f 63 61 74 65 64 20 69 66 20 63 61 63 68  llocated if cach
17c0: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
17d0: 20 2a 2f 0a 09 69 66 20 28 63 61 63 68 65 5f 73   */..if (cache_s
17e0: 69 7a 65 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  ize == 0) {...re
17f0: 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(0);..}.../*
1800: 20 41 6c 6c 6f 63 61 74 65 20 63 61 63 68 65 20   Allocate cache 
1810: 2a 2f 0a 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e  */..filed_filein
1820: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20  fo_fdcache_size 
1830: 3d 20 63 61 63 68 65 5f 73 69 7a 65 3b 0a 09 66  = cache_size;..f
1840: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1850: 63 61 63 68 65 20 3d 20 6d 61 6c 6c 6f 63 28 73  cache = malloc(s
1860: 69 7a 65 6f 66 28 2a 66 69 6c 65 64 5f 66 69 6c  izeof(*filed_fil
1870: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 29 20 2a  einfo_fdcache) *
1880: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f   filed_fileinfo_
1890: 66 64 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 09  fdcache_size);..
18a0: 69 66 20 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e  if (filed_filein
18b0: 66 6f 5f 66 64 63 61 63 68 65 20 3d 3d 20 4e 55  fo_fdcache == NU
18c0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  LL) {...return(1
18d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69  );..}.../* Initi
18e0: 61 6c 69 7a 65 20 63 61 63 68 65 20 65 6e 74 72  alize cache entr
18f0: 69 65 73 20 2a 2f 0a 09 66 6f 72 20 28 69 64 78  ies */..for (idx
1900: 20 3d 20 30 3b 20 69 64 78 20 3c 20 66 69 6c 65   = 0; idx < file
1910: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
1920: 68 65 5f 73 69 7a 65 3b 20 69 64 78 2b 2b 29 20  he_size; idx++) 
1930: 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
1940: 65 74 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  et = pthread_mut
1950: 65 78 5f 69 6e 69 74 28 26 66 69 6c 65 64 5f 66  ex_init(&filed_f
1960: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b  ileinfo_fdcache[
1970: 69 64 78 5d 2e 6d 75 74 65 78 2c 20 4e 55 4c 4c  idx].mutex, NULL
1980: 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69  );...if (mutex_i
1990: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
19a0: 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
19b0: 7d 0a 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69  }....filed_filei
19c0: 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d  nfo_fdcache[idx]
19d0: 2e 70 61 74 68 5b 30 5d 20 3d 20 27 5c 30 27 3b  .path[0] = '\0';
19e0: 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ...filed_fileinf
19f0: 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 66  o_fdcache[idx].f
1a00: 64 20 3d 20 2d 31 3b 0a 09 09 66 69 6c 65 64 5f  d = -1;...filed_
1a10: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
1a20: 5b 69 64 78 5d 2e 6c 61 73 74 6d 6f 64 20 3d 20  [idx].lastmod = 
1a30: 22 22 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65  "";...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 74 79 70 65 20 3d 20 22 22 3b 0a 09 7d 0a  ].type = "";..}.
1a60: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
1a70: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 70 72  /* Initialize pr
1a80: 6f 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ocess */.static 
1a90: 69 6e 74 20 66 69 6c 65 64 5f 69 6e 69 74 28 75  int filed_init(u
1aa0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68  nsigned int cach
1ab0: 65 5f 73 69 7a 65 29 20 7b 0a 09 73 74 61 74 69  e_size) {..stati
1ac0: 63 20 69 6e 74 20 63 61 6c 6c 65 64 20 3d 20 30  c int called = 0
1ad0: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f  ;..ssize_t read_
1ae0: 72 65 74 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e  ret = 0;..unsign
1af0: 65 64 20 69 6e 74 20 72 61 6e 64 6f 6d 5f 76 61  ed int random_va
1b00: 6c 75 65 20 3d 20 30 3b 0a 09 69 6e 74 20 63 61  lue = 0;..int ca
1b10: 63 68 65 5f 72 65 74 3b 0a 09 69 6e 74 20 72 61  che_ret;..int ra
1b20: 6e 64 6f 6d 5f 66 64 3b 0a 0a 09 69 66 20 28 63  ndom_fd;...if (c
1b30: 61 6c 6c 65 64 29 20 7b 0a 09 09 72 65 74 75 72  alled) {...retur
1b40: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 63 61 6c 6c 65  n(0);..}...calle
1b50: 64 20 3d 20 31 3b 0a 0a 09 2f 2a 20 41 74 74 65  d = 1;.../* Atte
1b60: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 61 6c 6c 20  mpt to lock all 
1b70: 6d 65 6d 6f 72 79 20 74 6f 20 70 68 79 73 69 63  memory to physic
1b80: 61 6c 20 52 41 4d 20 28 62 75 74 20 64 6f 6e 27  al RAM (but don'
1b90: 74 20 63 61 72 65 20 69 66 20 77 65 20 63 61 6e  t care if we can
1ba0: 27 74 29 20 2a 2f 0a 09 6d 6c 6f 63 6b 61 6c 6c  't) */..mlockall
1bb0: 28 4d 43 4c 5f 43 55 52 52 45 4e 54 20 7c 20 4d  (MCL_CURRENT | M
1bc0: 43 4c 5f 46 55 54 55 52 45 29 3b 0a 0a 09 2f 2a  CL_FUTURE);.../*
1bd0: 20 49 67 6e 6f 72 65 20 53 49 47 50 49 50 45 20   Ignore SIGPIPE 
1be0: 2a 2f 0a 09 73 69 67 6e 61 6c 28 53 49 47 50 49  */..signal(SIGPI
1bf0: 50 45 2c 20 53 49 47 5f 49 47 4e 29 3b 0a 0a 09  PE, SIG_IGN);...
1c00: 2f 2a 20 48 61 6e 64 6c 65 20 53 49 47 48 55 50  /* Handle SIGHUP
1c10: 20 74 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c 20   to release all 
1c20: 63 61 63 68 65 73 20 2a 2f 0a 09 73 69 67 6e 61  caches */..signa
1c30: 6c 28 53 49 47 48 55 50 2c 20 66 69 6c 65 64 5f  l(SIGHUP, filed_
1c40: 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 29 3b  signal_handler);
1c50: 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .../* Initialize
1c60: 20 63 61 63 68 65 20 73 74 72 75 63 74 75 72 65   cache structure
1c70: 20 2a 2f 0a 09 63 61 63 68 65 5f 72 65 74 20 3d   */..cache_ret =
1c80: 20 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68   filed_init_cach
1c90: 65 28 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 09  e(cache_size);..
1ca0: 69 66 20 28 63 61 63 68 65 5f 72 65 74 20 21 3d  if (cache_ret !=
1cb0: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 63   0) {...return(c
1cc0: 61 63 68 65 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  ache_ret);..}...
1cd0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 72 61  /* Initialize ra
1ce0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
1cf0: 72 61 74 6f 72 20 2a 2f 0a 09 72 61 6e 64 6f 6d  rator */..random
1d00: 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76  _fd = open("/dev
1d10: 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
1d20: 4e 4c 59 29 3b 0a 09 69 66 20 28 72 61 6e 64 6f  NLY);..if (rando
1d30: 6d 5f 66 64 20 3e 3d 20 30 29 20 7b 0a 09 09 72  m_fd >= 0) {...r
1d40: 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64 28 72  ead_ret = read(r
1d50: 61 6e 64 6f 6d 5f 66 64 2c 20 26 72 61 6e 64 6f  andom_fd, &rando
1d60: 6d 5f 76 61 6c 75 65 2c 20 73 69 7a 65 6f 66 28  m_value, sizeof(
1d70: 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 29 29 3b 0a  random_value));.
1d80: 0a 09 09 63 6c 6f 73 65 28 72 61 6e 64 6f 6d 5f  ...close(random_
1d90: 66 64 29 3b 0a 09 7d 0a 0a 09 72 61 6e 64 6f 6d  fd);..}...random
1da0: 5f 76 61 6c 75 65 20 5e 3d 20 67 65 74 70 69 64  _value ^= getpid
1db0: 28 29 3b 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75  ();..random_valu
1dc0: 65 20 5e 3d 20 67 65 74 75 69 64 28 29 3b 0a 09  e ^= getuid();..
1dd0: 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20  random_value ^= 
1de0: 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 73 72  time(NULL);...sr
1df0: 61 6e 64 6f 6d 28 72 61 6e 64 6f 6d 5f 76 61 6c  andom(random_val
1e00: 75 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  ue);...return(0)
1e10: 3b 0a 0a 09 2f 2a 20 4e 4f 54 52 45 41 43 48 3a  ;.../* NOTREACH:
1e20: 20 52 65 61 64 20 6d 61 79 20 66 61 69 6c 20 6f   Read may fail o
1e30: 72 20 73 75 63 63 65 65 64 2c 20 77 65 20 64 6f  r succeed, we do
1e40: 6e 27 74 20 61 63 74 75 61 6c 6c 79 20 63 61 72  n't actually car
1e50: 65 20 2a 2f 0a 09 72 65 61 64 5f 72 65 74 20 3d  e */..read_ret =
1e60: 20 72 65 61 64 5f 72 65 74 3b 0a 7d 0a 0a 2f 2a   read_ret;.}../*
1e70: 20 4c 69 73 74 65 6e 20 6f 6e 20 61 20 70 61 72   Listen on a par
1e80: 74 69 63 75 6c 61 72 20 61 64 64 72 65 73 73 2f  ticular address/
1e90: 70 6f 72 74 20 2a 2f 0a 73 74 61 74 69 63 20 69  port */.static i
1ea0: 6e 74 20 66 69 6c 65 64 5f 6c 69 73 74 65 6e 28  nt filed_listen(
1eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 64 64 72  const char *addr
1ec0: 65 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  ess, unsigned in
1ed0: 74 20 70 6f 72 74 29 20 7b 0a 09 73 74 72 75 63  t port) {..struc
1ee0: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61  t sockaddr_in6 a
1ef0: 64 64 72 5f 76 36 3b 0a 09 73 74 72 75 63 74 20  ddr_v6;..struct 
1f00: 73 6f 63 6b 61 64 64 72 5f 69 6e 20 61 64 64 72  sockaddr_in addr
1f10: 5f 76 34 3b 0a 09 73 74 72 75 63 74 20 73 6f 63  _v4;..struct soc
1f20: 6b 61 64 64 72 20 2a 61 64 64 72 3b 0a 09 73 6f  kaddr *addr;..so
1f30: 63 6b 6c 65 6e 5f 74 20 61 64 64 72 5f 6c 65 6e  cklen_t addr_len
1f40: 3b 0a 09 69 6e 74 20 70 74 6f 6e 5f 72 65 74 2c  ;..int pton_ret,
1f50: 20 62 69 6e 64 5f 72 65 74 2c 20 6c 69 73 74 65   bind_ret, liste
1f60: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 66 61 6d 69  n_ret;..int fami
1f70: 6c 79 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 66  ly;..int fd;...f
1f80: 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36  amily = AF_INET6
1f90: 3b 0a 09 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e  ;..pton_ret = in
1fa0: 65 74 5f 70 74 6f 6e 28 66 61 6d 69 6c 79 2c 20  et_pton(family, 
1fb0: 61 64 64 72 65 73 73 2c 20 26 61 64 64 72 5f 76  address, &addr_v
1fc0: 36 2e 73 69 6e 36 5f 61 64 64 72 2e 73 36 5f 61  6.sin6_addr.s6_a
1fd0: 64 64 72 29 3b 0a 09 69 66 20 28 70 74 6f 6e 5f  ddr);..if (pton_
1fe0: 72 65 74 20 21 3d 20 31 29 20 7b 0a 09 09 66 61  ret != 1) {...fa
1ff0: 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 3b 0a  mily = AF_INET;.
2000: 09 09 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65  ..pton_ret = ine
2010: 74 5f 70 74 6f 6e 28 66 61 6d 69 6c 79 2c 20 61  t_pton(family, a
2020: 64 64 72 65 73 73 2c 20 26 61 64 64 72 5f 76 34  ddress, &addr_v4
2030: 2e 73 69 6e 5f 61 64 64 72 2e 73 5f 61 64 64 72  .sin_addr.s_addr
2040: 29 3b 0a 09 09 69 66 20 28 70 74 6f 6e 5f 72 65  );...if (pton_re
2050: 74 20 21 3d 20 31 29 20 7b 0a 09 09 09 72 65 74  t != 1) {....ret
2060: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
2070: 61 64 64 72 5f 76 34 2e 73 69 6e 5f 66 61 6d 69  addr_v4.sin_fami
2080: 6c 79 20 3d 20 66 61 6d 69 6c 79 3b 0a 09 09 61  ly = family;...a
2090: 64 64 72 5f 76 34 2e 73 69 6e 5f 70 6f 72 74 20  ddr_v4.sin_port 
20a0: 3d 20 68 74 6f 6e 73 28 70 6f 72 74 29 3b 0a 0a  = htons(port);..
20b0: 09 09 61 64 64 72 20 3d 20 28 73 74 72 75 63 74  ..addr = (struct
20c0: 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64   sockaddr *) &ad
20d0: 64 72 5f 76 34 3b 0a 09 09 61 64 64 72 5f 6c 65  dr_v4;...addr_le
20e0: 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 5f  n = sizeof(addr_
20f0: 76 34 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  v4);..} else {..
2100: 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 66 61  .addr_v6.sin6_fa
2110: 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b  mily = AF_INET6;
2120: 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f  ...addr_v6.sin6_
2130: 66 6c 6f 77 69 6e 66 6f 20 3d 20 30 3b 0a 09 09  flowinfo = 0;...
2140: 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 73 63 6f  addr_v6.sin6_sco
2150: 70 65 5f 69 64 20 3d 20 30 3b 0a 09 09 61 64 64  pe_id = 0;...add
2160: 72 5f 76 36 2e 73 69 6e 36 5f 70 6f 72 74 20 3d  r_v6.sin6_port =
2170: 20 68 74 6f 6e 73 28 70 6f 72 74 29 3b 0a 0a 09   htons(port);...
2180: 09 61 64 64 72 20 3d 20 28 73 74 72 75 63 74 20  .addr = (struct 
2190: 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64  sockaddr *) &add
21a0: 72 5f 76 36 3b 0a 09 09 61 64 64 72 5f 6c 65 6e  r_v6;...addr_len
21b0: 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 5f 76   = sizeof(addr_v
21c0: 36 29 3b 0a 09 7d 0a 0a 09 66 64 20 3d 20 73 6f  6);..}...fd = so
21d0: 63 6b 65 74 28 66 61 6d 69 6c 79 2c 20 53 4f 43  cket(family, SOC
21e0: 4b 5f 53 54 52 45 41 4d 2c 20 30 29 3b 0a 09 69  K_STREAM, 0);..i
21f0: 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 72  f (fd < 0) {...r
2200: 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09  eturn(fd);..}...
2210: 62 69 6e 64 5f 72 65 74 20 3d 20 62 69 6e 64 28  bind_ret = bind(
2220: 66 64 2c 20 61 64 64 72 2c 20 61 64 64 72 5f 6c  fd, addr, addr_l
2230: 65 6e 29 3b 0a 09 69 66 20 28 62 69 6e 64 5f 72  en);..if (bind_r
2240: 65 74 20 3c 20 30 29 20 7b 0a 09 09 63 6c 6f 73  et < 0) {...clos
2250: 65 28 66 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e  e(fd);....return
2260: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6c 69 73 74 65  (-1);..}...liste
2270: 6e 5f 72 65 74 20 3d 20 6c 69 73 74 65 6e 28 66  n_ret = listen(f
2280: 64 2c 20 31 32 38 29 3b 0a 09 69 66 20 28 6c 69  d, 128);..if (li
2290: 73 74 65 6e 5f 72 65 74 20 21 3d 20 30 29 20 7b  sten_ret != 0) {
22a0: 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09  ...close(fd);...
22b0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
22c0: 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a  ..return(fd);.}.
22d0: 0a 2f 2a 20 4c 6f 67 20 61 20 6d 65 73 73 61 67  ./* Log a messag
22e0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 46 49 4c 45  e */.#ifdef FILE
22f0: 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 23 20 20 64 65  D_DONT_LOG.#  de
2300: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 67 69  fine filed_loggi
2310: 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 78  ng_thread_init(x
2320: 29 20 30 0a 23 20 20 64 65 66 69 6e 65 20 66 69  ) 0.#  define fi
2330: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
2340: 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23  g(x, ...) /**/.#
2350: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
2360: 6f 67 5f 6d 73 67 28 78 2c 20 2e 2e 2e 29 20 2f  og_msg(x, ...) /
2370: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69  **/.#  define fi
2380: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 78 29  led_log_entry(x)
2390: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
23a0: 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 78 2c 20  filed_log_ip(x, 
23b0: 2e 2e 2e 29 20 4e 55 4c 4c 0a 23 20 20 64 65 66  ...) NULL.#  def
23c0: 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65  ine filed_log_ne
23d0: 77 28 78 29 20 26 6c 6f 63 61 6c 5f 64 75 6d 6d  w(x) &local_dumm
23e0: 79 5f 6c 6f 67 0a 23 20 20 64 65 66 69 6e 65 20  y_log.#  define 
23f0: 66 69 6c 65 64 5f 6c 6f 67 5f 66 72 65 65 28 78  filed_log_free(x
2400: 29 20 2f 2a 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72  ) /**/../* Retur
2410: 6e 20 6c 6f 67 67 69 6e 67 20 68 61 6e 64 6c 65  n logging handle
2420: 20 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20   */.static FILE 
2430: 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28  *filed_log_open(
2440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2450: 29 20 7b 0a 09 72 65 74 75 72 6e 28 73 74 64 6f  ) {..return(stdo
2460: 75 74 29 3b 0a 09 66 69 6c 65 20 3d 20 66 69 6c  ut);..file = fil
2470: 65 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65  e;.}.#else.#  de
2480: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 66  fine filed_log_f
2490: 72 65 65 28 78 29 20 66 72 65 65 28 78 29 0a 23  ree(x) free(x).#
24a0: 20 20 69 66 64 65 66 20 46 49 4c 45 44 5f 44 45    ifdef FILED_DE
24b0: 42 55 47 0a 23 20 20 20 20 64 65 66 69 6e 65 20  BUG.#    define 
24c0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
24d0: 62 75 67 28 78 2c 20 2e 2e 2e 29 20 7b 20 66 70  bug(x, ...) { fp
24e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 78 2c  rintf(stderr, x,
24f0: 20 5f 5f 56 41 5f 41 52 47 53 5f 5f 29 3b 20 66   __VA_ARGS__); f
2500: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2510: 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74 64  \n"); fflush(std
2520: 65 72 72 29 3b 20 7d 0a 23 20 20 65 6c 73 65 0a  err); }.#  else.
2530: 23 20 20 20 20 64 65 66 69 6e 65 20 66 69 6c 65  #    define file
2540: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
2550: 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  x, ...) /**/.#  
2560: 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61  endif../* Initia
2570: 6c 69 7a 65 20 6c 6f 67 67 69 6e 67 20 74 68 72  lize logging thr
2580: 65 61 64 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ead */.static vo
2590: 69 64 20 2a 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  id *filed_loggin
25a0: 67 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a 61  g_thread(void *a
25b0: 72 67 5f 70 29 20 7b 0a 09 73 74 72 75 63 74 20  rg_p) {..struct 
25c0: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
25d0: 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a  read_args *arg;.
25e0: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  .struct filed_lo
25f0: 67 5f 65 6e 74 72 79 20 2a 63 75 72 72 2c 20 2a  g_entry *curr, *
2600: 70 72 65 76 3b 0a 09 63 6f 6e 73 74 20 63 68 61  prev;..const cha
2610: 72 20 2a 6d 65 74 68 6f 64 3b 0a 09 74 69 6d 65  r *method;..time
2620: 5f 74 20 6e 6f 77 3b 0a 09 46 49 4c 45 20 2a 66  _t now;..FILE *f
2630: 70 3b 0a 0a 09 61 72 67 20 3d 20 61 72 67 5f 70  p;...arg = arg_p
2640: 3b 0a 0a 09 66 70 20 3d 20 61 72 67 2d 3e 66 70  ;...fp = arg->fp
2650: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ;...while (1) {.
2660: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
2670: 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  lock(&filed_log_
2680: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
2690: 0a 09 09 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f  ...pthread_cond_
26a0: 77 61 69 74 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  wait(&filed_log_
26b0: 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64 79 2c 20  msg_list_ready, 
26c0: 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  &filed_log_msg_l
26d0: 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 09 63  ist_mutex);....c
26e0: 75 72 72 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f  urr = filed_log_
26f0: 6d 73 67 5f 6c 69 73 74 3b 0a 09 09 66 69 6c 65  msg_list;...file
2700: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d  d_log_msg_list =
2710: 20 4e 55 4c 4c 3b 0a 0a 09 09 70 74 68 72 65 61   NULL;....pthrea
2720: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
2730: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
2740: 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 09 6e 6f  st_mutex);....no
2750: 77 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a  w = time(NULL);.
2760: 0a 09 09 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a  ...prev = NULL;.
2770: 09 09 66 6f 72 20 28 3b 20 63 75 72 72 3b 20 63  ..for (; curr; c
2780: 75 72 72 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78  urr = curr->_nex
2790: 74 29 20 7b 0a 09 09 09 63 75 72 72 2d 3e 5f 70  t) {....curr->_p
27a0: 72 65 76 20 3d 20 70 72 65 76 3b 0a 0a 09 09 09  rev = prev;.....
27b0: 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 09 09 7d  prev = curr;...}
27c0: 0a 0a 09 09 63 75 72 72 20 3d 20 70 72 65 76 3b  ....curr = prev;
27d0: 0a 09 09 77 68 69 6c 65 20 28 63 75 72 72 29 20  ...while (curr) 
27e0: 7b 0a 09 09 09 73 77 69 74 63 68 20 28 63 75 72  {....switch (cur
27f0: 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 63  r->type) {.....c
2800: 61 73 65 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59  ase FILED_LOG_TY
2810: 50 45 5f 4d 45 53 53 41 47 45 3a 0a 09 09 09 09  PE_MESSAGE:.....
2820: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73  .fprintf(fp, "%s
2830: 22 2c 20 63 75 72 72 2d 3e 62 75 66 66 65 72 29  ", curr->buffer)
2840: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
2850: 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f 4c 4f  ...case FILED_LO
2860: 47 5f 54 59 50 45 5f 54 52 41 4e 53 46 45 52 3a  G_TYPE_TRANSFER:
2870: 0a 09 09 09 09 09 73 77 69 74 63 68 20 28 63 75  ......switch (cu
2880: 72 72 2d 3e 6d 65 74 68 6f 64 29 20 7b 0a 09 09  rr->method) {...
2890: 09 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f 52  ....case FILED_R
28a0: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45  EQUEST_METHOD_GE
28b0: 54 3a 0a 09 09 09 09 09 09 09 6d 65 74 68 6f 64  T:........method
28c0: 3d 22 47 45 54 22 3b 0a 09 09 09 09 09 09 09 62  ="GET";........b
28d0: 72 65 61 6b 3b 0a 09 09 09 09 09 09 63 61 73 65  reak;.......case
28e0: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
28f0: 45 54 48 4f 44 5f 48 45 41 44 3a 0a 09 09 09 09  ETHOD_HEAD:.....
2900: 09 09 09 6d 65 74 68 6f 64 3d 22 48 45 41 44 22  ...method="HEAD"
2910: 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
2920: 09 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  ......default:..
2930: 09 09 09 09 09 09 6d 65 74 68 6f 64 3d 22 3c 75  ......method="<u
2940: 6e 6b 6e 6f 77 6e 3e 22 3b 0a 09 09 09 09 09 09  nknown>";.......
2950: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
2960: 09 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 65  .....if (curr->e
2970: 6e 64 74 69 6d 65 20 3d 3d 20 28 28 74 69 6d 65  ndtime == ((time
2980: 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 09 09 09  _t) -1)) {......
2990: 09 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65 20 3d  .curr->endtime =
29a0: 20 6e 6f 77 3b 0a 09 09 09 09 09 7d 0a 0a 09 09   now;......}....
29b0: 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  ...fprintf(fp, "
29c0: 54 52 41 4e 53 46 45 52 20 4d 45 54 48 4f 44 3d  TRANSFER METHOD=
29d0: 25 73 20 50 41 54 48 3d 25 73 20 53 52 43 3d 25  %s PATH=%s SRC=%
29e0: 73 3a 25 69 20 54 49 4d 45 2e 53 54 41 52 54 3d  s:%i TIME.START=
29f0: 25 6c 6c 75 20 54 49 4d 45 2e 45 4e 44 3d 25 6c  %llu TIME.END=%l
2a00: 6c 75 20 43 4f 44 45 2e 56 41 4c 55 45 3d 25 75  lu CODE.VALUE=%u
2a10: 20 43 4f 44 45 2e 52 45 41 53 4f 4e 3d 25 73 20   CODE.REASON=%s 
2a20: 52 45 51 55 45 53 54 2e 4f 46 46 53 45 54 3d 25  REQUEST.OFFSET=%
2a30: 6c 6c 75 20 52 45 51 55 45 53 54 2e 4c 45 4e 47  llu REQUEST.LENG
2a40: 54 48 3d 25 6c 6c 75 20 46 49 4c 45 2e 4c 45 4e  TH=%llu FILE.LEN
2a50: 47 54 48 3d 25 6c 6c 75 20 54 52 41 4e 53 46 45  GTH=%llu TRANSFE
2a60: 52 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a  R.LENGTH=%llu",.
2a70: 09 09 09 09 09 09 6d 65 74 68 6f 64 2c 0a 09 09  ......method,...
2a80: 09 09 09 09 63 75 72 72 2d 3e 62 75 66 66 65 72  ....curr->buffer
2a90: 2c 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 69 70  ,.......curr->ip
2aa0: 2c 20 63 75 72 72 2d 3e 70 6f 72 74 2c 0a 09 09  , curr->port,...
2ab0: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
2ac0: 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73  ng long) curr->s
2ad0: 74 61 72 74 74 69 6d 65 2c 0a 09 09 09 09 09 09  tarttime,.......
2ae0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2af0: 6f 6e 67 29 20 63 75 72 72 2d 3e 65 6e 64 74 69  ong) curr->endti
2b00: 6d 65 2c 0a 09 09 09 09 09 09 63 75 72 72 2d 3e  me,.......curr->
2b10: 68 74 74 70 5f 63 6f 64 65 2c 20 63 75 72 72 2d  http_code, curr-
2b20: 3e 72 65 61 73 6f 6e 2c 0a 09 09 09 09 09 09 28  >reason,.......(
2b30: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
2b40: 6e 67 29 20 63 75 72 72 2d 3e 72 65 71 5f 6f 66  ng) curr->req_of
2b50: 66 73 65 74 2c 0a 09 09 09 09 09 09 28 75 6e 73  fset,.......(uns
2b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
2b70: 20 63 75 72 72 2d 3e 72 65 71 5f 6c 65 6e 67 74   curr->req_lengt
2b80: 68 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  h,.......(unsign
2b90: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
2ba0: 72 72 2d 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 2c  rr->file_length,
2bb0: 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64  .......(unsigned
2bc0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72   long long) curr
2bd0: 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 0a 09 09  ->sent_length...
2be0: 09 09 09 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ...);.......brea
2bf0: 6b 3b 0a 09 09 09 7d 0a 09 09 09 66 70 72 69 6e  k;....}....fprin
2c00: 74 66 28 66 70 2c 20 22 20 54 48 52 45 41 44 3d  tf(fp, " THREAD=
2c10: 25 6c 6c 75 20 54 49 4d 45 3d 25 6c 6c 75 5c 6e  %llu TIME=%llu\n
2c20: 22 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64  ",.....(unsigned
2c30: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 28 28 69 6e   long long) ((in
2c40: 74 70 74 72 5f 74 29 20 63 75 72 72 2d 3e 74 68  tptr_t) curr->th
2c50: 72 65 61 64 29 2c 0a 09 09 09 09 28 75 6e 73 69  read),.....(unsi
2c60: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2c70: 6e 6f 77 0a 09 09 09 29 3b 0a 09 09 09 66 66 6c  now....);....ffl
2c80: 75 73 68 28 66 70 29 3b 0a 0a 09 09 09 70 72 65  ush(fp);.....pre
2c90: 76 20 3d 20 63 75 72 72 3b 0a 09 09 09 63 75 72  v = curr;....cur
2ca0: 72 20 3d 20 63 75 72 72 2d 3e 5f 70 72 65 76 3b  r = curr->_prev;
2cb0: 0a 0a 09 09 09 66 72 65 65 28 70 72 65 76 29 3b  .....free(prev);
2cc0: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
2cd0: 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69  (NULL);.}..stati
2ce0: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c 6f 67  c void filed_log
2cf0: 5f 65 6e 74 72 79 28 73 74 72 75 63 74 20 66 69  _entry(struct fi
2d00: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 65  led_log_entry *e
2d10: 6e 74 72 79 29 20 7b 0a 09 65 6e 74 72 79 2d 3e  ntry) {..entry->
2d20: 74 68 72 65 61 64 20 3d 20 70 74 68 72 65 61 64  thread = pthread
2d30: 5f 73 65 6c 66 28 29 3b 0a 0a 09 70 74 68 72 65  _self();...pthre
2d40: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66  ad_mutex_lock(&f
2d50: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
2d60: 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 65 6e 74 72  t_mutex);...entr
2d70: 79 2d 3e 5f 6e 65 78 74 20 3d 20 66 69 6c 65 64  y->_next = filed
2d80: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09  _log_msg_list;..
2d90: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
2da0: 73 74 20 3d 20 65 6e 74 72 79 3b 0a 0a 09 70 74  st = entry;...pt
2db0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
2dc0: 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ck(&filed_log_ms
2dd0: 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a  g_list_mutex);..
2de0: 09 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 73 69  .pthread_cond_si
2df0: 67 6e 61 6c 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  gnal(&filed_log_
2e00: 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64 79 29 3b  msg_list_ready);
2e10: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74  ...return;.}..st
2e20: 61 74 69 63 20 73 74 72 75 63 74 20 66 69 6c 65  atic struct file
2e30: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66 69 6c  d_log_entry *fil
2e40: 65 64 5f 6c 6f 67 5f 6e 65 77 28 69 6e 74 20 69  ed_log_new(int i
2e50: 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 73 74  nitialize) {..st
2e60: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
2e70: 6e 74 72 79 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  ntry *retval;...
2e80: 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
2e90: 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
2ea0: 3b 0a 0a 09 69 66 20 28 69 6e 69 74 69 61 6c 69  ;...if (initiali
2eb0: 7a 65 29 20 7b 0a 09 09 72 65 74 76 61 6c 2d 3e  ze) {...retval->
2ec0: 62 75 66 66 65 72 5b 30 5d 20 3d 20 27 5c 30 27  buffer[0] = '\0'
2ed0: 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 68 74 74 70  ;...retval->http
2ee0: 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a 09 09 72 65  _code = -1;...re
2ef0: 74 76 61 6c 2d 3e 73 74 61 72 74 74 69 6d 65 20  tval->starttime 
2f00: 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 65  = 0;...retval->e
2f10: 6e 64 74 69 6d 65 20 3d 20 30 3b 0a 09 09 72 65  ndtime = 0;...re
2f20: 74 76 61 6c 2d 3e 72 65 71 5f 6f 66 66 73 65 74  tval->req_offset
2f30: 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e   = 0;...retval->
2f40: 72 65 71 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a  req_length = 0;.
2f50: 09 09 72 65 74 76 61 6c 2d 3e 73 65 6e 74 5f 6c  ..retval->sent_l
2f60: 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72 65 74  ength = 0;...ret
2f70: 76 61 6c 2d 3e 66 69 6c 65 5f 6c 65 6e 67 74 68  val->file_length
2f80: 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e   = 0;...retval->
2f90: 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  ip[0] = '\0';...
2fa0: 72 65 74 76 61 6c 2d 3e 70 6f 72 74 20 3d 20 2d  retval->port = -
2fb0: 31 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 6d 65 74  1;...retval->met
2fc0: 68 6f 64 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 72  hod = -1;..}...r
2fd0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2fe0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  ..static void fi
2ff0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 63 6f 6e 73  led_log_msg(cons
3000: 74 20 63 68 61 72 20 2a 66 6d 74 2c 20 2e 2e 2e  t char *fmt, ...
3010: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
3020: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 65 6e 74  d_log_entry *ent
3030: 72 79 3b 0a 09 76 61 5f 6c 69 73 74 20 61 72 67  ry;..va_list arg
3040: 73 3b 0a 0a 09 65 6e 74 72 79 20 3d 20 66 69 6c  s;...entry = fil
3050: 65 64 5f 6c 6f 67 5f 6e 65 77 28 30 29 3b 0a 0a  ed_log_new(0);..
3060: 09 76 61 5f 73 74 61 72 74 28 61 72 67 73 2c 20  .va_start(args, 
3070: 66 6d 74 29 3b 0a 0a 09 76 73 6e 70 72 69 6e 74  fmt);...vsnprint
3080: 66 28 65 6e 74 72 79 2d 3e 62 75 66 66 65 72 2c  f(entry->buffer,
3090: 20 73 69 7a 65 6f 66 28 65 6e 74 72 79 2d 3e 62   sizeof(entry->b
30a0: 75 66 66 65 72 29 2c 20 66 6d 74 2c 20 61 72 67  uffer), fmt, arg
30b0: 73 29 3b 0a 0a 09 76 61 5f 65 6e 64 28 61 72 67  s);...va_end(arg
30c0: 73 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e 74 79 70  s);...entry->typ
30d0: 65 20 3d 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59  e = FILED_LOG_TY
30e0: 50 45 5f 4d 45 53 53 41 47 45 3b 0a 0a 09 66 69  PE_MESSAGE;...fi
30f0: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 65 6e  led_log_entry(en
3100: 74 72 79 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  try);...return;.
3110: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3120: 63 68 61 72 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f  char *filed_log_
3130: 69 70 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ip(struct sockad
3140: 64 72 20 2a 61 64 64 72 2c 20 63 68 61 72 20 2a  dr *addr, char *
3150: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62  buffer, size_t b
3160: 75 66 66 65 72 6c 65 6e 29 20 7b 0a 09 73 74 72  ufferlen) {..str
3170: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20  uct sockaddr_in 
3180: 2a 61 64 64 72 5f 76 34 3b 0a 09 73 74 72 75 63  *addr_v4;..struc
3190: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a  t sockaddr_in6 *
31a0: 61 64 64 72 5f 76 36 3b 0a 09 63 6f 6e 73 74 20  addr_v6;..const 
31b0: 63 68 61 72 20 2a 72 65 74 76 61 6c 20 3d 20 4e  char *retval = N
31c0: 55 4c 4c 3b 0a 0a 09 61 64 64 72 5f 76 36 20 3d  ULL;...addr_v6 =
31d0: 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64   (struct sockadd
31e0: 72 5f 69 6e 36 20 2a 29 20 61 64 64 72 3b 0a 0a  r_in6 *) addr;..
31f0: 09 73 77 69 74 63 68 20 28 61 64 64 72 5f 76 36  .switch (addr_v6
3200: 2d 3e 73 69 6e 36 5f 66 61 6d 69 6c 79 29 20 7b  ->sin6_family) {
3210: 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 3a  ...case AF_INET:
3220: 0a 09 09 09 61 64 64 72 5f 76 34 20 3d 20 28 73  ....addr_v4 = (s
3230: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
3240: 6e 20 2a 29 20 61 64 64 72 3b 0a 09 09 09 72 65  n *) addr;....re
3250: 74 76 61 6c 20 3d 20 69 6e 65 74 5f 6e 74 6f 70  tval = inet_ntop
3260: 28 41 46 5f 49 4e 45 54 2c 20 26 61 64 64 72 5f  (AF_INET, &addr_
3270: 76 34 2d 3e 73 69 6e 5f 61 64 64 72 2c 20 62 75  v4->sin_addr, bu
3280: 66 66 65 72 2c 20 62 75 66 66 65 72 6c 65 6e 29  ffer, bufferlen)
3290: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
32a0: 73 65 20 41 46 5f 49 4e 45 54 36 3a 0a 09 09 09  se AF_INET6:....
32b0: 72 65 74 76 61 6c 20 3d 20 69 6e 65 74 5f 6e 74  retval = inet_nt
32c0: 6f 70 28 41 46 5f 49 4e 45 54 36 2c 20 26 61 64  op(AF_INET6, &ad
32d0: 64 72 5f 76 36 2d 3e 73 69 6e 36 5f 61 64 64 72  dr_v6->sin6_addr
32e0: 2c 20 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  , buffer, buffer
32f0: 6c 65 6e 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  len);....break;.
3300: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
3310: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46  al);.}..static F
3320: 49 4c 45 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6f  ILE *filed_log_o
3330: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
3340: 66 69 6c 65 29 20 7b 0a 09 46 49 4c 45 20 2a 72  file) {..FILE *r
3350: 65 74 76 61 6c 3b 0a 0a 09 69 66 20 28 73 74 72  etval;...if (str
3360: 63 6d 70 28 66 69 6c 65 2c 20 22 2d 22 29 20 3d  cmp(file, "-") =
3370: 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 20  = 0) {...retval 
3380: 3d 20 73 74 64 6f 75 74 3b 0a 09 7d 20 65 6c 73  = stdout;..} els
3390: 65 20 69 66 20 28 66 69 6c 65 5b 30 5d 20 3d 3d  e if (file[0] ==
33a0: 20 27 7c 27 29 20 7b 0a 09 09 66 69 6c 65 2b 2b   '|') {...file++
33b0: 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 70 6f 70  ;...retval = pop
33c0: 65 6e 28 66 69 6c 65 2c 20 22 77 22 29 3b 0a 09  en(file, "w");..
33d0: 7d 20 65 6c 73 65 20 7b 0a 09 09 72 65 74 76 61  } else {...retva
33e0: 6c 20 3d 20 66 6f 70 65 6e 28 66 69 6c 65 2c 20  l = fopen(file, 
33f0: 22 61 2b 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  "a+");..}...retu
3400: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
3410: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
3420: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69  logging_thread_i
3430: 6e 69 74 28 46 49 4c 45 20 2a 6c 6f 67 66 70 29  nit(FILE *logfp)
3440: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
3450: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
3460: 61 72 67 73 20 2a 61 72 67 73 3b 0a 09 70 74 68  args *args;..pth
3470: 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69 64  read_t thread_id
3480: 3b 0a 0a 09 61 72 67 73 20 3d 20 6d 61 6c 6c 6f  ;...args = mallo
3490: 63 28 73 69 7a 65 6f 66 28 2a 61 72 67 73 29 29  c(sizeof(*args))
34a0: 3b 0a 09 61 72 67 73 2d 3e 66 70 20 3d 20 6c 6f  ;..args->fp = lo
34b0: 67 66 70 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  gfp;...filed_log
34c0: 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c  _msg_list = NULL
34d0: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ;...pthread_mute
34e0: 78 5f 69 6e 69 74 28 26 66 69 6c 65 64 5f 6c 6f  x_init(&filed_lo
34f0: 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78  g_msg_list_mutex
3500: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 70 74 68 72 65  , NULL);...pthre
3510: 61 64 5f 63 72 65 61 74 65 28 26 74 68 72 65 61  ad_create(&threa
3520: 64 5f 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65  d_id, NULL, file
3530: 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64  d_logging_thread
3540: 2c 20 61 72 67 73 29 3b 0a 0a 09 66 69 6c 65 64  , args);...filed
3550: 5f 6c 6f 67 5f 6d 73 67 28 22 53 54 41 52 54 22  _log_msg("START"
3560: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
3570: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
3580: 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 54 49 4d 45   FILED_DONT_TIME
3590: 4f 55 54 0a 23 64 65 66 69 6e 65 20 66 69 6c 65  OUT.#define file
35a0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
35b0: 74 68 72 65 61 64 5f 69 6e 69 74 28 29 20 30 0a  thread_init() 0.
35c0: 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f  #define filed_so
35d0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69 6e 69 74  ckettimeout_init
35e0: 28 29 20 30 0a 23 64 65 66 69 6e 65 20 66 69 6c  () 0.#define fil
35f0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3600: 5f 61 63 63 65 70 74 28 78 29 20 2f 2a 2a 2f 0a  _accept(x) /**/.
3610: 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f  #define filed_so
3620: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63  ckettimeout_proc
3630: 65 73 73 69 6e 67 5f 73 74 61 72 74 28 78 29 20  essing_start(x) 
3640: 2f 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6c  /**/.#define fil
3650: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3660: 5f 70 72 6f 63 65 73 73 69 6e 67 5f 65 6e 64 28  _processing_end(
3670: 78 29 20 2f 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  x) /**/.#define 
3680: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3690: 6f 75 74 5f 63 6c 6f 73 65 28 78 29 20 2f 2a 2a  out_close(x) /**
36a0: 2f 0a 23 65 6c 73 65 0a 74 69 6d 65 5f 74 20 66  /.#else.time_t f
36b0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
36c0: 75 74 5f 74 69 6d 65 3b 0a 73 74 72 75 63 74 20  ut_time;.struct 
36d0: 7b 0a 09 74 69 6d 65 5f 74 20 65 78 70 69 72 61  {..time_t expira
36e0: 74 69 6f 6e 5f 74 69 6d 65 3b 0a 09 70 74 68 72  tion_time;..pthr
36f0: 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69 64 3b  ead_t thread_id;
3700: 0a 09 69 6e 74 20 76 61 6c 69 64 3b 0a 7d 2a 20  ..int valid;.}* 
3710: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3720: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 3b 0a  out_sockstatus;.
3730: 6c 6f 6e 67 20 66 69 6c 65 64 5f 73 6f 63 6b 65  long filed_socke
3740: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
3750: 74 75 73 5f 6c 65 6e 67 74 68 3b 0a 69 6e 74 20  tus_length;.int 
3760: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3770: 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 3b 0a  out_devnull_fd;.
3780: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
3790: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
37a0: 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28  sockfd_in_range(
37b0: 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69  int sockfd) {..i
37c0: 66 20 28 73 6f 63 6b 66 64 20 3c 20 33 29 20 7b  f (sockfd < 3) {
37d0: 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
37e0: 0a 0a 09 69 66 20 28 73 6f 63 6b 66 64 20 3e 20  ...if (sockfd > 
37f0: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3800: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c  out_sockstatus_l
3810: 65 6e 67 74 68 29 20 7b 0a 09 09 72 65 74 75 72  ength) {...retur
3820: 6e 28 30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  n(0);..}...retur
3830: 6e 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(1);.}..static 
3840: 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65  void filed_socke
3850: 74 74 69 6d 65 6f 75 74 5f 65 78 70 69 72 65 28  ttimeout_expire(
3860: 69 6e 74 20 73 6f 63 6b 66 64 2c 20 69 6e 74 20  int sockfd, int 
3870: 6c 65 6e 67 74 68 29 20 7b 0a 09 74 69 6d 65 5f  length) {..time_
3880: 74 20 6e 6f 77 2c 20 65 78 70 69 72 65 3b 0a 0a  t now, expire;..
3890: 09 6e 6f 77 20 3d 20 61 74 6f 6d 69 63 5f 6c 6f  .now = atomic_lo
38a0: 61 64 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74  ad(&filed_socket
38b0: 74 69 6d 65 6f 75 74 5f 74 69 6d 65 29 3b 0a 0a  timeout_time);..
38c0: 09 65 78 70 69 72 65 20 3d 20 6e 6f 77 20 2b 20  .expire = now + 
38d0: 6c 65 6e 67 74 68 3b 0a 0a 09 61 74 6f 6d 69 63  length;...atomic
38e0: 5f 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f  _store(&filed_so
38f0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
3900: 73 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 65  status[sockfd].e
3910: 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 2c 20  xpiration_time, 
3920: 65 78 70 69 72 65 29 3b 0a 0a 09 72 65 74 75 72  expire);...retur
3930: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
3940: 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  d filed_socketti
3950: 6d 65 6f 75 74 5f 61 63 63 65 70 74 28 69 6e 74  meout_accept(int
3960: 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28   sockfd) {..if (
3970: 21 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  !filed_sockettim
3980: 65 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72  eout_sockfd_in_r
3990: 61 6e 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a  ange(sockfd)) {.
39a0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
39b0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
39c0: 75 74 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64  ut_expire(sockfd
39d0: 2c 20 36 30 29 3b 0a 0a 09 61 74 6f 6d 69 63 5f  , 60);...atomic_
39e0: 73 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63  store(&filed_soc
39f0: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73  kettimeout_socks
3a00: 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d 2e 74 68  tatus[sockfd].th
3a10: 72 65 61 64 5f 69 64 2c 20 70 74 68 72 65 61 64  read_id, pthread
3a20: 5f 73 65 6c 66 28 29 29 3b 0a 0a 09 61 74 6f 6d  _self());...atom
3a30: 69 63 5f 73 74 6f 72 65 28 26 66 69 6c 65 64 5f  ic_store(&filed_
3a40: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
3a50: 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66 64 5d  ckstatus[sockfd]
3a60: 2e 76 61 6c 69 64 2c 20 74 72 75 65 29 3b 0a 0a  .valid, true);..
3a70: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
3a80: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f  ic void filed_so
3a90: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63  ckettimeout_proc
3aa0: 65 73 73 69 6e 67 5f 73 74 61 72 74 28 69 6e 74  essing_start(int
3ab0: 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28   sockfd) {..if (
3ac0: 21 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  !filed_sockettim
3ad0: 65 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72  eout_sockfd_in_r
3ae0: 61 6e 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a  ange(sockfd)) {.
3af0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
3b00: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3b10: 75 74 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64  ut_expire(sockfd
3b20: 2c 20 38 36 34 30 30 29 3b 0a 0a 09 72 65 74 75  , 86400);...retu
3b30: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  rn;.}..static vo
3b40: 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  id filed_sockett
3b50: 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e  imeout_processin
3b60: 67 5f 65 6e 64 28 69 6e 74 20 73 6f 63 6b 66 64  g_end(int sockfd
3b70: 29 20 7b 0a 09 69 66 20 28 21 66 69 6c 65 64 5f  ) {..if (!filed_
3b80: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
3b90: 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28 73 6f  ckfd_in_range(so
3ba0: 63 6b 66 64 29 29 20 7b 0a 09 09 72 65 74 75 72  ckfd)) {...retur
3bb0: 6e 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73 6f  n;..}...filed_so
3bc0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65 78 70 69  ckettimeout_expi
3bd0: 72 65 28 73 6f 63 6b 66 64 2c 20 36 30 29 3b 0a  re(sockfd, 60);.
3be0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
3bf0: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73  tic void filed_s
3c00: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f  ockettimeout_clo
3c10: 73 65 28 69 6e 74 20 73 6f 63 6b 66 64 29 20 7b  se(int sockfd) {
3c20: 0a 09 69 66 20 28 21 66 69 6c 65 64 5f 73 6f 63  ..if (!filed_soc
3c30: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66  kettimeout_sockf
3c40: 64 5f 69 6e 5f 72 61 6e 67 65 28 73 6f 63 6b 66  d_in_range(sockf
3c50: 64 29 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a  d)) {...return;.
3c60: 09 7d 0a 0a 09 61 74 6f 6d 69 63 5f 73 74 6f 72  .}...atomic_stor
3c70: 65 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  e(&filed_sockett
3c80: 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75  imeout_sockstatu
3c90: 73 5b 73 6f 63 6b 66 64 5d 2e 76 61 6c 69 64 2c  s[sockfd].valid,
3ca0: 20 66 61 6c 73 65 29 3b 0a 0a 09 72 65 74 75 72   false);...retur
3cb0: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  n;.}..static voi
3cc0: 64 20 2a 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  d *filed_sockett
3cd0: 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 28 76 6f  imeout_thread(vo
3ce0: 69 64 20 2a 61 72 67 29 20 7b 0a 09 74 69 6d 65  id *arg) {..time
3cf0: 5f 74 20 6e 6f 77 2c 20 65 78 70 69 72 61 74 69  _t now, expirati
3d00: 6f 6e 5f 74 69 6d 65 3b 0a 09 70 74 68 72 65 61  on_time;..pthrea
3d10: 64 5f 74 20 74 68 72 65 61 64 5f 69 64 3b 0a 09  d_t thread_id;..
3d20: 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 63  long idx;..int c
3d30: 6f 75 6e 74 3b 0a 09 69 6e 74 20 76 61 6c 69 64  ount;..int valid
3d40: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ;...while (1) {.
3d50: 09 09 66 6f 72 20 28 63 6f 75 6e 74 20 3d 20 30  ..for (count = 0
3d60: 3b 20 63 6f 75 6e 74 20 3c 20 31 30 3b 20 63 6f  ; count < 10; co
3d70: 75 6e 74 2b 2b 29 20 7b 0a 09 09 09 75 73 6c 65  unt++) {....usle
3d80: 65 70 28 33 30 30 30 30 30 30 30 29 3b 0a 0a 09  ep(30000000);...
3d90: 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e 55 4c  ..now = time(NUL
3da0: 4c 29 3b 0a 0a 09 09 09 61 74 6f 6d 69 63 5f 73  L);.....atomic_s
3db0: 74 6f 72 65 28 26 66 69 6c 65 64 5f 73 6f 63 6b  tore(&filed_sock
3dc0: 65 74 74 69 6d 65 6f 75 74 5f 74 69 6d 65 2c 20  ettimeout_time, 
3dd0: 6e 6f 77 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72  now);...}....for
3de0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
3df0: 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d   filed_sockettim
3e00: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f  eout_sockstatus_
3e10: 6c 65 6e 67 74 68 3b 20 69 64 78 2b 2b 29 20 7b  length; idx++) {
3e20: 0a 09 09 09 76 61 6c 69 64 20 3d 20 61 74 6f 6d  ....valid = atom
3e30: 69 63 5f 6c 6f 61 64 28 26 66 69 6c 65 64 5f 73  ic_load(&filed_s
3e40: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63  ockettimeout_soc
3e50: 6b 73 74 61 74 75 73 5b 69 64 78 5d 2e 76 61 6c  kstatus[idx].val
3e60: 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 21 76 61  id);.....if (!va
3e70: 6c 69 64 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  lid) {.....conti
3e80: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 65 78  nue;....}.....ex
3e90: 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20 3d 20  piration_time = 
3ea0: 61 74 6f 6d 69 63 5f 6c 6f 61 64 28 26 66 69 6c  atomic_load(&fil
3eb0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3ec0: 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69 64 78 5d  _sockstatus[idx]
3ed0: 2e 65 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65  .expiration_time
3ee0: 29 3b 0a 0a 09 09 09 74 68 72 65 61 64 5f 69 64  );.....thread_id
3ef0: 20 3d 20 61 74 6f 6d 69 63 5f 6c 6f 61 64 28 26   = atomic_load(&
3f00: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3f10: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69  out_sockstatus[i
3f20: 64 78 5d 2e 74 68 72 65 61 64 5f 69 64 29 3b 0a  dx].thread_id);.
3f30: 0a 09 09 09 69 66 20 28 65 78 70 69 72 61 74 69  ....if (expirati
3f40: 6f 6e 5f 74 69 6d 65 20 3e 20 6e 6f 77 29 20 7b  on_time > now) {
3f50: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
3f60: 09 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 73 6f  ..}.....filed_so
3f70: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73  ckettimeout_clos
3f80: 65 28 69 64 78 29 3b 0a 0a 09 09 09 64 75 70 32  e(idx);.....dup2
3f90: 28 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  (filed_sockettim
3fa0: 65 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 2c  eout_devnull_fd,
3fb0: 20 69 64 78 29 3b 0a 0a 09 09 09 70 74 68 72 65   idx);.....pthre
3fc0: 61 64 5f 6b 69 6c 6c 28 74 68 72 65 61 64 5f 69  ad_kill(thread_i
3fd0: 64 2c 20 53 49 47 50 49 50 45 29 3b 0a 09 09 7d  d, SIGPIPE);...}
3fe0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c  ..}...return(NUL
3ff0: 4c 29 3b 0a 0a 09 2f 2a 20 4e 4f 54 52 45 41 43  L);.../* NOTREAC
4000: 48 3a 20 57 65 20 64 6f 6e 27 74 20 61 63 74 75  H: We don't actu
4010: 61 6c 6c 79 20 74 61 6b 65 20 61 6e 79 20 61 72  ally take any ar
4020: 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20  guments */..arg 
4030: 3d 20 61 72 67 3b 0a 7d 0a 0a 73 74 61 74 69 63  = arg;.}..static
4040: 20 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65   int filed_socke
4050: 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 5f  ttimeout_thread_
4060: 69 6e 69 74 28 76 6f 69 64 29 20 7b 0a 09 70 74  init(void) {..pt
4070: 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69  hread_t thread_i
4080: 64 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 72 65  d;...pthread_cre
4090: 61 74 65 28 26 74 68 72 65 61 64 5f 69 64 2c 20  ate(&thread_id, 
40a0: 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 73 6f 63 6b  NULL, filed_sock
40b0: 65 74 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64  ettimeout_thread
40c0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 72 65 74 75 72  , NULL);...retur
40d0: 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
40e0: 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  int filed_socket
40f0: 74 69 6d 65 6f 75 74 5f 69 6e 69 74 28 76 6f 69  timeout_init(voi
4100: 64 29 20 7b 0a 09 6c 6f 6e 67 20 6d 61 78 66 64  d) {..long maxfd
4110: 2c 20 69 64 78 3b 0a 0a 09 6d 61 78 66 64 20 3d  , idx;...maxfd =
4120: 20 73 79 73 63 6f 6e 66 28 5f 53 43 5f 4f 50 45   sysconf(_SC_OPE
4130: 4e 5f 4d 41 58 29 3b 0a 09 69 66 20 28 6d 61 78  N_MAX);..if (max
4140: 66 64 20 3c 3d 20 30 29 20 7b 0a 09 09 6d 61 78  fd <= 0) {...max
4150: 66 64 20 3d 20 34 30 39 36 3b 0a 09 7d 0a 0a 09  fd = 4096;..}...
4160: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
4170: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 20 3d  out_sockstatus =
4180: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
4190: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
41a0: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 29 20  out_sockstatus) 
41b0: 2a 20 6d 61 78 66 64 29 3b 0a 09 69 66 20 28 66  * maxfd);..if (f
41c0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
41d0: 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 20 3d 3d  ut_sockstatus ==
41e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
41f0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  n(-1);..}...for 
4200: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
4210: 6d 61 78 66 64 3b 20 69 64 78 2b 2b 29 20 7b 0a  maxfd; idx++) {.
4220: 09 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  ..filed_socketti
4230: 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73  meout_sockstatus
4240: 5b 69 64 78 5d 2e 76 61 6c 69 64 20 3d 20 66 61  [idx].valid = fa
4250: 6c 73 65 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f  lse;..}...filed_
4260: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
4270: 63 6b 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 20  ckstatus_length 
4280: 3d 20 6d 61 78 66 64 3b 0a 09 66 69 6c 65 64 5f  = maxfd;..filed_
4290: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64 65  sockettimeout_de
42a0: 76 6e 75 6c 6c 5f 66 64 20 3d 20 6f 70 65 6e 28  vnull_fd = open(
42b0: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52  "/dev/null", O_R
42c0: 44 57 52 29 3b 0a 09 69 66 20 28 66 69 6c 65 64  DWR);..if (filed
42d0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64  _sockettimeout_d
42e0: 65 76 6e 75 6c 6c 5f 66 64 20 3c 20 30 29 20 7b  evnull_fd < 0) {
42f0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
4300: 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  }...return(0);.}
4310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 6d  .#endif../* Form
4320: 61 74 20 74 69 6d 65 20 70 65 72 20 52 46 43 32  at time per RFC2
4330: 36 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  616 */.static ch
4340: 61 72 20 2a 66 69 6c 65 64 5f 66 6f 72 6d 61 74  ar *filed_format
4350: 5f 74 69 6d 65 28 63 68 61 72 20 2a 62 75 66 66  _time(char *buff
4360: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65  er, size_t buffe
4370: 72 5f 6c 65 6e 2c 20 63 6f 6e 73 74 20 74 69 6d  r_len, const tim
4380: 65 5f 74 20 74 69 6d 65 69 6e 66 6f 29 20 7b 0a  e_t timeinfo) {.
4390: 09 73 74 72 75 63 74 20 74 6d 20 74 69 6d 65 69  .struct tm timei
43a0: 6e 66 6f 5f 74 6d 2c 20 2a 74 69 6d 65 69 6e 66  nfo_tm, *timeinf
43b0: 6f 5f 74 6d 5f 70 3b 0a 0a 09 74 69 6d 65 69 6e  o_tm_p;...timein
43c0: 66 6f 5f 74 6d 5f 70 20 3d 20 67 6d 74 69 6d 65  fo_tm_p = gmtime
43d0: 5f 72 28 26 74 69 6d 65 69 6e 66 6f 2c 20 26 74  _r(&timeinfo, &t
43e0: 69 6d 65 69 6e 66 6f 5f 74 6d 29 3b 0a 09 69 66  imeinfo_tm);..if
43f0: 20 28 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20   (timeinfo_tm_p 
4400: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
4410: 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a  urn("unknown");.
4420: 09 7d 0a 0a 09 62 75 66 66 65 72 5b 62 75 66 66  .}...buffer[buff
4430: 65 72 5f 6c 65 6e 20 2d 20 31 5d 20 3d 20 27 5c  er_len - 1] = '\
4440: 30 27 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20  0';..buffer_len 
4450: 3d 20 73 74 72 66 74 69 6d 65 28 62 75 66 66 65  = strftime(buffe
4460: 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20  r, buffer_len - 
4470: 31 2c 20 22 25 61 2c 20 25 64 20 25 62 20 25 59  1, "%a, %d %b %Y
4480: 20 25 48 3a 25 4d 3a 25 53 20 47 4d 54 22 2c 20   %H:%M:%S GMT", 
4490: 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 29 3b 0a  timeinfo_tm_p);.
44a0: 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 29  ..return(buffer)
44b0: 3b 0a 7d 0a 0a 2f 2a 20 68 61 73 68 20 2a 2f 0a  ;.}../* hash */.
44c0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
44d0: 69 6e 74 20 66 69 6c 65 64 5f 68 61 73 68 28 63  int filed_hash(c
44e0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
44f0: 61 72 20 2a 76 61 6c 75 65 2c 20 75 6e 73 69 67  ar *value, unsig
4500: 6e 65 64 20 69 6e 74 20 6d 6f 64 75 6c 75 73 29  ned int modulus)
4510: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
4520: 72 20 63 75 72 72 2c 20 70 72 65 76 3b 0a 09 69  r curr, prev;..i
4530: 6e 74 20 64 69 66 66 3b 0a 09 75 6e 73 69 67 6e  nt diff;..unsign
4540: 65 64 20 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a  ed int retval;..
4550: 09 72 65 74 76 61 6c 20 3d 20 6d 6f 64 75 6c 75  .retval = modulu
4560: 73 20 2d 20 31 3b 0a 09 70 72 65 76 20 3d 20 6d  s - 1;..prev = m
4570: 6f 64 75 6c 75 73 20 25 20 32 35 35 3b 0a 0a 09  odulus % 255;...
4580: 77 68 69 6c 65 20 28 28 63 75 72 72 20 3d 20 2a  while ((curr = *
4590: 76 61 6c 75 65 29 29 20 7b 0a 09 09 69 66 20 28  value)) {...if (
45a0: 63 75 72 72 20 3c 20 33 32 29 20 7b 0a 09 09 09  curr < 32) {....
45b0: 63 75 72 72 20 3d 20 32 35 35 20 2d 20 63 75 72  curr = 255 - cur
45c0: 72 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  r;...} else {...
45d0: 09 63 75 72 72 20 2d 3d 20 33 32 3b 0a 09 09 7d  .curr -= 32;...}
45e0: 0a 0a 09 09 69 66 20 28 70 72 65 76 20 3c 20 63  ....if (prev < c
45f0: 75 72 72 29 20 7b 0a 09 09 09 64 69 66 66 20 3d  urr) {....diff =
4600: 20 63 75 72 72 20 2d 20 70 72 65 76 3b 0a 09 09   curr - prev;...
4610: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 64 69 66 66  } else {....diff
4620: 20 3d 20 70 72 65 76 20 2d 20 63 75 72 72 3b 0a   = prev - curr;.
4630: 09 09 7d 0a 0a 09 09 70 72 65 76 20 3d 20 63 75  ..}....prev = cu
4640: 72 72 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3c 3c  rr;....retval <<
4650: 3d 20 33 3b 0a 09 09 72 65 74 76 61 6c 20 26 3d  = 3;...retval &=
4660: 20 30 78 46 46 46 46 46 46 46 46 4c 55 3b 0a 09   0xFFFFFFFFLU;..
4670: 09 72 65 74 76 61 6c 20 5e 3d 20 64 69 66 66 3b  .retval ^= diff;
4680: 0a 0a 09 09 76 61 6c 75 65 2b 2b 3b 0a 09 7d 0a  ....value++;..}.
4690: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 74 76 61  ..retval = retva
46a0: 6c 20 25 20 6d 6f 64 75 6c 75 73 3b 0a 0a 09 72  l % modulus;...r
46b0: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
46c0: 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 6d 69 6d 65  ../* Find a mime
46d0: 2d 74 79 70 65 20 62 61 73 65 64 20 6f 6e 20 74  -type based on t
46e0: 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73  he filename */.s
46f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4700: 20 2a 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e   *filed_determin
4710: 65 5f 6d 69 6d 65 74 79 70 65 28 63 6f 6e 73 74  e_mimetype(const
4720: 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 09   char *path) {..
4730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 0a  const char *p;..
4740: 09 70 20 3d 20 73 74 72 72 63 68 72 28 70 61 74  .p = strrchr(pat
4750: 68 2c 20 27 2e 27 29 3b 0a 09 69 66 20 28 70 20  h, '.');..if (p 
4760: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
4770: 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c  urn(FILED_DEFAUL
4780: 54 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 70 2b  T_TYPE);..}...p+
4790: 2b 3b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 27 5c  +;..if (*p == '\
47a0: 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 46  0') {...return(F
47b0: 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50  ILED_DEFAULT_TYP
47c0: 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c  E);..}...filed_l
47d0: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f  og_msg_debug("Lo
47e0: 6f 6b 69 6e 67 20 75 70 20 4d 49 4d 45 20 74 79  oking up MIME ty
47f0: 70 65 20 66 6f 72 20 25 73 20 28 68 61 73 68 20  pe for %s (hash 
4800: 3d 20 25 6c 6c 75 29 22 2c 20 70 2c 20 28 75 6e  = %llu)", p, (un
4810: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
4820: 29 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f  ) filed_hash((co
4830: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4840: 72 20 2a 29 20 70 2c 20 31 36 37 37 37 32 35 39  r *) p, 16777259
4850: 29 29 3b 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66  ));..#include "f
4860: 69 6c 65 64 2d 6d 69 6d 65 2d 74 79 70 65 73 2e  iled-mime-types.
4870: 68 22 0a 0a 09 72 65 74 75 72 6e 28 46 49 4c 45  h"...return(FILE
4880: 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 29 3b  D_DEFAULT_TYPE);
4890: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
48a0: 61 20 75 6e 69 71 75 65 20 69 64 65 6e 74 69 66  a unique identif
48b0: 69 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ier */.static vo
48c0: 69 64 20 66 69 6c 65 64 5f 67 65 6e 65 72 61 74  id filed_generat
48d0: 65 5f 65 74 61 67 28 63 68 61 72 20 2a 65 74 61  e_etag(char *eta
48e0: 67 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  g, size_t length
48f0: 29 20 7b 0a 09 73 6e 70 72 69 6e 74 66 28 65 74  ) {..snprintf(et
4900: 61 67 2c 20 6c 65 6e 67 74 68 2c 20 22 25 6c 6c  ag, length, "%ll
4910: 78 2d 25 6c 6c 78 25 6c 6c 78 25 6c 6c 78 25 6c  x-%llx%llx%llx%l
4920: 6c 78 22 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64  lx",...(unsigned
4930: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 74 69 6d 65   long long) time
4940: 28 4e 55 4c 4c 29 2c 0a 09 09 28 75 6e 73 69 67  (NULL),...(unsig
4950: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
4960: 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73 69  andom(),...(unsi
4970: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
4980: 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73  random(),...(uns
4990: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
49a0: 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e   random(),...(un
49b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
49c0: 29 20 72 61 6e 64 6f 6d 28 29 0a 09 29 3b 0a 7d  ) random()..);.}
49d0: 0a 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 46  ..#ifdef FILED_F
49e0: 41 4b 45 5f 43 48 52 4f 4f 54 0a 2f 2a 20 54 72  AKE_CHROOT./* Tr
49f0: 61 6e 73 6c 61 74 65 20 61 20 70 61 74 68 20 69  anslate a path i
4a00: 6e 74 6f 20 61 20 66 61 6b 65 20 63 68 72 6f 6f  nto a fake chroo
4a10: 74 20 70 61 74 68 20 2a 2f 0a 73 74 61 74 69 63  t path */.static
4a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
4a30: 65 64 5f 70 61 74 68 5f 74 72 61 6e 73 6c 61 74  ed_path_translat
4a40: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  e(const char *pa
4a50: 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  th, struct filed
4a60: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e  _options *option
4a70: 73 29 20 7b 0a 09 73 74 61 74 69 63 20 5f 5f 74  s) {..static __t
4a80: 68 72 65 61 64 20 63 68 61 72 20 70 61 74 68 42  hread char pathB
4a90: 75 66 66 65 72 5b 38 31 39 32 5d 3b 0a 09 69 6e  uffer[8192];..in
4aa0: 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 0a  t snprintf_ret;.
4ab0: 0a 09 2f 2a 20 49 66 20 6e 6f 20 61 6c 74 65 72  ../* If no alter
4ac0: 6e 61 74 69 76 65 20 72 6f 6f 74 20 69 73 20 73  native root is s
4ad0: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
4ae0: 20 74 68 65 20 75 6e 61 64 6f 72 6e 65 64 20 70   the unadorned p
4af0: 61 74 68 20 2a 2f 0a 09 69 66 20 28 21 6f 70 74  ath */..if (!opt
4b00: 69 6f 6e 73 2d 3e 66 61 6b 65 5f 6e 65 77 72 6f  ions->fake_newro
4b10: 6f 74 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 70  ot) {...return(p
4b20: 61 74 68 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  ath);..}.../* Ve
4b30: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 72  rify that this r
4b40: 65 71 75 65 73 74 20 77 69 6c 6c 20 6e 6f 74 20  equest will not 
4b50: 67 6f 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68  go outside of th
4b60: 65 20 73 70 65 63 69 66 69 65 64 20 72 6f 6f 74  e specified root
4b70: 20 2a 2f 0a 09 69 66 20 28 73 74 72 73 74 72 28   */..if (strstr(
4b80: 70 61 74 68 2c 20 22 2f 2e 2e 2f 22 29 20 21 3d  path, "/../") !=
4b90: 20 4e 55 4c 4c 20 7c 7c 20 70 61 74 68 5b 30 5d   NULL || path[0]
4ba0: 20 21 3d 20 27 2f 27 29 20 7b 0a 09 09 66 69 6c   != '/') {...fil
4bb0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
4bc0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 74 72 61 6e  ("Unable to tran
4bd0: 73 6c 61 74 65 20 70 61 74 68 20 5c 22 25 73 5c  slate path \"%s\
4be0: 22 2c 20 63 6f 6e 74 61 69 6e 73 20 69 6e 76 61  ", contains inva
4bf0: 6c 69 64 20 63 68 61 72 61 63 74 65 72 73 22 2c  lid characters",
4c00: 20 70 61 74 68 29 3b 0a 0a 09 09 72 65 74 75 72   path);....retur
4c10: 6e 28 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b 65 5f  n(options->fake_
4c20: 6e 65 77 72 6f 6f 74 29 3b 0a 09 7d 0a 0a 09 2f  newroot);..}.../
4c30: 2a 20 43 72 65 61 74 65 20 74 68 65 20 6e 65 77  * Create the new
4c40: 20 70 61 74 68 20 69 6e 74 6f 20 6f 75 72 20 6c   path into our l
4c50: 6f 63 61 6c 20 28 54 4c 53 29 20 73 74 61 74 69  ocal (TLS) stati
4c60: 63 20 62 75 66 66 65 72 20 2a 2f 0a 09 73 6e 70  c buffer */..snp
4c70: 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72  rintf_ret = snpr
4c80: 69 6e 74 66 28 70 61 74 68 42 75 66 66 65 72 2c  intf(pathBuffer,
4c90: 20 73 69 7a 65 6f 66 28 70 61 74 68 42 75 66 66   sizeof(pathBuff
4ca0: 65 72 29 2c 20 22 25 73 2f 25 73 22 2c 20 6f 70  er), "%s/%s", op
4cb0: 74 69 6f 6e 73 2d 3e 66 61 6b 65 5f 6e 65 77 72  tions->fake_newr
4cc0: 6f 6f 74 2c 20 70 61 74 68 29 3b 0a 09 69 66 20  oot, path);..if 
4cd0: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 20  (snprintf_ret < 
4ce0: 30 20 7c 7c 20 28 28 75 6e 73 69 67 6e 65 64 20  0 || ((unsigned 
4cf0: 69 6e 74 29 20 73 6e 70 72 69 6e 74 66 5f 72 65  int) snprintf_re
4d00: 74 29 20 3e 3d 20 73 69 7a 65 6f 66 28 70 61 74  t) >= sizeof(pat
4d10: 68 42 75 66 66 65 72 29 29 20 7b 0a 09 09 66 69  hBuffer)) {...fi
4d20: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
4d30: 67 28 22 55 6e 61 62 6c 65 20 74 6f 20 74 72 61  g("Unable to tra
4d40: 6e 73 6c 61 74 65 20 70 61 74 68 20 5c 22 25 73  nslate path \"%s
4d50: 5c 22 2c 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  \", will not fit
4d60: 20 69 6e 74 6f 20 6e 65 77 20 62 75 66 66 65 72   into new buffer
4d70: 22 2c 20 70 61 74 68 29 3b 0a 0a 09 09 72 65 74  ", path);....ret
4d80: 75 72 6e 28 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b  urn(options->fak
4d90: 65 5f 6e 65 77 72 6f 6f 74 29 3b 0a 09 7d 0a 0a  e_newroot);..}..
4da0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64  .filed_log_msg_d
4db0: 65 62 75 67 28 22 54 72 61 6e 73 6c 61 74 69 6e  ebug("Translatin
4dc0: 67 20 70 61 74 68 20 5c 22 25 73 5c 22 20 69 6e  g path \"%s\" in
4dd0: 74 6f 20 5c 22 25 73 5c 22 22 2c 20 70 61 74 68  to \"%s\"", path
4de0: 2c 20 70 61 74 68 42 75 66 66 65 72 29 3b 0a 0a  , pathBuffer);..
4df0: 09 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
4e00: 65 77 20 70 61 74 68 20 2a 2f 0a 09 72 65 74 75  ew path */..retu
4e10: 72 6e 28 70 61 74 68 42 75 66 66 65 72 29 3b 0a  rn(pathBuffer);.
4e20: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
4e30: 69 6c 65 64 5f 70 61 74 68 5f 74 72 61 6e 73 6c  iled_path_transl
4e40: 61 74 65 5f 73 65 74 5f 72 6f 6f 74 28 63 6f 6e  ate_set_root(con
4e50: 73 74 20 63 68 61 72 20 2a 76 61 72 2c 20 73 74  st char *var, st
4e60: 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f  ruct filed_optio
4e70: 6e 73 20 2a 6f 70 74 69 6f 6e 73 2c 20 63 6f 6e  ns *options, con
4e80: 73 74 20 63 68 61 72 20 2a 76 61 6c 29 20 7b 0a  st char *val) {.
4e90: 09 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b 65 5f 6e  .options->fake_n
4ea0: 65 77 72 6f 6f 74 20 3d 20 73 74 72 64 75 70 28  ewroot = strdup(
4eb0: 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  val);...return;.
4ec0: 0a 09 2f 2a 20 76 61 72 20 69 73 20 6f 6e 6c 79  ../* var is only
4ed0: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6d 61 63   used in the mac
4ee0: 72 6f 20 2d 2d 20 64 69 73 63 61 72 64 20 69 74  ro -- discard it
4ef0: 20 68 65 72 65 20 2a 2f 0a 09 76 61 72 20 3d 20   here */..var = 
4f00: 76 61 72 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  var;.}.#else.#de
4f10: 66 69 6e 65 20 66 69 6c 65 64 5f 70 61 74 68 5f  fine filed_path_
4f20: 74 72 61 6e 73 6c 61 74 65 28 70 61 74 68 2c 20  translate(path, 
4f30: 6f 70 74 69 6f 6e 73 29 20 70 61 74 68 0a 23 64  options) path.#d
4f40: 65 66 69 6e 65 20 66 69 6c 65 64 5f 70 61 74 68  efine filed_path
4f50: 5f 74 72 61 6e 73 6c 61 74 65 5f 73 65 74 5f 72  _translate_set_r
4f60: 6f 6f 74 28 76 61 72 2c 20 6f 70 74 69 6f 6e 73  oot(var, options
4f70: 2c 20 76 61 6c 29 20 76 61 72 20 3d 20 73 74 72  , val) var = str
4f80: 64 75 70 28 76 61 6c 29 0a 23 65 6e 64 69 66 0a  dup(val).#endif.
4f90: 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  ./* Open a file 
4fa0: 61 6e 64 20 72 65 74 75 72 6e 20 66 69 6c 65 20  and return file 
4fb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 73  information */.s
4fc0: 74 61 74 69 63 20 73 74 72 75 63 74 20 66 69 6c  tatic struct fil
4fd0: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c  ed_fileinfo *fil
4fe0: 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 63 6f 6e  ed_open_file(con
4ff0: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73  st char *path, s
5000: 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65  truct filed_file
5010: 69 6e 66 6f 20 2a 62 75 66 66 65 72 2c 20 73 74  info *buffer, st
5020: 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f  ruct filed_optio
5030: 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09  ns *options) {..
5040: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c  struct filed_fil
5050: 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b 0a 09 75  einfo *cache;..u
5060: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68  nsigned int cach
5070: 65 5f 69 64 78 3b 0a 09 6f 66 66 5f 74 20 6c 65  e_idx;..off_t le
5080: 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 69 66  n;..int fd;...if
5090: 20 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f   (filed_fileinfo
50a0: 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d  _fdcache_size !=
50b0: 20 30 29 20 7b 0a 09 09 63 61 63 68 65 5f 69 64   0) {...cache_id
50c0: 78 20 3d 20 66 69 6c 65 64 5f 68 61 73 68 28 28  x = filed_hash((
50d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
50e0: 68 61 72 20 2a 29 20 70 61 74 68 2c 20 66 69 6c  har *) path, fil
50f0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
5100: 63 68 65 5f 73 69 7a 65 29 3b 0a 0a 09 09 63 61  che_size);....ca
5110: 63 68 65 20 3d 20 26 66 69 6c 65 64 5f 66 69 6c  che = &filed_fil
5120: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 63 61  einfo_fdcache[ca
5130: 63 68 65 5f 69 64 78 5d 3b 0a 0a 09 09 66 69 6c  che_idx];....fil
5140: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
5150: 28 22 4c 6f 63 6b 69 6e 67 20 6d 75 74 65 78 20  ("Locking mutex 
5160: 66 6f 72 20 69 64 78 3a 20 25 6c 75 22 2c 20 28  for idx: %lu", (
5170: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
5180: 61 63 68 65 5f 69 64 78 29 3b 0a 0a 09 09 70 74  ache_idx);....pt
5190: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
51a0: 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b  (&cache->mutex);
51b0: 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ....filed_log_ms
51c0: 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 6c 65 74  g_debug("Complet
51d0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6d 75 74 65 78  ed locking mutex
51e0: 20 66 6f 72 20 69 64 78 3a 20 25 6c 75 22 2c 20   for idx: %lu", 
51f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
5200: 63 61 63 68 65 5f 69 64 78 29 3b 0a 09 7d 20 65  cache_idx);..} e
5210: 6c 73 65 20 7b 0a 09 09 63 61 63 68 65 5f 69 64  lse {...cache_id
5220: 78 20 3d 20 30 3b 0a 09 09 63 61 63 68 65 20 3d  x = 0;...cache =
5230: 20 62 75 66 66 65 72 3b 0a 09 09 63 61 63 68 65   buffer;...cache
5240: 2d 3e 70 61 74 68 5b 30 5d 20 3d 20 27 5c 30 27  ->path[0] = '\0'
5250: 3b 0a 09 09 63 61 63 68 65 2d 3e 66 64 20 3d 20  ;...cache->fd = 
5260: 2d 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 72  -1;..}...if (str
5270: 63 6d 70 28 70 61 74 68 2c 20 63 61 63 68 65 2d  cmp(path, cache-
5280: 3e 70 61 74 68 29 20 21 3d 20 30 29 20 7b 0a 09  >path) != 0) {..
5290: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64  .filed_log_msg_d
52a0: 65 62 75 67 28 22 43 61 63 68 65 20 6d 69 73 73  ebug("Cache miss
52b0: 20 66 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20 4f   for idx: %lu: O
52c0: 4c 44 20 5c 22 25 73 5c 22 2c 20 4e 45 57 20 5c  LD \"%s\", NEW \
52d0: 22 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65  "%s\"", (unsigne
52e0: 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64  d long) cache_id
52f0: 78 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 2c 20  x, cache->path, 
5300: 70 61 74 68 29 3b 0a 0a 09 09 66 64 20 3d 20 6f  path);....fd = o
5310: 70 65 6e 28 66 69 6c 65 64 5f 70 61 74 68 5f 74  pen(filed_path_t
5320: 72 61 6e 73 6c 61 74 65 28 70 61 74 68 2c 20 6f  ranslate(path, o
5330: 70 74 69 6f 6e 73 29 2c 20 4f 5f 52 44 4f 4e 4c  ptions), O_RDONL
5340: 59 20 7c 20 4f 5f 4c 41 52 47 45 46 49 4c 45 29  Y | O_LARGEFILE)
5350: 3b 0a 09 09 69 66 20 28 66 64 20 3c 20 30 29 20  ;...if (fd < 0) 
5360: 7b 0a 09 09 09 69 66 20 28 66 69 6c 65 64 5f 66  {....if (filed_f
5370: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f  ileinfo_fdcache_
5380: 73 69 7a 65 20 21 3d 20 30 29 20 7b 0a 09 09 09  size != 0) {....
5390: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  .pthread_mutex_u
53a0: 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75  nlock(&cache->mu
53b0: 74 65 78 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  tex);....}.....r
53c0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d  eturn(NULL);...}
53d0: 0a 0a 09 09 69 66 20 28 63 61 63 68 65 2d 3e 66  ....if (cache->f
53e0: 64 20 3e 3d 20 30 29 20 7b 0a 09 09 09 63 6c 6f  d >= 0) {....clo
53f0: 73 65 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09  se(cache->fd);..
5400: 09 7d 0a 0a 09 09 6c 65 6e 20 3d 20 6c 73 65 65  .}....len = lsee
5410: 6b 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(fd, 0, SEEK_EN
5420: 44 29 3b 0a 09 09 6c 73 65 65 6b 28 66 64 2c 20  D);...lseek(fd, 
5430: 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 09  0, SEEK_SET);...
5440: 09 63 61 63 68 65 2d 3e 66 64 20 3d 20 66 64 3b  .cache->fd = fd;
5450: 0a 09 09 63 61 63 68 65 2d 3e 6c 65 6e 20 3d 20  ...cache->len = 
5460: 6c 65 6e 3b 0a 09 09 73 74 72 63 70 79 28 63 61  len;...strcpy(ca
5470: 63 68 65 2d 3e 70 61 74 68 2c 20 70 61 74 68 29  che->path, path)
5480: 3b 0a 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20  ;...cache->type 
5490: 3d 20 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e  = filed_determin
54a0: 65 5f 6d 69 6d 65 74 79 70 65 28 70 61 74 68 29  e_mimetype(path)
54b0: 3b 0a 09 09 66 69 6c 65 64 5f 67 65 6e 65 72 61  ;...filed_genera
54c0: 74 65 5f 65 74 61 67 28 63 61 63 68 65 2d 3e 65  te_etag(cache->e
54d0: 74 61 67 2c 20 73 69 7a 65 6f 66 28 63 61 63 68  tag, sizeof(cach
54e0: 65 2d 3e 65 74 61 67 29 29 3b 0a 0a 09 09 2f 2a  e->etag));..../*
54f0: 20 58 58 58 3a 54 4f 44 4f 3a 20 44 65 74 65 72   XXX:TODO: Deter
5500: 6d 69 6e 65 20 2a 2f 0a 09 09 63 61 63 68 65 2d  mine */...cache-
5510: 3e 6c 61 73 74 6d 6f 64 20 3d 20 66 69 6c 65 64  >lastmod = filed
5520: 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28 63 61 63  _format_time(cac
5530: 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20 73  he->lastmod_b, s
5540: 69 7a 65 6f 66 28 63 61 63 68 65 2d 3e 6c 61 73  izeof(cache->las
5550: 74 6d 6f 64 5f 62 29 2c 20 74 69 6d 65 28 4e 55  tmod_b), time(NU
5560: 4c 4c 29 20 2d 20 33 30 29 3b 0a 09 7d 20 65 6c  LL) - 30);..} el
5570: 73 65 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  se {...filed_log
5580: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 61 63 68  _msg_debug("Cach
5590: 65 20 68 69 74 20 66 6f 72 20 69 64 78 3a 20 25  e hit for idx: %
55a0: 6c 75 3a 20 50 41 54 48 20 5c 22 25 73 5c 22 22  lu: PATH \"%s\""
55b0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
55c0: 29 20 63 61 63 68 65 5f 69 64 78 2c 20 70 61 74  ) cache_idx, pat
55d0: 68 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 69 6c  h);..}...if (fil
55e0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
55f0: 63 68 65 5f 73 69 7a 65 20 21 3d 20 30 29 20 7b  che_size != 0) {
5600: 0a 09 09 2f 2a 0a 09 09 20 2a 20 57 65 20 68 61  .../*... * We ha
5610: 76 65 20 74 6f 20 6d 61 6b 65 20 61 20 64 75 70  ve to make a dup
5620: 6c 69 63 61 74 65 20 46 44 2c 20 62 65 63 61 75  licate FD, becau
5630: 73 65 20 6f 6e 63 65 20 77 65 20 72 65 6c 65 61  se once we relea
5640: 73 65 20 74 68 65 20 63 61 63 68 65 0a 09 09 20  se the cache... 
5650: 2a 20 6d 75 74 65 78 2c 20 74 68 65 20 66 69 6c  * mutex, the fil
5660: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
5670: 20 62 65 20 63 6c 6f 73 65 64 0a 09 09 20 2a 2f   be closed... */
5680: 0a 09 09 66 64 20 3d 20 64 75 70 28 63 61 63 68  ...fd = dup(cach
5690: 65 2d 3e 66 64 29 3b 0a 09 09 69 66 20 28 66 64  e->fd);...if (fd
56a0: 20 3c 20 30 29 20 7b 0a 09 09 09 70 74 68 72 65   < 0) {....pthre
56b0: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
56c0: 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a  &cache->mutex);.
56d0: 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
56e0: 3b 0a 09 09 7d 0a 0a 09 09 62 75 66 66 65 72 2d  ;...}....buffer-
56f0: 3e 66 64 20 3d 20 66 64 3b 0a 09 09 62 75 66 66  >fd = fd;...buff
5700: 65 72 2d 3e 6c 65 6e 20 3d 20 63 61 63 68 65 2d  er->len = cache-
5710: 3e 6c 65 6e 3b 0a 09 09 62 75 66 66 65 72 2d 3e  >len;...buffer->
5720: 74 79 70 65 20 3d 20 63 61 63 68 65 2d 3e 74 79  type = cache->ty
5730: 70 65 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66  pe;...memcpy(buf
5740: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20  fer->lastmod_b, 
5750: 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62  cache->lastmod_b
5760: 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 2d  , sizeof(buffer-
5770: 3e 6c 61 73 74 6d 6f 64 5f 62 29 29 3b 0a 09 09  >lastmod_b));...
5780: 6d 65 6d 63 70 79 28 62 75 66 66 65 72 2d 3e 65  memcpy(buffer->e
5790: 74 61 67 2c 20 63 61 63 68 65 2d 3e 65 74 61 67  tag, cache->etag
57a0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 2d  , sizeof(buffer-
57b0: 3e 65 74 61 67 29 29 3b 0a 09 09 62 75 66 66 65  >etag));...buffe
57c0: 72 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 62 75 66  r->lastmod = buf
57d0: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 20 2b  fer->lastmod_b +
57e0: 20 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64   (cache->lastmod
57f0: 20 2d 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f   - cache->lastmo
5800: 64 5f 62 29 3b 0a 0a 09 09 70 74 68 72 65 61 64  d_b);....pthread
5810: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63  _mutex_unlock(&c
5820: 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 09 7d  ache->mutex);..}
5830: 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72  ...return(buffer
5840: 29 3b 0a 0a 09 2f 2a 20 6f 70 74 69 6f 6e 73 20  );.../* options 
5850: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
5860: 66 61 6b 65 20 63 68 72 6f 6f 74 20 69 73 20 65  fake chroot is e
5870: 6e 61 62 6c 65 64 2c 20 63 6f 6e 66 75 73 65 20  nabled, confuse 
5880: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 2a 2f 0a  the compiler */.
5890: 09 6f 70 74 69 6f 6e 73 20 3d 20 6f 70 74 69 6f  .options = optio
58a0: 6e 73 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f 63 65 73  ns;.}../* Proces
58b0: 73 20 61 6e 20 48 54 54 50 20 72 65 71 75 65 73  s an HTTP reques
58c0: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
58d0: 20 70 61 74 68 20 72 65 71 75 65 73 74 65 64 20   path requested 
58e0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
58f0: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
5900: 65 73 74 20 2a 66 69 6c 65 64 5f 67 65 74 5f 68  est *filed_get_h
5910: 74 74 70 5f 72 65 71 75 65 73 74 28 46 49 4c 45  ttp_request(FILE
5920: 20 2a 66 70 2c 20 73 74 72 75 63 74 20 66 69 6c   *fp, struct fil
5930: 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20  ed_http_request 
5940: 2a 62 75 66 66 65 72 5f 73 74 2c 20 73 74 72 75  *buffer_st, stru
5950: 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73  ct filed_options
5960: 20 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09 63 68   *options) {..ch
5970: 61 72 20 2a 6d 65 74 68 6f 64 2c 20 2a 70 61 74  ar *method, *pat
5980: 68 3b 0a 09 63 68 61 72 20 2a 62 75 66 66 65 72  h;..char *buffer
5990: 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72 2c 20 2a  , *workbuffer, *
59a0: 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b  workbuffer_next;
59b0: 0a 09 63 68 61 72 20 2a 66 67 65 74 73 5f 72 65  ..char *fgets_re
59c0: 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65  t;..size_t buffe
59d0: 72 5f 6c 65 6e 2c 20 70 61 74 68 5f 6c 65 6e 3b  r_len, path_len;
59e0: 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65 5f 73 74  ..off_t range_st
59f0: 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e 64 2c 20  art, range_end, 
5a00: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 09 69  range_length;..i
5a10: 6e 74 20 72 61 6e 67 65 5f 72 65 71 75 65 73 74  nt range_request
5a20: 3b 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f  ;..int snprintf_
5a30: 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09 2f  ret;..int i;.../
5a40: 2a 20 53 65 74 20 74 6f 20 64 65 66 61 75 6c 74  * Set to default
5a50: 20 76 61 6c 75 65 73 20 2a 2f 0a 09 72 61 6e 67   values */..rang
5a60: 65 5f 73 74 61 72 74 20 3d 20 30 3b 0a 09 72 61  e_start = 0;..ra
5a70: 6e 67 65 5f 65 6e 64 20 20 20 3d 20 30 3b 0a 09  nge_end   = 0;..
5a80: 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d 20  range_request = 
5a90: 30 3b 0a 09 72 61 6e 67 65 5f 6c 65 6e 67 74 68  0;..range_length
5aa0: 20 3d 20 2d 31 3b 0a 09 62 75 66 66 65 72 5f 73   = -1;..buffer_s
5ab0: 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e  t->headers.host.
5ac0: 70 72 65 73 65 6e 74 20 3d 20 30 3b 0a 09 62 75  present = 0;..bu
5ad0: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
5ae0: 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 46 49  .connection = FI
5af0: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43  LED_CONNECTION_C
5b00: 4c 4f 53 45 3b 0a 0a 09 62 75 66 66 65 72 20 3d  LOSE;...buffer =
5b10: 20 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62   buffer_st->tmpb
5b20: 75 66 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20  uf;..buffer_len 
5b30: 3d 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 5f  = sizeof(buffer_
5b40: 73 74 2d 3e 74 6d 70 62 75 66 29 3b 0a 0a 09 66  st->tmpbuf);...f
5b50: 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73  gets_ret = fgets
5b60: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f  (buffer, buffer_
5b70: 6c 65 6e 2c 20 66 70 29 3b 0a 09 69 66 20 28 66  len, fp);..if (f
5b80: 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c  gets_ret == NULL
5b90: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  ) {...return(NUL
5ba0: 4c 29 3b 0a 09 7d 0a 0a 09 6d 65 74 68 6f 64 20  L);..}...method 
5bb0: 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75 66 66  = buffer;...buff
5bc0: 65 72 20 3d 20 73 74 72 63 68 72 28 62 75 66 66  er = strchr(buff
5bd0: 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20 28 62  er, ' ');..if (b
5be0: 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  uffer == NULL) {
5bf0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
5c00: 0a 09 7d 0a 0a 09 2a 62 75 66 66 65 72 20 3d 20  ..}...*buffer = 
5c10: 27 5c 30 27 3b 0a 09 62 75 66 66 65 72 2b 2b 3b  '\0';..buffer++;
5c20: 0a 0a 09 70 61 74 68 20 3d 20 62 75 66 66 65 72  ...path = buffer
5c30: 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ;.../* Terminate
5c40: 20 70 61 74 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   path component 
5c50: 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20 73 74 72  */..buffer = str
5c60: 70 62 72 6b 28 70 61 74 68 2c 20 22 5c 72 5c 6e  pbrk(path, "\r\n
5c70: 20 22 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72   ");..if (buffer
5c80: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 62   != NULL) {...*b
5c90: 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09 09  uffer = '\0';...
5ca0: 62 75 66 66 65 72 2b 2b 3b 0a 09 7d 0a 0a 09 2f  buffer++;..}.../
5cb0: 2a 20 57 65 20 6f 6e 6c 79 20 68 61 6e 64 6c 65  * We only handle
5cc0: 20 74 68 65 20 22 47 45 54 22 20 61 6e 64 20 22   the "GET" and "
5cd0: 48 45 41 44 27 20 6d 65 74 68 6f 64 73 20 2a 2f  HEAD' methods */
5ce0: 0a 09 69 66 20 28 73 74 72 63 61 73 65 63 6d 70  ..if (strcasecmp
5cf0: 28 6d 65 74 68 6f 64 2c 20 22 68 65 61 64 22 29  (method, "head")
5d00: 20 21 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 73   != 0) {...if (s
5d10: 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68 6f 64  trcasecmp(method
5d20: 2c 20 22 67 65 74 22 29 20 21 3d 20 30 29 20 7b  , "get") != 0) {
5d30: 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
5d40: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 47 45 54 20  ;...}..../* GET 
5d50: 72 65 71 75 65 73 74 20 2a 2f 0a 09 09 62 75 66  request */...buf
5d60: 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f 64 20 3d  fer_st->method =
5d70: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
5d80: 45 54 48 4f 44 5f 47 45 54 3b 0a 09 7d 20 65 6c  ETHOD_GET;..} el
5d90: 73 65 20 7b 0a 09 09 2f 2a 20 48 45 41 44 20 72  se {.../* HEAD r
5da0: 65 71 75 65 73 74 20 2a 2f 0a 09 09 62 75 66 66  equest */...buff
5db0: 65 72 5f 73 74 2d 3e 6d 65 74 68 6f 64 20 3d 20  er_st->method = 
5dc0: 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45  FILED_REQUEST_ME
5dd0: 54 48 4f 44 5f 48 45 41 44 3b 0a 09 7d 0a 0a 09  THOD_HEAD;..}...
5de0: 2f 2a 20 4e 6f 74 65 20 70 61 74 68 20 2a 2f 0a  /* Note path */.
5df0: 09 70 61 74 68 5f 6c 65 6e 20 3d 20 73 74 72 6c  .path_len = strl
5e00: 65 6e 28 70 61 74 68 29 3b 0a 09 6d 65 6d 63 70  en(path);..memcp
5e10: 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74  y(buffer_st->pat
5e20: 68 2c 20 70 61 74 68 2c 20 70 61 74 68 5f 6c 65  h, path, path_le
5e30: 6e 20 2b 20 31 29 3b 0a 0a 09 2f 2a 20 44 65 74  n + 1);.../* Det
5e40: 65 72 6d 69 6e 65 20 74 79 70 65 20 6f 66 20 72  ermine type of r
5e50: 65 71 75 65 73 74 20 66 72 6f 6d 20 70 61 74 68  equest from path
5e60: 20 2a 2f 0a 09 69 66 20 28 70 61 74 68 5f 6c 65   */..if (path_le
5e70: 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 62 75 66 66  n == 0) {...buff
5e80: 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d 20 46 49  er_st->type = FI
5e90: 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45  LED_REQUEST_TYPE
5ea0: 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 7d 20 65  _DIRECTORY;..} e
5eb0: 6c 73 65 20 7b 0a 09 09 69 66 20 28 70 61 74 68  lse {...if (path
5ec0: 5b 70 61 74 68 5f 6c 65 6e 20 2d 20 31 5d 20 3d  [path_len - 1] =
5ed0: 3d 20 27 2f 27 29 20 7b 0a 09 09 09 62 75 66 66  = '/') {....buff
5ee0: 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d 20 46 49  er_st->type = FI
5ef0: 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45  LED_REQUEST_TYPE
5f00: 5f 44 49 52 45 43 54 4f 52 59 3b 0a 09 09 7d 20  _DIRECTORY;...} 
5f10: 65 6c 73 65 20 7b 0a 09 09 09 62 75 66 66 65 72  else {....buffer
5f20: 5f 73 74 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45  _st->type = FILE
5f30: 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 4f  D_REQUEST_TYPE_O
5f40: 54 48 45 52 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  THER;...}..}.../
5f50: 2a 20 52 65 73 65 74 20 62 75 66 66 65 72 20 66  * Reset buffer f
5f60: 6f 72 20 6c 61 74 65 72 20 75 73 65 20 2a 2f 0a  or later use */.
5f70: 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  .buffer = buffer
5f80: 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 0a 09 66  _st->tmpbuf;...f
5f90: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31  or (i = 0; i < 1
5fa0: 30 30 3b 20 69 2b 2b 29 20 7b 0a 09 09 66 67 65  00; i++) {...fge
5fb0: 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28 62  ts_ret = fgets(b
5fc0: 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c 65  uffer, buffer_le
5fd0: 6e 2c 20 66 70 29 3b 0a 09 09 69 66 20 28 66 67  n, fp);...if (fg
5fe0: 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29  ets_ret == NULL)
5ff0: 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d   {....break;...}
6000: 0a 0a 09 09 69 66 20 28 73 74 72 6e 63 61 73 65  ....if (strncase
6010: 63 6d 70 28 62 75 66 66 65 72 2c 20 22 52 61 6e  cmp(buffer, "Ran
6020: 67 65 3a 20 22 2c 20 37 29 20 3d 3d 20 30 29 20  ge: ", 7) == 0) 
6030: 7b 0a 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20  {....workbuffer 
6040: 3d 20 62 75 66 66 65 72 20 2b 20 37 3b 0a 0a 09  = buffer + 7;...
6050: 09 09 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d  ..if (strncasecm
6060: 70 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 22 62  p(workbuffer, "b
6070: 79 74 65 73 3d 22 2c 20 36 29 20 3d 3d 20 30 29  ytes=", 6) == 0)
6080: 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65   {.....workbuffe
6090: 72 20 2b 3d 20 36 3b 0a 0a 09 09 09 09 72 61 6e  r += 6;......ran
60a0: 67 65 5f 72 65 71 75 65 73 74 20 3d 20 31 3b 0a  ge_request = 1;.
60b0: 0a 09 09 09 09 72 61 6e 67 65 5f 73 74 61 72 74  .....range_start
60c0: 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b   = strtoull(work
60d0: 62 75 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66  buffer, &workbuf
60e0: 66 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 0a  fer_next, 10);..
60f0: 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d  ....workbuffer =
6100: 20 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74   workbuffer_next
6110: 3b 0a 0a 09 09 09 09 69 66 20 28 2a 77 6f 72 6b  ;......if (*work
6120: 62 75 66 66 65 72 20 3d 3d 20 27 2d 27 29 20 7b  buffer == '-') {
6130: 0a 09 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72  ......workbuffer
6140: 2b 2b 3b 0a 0a 09 09 09 09 09 69 66 20 28 2a 77  ++;.......if (*w
6150: 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 27 5c 72  orkbuffer != '\r
6160: 27 20 26 26 20 2a 77 6f 72 6b 62 75 66 66 65 72  ' && *workbuffer
6170: 20 21 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 09 09   != '\n') {.....
6180: 09 09 72 61 6e 67 65 5f 65 6e 64 20 3d 20 73 74  ..range_end = st
6190: 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75 66 66 65  rtoull(workbuffe
61a0: 72 2c 20 26 77 6f 72 6b 62 75 66 66 65 72 5f 6e  r, &workbuffer_n
61b0: 65 78 74 2c 20 31 30 29 3b 0a 09 09 09 09 09 7d  ext, 10);......}
61c0: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20  .....}....}...} 
61d0: 65 6c 73 65 20 69 66 20 28 73 74 72 6e 63 61 73  else if (strncas
61e0: 65 63 6d 70 28 62 75 66 66 65 72 2c 20 22 48 6f  ecmp(buffer, "Ho
61f0: 73 74 3a 20 22 2c 20 35 29 20 3d 3d 20 30 29 20  st: ", 5) == 0) 
6200: 7b 0a 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  {....buffer_st->
6210: 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 70 72 65  headers.host.pre
6220: 73 65 6e 74 20 3d 20 31 3b 0a 0a 09 09 09 77 6f  sent = 1;.....wo
6230: 72 6b 62 75 66 66 65 72 20 3d 20 73 74 72 70 62  rkbuffer = strpb
6240: 72 6b 28 62 75 66 66 65 72 20 2b 20 35 2c 20 22  rk(buffer + 5, "
6250: 5c 72 5c 6e 3a 22 29 3b 0a 09 09 09 69 66 20 28  \r\n:");....if (
6260: 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 4e 55  workbuffer != NU
6270: 4c 4c 29 20 7b 0a 09 09 09 09 2a 77 6f 72 6b 62  LL) {.....*workb
6280: 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09 09  uffer = '\0';...
6290: 09 7d 0a 0a 09 09 09 77 6f 72 6b 62 75 66 66 65  .}.....workbuffe
62a0: 72 20 3d 20 62 75 66 66 65 72 20 2b 20 35 3b 0a  r = buffer + 5;.
62b0: 09 09 09 77 68 69 6c 65 20 28 2a 77 6f 72 6b 62  ...while (*workb
62c0: 75 66 66 65 72 20 3d 3d 20 27 20 27 29 20 7b 0a  uffer == ' ') {.
62d0: 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72 2b 2b  ....workbuffer++
62e0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 73 74 72 63 70  ;....}.....strcp
62f0: 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61  y(buffer_st->hea
6300: 64 65 72 73 2e 68 6f 73 74 2e 68 6f 73 74 2c 20  ders.host.host, 
6310: 77 6f 72 6b 62 75 66 66 65 72 29 3b 0a 09 09 7d  workbuffer);...}
6320: 20 65 6c 73 65 20 69 66 20 28 73 74 72 6e 63 61   else if (strnca
6330: 73 65 63 6d 70 28 62 75 66 66 65 72 2c 20 22 43  secmp(buffer, "C
6340: 6f 6e 6e 65 63 74 69 6f 6e 3a 20 4b 65 65 70 2d  onnection: Keep-
6350: 41 6c 69 76 65 22 2c 20 32 32 29 20 3d 3d 20 30  Alive", 22) == 0
6360: 29 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 73 74  ) {....buffer_st
6370: 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63  ->headers.connec
6380: 74 69 6f 6e 20 3d 20 46 49 4c 45 44 5f 43 4f 4e  tion = FILED_CON
6390: 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49  NECTION_KEEP_ALI
63a0: 56 45 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d  VE;...}....if (m
63b0: 65 6d 63 6d 70 28 62 75 66 66 65 72 2c 20 22 5c  emcmp(buffer, "\
63c0: 72 5c 6e 22 2c 20 32 29 20 3d 3d 20 30 29 20 7b  r\n", 2) == 0) {
63d0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
63e0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
63f0: 20 72 61 6e 67 65 20 2a 2f 0a 09 69 66 20 28 72   range */..if (r
6400: 61 6e 67 65 5f 65 6e 64 20 21 3d 20 30 29 20 7b  ange_end != 0) {
6410: 0a 09 09 69 66 20 28 72 61 6e 67 65 5f 65 6e 64  ...if (range_end
6420: 20 3c 3d 20 72 61 6e 67 65 5f 73 74 61 72 74 29   <= range_start)
6430: 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c   {....return(NUL
6440: 4c 29 3b 0a 09 09 7d 0a 0a 09 09 72 61 6e 67 65  L);...}....range
6450: 5f 6c 65 6e 67 74 68 20 3d 20 72 61 6e 67 65 5f  _length = range_
6460: 65 6e 64 20 2d 20 72 61 6e 67 65 5f 73 74 61 72  end - range_star
6470: 74 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  t;....filed_log_
6480: 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75  msg_debug("Compu
6490: 74 69 6e 67 20 6c 65 6e 67 74 68 20 70 61 72 61  ting length para
64a0: 6d 65 74 65 72 3a 20 25 6c 6c 75 20 3d 20 25 6c  meter: %llu = %l
64b0: 6c 75 20 2d 20 25 6c 6c 75 22 2c 0a 09 09 09 28  lu - %llu",....(
64c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
64d0: 6e 67 29 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68  ng) range_length
64e0: 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ,....(unsigned l
64f0: 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f  ong long) range_
6500: 65 6e 64 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65  end,....(unsigne
6510: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e  d long long) ran
6520: 67 65 5f 73 74 61 72 74 0a 09 09 29 3b 0a 09 7d  ge_start...);..}
6530: 0a 0a 09 2f 2a 20 46 69 6c 6c 20 75 70 20 73 74  .../* Fill up st
6540: 72 75 63 74 75 72 65 20 74 6f 20 72 65 74 75 72  ructure to retur
6550: 6e 20 2a 2f 0a 09 62 75 66 66 65 72 5f 73 74 2d  n */..buffer_st-
6560: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 70  >headers.range.p
6570: 72 65 73 65 6e 74 20 3d 20 72 61 6e 67 65 5f 72  resent = range_r
6580: 65 71 75 65 73 74 3b 0a 09 62 75 66 66 65 72 5f  equest;..buffer_
6590: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
65a0: 65 2e 6f 66 66 73 65 74 20 20 3d 20 72 61 6e 67  e.offset  = rang
65b0: 65 5f 73 74 61 72 74 3b 0a 09 62 75 66 66 65 72  e_start;..buffer
65c0: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  _st->headers.ran
65d0: 67 65 2e 6c 65 6e 67 74 68 20 20 3d 20 72 61 6e  ge.length  = ran
65e0: 67 65 5f 6c 65 6e 67 74 68 3b 0a 0a 09 2f 2a 20  ge_length;.../* 
65f0: 49 66 20 76 68 6f 73 74 73 20 61 72 65 20 65 6e  If vhosts are en
6600: 61 62 6c 65 64 2c 20 63 6f 6d 70 75 74 65 20 6e  abled, compute n
6610: 65 77 20 70 61 74 68 20 2a 2f 0a 09 69 66 20 28  ew path */..if (
6620: 6f 70 74 69 6f 6e 73 2d 3e 76 68 6f 73 74 73 5f  options->vhosts_
6630: 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 69 66 20  enabled) {...if 
6640: 28 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64  (buffer_st->head
6650: 65 72 73 2e 68 6f 73 74 2e 70 72 65 73 65 6e 74  ers.host.present
6660: 20 3d 3d 20 31 29 20 7b 0a 09 09 09 62 75 66 66   == 1) {....buff
6670: 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e  er = buffer_st->
6680: 74 6d 70 62 75 66 3b 0a 09 09 09 62 75 66 66 65  tmpbuf;....buffe
6690: 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62  r_len = sizeof(b
66a0: 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66  uffer_st->tmpbuf
66b0: 29 3b 0a 0a 09 09 09 73 6e 70 72 69 6e 74 66 5f  );.....snprintf_
66c0: 72 65 74 20 3d 20 73 6e 70 72 69 6e 74 66 28 62  ret = snprintf(b
66d0: 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c 65  uffer, buffer_le
66e0: 6e 2c 20 22 2f 25 73 25 73 25 73 22 2c 0a 09 09  n, "/%s%s%s",...
66f0: 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61  ..buffer_st->hea
6700: 64 65 72 73 2e 68 6f 73 74 2e 68 6f 73 74 2c 0a  ders.host.host,.
6710: 09 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 70  ....buffer_st->p
6720: 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 20 3f 20  ath[0] == '/' ? 
6730: 22 22 20 3a 20 22 2f 22 2c 0a 09 09 09 09 62 75  "" : "/",.....bu
6740: 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 0a 09 09  ffer_st->path...
6750: 09 29 3b 0a 09 09 09 69 66 20 28 73 6e 70 72 69  .);....if (snpri
6760: 6e 74 66 5f 72 65 74 20 3e 3d 20 30 29 20 7b 0a  ntf_ret >= 0) {.
6770: 09 09 09 09 69 66 20 28 28 28 75 6e 73 69 67 6e  ....if (((unsign
6780: 65 64 20 69 6e 74 29 20 73 6e 70 72 69 6e 74 66  ed int) snprintf
6790: 5f 72 65 74 29 20 3c 20 62 75 66 66 65 72 5f 6c  _ret) < buffer_l
67a0: 65 6e 29 20 7b 0a 09 09 09 09 09 73 74 72 63 70  en) {......strcp
67b0: 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74  y(buffer_st->pat
67c0: 68 2c 20 62 75 66 66 65 72 29 3b 0a 09 09 09 09  h, buffer);.....
67d0: 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  }....}...}..}...
67e0: 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 73 74  return(buffer_st
67f0: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
6800: 61 6e 20 65 72 72 6f 72 20 70 61 67 65 20 2a 2f  an error page */
6810: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
6820: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 46 49  ed_error_page(FI
6830: 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20 63 68  LE *fp, const ch
6840: 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74  ar *date_current
6850: 2c 20 69 6e 74 20 65 72 72 6f 72 5f 6e 75 6d 62  , int error_numb
6860: 65 72 2c 20 69 6e 74 20 6d 65 74 68 6f 64 2c 20  er, int method, 
6870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61 73  const char *reas
6880: 6f 6e 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64  on, struct filed
6890: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 29  _log_entry *log)
68a0: 20 7b 0a 09 63 68 61 72 20 2a 65 72 72 6f 72 5f   {..char *error_
68b0: 73 74 72 69 6e 67 20 3d 20 22 3c 68 74 6d 6c 3e  string = "<html>
68c0: 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 45 52 52  <head><title>ERR
68d0: 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  OR</title></head
68e0: 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c 65 20 74 6f  ><body>Unable to
68f0: 20 70 72 6f 63 65 73 73 20 72 65 71 75 65 73 74   process request
6900: 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c 3e 22 3b  </body></html>";
6910: 0a 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  ...fprintf(fp, "
6920: 48 54 54 50 2f 31 2e 31 20 25 69 20 4e 6f 74 20  HTTP/1.1 %i Not 
6930: 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c 72  OK\r\nDate: %s\r
6940: 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64 5c  \nServer: filed\
6950: 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64  r\nLast-Modified
6960: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d  : %s\r\nContent-
6970: 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c 6e  Length: %llu\r\n
6980: 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 73  Content-Type: %s
6990: 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  \r\nConnection: 
69a0: 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c 6e 22 2c 0a  close\r\n\r\n",.
69b0: 09 09 65 72 72 6f 72 5f 6e 75 6d 62 65 72 2c 0a  ..error_number,.
69c0: 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a  ..date_current,.
69d0: 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a  ..date_current,.
69e0: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
69f0: 20 6c 6f 6e 67 29 20 73 74 72 6c 65 6e 28 65 72   long) strlen(er
6a00: 72 6f 72 5f 73 74 72 69 6e 67 29 2c 0a 09 09 22  ror_string),..."
6a10: 74 65 78 74 2f 68 74 6d 6c 22 0a 09 29 3b 0a 0a  text/html"..);..
6a20: 09 2f 2a 20 73 69 6c 65 6e 63 65 20 65 72 72 6f  ./* silence erro
6a30: 72 20 73 74 72 69 6e 67 20 66 6f 72 20 48 45 41  r string for HEA
6a40: 44 20 72 65 71 75 65 73 74 73 20 2a 2f 0a 09 69  D requests */..i
6a50: 66 20 28 6d 65 74 68 6f 64 20 21 3d 20 46 49 4c  f (method != FIL
6a60: 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f  ED_REQUEST_METHO
6a70: 44 5f 48 45 41 44 29 20 7b 0a 09 09 66 70 72 69  D_HEAD) {...fpri
6a80: 6e 74 66 28 66 70 2c 20 22 25 73 22 2c 20 65 72  ntf(fp, "%s", er
6a90: 72 6f 72 5f 73 74 72 69 6e 67 29 3b 0a 09 7d 0a  ror_string);..}.
6aa0: 0a 09 2f 2a 20 4c 6f 67 20 65 72 72 6f 72 20 2a  ../* Log error *
6ab0: 2f 0a 09 2f 2a 2a 20 72 65 61 73 6f 6e 20 6d 75  /../** reason mu
6ac0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 67 6c  st point to a gl
6ad0: 6f 62 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  obally allocated
6ae0: 20 76 61 6c 75 65 20 2a 2a 2f 0a 09 6c 6f 67 2d   value **/..log-
6af0: 3e 72 65 61 73 6f 6e 20 3d 20 72 65 61 73 6f 6e  >reason = reason
6b00: 3b 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f 64  ;..log->http_cod
6b10: 65 20 3d 20 65 72 72 6f 72 5f 6e 75 6d 62 65 72  e = error_number
6b20: 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  ;...filed_log_en
6b30: 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 2f 2a 20 43  try(log);.../* C
6b40: 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  lose connection 
6b50: 2a 2f 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74  */..filed_socket
6b60: 74 69 6d 65 6f 75 74 5f 63 6c 6f 73 65 28 66 69  timeout_close(fi
6b70: 6c 65 6e 6f 28 66 70 29 29 3b 0a 0a 09 66 63 6c  leno(fp));...fcl
6b80: 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65 74 75 72  ose(fp);...retur
6b90: 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  n;.}../* Return 
6ba0: 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 69 6e  a redirect to in
6bb0: 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 73 74 61 74  dex.html */.stat
6bc0: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 72 65  ic void filed_re
6bd0: 64 69 72 65 63 74 5f 69 6e 64 65 78 28 46 49 4c  direct_index(FIL
6be0: 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20 63 68 61  E *fp, const cha
6bf0: 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  r *date_current,
6c00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
6c10: 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  h, struct filed_
6c20: 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 29 20  log_entry *log) 
6c30: 7b 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65  {..int http_code
6c40: 20 3d 20 33 30 31 3b 0a 09 66 70 72 69 6e 74 66   = 301;..fprintf
6c50: 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25  (fp, "HTTP/1.1 %
6c60: 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73  i OK\r\nDate: %s
6c70: 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65  \r\nServer: file
6c80: 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69  d\r\nLast-Modifi
6c90: 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e  ed: %s\r\nConten
6ca0: 74 2d 4c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 43  t-Length: 0\r\nC
6cb0: 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65  onnection: close
6cc0: 5c 72 5c 6e 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  \r\nLocation: %s
6cd0: 5c 72 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 68 74 74  \r\n\r\n",...htt
6ce0: 70 5f 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63  p_code,...date_c
6cf0: 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f 63  urrent,...date_c
6d00: 75 72 72 65 6e 74 2c 0a 09 09 22 69 6e 64 65 78  urrent,..."index
6d10: 2e 68 74 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a 20  .html"..);.../* 
6d20: 4c 6f 67 20 72 65 64 69 72 65 63 74 20 2a 2f 0a  Log redirect */.
6d30: 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22  .log->reason = "
6d40: 72 65 64 69 72 65 63 74 22 3b 0a 09 6c 6f 67 2d  redirect";..log-
6d50: 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 68 74 74  >http_code = htt
6d60: 70 5f 63 6f 64 65 3b 0a 0a 09 66 69 6c 65 64 5f  p_code;...filed_
6d70: 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a  log_entry(log);.
6d80: 0a 09 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65  ../* Close conne
6d90: 63 74 69 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64 5f  ction */..filed_
6da0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c  sockettimeout_cl
6db0: 6f 73 65 28 66 69 6c 65 6e 6f 28 66 70 29 29 3b  ose(fileno(fp));
6dc0: 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a  ...fclose(fp);..
6dd0: 09 72 65 74 75 72 6e 3b 0a 0a 09 2f 2a 20 43 75  .return;.../* Cu
6de0: 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64 3a 20  rrently unused: 
6df0: 70 61 74 68 20 2a 2f 0a 09 70 61 74 68 20 3d 20  path */..path = 
6e00: 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 76  path;.}../* Conv
6e10: 65 72 74 20 61 6e 20 65 6e 75 6d 20 72 65 70 72  ert an enum repr
6e20: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 22 43 6f  esenting the "Co
6e30: 6e 6e 65 63 74 69 6f 6e 22 20 68 65 61 64 65 72  nnection" header
6e40: 20 76 61 6c 75 65 20 74 6f 20 61 20 73 74 72 69   value to a stri
6e50: 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  ng */.static con
6e60: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 63  st char *filed_c
6e70: 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 72 28 69 6e  onnection_str(in
6e80: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 5f 76 61 6c  t connection_val
6e90: 75 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 63  ue) {..switch (c
6ea0: 6f 6e 6e 65 63 74 69 6f 6e 5f 76 61 6c 75 65 29  onnection_value)
6eb0: 20 7b 0a 09 09 63 61 73 65 20 46 49 4c 45 44 5f   {...case FILED_
6ec0: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45  CONNECTION_CLOSE
6ed0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 63 6c 6f  :....return("clo
6ee0: 73 65 22 29 3b 0a 09 09 63 61 73 65 20 46 49 4c  se");...case FIL
6ef0: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45  ED_CONNECTION_KE
6f00: 45 50 5f 41 4c 49 56 45 3a 0a 09 09 09 72 65 74  EP_ALIVE:....ret
6f10: 75 72 6e 28 22 6b 65 65 70 2d 61 6c 69 76 65 22  urn("keep-alive"
6f20: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
6f30: 63 6c 6f 73 65 22 29 3b 0a 7d 0a 0a 2f 2a 20 48  close");.}../* H
6f40: 61 6e 64 6c 65 20 61 20 73 69 6e 67 6c 65 20 72  andle a single r
6f50: 65 71 75 65 73 74 20 66 72 6f 6d 20 61 20 63 6c  equest from a cl
6f60: 69 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 69  ient */.static i
6f70: 6e 74 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f  nt filed_handle_
6f80: 63 6c 69 65 6e 74 28 69 6e 74 20 66 64 2c 20 73  client(int fd, s
6f90: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
6fa0: 5f 72 65 71 75 65 73 74 20 2a 72 65 71 75 65 73  _request *reques
6fb0: 74 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  t, struct filed_
6fc0: 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 2c 20  log_entry *log, 
6fd0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74  struct filed_opt
6fe0: 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b  ions *options) {
6ff0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66  ..struct filed_f
7000: 69 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 69 6e 66  ileinfo *fileinf
7010: 6f 3b 0a 09 73 73 69 7a 65 5f 74 20 73 65 6e 64  o;..ssize_t send
7020: 66 69 6c 65 5f 72 65 74 3b 0a 09 73 69 7a 65 5f  file_ret;..size_
7030: 74 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 3b  t sendfile_size;
7040: 0a 09 6f 66 66 5f 74 20 73 65 6e 64 66 69 6c 65  ..off_t sendfile
7050: 5f 6f 66 66 73 65 74 2c 20 73 65 6e 64 66 69 6c  _offset, sendfil
7060: 65 5f 73 65 6e 74 2c 20 73 65 6e 64 66 69 6c 65  e_sent, sendfile
7070: 5f 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 70 61 74  _len;..char *pat
7080: 68 3b 0a 09 63 68 61 72 20 2a 64 61 74 65 5f 63  h;..char *date_c
7090: 75 72 72 65 6e 74 2c 20 64 61 74 65 5f 63 75 72  urrent, date_cur
70a0: 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a 09 69 6e 74  rent_b[64];..int
70b0: 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09 46 49 4c   http_code;..FIL
70c0: 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20 44 65 74 65  E *fp;.../* Dete
70d0: 72 6d 69 6e 65 20 63 75 72 72 65 6e 74 20 74 69  rmine current ti
70e0: 6d 65 20 2a 2f 0a 09 64 61 74 65 5f 63 75 72 72  me */..date_curr
70f0: 65 6e 74 20 3d 20 66 69 6c 65 64 5f 66 6f 72 6d  ent = filed_form
7100: 61 74 5f 74 69 6d 65 28 64 61 74 65 5f 63 75 72  at_time(date_cur
7110: 72 65 6e 74 5f 62 2c 20 73 69 7a 65 6f 66 28 64  rent_b, sizeof(d
7120: 61 74 65 5f 63 75 72 72 65 6e 74 5f 62 29 2c 20  ate_current_b), 
7130: 74 69 6d 65 28 4e 55 4c 4c 29 29 3b 0a 0a 09 2f  time(NULL));.../
7140: 2a 20 4f 70 65 6e 20 73 6f 63 6b 65 74 20 61 73  * Open socket as
7150: 20 41 4e 53 49 20 49 2f 4f 20 66 6f 72 20 65 61   ANSI I/O for ea
7160: 73 65 20 6f 66 20 75 73 65 20 2a 2f 0a 09 66 70  se of use */..fp
7170: 20 3d 20 66 64 6f 70 65 6e 28 66 64 2c 20 22 77   = fdopen(fd, "w
7180: 2b 62 22 29 3b 0a 09 69 66 20 28 66 70 20 3d 3d  +b");..if (fp ==
7190: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64   NULL) {...filed
71a0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63  _sockettimeout_c
71b0: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 63 6c 6f  lose(fd);....clo
71c0: 73 65 28 66 64 29 3b 0a 0a 09 09 6c 6f 67 2d 3e  se(fd);....log->
71d0: 62 75 66 66 65 72 5b 30 5d 20 3d 20 27 5c 30 27  buffer[0] = '\0'
71e0: 3b 0a 09 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f  ;...log->http_co
71f0: 64 65 20 3d 20 2d 31 3b 0a 09 09 6c 6f 67 2d 3e  de = -1;...log->
7200: 72 65 61 73 6f 6e 20 3d 20 22 66 64 6f 70 65 6e  reason = "fdopen
7210: 5f 66 61 69 6c 65 64 22 3b 0a 0a 09 09 66 69 6c  _failed";....fil
7220: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67  ed_log_entry(log
7230: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c  );....return(FIL
7240: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c  ED_CONNECTION_CL
7250: 4f 53 45 29 3b 0a 09 7d 0a 0a 09 72 65 71 75 65  OSE);..}...reque
7260: 73 74 20 3d 20 66 69 6c 65 64 5f 67 65 74 5f 68  st = filed_get_h
7270: 74 74 70 5f 72 65 71 75 65 73 74 28 66 70 2c 20  ttp_request(fp, 
7280: 72 65 71 75 65 73 74 2c 20 6f 70 74 69 6f 6e 73  request, options
7290: 29 3b 0a 0a 09 69 66 20 28 72 65 71 75 65 73 74  );...if (request
72a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c 6f   == NULL) {...lo
72b0: 67 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d 20 27  g->buffer[0] = '
72c0: 5c 30 27 3b 0a 0a 09 09 66 69 6c 65 64 5f 65 72  \0';....filed_er
72d0: 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64 61 74  ror_page(fp, dat
72e0: 65 5f 63 75 72 72 65 6e 74 2c 20 35 30 30 2c 20  e_current, 500, 
72f0: 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45  FILED_REQUEST_ME
7300: 54 48 4f 44 5f 47 45 54 2c 20 22 66 6f 72 6d 61  THOD_GET, "forma
7310: 74 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72 65 74  t", log);....ret
7320: 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  urn(FILED_CONNEC
7330: 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a  TION_CLOSE);..}.
7340: 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  ..filed_socketti
7350: 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e 67  meout_processing
7360: 5f 73 74 61 72 74 28 66 64 29 3b 0a 0a 09 70 61  _start(fd);...pa
7370: 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 70 61  th = request->pa
7380: 74 68 3b 0a 09 73 74 72 63 70 79 28 6c 6f 67 2d  th;..strcpy(log-
7390: 3e 62 75 66 66 65 72 2c 20 70 61 74 68 29 3b 0a  >buffer, path);.
73a0: 09 6c 6f 67 2d 3e 6d 65 74 68 6f 64 20 3d 20 72  .log->method = r
73b0: 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 3b 0a  equest->method;.
73c0: 0a 09 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75  ../* If the requ
73d0: 65 73 74 65 64 20 70 61 74 68 20 69 73 20 61 20  ested path is a 
73e0: 64 69 72 65 63 74 6f 72 79 2c 20 72 65 64 69 72  directory, redir
73f0: 65 63 74 20 74 6f 20 69 6e 64 65 78 20 70 61 67  ect to index pag
7400: 65 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  e */..if (reques
7410: 74 2d 3e 74 79 70 65 20 3d 3d 20 46 49 4c 45 44  t->type == FILED
7420: 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 44 49  _REQUEST_TYPE_DI
7430: 52 45 43 54 4f 52 59 29 20 7b 0a 09 09 66 69 6c  RECTORY) {...fil
7440: 65 64 5f 72 65 64 69 72 65 63 74 5f 69 6e 64 65  ed_redirect_inde
7450: 78 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65  x(fp, date_curre
7460: 6e 74 2c 20 70 61 74 68 2c 20 6c 6f 67 29 3b 0a  nt, path, log);.
7470: 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f  ...return(FILED_
7480: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45  CONNECTION_CLOSE
7490: 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 69 6e 66 6f  );..}...fileinfo
74a0: 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69   = filed_open_fi
74b0: 6c 65 28 70 61 74 68 2c 20 26 72 65 71 75 65 73  le(path, &reques
74c0: 74 2d 3e 66 69 6c 65 69 6e 66 6f 2c 20 6f 70 74  t->fileinfo, opt
74d0: 69 6f 6e 73 29 3b 0a 09 69 66 20 28 66 69 6c 65  ions);..if (file
74e0: 69 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  info == NULL) {.
74f0: 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61  ..filed_error_pa
7500: 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72  ge(fp, date_curr
7510: 65 6e 74 2c 20 34 30 34 2c 20 72 65 71 75 65 73  ent, 404, reques
7520: 74 2d 3e 6d 65 74 68 6f 64 2c 20 22 6f 70 65 6e  t->method, "open
7530: 5f 66 61 69 6c 65 64 22 2c 20 6c 6f 67 29 3b 0a  _failed", log);.
7540: 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f  ...return(FILED_
7550: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45  CONNECTION_CLOSE
7560: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 71 75  );..}...if (requ
7570: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
7580: 67 65 2e 70 72 65 73 65 6e 74 29 20 7b 0a 09 09  ge.present) {...
7590: 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61  if (request->hea
75a0: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
75b0: 74 20 21 3d 20 30 20 7c 7c 20 72 65 71 75 65 73  t != 0 || reques
75c0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
75d0: 2e 6c 65 6e 67 74 68 20 3e 3d 20 30 29 20 7b 0a  .length >= 0) {.
75e0: 09 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e  ...if (request->
75f0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
7600: 66 73 65 74 20 3e 3d 20 66 69 6c 65 69 6e 66 6f  fset >= fileinfo
7610: 2d 3e 6c 65 6e 29 20 7b 0a 09 09 09 09 66 69 6c  ->len) {.....fil
7620: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70  ed_error_page(fp
7630: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20  , date_current, 
7640: 34 31 36 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65  416, request->me
7650: 74 68 6f 64 2c 20 22 72 61 6e 67 65 5f 69 6e 76  thod, "range_inv
7660: 61 6c 69 64 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09  alid", log);....
7670: 09 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f  ..close(fileinfo
7680: 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 72 65 74 75  ->fd);......retu
7690: 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  rn(FILED_CONNECT
76a0: 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 09 09 7d  ION_CLOSE);....}
76b0: 0a 0a 09 09 09 69 66 20 28 72 65 71 75 65 73 74  .....if (request
76c0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
76d0: 6c 65 6e 67 74 68 20 3d 3d 20 28 28 6f 66 66 5f  length == ((off_
76e0: 74 29 20 2d 31 29 29 20 7b 0a 09 09 09 09 66 69  t) -1)) {.....fi
76f0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
7700: 67 28 22 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e  g("Computing len
7710: 67 74 68 20 74 6f 20 66 69 74 20 69 6e 20 62 6f  gth to fit in bo
7720: 75 6e 64 73 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e  unds: fileinfo->
7730: 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20 72 65 71 75  len = %llu, requ
7740: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
7750: 67 65 2e 6f 66 66 73 65 74 20 3d 20 25 6c 6c 75  ge.offset = %llu
7760: 22 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65  ",......(unsigne
7770: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c  d long long) fil
7780: 65 69 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09  einfo->len,.....
7790: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
77a0: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
77b0: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
77c0: 73 65 74 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09  set.....);......
77d0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
77e0: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 20  .range.length = 
77f0: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 2d 20  fileinfo->len - 
7800: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7810: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09  .range.offset;..
7820: 09 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f  ..}.....filed_lo
7830: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 50 61 72  g_msg_debug("Par
7840: 74 69 61 6c 20 72 65 71 75 65 73 74 2c 20 73 74  tial request, st
7850: 61 72 74 69 6e 67 20 61 74 3a 20 25 6c 6c 75 20  arting at: %llu 
7860: 61 6e 64 20 72 75 6e 6e 69 6e 67 20 66 6f 72 20  and running for 
7870: 25 6c 6c 69 20 62 79 74 65 73 22 2c 0a 09 09 09  %lli bytes",....
7880: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
7890: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
78a0: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
78b0: 73 65 74 2c 0a 09 09 09 09 28 6c 6f 6e 67 20 6c  set,.....(long l
78c0: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
78d0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
78e0: 74 68 0a 09 09 09 29 3b 0a 0a 09 09 7d 0a 0a 09  th....);....}...
78f0: 09 68 74 74 70 5f 63 6f 64 65 20 3d 20 32 30 36  .http_code = 206
7900: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 74  ;..} else {...ht
7910: 74 70 5f 63 6f 64 65 20 3d 20 32 30 30 3b 0a 0a  tp_code = 200;..
7920: 09 09 2f 2a 20 43 6f 6d 70 75 74 65 20 66 61 6b  ../* Compute fak
7930: 65 20 72 61 6e 67 65 20 70 61 72 61 6d 65 74 65  e range paramete
7940: 72 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  rs that includes
7950: 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
7960: 20 2a 2f 0a 09 09 72 65 71 75 65 73 74 2d 3e 68   */...request->h
7970: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
7980: 73 65 74 20 3d 20 30 3b 0a 09 09 72 65 71 75 65  set = 0;...reque
7990: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
79a0: 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69  e.length = filei
79b0: 6e 66 6f 2d 3e 6c 65 6e 3b 0a 09 7d 0a 0a 09 66  nfo->len;..}...f
79c0: 70 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50  printf(fp, "HTTP
79d0: 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61  /1.1 %i OK\r\nDa
79e0: 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72  te: %s\r\nServer
79f0: 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d  : filed\r\nLast-
7a00: 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e  Modified: %s\r\n
7a10: 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20  Content-Length: 
7a20: 25 6c 6c 75 5c 72 5c 6e 41 63 63 65 70 74 2d 52  %llu\r\nAccept-R
7a30: 61 6e 67 65 73 3a 20 62 79 74 65 73 5c 72 5c 6e  anges: bytes\r\n
7a40: 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 73  Content-Type: %s
7a50: 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  \r\nConnection: 
7a60: 25 73 5c 72 5c 6e 45 54 61 67 3a 20 5c 22 25 73  %s\r\nETag: \"%s
7a70: 5c 22 5c 72 5c 6e 22 2c 0a 09 09 68 74 74 70 5f  \"\r\n",...http_
7a80: 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63 75 72  code,...date_cur
7a90: 72 65 6e 74 2c 0a 09 09 66 69 6c 65 69 6e 66 6f  rent,...fileinfo
7aa0: 2d 3e 6c 61 73 74 6d 6f 64 2c 0a 09 09 28 75 6e  ->lastmod,...(un
7ab0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
7ac0: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
7ad0: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c  rs.range.length,
7ae0: 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79 70  ...fileinfo->typ
7af0: 65 2c 0a 09 09 66 69 6c 65 64 5f 63 6f 6e 6e 65  e,...filed_conne
7b00: 63 74 69 6f 6e 5f 73 74 72 28 72 65 71 75 65 73  ction_str(reques
7b10: 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65  t->headers.conne
7b20: 63 74 69 6f 6e 29 2c 0a 09 09 66 69 6c 65 69 6e  ction),...filein
7b30: 66 6f 2d 3e 65 74 61 67 0a 09 29 3b 0a 0a 09 69  fo->etag..);...i
7b40: 66 20 28 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20  f (http_code == 
7b50: 32 30 36 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  206) {...fprintf
7b60: 28 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61  (fp, "Content-Ra
7b70: 6e 67 65 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d  nge: bytes %llu-
7b80: 25 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a  %llu/%llu\r\n",.
7b90: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
7ba0: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
7bb0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
7bc0: 66 66 73 65 74 2c 0a 09 09 09 28 75 6e 73 69 67  ffset,....(unsig
7bd0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 28  ned long long) (
7be0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7bf0: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 2b 20  .range.offset + 
7c00: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7c10: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 2d 20  .range.length - 
7c20: 31 29 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64  1),....(unsigned
7c30: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65   long long) file
7c40: 69 6e 66 6f 2d 3e 6c 65 6e 0a 09 09 29 3b 0a 09  info->len...);..
7c50: 7d 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  }..fprintf(fp, "
7c60: 5c 72 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28  \r\n");..fflush(
7c70: 66 70 29 3b 0a 0a 09 6c 6f 67 2d 3e 68 74 74 70  fp);...log->http
7c80: 5f 63 6f 64 65 20 3d 20 68 74 74 70 5f 63 6f 64  _code = http_cod
7c90: 65 3b 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20  e;..log->reason 
7ca0: 3d 20 22 4f 4b 22 3b 0a 09 6c 6f 67 2d 3e 73 74  = "OK";..log->st
7cb0: 61 72 74 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e  arttime = time(N
7cc0: 55 4c 4c 29 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f  ULL);..log->req_
7cd0: 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65 73 74  offset = request
7ce0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
7cf0: 6f 66 66 73 65 74 3b 0a 09 6c 6f 67 2d 3e 72 65  offset;..log->re
7d00: 71 5f 6c 65 6e 67 74 68 20 3d 20 72 65 71 75 65  q_length = reque
7d10: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
7d20: 65 2e 6c 65 6e 67 74 68 3b 0a 09 6c 6f 67 2d 3e  e.length;..log->
7d30: 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 66 69  file_length = fi
7d40: 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 0a 23 69  leinfo->len;..#i
7d50: 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c  fdef FILED_NONBL
7d60: 4f 43 4b 5f 48 54 54 50 0a 09 69 6e 74 20 73 6f  OCK_HTTP..int so
7d70: 63 6b 65 74 5f 66 6c 61 67 73 3b 0a 09 66 64 5f  cket_flags;..fd_
7d80: 73 65 74 20 72 66 64 2c 20 77 66 64 3b 0a 09 63  set rfd, wfd;..c
7d90: 68 61 72 20 73 69 6e 6b 62 75 66 5b 38 31 39 32  har sinkbuf[8192
7da0: 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64  ];..ssize_t read
7db0: 5f 72 65 74 3b 0a 0a 09 46 44 5f 5a 45 52 4f 28  _ret;...FD_ZERO(
7dc0: 26 72 66 64 29 3b 0a 09 46 44 5f 5a 45 52 4f 28  &rfd);..FD_ZERO(
7dd0: 26 77 66 64 29 3b 0a 09 46 44 5f 53 45 54 28 66  &wfd);..FD_SET(f
7de0: 64 2c 20 26 72 66 64 29 3b 0a 09 46 44 5f 53 45  d, &rfd);..FD_SE
7df0: 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a 09 73  T(fd, &wfd);...s
7e00: 6f 63 6b 65 74 5f 66 6c 61 67 73 20 3d 20 66 63  ocket_flags = fc
7e10: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 4c 29  ntl(fd, F_GETFL)
7e20: 3b 0a 09 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53  ;..fcntl(fd, F_S
7e30: 45 54 46 4c 2c 20 73 6f 63 6b 65 74 5f 66 6c 61  ETFL, socket_fla
7e40: 67 73 20 7c 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29  gs | O_NONBLOCK)
7e50: 3b 0a 23 65 6e 64 69 66 0a 09 73 65 6e 64 66 69  ;.#endif..sendfi
7e60: 6c 65 5f 6f 66 66 73 65 74 20 3d 20 72 65 71 75  le_offset = requ
7e70: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
7e80: 67 65 2e 6f 66 66 73 65 74 3b 0a 09 73 65 6e 64  ge.offset;..send
7e90: 66 69 6c 65 5f 6c 65 6e 20 3d 20 72 65 71 75 65  file_len = reque
7ea0: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
7eb0: 65 2e 6c 65 6e 67 74 68 3b 0a 09 73 65 6e 64 66  e.length;..sendf
7ec0: 69 6c 65 5f 73 65 6e 74 20 3d 20 30 3b 0a 09 77  ile_sent = 0;..w
7ed0: 68 69 6c 65 20 28 72 65 71 75 65 73 74 2d 3e 6d  hile (request->m
7ee0: 65 74 68 6f 64 20 3d 3d 20 46 49 4c 45 44 5f 52  ethod == FILED_R
7ef0: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45  EQUEST_METHOD_GE
7f00: 54 29 20 7b 0a 09 09 69 66 20 28 73 65 6e 64 66  T) {...if (sendf
7f10: 69 6c 65 5f 6c 65 6e 20 3e 20 46 49 4c 45 44 5f  ile_len > FILED_
7f20: 53 45 4e 44 46 49 4c 45 5f 4d 41 58 29 20 7b 0a  SENDFILE_MAX) {.
7f30: 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  ...sendfile_size
7f40: 20 3d 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c   = FILED_SENDFIL
7f50: 45 5f 4d 41 58 3b 0a 09 09 7d 20 65 6c 73 65 20  E_MAX;...} else 
7f60: 7b 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69  {....sendfile_si
7f70: 7a 65 20 3d 20 73 65 6e 64 66 69 6c 65 5f 6c 65  ze = sendfile_le
7f80: 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 66 69  n;...}....sendfi
7f90: 6c 65 5f 72 65 74 20 3d 20 73 65 6e 64 66 69 6c  le_ret = sendfil
7fa0: 65 28 66 64 2c 20 66 69 6c 65 69 6e 66 6f 2d 3e  e(fd, fileinfo->
7fb0: 66 64 2c 20 26 73 65 6e 64 66 69 6c 65 5f 6f 66  fd, &sendfile_of
7fc0: 66 73 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73  fset, sendfile_s
7fd0: 69 7a 65 29 3b 0a 09 09 69 66 20 28 73 65 6e 64  ize);...if (send
7fe0: 66 69 6c 65 5f 72 65 74 20 3c 3d 20 30 29 20 7b  file_ret <= 0) {
7ff0: 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f  .#ifdef FILED_NO
8000: 4e 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69  NBLOCK_HTTP....i
8010: 66 20 28 65 72 72 6e 6f 20 3d 3d 20 45 41 47 41  f (errno == EAGA
8020: 49 4e 29 20 7b 0a 09 09 09 09 73 65 6e 64 66 69  IN) {.....sendfi
8030: 6c 65 5f 72 65 74 20 3d 20 30 3b 0a 0a 09 09 09  le_ret = 0;.....
8040: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 09  .while (1) {....
8050: 09 09 73 65 6c 65 63 74 28 66 64 20 2b 20 31 2c  ..select(fd + 1,
8060: 20 26 72 66 64 2c 20 26 77 66 64 2c 20 4e 55 4c   &rfd, &wfd, NUL
8070: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 09 69  L, NULL);......i
8080: 66 20 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20  f (FD_ISSET(fd, 
8090: 26 72 66 64 29 29 20 7b 0a 09 09 09 09 09 09 72  &rfd)) {.......r
80a0: 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66  ead_ret = read(f
80b0: 64 2c 20 73 69 6e 6b 62 75 66 2c 20 73 69 7a 65  d, sinkbuf, size
80c0: 6f 66 28 73 69 6e 6b 62 75 66 29 29 3b 0a 0a 09  of(sinkbuf));...
80d0: 09 09 09 09 09 69 66 20 28 72 65 61 64 5f 72 65  .....if (read_re
80e0: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  t <= 0) {.......
80f0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a  .break;.......}.
8100: 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
8110: 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20 26 77  (FD_ISSET(fd, &w
8120: 66 64 29 29 20 7b 0a 09 09 09 09 09 09 72 65 61  fd)) {.......rea
8130: 64 5f 72 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09  d_ret = 1;......
8140: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
8150: 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 72  ....}......if (r
8160: 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
8170: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
8180: 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
8190: 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 23 65  ..break;....}.#e
81a0: 6c 73 65 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65  lse....break;.#e
81b0: 6e 64 69 66 0a 09 09 7d 0a 0a 09 09 73 65 6e 64  ndif...}....send
81c0: 66 69 6c 65 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64  file_len -= send
81d0: 66 69 6c 65 5f 72 65 74 3b 0a 09 09 73 65 6e 64  file_ret;...send
81e0: 66 69 6c 65 5f 73 65 6e 74 20 2b 3d 20 73 65 6e  file_sent += sen
81f0: 64 66 69 6c 65 5f 72 65 74 3b 0a 09 09 69 66 20  dfile_ret;...if 
8200: 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d  (sendfile_len ==
8210: 20 30 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a   0) {....break;.
8220: 09 09 7d 0a 09 7d 0a 0a 09 6c 6f 67 2d 3e 65 6e  ..}..}...log->en
8230: 64 74 69 6d 65 20 3d 20 28 74 69 6d 65 5f 74 29  dtime = (time_t)
8240: 20 2d 31 3b 0a 09 6c 6f 67 2d 3e 73 65 6e 74 5f   -1;..log->sent_
8250: 6c 65 6e 67 74 68 20 3d 20 73 65 6e 64 66 69 6c  length = sendfil
8260: 65 5f 73 65 6e 74 3b 0a 0a 09 66 69 6c 65 64 5f  e_sent;...filed_
8270: 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a  log_entry(log);.
8280: 0a 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f  ..close(fileinfo
8290: 2d 3e 66 64 29 3b 0a 0a 09 69 66 20 28 72 65 71  ->fd);...if (req
82a0: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f  uest->headers.co
82b0: 6e 6e 65 63 74 69 6f 6e 20 21 3d 20 46 49 4c 45  nnection != FILE
82c0: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45  D_CONNECTION_KEE
82d0: 50 5f 41 4c 49 56 45 29 20 7b 0a 09 09 66 69 6c  P_ALIVE) {...fil
82e0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
82f0: 5f 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 66  _close(fd);....f
8300: 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 09 72 65  close(fp);....re
8310: 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45  turn(FILED_CONNE
8320: 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d  CTION_CLOSE);..}
8330: 0a 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  ...filed_sockett
8340: 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e  imeout_processin
8350: 67 5f 65 6e 64 28 66 64 29 3b 0a 0a 09 72 65 74  g_end(fd);...ret
8360: 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  urn(FILED_CONNEC
8370: 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56 45 29  TION_KEEP_ALIVE)
8380: 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20 69  ;.}../* Handle i
8390: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
83a0: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
83b0: 69 64 20 2a 66 69 6c 65 64 5f 77 6f 72 6b 65 72  id *filed_worker
83c0: 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a 61 72  _thread(void *ar
83d0: 67 5f 76 29 20 7b 0a 09 73 74 72 75 63 74 20 66  g_v) {..struct f
83e0: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
83f0: 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09 73  ad_args *arg;..s
8400: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
8410: 5f 72 65 71 75 65 73 74 20 72 65 71 75 65 73 74  _request request
8420: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
8430: 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 2c 20  log_entry *log, 
8440: 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 3b  local_dummy_log;
8450: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f  ..struct filed_o
8460: 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 3b  ptions *options;
8470: 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ..struct sockadd
8480: 72 5f 69 6e 36 20 61 64 64 72 3b 0a 09 73 6f 63  r_in6 addr;..soc
8490: 6b 6c 65 6e 5f 74 20 61 64 64 72 6c 65 6e 3b 0a  klen_t addrlen;.
84a0: 09 69 6e 74 20 66 61 69 6c 75 72 65 5f 63 6f 75  .int failure_cou
84b0: 6e 74 20 3d 20 30 2c 20 6d 61 78 5f 66 61 69 6c  nt = 0, max_fail
84c0: 75 72 65 5f 63 6f 75 6e 74 20 3d 20 46 49 4c 45  ure_count = FILE
84d0: 44 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43 4f  D_MAX_FAILURE_CO
84e0: 55 4e 54 3b 0a 09 69 6e 74 20 63 6f 6e 6e 65 63  UNT;..int connec
84f0: 74 69 6f 6e 5f 73 74 61 74 65 20 3d 20 46 49 4c  tion_state = FIL
8500: 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c  ED_CONNECTION_CL
8510: 4f 53 45 3b 0a 09 69 6e 74 20 6d 61 73 74 65 72  OSE;..int master
8520: 5f 66 64 2c 20 66 64 20 3d 20 2d 31 3b 0a 0a 09  _fd, fd = -1;...
8530: 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74  /* Read argument
8540: 73 20 2a 2f 0a 09 61 72 67 20 3d 20 61 72 67 5f  s */..arg = arg_
8550: 76 3b 0a 0a 09 6d 61 73 74 65 72 5f 66 64 20 3d  v;...master_fd =
8560: 20 61 72 67 2d 3e 66 64 3b 0a 09 6f 70 74 69 6f   arg->fd;..optio
8570: 6e 73 20 3d 20 26 61 72 67 2d 3e 6f 70 74 69 6f  ns = &arg->optio
8580: 6e 73 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20  ns;...while (1) 
8590: 7b 0a 09 09 2f 2a 20 46 61 69 6c 75 72 65 20 6c  {.../* Failure l
85a0: 6f 6f 70 20 70 72 65 76 65 6e 74 69 6f 6e 20 2a  oop prevention *
85b0: 2f 0a 09 09 69 66 20 28 66 61 69 6c 75 72 65 5f  /...if (failure_
85c0: 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 66 61 69 6c  count > max_fail
85d0: 75 72 65 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  ure_count) {....
85e0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  break;...}..../*
85f0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
8600: 6c 6f 67 20 62 75 66 66 65 72 20 2a 2f 0a 09 09  log buffer */...
8610: 6c 6f 67 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f  log = filed_log_
8620: 6e 65 77 28 31 29 3b 0a 09 09 69 66 20 28 6c 6f  new(1);...if (lo
8630: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  g == NULL) {....
8640: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 41  filed_log_msg("A
8650: 4c 4c 4f 43 41 54 45 5f 4c 4f 47 5f 4d 53 47 5f  LLOCATE_LOG_MSG_
8660: 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09 62 72  FAILED");.....br
8670: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 6c 6f 67 2d  eak;...}....log-
8680: 3e 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 4c 4f  >type = FILED_LO
8690: 47 5f 54 59 50 45 5f 54 52 41 4e 53 46 45 52 3b  G_TYPE_TRANSFER;
86a0: 0a 0a 09 09 2f 2a 20 49 66 20 77 65 20 63 6c 6f  ..../* If we clo
86b0: 73 65 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 6e  sed the old conn
86c0: 65 63 74 69 6f 6e 2c 20 61 63 63 65 70 74 20 61  ection, accept a
86d0: 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 09 09 69 66   new one */...if
86e0: 20 28 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 61   (connection_sta
86f0: 74 65 20 3d 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e  te == FILED_CONN
8700: 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 20 7b 0a  ECTION_CLOSE) {.
8710: 09 09 09 2f 2a 20 41 63 63 65 70 74 20 61 20 6e  .../* Accept a n
8720: 65 77 20 63 6c 69 65 6e 74 20 2a 2f 0a 09 09 09  ew client */....
8730: 61 64 64 72 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  addrlen = sizeof
8740: 28 61 64 64 72 29 3b 0a 0a 09 09 09 66 64 20 3d  (addr);.....fd =
8750: 20 61 63 63 65 70 74 28 6d 61 73 74 65 72 5f 66   accept(master_f
8760: 64 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61  d, (struct socka
8770: 64 64 72 20 2a 29 20 26 61 64 64 72 2c 20 26 61  ddr *) &addr, &a
8780: 64 64 72 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09  ddrlen);...}....
8790: 2f 2a 0a 09 09 20 2a 20 49 66 20 77 65 20 66 61  /*... * If we fa
87a0: 69 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74 65 20  il, make a note 
87b0: 6f 66 20 69 74 20 73 6f 20 77 65 20 64 6f 6e 27  of it so we don'
87c0: 74 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f 6f 70  t go into a loop
87d0: 20 6f 66 0a 09 09 20 2a 20 61 63 63 65 70 74 28   of... * accept(
87e0: 29 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a 2f 0a  ) failing... */.
87f0: 09 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a  ..if (fd < 0) {.
8800: 09 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e 65  .../* Log the ne
8810: 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  w connection */.
8820: 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
8830: 28 22 41 43 43 45 50 54 5f 46 41 49 4c 45 44 22  ("ACCEPT_FAILED"
8840: 29 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65 5f 63  );.....failure_c
8850: 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 66 69 6c 65  ount++;.....file
8860: 64 5f 6c 6f 67 5f 66 72 65 65 28 6c 6f 67 29 3b  d_log_free(log);
8870: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
8880: 09 7d 0a 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b  .}....filed_sock
8890: 65 74 74 69 6d 65 6f 75 74 5f 61 63 63 65 70 74  ettimeout_accept
88a0: 28 66 64 29 3b 0a 0a 09 09 2f 2a 20 46 69 6c 6c  (fd);..../* Fill
88b0: 20 69 6e 20 6c 6f 67 20 73 74 72 75 63 74 75 72   in log structur
88c0: 65 20 2a 2f 0a 09 09 69 66 20 28 66 69 6c 65 64  e */...if (filed
88d0: 5f 6c 6f 67 5f 69 70 28 28 73 74 72 75 63 74 20  _log_ip((struct 
88e0: 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64  sockaddr *) &add
88f0: 72 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73 69 7a 65  r, log->ip, size
8900: 6f 66 28 6c 6f 67 2d 3e 69 70 29 29 20 3d 3d 20  of(log->ip)) == 
8910: 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 2d 3e  NULL) {....log->
8920: 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  ip[0] = '\0';...
8930: 09 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 30 3b 0a  .log->port = 0;.
8940: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f  ..} else {....lo
8950: 67 2d 3e 70 6f 72 74 20 3d 20 61 64 64 72 2e 73  g->port = addr.s
8960: 69 6e 36 5f 70 6f 72 74 3b 0a 09 09 7d 0a 0a 09  in6_port;...}...
8970: 09 2f 2a 20 52 65 73 65 74 20 66 61 69 6c 75 72  ./* Reset failur
8980: 65 20 63 6f 75 6e 74 2a 2f 0a 09 09 66 61 69 6c  e count*/...fail
8990: 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  ure_count = 0;..
89a0: 09 09 2f 2a 20 48 61 6e 64 6c 65 20 73 6f 63 6b  ../* Handle sock
89b0: 65 74 20 2a 2f 0a 09 09 63 6f 6e 6e 65 63 74 69  et */...connecti
89c0: 6f 6e 5f 73 74 61 74 65 20 3d 20 66 69 6c 65 64  on_state = filed
89d0: 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 66  _handle_client(f
89e0: 64 2c 20 26 72 65 71 75 65 73 74 2c 20 6c 6f 67  d, &request, log
89f0: 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a 09 7d 0a 0a  , options);..}..
8a00: 09 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72  ./* Report error
8a10: 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d   */..filed_log_m
8a20: 73 67 28 22 54 48 52 45 41 44 5f 44 49 45 44 20  sg("THREAD_DIED 
8a30: 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72 65  ABNORMAL");...re
8a40: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a  turn(NULL);.../*
8a50: 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67   local_dummy_log
8a60: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
8a70: 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 20   FILED_DONT_LOG 
8a80: 69 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74 68 65  is enabled, othe
8a90: 72 77 69 73 65 20 69 74 27 73 20 6e 6f 74 20 75  rwise it's not u
8aa0: 73 65 64 2c 20 62 75 74 20 74 68 65 20 63 6f 6d  sed, but the com
8ab0: 70 69 6c 65 72 20 68 61 74 65 73 20 74 68 61 74  piler hates that
8ac0: 20 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61 6c   idea. */..local
8ad0: 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65 20  _dummy_log.type 
8ae0: 3d 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d  = 0;..local_dumm
8af0: 79 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f 63  y_log.type = loc
8b00: 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70  al_dummy_log.typ
8b10: 65 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20  e;.}../* Create 
8b20: 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a  worker threads *
8b30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
8b40: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
8b50: 73 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c 20 69  s_init(int fd, i
8b60: 6e 74 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 2c  nt thread_count,
8b70: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70   struct filed_op
8b80: 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20  tions *options) 
8b90: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
8ba0: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72  worker_thread_ar
8bb0: 67 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65 61  gs *arg;..pthrea
8bc0: 64 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09 69  d_t threadid;..i
8bd0: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b 0a  nt pthread_ret;.
8be0: 09 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69  .int i;...for (i
8bf0: 20 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61 64   = 0; i < thread
8c00: 5f 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09  _count; i++) {..
8c10: 09 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  .arg = malloc(si
8c20: 7a 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09  zeof(*arg));....
8c30: 61 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09  arg->fd = fd;...
8c40: 6d 65 6d 63 70 79 28 26 61 72 67 2d 3e 6f 70 74  memcpy(&arg->opt
8c50: 69 6f 6e 73 2c 20 6f 70 74 69 6f 6e 73 2c 20 73  ions, options, s
8c60: 69 7a 65 6f 66 28 2a 6f 70 74 69 6f 6e 73 29 29  izeof(*options))
8c70: 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
8c80: 20 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61 74   = pthread_creat
8c90: 65 28 26 74 68 72 65 61 64 69 64 2c 20 4e 55 4c  e(&threadid, NUL
8ca0: 4c 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f  L, filed_worker_
8cb0: 74 68 72 65 61 64 2c 20 61 72 67 29 3b 0a 09 09  thread, arg);...
8cc0: 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 20  if (pthread_ret 
8cd0: 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72  != 0) {....retur
8ce0: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  n(-1);...}..}...
8cf0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
8d00: 20 44 69 73 70 6c 61 79 20 68 65 6c 70 20 2a 2f   Display help */
8d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
8d20: 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46 49  ed_print_help(FI
8d30: 4c 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74 20  LE *output, int 
8d40: 6c 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73 74  long_help, const
8d50: 20 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b 0a   char *extra) {.
8d60: 09 69 66 20 28 65 78 74 72 61 29 20 7b 0a 09 09  .if (extra) {...
8d70: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
8d80: 22 25 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b 0a  "%s\n", extra);.
8d90: 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  .}...fprintf(out
8da0: 70 75 74 2c 20 22 55 73 61 67 65 3a 20 66 69 6c  put, "Usage: fil
8db0: 65 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c 6e  ed [<options>]\n
8dc0: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
8dd0: 70 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73 3a  put, "  Options:
8de0: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
8df0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68  utput, "      -h
8e00: 2c 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09 66  , --help\n");..f
8e10: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
8e20: 20 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65 6d        -d, --daem
8e30: 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  on\n");..fprintf
8e40: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
8e50: 2d 76 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c 6e 22  -v, --version\n"
8e60: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
8e70: 75 74 2c 20 22 20 20 20 20 20 20 2d 56 2c 20 2d  ut, "      -V, -
8e80: 2d 76 68 6f 73 74 5c 6e 22 29 3b 0a 09 66 70 72  -vhost\n");..fpr
8e90: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
8ea0: 20 20 20 20 2d 62 20 3c 61 64 64 72 65 73 73 3e      -b <address>
8eb0: 2c 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72 65 73  , --bind <addres
8ec0: 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  s>\n");..fprintf
8ed0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
8ee0: 2d 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f 72  -p <port>, --por
8ef0: 74 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09 66  t <port>\n");..f
8f00: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
8f10: 20 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e 74 3e        -t <count>
8f20: 2c 20 2d 2d 74 68 72 65 61 64 73 20 3c 63 6f 75  , --threads <cou
8f30: 6e 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  nt>\n");..fprint
8f40: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
8f50: 20 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c 20 2d   -c <entries>, -
8f60: 2d 63 61 63 68 65 20 3c 65 6e 74 72 69 65 73 3e  -cache <entries>
8f70: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
8f80: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c  utput, "      -l
8f90: 20 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20 3c   <file>, --log <
8fa0: 66 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  file>\n");..fpri
8fb0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
8fc0: 20 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20 2d 2d     -u <user>, --
8fd0: 75 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22 29 3b  user <user>\n");
8fe0: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
8ff0: 2c 20 22 20 20 20 20 20 20 2d 72 20 3c 64 69 72  , "      -r <dir
9000: 65 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74 20  ectory>, --root 
9010: 3c 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22 29 3b  <directory>\n");
9020: 0a 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65 6c 70  ...if (long_help
9030: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ) {...fprintf(ou
9040: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
9050: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9060: 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 09 09    Usage:\n");...
9070: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9080: 22 20 20 20 20 20 20 2d 68 20 28 6f 72 20 2d 2d  "      -h (or --
9090: 68 65 6c 70 29 20 70 72 69 6e 74 73 20 74 68 69  help) prints thi
90a0: 73 20 75 73 61 67 65 20 69 6e 66 6f 72 6d 61 74  s usage informat
90b0: 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69  ion.\n");...fpri
90c0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
90d0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
90e0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64 20 28  put, "      -d (
90f0: 6f 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e 73  or --daemon) ins
9100: 74 72 75 63 74 73 20 66 69 6c 65 64 20 74 6f 20  tructs filed to 
9110: 62 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20  become a daemon 
9120: 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a 69  after initializi
9130: 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ng\n");...fprint
9140: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9160: 20 20 74 68 65 20 6c 69 73 74 65 6e 69 6e 67 20    the listening 
9170: 54 43 50 20 73 6f 63 6b 65 74 20 61 6e 64 20 6c  TCP socket and l
9180: 6f 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09  og files.\n");..
9190: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
91a0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
91b0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
91c0: 20 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73 69 6f   -v (or --versio
91d0: 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c  n) instructs fil
91e0: 65 64 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65  ed print out the
91f0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
9200: 61 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b 0a 09  and exit.\n");..
9210: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9220: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
9230: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9240: 20 2d 56 20 28 6f 72 20 2d 2d 76 68 6f 73 74 29   -V (or --vhost)
9250: 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65 64   instructs filed
9260: 20 74 6f 20 70 72 65 70 65 6e 64 20 61 6c 6c 20   to prepend all 
9270: 72 65 71 75 65 73 74 73 20 77 69 74 68 20 74 68  requests with th
9280: 65 69 72 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09  eir HTTP\n");...
9290: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
92a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
92b0: 20 20 20 20 20 20 20 48 6f 73 74 20 68 65 61 64         Host head
92c0: 65 72 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  er.\n");...fprin
92d0: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
92e0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
92f0: 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20 28 6f  ut, "      -b (o
9300: 72 20 2d 2d 62 69 6e 64 29 20 73 70 65 63 69 66  r --bind) specif
9310: 69 65 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ies the address 
9320: 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e  to listen for in
9330: 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b  coming HTTP\n");
9340: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9350: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
9360: 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74           request
9370: 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75  s on.  The defau
9380: 6c 74 20 76 61 6c 75 65 20 69 73 20 5c 22 25 73  lt value is \"%s
9390: 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41 44 44  \".\n", BIND_ADD
93a0: 52 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  R);...fprintf(ou
93b0: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
93c0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
93d0: 20 20 20 20 20 20 2d 70 20 28 6f 72 20 2d 2d 70        -p (or --p
93e0: 6f 72 74 29 20 73 70 65 63 69 66 69 65 73 20 74  ort) specifies t
93f0: 68 65 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62  he TCP port numb
9400: 65 72 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72  er to listen for
9410: 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e   incoming HTTP\n
9420: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
9430: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
9440: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75              requ
9450: 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65  ests on.  The de
9460: 66 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e 22 2c  fault is %u.\n",
9470: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
9480: 50 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e 74 66  PORT);...fprintf
9490: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
94a0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
94b0: 2c 20 22 20 20 20 20 20 20 2d 74 20 28 6f 72 20  , "      -t (or 
94c0: 2d 2d 74 68 72 65 61 64 73 29 20 73 70 65 63 69  --threads) speci
94d0: 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
94e0: 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  of worker thread
94f0: 73 20 74 6f 20 63 72 65 61 74 65 2e 20 45 61 63  s to create. Eac
9500: 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  h\n");...fprintf
9510: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 20    worker thread 
9540: 63 61 6e 20 73 65 72 76 69 63 65 20 6f 6e 65 20  can service one 
9550: 63 6f 6e 63 75 72 72 65 6e 74 20 48 54 54 50 20  concurrent HTTP 
9560: 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09  session.\n");...
9570: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9580: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9590: 20 20 20 20 20 20 20 20 20 54 68 75 73 20 74 68           Thus th
95a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65  e number of thre
95b0: 61 64 73 20 63 72 65 61 74 65 64 20 77 69 6c 6c  ads created will
95c0: 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 5c 6e   determine how\n
95d0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
95e0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
9600: 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  any simultaneous
9610: 20 74 72 61 6e 73 66 65 72 73 20 77 69 6c 6c 20   transfers will 
9620: 62 65 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65  be possible. The
9630: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9640: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75 2e   default is %lu.
9670: 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \n", (unsigned l
9680: 6f 6e 67 29 20 54 48 52 45 41 44 5f 43 4f 55 4e  ong) THREAD_COUN
9690: 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  T);...fprintf(ou
96a0: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
96b0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
96c0: 20 20 20 20 20 20 2d 63 20 28 6f 72 20 2d 2d 63        -c (or --c
96d0: 61 63 68 65 29 20 73 70 65 63 69 66 69 65 73 20  ache) specifies 
96e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
96f0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  le information c
9700: 61 63 68 65 20 65 6e 74 72 69 65 73 5c 6e 22 29  ache entries\n")
9710: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9720: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
9730: 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 6c             to al
9740: 6c 6f 63 61 74 65 2e 20 20 45 61 63 68 20 63 61  locate.  Each ca
9750: 63 68 65 20 65 6e 74 72 79 20 68 6f 6c 64 73 20  che entry holds 
9760: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
9770: 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e   as\n");...fprin
9780: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f 70 65    well as an ope
97b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
97c0: 72 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 73  r to the file, s
97d0: 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22 29 3b 0a  o resource\n");.
97e0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
97f0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9800: 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 73 20           limits 
9810: 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29 20 73  (i.e., ulimit) s
9820: 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65  hould be conside
9830: 72 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  red.  This shoul
9840: 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  d\n");...fprintf
9850: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62 65  be a prime numbe
9880: 72 20 66 6f 72 20 69 64 65 61 6c 20 75 73 65 20  r for ideal use 
9890: 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75 70 20  with the lookup 
98a0: 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09 66  method.\n");...f
98b0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75 6c        The defaul
98e0: 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75  t is %lu.\n", (u
98f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
9900: 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66 70 72  CHE_SIZE);...fpr
9910: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
9920: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
9930: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20  tput, "      -l 
9940: 28 6f 72 20 2d 2d 6c 6f 67 29 20 73 70 65 63 69  (or --log) speci
9950: 66 69 65 73 20 61 20 66 69 6c 65 6e 61 6d 65 20  fies a filename 
9960: 74 6f 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  to open for writ
9970: 69 6e 67 20 6c 6f 67 20 65 6e 74 72 69 65 73 2e  ing log entries.
9980: 20 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09 66 70 72    Log\n");...fpr
9990: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61    entries are ma
99c0: 64 65 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73  de for various s
99d0: 74 61 67 65 73 20 69 6e 20 74 72 61 6e 73 66 65  tages in transfe
99e0: 72 69 6e 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b  ring files.\n");
99f0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9a00: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
9a10: 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 20          The log 
9a20: 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
9a30: 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
9a40: 75 73 65 72 73 20 28 73 65 65 20 5c 22 2d 75 5c  users (see \"-u\
9a50: 22 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ")\n");...fprint
9a60: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
9a80: 6e 64 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72  nd root director
9a90: 69 65 73 20 28 73 65 65 20 5c 22 2d 72 5c 22 29  ies (see \"-r\")
9aa0: 2e 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20  .  The log file 
9ab0: 69 73 20 6e 65 76 65 72 5c 6e 22 29 3b 0a 09 09  is never\n");...
9ac0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9ad0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9ae0: 20 20 20 20 20 63 6c 6f 73 65 64 20 73 6f 20 6c       closed so l
9af0: 6f 67 20 72 6f 74 61 74 69 6f 6e 20 77 69 74 68  og rotation with
9b00: 6f 75 74 20 73 74 6f 70 70 69 6e 67 20 74 68 65  out stopping the
9b10: 20 64 61 65 6d 6f 6e 20 69 73 20 77 69 6c 6c 5c   daemon is will\
9b20: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9b30: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20              not 
9b50: 77 6f 72 6b 2e 20 20 54 68 65 20 76 61 6c 75 65  work.  The value
9b60: 20 6f 66 20 5c 22 2d 5c 22 20 69 6e 64 69 63 61   of \"-\" indica
9b70: 74 65 73 20 74 68 61 74 20 73 74 61 6e 64 61 72  tes that standar
9b80: 64 20 6f 75 74 70 75 74 5c 6e 22 29 3b 0a 09 09  d output\n");...
9b90: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9ba0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9bb0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 75       should be u
9bc0: 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 2e  sed for logging.
9bd0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 6e 61 6d    If the filenam
9be0: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 5c  e begins with a\
9bf0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9c00: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 70 69 70 65              pipe
9c20: 20 28 5c 22 7c 5c 22 29 20 74 68 65 6e 20 61 20   (\"|\") then a 
9c30: 70 72 6f 63 65 73 73 20 69 73 20 73 74 61 72 74  process is start
9c40: 65 64 20 61 6e 64 20 75 73 65 64 20 66 6f 72 20  ed and used for 
9c50: 6c 6f 67 67 69 6e 67 5c 6e 22 29 3b 0a 09 09 66  logging\n");...f
9c60: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 69 6e 73 74 65 61 64 20 6f 66 20 61      instead of a
9c90: 20 66 69 6c 65 2e 20 20 54 68 65 20 64 65 66 61   file.  The defa
9ca0: 75 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e  ult is \"%s\".\n
9cb0: 22 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a 23 69  ", LOG_FILE);.#i
9cc0: 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f  fdef FILED_DONT_
9cd0: 4c 4f 47 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  LOG...fprintf(ou
9ce0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
9cf0: 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 65 20             Note 
9d00: 74 68 61 74 20 6c 6f 67 67 69 6e 67 20 69 73 20  that logging is 
9d10: 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 61 62  completely disab
9d20: 6c 65 64 20 73 6f 20 74 68 69 73 20 6f 70 74 69  led so this opti
9d30: 6f 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09 09 66  on does\n");...f
9d40: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e 20 74      nothing in t
9d70: 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a  his build.\n");.
9d80: 23 65 6e 64 69 66 0a 09 09 66 70 72 69 6e 74 66  #endif...fprintf
9d90: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
9da0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9db0: 2c 20 22 20 20 20 20 20 20 2d 75 20 28 6f 72 20  , "      -u (or 
9dc0: 2d 2d 75 73 65 72 29 20 73 70 65 63 69 66 69 65  --user) specifie
9dd0: 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 73 77  s the user to sw
9de0: 69 74 63 68 20 75 73 65 72 20 49 44 73 20 74 6f  itch user IDs to
9df0: 20 62 65 66 6f 72 65 20 73 65 72 76 69 63 69 6e   before servicin
9e00: 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  g\n");...fprintf
9e10: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9e30: 65 71 75 65 73 74 73 2e 20 20 54 68 65 20 64 65  equests.  The de
9e40: 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61  fault is not cha
9e50: 6e 67 65 20 75 73 65 72 20 49 44 73 2e 5c 6e 22  nge user IDs.\n"
9e60: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9e70: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
9e80: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9e90: 20 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d 72 6f       -r (or --ro
9ea0: 6f 74 29 20 73 70 65 63 69 66 69 65 73 20 74 68  ot) specifies th
9eb0: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 61  e directory to a
9ec0: 63 74 20 61 73 20 74 68 65 20 72 6f 6f 74 20 64  ct as the root d
9ed0: 69 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e 22 29  irectory for\n")
9ee0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9ef0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
9f00: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 66 69            the fi
9f10: 6c 65 20 73 65 72 76 65 72 2e 20 20 49 66 20 74  le server.  If t
9f20: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 73 70  his option is sp
9f30: 65 63 69 66 69 65 64 2c 20 63 68 72 6f 6f 74 28  ecified, chroot(
9f40: 32 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  2)\n");...fprint
9f50: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 20  is called.  The 
9f80: 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63  default is not c
9f90: 68 61 6e 67 65 20 72 6f 6f 74 20 64 69 72 65 63  hange root direc
9fa0: 74 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09 09 66  tories,\n");...f
9fb0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 74 68 61 74 20 69 73 2c 20 74 68       that is, th
9fe0: 65 20 5c 22 2f 5c 22 20 64 69 72 65 63 74 6f 72  e \"/\" director
9ff0: 79 20 69 73 20 73 68 61 72 65 64 20 6f 75 74 2e  y is shared out.
a000: 20 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22 29 3b    This will\n");
a010: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
a020: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
a030: 20 20 20 20 20 20 20 20 20 6c 69 6b 65 6c 79 20           likely 
a040: 62 65 20 61 20 73 65 63 75 72 69 74 79 20 69 73  be a security is
a050: 73 75 65 2c 20 73 6f 20 74 68 69 73 20 6f 70 74  sue, so this opt
a060: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a070: 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  s\n");...fprintf
a080: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
a0a0: 65 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a  e used.\n");..}.
a0b0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  ..return;.}../* 
a0c0: 41 64 64 20 61 20 67 65 74 6f 70 74 20 6f 70 74  Add a getopt opt
a0d0: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion */.static vo
a0e0: 69 64 20 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  id filed_getopt_
a0f0: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74 72 75  long_setopt(stru
a100: 63 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74 2c 20  ct option *opt, 
a110: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
a120: 2c 20 69 6e 74 20 68 61 73 5f 61 72 67 2c 20 69  , int has_arg, i
a130: 6e 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e  nt val) {..opt->
a140: 6e 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d 65 3b  name     = name;
a150: 0a 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67 20 20  ..opt->has_arg  
a160: 3d 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70 74 2d  = has_arg;..opt-
a170: 3e 66 6c 61 67 20 20 20 20 20 3d 20 4e 55 4c 4c  >flag     = NULL
a180: 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20 20 20  ;..opt->val     
a190: 20 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75 72 6e   = val;...return
a1a0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20  ;.}../* Resolve 
a1b0: 61 20 75 73 65 72 6e 61 6d 65 20 74 6f 20 61 20  a username to a 
a1c0: 55 49 44 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  UID */.static in
a1d0: 74 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f  t filed_user_loo
a1e0: 6b 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  kup(const char *
a1f0: 75 73 65 72 2c 20 75 69 64 5f 74 20 2a 75 73 65  user, uid_t *use
a200: 72 5f 69 64 29 20 7b 0a 09 63 68 61 72 20 2a 6e  r_id) {..char *n
a210: 65 78 74 3b 0a 09 75 69 64 5f 74 20 75 73 65 72  ext;..uid_t user
a220: 5f 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66 6e 64  _id_check;.#ifnd
a230: 65 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45 54 50  ef FILED_NO_GETP
a240: 57 4e 41 4d 0a 09 73 74 72 75 63 74 20 70 61 73  WNAM..struct pas
a250: 73 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20  swd *ent;...ent 
a260: 3d 20 67 65 74 70 77 6e 61 6d 28 75 73 65 72 29  = getpwnam(user)
a270: 3b 0a 09 69 66 20 28 65 6e 74 20 21 3d 20 4e 55  ;..if (ent != NU
a280: 4c 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f 69 64  LL) {...*user_id
a290: 20 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a   = ent->pw_uid;.
a2a0: 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
a2b0: 0a 23 65 6e 64 69 66 0a 0a 09 75 73 65 72 5f 69  .#endif...user_i
a2c0: 64 5f 63 68 65 63 6b 20 3d 20 73 74 72 74 6f 75  d_check = strtou
a2d0: 6c 6c 28 75 73 65 72 2c 20 26 6e 65 78 74 2c 20  ll(user, &next, 
a2e0: 31 30 29 3b 0a 09 69 66 20 28 6e 65 78 74 20 3d  10);..if (next =
a2f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
a300: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn(1);..}...if (
a310: 6e 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30 27 29  next[0] != '\0')
a320: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
a330: 09 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20 3d 20  .}...*user_id = 
a340: 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a  user_id_check;..
a350: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
a360: 2a 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73  * Daemonize */.s
a370: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
a380: 64 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29 20  daemonize(void) 
a390: 7b 0a 09 70 69 64 5f 74 20 73 65 74 73 69 64 5f  {..pid_t setsid_
a3a0: 72 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b 0a 09  ret, fork_ret;..
a3b0: 69 6e 74 20 63 68 64 69 72 5f 72 65 74 2c 20 64  int chdir_ret, d
a3c0: 75 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20 66 64  up2_ret;..int fd
a3d0: 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a 09 63  _in, fd_out;...c
a3e0: 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72  hdir_ret = chdir
a3f0: 28 22 2f 22 29 3b 0a 09 69 66 20 28 63 68 64 69  ("/");..if (chdi
a400: 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  r_ret != 0) {...
a410: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
a420: 66 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72 6b 28  fork_ret = fork(
a430: 29 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74  );..if (fork_ret
a440: 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
a450: 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 6f  (1);..}...if (fo
a460: 72 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  rk_ret > 0) {...
a470: 2f 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09 09 77  /* Parent */...w
a480: 61 69 74 70 69 64 28 66 6f 72 6b 5f 72 65 74 2c  aitpid(fork_ret,
a490: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 65 78   NULL, 0);....ex
a4a0: 69 74 28 45 58 49 54 5f 53 55 43 43 45 53 53 29  it(EXIT_SUCCESS)
a4b0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c 64 20  ;..}.../* Child 
a4c0: 2a 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29 20 21  */..if (fork() !
a4d0: 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68 69 6c  = 0) {.../* Chil
a4e0: 64 20 2a 2f 0a 09 09 65 78 69 74 28 45 58 49 54  d */...exit(EXIT
a4f0: 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09  _SUCCESS);..}...
a500: 2f 2a 20 47 72 61 6e 64 20 63 68 69 6c 64 20 2a  /* Grand child *
a510: 2f 0a 09 73 65 74 73 69 64 5f 72 65 74 20 3d 20  /..setsid_ret = 
a520: 73 65 74 73 69 64 28 29 3b 0a 09 69 66 20 28 73  setsid();..if (s
a530: 65 74 73 69 64 5f 72 65 74 20 3d 3d 20 28 28 70  etsid_ret == ((p
a540: 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 72  id_t) -1)) {...r
a550: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66  eturn(1);..}...f
a560: 64 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f 64 65  d_in = open("/de
a570: 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c  v/null", O_RDONL
a580: 59 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20 6f 70  Y);..fd_out = op
a590: 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20  en("/dev/null", 
a5a0: 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66 20 28  O_WRONLY);..if (
a5b0: 66 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66 64 5f  fd_in < 0 || fd_
a5c0: 6f 75 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  out < 0) {...ret
a5d0: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70  urn(1);..}...dup
a5e0: 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f  2_ret = dup2(fd_
a5f0: 69 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f  in, STDIN_FILENO
a600: 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74  );..if (dup2_ret
a610: 20 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f   != STDIN_FILENO
a620: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
a630: 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d  ..}...dup2_ret =
a640: 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54   dup2(fd_out, ST
a650: 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69  DOUT_FILENO);..i
a660: 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53  f (dup2_ret != S
a670: 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a  TDOUT_FILENO) {.
a680: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
a690: 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70  ..dup2_ret = dup
a6a0: 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 45 52 52  2(fd_out, STDERR
a6b0: 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64  _FILENO);..if (d
a6c0: 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 45 52  up2_ret != STDER
a6d0: 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65  R_FILENO) {...re
a6e0: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c  turn(1);..}...cl
a6f0: 6f 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f  ose(fd_in);..clo
a700: 73 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09 72 65  se(fd_out);...re
a710: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
a720: 75 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a 69 6e  un process */.in
a730: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
a740: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a   char **argv) {.
a750: 09 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20 6f  .struct option o
a760: 70 74 69 6f 6e 73 5b 31 32 5d 3b 0a 09 73 74 72  ptions[12];..str
a770: 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e  uct filed_option
a780: 73 20 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73  s thread_options
a790: 20 3d 20 7b 30 7d 3b 0a 09 63 6f 6e 73 74 20 63   = {0};..const c
a7a0: 68 61 72 20 2a 62 69 6e 64 5f 61 64 64 72 20 3d  har *bind_addr =
a7b0: 20 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e 65 77   BIND_ADDR, *new
a7c0: 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f  root = NULL, *lo
a7d0: 67 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46 49 4c  g_file = LOG_FIL
a7e0: 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f 66 70  E;..FILE *log_fp
a7f0: 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 20 3d 20  ;..uid_t user = 
a800: 30 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d 20 50  0;..int port = P
a810: 4f 52 54 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e  ORT, thread_coun
a820: 74 20 3d 20 54 48 52 45 41 44 5f 43 4f 55 4e 54  t = THREAD_COUNT
a830: 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 73 69 7a  ;..int cache_siz
a840: 65 20 3d 20 43 41 43 48 45 5f 53 49 5a 45 3b 0a  e = CACHE_SIZE;.
a850: 09 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c 20 63  .int init_ret, c
a860: 68 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74 75 69  hroot_ret, setui
a870: 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f 72 65  d_ret, lookup_re
a880: 74 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a 09 69  t, chdir_ret;..i
a890: 6e 74 20 73 65 74 75 69 64 5f 65 6e 61 62 6c 65  nt setuid_enable
a8a0: 64 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f 65 6e  d = 0, daemon_en
a8b0: 61 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20  abled = 0;..int 
a8c0: 63 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 2f  ch;..int fd;.../
a8d0: 2a 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d 65  * Process argume
a8e0: 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67 65  nts */..filed_ge
a8f0: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
a900: 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22 70  (&options[0], "p
a910: 6f 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61  ort", required_a
a920: 72 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a 09  rgument, 'p');..
a930: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
a940: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
a950: 73 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22 2c  s[1], "threads",
a960: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
a970: 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65 64  nt, 't');..filed
a980: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
a990: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d 2c  opt(&options[2],
a9a0: 20 22 63 61 63 68 65 22 2c 20 72 65 71 75 69 72   "cache", requir
a9b0: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63 27  ed_argument, 'c'
a9c0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
a9d0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
a9e0: 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64 22  tions[3], "bind"
a9f0: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
aa00: 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c 65  ent, 'b');..file
aa10: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
aa20: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34 5d  topt(&options[4]
aa30: 2c 20 22 75 73 65 72 22 2c 20 72 65 71 75 69 72  , "user", requir
aa40: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75 27  ed_argument, 'u'
aa50: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
aa60: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
aa70: 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74 22  tions[5], "root"
aa80: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
aa90: 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c 65  ent, 'r');..file
aaa0: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
aab0: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36 5d  topt(&options[6]
aac0: 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72 67  , "help", no_arg
aad0: 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66 69  ument, 'h');..fi
aae0: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
aaf0: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
ab00: 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e 6f  7], "daemon", no
ab10: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29 3b  _argument, 'd');
ab20: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
ab30: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
ab40: 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20 72  ons[8], "log", r
ab50: 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74  equired_argument
ab60: 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'l');..filed_g
ab70: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
ab80: 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20 22  t(&options[9], "
ab90: 76 65 72 73 69 6f 6e 22 2c 20 6e 6f 5f 61 72 67  version", no_arg
aba0: 75 6d 65 6e 74 2c 20 27 76 27 29 3b 0a 09 66 69  ument, 'v');..fi
abb0: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
abc0: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
abd0: 31 30 5d 2c 20 22 76 68 6f 73 74 22 2c 20 6e 6f  10], "vhost", no
abe0: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 56 27 29 3b  _argument, 'V');
abf0: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
ac00: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
ac10: 6f 6e 73 5b 31 31 5d 2c 20 4e 55 4c 4c 2c 20 30  ons[11], NULL, 0
ac20: 2c 20 30 29 3b 0a 09 77 68 69 6c 65 20 28 28 63  , 0);..while ((c
ac30: 68 20 3d 20 67 65 74 6f 70 74 5f 6c 6f 6e 67 28  h = getopt_long(
ac40: 61 72 67 63 2c 20 61 72 67 76 2c 20 22 70 3a 74  argc, argv, "p:t
ac50: 3a 63 3a 62 3a 75 3a 72 3a 6c 3a 68 64 76 56 22  :c:b:u:r:l:hdvV"
ac60: 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e 55 4c 4c 29  , options, NULL)
ac70: 29 20 21 3d 20 2d 31 29 20 7b 0a 09 09 73 77 69  ) != -1) {...swi
ac80: 74 63 68 28 63 68 29 20 7b 0a 09 09 09 63 61 73  tch(ch) {....cas
ac90: 65 20 27 70 27 3a 0a 09 09 09 09 70 6f 72 74 20  e 'p':.....port 
aca0: 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b 0a  = atoi(optarg);.
acb0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
acc0: 73 65 20 27 74 27 3a 0a 09 09 09 09 74 68 72 65  se 't':.....thre
acd0: 61 64 5f 63 6f 75 6e 74 20 3d 20 61 74 6f 69 28  ad_count = atoi(
ace0: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
acf0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 63 27 3a  ak;....case 'c':
ad00: 0a 09 09 09 09 63 61 63 68 65 5f 73 69 7a 65 20  .....cache_size 
ad10: 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b 0a  = atoi(optarg);.
ad20: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
ad30: 73 65 20 27 62 27 3a 0a 09 09 09 09 62 69 6e 64  se 'b':.....bind
ad40: 5f 61 64 64 72 20 3d 20 73 74 72 64 75 70 28 6f  _addr = strdup(o
ad50: 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61  ptarg);.....brea
ad60: 6b 3b 0a 09 09 09 63 61 73 65 20 27 75 27 3a 0a  k;....case 'u':.
ad70: 09 09 09 09 73 65 74 75 69 64 5f 65 6e 61 62 6c  ....setuid_enabl
ad80: 65 64 20 3d 20 31 3b 0a 09 09 09 09 6c 6f 6f 6b  ed = 1;.....look
ad90: 75 70 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 75  up_ret = filed_u
ada0: 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f 70 74 61 72  ser_lookup(optar
adb0: 67 2c 20 26 75 73 65 72 29 3b 0a 09 09 09 09 69  g, &user);.....i
adc0: 66 20 28 6c 6f 6f 6b 75 70 5f 72 65 74 20 21 3d  f (lookup_ret !=
add0: 20 30 29 20 7b 0a 09 09 09 09 09 66 69 6c 65 64   0) {......filed
ade0: 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65  _print_help(stde
adf0: 72 72 2c 20 30 2c 20 22 49 6e 76 61 6c 69 64 20  rr, 0, "Invalid 
ae00: 75 73 65 72 6e 61 6d 65 20 73 70 65 63 69 66 69  username specifi
ae10: 65 64 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  ed");.......retu
ae20: 72 6e 28 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09  rn(1);.....}....
ae30: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
ae40: 27 72 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70  'r':.....filed_p
ae50: 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 5f 73 65  ath_translate_se
ae60: 74 5f 72 6f 6f 74 28 6e 65 77 72 6f 6f 74 2c 20  t_root(newroot, 
ae70: 26 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73 2c  &thread_options,
ae80: 20 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72   optarg);.....br
ae90: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 6c 27  eak;....case 'l'
aea0: 3a 0a 09 09 09 09 6c 6f 67 5f 66 69 6c 65 20 3d  :.....log_file =
aeb0: 20 73 74 72 64 75 70 28 6f 70 74 61 72 67 29 3b   strdup(optarg);
aec0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
aed0: 61 73 65 20 27 64 27 3a 0a 09 09 09 09 64 61 65  ase 'd':.....dae
aee0: 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b  mon_enabled = 1;
aef0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
af00: 61 73 65 20 27 56 27 3a 0a 09 09 09 09 74 68 72  ase 'V':.....thr
af10: 65 61 64 5f 6f 70 74 69 6f 6e 73 2e 76 68 6f 73  ead_options.vhos
af20: 74 73 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  ts_enabled = 1;.
af30: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
af40: 61 73 65 20 27 76 27 3a 0a 09 09 09 09 70 72 69  ase 'v':.....pri
af50: 6e 74 66 28 22 66 69 6c 65 64 20 76 65 72 73 69  ntf("filed versi
af60: 6f 6e 20 25 73 5c 6e 22 2c 20 46 49 4c 45 44 5f  on %s\n", FILED_
af70: 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 09 09 09 72  VERSION);......r
af80: 65 74 75 72 6e 28 30 29 3b 0a 09 09 09 63 61 73  eturn(0);....cas
af90: 65 20 27 3f 27 3a 0a 09 09 09 63 61 73 65 20 27  e '?':....case '
afa0: 3a 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 72  :':.....filed_pr
afb0: 69 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72 2c  int_help(stderr,
afc0: 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09   0, NULL);......
afd0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 63 61  return(1);....ca
afe0: 73 65 20 27 68 27 3a 0a 09 09 09 09 66 69 6c 65  se 'h':.....file
aff0: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64  d_print_help(std
b000: 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b 0a 0a  out, 1, NULL);..
b010: 09 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
b020: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65 6e 20  .}..}.../* Open 
b030: 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 6c 6f 67  log file */..log
b040: 5f 66 70 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f  _fp = filed_log_
b050: 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c 65 29 3b 0a  open(log_file);.
b060: 09 69 66 20 28 6c 6f 67 5f 66 70 20 3d 3d 20 4e  .if (log_fp == N
b070: 55 4c 4c 29 20 7b 0a 09 09 70 65 72 72 6f 72 28  ULL) {...perror(
b080: 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 22  "filed_log_open"
b090: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29 3b  );....return(4);
b0a0: 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20  ..}.../* Create 
b0b0: 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74  listening socket
b0c0: 20 2a 2f 0a 09 66 64 20 3d 20 66 69 6c 65 64 5f   */..fd = filed_
b0d0: 6c 69 73 74 65 6e 28 62 69 6e 64 5f 61 64 64 72  listen(bind_addr
b0e0: 2c 20 70 6f 72 74 29 3b 0a 09 69 66 20 28 66 64  , port);..if (fd
b0f0: 20 3c 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72   < 0) {...perror
b100: 28 22 66 69 6c 65 64 5f 6c 69 73 74 65 6e 22 29  ("filed_listen")
b110: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
b120: 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69  .}.../* Initiali
b130: 7a 65 20 74 69 6d 65 6f 75 74 20 73 74 72 75 63  ze timeout struc
b140: 74 75 72 65 73 20 2a 2f 0a 09 69 6e 69 74 5f 72  tures */..init_r
b150: 65 74 20 3d 20 66 69 6c 65 64 5f 73 6f 63 6b 65  et = filed_socke
b160: 74 74 69 6d 65 6f 75 74 5f 69 6e 69 74 28 29 3b  ttimeout_init();
b170: 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21  ..if (init_ret !
b180: 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28  = 0) {...perror(
b190: 22 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  "filed_sockettim
b1a0: 65 6f 75 74 5f 69 6e 69 74 22 29 3b 0a 0a 09 09  eout_init");....
b1b0: 72 65 74 75 72 6e 28 38 29 3b 0a 09 7d 0a 0a 09  return(8);..}...
b1c0: 2f 2a 20 42 65 63 6f 6d 65 20 61 20 64 61 65 6d  /* Become a daem
b1d0: 6f 6e 20 2a 2f 0a 09 69 66 20 28 64 61 65 6d 6f  on */..if (daemo
b1e0: 6e 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 69  n_enabled) {...i
b1f0: 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  nit_ret = filed_
b200: 64 61 65 6d 6f 6e 69 7a 65 28 29 3b 0a 09 09 69  daemonize();...i
b210: 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30  f (init_ret != 0
b220: 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 66  ) {....perror("f
b230: 69 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 22 29  iled_daemonize")
b240: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 36 29 3b  ;.....return(6);
b250: 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 43 68 72  ...}..}.../* Chr
b260: 6f 6f 74 2c 20 69 66 20 61 70 70 72 6f 70 72 69  oot, if appropri
b270: 61 74 65 20 2a 2f 0a 09 69 66 20 28 6e 65 77 72  ate */..if (newr
b280: 6f 6f 74 29 20 7b 0a 09 09 63 68 64 69 72 5f 72  oot) {...chdir_r
b290: 65 74 20 3d 20 63 68 64 69 72 28 6e 65 77 72 6f  et = chdir(newro
b2a0: 6f 74 29 3b 0a 09 09 69 66 20 28 63 68 64 69 72  ot);...if (chdir
b2b0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
b2c0: 70 65 72 72 6f 72 28 22 63 68 64 69 72 22 29 3b  perror("chdir");
b2d0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  .....return(1);.
b2e0: 09 09 7d 0a 0a 09 09 63 68 72 6f 6f 74 5f 72 65  ..}....chroot_re
b2f0: 74 20 3d 20 63 68 72 6f 6f 74 28 22 2e 22 29 3b  t = chroot(".");
b300: 0a 09 09 69 66 20 28 63 68 72 6f 6f 74 5f 72 65  ...if (chroot_re
b310: 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72  t != 0) {....per
b320: 72 6f 72 28 22 63 68 72 6f 6f 74 22 29 3b 0a 0a  ror("chroot");..
b330: 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
b340: 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 72 6f 70 20 70  }..}.../* Drop p
b350: 72 69 76 69 6c 65 67 65 73 2c 20 69 66 20 61 70  rivileges, if ap
b360: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66  propriate */..if
b370: 20 28 73 65 74 75 69 64 5f 65 6e 61 62 6c 65 64   (setuid_enabled
b380: 29 20 7b 0a 09 09 73 65 74 75 69 64 5f 72 65 74  ) {...setuid_ret
b390: 20 3d 20 73 65 74 75 69 64 28 75 73 65 72 29 3b   = setuid(user);
b3a0: 0a 09 09 69 66 20 28 73 65 74 75 69 64 5f 72 65  ...if (setuid_re
b3b0: 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72  t != 0) {....per
b3c0: 72 6f 72 28 22 73 65 74 75 69 64 22 29 3b 0a 0a  ror("setuid");..
b3d0: 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
b3e0: 7d 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61  }..}.../* Initia
b3f0: 6c 69 7a 65 20 2a 2f 0a 09 69 6e 69 74 5f 72 65  lize */..init_re
b400: 74 20 3d 20 66 69 6c 65 64 5f 69 6e 69 74 28 63  t = filed_init(c
b410: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20  ache_size);..if 
b420: 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  (init_ret != 0) 
b430: 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65  {...perror("file
b440: 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74  d_init");....ret
b450: 75 72 6e 28 33 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  urn(3);..}.../* 
b460: 43 72 65 61 74 65 20 6c 6f 67 67 69 6e 67 20 74  Create logging t
b470: 68 72 65 61 64 20 2a 2f 0a 09 69 6e 69 74 5f 72  hread */..init_r
b480: 65 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 67 69  et = filed_loggi
b490: 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 6c  ng_thread_init(l
b4a0: 6f 67 5f 66 70 29 3b 0a 09 69 66 20 28 69 6e 69  og_fp);..if (ini
b4b0: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
b4c0: 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f  perror("filed_lo
b4d0: 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69  gging_thread_ini
b4e0: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34  t");....return(4
b4f0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74  );..}.../* Creat
b500: 65 20 73 6f 63 6b 65 74 20 74 65 72 6d 69 6e 61  e socket termina
b510: 74 69 6f 6e 20 74 68 72 65 61 64 20 2a 2f 0a 09  tion thread */..
b520: 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64  init_ret = filed
b530: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74  _sockettimeout_t
b540: 68 72 65 61 64 5f 69 6e 69 74 28 29 3b 0a 09 69  hread_init();..i
b550: 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30  f (init_ret != 0
b560: 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69  ) {...perror("fi
b570: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
b580: 74 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29 3b  t_thread_init");
b590: 0a 0a 09 09 72 65 74 75 72 6e 28 37 29 3b 0a 09  ....return(7);..
b5a0: 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 77 6f  }.../* Create wo
b5b0: 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a  rker threads */.
b5c0: 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65  .init_ret = file
b5d0: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73  d_worker_threads
b5e0: 5f 69 6e 69 74 28 66 64 2c 20 74 68 72 65 61 64  _init(fd, thread
b5f0: 5f 63 6f 75 6e 74 2c 20 26 74 68 72 65 61 64 5f  _count, &thread_
b600: 6f 70 74 69 6f 6e 73 29 3b 0a 09 69 66 20 28 69  options);..if (i
b610: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
b620: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
b630: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69  worker_threads_i
b640: 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  nit");....return
b650: 28 35 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69  (5);..}.../* Wai
b660: 74 20 66 6f 72 20 74 68 72 65 61 64 73 20 74 6f  t for threads to
b670: 20 65 78 69 74 20 2a 2f 0a 09 2f 2a 20 58 58 58   exit */../* XXX
b680: 3a 54 4f 44 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74  :TODO: Monitor t
b690: 68 72 65 61 64 20 75 73 61 67 65 20 2a 2f 0a 09  hread usage */..
b6a0: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 73 6c  while (1) {...sl
b6b0: 65 65 70 28 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a  eep(60);..}.../*
b6c0: 20 52 65 74 75 72 6e 20 69 6e 20 66 61 69 6c 75   Return in failu
b6d0: 72 65 20 2a 2f 0a 09 72 65 74 75 72 6e 28 32 29  re */..return(2)
b6e0: 3b 0a 7d 0a                                      ;.}.