Hex Artifact Content

Artifact 33946c2e2076e9244391cf8ec309c9a16c226eb8:


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 33 22 0a 23 64 65 66 69 6e  ON "1.13".#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 7d 3b 0a 0a 2f 2a 20 41 72 67 75 6d  ed;.};../* Argum
0c30: 65 6e 74 73 20 66 6f 72 20 77 6f 72 6b 65 72 20  ents for worker 
0c40: 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72 75 63  threads */.struc
0c50: 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74  t filed_worker_t
0c60: 68 72 65 61 64 5f 61 72 67 73 20 7b 0a 09 69 6e  hread_args {..in
0c70: 74 20 66 64 3b 0a 09 73 74 72 75 63 74 20 66 69  t fd;..struct fi
0c80: 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69  led_options opti
0c90: 6f 6e 73 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67 75  ons;.};../* Argu
0ca0: 6d 65 6e 74 73 20 66 6f 72 20 6c 6f 67 67 69 6e  ments for loggin
0cb0: 67 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72  g threads */.str
0cc0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  uct filed_loggin
0cd0: 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 7b 0a  g_thread_args {.
0ce0: 09 46 49 4c 45 20 2a 66 70 3b 0a 7d 3b 0a 0a 2f  .FILE *fp;.};../
0cf0: 2a 20 46 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  * File informati
0d00: 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  on */.struct fil
0d10: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 7b 0a 09 70  ed_fileinfo {..p
0d20: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
0d30: 75 74 65 78 3b 0a 09 63 68 61 72 20 70 61 74 68  utex;..char path
0d40: 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46  [FILED_PATH_BUFF
0d50: 45 52 5f 53 49 5a 45 5d 3b 0a 09 69 6e 74 20 66  ER_SIZE];..int f
0d60: 64 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e 3b 0a 09  d;..off_t len;..
0d70: 63 68 61 72 20 2a 6c 61 73 74 6d 6f 64 3b 0a 09  char *lastmod;..
0d80: 63 68 61 72 20 6c 61 73 74 6d 6f 64 5f 62 5b 36  char lastmod_b[6
0d90: 34 5d 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  4];..const char 
0da0: 2a 74 79 70 65 3b 0a 09 63 68 61 72 20 65 74 61  *type;..char eta
0db0: 67 5b 36 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 20 52 65  g[64];.};../* Re
0dc0: 71 75 65 73 74 20 76 61 72 69 61 62 6c 65 73 20  quest variables 
0dd0: 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f  */.struct filed_
0de0: 68 74 74 70 5f 72 65 71 75 65 73 74 20 7b 0a 09  http_request {..
0df0: 2f 2a 2a 20 42 75 66 66 65 72 73 20 2a 2a 2f 0a  /** Buffers **/.
0e00: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69  .struct filed_fi
0e10: 6c 65 69 6e 66 6f 20 66 69 6c 65 69 6e 66 6f 3b  leinfo fileinfo;
0e20: 0a 09 63 68 61 72 20 74 6d 70 62 75 66 5b 46 49  ..char tmpbuf[FI
0e30: 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f  LED_PATH_BUFFER_
0e40: 53 49 5a 45 5d 3b 0a 0a 09 2f 2a 2a 20 48 54 54  SIZE];.../** HTT
0e50: 50 20 52 65 71 75 65 73 74 20 69 6e 66 6f 72 6d  P Request inform
0e60: 61 74 69 6f 6e 20 2a 2a 2f 0a 09 2f 2a 2a 2a 20  ation **/../*** 
0e70: 54 79 70 65 20 6f 66 20 72 65 71 75 65 73 74 20  Type of request 
0e80: 28 48 45 41 44 20 6f 72 20 47 45 54 29 20 2a 2a  (HEAD or GET) **
0e90: 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46 49 4c  */..enum {...FIL
0ea0: 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f  ED_REQUEST_METHO
0eb0: 44 5f 47 45 54 2c 0a 09 09 46 49 4c 45 44 5f 52  D_GET,...FILED_R
0ec0: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45  EQUEST_METHOD_HE
0ed0: 41 44 0a 09 7d 20 6d 65 74 68 6f 64 3b 0a 0a 09  AD..} method;...
0ee0: 2f 2a 2a 2a 20 50 61 74 68 20 62 65 69 6e 67 20  /*** Path being 
0ef0: 72 65 71 75 65 73 74 65 64 20 2a 2a 2a 2f 0a 09  requested ***/..
0f00: 63 68 61 72 20 70 61 74 68 5b 46 49 4c 45 44 5f  char path[FILED_
0f10: 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a 45  PATH_BUFFER_SIZE
0f20: 5d 3b 20 0a 0a 09 2f 2a 2a 2a 20 50 61 74 68 20  ]; .../*** Path 
0f30: 74 79 70 65 20 2a 2a 2a 2f 0a 09 65 6e 75 6d 20  type ***/..enum 
0f40: 7b 0a 09 09 46 49 4c 45 44 5f 52 45 51 55 45 53  {...FILED_REQUES
0f50: 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  T_TYPE_DIRECTORY
0f60: 2c 0a 09 09 46 49 4c 45 44 5f 52 45 51 55 45 53  ,...FILED_REQUES
0f70: 54 5f 54 59 50 45 5f 4f 54 48 45 52 0a 09 7d 20  T_TYPE_OTHER..} 
0f80: 74 79 70 65 3b 0a 0a 09 73 74 72 75 63 74 20 7b  type;...struct {
0f90: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 69  ...struct {....i
0fa0: 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09 09 6f  nt present;....o
0fb0: 66 66 5f 74 20 6f 66 66 73 65 74 3b 20 20 20 2f  ff_t offset;   /
0fc0: 2a 2a 2a 20 52 61 6e 67 65 20 73 74 61 72 74 20  *** Range start 
0fd0: 2a 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20 6c 65  ***/....off_t le
0fe0: 6e 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e  ngth;   /*** Ran
0ff0: 67 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f 0a 09  ge length ***/..
1000: 09 7d 20 72 61 6e 67 65 3b 0a 0a 09 09 73 74 72  .} range;....str
1010: 75 63 74 20 7b 0a 09 09 09 69 6e 74 20 70 72 65  uct {....int pre
1020: 73 65 6e 74 3b 0a 09 09 09 63 68 61 72 20 68 6f  sent;....char ho
1030: 73 74 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55  st[FILED_PATH_BU
1040: 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 09 09 7d 20  FFER_SIZE];...} 
1050: 68 6f 73 74 3b 0a 0a 09 09 65 6e 75 6d 20 7b 0a  host;....enum {.
1060: 09 09 09 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  ...FILED_CONNECT
1070: 49 4f 4e 5f 43 4c 4f 53 45 2c 0a 09 09 09 46 49  ION_CLOSE,....FI
1080: 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b  LED_CONNECTION_K
1090: 45 45 50 5f 41 4c 49 56 45 0a 09 09 7d 20 63 6f  EEP_ALIVE...} co
10a0: 6e 6e 65 63 74 69 6f 6e 3b 0a 09 7d 20 68 65 61  nnection;..} hea
10b0: 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c 6f 67  ders;.};../* Log
10c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72 75 63   record */.struc
10d0: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  t filed_log_entr
10e0: 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20 6f 66 20  y {../* Type of 
10f0: 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a 09 65 6e  log entry */..en
1100: 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 4c 4f 47  um {...FILED_LOG
1110: 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 2c 0a 09  _TYPE_MESSAGE,..
1120: 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f  .FILED_LOG_TYPE_
1130: 54 52 41 4e 53 46 45 52 0a 09 7d 20 74 79 70 65  TRANSFER..} type
1140: 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  ;.../* Linked li
1150: 73 74 20 68 65 61 64 2f 74 61 69 6c 20 2a 2f 0a  st head/tail */.
1160: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  .struct filed_lo
1170: 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78 74 3b 0a  g_entry *_next;.
1180: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  .struct filed_lo
1190: 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65 76 3b 0a  g_entry *_prev;.
11a0: 0a 09 2f 2a 20 54 68 72 65 61 64 20 66 72 6f 6d  ../* Thread from
11b0: 20 77 68 69 63 68 20 74 68 69 73 20 6c 6f 67 20   which this log 
11c0: 65 6e 74 72 79 20 65 6d 69 6e 61 74 65 73 20 2a  entry eminates *
11d0: 2f 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72  /..pthread_t thr
11e0: 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73 73 61 67  ead;.../* Messag
11f0: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 79 70  e buffer for typ
1200: 65 20 3d 20 4d 45 53 53 41 47 45 20 2a 2f 0a 09  e = MESSAGE */..
1210: 2f 2a 20 50 61 74 68 20 62 75 66 66 65 72 20 66  /* Path buffer f
1220: 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e 53 46  or type = TRANSF
1230: 45 52 20 2a 2f 0a 09 63 68 61 72 20 62 75 66 66  ER */..char buff
1240: 65 72 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55  er[FILED_PATH_BU
1250: 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f 2a  FFER_SIZE];.../*
1260: 20 49 74 65 6d 73 20 66 6f 72 20 74 79 70 65 20   Items for type 
1270: 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a 09 69  = TRANSFER */..i
1280: 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09 63  nt http_code;..c
1290: 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61 73 6f  onst char *reaso
12a0: 6e 3b 0a 09 74 69 6d 65 5f 74 20 73 74 61 72 74  n;..time_t start
12b0: 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74 20 65 6e  time;..time_t en
12c0: 64 74 69 6d 65 3b 0a 09 6f 66 66 5f 74 20 72 65  dtime;..off_t re
12d0: 71 5f 6f 66 66 73 65 74 3b 0a 09 6f 66 66 5f 74  q_offset;..off_t
12e0: 20 72 65 71 5f 6c 65 6e 67 74 68 3b 0a 09 6f 66   req_length;..of
12f0: 66 5f 74 20 73 65 6e 74 5f 6c 65 6e 67 74 68 3b  f_t sent_length;
1300: 0a 09 6f 66 66 5f 74 20 66 69 6c 65 5f 6c 65 6e  ..off_t file_len
1310: 67 74 68 3b 0a 09 63 68 61 72 20 69 70 5b 31 32  gth;..char ip[12
1320: 38 5d 3b 0a 09 69 6e 74 20 70 6f 72 74 3b 0a 09  8];..int port;..
1330: 69 6e 74 20 6d 65 74 68 6f 64 3b 0a 7d 3b 0a 0a  int method;.};..
1340: 2f 2a 20 47 6c 6f 62 61 6c 20 76 61 72 69 61 62  /* Global variab
1350: 6c 65 73 20 2a 2f 0a 2f 2a 2a 20 4f 70 65 6e 20  les */./** Open 
1360: 46 69 6c 65 20 63 61 63 68 65 20 2a 2a 2f 0a 73  File cache **/.s
1370: 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65  truct filed_file
1380: 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 66 69 6c 65  info *filed_file
1390: 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d 20 4e  info_fdcache = N
13a0: 55 4c 4c 3b 0a 75 6e 73 69 67 6e 65 64 20 69 6e  ULL;.unsigned in
13b0: 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  t filed_fileinfo
13c0: 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  _fdcache_size = 
13d0: 30 3b 0a 0a 2f 2a 2a 20 4c 6f 67 67 69 6e 67 20  0;../** Logging 
13e0: 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64  **/.struct filed
13f0: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66 69 6c 65  _log_entry *file
1400: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a  d_log_msg_list;.
1410: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
1420: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
1430: 73 74 5f 6d 75 74 65 78 3b 0a 70 74 68 72 65 61  st_mutex;.pthrea
1440: 64 5f 63 6f 6e 64 5f 74 20 66 69 6c 65 64 5f 6c  d_cond_t filed_l
1450: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64  og_msg_list_read
1460: 79 3b 0a 0a 2f 2a 20 53 69 67 6e 61 6c 20 48 61  y;../* Signal Ha
1470: 6e 64 6c 65 72 20 2a 2f 0a 73 74 61 74 69 63 20  ndler */.static 
1480: 76 6f 69 64 20 66 69 6c 65 64 5f 73 69 67 6e 61  void filed_signa
1490: 6c 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 73 69  l_handler(int si
14a0: 67 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a 09  gnal_number) {..
14b0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c  struct filed_fil
14c0: 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b 0a 09 75  einfo *cache;..u
14d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b  nsigned int idx;
14e0: 0a 0a 09 73 77 69 74 63 68 20 28 73 69 67 6e 61  ...switch (signa
14f0: 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 09 63 61  l_number) {...ca
1500: 73 65 20 53 49 47 48 55 50 3a 0a 09 09 09 66 6f  se SIGHUP:....fo
1510: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1520: 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  < filed_fileinfo
1530: 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 3b 20 69  _fdcache_size; i
1540: 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 61 63 68  dx++) {.....cach
1550: 65 20 3d 20 26 66 69 6c 65 64 5f 66 69 6c 65 69  e = &filed_filei
1560: 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d  nfo_fdcache[idx]
1570: 3b 0a 0a 09 09 09 09 70 74 68 72 65 61 64 5f 6d  ;......pthread_m
1580: 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65  utex_lock(&cache
1590: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 09 09 63  ->mutex);......c
15a0: 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20 3d 20  ache->path[0] = 
15b0: 27 5c 30 27 3b 0a 09 09 09 09 69 66 20 28 63 61  '\0';.....if (ca
15c0: 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a  che->fd >= 0) {.
15d0: 09 09 09 09 09 63 6c 6f 73 65 28 63 61 63 68 65  .....close(cache
15e0: 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 09 63 61 63  ->fd);.......cac
15f0: 68 65 2d 3e 66 64 20 3d 20 2d 31 3b 0a 09 09 09  he->fd = -1;....
1600: 09 7d 0a 0a 09 09 09 09 63 61 63 68 65 2d 3e 6c  .}......cache->l
1610: 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09 09 09  astmod = "";....
1620: 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d 20 22  .cache->type = "
1630: 22 3b 0a 0a 09 09 09 09 70 74 68 72 65 61 64 5f  ";......pthread_
1640: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61  mutex_unlock(&ca
1650: 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 09 09 09  che->mutex);....
1660: 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  }....break;..}..
1670: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49  .return;.}../* I
1680: 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20  nitialize cache 
1690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
16a0: 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65 28 75  led_init_cache(u
16b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68  nsigned int cach
16c0: 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e 73 69 67  e_size) {..unsig
16d0: 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 09 69 6e  ned int idx;..in
16e0: 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  t mutex_init_ret
16f0: 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20 6d 61 79  ;.../* Cache may
1700: 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e 69 74 69   not be re-initi
1710: 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66 20 28 66  alized */..if (f
1720: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1730: 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20 30 20  cache_size != 0 
1740: 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  || filed_fileinf
1750: 6f 5f 66 64 63 61 63 68 65 20 21 3d 20 4e 55 4c  o_fdcache != NUL
1760: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  L) {...return(1)
1770: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f 63 61  ;..}.../* Alloca
1780: 74 65 20 63 61 63 68 65 20 2a 2f 0a 09 66 69 6c  te cache */..fil
1790: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
17a0: 63 68 65 5f 73 69 7a 65 20 3d 20 63 61 63 68 65  che_size = cache
17b0: 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64 5f 66 69  _size;..filed_fi
17c0: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d  leinfo_fdcache =
17d0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
17e0: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
17f0: 64 63 61 63 68 65 29 20 2a 20 66 69 6c 65 64 5f  dcache) * filed_
1800: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
1810: 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 66 69 6c  _size);..if (fil
1820: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
1830: 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  che == NULL) {..
1840: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
1850: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63  ./* Initialize c
1860: 61 63 68 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a  ache entries */.
1870: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1880: 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69  dx < filed_filei
1890: 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65  nfo_fdcache_size
18a0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d 75 74  ; idx++) {...mut
18b0: 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 70 74  ex_init_ret = pt
18c0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
18d0: 28 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  (&filed_fileinfo
18e0: 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 6d 75  _fdcache[idx].mu
18f0: 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66  tex, NULL);...if
1900: 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
1910: 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   != 0) {....retu
1920: 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 66 69  rn(1);...}....fi
1930: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1940: 61 63 68 65 5b 69 64 78 5d 2e 70 61 74 68 5b 30  ache[idx].path[0
1950: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 66 69 6c 65  ] = '\0';...file
1960: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
1970: 68 65 5b 69 64 78 5d 2e 66 64 20 3d 20 2d 31 3b  he[idx].fd = -1;
1980: 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ...filed_fileinf
1990: 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 6c  o_fdcache[idx].l
19a0: 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09 09 66  astmod = "";...f
19b0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
19c0: 63 61 63 68 65 5b 69 64 78 5d 2e 74 79 70 65 20  cache[idx].type 
19d0: 3d 20 22 22 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  = "";..}...retur
19e0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  n(0);.}../* Init
19f0: 69 61 6c 69 7a 65 20 70 72 6f 63 65 73 73 20 2a  ialize process *
1a00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
1a10: 65 64 5f 69 6e 69 74 28 75 6e 73 69 67 6e 65 64  ed_init(unsigned
1a20: 20 69 6e 74 20 63 61 63 68 65 5f 73 69 7a 65 29   int cache_size)
1a30: 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 63   {..static int c
1a40: 61 6c 6c 65 64 20 3d 20 30 3b 0a 09 73 73 69 7a  alled = 0;..ssiz
1a50: 65 5f 74 20 72 65 61 64 5f 72 65 74 20 3d 20 30  e_t read_ret = 0
1a60: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
1a70: 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 3d 20 30  random_value = 0
1a80: 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 72 65 74  ;..int cache_ret
1a90: 3b 0a 09 69 6e 74 20 72 61 6e 64 6f 6d 5f 66 64  ;..int random_fd
1aa0: 3b 0a 0a 09 69 66 20 28 63 61 6c 6c 65 64 29 20  ;...if (called) 
1ab0: 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  {...return(0);..
1ac0: 7d 0a 0a 09 63 61 6c 6c 65 64 20 3d 20 31 3b 0a  }...called = 1;.
1ad0: 0a 09 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  ../* Attempt to 
1ae0: 6c 6f 63 6b 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  lock all memory 
1af0: 74 6f 20 70 68 79 73 69 63 61 6c 20 52 41 4d 20  to physical RAM 
1b00: 28 62 75 74 20 64 6f 6e 27 74 20 63 61 72 65 20  (but don't care 
1b10: 69 66 20 77 65 20 63 61 6e 27 74 29 20 2a 2f 0a  if we can't) */.
1b20: 09 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f 43 55  .mlockall(MCL_CU
1b30: 52 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55 54 55  RRENT | MCL_FUTU
1b40: 52 45 29 3b 0a 0a 09 2f 2a 20 49 67 6e 6f 72 65  RE);.../* Ignore
1b50: 20 53 49 47 50 49 50 45 20 2a 2f 0a 09 73 69 67   SIGPIPE */..sig
1b60: 6e 61 6c 28 53 49 47 50 49 50 45 2c 20 53 49 47  nal(SIGPIPE, SIG
1b70: 5f 49 47 4e 29 3b 0a 0a 09 2f 2a 20 48 61 6e 64  _IGN);.../* Hand
1b80: 6c 65 20 53 49 47 48 55 50 20 74 6f 20 72 65 6c  le SIGHUP to rel
1b90: 65 61 73 65 20 61 6c 6c 20 63 61 63 68 65 73 20  ease all caches 
1ba0: 2a 2f 0a 09 73 69 67 6e 61 6c 28 53 49 47 48 55  */..signal(SIGHU
1bb0: 50 2c 20 66 69 6c 65 64 5f 73 69 67 6e 61 6c 5f  P, filed_signal_
1bc0: 68 61 6e 64 6c 65 72 29 3b 0a 0a 09 2f 2a 20 49  handler);.../* I
1bd0: 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20  nitialize cache 
1be0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 09 63 61  structure */..ca
1bf0: 63 68 65 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  che_ret = filed_
1c00: 69 6e 69 74 5f 63 61 63 68 65 28 63 61 63 68 65  init_cache(cache
1c10: 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 63 61 63  _size);..if (cac
1c20: 68 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  he_ret != 0) {..
1c30: 09 72 65 74 75 72 6e 28 63 61 63 68 65 5f 72 65  .return(cache_re
1c40: 74 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74  t);..}.../* Init
1c50: 69 61 6c 69 7a 65 20 72 61 6e 64 6f 6d 20 6e 75  ialize random nu
1c60: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 2a  mber generator *
1c70: 2f 0a 09 72 61 6e 64 6f 6d 5f 66 64 20 3d 20 6f  /..random_fd = o
1c80: 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
1c90: 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09  m", O_RDONLY);..
1ca0: 69 66 20 28 72 61 6e 64 6f 6d 5f 66 64 20 3e 3d  if (random_fd >=
1cb0: 20 30 29 20 7b 0a 09 09 72 65 61 64 5f 72 65 74   0) {...read_ret
1cc0: 20 3d 20 72 65 61 64 28 72 61 6e 64 6f 6d 5f 66   = read(random_f
1cd0: 64 2c 20 26 72 61 6e 64 6f 6d 5f 76 61 6c 75 65  d, &random_value
1ce0: 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 5f  , sizeof(random_
1cf0: 76 61 6c 75 65 29 29 3b 0a 0a 09 09 63 6c 6f 73  value));....clos
1d00: 65 28 72 61 6e 64 6f 6d 5f 66 64 29 3b 0a 09 7d  e(random_fd);..}
1d10: 0a 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20  ...random_value 
1d20: 5e 3d 20 67 65 74 70 69 64 28 29 3b 0a 09 72 61  ^= getpid();..ra
1d30: 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 67 65  ndom_value ^= ge
1d40: 74 75 69 64 28 29 3b 0a 09 72 61 6e 64 6f 6d 5f  tuid();..random_
1d50: 76 61 6c 75 65 20 5e 3d 20 74 69 6d 65 28 4e 55  value ^= time(NU
1d60: 4c 4c 29 3b 0a 0a 09 73 72 61 6e 64 6f 6d 28 72  LL);...srandom(r
1d70: 61 6e 64 6f 6d 5f 76 61 6c 75 65 29 3b 0a 0a 09  andom_value);...
1d80: 72 65 74 75 72 6e 28 30 29 3b 0a 0a 09 2f 2a 20  return(0);.../* 
1d90: 4e 4f 54 52 45 41 43 48 3a 20 52 65 61 64 20 6d  NOTREACH: Read m
1da0: 61 79 20 66 61 69 6c 20 6f 72 20 73 75 63 63 65  ay fail or succe
1db0: 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 61 63 74  ed, we don't act
1dc0: 75 61 6c 6c 79 20 63 61 72 65 20 2a 2f 0a 09 72  ually care */..r
1dd0: 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64 5f 72  ead_ret = read_r
1de0: 65 74 3b 0a 7d 0a 0a 2f 2a 20 4c 69 73 74 65 6e  et;.}../* Listen
1df0: 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1e00: 20 61 64 64 72 65 73 73 2f 70 6f 72 74 20 2a 2f   address/port */
1e10: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
1e20: 64 5f 6c 69 73 74 65 6e 28 63 6f 6e 73 74 20 63  d_listen(const c
1e30: 68 61 72 20 2a 61 64 64 72 65 73 73 2c 20 75 6e  har *address, un
1e40: 73 69 67 6e 65 64 20 69 6e 74 20 70 6f 72 74 29  signed int port)
1e50: 20 7b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61   {..struct socka
1e60: 64 64 72 5f 69 6e 36 20 61 64 64 72 5f 76 36 3b  ddr_in6 addr_v6;
1e70: 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ..struct sockadd
1e80: 72 5f 69 6e 20 61 64 64 72 5f 76 34 3b 0a 09 73  r_in addr_v4;..s
1e90: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
1ea0: 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74  addr;..socklen_t
1eb0: 20 61 64 64 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20   addr_len;..int 
1ec0: 70 74 6f 6e 5f 72 65 74 2c 20 62 69 6e 64 5f 72  pton_ret, bind_r
1ed0: 65 74 2c 20 6c 69 73 74 65 6e 5f 72 65 74 3b 0a  et, listen_ret;.
1ee0: 09 69 6e 74 20 66 61 6d 69 6c 79 3b 0a 09 69 6e  .int family;..in
1ef0: 74 20 66 64 3b 0a 0a 09 66 61 6d 69 6c 79 20 3d  t fd;...family =
1f00: 20 41 46 5f 49 4e 45 54 36 3b 0a 09 70 74 6f 6e   AF_INET6;..pton
1f10: 5f 72 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e  _ret = inet_pton
1f20: 28 66 61 6d 69 6c 79 2c 20 61 64 64 72 65 73 73  (family, address
1f30: 2c 20 26 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f  , &addr_v6.sin6_
1f40: 61 64 64 72 2e 73 36 5f 61 64 64 72 29 3b 0a 09  addr.s6_addr);..
1f50: 69 66 20 28 70 74 6f 6e 5f 72 65 74 20 21 3d 20  if (pton_ret != 
1f60: 31 29 20 7b 0a 09 09 66 61 6d 69 6c 79 20 3d 20  1) {...family = 
1f70: 41 46 5f 49 4e 45 54 3b 0a 09 09 70 74 6f 6e 5f  AF_INET;...pton_
1f80: 72 65 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28  ret = inet_pton(
1f90: 66 61 6d 69 6c 79 2c 20 61 64 64 72 65 73 73 2c  family, address,
1fa0: 20 26 61 64 64 72 5f 76 34 2e 73 69 6e 5f 61 64   &addr_v4.sin_ad
1fb0: 64 72 2e 73 5f 61 64 64 72 29 3b 0a 09 09 69 66  dr.s_addr);...if
1fc0: 20 28 70 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29   (pton_ret != 1)
1fd0: 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29   {....return(-1)
1fe0: 3b 0a 09 09 7d 0a 0a 09 09 61 64 64 72 5f 76 34  ;...}....addr_v4
1ff0: 2e 73 69 6e 5f 66 61 6d 69 6c 79 20 3d 20 66 61  .sin_family = fa
2000: 6d 69 6c 79 3b 0a 09 09 61 64 64 72 5f 76 34 2e  mily;...addr_v4.
2010: 73 69 6e 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73  sin_port = htons
2020: 28 70 6f 72 74 29 3b 0a 0a 09 09 61 64 64 72 20  (port);....addr 
2030: 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64  = (struct sockad
2040: 64 72 20 2a 29 20 26 61 64 64 72 5f 76 34 3b 0a  dr *) &addr_v4;.
2050: 09 09 61 64 64 72 5f 6c 65 6e 20 3d 20 73 69 7a  ..addr_len = siz
2060: 65 6f 66 28 61 64 64 72 5f 76 34 29 3b 0a 09 7d  eof(addr_v4);..}
2070: 20 65 6c 73 65 20 7b 0a 09 09 61 64 64 72 5f 76   else {...addr_v
2080: 36 2e 73 69 6e 36 5f 66 61 6d 69 6c 79 20 3d 20  6.sin6_family = 
2090: 41 46 5f 49 4e 45 54 36 3b 0a 09 09 61 64 64 72  AF_INET6;...addr
20a0: 5f 76 36 2e 73 69 6e 36 5f 66 6c 6f 77 69 6e 66  _v6.sin6_flowinf
20b0: 6f 20 3d 20 30 3b 0a 09 09 61 64 64 72 5f 76 36  o = 0;...addr_v6
20c0: 2e 73 69 6e 36 5f 73 63 6f 70 65 5f 69 64 20 3d  .sin6_scope_id =
20d0: 20 30 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69   0;...addr_v6.si
20e0: 6e 36 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28  n6_port = htons(
20f0: 70 6f 72 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d  port);....addr =
2100: 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64   (struct sockadd
2110: 72 20 2a 29 20 26 61 64 64 72 5f 76 36 3b 0a 09  r *) &addr_v6;..
2120: 09 61 64 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  .addr_len = size
2130: 6f 66 28 61 64 64 72 5f 76 36 29 3b 0a 09 7d 0a  of(addr_v6);..}.
2140: 0a 09 66 64 20 3d 20 73 6f 63 6b 65 74 28 66 61  ..fd = socket(fa
2150: 6d 69 6c 79 2c 20 53 4f 43 4b 5f 53 54 52 45 41  mily, SOCK_STREA
2160: 4d 2c 20 30 29 3b 0a 09 69 66 20 28 66 64 20 3c  M, 0);..if (fd <
2170: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66   0) {...return(f
2180: 64 29 3b 0a 09 7d 0a 0a 09 62 69 6e 64 5f 72 65  d);..}...bind_re
2190: 74 20 3d 20 62 69 6e 64 28 66 64 2c 20 61 64 64  t = bind(fd, add
21a0: 72 2c 20 61 64 64 72 5f 6c 65 6e 29 3b 0a 09 69  r, addr_len);..i
21b0: 66 20 28 62 69 6e 64 5f 72 65 74 20 3c 20 30 29  f (bind_ret < 0)
21c0: 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a   {...close(fd);.
21d0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
21e0: 7d 0a 0a 09 6c 69 73 74 65 6e 5f 72 65 74 20 3d  }...listen_ret =
21f0: 20 6c 69 73 74 65 6e 28 66 64 2c 20 31 32 38 29   listen(fd, 128)
2200: 3b 0a 09 69 66 20 28 6c 69 73 74 65 6e 5f 72 65  ;..if (listen_re
2210: 74 20 21 3d 20 30 29 20 7b 0a 09 09 63 6c 6f 73  t != 0) {...clos
2220: 65 28 66 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e  e(fd);....return
2230: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  (-1);..}...retur
2240: 6e 28 66 64 29 3b 0a 7d 0a 0a 2f 2a 20 4c 6f 67  n(fd);.}../* Log
2250: 20 61 20 6d 65 73 73 61 67 65 20 2a 2f 0a 23 69   a message */.#i
2260: 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f  fdef FILED_DONT_
2270: 4c 4f 47 0a 23 20 20 64 65 66 69 6e 65 20 66 69  LOG.#  define fi
2280: 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65  led_logging_thre
2290: 61 64 5f 69 6e 69 74 28 78 29 20 30 0a 23 20 20  ad_init(x) 0.#  
22a0: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
22b0: 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e  _msg_debug(x, ..
22c0: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  .) /**/.#  defin
22d0: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  e filed_log_msg(
22e0: 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  x, ...) /**/.#  
22f0: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
2300: 5f 65 6e 74 72 79 28 78 29 20 2f 2a 2a 2f 0a 23  _entry(x) /**/.#
2310: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
2320: 6f 67 5f 69 70 28 78 2c 20 2e 2e 2e 29 20 4e 55  og_ip(x, ...) NU
2330: 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c  LL.#  define fil
2340: 65 64 5f 6c 6f 67 5f 6e 65 77 28 78 29 20 26 6c  ed_log_new(x) &l
2350: 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 0a 23  ocal_dummy_log.#
2360: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
2370: 6f 67 5f 66 72 65 65 28 78 29 20 2f 2a 2a 2f 0a  og_free(x) /**/.
2380: 0a 2f 2a 20 52 65 74 75 72 6e 20 6c 6f 67 67 69  ./* Return loggi
2390: 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 73 74 61  ng handle */.sta
23a0: 74 69 63 20 46 49 4c 45 20 2a 66 69 6c 65 64 5f  tic FILE *filed_
23b0: 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  log_open(const c
23c0: 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a 09 72 65  har *file) {..re
23d0: 74 75 72 6e 28 73 74 64 6f 75 74 29 3b 0a 09 66  turn(stdout);..f
23e0: 69 6c 65 20 3d 20 66 69 6c 65 3b 0a 7d 0a 23 65  ile = file;.}.#e
23f0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 66 69  lse.#  define fi
2400: 6c 65 64 5f 6c 6f 67 5f 66 72 65 65 28 78 29 20  led_log_free(x) 
2410: 66 72 65 65 28 78 29 0a 23 20 20 69 66 64 65 66  free(x).#  ifdef
2420: 20 46 49 4c 45 44 5f 44 45 42 55 47 0a 23 20 20   FILED_DEBUG.#  
2430: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
2440: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20  og_msg_debug(x, 
2450: 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73  ...) { fprintf(s
2460: 74 64 65 72 72 2c 20 78 2c 20 5f 5f 56 41 5f 41  tderr, x, __VA_A
2470: 52 47 53 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28  RGS__); fprintf(
2480: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66  stderr, "\n"); f
2490: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d  flush(stderr); }
24a0: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65  .#  else.#    de
24b0: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  fine filed_log_m
24c0: 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29  sg_debug(x, ...)
24d0: 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 66 0a 0a   /**/.#  endif..
24e0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6c 6f  /* Initialize lo
24f0: 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a  gging thread */.
2500: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c  static void *fil
2510: 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61  ed_logging_threa
2520: 64 28 76 6f 69 64 20 2a 61 72 67 5f 70 29 20 7b  d(void *arg_p) {
2530: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
2540: 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 61 72  ogging_thread_ar
2550: 67 73 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74  gs *arg;..struct
2560: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
2570: 20 2a 63 75 72 72 2c 20 2a 70 72 65 76 3b 0a 09   *curr, *prev;..
2580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65 74 68  const char *meth
2590: 6f 64 3b 0a 09 74 69 6d 65 5f 74 20 6e 6f 77 3b  od;..time_t now;
25a0: 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 61 72  ..FILE *fp;...ar
25b0: 67 20 3d 20 61 72 67 5f 70 3b 0a 0a 09 66 70 20  g = arg_p;...fp 
25c0: 3d 20 61 72 67 2d 3e 66 70 3b 0a 0a 09 77 68 69  = arg->fp;...whi
25d0: 6c 65 20 28 31 29 20 7b 0a 09 09 70 74 68 72 65  le (1) {...pthre
25e0: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66  ad_mutex_lock(&f
25f0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
2600: 74 5f 6d 75 74 65 78 29 3b 0a 09 09 70 74 68 72  t_mutex);...pthr
2610: 65 61 64 5f 63 6f 6e 64 5f 77 61 69 74 28 26 66  ead_cond_wait(&f
2620: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
2630: 74 5f 72 65 61 64 79 2c 20 26 66 69 6c 65 64 5f  t_ready, &filed_
2640: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74  log_msg_list_mut
2650: 65 78 29 3b 0a 0a 09 09 63 75 72 72 20 3d 20 66  ex);....curr = f
2660: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
2670: 74 3b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  t;...filed_log_m
2680: 73 67 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a  sg_list = NULL;.
2690: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
26a0: 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c  _unlock(&filed_l
26b0: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65  og_msg_list_mute
26c0: 78 29 3b 0a 0a 09 09 6e 6f 77 20 3d 20 74 69 6d  x);....now = tim
26d0: 65 28 4e 55 4c 4c 29 3b 0a 0a 09 09 70 72 65 76  e(NULL);....prev
26e0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20 28   = NULL;...for (
26f0: 3b 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 63  ; curr; curr = c
2700: 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
2710: 09 63 75 72 72 2d 3e 5f 70 72 65 76 20 3d 20 70  .curr->_prev = p
2720: 72 65 76 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20  rev;.....prev = 
2730: 63 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 63 75 72  curr;...}....cur
2740: 72 20 3d 20 70 72 65 76 3b 0a 09 09 77 68 69 6c  r = prev;...whil
2750: 65 20 28 63 75 72 72 29 20 7b 0a 09 09 09 73 77  e (curr) {....sw
2760: 69 74 63 68 20 28 63 75 72 72 2d 3e 74 79 70 65  itch (curr->type
2770: 29 20 7b 0a 09 09 09 09 63 61 73 65 20 46 49 4c  ) {.....case FIL
2780: 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53  ED_LOG_TYPE_MESS
2790: 41 47 45 3a 0a 09 09 09 09 09 66 70 72 69 6e 74  AGE:......fprint
27a0: 66 28 66 70 2c 20 22 25 73 22 2c 20 63 75 72 72  f(fp, "%s", curr
27b0: 2d 3e 62 75 66 66 65 72 29 3b 0a 0a 09 09 09 09  ->buffer);......
27c0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
27d0: 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f   FILED_LOG_TYPE_
27e0: 54 52 41 4e 53 46 45 52 3a 0a 09 09 09 09 09 73  TRANSFER:......s
27f0: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 6d 65 74  witch (curr->met
2800: 68 6f 64 29 20 7b 0a 09 09 09 09 09 09 63 61 73  hod) {.......cas
2810: 65 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  e FILED_REQUEST_
2820: 4d 45 54 48 4f 44 5f 47 45 54 3a 0a 09 09 09 09  METHOD_GET:.....
2830: 09 09 09 6d 65 74 68 6f 64 3d 22 47 45 54 22 3b  ...method="GET";
2840: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
2850: 09 09 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f  .....case FILED_
2860: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48  REQUEST_METHOD_H
2870: 45 41 44 3a 0a 09 09 09 09 09 09 09 6d 65 74 68  EAD:........meth
2880: 6f 64 3d 22 48 45 41 44 22 3b 0a 09 09 09 09 09  od="HEAD";......
2890: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 64  ..break;.......d
28a0: 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 09 6d  efault:........m
28b0: 65 74 68 6f 64 3d 22 3c 75 6e 6b 6e 6f 77 6e 3e  ethod="<unknown>
28c0: 22 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b  ";........break;
28d0: 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66  ......}.......if
28e0: 20 28 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65 20   (curr->endtime 
28f0: 3d 3d 20 28 28 74 69 6d 65 5f 74 29 20 2d 31 29  == ((time_t) -1)
2900: 29 20 7b 0a 09 09 09 09 09 09 63 75 72 72 2d 3e  ) {.......curr->
2910: 65 6e 64 74 69 6d 65 20 3d 20 6e 6f 77 3b 0a 09  endtime = now;..
2920: 09 09 09 09 7d 0a 0a 09 09 09 09 09 66 70 72 69  ....}.......fpri
2930: 6e 74 66 28 66 70 2c 20 22 54 52 41 4e 53 46 45  ntf(fp, "TRANSFE
2940: 52 20 4d 45 54 48 4f 44 3d 25 73 20 50 41 54 48  R METHOD=%s PATH
2950: 3d 25 73 20 53 52 43 3d 25 73 3a 25 69 20 54 49  =%s SRC=%s:%i TI
2960: 4d 45 2e 53 54 41 52 54 3d 25 6c 6c 75 20 54 49  ME.START=%llu TI
2970: 4d 45 2e 45 4e 44 3d 25 6c 6c 75 20 43 4f 44 45  ME.END=%llu CODE
2980: 2e 56 41 4c 55 45 3d 25 75 20 43 4f 44 45 2e 52  .VALUE=%u CODE.R
2990: 45 41 53 4f 4e 3d 25 73 20 52 45 51 55 45 53 54  EASON=%s REQUEST
29a0: 2e 4f 46 46 53 45 54 3d 25 6c 6c 75 20 52 45 51  .OFFSET=%llu REQ
29b0: 55 45 53 54 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75  UEST.LENGTH=%llu
29c0: 20 46 49 4c 45 2e 4c 45 4e 47 54 48 3d 25 6c 6c   FILE.LENGTH=%ll
29d0: 75 20 54 52 41 4e 53 46 45 52 2e 4c 45 4e 47 54  u TRANSFER.LENGT
29e0: 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 09 09 09 6d  H=%llu",.......m
29f0: 65 74 68 6f 64 2c 0a 09 09 09 09 09 09 63 75 72  ethod,.......cur
2a00: 72 2d 3e 62 75 66 66 65 72 2c 0a 09 09 09 09 09  r->buffer,......
2a10: 09 63 75 72 72 2d 3e 69 70 2c 20 63 75 72 72 2d  .curr->ip, curr-
2a20: 3e 70 6f 72 74 2c 0a 09 09 09 09 09 09 28 75 6e  >port,.......(un
2a30: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
2a40: 29 20 63 75 72 72 2d 3e 73 74 61 72 74 74 69 6d  ) curr->starttim
2a50: 65 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  e,.......(unsign
2a60: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
2a70: 72 72 2d 3e 65 6e 64 74 69 6d 65 2c 0a 09 09 09  rr->endtime,....
2a80: 09 09 09 63 75 72 72 2d 3e 68 74 74 70 5f 63 6f  ...curr->http_co
2a90: 64 65 2c 20 63 75 72 72 2d 3e 72 65 61 73 6f 6e  de, curr->reason
2aa0: 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65  ,.......(unsigne
2ab0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72  d long long) cur
2ac0: 72 2d 3e 72 65 71 5f 6f 66 66 73 65 74 2c 0a 09  r->req_offset,..
2ad0: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
2ae0: 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e  ong long) curr->
2af0: 72 65 71 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 09  req_length,.....
2b00: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
2b10: 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 66 69 6c   long) curr->fil
2b20: 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 09 09 09  e_length,.......
2b30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2b40: 6f 6e 67 29 20 63 75 72 72 2d 3e 73 65 6e 74 5f  ong) curr->sent_
2b50: 6c 65 6e 67 74 68 0a 09 09 09 09 09 29 3b 0a 0a  length......);..
2b60: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
2b70: 0a 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20  ....fprintf(fp, 
2b80: 22 20 54 48 52 45 41 44 3d 25 6c 6c 75 20 54 49  " THREAD=%llu TI
2b90: 4d 45 3d 25 6c 6c 75 5c 6e 22 2c 0a 09 09 09 09  ME=%llu\n",.....
2ba0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2bb0: 6f 6e 67 29 20 63 75 72 72 2d 3e 74 68 72 65 61  ong) curr->threa
2bc0: 64 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64  d,.....(unsigned
2bd0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 6e 6f 77 0a   long long) now.
2be0: 09 09 09 29 3b 0a 09 09 09 66 66 6c 75 73 68 28  ...);....fflush(
2bf0: 66 70 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20  fp);.....prev = 
2c00: 63 75 72 72 3b 0a 09 09 09 63 75 72 72 20 3d 20  curr;....curr = 
2c10: 63 75 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09  curr->_prev;....
2c20: 09 66 72 65 65 28 70 72 65 76 29 3b 0a 09 09 7d  .free(prev);...}
2c30: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c  ..}...return(NUL
2c40: 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  L);.}..static vo
2c50: 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  id filed_log_ent
2c60: 72 79 28 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ry(struct filed_
2c70: 6c 6f 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79  log_entry *entry
2c80: 29 20 7b 0a 09 65 6e 74 72 79 2d 3e 74 68 72 65  ) {..entry->thre
2c90: 61 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  ad = pthread_sel
2ca0: 66 28 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d  f();...pthread_m
2cb0: 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64  utex_lock(&filed
2cc0: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
2cd0: 74 65 78 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f  tex);...entry->_
2ce0: 6e 65 78 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67  next = filed_log
2cf0: 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 66 69 6c 65  _msg_list;..file
2d00: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d  d_log_msg_list =
2d10: 20 65 6e 74 72 79 3b 0a 0a 09 70 74 68 72 65 61   entry;...pthrea
2d20: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
2d30: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
2d40: 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 70 74 68  st_mutex);...pth
2d50: 72 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c  read_cond_signal
2d60: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
2d70: 6c 69 73 74 5f 72 65 61 64 79 29 3b 0a 0a 09 72  list_ready);...r
2d80: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
2d90: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f   struct filed_lo
2da0: 67 5f 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c  g_entry *filed_l
2db0: 6f 67 5f 6e 65 77 28 69 6e 74 20 69 6e 69 74 69  og_new(int initi
2dc0: 61 6c 69 7a 65 29 20 7b 0a 09 73 74 72 75 63 74  alize) {..struct
2dd0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
2de0: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
2df0: 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  al = malloc(size
2e00: 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09  of(*retval));...
2e10: 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 29 20  if (initialize) 
2e20: 7b 0a 09 09 72 65 74 76 61 6c 2d 3e 62 75 66 66  {...retval->buff
2e30: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  er[0] = '\0';...
2e40: 72 65 74 76 61 6c 2d 3e 68 74 74 70 5f 63 6f 64  retval->http_cod
2e50: 65 20 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c  e = -1;...retval
2e60: 2d 3e 73 74 61 72 74 74 69 6d 65 20 3d 20 30 3b  ->starttime = 0;
2e70: 0a 09 09 72 65 74 76 61 6c 2d 3e 65 6e 64 74 69  ...retval->endti
2e80: 6d 65 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c  me = 0;...retval
2e90: 2d 3e 72 65 71 5f 6f 66 66 73 65 74 20 3d 20 30  ->req_offset = 0
2ea0: 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65 71 5f  ;...retval->req_
2eb0: 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72 65  length = 0;...re
2ec0: 74 76 61 6c 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74  tval->sent_lengt
2ed0: 68 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d  h = 0;...retval-
2ee0: 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 30  >file_length = 0
2ef0: 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 69 70 5b 30  ;...retval->ip[0
2f00: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65 74 76  ] = '\0';...retv
2f10: 61 6c 2d 3e 70 6f 72 74 20 3d 20 2d 31 3b 0a 09  al->port = -1;..
2f20: 09 72 65 74 76 61 6c 2d 3e 6d 65 74 68 6f 64 20  .retval->method 
2f30: 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  = -1;..}...retur
2f40: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
2f50: 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f  atic void filed_
2f60: 6c 6f 67 5f 6d 73 67 28 63 6f 6e 73 74 20 63 68  log_msg(const ch
2f70: 61 72 20 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a  ar *fmt, ...) {.
2f80: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  .struct filed_lo
2f90: 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a  g_entry *entry;.
2fa0: 09 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a 0a  .va_list args;..
2fb0: 09 65 6e 74 72 79 20 3d 20 66 69 6c 65 64 5f 6c  .entry = filed_l
2fc0: 6f 67 5f 6e 65 77 28 30 29 3b 0a 0a 09 76 61 5f  og_new(0);...va_
2fd0: 73 74 61 72 74 28 61 72 67 73 2c 20 66 6d 74 29  start(args, fmt)
2fe0: 3b 0a 0a 09 76 73 6e 70 72 69 6e 74 66 28 65 6e  ;...vsnprintf(en
2ff0: 74 72 79 2d 3e 62 75 66 66 65 72 2c 20 73 69 7a  try->buffer, siz
3000: 65 6f 66 28 65 6e 74 72 79 2d 3e 62 75 66 66 65  eof(entry->buffe
3010: 72 29 2c 20 66 6d 74 2c 20 61 72 67 73 29 3b 0a  r), fmt, args);.
3020: 0a 09 76 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a  ..va_end(args);.
3030: 0a 09 65 6e 74 72 79 2d 3e 74 79 70 65 20 3d 20  ..entry->type = 
3040: 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d  FILED_LOG_TYPE_M
3050: 45 53 53 41 47 45 3b 0a 0a 09 66 69 6c 65 64 5f  ESSAGE;...filed_
3060: 6c 6f 67 5f 65 6e 74 72 79 28 65 6e 74 72 79 29  log_entry(entry)
3070: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73  ;...return;.}..s
3080: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3090: 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 73   *filed_log_ip(s
30a0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
30b0: 61 64 64 72 2c 20 63 68 61 72 20 2a 62 75 66 66  addr, char *buff
30c0: 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65  er, size_t buffe
30d0: 72 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20  rlen) {..struct 
30e0: 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 61 64 64  sockaddr_in *add
30f0: 72 5f 76 34 3b 0a 09 73 74 72 75 63 74 20 73 6f  r_v4;..struct so
3100: 63 6b 61 64 64 72 5f 69 6e 36 20 2a 61 64 64 72  ckaddr_in6 *addr
3110: 5f 76 36 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72  _v6;..const char
3120: 20 2a 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b   *retval = NULL;
3130: 0a 0a 09 61 64 64 72 5f 76 36 20 3d 20 28 73 74  ...addr_v6 = (st
3140: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
3150: 36 20 2a 29 20 61 64 64 72 3b 0a 0a 09 73 77 69  6 *) addr;...swi
3160: 74 63 68 20 28 61 64 64 72 5f 76 36 2d 3e 73 69  tch (addr_v6->si
3170: 6e 36 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 63  n6_family) {...c
3180: 61 73 65 20 41 46 5f 49 4e 45 54 3a 0a 09 09 09  ase AF_INET:....
3190: 61 64 64 72 5f 76 34 20 3d 20 28 73 74 72 75 63  addr_v4 = (struc
31a0: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 29  t sockaddr_in *)
31b0: 20 61 64 64 72 3b 0a 09 09 09 72 65 74 76 61 6c   addr;....retval
31c0: 20 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f   = inet_ntop(AF_
31d0: 49 4e 45 54 2c 20 26 61 64 64 72 5f 76 34 2d 3e  INET, &addr_v4->
31e0: 73 69 6e 5f 61 64 64 72 2c 20 62 75 66 66 65 72  sin_addr, buffer
31f0: 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09  , bufferlen);...
3200: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41  .break;...case A
3210: 46 5f 49 4e 45 54 36 3a 0a 09 09 09 72 65 74 76  F_INET6:....retv
3220: 61 6c 20 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41  al = inet_ntop(A
3230: 46 5f 49 4e 45 54 36 2c 20 26 61 64 64 72 5f 76  F_INET6, &addr_v
3240: 36 2d 3e 73 69 6e 36 5f 61 64 64 72 2c 20 62 75  6->sin6_addr, bu
3250: 66 66 65 72 2c 20 62 75 66 66 65 72 6c 65 6e 29  ffer, bufferlen)
3260: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
3270: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
3280: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20  .}..static FILE 
3290: 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28  *filed_log_open(
32a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
32b0: 29 20 7b 0a 09 46 49 4c 45 20 2a 72 65 74 76 61  ) {..FILE *retva
32c0: 6c 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28  l;...if (strcmp(
32d0: 66 69 6c 65 2c 20 22 2d 22 29 20 3d 3d 20 30 29  file, "-") == 0)
32e0: 20 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20 73 74   {...retval = st
32f0: 64 6f 75 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66  dout;..} else if
3300: 20 28 66 69 6c 65 5b 30 5d 20 3d 3d 20 27 7c 27   (file[0] == '|'
3310: 29 20 7b 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09 09  ) {...file++;...
3320: 72 65 74 76 61 6c 20 3d 20 70 6f 70 65 6e 28 66  retval = popen(f
3330: 69 6c 65 2c 20 22 77 22 29 3b 0a 09 7d 20 65 6c  ile, "w");..} el
3340: 73 65 20 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20  se {...retval = 
3350: 66 6f 70 65 6e 28 66 69 6c 65 2c 20 22 61 2b 22  fopen(file, "a+"
3360: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  );..}...return(r
3370: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
3380: 63 20 69 6e 74 20 66 69 6c 65 64 5f 6c 6f 67 67  c int filed_logg
3390: 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28  ing_thread_init(
33a0: 46 49 4c 45 20 2a 6c 6f 67 66 70 29 20 7b 0a 09  FILE *logfp) {..
33b0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
33c0: 67 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73  ging_thread_args
33d0: 20 2a 61 72 67 73 3b 0a 09 70 74 68 72 65 61 64   *args;..pthread
33e0: 5f 74 20 74 68 72 65 61 64 5f 69 64 3b 0a 0a 09  _t thread_id;...
33f0: 61 72 67 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  args = malloc(si
3400: 7a 65 6f 66 28 2a 61 72 67 73 29 29 3b 0a 09 61  zeof(*args));..a
3410: 72 67 73 2d 3e 66 70 20 3d 20 6c 6f 67 66 70 3b  rgs->fp = logfp;
3420: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
3430: 5f 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _list = NULL;...
3440: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
3450: 69 74 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  it(&filed_log_ms
3460: 67 5f 6c 69 73 74 5f 6d 75 74 65 78 2c 20 4e 55  g_list_mutex, NU
3470: 4c 4c 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63  LL);...pthread_c
3480: 72 65 61 74 65 28 26 74 68 72 65 61 64 5f 69 64  reate(&thread_id
3490: 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f  , NULL, filed_lo
34a0: 67 67 69 6e 67 5f 74 68 72 65 61 64 2c 20 61 72  gging_thread, ar
34b0: 67 73 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  gs);...filed_log
34c0: 5f 6d 73 67 28 22 53 54 41 52 54 22 29 3b 0a 0a  _msg("START");..
34d0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 65  .return(0);.}.#e
34e0: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 6d 61 74 20  ndif../* Format 
34f0: 74 69 6d 65 20 70 65 72 20 52 46 43 32 36 31 36  time per RFC2616
3500: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
3510: 2a 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69  *filed_format_ti
3520: 6d 65 28 63 68 61 72 20 2a 62 75 66 66 65 72 2c  me(char *buffer,
3530: 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c   size_t buffer_l
3540: 65 6e 2c 20 63 6f 6e 73 74 20 74 69 6d 65 5f 74  en, const time_t
3550: 20 74 69 6d 65 69 6e 66 6f 29 20 7b 0a 09 73 74   timeinfo) {..st
3560: 72 75 63 74 20 74 6d 20 74 69 6d 65 69 6e 66 6f  ruct tm timeinfo
3570: 5f 74 6d 2c 20 2a 74 69 6d 65 69 6e 66 6f 5f 74  _tm, *timeinfo_t
3580: 6d 5f 70 3b 0a 0a 09 74 69 6d 65 69 6e 66 6f 5f  m_p;...timeinfo_
3590: 74 6d 5f 70 20 3d 20 67 6d 74 69 6d 65 5f 72 28  tm_p = gmtime_r(
35a0: 26 74 69 6d 65 69 6e 66 6f 2c 20 26 74 69 6d 65  &timeinfo, &time
35b0: 69 6e 66 6f 5f 74 6d 29 3b 0a 09 69 66 20 28 74  info_tm);..if (t
35c0: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 3d 20  imeinfo_tm_p == 
35d0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
35e0: 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a 09 7d 0a  ("unknown");..}.
35f0: 0a 09 62 75 66 66 65 72 5b 62 75 66 66 65 72 5f  ..buffer[buffer_
3600: 6c 65 6e 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  len - 1] = '\0';
3610: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73  ..buffer_len = s
3620: 74 72 66 74 69 6d 65 28 62 75 66 66 65 72 2c 20  trftime(buffer, 
3630: 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31 2c 20  buffer_len - 1, 
3640: 22 25 61 2c 20 25 64 20 25 62 20 25 59 20 25 48  "%a, %d %b %Y %H
3650: 3a 25 4d 3a 25 53 20 47 4d 54 22 2c 20 74 69 6d  :%M:%S GMT", tim
3660: 65 69 6e 66 6f 5f 74 6d 5f 70 29 3b 0a 0a 09 72  einfo_tm_p);...r
3670: 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b 0a 7d  eturn(buffer);.}
3680: 0a 0a 2f 2a 20 68 61 73 68 20 2a 2f 0a 73 74 61  ../* hash */.sta
3690: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
36a0: 20 66 69 6c 65 64 5f 68 61 73 68 28 63 6f 6e 73   filed_hash(cons
36b0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
36c0: 2a 76 61 6c 75 65 2c 20 75 6e 73 69 67 6e 65 64  *value, unsigned
36d0: 20 69 6e 74 20 6d 6f 64 75 6c 75 73 29 20 7b 0a   int modulus) {.
36e0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
36f0: 75 72 72 2c 20 70 72 65 76 3b 0a 09 69 6e 74 20  urr, prev;..int 
3700: 64 69 66 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  diff;..unsigned 
3710: 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09 72 65  int retval;...re
3720: 74 76 61 6c 20 3d 20 6d 6f 64 75 6c 75 73 20 2d  tval = modulus -
3730: 20 31 3b 0a 09 70 72 65 76 20 3d 20 6d 6f 64 75   1;..prev = modu
3740: 6c 75 73 20 25 20 32 35 35 3b 0a 0a 09 77 68 69  lus % 255;...whi
3750: 6c 65 20 28 28 63 75 72 72 20 3d 20 2a 76 61 6c  le ((curr = *val
3760: 75 65 29 29 20 7b 0a 09 09 69 66 20 28 63 75 72  ue)) {...if (cur
3770: 72 20 3c 20 33 32 29 20 7b 0a 09 09 09 63 75 72  r < 32) {....cur
3780: 72 20 3d 20 32 35 35 20 2d 20 63 75 72 72 3b 0a  r = 255 - curr;.
3790: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 75  ..} else {....cu
37a0: 72 72 20 2d 3d 20 33 32 3b 0a 09 09 7d 0a 0a 09  rr -= 32;...}...
37b0: 09 69 66 20 28 70 72 65 76 20 3c 20 63 75 72 72  .if (prev < curr
37c0: 29 20 7b 0a 09 09 09 64 69 66 66 20 3d 20 63 75  ) {....diff = cu
37d0: 72 72 20 2d 20 70 72 65 76 3b 0a 09 09 7d 20 65  rr - prev;...} e
37e0: 6c 73 65 20 7b 0a 09 09 09 64 69 66 66 20 3d 20  lse {....diff = 
37f0: 70 72 65 76 20 2d 20 63 75 72 72 3b 0a 09 09 7d  prev - curr;...}
3800: 0a 0a 09 09 70 72 65 76 20 3d 20 63 75 72 72 3b  ....prev = curr;
3810: 0a 0a 09 09 72 65 74 76 61 6c 20 3c 3c 3d 20 33  ....retval <<= 3
3820: 3b 0a 09 09 72 65 74 76 61 6c 20 26 3d 20 30 78  ;...retval &= 0x
3830: 46 46 46 46 46 46 46 46 4c 55 3b 0a 09 09 72 65  FFFFFFFFLU;...re
3840: 74 76 61 6c 20 5e 3d 20 64 69 66 66 3b 0a 0a 09  tval ^= diff;...
3850: 09 76 61 6c 75 65 2b 2b 3b 0a 09 7d 0a 0a 09 72  .value++;..}...r
3860: 65 74 76 61 6c 20 3d 20 72 65 74 76 61 6c 20 25  etval = retval %
3870: 20 6d 6f 64 75 6c 75 73 3b 0a 0a 09 72 65 74 75   modulus;...retu
3880: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
3890: 2a 20 46 69 6e 64 20 61 20 6d 69 6d 65 2d 74 79  * Find a mime-ty
38a0: 70 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  pe based on the 
38b0: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74  filename */.stat
38c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  ic const char *f
38d0: 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65 5f 6d  iled_determine_m
38e0: 69 6d 65 74 79 70 65 28 63 6f 6e 73 74 20 63 68  imetype(const ch
38f0: 61 72 20 2a 70 61 74 68 29 20 7b 0a 09 63 6f 6e  ar *path) {..con
3900: 73 74 20 63 68 61 72 20 2a 70 3b 0a 0a 09 70 20  st char *p;...p 
3910: 3d 20 73 74 72 72 63 68 72 28 70 61 74 68 2c 20  = strrchr(path, 
3920: 27 2e 27 29 3b 0a 09 69 66 20 28 70 20 3d 3d 20  '.');..if (p == 
3930: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
3940: 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54  (FILED_DEFAULT_T
3950: 59 50 45 29 3b 0a 09 7d 0a 0a 09 70 2b 2b 3b 0a  YPE);..}...p++;.
3960: 09 69 66 20 28 2a 70 20 3d 3d 20 27 5c 30 27 29  .if (*p == '\0')
3970: 20 7b 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45   {...return(FILE
3980: 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 29 3b  D_DEFAULT_TYPE);
3990: 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  ..}...filed_log_
39a0: 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f 6f 6b 69  msg_debug("Looki
39b0: 6e 67 20 75 70 20 4d 49 4d 45 20 74 79 70 65 20  ng up MIME type 
39c0: 66 6f 72 20 25 73 20 28 68 61 73 68 20 3d 20 25  for %s (hash = %
39d0: 6c 6c 75 29 22 2c 20 70 2c 20 28 75 6e 73 69 67  llu)", p, (unsig
39e0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66  ned long long) f
39f0: 69 6c 65 64 5f 68 61 73 68 28 28 63 6f 6e 73 74  iled_hash((const
3a00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3a10: 29 20 70 2c 20 31 36 37 37 37 32 35 39 29 29 3b  ) p, 16777259));
3a20: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 69 6c 65  ..#include "file
3a30: 64 2d 6d 69 6d 65 2d 74 79 70 65 73 2e 68 22 0a  d-mime-types.h".
3a40: 0a 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44  ..return(FILED_D
3a50: 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 7d 0a  EFAULT_TYPE);.}.
3a60: 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 75  ./* Generate a u
3a70: 6e 69 71 75 65 20 69 64 65 6e 74 69 66 69 65 72  nique identifier
3a80: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
3a90: 66 69 6c 65 64 5f 67 65 6e 65 72 61 74 65 5f 65  filed_generate_e
3aa0: 74 61 67 28 63 68 61 72 20 2a 65 74 61 67 2c 20  tag(char *etag, 
3ab0: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 29 20 7b  size_t length) {
3ac0: 0a 09 73 6e 70 72 69 6e 74 66 28 65 74 61 67 2c  ..snprintf(etag,
3ad0: 20 6c 65 6e 67 74 68 2c 20 22 25 6c 6c 78 2d 25   length, "%llx-%
3ae0: 6c 6c 78 25 6c 6c 78 25 6c 6c 78 25 6c 6c 78 22  llx%llx%llx%llx"
3af0: 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ,...(unsigned lo
3b00: 6e 67 20 6c 6f 6e 67 29 20 74 69 6d 65 28 4e 55  ng long) time(NU
3b10: 4c 4c 29 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64  LL),...(unsigned
3b20: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64   long long) rand
3b30: 6f 6d 28 29 2c 0a 09 09 28 75 6e 73 69 67 6e 65  om(),...(unsigne
3b40: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e  d long long) ran
3b50: 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73 69 67 6e  dom(),...(unsign
3b60: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61  ed long long) ra
3b70: 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e 73 69 67  ndom(),...(unsig
3b80: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
3b90: 61 6e 64 6f 6d 28 29 0a 09 29 3b 0a 7d 0a 0a 2f  andom()..);.}../
3ba0: 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 61 6e  * Open a file an
3bb0: 64 20 72 65 74 75 72 6e 20 66 69 6c 65 20 69 6e  d return file in
3bc0: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  formation */.sta
3bd0: 74 69 63 20 73 74 72 75 63 74 20 66 69 6c 65 64  tic struct filed
3be0: 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 64  _fileinfo *filed
3bf0: 5f 6f 70 65 6e 5f 66 69 6c 65 28 63 6f 6e 73 74  _open_file(const
3c00: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72   char *path, str
3c10: 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  uct filed_filein
3c20: 66 6f 20 2a 62 75 66 66 65 72 29 20 7b 0a 09 73  fo *buffer) {..s
3c30: 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65  truct filed_file
3c40: 69 6e 66 6f 20 2a 63 61 63 68 65 3b 0a 09 75 6e  info *cache;..un
3c50: 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65  signed int cache
3c60: 5f 69 64 78 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e  _idx;..off_t len
3c70: 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 63 61 63  ;..int fd;...cac
3c80: 68 65 5f 69 64 78 20 3d 20 66 69 6c 65 64 5f 68  he_idx = filed_h
3c90: 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67  ash((const unsig
3ca0: 6e 65 64 20 63 68 61 72 20 2a 29 20 70 61 74 68  ned char *) path
3cb0: 2c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  , filed_fileinfo
3cc0: 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  _fdcache_size);.
3cd0: 0a 09 63 61 63 68 65 20 3d 20 26 66 69 6c 65 64  ..cache = &filed
3ce0: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
3cf0: 65 5b 63 61 63 68 65 5f 69 64 78 5d 3b 0a 0a 09  e[cache_idx];...
3d00: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
3d10: 62 75 67 28 22 4c 6f 63 6b 69 6e 67 20 6d 75 74  bug("Locking mut
3d20: 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c 75 22  ex for idx: %lu"
3d30: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
3d40: 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a 0a 09  ) cache_idx);...
3d50: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
3d60: 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78  ck(&cache->mutex
3d70: 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  );...filed_log_m
3d80: 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 6c 65  sg_debug("Comple
3d90: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6d 75 74 65  ted locking mute
3da0: 78 20 66 6f 72 20 69 64 78 3a 20 25 6c 75 22 2c  x for idx: %lu",
3db0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
3dc0: 20 63 61 63 68 65 5f 69 64 78 29 3b 0a 0a 09 69   cache_idx);...i
3dd0: 66 20 28 73 74 72 63 6d 70 28 70 61 74 68 2c 20  f (strcmp(path, 
3de0: 63 61 63 68 65 2d 3e 70 61 74 68 29 20 21 3d 20  cache->path) != 
3df0: 30 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  0) {...filed_log
3e00: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 61 63 68  _msg_debug("Cach
3e10: 65 20 6d 69 73 73 20 66 6f 72 20 69 64 78 3a 20  e miss for idx: 
3e20: 25 6c 75 3a 20 4f 4c 44 20 5c 22 25 73 5c 22 2c  %lu: OLD \"%s\",
3e30: 20 4e 45 57 20 5c 22 25 73 5c 22 22 2c 20 28 75   NEW \"%s\"", (u
3e40: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
3e50: 63 68 65 5f 69 64 78 2c 20 63 61 63 68 65 2d 3e  che_idx, cache->
3e60: 70 61 74 68 2c 20 70 61 74 68 29 3b 0a 0a 09 09  path, path);....
3e70: 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
3e80: 4f 5f 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52  O_RDONLY | O_LAR
3e90: 47 45 46 49 4c 45 29 3b 0a 09 09 69 66 20 28 66  GEFILE);...if (f
3ea0: 64 20 3c 20 30 29 20 7b 0a 09 09 09 70 74 68 72  d < 0) {....pthr
3eb0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
3ec0: 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b  (&cache->mutex);
3ed0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
3ee0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61  );...}....if (ca
3ef0: 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a  che->fd >= 0) {.
3f00: 09 09 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e  ...close(cache->
3f10: 66 64 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20  fd);...}....len 
3f20: 3d 20 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53  = lseek(fd, 0, S
3f30: 45 45 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65  EEK_END);...lsee
3f40: 6b 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45  k(fd, 0, SEEK_SE
3f50: 54 29 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64  T);....cache->fd
3f60: 20 3d 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e   = fd;...cache->
3f70: 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73 74 72  len = len;...str
3f80: 63 70 79 28 63 61 63 68 65 2d 3e 70 61 74 68 2c  cpy(cache->path,
3f90: 20 70 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d   path);...cache-
3fa0: 3e 74 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65  >type = filed_de
3fb0: 74 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65  termine_mimetype
3fc0: 28 70 61 74 68 29 3b 0a 09 09 66 69 6c 65 64 5f  (path);...filed_
3fd0: 67 65 6e 65 72 61 74 65 5f 65 74 61 67 28 63 61  generate_etag(ca
3fe0: 63 68 65 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f  che->etag, sizeo
3ff0: 66 28 63 61 63 68 65 2d 3e 65 74 61 67 29 29 3b  f(cache->etag));
4000: 0a 0a 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a  ..../* XXX:TODO:
4010: 20 44 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09 09   Determine */...
4020: 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d  cache->lastmod =
4030: 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69   filed_format_ti
4040: 6d 65 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  me(cache->lastmo
4050: 64 5f 62 2c 20 73 69 7a 65 6f 66 28 63 61 63 68  d_b, sizeof(cach
4060: 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20 74  e->lastmod_b), t
4070: 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29 3b  ime(NULL) - 30);
4080: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69 6c  ..} else {...fil
4090: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
40a0: 28 22 43 61 63 68 65 20 68 69 74 20 66 6f 72 20  ("Cache hit for 
40b0: 69 64 78 3a 20 25 6c 75 3a 20 50 41 54 48 20 5c  idx: %lu: PATH \
40c0: 22 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65  "%s\"", (unsigne
40d0: 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64  d long) cache_id
40e0: 78 2c 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 2f  x, path);..}.../
40f0: 2a 0a 09 20 2a 20 57 65 20 68 61 76 65 20 74 6f  *.. * We have to
4100: 20 6d 61 6b 65 20 61 20 64 75 70 6c 69 63 61 74   make a duplicat
4110: 65 20 46 44 2c 20 62 65 63 61 75 73 65 20 6f 6e  e FD, because on
4120: 63 65 20 77 65 20 72 65 6c 65 61 73 65 20 74 68  ce we release th
4130: 65 20 63 61 63 68 65 0a 09 20 2a 20 6d 75 74 65  e cache.. * mute
4140: 78 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  x, the file desc
4150: 72 69 70 74 6f 72 20 6d 61 79 20 62 65 20 63 6c  riptor may be cl
4160: 6f 73 65 64 0a 09 20 2a 2f 0a 09 66 64 20 3d 20  osed.. */..fd = 
4170: 64 75 70 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a  dup(cache->fd);.
4180: 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09  .if (fd < 0) {..
4190: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  .pthread_mutex_u
41a0: 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75  nlock(&cache->mu
41b0: 74 65 78 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tex);....return(
41c0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66  NULL);..}...buff
41d0: 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 62 75  er->fd = fd;..bu
41e0: 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63 61 63 68  ffer->len = cach
41f0: 65 2d 3e 6c 65 6e 3b 0a 09 62 75 66 66 65 72 2d  e->len;..buffer-
4200: 3e 74 79 70 65 20 3d 20 63 61 63 68 65 2d 3e 74  >type = cache->t
4210: 79 70 65 3b 0a 09 6d 65 6d 63 70 79 28 62 75 66  ype;..memcpy(buf
4220: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20  fer->lastmod_b, 
4230: 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62  cache->lastmod_b
4240: 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 2d  , sizeof(buffer-
4250: 3e 6c 61 73 74 6d 6f 64 5f 62 29 29 3b 0a 09 6d  >lastmod_b));..m
4260: 65 6d 63 70 79 28 62 75 66 66 65 72 2d 3e 65 74  emcpy(buffer->et
4270: 61 67 2c 20 63 61 63 68 65 2d 3e 65 74 61 67 2c  ag, cache->etag,
4280: 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 2d 3e   sizeof(buffer->
4290: 65 74 61 67 29 29 3b 0a 09 62 75 66 66 65 72 2d  etag));..buffer-
42a0: 3e 6c 61 73 74 6d 6f 64 20 3d 20 62 75 66 66 65  >lastmod = buffe
42b0: 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 20 2b 20 28  r->lastmod_b + (
42c0: 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 2d  cache->lastmod -
42d0: 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f   cache->lastmod_
42e0: 62 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75  b);...pthread_mu
42f0: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68  tex_unlock(&cach
4300: 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 72 65 74  e->mutex);...ret
4310: 75 72 6e 28 62 75 66 66 65 72 29 3b 0a 7d 0a 0a  urn(buffer);.}..
4320: 2f 2a 20 50 72 6f 63 65 73 73 20 61 6e 20 48 54  /* Process an HT
4330: 54 50 20 72 65 71 75 65 73 74 20 61 6e 64 20 72  TP request and r
4340: 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 20 72  eturn the path r
4350: 65 71 75 65 73 74 65 64 20 2a 2f 0a 73 74 61 74  equested */.stat
4360: 69 63 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ic struct filed_
4370: 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a 66 69  http_request *fi
4380: 6c 65 64 5f 67 65 74 5f 68 74 74 70 5f 72 65 71  led_get_http_req
4390: 75 65 73 74 28 46 49 4c 45 20 2a 66 70 2c 20 73  uest(FILE *fp, s
43a0: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
43b0: 5f 72 65 71 75 65 73 74 20 2a 62 75 66 66 65 72  _request *buffer
43c0: 5f 73 74 2c 20 73 74 72 75 63 74 20 66 69 6c 65  _st, struct file
43d0: 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f  d_options *optio
43e0: 6e 73 29 20 7b 0a 09 63 68 61 72 20 2a 6d 65 74  ns) {..char *met
43f0: 68 6f 64 2c 20 2a 70 61 74 68 3b 0a 09 63 68 61  hod, *path;..cha
4400: 72 20 2a 62 75 66 66 65 72 2c 20 2a 77 6f 72 6b  r *buffer, *work
4410: 62 75 66 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66  buffer, *workbuf
4420: 66 65 72 5f 6e 65 78 74 3b 0a 09 63 68 61 72 20  fer_next;..char 
4430: 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 73 69 7a  *fgets_ret;..siz
4440: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
4450: 70 61 74 68 5f 6c 65 6e 3b 0a 09 6f 66 66 5f 74  path_len;..off_t
4460: 20 72 61 6e 67 65 5f 73 74 61 72 74 2c 20 72 61   range_start, ra
4470: 6e 67 65 5f 65 6e 64 2c 20 72 61 6e 67 65 5f 6c  nge_end, range_l
4480: 65 6e 67 74 68 3b 0a 09 69 6e 74 20 72 61 6e 67  ength;..int rang
4490: 65 5f 72 65 71 75 65 73 74 3b 0a 09 69 6e 74 20  e_request;..int 
44a0: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 0a 09 69  snprintf_ret;..i
44b0: 6e 74 20 69 3b 0a 0a 09 2f 2a 20 53 65 74 20 74  nt i;.../* Set t
44c0: 6f 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  o default values
44d0: 20 2a 2f 0a 09 72 61 6e 67 65 5f 73 74 61 72 74   */..range_start
44e0: 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 65 6e 64   = 0;..range_end
44f0: 20 20 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 72     = 0;..range_r
4500: 65 71 75 65 73 74 20 3d 20 30 3b 0a 09 72 61 6e  equest = 0;..ran
4510: 67 65 5f 6c 65 6e 67 74 68 20 3d 20 2d 31 3b 0a  ge_length = -1;.
4520: 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64  .buffer_st->head
4530: 65 72 73 2e 68 6f 73 74 2e 70 72 65 73 65 6e 74  ers.host.present
4540: 20 3d 20 30 3b 0a 09 62 75 66 66 65 72 5f 73 74   = 0;..buffer_st
4550: 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63  ->headers.connec
4560: 74 69 6f 6e 20 3d 20 46 49 4c 45 44 5f 43 4f 4e  tion = FILED_CON
4570: 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 3b 0a 0a  NECTION_CLOSE;..
4580: 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  .buffer = buffer
4590: 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 62 75  _st->tmpbuf;..bu
45a0: 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  ffer_len = sizeo
45b0: 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70  f(buffer_st->tmp
45c0: 62 75 66 29 3b 0a 0a 09 66 67 65 74 73 5f 72 65  buf);...fgets_re
45d0: 74 20 3d 20 66 67 65 74 73 28 62 75 66 66 65 72  t = fgets(buffer
45e0: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70  , buffer_len, fp
45f0: 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f 72 65  );..if (fgets_re
4600: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
4610: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
4620: 0a 09 6d 65 74 68 6f 64 20 3d 20 62 75 66 66 65  ..method = buffe
4630: 72 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 73 74  r;...buffer = st
4640: 72 63 68 72 28 62 75 66 66 65 72 2c 20 27 20 27  rchr(buffer, ' '
4650: 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20 3d  );..if (buffer =
4660: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
4670: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a  rn(NULL);..}...*
4680: 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09  buffer = '\0';..
4690: 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 70 61 74 68  buffer++;...path
46a0: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 2f 2a 20   = buffer;.../* 
46b0: 54 65 72 6d 69 6e 61 74 65 20 70 61 74 68 20 63  Terminate path c
46c0: 6f 6d 70 6f 6e 65 6e 74 20 2a 2f 0a 09 62 75 66  omponent */..buf
46d0: 66 65 72 20 3d 20 73 74 72 70 62 72 6b 28 70 61  fer = strpbrk(pa
46e0: 74 68 2c 20 22 5c 72 5c 6e 20 22 29 3b 0a 09 69  th, "\r\n ");..i
46f0: 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55 4c  f (buffer != NUL
4700: 4c 29 20 7b 0a 09 09 2a 62 75 66 66 65 72 20 3d  L) {...*buffer =
4710: 20 27 5c 30 27 3b 0a 09 09 62 75 66 66 65 72 2b   '\0';...buffer+
4720: 2b 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 65 20 6f 6e  +;..}.../* We on
4730: 6c 79 20 68 61 6e 64 6c 65 20 74 68 65 20 22 47  ly handle the "G
4740: 45 54 22 20 61 6e 64 20 22 48 45 41 44 27 20 6d  ET" and "HEAD' m
4750: 65 74 68 6f 64 73 20 2a 2f 0a 09 69 66 20 28 73  ethods */..if (s
4760: 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68 6f 64  trcasecmp(method
4770: 2c 20 22 68 65 61 64 22 29 20 21 3d 20 30 29 20  , "head") != 0) 
4780: 7b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  {...if (strcasec
4790: 6d 70 28 6d 65 74 68 6f 64 2c 20 22 67 65 74 22  mp(method, "get"
47a0: 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  ) != 0) {....ret
47b0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a  urn(NULL);...}..
47c0: 09 09 2f 2a 20 47 45 54 20 72 65 71 75 65 73 74  ../* GET request
47d0: 20 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74 2d   */...buffer_st-
47e0: 3e 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f  >method = FILED_
47f0: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47  REQUEST_METHOD_G
4800: 45 54 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ET;..} else {...
4810: 2f 2a 20 48 45 41 44 20 72 65 71 75 65 73 74 20  /* HEAD request 
4820: 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  */...buffer_st->
4830: 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f 52  method = FILED_R
4840: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45  EQUEST_METHOD_HE
4850: 41 44 3b 0a 09 7d 0a 0a 09 2f 2a 20 4e 6f 74 65  AD;..}.../* Note
4860: 20 70 61 74 68 20 2a 2f 0a 09 70 61 74 68 5f 6c   path */..path_l
4870: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 61 74 68  en = strlen(path
4880: 29 3b 0a 09 6d 65 6d 63 70 79 28 62 75 66 66 65  );..memcpy(buffe
4890: 72 5f 73 74 2d 3e 70 61 74 68 2c 20 70 61 74 68  r_st->path, path
48a0: 2c 20 70 61 74 68 5f 6c 65 6e 20 2b 20 31 29 3b  , path_len + 1);
48b0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
48c0: 74 79 70 65 20 6f 66 20 72 65 71 75 65 73 74 20  type of request 
48d0: 66 72 6f 6d 20 70 61 74 68 20 2a 2f 0a 09 69 66  from path */..if
48e0: 20 28 70 61 74 68 5f 6c 65 6e 20 3d 3d 20 30 29   (path_len == 0)
48f0: 20 7b 0a 09 09 62 75 66 66 65 72 5f 73 74 2d 3e   {...buffer_st->
4900: 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 52 45 51  type = FILED_REQ
4910: 55 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54  UEST_TYPE_DIRECT
4920: 4f 52 59 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ORY;..} else {..
4930: 09 69 66 20 28 70 61 74 68 5b 70 61 74 68 5f 6c  .if (path[path_l
4940: 65 6e 20 2d 20 31 5d 20 3d 3d 20 27 2f 27 29 20  en - 1] == '/') 
4950: 7b 0a 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  {....buffer_st->
4960: 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 52 45 51  type = FILED_REQ
4970: 55 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54  UEST_TYPE_DIRECT
4980: 4f 52 59 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ORY;...} else {.
4990: 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 74 79  ...buffer_st->ty
49a0: 70 65 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45  pe = FILED_REQUE
49b0: 53 54 5f 54 59 50 45 5f 4f 54 48 45 52 3b 0a 09  ST_TYPE_OTHER;..
49c0: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 52 65 73 65 74  .}..}.../* Reset
49d0: 20 62 75 66 66 65 72 20 66 6f 72 20 6c 61 74 65   buffer for late
49e0: 72 20 75 73 65 20 2a 2f 0a 09 62 75 66 66 65 72  r use */..buffer
49f0: 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d   = buffer_st->tm
4a00: 70 62 75 66 3b 0a 0a 09 66 6f 72 20 28 69 20 3d  pbuf;...for (i =
4a10: 20 30 3b 20 69 20 3c 20 31 30 30 3b 20 69 2b 2b   0; i < 100; i++
4a20: 29 20 7b 0a 09 09 66 67 65 74 73 5f 72 65 74 20  ) {...fgets_ret 
4a30: 3d 20 66 67 65 74 73 28 62 75 66 66 65 72 2c 20  = fgets(buffer, 
4a40: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b  buffer_len, fp);
4a50: 0a 09 09 69 66 20 28 66 67 65 74 73 5f 72 65 74  ...if (fgets_ret
4a60: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 62   == NULL) {....b
4a70: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
4a80: 28 73 74 72 6e 63 61 73 65 63 6d 70 28 62 75 66  (strncasecmp(buf
4a90: 66 65 72 2c 20 22 52 61 6e 67 65 3a 20 22 2c 20  fer, "Range: ", 
4aa0: 37 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 77 6f  7) == 0) {....wo
4ab0: 72 6b 62 75 66 66 65 72 20 3d 20 62 75 66 66 65  rkbuffer = buffe
4ac0: 72 20 2b 20 37 3b 0a 0a 09 09 09 69 66 20 28 73  r + 7;.....if (s
4ad0: 74 72 6e 63 61 73 65 63 6d 70 28 77 6f 72 6b 62  trncasecmp(workb
4ae0: 75 66 66 65 72 2c 20 22 62 79 74 65 73 3d 22 2c  uffer, "bytes=",
4af0: 20 36 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09   6) == 0) {.....
4b00: 77 6f 72 6b 62 75 66 66 65 72 20 2b 3d 20 36 3b  workbuffer += 6;
4b10: 0a 0a 09 09 09 09 72 61 6e 67 65 5f 72 65 71 75  ......range_requ
4b20: 65 73 74 20 3d 20 31 3b 0a 0a 09 09 09 09 72 61  est = 1;......ra
4b30: 6e 67 65 5f 73 74 61 72 74 20 3d 20 73 74 72 74  nge_start = strt
4b40: 6f 75 6c 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c  oull(workbuffer,
4b50: 20 26 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78   &workbuffer_nex
4b60: 74 2c 20 31 30 29 3b 0a 0a 09 09 09 09 77 6f 72  t, 10);......wor
4b70: 6b 62 75 66 66 65 72 20 3d 20 77 6f 72 6b 62 75  kbuffer = workbu
4b80: 66 66 65 72 5f 6e 65 78 74 3b 0a 0a 09 09 09 09  ffer_next;......
4b90: 69 66 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20  if (*workbuffer 
4ba0: 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 09 09 09 77  == '-') {......w
4bb0: 6f 72 6b 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 09  orkbuffer++;....
4bc0: 09 09 09 69 66 20 28 2a 77 6f 72 6b 62 75 66 66  ...if (*workbuff
4bd0: 65 72 20 21 3d 20 27 5c 72 27 20 26 26 20 2a 77  er != '\r' && *w
4be0: 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 27 5c 6e  orkbuffer != '\n
4bf0: 27 29 20 7b 0a 09 09 09 09 09 09 72 61 6e 67 65  ') {.......range
4c00: 5f 65 6e 64 20 3d 20 73 74 72 74 6f 75 6c 6c 28  _end = strtoull(
4c10: 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72  workbuffer, &wor
4c20: 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30  kbuffer_next, 10
4c30: 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  );......}.....}.
4c40: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 69 66  ...}...} else if
4c50: 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28 62 75   (strncasecmp(bu
4c60: 66 66 65 72 2c 20 22 48 6f 73 74 3a 20 22 2c 20  ffer, "Host: ", 
4c70: 35 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 75  5) == 0) {....bu
4c80: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
4c90: 2e 68 6f 73 74 2e 70 72 65 73 65 6e 74 20 3d 20  .host.present = 
4ca0: 31 3b 0a 0a 09 09 09 77 6f 72 6b 62 75 66 66 65  1;.....workbuffe
4cb0: 72 20 3d 20 73 74 72 70 62 72 6b 28 62 75 66 66  r = strpbrk(buff
4cc0: 65 72 20 2b 20 35 2c 20 22 5c 72 5c 6e 3a 22 29  er + 5, "\r\n:")
4cd0: 3b 0a 09 09 09 69 66 20 28 77 6f 72 6b 62 75 66  ;....if (workbuf
4ce0: 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  fer != NULL) {..
4cf0: 09 09 09 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d  ...*workbuffer =
4d00: 20 27 5c 30 27 3b 0a 09 09 09 7d 0a 0a 09 09 09   '\0';....}.....
4d10: 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 62 75 66  workbuffer = buf
4d20: 66 65 72 20 2b 20 35 3b 0a 09 09 09 77 68 69 6c  fer + 5;....whil
4d30: 65 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d  e (*workbuffer =
4d40: 3d 20 27 20 27 29 20 7b 0a 09 09 09 09 77 6f 72  = ' ') {.....wor
4d50: 6b 62 75 66 66 65 72 2b 2b 3b 0a 09 09 09 7d 0a  kbuffer++;....}.
4d60: 0a 09 09 09 73 74 72 63 70 79 28 62 75 66 66 65  ....strcpy(buffe
4d70: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f  r_st->headers.ho
4d80: 73 74 2e 68 6f 73 74 2c 20 77 6f 72 6b 62 75 66  st.host, workbuf
4d90: 66 65 72 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69  fer);...} else i
4da0: 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28 62  f (strncasecmp(b
4db0: 75 66 66 65 72 2c 20 22 43 6f 6e 6e 65 63 74 69  uffer, "Connecti
4dc0: 6f 6e 3a 20 4b 65 65 70 2d 41 6c 69 76 65 22 2c  on: Keep-Alive",
4dd0: 20 32 32 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09   22) == 0) {....
4de0: 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65  buffer_st->heade
4df0: 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  rs.connection = 
4e00: 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e  FILED_CONNECTION
4e10: 5f 4b 45 45 50 5f 41 4c 49 56 45 3b 0a 09 09 7d  _KEEP_ALIVE;...}
4e20: 0a 0a 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 62  ....if (memcmp(b
4e30: 75 66 66 65 72 2c 20 22 5c 72 5c 6e 22 2c 20 32  uffer, "\r\n", 2
4e40: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 72 65  ) == 0) {....bre
4e50: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  ak;...}..}.../* 
4e60: 44 65 74 65 72 6d 69 6e 65 20 72 61 6e 67 65 20  Determine range 
4e70: 2a 2f 0a 09 69 66 20 28 72 61 6e 67 65 5f 65 6e  */..if (range_en
4e80: 64 20 21 3d 20 30 29 20 7b 0a 09 09 69 66 20 28  d != 0) {...if (
4e90: 72 61 6e 67 65 5f 65 6e 64 20 3c 3d 20 72 61 6e  range_end <= ran
4ea0: 67 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 09 72  ge_start) {....r
4eb0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d  eturn(NULL);...}
4ec0: 0a 0a 09 09 72 61 6e 67 65 5f 6c 65 6e 67 74 68  ....range_length
4ed0: 20 3d 20 72 61 6e 67 65 5f 65 6e 64 20 2d 20 72   = range_end - r
4ee0: 61 6e 67 65 5f 73 74 61 72 74 3b 0a 0a 09 09 66  ange_start;....f
4ef0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62  iled_log_msg_deb
4f00: 75 67 28 22 43 6f 6d 70 75 74 69 6e 67 20 6c 65  ug("Computing le
4f10: 6e 67 74 68 20 70 61 72 61 6d 65 74 65 72 3a 20  ngth parameter: 
4f20: 25 6c 6c 75 20 3d 20 25 6c 6c 75 20 2d 20 25 6c  %llu = %llu - %l
4f30: 6c 75 22 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65  lu",....(unsigne
4f40: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e  d long long) ran
4f50: 67 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 28 75  ge_length,....(u
4f60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
4f70: 67 29 20 72 61 6e 67 65 5f 65 6e 64 2c 0a 09 09  g) range_end,...
4f80: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
4f90: 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 73 74 61 72  long) range_star
4fa0: 74 0a 09 09 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 46  t...);..}.../* F
4fb0: 69 6c 6c 20 75 70 20 73 74 72 75 63 74 75 72 65  ill up structure
4fc0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 09 62   to return */..b
4fd0: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
4fe0: 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e 74 20  s.range.present 
4ff0: 3d 20 72 61 6e 67 65 5f 72 65 71 75 65 73 74 3b  = range_request;
5000: 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61  ..buffer_st->hea
5010: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
5020: 74 20 20 3d 20 72 61 6e 67 65 5f 73 74 61 72 74  t  = range_start
5030: 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  ;..buffer_st->he
5040: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
5050: 74 68 20 20 3d 20 72 61 6e 67 65 5f 6c 65 6e 67  th  = range_leng
5060: 74 68 3b 0a 0a 09 2f 2a 20 49 66 20 76 68 6f 73  th;.../* If vhos
5070: 74 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20  ts are enabled, 
5080: 63 6f 6d 70 75 74 65 20 6e 65 77 20 70 61 74 68  compute new path
5090: 20 2a 2f 0a 09 69 66 20 28 6f 70 74 69 6f 6e 73   */..if (options
50a0: 2d 3e 76 68 6f 73 74 73 5f 65 6e 61 62 6c 65 64  ->vhosts_enabled
50b0: 29 20 7b 0a 09 09 69 66 20 28 62 75 66 66 65 72  ) {...if (buffer
50c0: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73  _st->headers.hos
50d0: 74 2e 70 72 65 73 65 6e 74 20 3d 3d 20 31 29 20  t.present == 1) 
50e0: 7b 0a 09 09 09 62 75 66 66 65 72 20 3d 20 62 75  {....buffer = bu
50f0: 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b  ffer_st->tmpbuf;
5100: 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d  ....buffer_len =
5110: 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 5f 73   sizeof(buffer_s
5120: 74 2d 3e 74 6d 70 62 75 66 29 3b 0a 0a 09 09 09  t->tmpbuf);.....
5130: 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73  snprintf_ret = s
5140: 6e 70 72 69 6e 74 66 28 62 75 66 66 65 72 2c 20  nprintf(buffer, 
5150: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 22 2f 25 73  buffer_len, "/%s
5160: 25 73 25 73 22 2c 0a 09 09 09 09 62 75 66 66 65  %s%s",.....buffe
5170: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f  r_st->headers.ho
5180: 73 74 2e 68 6f 73 74 2c 0a 09 09 09 09 62 75 66  st.host,.....buf
5190: 66 65 72 5f 73 74 2d 3e 70 61 74 68 5b 30 5d 20  fer_st->path[0] 
51a0: 3d 3d 20 27 2f 27 20 3f 20 22 22 20 3a 20 22 2f  == '/' ? "" : "/
51b0: 22 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74  ",.....buffer_st
51c0: 2d 3e 70 61 74 68 0a 09 09 09 29 3b 0a 09 09 09  ->path....);....
51d0: 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 65 74  if (snprintf_ret
51e0: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 69 66 20   >= 0) {.....if 
51f0: 28 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  (((unsigned int)
5200: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 29 20 3c   snprintf_ret) <
5210: 20 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09   buffer_len) {..
5220: 09 09 09 09 73 74 72 63 70 79 28 62 75 66 66 65  ....strcpy(buffe
5230: 72 5f 73 74 2d 3e 70 61 74 68 2c 20 62 75 66 66  r_st->path, buff
5240: 65 72 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  er);.....}....}.
5250: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
5260: 62 75 66 66 65 72 5f 73 74 29 3b 0a 7d 0a 0a 2f  buffer_st);.}../
5270: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
5280: 72 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69 63  r page */.static
5290: 20 76 6f 69 64 20 66 69 6c 65 64 5f 65 72 72 6f   void filed_erro
52a0: 72 5f 70 61 67 65 28 46 49 4c 45 20 2a 66 70 2c  r_page(FILE *fp,
52b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74   const char *dat
52c0: 65 5f 63 75 72 72 65 6e 74 2c 20 69 6e 74 20 65  e_current, int e
52d0: 72 72 6f 72 5f 6e 75 6d 62 65 72 2c 20 69 6e 74  rror_number, int
52e0: 20 6d 65 74 68 6f 64 2c 20 63 6f 6e 73 74 20 63   method, const c
52f0: 68 61 72 20 2a 72 65 61 73 6f 6e 2c 20 73 74 72  har *reason, str
5300: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
5310: 74 72 79 20 2a 6c 6f 67 29 20 7b 0a 09 63 68 61  try *log) {..cha
5320: 72 20 2a 65 72 72 6f 72 5f 73 74 72 69 6e 67 20  r *error_string 
5330: 3d 20 22 3c 68 74 6d 6c 3e 3c 68 65 61 64 3e 3c  = "<html><head><
5340: 74 69 74 6c 65 3e 45 52 52 4f 52 3c 2f 74 69 74  title>ERROR</tit
5350: 6c 65 3e 3c 2f 68 65 61 64 3e 3c 62 6f 64 79 3e  le></head><body>
5360: 55 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65 73  Unable to proces
5370: 73 20 72 65 71 75 65 73 74 3c 2f 62 6f 64 79 3e  s request</body>
5380: 3c 2f 68 74 6d 6c 3e 22 3b 0a 0a 09 66 70 72 69  </html>";...fpri
5390: 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f 31 2e  ntf(fp, "HTTP/1.
53a0: 31 20 25 69 20 4e 6f 74 20 4f 4b 5c 72 5c 6e 44  1 %i Not OK\r\nD
53b0: 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65  ate: %s\r\nServe
53c0: 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74  r: filed\r\nLast
53d0: 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c  -Modified: %s\r\
53e0: 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a  nContent-Length:
53f0: 20 25 6c 6c 75 5c 72 5c 6e 43 6f 6e 74 65 6e 74   %llu\r\nContent
5400: 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e  -Type: %s\r\nCon
5410: 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72  nection: close\r
5420: 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 65 72 72 6f 72  \n\r\n",...error
5430: 5f 6e 75 6d 62 65 72 2c 0a 09 09 64 61 74 65 5f  _number,...date_
5440: 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f  current,...date_
5450: 63 75 72 72 65 6e 74 2c 0a 09 09 28 75 6e 73 69  current,...(unsi
5460: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
5470: 73 74 72 6c 65 6e 28 65 72 72 6f 72 5f 73 74 72  strlen(error_str
5480: 69 6e 67 29 2c 0a 09 09 22 74 65 78 74 2f 68 74  ing),..."text/ht
5490: 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a 20 73 69 6c  ml"..);.../* sil
54a0: 65 6e 63 65 20 65 72 72 6f 72 20 73 74 72 69 6e  ence error strin
54b0: 67 20 66 6f 72 20 48 45 41 44 20 72 65 71 75 65  g for HEAD reque
54c0: 73 74 73 20 2a 2f 0a 09 69 66 20 28 6d 65 74 68  sts */..if (meth
54d0: 6f 64 20 21 3d 20 46 49 4c 45 44 5f 52 45 51 55  od != FILED_REQU
54e0: 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 29  EST_METHOD_HEAD)
54f0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 66 70 2c   {...fprintf(fp,
5500: 20 22 25 73 22 2c 20 65 72 72 6f 72 5f 73 74 72   "%s", error_str
5510: 69 6e 67 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 4c 6f  ing);..}.../* Lo
5520: 67 20 65 72 72 6f 72 20 2a 2f 0a 09 2f 2a 2a 20  g error */../** 
5530: 72 65 61 73 6f 6e 20 6d 75 73 74 20 70 6f 69 6e  reason must poin
5540: 74 20 74 6f 20 61 20 67 6c 6f 62 61 6c 6c 79 20  t to a globally 
5550: 61 6c 6c 6f 63 61 74 65 64 20 76 61 6c 75 65 20  allocated value 
5560: 2a 2a 2f 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e  **/..log->reason
5570: 20 3d 20 72 65 61 73 6f 6e 3b 0a 09 6c 6f 67 2d   = reason;..log-
5580: 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 65 72 72  >http_code = err
5590: 6f 72 5f 6e 75 6d 62 65 72 3b 0a 0a 09 66 69 6c  or_number;...fil
55a0: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67  ed_log_entry(log
55b0: 29 3b 0a 0a 09 2f 2a 20 43 6c 6f 73 65 20 63 6f  );.../* Close co
55c0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09 66 63 6c  nnection */..fcl
55d0: 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65 74 75 72  ose(fp);...retur
55e0: 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  n;.}../* Return 
55f0: 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 69 6e  a redirect to in
5600: 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 73 74 61 74  dex.html */.stat
5610: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 72 65  ic void filed_re
5620: 64 69 72 65 63 74 5f 69 6e 64 65 78 28 46 49 4c  direct_index(FIL
5630: 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20 63 68 61  E *fp, const cha
5640: 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  r *date_current,
5650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
5660: 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  h, struct filed_
5670: 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 29 20  log_entry *log) 
5680: 7b 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65  {..int http_code
5690: 20 3d 20 33 30 31 3b 0a 09 66 70 72 69 6e 74 66   = 301;..fprintf
56a0: 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25  (fp, "HTTP/1.1 %
56b0: 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73  i OK\r\nDate: %s
56c0: 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65  \r\nServer: file
56d0: 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69  d\r\nLast-Modifi
56e0: 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e  ed: %s\r\nConten
56f0: 74 2d 4c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 43  t-Length: 0\r\nC
5700: 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65  onnection: close
5710: 5c 72 5c 6e 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  \r\nLocation: %s
5720: 5c 72 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 68 74 74  \r\n\r\n",...htt
5730: 70 5f 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63  p_code,...date_c
5740: 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f 63  urrent,...date_c
5750: 75 72 72 65 6e 74 2c 0a 09 09 22 69 6e 64 65 78  urrent,..."index
5760: 2e 68 74 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a 20  .html"..);.../* 
5770: 4c 6f 67 20 72 65 64 69 72 65 63 74 20 2a 2f 0a  Log redirect */.
5780: 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22  .log->reason = "
5790: 72 65 64 69 72 65 63 74 22 3b 0a 09 6c 6f 67 2d  redirect";..log-
57a0: 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 68 74 74  >http_code = htt
57b0: 70 5f 63 6f 64 65 3b 0a 0a 09 66 69 6c 65 64 5f  p_code;...filed_
57c0: 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a  log_entry(log);.
57d0: 0a 09 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65  ../* Close conne
57e0: 63 74 69 6f 6e 20 2a 2f 0a 09 66 63 6c 6f 73 65  ction */..fclose
57f0: 28 66 70 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  (fp);...return;.
5800: 0a 09 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 75  ../* Currently u
5810: 6e 75 73 65 64 3a 20 70 61 74 68 20 2a 2f 0a 09  nused: path */..
5820: 70 61 74 68 20 3d 20 70 61 74 68 3b 0a 7d 0a 0a  path = path;.}..
5830: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 6e  /* Convert an en
5840: 75 6d 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  um representing 
5850: 74 68 65 20 22 43 6f 6e 6e 65 63 74 69 6f 6e 22  the "Connection"
5860: 20 68 65 61 64 65 72 20 76 61 6c 75 65 20 74 6f   header value to
5870: 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61   a string */.sta
5880: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5890: 66 69 6c 65 64 5f 63 6f 6e 6e 65 63 74 69 6f 6e  filed_connection
58a0: 5f 73 74 72 28 69 6e 74 20 63 6f 6e 6e 65 63 74  _str(int connect
58b0: 69 6f 6e 5f 76 61 6c 75 65 29 20 7b 0a 09 73 77  ion_value) {..sw
58c0: 69 74 63 68 20 28 63 6f 6e 6e 65 63 74 69 6f 6e  itch (connection
58d0: 5f 76 61 6c 75 65 29 20 7b 0a 09 09 63 61 73 65  _value) {...case
58e0: 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f   FILED_CONNECTIO
58f0: 4e 5f 43 4c 4f 53 45 3a 0a 09 09 09 72 65 74 75  N_CLOSE:....retu
5900: 72 6e 28 22 63 6c 6f 73 65 22 29 3b 0a 09 09 63  rn("close");...c
5910: 61 73 65 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  ase FILED_CONNEC
5920: 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56 45 3a  TION_KEEP_ALIVE:
5930: 0a 09 09 09 72 65 74 75 72 6e 28 22 6b 65 65 70  ....return("keep
5940: 2d 61 6c 69 76 65 22 29 3b 0a 09 7d 0a 0a 09 72  -alive");..}...r
5950: 65 74 75 72 6e 28 22 63 6c 6f 73 65 22 29 3b 0a  eturn("close");.
5960: 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20 61 20 73  }../* Handle a s
5970: 69 6e 67 6c 65 20 72 65 71 75 65 73 74 20 66 72  ingle request fr
5980: 6f 6d 20 61 20 63 6c 69 65 6e 74 20 2a 2f 0a 73  om a client */.s
5990: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
59a0: 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 69 6e  handle_client(in
59b0: 74 20 66 64 2c 20 73 74 72 75 63 74 20 66 69 6c  t fd, struct fil
59c0: 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20  ed_http_request 
59d0: 2a 72 65 71 75 65 73 74 2c 20 73 74 72 75 63 74  *request, struct
59e0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
59f0: 20 2a 6c 6f 67 2c 20 73 74 72 75 63 74 20 66 69   *log, struct fi
5a00: 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74  led_options *opt
5a10: 69 6f 6e 73 29 20 7b 0a 09 73 74 72 75 63 74 20  ions) {..struct 
5a20: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a  filed_fileinfo *
5a30: 66 69 6c 65 69 6e 66 6f 3b 0a 09 73 73 69 7a 65  fileinfo;..ssize
5a40: 5f 74 20 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b  _t sendfile_ret;
5a50: 0a 09 73 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c  ..size_t sendfil
5a60: 65 5f 73 69 7a 65 3b 0a 09 6f 66 66 5f 74 20 73  e_size;..off_t s
5a70: 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20  endfile_offset, 
5a80: 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 2c 20 73  sendfile_sent, s
5a90: 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09 63 68  endfile_len;..ch
5aa0: 61 72 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20  ar *path;..char 
5ab0: 2a 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 64  *date_current, d
5ac0: 61 74 65 5f 63 75 72 72 65 6e 74 5f 62 5b 36 34  ate_current_b[64
5ad0: 5d 3b 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64  ];..int http_cod
5ae0: 65 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09  e;..FILE *fp;...
5af0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 63 75 72  /* Determine cur
5b00: 72 65 6e 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61  rent time */..da
5b10: 74 65 5f 63 75 72 72 65 6e 74 20 3d 20 66 69 6c  te_current = fil
5b20: 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64  ed_format_time(d
5b30: 61 74 65 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73  ate_current_b, s
5b40: 69 7a 65 6f 66 28 64 61 74 65 5f 63 75 72 72 65  izeof(date_curre
5b50: 6e 74 5f 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c  nt_b), time(NULL
5b60: 29 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f  ));.../* Open so
5b70: 63 6b 65 74 20 61 73 20 41 4e 53 49 20 49 2f 4f  cket as ANSI I/O
5b80: 20 66 6f 72 20 65 61 73 65 20 6f 66 20 75 73 65   for ease of use
5b90: 20 2a 2f 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e   */..fp = fdopen
5ba0: 28 66 64 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66  (fd, "w+b");..if
5bb0: 20 28 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   (fp == NULL) {.
5bc0: 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09  ..close(fd);....
5bd0: 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d  log->buffer[0] =
5be0: 20 27 5c 30 27 3b 0a 09 09 6c 6f 67 2d 3e 68 74   '\0';...log->ht
5bf0: 74 70 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a 09 09  tp_code = -1;...
5c00: 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 66  log->reason = "f
5c10: 64 6f 70 65 6e 5f 66 61 69 6c 65 64 22 3b 0a 0a  dopen_failed";..
5c20: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72  ..filed_log_entr
5c30: 79 28 6c 6f 67 29 3b 0a 0a 09 09 72 65 74 75 72  y(log);....retur
5c40: 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49  n(FILED_CONNECTI
5c50: 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a 09  ON_CLOSE);..}...
5c60: 72 65 71 75 65 73 74 20 3d 20 66 69 6c 65 64 5f  request = filed_
5c70: 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74  get_http_request
5c80: 28 66 70 2c 20 72 65 71 75 65 73 74 2c 20 6f 70  (fp, request, op
5c90: 74 69 6f 6e 73 29 3b 0a 0a 09 69 66 20 28 72 65  tions);...if (re
5ca0: 71 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  quest == NULL) {
5cb0: 0a 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30  ...log->buffer[0
5cc0: 5d 20 3d 20 27 5c 30 27 3b 0a 0a 09 09 66 69 6c  ] = '\0';....fil
5cd0: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70  ed_error_page(fp
5ce0: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20  , date_current, 
5cf0: 35 30 30 2c 20 46 49 4c 45 44 5f 52 45 51 55 45  500, FILED_REQUE
5d00: 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 2c 20 22  ST_METHOD_GET, "
5d10: 66 6f 72 6d 61 74 22 2c 20 6c 6f 67 29 3b 0a 0a  format", log);..
5d20: 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43  ..return(FILED_C
5d30: 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29  ONNECTION_CLOSE)
5d40: 3b 0a 09 7d 0a 0a 09 70 61 74 68 20 3d 20 72 65  ;..}...path = re
5d50: 71 75 65 73 74 2d 3e 70 61 74 68 3b 0a 09 73 74  quest->path;..st
5d60: 72 63 70 79 28 6c 6f 67 2d 3e 62 75 66 66 65 72  rcpy(log->buffer
5d70: 2c 20 70 61 74 68 29 3b 0a 09 6c 6f 67 2d 3e 6d  , path);..log->m
5d80: 65 74 68 6f 64 20 3d 20 72 65 71 75 65 73 74 2d  ethod = request-
5d90: 3e 6d 65 74 68 6f 64 3b 0a 0a 09 2f 2a 20 49 66  >method;.../* If
5da0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
5db0: 61 74 68 20 69 73 20 61 20 64 69 72 65 63 74 6f  ath is a directo
5dc0: 72 79 2c 20 72 65 64 69 72 65 63 74 20 74 6f 20  ry, redirect to 
5dd0: 69 6e 64 65 78 20 70 61 67 65 20 2a 2f 0a 09 69  index page */..i
5de0: 66 20 28 72 65 71 75 65 73 74 2d 3e 74 79 70 65  f (request->type
5df0: 20 3d 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53   == FILED_REQUES
5e00: 54 5f 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59  T_TYPE_DIRECTORY
5e10: 29 20 7b 0a 09 09 66 69 6c 65 64 5f 72 65 64 69  ) {...filed_redi
5e20: 72 65 63 74 5f 69 6e 64 65 78 28 66 70 2c 20 64  rect_index(fp, d
5e30: 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 70 61 74  ate_current, pat
5e40: 68 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72 65 74 75  h, log);....retu
5e50: 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  rn(FILED_CONNECT
5e60: 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a  ION_CLOSE);..}..
5e70: 09 66 69 6c 65 69 6e 66 6f 20 3d 20 66 69 6c 65  .fileinfo = file
5e80: 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 70 61 74 68  d_open_file(path
5e90: 2c 20 26 72 65 71 75 65 73 74 2d 3e 66 69 6c 65  , &request->file
5ea0: 69 6e 66 6f 29 3b 0a 09 69 66 20 28 66 69 6c 65  info);..if (file
5eb0: 69 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  info == NULL) {.
5ec0: 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61  ..filed_error_pa
5ed0: 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72  ge(fp, date_curr
5ee0: 65 6e 74 2c 20 34 30 34 2c 20 72 65 71 75 65 73  ent, 404, reques
5ef0: 74 2d 3e 6d 65 74 68 6f 64 2c 20 22 6f 70 65 6e  t->method, "open
5f00: 5f 66 61 69 6c 65 64 22 2c 20 6c 6f 67 29 3b 0a  _failed", log);.
5f10: 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f  ...return(FILED_
5f20: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45  CONNECTION_CLOSE
5f30: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 71 75  );..}...if (requ
5f40: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
5f50: 67 65 2e 70 72 65 73 65 6e 74 29 20 7b 0a 09 09  ge.present) {...
5f60: 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61  if (request->hea
5f70: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
5f80: 74 20 21 3d 20 30 20 7c 7c 20 72 65 71 75 65 73  t != 0 || reques
5f90: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
5fa0: 2e 6c 65 6e 67 74 68 20 3e 3d 20 30 29 20 7b 0a  .length >= 0) {.
5fb0: 09 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e  ...if (request->
5fc0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
5fd0: 66 73 65 74 20 3e 3d 20 66 69 6c 65 69 6e 66 6f  fset >= fileinfo
5fe0: 2d 3e 6c 65 6e 29 20 7b 0a 09 09 09 09 66 69 6c  ->len) {.....fil
5ff0: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70  ed_error_page(fp
6000: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20  , date_current, 
6010: 34 31 36 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65  416, request->me
6020: 74 68 6f 64 2c 20 22 72 61 6e 67 65 5f 69 6e 76  thod, "range_inv
6030: 61 6c 69 64 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09  alid", log);....
6040: 09 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f  ..close(fileinfo
6050: 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 72 65 74 75  ->fd);......retu
6060: 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  rn(FILED_CONNECT
6070: 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 09 09 7d  ION_CLOSE);....}
6080: 0a 0a 09 09 09 69 66 20 28 72 65 71 75 65 73 74  .....if (request
6090: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
60a0: 6c 65 6e 67 74 68 20 3d 3d 20 28 28 6f 66 66 5f  length == ((off_
60b0: 74 29 20 2d 31 29 29 20 7b 0a 09 09 09 09 66 69  t) -1)) {.....fi
60c0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
60d0: 67 28 22 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e  g("Computing len
60e0: 67 74 68 20 74 6f 20 66 69 74 20 69 6e 20 62 6f  gth to fit in bo
60f0: 75 6e 64 73 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e  unds: fileinfo->
6100: 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20 72 65 71 75  len = %llu, requ
6110: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
6120: 67 65 2e 6f 66 66 73 65 74 20 3d 20 25 6c 6c 75  ge.offset = %llu
6130: 22 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65  ",......(unsigne
6140: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c  d long long) fil
6150: 65 69 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09  einfo->len,.....
6160: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
6170: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
6180: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
6190: 73 65 74 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09  set.....);......
61a0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
61b0: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 20  .range.length = 
61c0: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 2d 20  fileinfo->len - 
61d0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
61e0: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09  .range.offset;..
61f0: 09 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f  ..}.....filed_lo
6200: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 50 61 72  g_msg_debug("Par
6210: 74 69 61 6c 20 72 65 71 75 65 73 74 2c 20 73 74  tial request, st
6220: 61 72 74 69 6e 67 20 61 74 3a 20 25 6c 6c 75 20  arting at: %llu 
6230: 61 6e 64 20 72 75 6e 6e 69 6e 67 20 66 6f 72 20  and running for 
6240: 25 6c 6c 69 20 62 79 74 65 73 22 2c 0a 09 09 09  %lli bytes",....
6250: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
6260: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
6270: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
6280: 73 65 74 2c 0a 09 09 09 09 28 6c 6f 6e 67 20 6c  set,.....(long l
6290: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
62a0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
62b0: 74 68 0a 09 09 09 29 3b 0a 0a 09 09 7d 0a 0a 09  th....);....}...
62c0: 09 68 74 74 70 5f 63 6f 64 65 20 3d 20 32 30 36  .http_code = 206
62d0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 74  ;..} else {...ht
62e0: 74 70 5f 63 6f 64 65 20 3d 20 32 30 30 3b 0a 0a  tp_code = 200;..
62f0: 09 09 2f 2a 20 43 6f 6d 70 75 74 65 20 66 61 6b  ../* Compute fak
6300: 65 20 72 61 6e 67 65 20 70 61 72 61 6d 65 74 65  e range paramete
6310: 72 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  rs that includes
6320: 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
6330: 20 2a 2f 0a 09 09 72 65 71 75 65 73 74 2d 3e 68   */...request->h
6340: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
6350: 73 65 74 20 3d 20 30 3b 0a 09 09 72 65 71 75 65  set = 0;...reque
6360: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
6370: 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69  e.length = filei
6380: 6e 66 6f 2d 3e 6c 65 6e 3b 0a 09 7d 0a 0a 09 66  nfo->len;..}...f
6390: 70 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50  printf(fp, "HTTP
63a0: 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61  /1.1 %i OK\r\nDa
63b0: 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72  te: %s\r\nServer
63c0: 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d  : filed\r\nLast-
63d0: 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e  Modified: %s\r\n
63e0: 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20  Content-Length: 
63f0: 25 6c 6c 75 5c 72 5c 6e 41 63 63 65 70 74 2d 52  %llu\r\nAccept-R
6400: 61 6e 67 65 73 3a 20 62 79 74 65 73 5c 72 5c 6e  anges: bytes\r\n
6410: 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 73  Content-Type: %s
6420: 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  \r\nConnection: 
6430: 25 73 5c 72 5c 6e 45 54 61 67 3a 20 5c 22 25 73  %s\r\nETag: \"%s
6440: 5c 22 5c 72 5c 6e 22 2c 0a 09 09 68 74 74 70 5f  \"\r\n",...http_
6450: 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63 75 72  code,...date_cur
6460: 72 65 6e 74 2c 0a 09 09 66 69 6c 65 69 6e 66 6f  rent,...fileinfo
6470: 2d 3e 6c 61 73 74 6d 6f 64 2c 0a 09 09 28 75 6e  ->lastmod,...(un
6480: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
6490: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
64a0: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c  rs.range.length,
64b0: 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79 70  ...fileinfo->typ
64c0: 65 2c 0a 09 09 66 69 6c 65 64 5f 63 6f 6e 6e 65  e,...filed_conne
64d0: 63 74 69 6f 6e 5f 73 74 72 28 72 65 71 75 65 73  ction_str(reques
64e0: 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65  t->headers.conne
64f0: 63 74 69 6f 6e 29 2c 0a 09 09 66 69 6c 65 69 6e  ction),...filein
6500: 66 6f 2d 3e 65 74 61 67 0a 09 29 3b 0a 0a 09 69  fo->etag..);...i
6510: 66 20 28 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20  f (http_code == 
6520: 32 30 36 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  206) {...fprintf
6530: 28 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61  (fp, "Content-Ra
6540: 6e 67 65 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d  nge: bytes %llu-
6550: 25 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a  %llu/%llu\r\n",.
6560: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
6570: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
6580: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
6590: 66 66 73 65 74 2c 0a 09 09 09 28 75 6e 73 69 67  ffset,....(unsig
65a0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 28  ned long long) (
65b0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
65c0: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 2b 20  .range.offset + 
65d0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
65e0: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 2d 20  .range.length - 
65f0: 31 29 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64  1),....(unsigned
6600: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65   long long) file
6610: 69 6e 66 6f 2d 3e 6c 65 6e 0a 09 09 29 3b 0a 09  info->len...);..
6620: 7d 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  }..fprintf(fp, "
6630: 5c 72 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28  \r\n");..fflush(
6640: 66 70 29 3b 0a 0a 09 6c 6f 67 2d 3e 68 74 74 70  fp);...log->http
6650: 5f 63 6f 64 65 20 3d 20 68 74 74 70 5f 63 6f 64  _code = http_cod
6660: 65 3b 0a 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20  e;..log->reason 
6670: 3d 20 22 4f 4b 22 3b 0a 09 6c 6f 67 2d 3e 73 74  = "OK";..log->st
6680: 61 72 74 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e  arttime = time(N
6690: 55 4c 4c 29 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f  ULL);..log->req_
66a0: 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65 73 74  offset = request
66b0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
66c0: 6f 66 66 73 65 74 3b 0a 09 6c 6f 67 2d 3e 72 65  offset;..log->re
66d0: 71 5f 6c 65 6e 67 74 68 20 3d 20 72 65 71 75 65  q_length = reque
66e0: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
66f0: 65 2e 6c 65 6e 67 74 68 3b 0a 09 6c 6f 67 2d 3e  e.length;..log->
6700: 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 66 69  file_length = fi
6710: 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 0a 23 69  leinfo->len;..#i
6720: 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c  fdef FILED_NONBL
6730: 4f 43 4b 5f 48 54 54 50 0a 09 69 6e 74 20 73 6f  OCK_HTTP..int so
6740: 63 6b 65 74 5f 66 6c 61 67 73 3b 0a 09 66 64 5f  cket_flags;..fd_
6750: 73 65 74 20 72 66 64 2c 20 77 66 64 3b 0a 09 63  set rfd, wfd;..c
6760: 68 61 72 20 73 69 6e 6b 62 75 66 5b 38 31 39 32  har sinkbuf[8192
6770: 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64  ];..ssize_t read
6780: 5f 72 65 74 3b 0a 0a 09 46 44 5f 5a 45 52 4f 28  _ret;...FD_ZERO(
6790: 26 72 66 64 29 3b 0a 09 46 44 5f 5a 45 52 4f 28  &rfd);..FD_ZERO(
67a0: 26 77 66 64 29 3b 0a 09 46 44 5f 53 45 54 28 66  &wfd);..FD_SET(f
67b0: 64 2c 20 26 72 66 64 29 3b 0a 09 46 44 5f 53 45  d, &rfd);..FD_SE
67c0: 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a 09 73  T(fd, &wfd);...s
67d0: 6f 63 6b 65 74 5f 66 6c 61 67 73 20 3d 20 66 63  ocket_flags = fc
67e0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 4c 29  ntl(fd, F_GETFL)
67f0: 3b 0a 09 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53  ;..fcntl(fd, F_S
6800: 45 54 46 4c 2c 20 73 6f 63 6b 65 74 5f 66 6c 61  ETFL, socket_fla
6810: 67 73 20 7c 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29  gs | O_NONBLOCK)
6820: 3b 0a 23 65 6e 64 69 66 0a 09 73 65 6e 64 66 69  ;.#endif..sendfi
6830: 6c 65 5f 6f 66 66 73 65 74 20 3d 20 72 65 71 75  le_offset = requ
6840: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
6850: 67 65 2e 6f 66 66 73 65 74 3b 0a 09 73 65 6e 64  ge.offset;..send
6860: 66 69 6c 65 5f 6c 65 6e 20 3d 20 72 65 71 75 65  file_len = reque
6870: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
6880: 65 2e 6c 65 6e 67 74 68 3b 0a 09 73 65 6e 64 66  e.length;..sendf
6890: 69 6c 65 5f 73 65 6e 74 20 3d 20 30 3b 0a 09 77  ile_sent = 0;..w
68a0: 68 69 6c 65 20 28 72 65 71 75 65 73 74 2d 3e 6d  hile (request->m
68b0: 65 74 68 6f 64 20 3d 3d 20 46 49 4c 45 44 5f 52  ethod == FILED_R
68c0: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45  EQUEST_METHOD_GE
68d0: 54 29 20 7b 0a 09 09 69 66 20 28 73 65 6e 64 66  T) {...if (sendf
68e0: 69 6c 65 5f 6c 65 6e 20 3e 20 46 49 4c 45 44 5f  ile_len > FILED_
68f0: 53 45 4e 44 46 49 4c 45 5f 4d 41 58 29 20 7b 0a  SENDFILE_MAX) {.
6900: 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  ...sendfile_size
6910: 20 3d 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c   = FILED_SENDFIL
6920: 45 5f 4d 41 58 3b 0a 09 09 7d 20 65 6c 73 65 20  E_MAX;...} else 
6930: 7b 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69  {....sendfile_si
6940: 7a 65 20 3d 20 73 65 6e 64 66 69 6c 65 5f 6c 65  ze = sendfile_le
6950: 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 66 69  n;...}....sendfi
6960: 6c 65 5f 72 65 74 20 3d 20 73 65 6e 64 66 69 6c  le_ret = sendfil
6970: 65 28 66 64 2c 20 66 69 6c 65 69 6e 66 6f 2d 3e  e(fd, fileinfo->
6980: 66 64 2c 20 26 73 65 6e 64 66 69 6c 65 5f 6f 66  fd, &sendfile_of
6990: 66 73 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73  fset, sendfile_s
69a0: 69 7a 65 29 3b 0a 09 09 69 66 20 28 73 65 6e 64  ize);...if (send
69b0: 66 69 6c 65 5f 72 65 74 20 3c 3d 20 30 29 20 7b  file_ret <= 0) {
69c0: 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f  .#ifdef FILED_NO
69d0: 4e 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69  NBLOCK_HTTP....i
69e0: 66 20 28 65 72 72 6e 6f 20 3d 3d 20 45 41 47 41  f (errno == EAGA
69f0: 49 4e 29 20 7b 0a 09 09 09 09 73 65 6e 64 66 69  IN) {.....sendfi
6a00: 6c 65 5f 72 65 74 20 3d 20 30 3b 0a 0a 09 09 09  le_ret = 0;.....
6a10: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 09  .while (1) {....
6a20: 09 09 73 65 6c 65 63 74 28 66 64 20 2b 20 31 2c  ..select(fd + 1,
6a30: 20 26 72 66 64 2c 20 26 77 66 64 2c 20 4e 55 4c   &rfd, &wfd, NUL
6a40: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 09 69  L, NULL);......i
6a50: 66 20 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20  f (FD_ISSET(fd, 
6a60: 26 72 66 64 29 29 20 7b 0a 09 09 09 09 09 09 72  &rfd)) {.......r
6a70: 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66  ead_ret = read(f
6a80: 64 2c 20 73 69 6e 6b 62 75 66 2c 20 73 69 7a 65  d, sinkbuf, size
6a90: 6f 66 28 73 69 6e 6b 62 75 66 29 29 3b 0a 0a 09  of(sinkbuf));...
6aa0: 09 09 09 09 09 69 66 20 28 72 65 61 64 5f 72 65  .....if (read_re
6ab0: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  t <= 0) {.......
6ac0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a  .break;.......}.
6ad0: 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
6ae0: 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20 26 77  (FD_ISSET(fd, &w
6af0: 66 64 29 29 20 7b 0a 09 09 09 09 09 09 72 65 61  fd)) {.......rea
6b00: 64 5f 72 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09  d_ret = 1;......
6b10: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
6b20: 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 72  ....}......if (r
6b30: 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
6b40: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
6b50: 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
6b60: 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 23 65  ..break;....}.#e
6b70: 6c 73 65 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65  lse....break;.#e
6b80: 6e 64 69 66 0a 09 09 7d 0a 0a 09 09 73 65 6e 64  ndif...}....send
6b90: 66 69 6c 65 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64  file_len -= send
6ba0: 66 69 6c 65 5f 72 65 74 3b 0a 09 09 73 65 6e 64  file_ret;...send
6bb0: 66 69 6c 65 5f 73 65 6e 74 20 2b 3d 20 73 65 6e  file_sent += sen
6bc0: 64 66 69 6c 65 5f 72 65 74 3b 0a 09 09 69 66 20  dfile_ret;...if 
6bd0: 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d  (sendfile_len ==
6be0: 20 30 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a   0) {....break;.
6bf0: 09 09 7d 0a 09 7d 0a 0a 09 6c 6f 67 2d 3e 65 6e  ..}..}...log->en
6c00: 64 74 69 6d 65 20 3d 20 28 74 69 6d 65 5f 74 29  dtime = (time_t)
6c10: 20 2d 31 3b 0a 09 6c 6f 67 2d 3e 73 65 6e 74 5f   -1;..log->sent_
6c20: 6c 65 6e 67 74 68 20 3d 20 73 65 6e 64 66 69 6c  length = sendfil
6c30: 65 5f 73 65 6e 74 3b 0a 0a 09 66 69 6c 65 64 5f  e_sent;...filed_
6c40: 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a  log_entry(log);.
6c50: 0a 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f  ..close(fileinfo
6c60: 2d 3e 66 64 29 3b 0a 0a 09 69 66 20 28 72 65 71  ->fd);...if (req
6c70: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f  uest->headers.co
6c80: 6e 6e 65 63 74 69 6f 6e 20 21 3d 20 46 49 4c 45  nnection != FILE
6c90: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45  D_CONNECTION_KEE
6ca0: 50 5f 41 4c 49 56 45 29 20 7b 0a 09 09 66 63 6c  P_ALIVE) {...fcl
6cb0: 6f 73 65 28 66 70 29 3b 0a 0a 09 09 72 65 74 75  ose(fp);....retu
6cc0: 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  rn(FILED_CONNECT
6cd0: 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a 0a  ION_CLOSE);..}..
6ce0: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f  .return(FILED_CO
6cf0: 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c  NNECTION_KEEP_AL
6d00: 49 56 45 29 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64  IVE);.}../* Hand
6d10: 6c 65 20 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e  le incoming conn
6d20: 65 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  ections */.stati
6d30: 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 77 6f  c void *filed_wo
6d40: 72 6b 65 72 5f 74 68 72 65 61 64 28 76 6f 69 64  rker_thread(void
6d50: 20 2a 61 72 67 5f 76 29 20 7b 0a 09 73 74 72 75   *arg_v) {..stru
6d60: 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f  ct filed_worker_
6d70: 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67  thread_args *arg
6d80: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
6d90: 68 74 74 70 5f 72 65 71 75 65 73 74 20 72 65 71  http_request req
6da0: 75 65 73 74 3b 0a 09 73 74 72 75 63 74 20 66 69  uest;..struct fi
6db0: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c  led_log_entry *l
6dc0: 6f 67 2c 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f  og, local_dummy_
6dd0: 6c 6f 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c  log;..struct fil
6de0: 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69  ed_options *opti
6df0: 6f 6e 73 3b 0a 09 73 74 72 75 63 74 20 73 6f 63  ons;..struct soc
6e00: 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a  kaddr_in6 addr;.
6e10: 09 73 6f 63 6b 6c 65 6e 5f 74 20 61 64 64 72 6c  .socklen_t addrl
6e20: 65 6e 3b 0a 09 69 6e 74 20 66 61 69 6c 75 72 65  en;..int failure
6e30: 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 6d 61 78 5f  _count = 0, max_
6e40: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20  failure_count = 
6e50: 46 49 4c 45 44 5f 4d 41 58 5f 46 41 49 4c 55 52  FILED_MAX_FAILUR
6e60: 45 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 63 6f  E_COUNT;..int co
6e70: 6e 6e 65 63 74 69 6f 6e 5f 73 74 61 74 65 20 3d  nnection_state =
6e80: 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f   FILED_CONNECTIO
6e90: 4e 5f 43 4c 4f 53 45 3b 0a 09 69 6e 74 20 6d 61  N_CLOSE;..int ma
6ea0: 73 74 65 72 5f 66 64 2c 20 66 64 20 3d 20 2d 31  ster_fd, fd = -1
6eb0: 3b 0a 0a 09 2f 2a 20 52 65 61 64 20 61 72 67 75  ;.../* Read argu
6ec0: 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d 20  ments */..arg = 
6ed0: 61 72 67 5f 76 3b 0a 0a 09 6d 61 73 74 65 72 5f  arg_v;...master_
6ee0: 66 64 20 3d 20 61 72 67 2d 3e 66 64 3b 0a 09 6f  fd = arg->fd;..o
6ef0: 70 74 69 6f 6e 73 20 3d 20 26 61 72 67 2d 3e 6f  ptions = &arg->o
6f00: 70 74 69 6f 6e 73 3b 0a 0a 09 77 68 69 6c 65 20  ptions;...while 
6f10: 28 31 29 20 7b 0a 09 09 2f 2a 20 46 61 69 6c 75  (1) {.../* Failu
6f20: 72 65 20 6c 6f 6f 70 20 70 72 65 76 65 6e 74 69  re loop preventi
6f30: 6f 6e 20 2a 2f 0a 09 09 69 66 20 28 66 61 69 6c  on */...if (fail
6f40: 75 72 65 5f 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  ure_count > max_
6f50: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 29 20 7b  failure_count) {
6f60: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
6f70: 09 09 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
6f80: 6e 65 77 20 6c 6f 67 20 62 75 66 66 65 72 20 2a  new log buffer *
6f90: 2f 0a 09 09 6c 6f 67 20 3d 20 66 69 6c 65 64 5f  /...log = filed_
6fa0: 6c 6f 67 5f 6e 65 77 28 31 29 3b 0a 09 09 69 66  log_new(1);...if
6fb0: 20 28 6c 6f 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (log == NULL) {
6fc0: 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ....filed_log_ms
6fd0: 67 28 22 41 4c 4c 4f 43 41 54 45 5f 4c 4f 47 5f  g("ALLOCATE_LOG_
6fe0: 4d 53 47 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09  MSG_FAILED");...
6ff0: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
7000: 6c 6f 67 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45  log->type = FILE
7010: 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41 4e 53  D_LOG_TYPE_TRANS
7020: 46 45 52 3b 0a 0a 09 09 2f 2a 20 49 66 20 77 65  FER;..../* If we
7030: 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6c 64 20   closed the old 
7040: 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 61 63 63 65  connection, acce
7050: 70 74 20 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a  pt a new one */.
7060: 09 09 69 66 20 28 63 6f 6e 6e 65 63 74 69 6f 6e  ..if (connection
7070: 5f 73 74 61 74 65 20 3d 3d 20 46 49 4c 45 44 5f  _state == FILED_
7080: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45  CONNECTION_CLOSE
7090: 29 20 7b 0a 09 09 09 2f 2a 20 41 63 63 65 70 74  ) {..../* Accept
70a0: 20 61 20 6e 65 77 20 63 6c 69 65 6e 74 20 2a 2f   a new client */
70b0: 0a 09 09 09 61 64 64 72 6c 65 6e 20 3d 20 73 69  ....addrlen = si
70c0: 7a 65 6f 66 28 61 64 64 72 29 3b 0a 0a 09 09 09  zeof(addr);.....
70d0: 66 64 20 3d 20 61 63 63 65 70 74 28 6d 61 73 74  fd = accept(mast
70e0: 65 72 5f 66 64 2c 20 28 73 74 72 75 63 74 20 73  er_fd, (struct s
70f0: 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72  ockaddr *) &addr
7100: 2c 20 26 61 64 64 72 6c 65 6e 29 3b 0a 09 09 7d  , &addrlen);...}
7110: 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 77  ..../*... * If w
7120: 65 20 66 61 69 6c 2c 20 6d 61 6b 65 20 61 20 6e  e fail, make a n
7130: 6f 74 65 20 6f 66 20 69 74 20 73 6f 20 77 65 20  ote of it so we 
7140: 64 6f 6e 27 74 20 67 6f 20 69 6e 74 6f 20 61 20  don't go into a 
7150: 6c 6f 6f 70 20 6f 66 0a 09 09 20 2a 20 61 63 63  loop of... * acc
7160: 65 70 74 28 29 20 66 61 69 6c 69 6e 67 0a 09 09  ept() failing...
7170: 20 2a 2f 0a 09 09 69 66 20 28 66 64 20 3c 20 30   */...if (fd < 0
7180: 29 20 7b 0a 09 09 09 2f 2a 20 4c 6f 67 20 74 68  ) {..../* Log th
7190: 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
71a0: 20 2a 2f 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67   */....filed_log
71b0: 5f 6d 73 67 28 22 41 43 43 45 50 54 5f 46 41 49  _msg("ACCEPT_FAI
71c0: 4c 45 44 22 29 3b 0a 0a 09 09 09 66 61 69 6c 75  LED");.....failu
71d0: 72 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09  re_count++;.....
71e0: 66 69 6c 65 64 5f 6c 6f 67 5f 66 72 65 65 28 6c  filed_log_free(l
71f0: 6f 67 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  og);.....continu
7200: 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 46 69 6c  e;...}..../* Fil
7210: 6c 20 69 6e 20 6c 6f 67 20 73 74 72 75 63 74 75  l in log structu
7220: 72 65 20 2a 2f 0a 09 09 69 66 20 28 66 69 6c 65  re */...if (file
7230: 64 5f 6c 6f 67 5f 69 70 28 28 73 74 72 75 63 74  d_log_ip((struct
7240: 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64   sockaddr *) &ad
7250: 64 72 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73 69 7a  dr, log->ip, siz
7260: 65 6f 66 28 6c 6f 67 2d 3e 69 70 29 29 20 3d 3d  eof(log->ip)) ==
7270: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 2d   NULL) {....log-
7280: 3e 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09  >ip[0] = '\0';..
7290: 09 09 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 30 3b  ..log->port = 0;
72a0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
72b0: 6f 67 2d 3e 70 6f 72 74 20 3d 20 61 64 64 72 2e  og->port = addr.
72c0: 73 69 6e 36 5f 70 6f 72 74 3b 0a 09 09 7d 0a 0a  sin6_port;...}..
72d0: 09 09 2f 2a 20 52 65 73 65 74 20 66 61 69 6c 75  ../* Reset failu
72e0: 72 65 20 63 6f 75 6e 74 2a 2f 0a 09 09 66 61 69  re count*/...fai
72f0: 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  lure_count = 0;.
7300: 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20 73 6f 63  .../* Handle soc
7310: 6b 65 74 20 2a 2f 0a 09 09 63 6f 6e 6e 65 63 74  ket */...connect
7320: 69 6f 6e 5f 73 74 61 74 65 20 3d 20 66 69 6c 65  ion_state = file
7330: 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28  d_handle_client(
7340: 66 64 2c 20 26 72 65 71 75 65 73 74 2c 20 6c 6f  fd, &request, lo
7350: 67 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a 09 7d 0a  g, options);..}.
7360: 0a 09 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f  ../* Report erro
7370: 72 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  r */..filed_log_
7380: 6d 73 67 28 22 54 48 52 45 41 44 5f 44 49 45 44  msg("THREAD_DIED
7390: 20 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72   ABNORMAL");...r
73a0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f  eturn(NULL);.../
73b0: 2a 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f  * local_dummy_lo
73c0: 67 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  g is only used i
73d0: 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47  f FILED_DONT_LOG
73e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74 68   is enabled, oth
73f0: 65 72 77 69 73 65 20 69 74 27 73 20 6e 6f 74 20  erwise it's not 
7400: 75 73 65 64 2c 20 62 75 74 20 74 68 65 20 63 6f  used, but the co
7410: 6d 70 69 6c 65 72 20 68 61 74 65 73 20 74 68 61  mpiler hates tha
7420: 74 20 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61  t idea. */..loca
7430: 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65  l_dummy_log.type
7440: 20 3d 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d   = 0;..local_dum
7450: 6d 79 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f  my_log.type = lo
7460: 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79  cal_dummy_log.ty
7470: 70 65 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65  pe;.}../* Create
7480: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20   worker threads 
7490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
74a0: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
74b0: 64 73 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c 20  ds_init(int fd, 
74c0: 69 6e 74 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  int thread_count
74d0: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f  , struct filed_o
74e0: 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29  ptions *options)
74f0: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
7500: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61  _worker_thread_a
7510: 72 67 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65  rgs *arg;..pthre
7520: 61 64 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09  ad_t threadid;..
7530: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b  int pthread_ret;
7540: 0a 09 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28  ..int i;...for (
7550: 69 20 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61  i = 0; i < threa
7560: 64 5f 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a  d_count; i++) {.
7570: 09 09 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73  ..arg = malloc(s
7580: 69 7a 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09  izeof(*arg));...
7590: 09 61 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 09  .arg->fd = fd;..
75a0: 09 6d 65 6d 63 70 79 28 26 61 72 67 2d 3e 6f 70  .memcpy(&arg->op
75b0: 74 69 6f 6e 73 2c 20 6f 70 74 69 6f 6e 73 2c 20  tions, options, 
75c0: 73 69 7a 65 6f 66 28 2a 6f 70 74 69 6f 6e 73 29  sizeof(*options)
75d0: 29 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  );....pthread_re
75e0: 74 20 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61  t = pthread_crea
75f0: 74 65 28 26 74 68 72 65 61 64 69 64 2c 20 4e 55  te(&threadid, NU
7600: 4c 4c 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  LL, filed_worker
7610: 5f 74 68 72 65 61 64 2c 20 61 72 67 29 3b 0a 09  _thread, arg);..
7620: 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
7630: 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   != 0) {....retu
7640: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
7650: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
7660: 2a 20 44 69 73 70 6c 61 79 20 68 65 6c 70 20 2a  * Display help *
7670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
7680: 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46  led_print_help(F
7690: 49 4c 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74  ILE *output, int
76a0: 20 6c 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73   long_help, cons
76b0: 74 20 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b  t char *extra) {
76c0: 0a 09 69 66 20 28 65 78 74 72 61 29 20 7b 0a 09  ..if (extra) {..
76d0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
76e0: 20 22 25 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b   "%s\n", extra);
76f0: 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75  ..}...fprintf(ou
7700: 74 70 75 74 2c 20 22 55 73 61 67 65 3a 20 66 69  tput, "Usage: fi
7710: 6c 65 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c  led [<options>]\
7720: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
7730: 74 70 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73  tput, "  Options
7740: 3a 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  :\n");..fprintf(
7750: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
7760: 68 2c 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09  h, --help\n");..
7770: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
7780: 22 20 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65  "      -d, --dae
7790: 6d 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  mon\n");..fprint
77a0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
77b0: 20 2d 76 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c 6e   -v, --version\n
77c0: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
77d0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 56 2c 20  put, "      -V, 
77e0: 2d 2d 76 68 6f 73 74 5c 6e 22 29 3b 0a 09 66 70  --vhost\n");..fp
77f0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
7800: 20 20 20 20 20 2d 62 20 3c 61 64 64 72 65 73 73       -b <address
7810: 3e 2c 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72 65  >, --bind <addre
7820: 73 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  ss>\n");..fprint
7830: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
7840: 20 2d 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f   -p <port>, --po
7850: 72 74 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09  rt <port>\n");..
7860: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
7870: 22 20 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e 74  "      -t <count
7880: 3e 2c 20 2d 2d 74 68 72 65 61 64 73 20 3c 63 6f  >, --threads <co
7890: 75 6e 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  unt>\n");..fprin
78a0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
78b0: 20 20 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c 20    -c <entries>, 
78c0: 2d 2d 63 61 63 68 65 20 3c 65 6e 74 72 69 65 73  --cache <entries
78d0: 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  >\n");..fprintf(
78e0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
78f0: 6c 20 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20  l <file>, --log 
7900: 3c 66 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70 72  <file>\n");..fpr
7910: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
7920: 20 20 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20 2d      -u <user>, -
7930: 2d 75 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22 29  -user <user>\n")
7940: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
7950: 74 2c 20 22 20 20 20 20 20 20 2d 72 20 3c 64 69  t, "      -r <di
7960: 72 65 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74  rectory>, --root
7970: 20 3c 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22 29   <directory>\n")
7980: 3b 0a 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65 6c  ;...if (long_hel
7990: 70 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f  p) {...fprintf(o
79a0: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
79b0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
79c0: 22 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 09  "  Usage:\n");..
79d0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
79e0: 20 22 20 20 20 20 20 20 2d 68 20 28 6f 72 20 2d   "      -h (or -
79f0: 2d 68 65 6c 70 29 20 70 72 69 6e 74 73 20 74 68  -help) prints th
7a00: 69 73 20 75 73 61 67 65 20 69 6e 66 6f 72 6d 61  is usage informa
7a10: 74 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72  tion.\n");...fpr
7a20: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
7a30: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
7a40: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64 20  tput, "      -d 
7a50: 28 6f 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e  (or --daemon) in
7a60: 73 74 72 75 63 74 73 20 66 69 6c 65 64 20 74 6f  structs filed to
7a70: 20 62 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e   become a daemon
7a80: 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a   after initializ
7a90: 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ing\n");...fprin
7aa0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ac0: 20 20 20 74 68 65 20 6c 69 73 74 65 6e 69 6e 67     the listening
7ad0: 20 54 43 50 20 73 6f 63 6b 65 74 20 61 6e 64 20   TCP socket and 
7ae0: 6c 6f 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a  log files.\n");.
7af0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
7b00: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  , "\n");...fprin
7b10: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
7b20: 20 20 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73 69    -v (or --versi
7b30: 6f 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66 69  on) instructs fi
7b40: 6c 65 64 20 70 72 69 6e 74 20 6f 75 74 20 74 68  led print out th
7b50: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
7b60: 20 61 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b 0a   and exit.\n");.
7b70: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
7b80: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  , "\n");...fprin
7b90: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
7ba0: 20 20 2d 56 20 28 6f 72 20 2d 2d 76 68 6f 73 74    -V (or --vhost
7bb0: 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65  ) instructs file
7bc0: 64 20 74 6f 20 70 72 65 70 65 6e 64 20 61 6c 6c  d to prepend all
7bd0: 20 72 65 71 75 65 73 74 73 20 77 69 74 68 20 74   requests with t
7be0: 68 65 69 72 20 48 54 54 50 5c 6e 22 29 3b 0a 09  heir HTTP\n");..
7bf0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
7c00: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
7c10: 20 20 20 20 20 20 20 20 48 6f 73 74 20 68 65 61          Host hea
7c20: 64 65 72 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69  der.\n");...fpri
7c30: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
7c40: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
7c50: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20 28  put, "      -b (
7c60: 6f 72 20 2d 2d 62 69 6e 64 29 20 73 70 65 63 69  or --bind) speci
7c70: 66 69 65 73 20 74 68 65 20 61 64 64 72 65 73 73  fies the address
7c80: 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69   to listen for i
7c90: 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29  ncoming HTTP\n")
7ca0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
7cb0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
7cc0: 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73            reques
7cd0: 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61  ts on.  The defa
7ce0: 75 6c 74 20 76 61 6c 75 65 20 69 73 20 5c 22 25  ult value is \"%
7cf0: 73 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41 44  s\".\n", BIND_AD
7d00: 44 52 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  DR);...fprintf(o
7d10: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
7d20: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
7d30: 22 20 20 20 20 20 20 2d 70 20 28 6f 72 20 2d 2d  "      -p (or --
7d40: 70 6f 72 74 29 20 73 70 65 63 69 66 69 65 73 20  port) specifies 
7d50: 74 68 65 20 54 43 50 20 70 6f 72 74 20 6e 75 6d  the TCP port num
7d60: 62 65 72 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f  ber to listen fo
7d70: 72 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c  r incoming HTTP\
7d80: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
7d90: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71               req
7db0: 75 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64  uests on.  The d
7dc0: 65 66 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e 22  efault is %u.\n"
7dd0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
7de0: 20 50 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e 74   PORT);...fprint
7df0: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
7e00: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
7e10: 74 2c 20 22 20 20 20 20 20 20 2d 74 20 28 6f 72  t, "      -t (or
7e20: 20 2d 2d 74 68 72 65 61 64 73 29 20 73 70 65 63   --threads) spec
7e30: 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
7e40: 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61   of worker threa
7e50: 64 73 20 74 6f 20 63 72 65 61 74 65 2e 20 45 61  ds to create. Ea
7e60: 63 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ch\n");...fprint
7e70: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64     worker thread
7ea0: 20 63 61 6e 20 73 65 72 76 69 63 65 20 6f 6e 65   can service one
7eb0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 48 54 54 50   concurrent HTTP
7ec0: 20 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09   session.\n");..
7ed0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
7ee0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
7ef0: 20 20 20 20 20 20 20 20 20 20 54 68 75 73 20 74            Thus t
7f00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72  he number of thr
7f10: 65 61 64 73 20 63 72 65 61 74 65 64 20 77 69 6c  eads created wil
7f20: 6c 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 5c  l determine how\
7f30: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
7f40: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 6d 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f 75  many simultaneou
7f70: 73 20 74 72 61 6e 73 66 65 72 73 20 77 69 6c 6c  s transfers will
7f80: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   be possible. Th
7f90: 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  e\n");...fprintf
7fa0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75    default is %lu
7fd0: 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  .\n", (unsigned 
7fe0: 6c 6f 6e 67 29 20 54 48 52 45 41 44 5f 43 4f 55  long) THREAD_COU
7ff0: 4e 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  NT);...fprintf(o
8000: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
8010: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
8020: 22 20 20 20 20 20 20 2d 63 20 28 6f 72 20 2d 2d  "      -c (or --
8030: 63 61 63 68 65 29 20 73 70 65 63 69 66 69 65 73  cache) specifies
8040: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
8050: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
8060: 63 61 63 68 65 20 65 6e 74 72 69 65 73 5c 6e 22  cache entries\n"
8070: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
8080: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
8090: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 61              to a
80a0: 6c 6c 6f 63 61 74 65 2e 20 20 45 61 63 68 20 63  llocate.  Each c
80b0: 61 63 68 65 20 65 6e 74 72 79 20 68 6f 6c 64 73  ache entry holds
80c0: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
80d0: 6e 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69  n as\n");...fpri
80e0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f 70     well as an op
8110: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
8120: 6f 72 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  or to the file, 
8130: 73 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22 29 3b  so resource\n");
8140: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
8150: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
8160: 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 73            limits
8170: 20 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29 20   (i.e., ulimit) 
8180: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64  should be consid
8190: 65 72 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75  ered.  This shou
81a0: 6c 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ld\n");...fprint
81b0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62   be a prime numb
81e0: 65 72 20 66 6f 72 20 69 64 65 61 6c 20 75 73 65  er for ideal use
81f0: 20 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75 70   with the lookup
8200: 20 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09   method.\n");...
8210: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
8220: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8230: 20 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75         The defau
8240: 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28  lt is %lu.\n", (
8250: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43  unsigned long) C
8260: 41 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66 70  ACHE_SIZE);...fp
8270: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
8280: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
8290: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c  utput, "      -l
82a0: 20 28 6f 72 20 2d 2d 6c 6f 67 29 20 73 70 65 63   (or --log) spec
82b0: 69 66 69 65 73 20 61 20 66 69 6c 65 6e 61 6d 65  ifies a filename
82c0: 20 74 6f 20 6f 70 65 6e 20 66 6f 72 20 77 72 69   to open for wri
82d0: 74 69 6e 67 20 6c 6f 67 20 65 6e 74 72 69 65 73  ting log entries
82e0: 2e 20 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09 66 70  .  Log\n");...fp
82f0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d     entries are m
8320: 61 64 65 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ade for various 
8330: 73 74 61 67 65 73 20 69 6e 20 74 72 61 6e 73 66  stages in transf
8340: 65 72 69 6e 67 20 66 69 6c 65 73 2e 5c 6e 22 29  ering files.\n")
8350: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
8360: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
8370: 20 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67           The log
8380: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
8390: 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
83a0: 20 75 73 65 72 73 20 28 73 65 65 20 5c 22 2d 75   users (see \"-u
83b0: 5c 22 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  \")\n");...fprin
83c0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 61 6e 64 20 72 6f 6f 74 20 64 69 72 65 63 74 6f  and root directo
83f0: 72 69 65 73 20 28 73 65 65 20 5c 22 2d 72 5c 22  ries (see \"-r\"
8400: 29 2e 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65  ).  The log file
8410: 20 69 73 20 6e 65 76 65 72 5c 6e 22 29 3b 0a 09   is never\n");..
8420: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8430: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
8440: 20 20 20 20 20 20 63 6c 6f 73 65 64 20 73 6f 20        closed so 
8450: 6c 6f 67 20 72 6f 74 61 74 69 6f 6e 20 77 69 74  log rotation wit
8460: 68 6f 75 74 20 73 74 6f 70 70 69 6e 67 20 74 68  hout stopping th
8470: 65 20 64 61 65 6d 6f 6e 20 69 73 20 77 69 6c 6c  e daemon is will
8480: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
8490: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74               not
84b0: 20 77 6f 72 6b 2e 20 20 54 68 65 20 76 61 6c 75   work.  The valu
84c0: 65 20 6f 66 20 5c 22 2d 5c 22 20 69 6e 64 69 63  e of \"-\" indic
84d0: 61 74 65 73 20 74 68 61 74 20 73 74 61 6e 64 61  ates that standa
84e0: 72 64 20 6f 75 74 70 75 74 5c 6e 22 29 3b 0a 09  rd output\n");..
84f0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
8500: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
8510: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
8520: 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67  used for logging
8530: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 6e 61  .  If the filena
8540: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  me begins with a
8550: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
8560: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 69 70               pip
8580: 65 20 28 5c 22 7c 5c 22 29 20 74 68 65 6e 20 61  e (\"|\") then a
8590: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 61 72   process is star
85a0: 74 65 64 20 61 6e 64 20 75 73 65 64 20 66 6f 72  ted and used for
85b0: 20 6c 6f 67 67 69 6e 67 5c 6e 22 29 3b 0a 09 09   logging\n");...
85c0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
85d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
85e0: 20 20 20 20 20 69 6e 73 74 65 61 64 20 6f 66 20       instead of 
85f0: 61 20 66 69 6c 65 2e 20 20 54 68 65 20 64 65 66  a file.  The def
8600: 61 75 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e 5c  ault is \"%s\".\
8610: 6e 22 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a 23  n", LOG_FILE);.#
8620: 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54  ifdef FILED_DONT
8630: 5f 4c 4f 47 0a 09 09 66 70 72 69 6e 74 66 28 6f  _LOG...fprintf(o
8640: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
8650: 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 65              Note
8660: 20 74 68 61 74 20 6c 6f 67 67 69 6e 67 20 69 73   that logging is
8670: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 61   completely disa
8680: 62 6c 65 64 20 73 6f 20 74 68 69 73 20 6f 70 74  bled so this opt
8690: 69 6f 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09 09  ion does\n");...
86a0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
86b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
86c0: 20 20 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e 20       nothing in 
86d0: 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b  this build.\n");
86e0: 0a 23 65 6e 64 69 66 0a 09 09 66 70 72 69 6e 74  .#endif...fprint
86f0: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
8700: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
8710: 74 2c 20 22 20 20 20 20 20 20 2d 75 20 28 6f 72  t, "      -u (or
8720: 20 2d 2d 75 73 65 72 29 20 73 70 65 63 69 66 69   --user) specifi
8730: 65 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 73  es the user to s
8740: 77 69 74 63 68 20 75 73 65 72 20 49 44 73 20 74  witch user IDs t
8750: 6f 20 62 65 66 6f 72 65 20 73 65 72 76 69 63 69  o before servici
8760: 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ng\n");...fprint
8770: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 72 65 71 75 65 73 74 73 2e 20 20 54 68 65 20 64  requests.  The d
87a0: 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68  efault is not ch
87b0: 61 6e 67 65 20 75 73 65 72 20 49 44 73 2e 5c 6e  ange user IDs.\n
87c0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
87d0: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
87e0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
87f0: 20 20 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d 72        -r (or --r
8800: 6f 6f 74 29 20 73 70 65 63 69 66 69 65 73 20 74  oot) specifies t
8810: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
8820: 61 63 74 20 61 73 20 74 68 65 20 72 6f 6f 74 20  act as the root 
8830: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e 22  directory for\n"
8840: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
8850: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
8860: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 66             the f
8870: 69 6c 65 20 73 65 72 76 65 72 2e 20 20 49 66 20  ile server.  If 
8880: 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 73  this option is s
8890: 70 65 63 69 66 69 65 64 2c 20 63 68 72 6f 6f 74  pecified, chroot
88a0: 28 32 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  (2)\n");...fprin
88b0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 65   is called.  The
88e0: 20 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20   default is not 
88f0: 63 68 61 6e 67 65 20 72 6f 6f 74 20 64 69 72 65  change root dire
8900: 63 74 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09 09  ctories,\n");...
8910: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
8920: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8930: 20 20 20 20 20 20 74 68 61 74 20 69 73 2c 20 74        that is, t
8940: 68 65 20 5c 22 2f 5c 22 20 64 69 72 65 63 74 6f  he \"/\" directo
8950: 72 79 20 69 73 20 73 68 61 72 65 64 20 6f 75 74  ry is shared out
8960: 2e 20 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22 29  .  This will\n")
8970: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
8980: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
8990: 20 20 20 20 20 20 20 20 20 20 6c 69 6b 65 6c 79            likely
89a0: 20 62 65 20 61 20 73 65 63 75 72 69 74 79 20 69   be a security i
89b0: 73 73 75 65 2c 20 73 6f 20 74 68 69 73 20 6f 70  ssue, so this op
89c0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
89d0: 79 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ys\n");...fprint
89e0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 62 65 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09 7d  be used.\n");..}
8a10: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
8a20: 20 41 64 64 20 61 20 67 65 74 6f 70 74 20 6f 70   Add a getopt op
8a30: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
8a40: 6f 69 64 20 66 69 6c 65 64 5f 67 65 74 6f 70 74  oid filed_getopt
8a50: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74 72  _long_setopt(str
8a60: 75 63 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74 2c  uct option *opt,
8a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
8a80: 65 2c 20 69 6e 74 20 68 61 73 5f 61 72 67 2c 20  e, int has_arg, 
8a90: 69 6e 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74 2d  int val) {..opt-
8aa0: 3e 6e 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d 65  >name     = name
8ab0: 3b 0a 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67 20  ;..opt->has_arg 
8ac0: 20 3d 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70 74   = has_arg;..opt
8ad0: 2d 3e 66 6c 61 67 20 20 20 20 20 3d 20 4e 55 4c  ->flag     = NUL
8ae0: 4c 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20 20  L;..opt->val    
8af0: 20 20 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75 72    = val;...retur
8b00: 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65  n;.}../* Resolve
8b10: 20 61 20 75 73 65 72 6e 61 6d 65 20 74 6f 20 61   a username to a
8b20: 20 55 49 44 20 2a 2f 0a 73 74 61 74 69 63 20 69   UID */.static i
8b30: 6e 74 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f  nt filed_user_lo
8b40: 6f 6b 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  okup(const char 
8b50: 2a 75 73 65 72 2c 20 75 69 64 5f 74 20 2a 75 73  *user, uid_t *us
8b60: 65 72 5f 69 64 29 20 7b 0a 09 63 68 61 72 20 2a  er_id) {..char *
8b70: 6e 65 78 74 3b 0a 09 75 69 64 5f 74 20 75 73 65  next;..uid_t use
8b80: 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66 6e  r_id_check;.#ifn
8b90: 64 65 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45 54  def FILED_NO_GET
8ba0: 50 57 4e 41 4d 0a 09 73 74 72 75 63 74 20 70 61  PWNAM..struct pa
8bb0: 73 73 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e 74  sswd *ent;...ent
8bc0: 20 3d 20 67 65 74 70 77 6e 61 6d 28 75 73 65 72   = getpwnam(user
8bd0: 29 3b 0a 09 69 66 20 28 65 6e 74 20 21 3d 20 4e  );..if (ent != N
8be0: 55 4c 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f 69  ULL) {...*user_i
8bf0: 64 20 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64 3b  d = ent->pw_uid;
8c00: 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  ....return(0);..
8c10: 7d 0a 23 65 6e 64 69 66 0a 0a 09 75 73 65 72 5f  }.#endif...user_
8c20: 69 64 5f 63 68 65 63 6b 20 3d 20 73 74 72 74 6f  id_check = strto
8c30: 75 6c 6c 28 75 73 65 72 2c 20 26 6e 65 78 74 2c  ull(user, &next,
8c40: 20 31 30 29 3b 0a 09 69 66 20 28 6e 65 78 74 20   10);..if (next 
8c50: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
8c60: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  urn(1);..}...if 
8c70: 28 6e 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30 27  (next[0] != '\0'
8c80: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
8c90: 0a 09 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20 3d  ..}...*user_id =
8ca0: 20 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a   user_id_check;.
8cb0: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
8cc0: 2f 2a 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f 0a  /* Daemonize */.
8cd0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
8ce0: 5f 64 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29  _daemonize(void)
8cf0: 20 7b 0a 09 70 69 64 5f 74 20 73 65 74 73 69 64   {..pid_t setsid
8d00: 5f 72 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b 0a  _ret, fork_ret;.
8d10: 09 69 6e 74 20 63 68 64 69 72 5f 72 65 74 2c 20  .int chdir_ret, 
8d20: 64 75 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20 66  dup2_ret;..int f
8d30: 64 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a 09  d_in, fd_out;...
8d40: 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69  chdir_ret = chdi
8d50: 72 28 22 2f 22 29 3b 0a 09 69 66 20 28 63 68 64  r("/");..if (chd
8d60: 69 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  ir_ret != 0) {..
8d70: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
8d80: 09 66 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72 6b  .fork_ret = fork
8d90: 28 29 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65  ();..if (fork_re
8da0: 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72  t < 0) {...retur
8db0: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  n(1);..}...if (f
8dc0: 6f 72 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09  ork_ret > 0) {..
8dd0: 09 2f 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09 09  ./* Parent */...
8de0: 77 61 69 74 70 69 64 28 66 6f 72 6b 5f 72 65 74  waitpid(fork_ret
8df0: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 65  , NULL, 0);....e
8e00: 78 69 74 28 45 58 49 54 5f 53 55 43 43 45 53 53  xit(EXIT_SUCCESS
8e10: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c 64  );..}.../* Child
8e20: 20 2a 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29 20   */..if (fork() 
8e30: 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68 69  != 0) {.../* Chi
8e40: 6c 64 20 2a 2f 0a 09 09 65 78 69 74 28 45 58 49  ld */...exit(EXI
8e50: 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a  T_SUCCESS);..}..
8e60: 09 2f 2a 20 47 72 61 6e 64 20 63 68 69 6c 64 20  ./* Grand child 
8e70: 2a 2f 0a 09 73 65 74 73 69 64 5f 72 65 74 20 3d  */..setsid_ret =
8e80: 20 73 65 74 73 69 64 28 29 3b 0a 09 69 66 20 28   setsid();..if (
8e90: 73 65 74 73 69 64 5f 72 65 74 20 3d 3d 20 28 28  setsid_ret == ((
8ea0: 70 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09  pid_t) -1)) {...
8eb0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
8ec0: 66 64 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f 64  fd_in = open("/d
8ed0: 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e  ev/null", O_RDON
8ee0: 4c 59 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20 6f  LY);..fd_out = o
8ef0: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
8f00: 20 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66 20   O_WRONLY);..if 
8f10: 28 66 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66 64  (fd_in < 0 || fd
8f20: 5f 6f 75 74 20 3c 20 30 29 20 7b 0a 09 09 72 65  _out < 0) {...re
8f30: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75  turn(1);..}...du
8f40: 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64  p2_ret = dup2(fd
8f50: 5f 69 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45 4e  _in, STDIN_FILEN
8f60: 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65  O);..if (dup2_re
8f70: 74 20 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45 4e  t != STDIN_FILEN
8f80: 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  O) {...return(1)
8f90: 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20  ;..}...dup2_ret 
8fa0: 3d 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53  = dup2(fd_out, S
8fb0: 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09  TDOUT_FILENO);..
8fc0: 69 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20  if (dup2_ret != 
8fd0: 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20 7b  STDOUT_FILENO) {
8fe0: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
8ff0: 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75  ...dup2_ret = du
9000: 70 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 45 52  p2(fd_out, STDER
9010: 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28  R_FILENO);..if (
9020: 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 45  dup2_ret != STDE
9030: 52 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72  RR_FILENO) {...r
9040: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 63  eturn(1);..}...c
9050: 6c 6f 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63 6c  lose(fd_in);..cl
9060: 6f 73 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09 72  ose(fd_out);...r
9070: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
9080: 52 75 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a 69  Run process */.i
9090: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
90a0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b  , char **argv) {
90b0: 0a 09 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20  ..struct option 
90c0: 6f 70 74 69 6f 6e 73 5b 31 32 5d 3b 0a 09 73 74  options[12];..st
90d0: 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f  ruct filed_optio
90e0: 6e 73 20 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e  ns thread_option
90f0: 73 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  s;..const char *
9100: 62 69 6e 64 5f 61 64 64 72 20 3d 20 42 49 4e 44  bind_addr = BIND
9110: 5f 41 44 44 52 2c 20 2a 6e 65 77 72 6f 6f 74 20  _ADDR, *newroot 
9120: 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f 67 5f 66 69 6c  = NULL, *log_fil
9130: 65 20 3d 20 4c 4f 47 5f 46 49 4c 45 3b 0a 09 46  e = LOG_FILE;..F
9140: 49 4c 45 20 2a 6c 6f 67 5f 66 70 3b 0a 09 75 69  ILE *log_fp;..ui
9150: 64 5f 74 20 75 73 65 72 20 3d 20 30 3b 0a 09 69  d_t user = 0;..i
9160: 6e 74 20 70 6f 72 74 20 3d 20 50 4f 52 54 2c 20  nt port = PORT, 
9170: 74 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 54  thread_count = T
9180: 48 52 45 41 44 5f 43 4f 55 4e 54 3b 0a 09 69 6e  HREAD_COUNT;..in
9190: 74 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 43  t cache_size = C
91a0: 41 43 48 45 5f 53 49 5a 45 3b 0a 09 69 6e 74 20  ACHE_SIZE;..int 
91b0: 69 6e 69 74 5f 72 65 74 2c 20 63 68 72 6f 6f 74  init_ret, chroot
91c0: 5f 72 65 74 2c 20 73 65 74 75 69 64 5f 72 65 74  _ret, setuid_ret
91d0: 2c 20 6c 6f 6f 6b 75 70 5f 72 65 74 2c 20 63 68  , lookup_ret, ch
91e0: 64 69 72 5f 72 65 74 3b 0a 09 69 6e 74 20 73 65  dir_ret;..int se
91f0: 74 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 30  tuid_enabled = 0
9200: 2c 20 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64  , daemon_enabled
9210: 20 3d 20 30 3b 0a 09 69 6e 74 20 63 68 3b 0a 09   = 0;..int ch;..
9220: 69 6e 74 20 66 64 3b 0a 0a 09 2f 2a 20 53 65 74  int fd;.../* Set
9230: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
9240: 2a 2f 0a 09 74 68 72 65 61 64 5f 6f 70 74 69 6f  */..thread_optio
9250: 6e 73 2e 76 68 6f 73 74 73 5f 65 6e 61 62 6c 65  ns.vhosts_enable
9260: 64 20 3d 20 30 3b 0a 0a 09 2f 2a 20 50 72 6f 63  d = 0;.../* Proc
9270: 65 73 73 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ess arguments */
9280: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
9290: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
92a0: 6f 6e 73 5b 30 5d 2c 20 22 70 6f 72 74 22 2c 20  ons[0], "port", 
92b0: 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e  required_argumen
92c0: 74 2c 20 27 70 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'p');..filed_
92d0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
92e0: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31 5d 2c 20  pt(&options[1], 
92f0: 22 74 68 72 65 61 64 73 22 2c 20 72 65 71 75 69  "threads", requi
9300: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 74  red_argument, 't
9310: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
9320: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
9330: 70 74 69 6f 6e 73 5b 32 5d 2c 20 22 63 61 63 68  ptions[2], "cach
9340: 65 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67  e", required_arg
9350: 75 6d 65 6e 74 2c 20 27 63 27 29 3b 0a 09 66 69  ument, 'c');..fi
9360: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
9370: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
9380: 33 5d 2c 20 22 62 69 6e 64 22 2c 20 72 65 71 75  3], "bind", requ
9390: 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27  ired_argument, '
93a0: 62 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  b');..filed_geto
93b0: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
93c0: 6f 70 74 69 6f 6e 73 5b 34 5d 2c 20 22 75 73 65  options[4], "use
93d0: 72 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67  r", required_arg
93e0: 75 6d 65 6e 74 2c 20 27 75 27 29 3b 0a 09 66 69  ument, 'u');..fi
93f0: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
9400: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
9410: 35 5d 2c 20 22 72 6f 6f 74 22 2c 20 72 65 71 75  5], "root", requ
9420: 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27  ired_argument, '
9430: 72 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  r');..filed_geto
9440: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
9450: 6f 70 74 69 6f 6e 73 5b 36 5d 2c 20 22 68 65 6c  options[6], "hel
9460: 70 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c  p", no_argument,
9470: 20 27 68 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'h');..filed_ge
9480: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
9490: 28 26 6f 70 74 69 6f 6e 73 5b 37 5d 2c 20 22 64  (&options[7], "d
94a0: 61 65 6d 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d  aemon", no_argum
94b0: 65 6e 74 2c 20 27 64 27 29 3b 0a 09 66 69 6c 65  ent, 'd');..file
94c0: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
94d0: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 38 5d  topt(&options[8]
94e0: 2c 20 22 6c 6f 67 22 2c 20 72 65 71 75 69 72 65  , "log", require
94f0: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 6c 27 29  d_argument, 'l')
9500: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
9510: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
9520: 69 6f 6e 73 5b 39 5d 2c 20 22 76 65 72 73 69 6f  ions[9], "versio
9530: 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c  n", no_argument,
9540: 20 27 76 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'v');..filed_ge
9550: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
9560: 28 26 6f 70 74 69 6f 6e 73 5b 31 30 5d 2c 20 22  (&options[10], "
9570: 76 68 6f 73 74 22 2c 20 6e 6f 5f 61 72 67 75 6d  vhost", no_argum
9580: 65 6e 74 2c 20 27 56 27 29 3b 0a 09 66 69 6c 65  ent, 'V');..file
9590: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
95a0: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31 31  topt(&options[11
95b0: 5d 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a  ], NULL, 0, 0);.
95c0: 09 77 68 69 6c 65 20 28 28 63 68 20 3d 20 67 65  .while ((ch = ge
95d0: 74 6f 70 74 5f 6c 6f 6e 67 28 61 72 67 63 2c 20  topt_long(argc, 
95e0: 61 72 67 76 2c 20 22 70 3a 74 3a 63 3a 62 3a 75  argv, "p:t:c:b:u
95f0: 3a 72 3a 6c 3a 68 64 76 56 22 2c 20 6f 70 74 69  :r:l:hdvV", opti
9600: 6f 6e 73 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 2d  ons, NULL)) != -
9610: 31 29 20 7b 0a 09 09 73 77 69 74 63 68 28 63 68  1) {...switch(ch
9620: 29 20 7b 0a 09 09 09 63 61 73 65 20 27 70 27 3a  ) {....case 'p':
9630: 0a 09 09 09 09 70 6f 72 74 20 3d 20 61 74 6f 69  .....port = atoi
9640: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
9650: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 74 27  eak;....case 't'
9660: 3a 0a 09 09 09 09 74 68 72 65 61 64 5f 63 6f 75  :.....thread_cou
9670: 6e 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67  nt = atoi(optarg
9680: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
9690: 09 63 61 73 65 20 27 63 27 3a 0a 09 09 09 09 63  .case 'c':.....c
96a0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 61 74 6f 69  ache_size = atoi
96b0: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
96c0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 62 27  eak;....case 'b'
96d0: 3a 0a 09 09 09 09 62 69 6e 64 5f 61 64 64 72 20  :.....bind_addr 
96e0: 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72 67 29  = strdup(optarg)
96f0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
9700: 63 61 73 65 20 27 75 27 3a 0a 09 09 09 09 73 65  case 'u':.....se
9710: 74 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 31  tuid_enabled = 1
9720: 3b 0a 09 09 09 09 6c 6f 6f 6b 75 70 5f 72 65 74  ;.....lookup_ret
9730: 20 3d 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f   = filed_user_lo
9740: 6f 6b 75 70 28 6f 70 74 61 72 67 2c 20 26 75 73  okup(optarg, &us
9750: 65 72 29 3b 0a 09 09 09 09 69 66 20 28 6c 6f 6f  er);.....if (loo
9760: 6b 75 70 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  kup_ret != 0) {.
9770: 09 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74  .....filed_print
9780: 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20 30 2c  _help(stderr, 0,
9790: 20 22 49 6e 76 61 6c 69 64 20 75 73 65 72 6e 61   "Invalid userna
97a0: 6d 65 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  me specified");.
97b0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b  ......return(1);
97c0: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
97d0: 3b 0a 09 09 09 63 61 73 65 20 27 72 27 3a 0a 09  ;....case 'r':..
97e0: 09 09 09 6e 65 77 72 6f 6f 74 20 3d 20 73 74 72  ...newroot = str
97f0: 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09  dup(optarg);....
9800: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
9810: 27 6c 27 3a 0a 09 09 09 09 6c 6f 67 5f 66 69 6c  'l':.....log_fil
9820: 65 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72  e = strdup(optar
9830: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
9840: 09 09 63 61 73 65 20 27 64 27 3a 0a 09 09 09 09  ..case 'd':.....
9850: 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d  daemon_enabled =
9860: 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09   1;.....break;..
9870: 09 09 63 61 73 65 20 27 56 27 3a 0a 09 09 09 09  ..case 'V':.....
9880: 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73 2e 76  thread_options.v
9890: 68 6f 73 74 73 5f 65 6e 61 62 6c 65 64 20 3d 20  hosts_enabled = 
98a0: 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  1;......break;..
98b0: 09 09 63 61 73 65 20 27 76 27 3a 0a 09 09 09 09  ..case 'v':.....
98c0: 70 72 69 6e 74 66 28 22 66 69 6c 65 64 20 76 65  printf("filed ve
98d0: 72 73 69 6f 6e 20 25 73 5c 6e 22 2c 20 46 49 4c  rsion %s\n", FIL
98e0: 45 44 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 09  ED_VERSION);....
98f0: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 09  ..return(0);....
9900: 63 61 73 65 20 27 3f 27 3a 0a 09 09 09 63 61 73  case '?':....cas
9910: 65 20 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65 64  e ':':.....filed
9920: 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65  _print_help(stde
9930: 72 72 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  rr, 0, NULL);...
9940: 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
9950: 09 63 61 73 65 20 27 68 27 3a 0a 09 09 09 09 66  .case 'h':.....f
9960: 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28  iled_print_help(
9970: 73 74 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c 29  stdout, 1, NULL)
9980: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 30 29  ;......return(0)
9990: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70  ;...}..}.../* Op
99a0: 65 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09  en log file */..
99b0: 6c 6f 67 5f 66 70 20 3d 20 66 69 6c 65 64 5f 6c  log_fp = filed_l
99c0: 6f 67 5f 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c 65  og_open(log_file
99d0: 29 3b 0a 09 69 66 20 28 6c 6f 67 5f 66 70 20 3d  );..if (log_fp =
99e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 65 72 72  = NULL) {...perr
99f0: 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70  or("filed_log_op
9a00: 65 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  en");....return(
9a10: 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  4);..}.../* Crea
9a20: 74 65 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63  te listening soc
9a30: 6b 65 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69 6c  ket */..fd = fil
9a40: 65 64 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f 61  ed_listen(bind_a
9a50: 64 64 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66 20  ddr, port);..if 
9a60: 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 70 65 72  (fd < 0) {...per
9a70: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 69 73 74 65  ror("filed_liste
9a80: 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  n");....return(1
9a90: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 63 6f 6d  );..}.../* Becom
9aa0: 65 20 61 20 64 61 65 6d 6f 6e 20 2a 2f 0a 09 69  e a daemon */..i
9ab0: 66 20 28 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65  f (daemon_enable
9ac0: 64 29 20 7b 0a 09 09 69 6e 69 74 5f 72 65 74 20  d) {...init_ret 
9ad0: 3d 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a  = filed_daemoniz
9ae0: 65 28 29 3b 0a 09 09 69 66 20 28 69 6e 69 74 5f  e();...if (init_
9af0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70  ret != 0) {....p
9b00: 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 64 61 65  error("filed_dae
9b10: 6d 6f 6e 69 7a 65 22 29 3b 0a 0a 09 09 09 72 65  monize");.....re
9b20: 74 75 72 6e 28 36 29 3b 0a 09 09 7d 0a 09 7d 0a  turn(6);...}..}.
9b30: 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66 20  ../* Chroot, if 
9b40: 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09  appropriate */..
9b50: 69 66 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a 09  if (newroot) {..
9b60: 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64  .chdir_ret = chd
9b70: 69 72 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09 69  ir(newroot);...i
9b80: 66 20 28 63 68 64 69 72 5f 72 65 74 20 21 3d 20  f (chdir_ret != 
9b90: 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  0) {....perror("
9ba0: 63 68 64 69 72 22 29 3b 0a 0a 09 09 09 72 65 74  chdir");.....ret
9bb0: 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 63  urn(1);...}....c
9bc0: 68 72 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72 6f  hroot_ret = chro
9bd0: 6f 74 28 22 2e 22 29 3b 0a 09 09 69 66 20 28 63  ot(".");...if (c
9be0: 68 72 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29 20  hroot_ret != 0) 
9bf0: 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68 72  {....perror("chr
9c00: 6f 6f 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  oot");.....retur
9c10: 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(1);...}..}.../
9c20: 2a 20 44 72 6f 70 20 70 72 69 76 69 6c 65 67 65  * Drop privilege
9c30: 73 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  s, if appropriat
9c40: 65 20 2a 2f 0a 09 69 66 20 28 73 65 74 75 69 64  e */..if (setuid
9c50: 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73 65  _enabled) {...se
9c60: 74 75 69 64 5f 72 65 74 20 3d 20 73 65 74 75 69  tuid_ret = setui
9c70: 64 28 75 73 65 72 29 3b 0a 09 09 69 66 20 28 73  d(user);...if (s
9c80: 65 74 75 69 64 5f 72 65 74 20 21 3d 20 30 29 20  etuid_ret != 0) 
9c90: 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 73 65 74  {....perror("set
9ca0: 75 69 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uid");.....retur
9cb0: 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(1);...}..}.../
9cc0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a  * Initialize */.
9cd0: 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65  .init_ret = file
9ce0: 64 5f 69 6e 69 74 28 63 61 63 68 65 5f 73 69 7a  d_init(cache_siz
9cf0: 65 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65  e);..if (init_re
9d00: 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72  t != 0) {...perr
9d10: 6f 72 28 22 66 69 6c 65 64 5f 69 6e 69 74 22 29  or("filed_init")
9d20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 33 29 3b 0a  ;....return(3);.
9d30: 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c  .}.../* Create l
9d40: 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a 2f  ogging thread */
9d50: 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c  ..init_ret = fil
9d60: 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61  ed_logging_threa
9d70: 64 5f 69 6e 69 74 28 6c 6f 67 5f 66 70 29 3b 0a  d_init(log_fp);.
9d80: 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d  .if (init_ret !=
9d90: 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22   0) {...perror("
9da0: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
9db0: 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09  read_init");....
9dc0: 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09  return(4);..}...
9dd0: 2f 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72  /* Create worker
9de0: 20 74 68 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69   threads */..ini
9df0: 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f  t_ret = filed_wo
9e00: 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69  rker_threads_ini
9e10: 74 28 66 64 2c 20 74 68 72 65 61 64 5f 63 6f 75  t(fd, thread_cou
9e20: 6e 74 2c 20 26 74 68 72 65 61 64 5f 6f 70 74 69  nt, &thread_opti
9e30: 6f 6e 73 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f  ons);..if (init_
9e40: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65  ret != 0) {...pe
9e50: 72 72 6f 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b  rror("filed_work
9e60: 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 22  er_threads_init"
9e70: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 35 29 3b  );....return(5);
9e80: 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f  ..}.../* Wait fo
9e90: 72 20 74 68 72 65 61 64 73 20 74 6f 20 65 78 69  r threads to exi
9ea0: 74 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44  t */../* XXX:TOD
9eb0: 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61  O: Monitor threa
9ec0: 64 20 75 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c  d usage */..whil
9ed0: 65 20 28 31 29 20 7b 0a 09 09 73 6c 65 65 70 28  e (1) {...sleep(
9ee0: 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74  60);..}.../* Ret
9ef0: 75 72 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  urn in failure *
9f00: 2f 0a 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a  /..return(2);.}.