Hex Artifact Content

Artifact e0a9bfdbe74e0f50718eabb2596aab955ad4712d:


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 32 33 22 0a 23 64 65 66 69 6e  ON "1.23".#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 46 49 4c 45  G 1.#define FILE
08c0: 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55 54 20 31  D_DONT_TIMEOUT 1
08d0: 0a 23 64 65 66 69 6e 65 20 70 74 68 72 65 61 64  .#define pthread
08e0: 5f 63 72 65 61 74 65 28 61 2c 20 78 2c 20 79 2c  _create(a, x, y,
08f0: 20 7a 29 20 61 66 6c 5f 70 74 68 72 65 61 64 5f   z) afl_pthread_
0900: 63 72 65 61 74 65 28 61 2c 20 78 2c 20 79 2c 20  create(a, x, y, 
0910: 7a 29 0a 23 64 65 66 69 6e 65 20 62 69 6e 64 28  z).#define bind(
0920: 78 2c 20 79 2c 20 7a 29 20 61 66 6c 5f 62 69 6e  x, y, z) afl_bin
0930: 64 28 78 2c 20 79 2c 20 7a 29 0a 23 64 65 66 69  d(x, y, z).#defi
0940: 6e 65 20 73 6f 63 6b 65 74 28 78 2c 20 79 2c 20  ne socket(x, y, 
0950: 7a 29 20 38 31 39 33 0a 23 64 65 66 69 6e 65 20  z) 8193.#define 
0960: 6c 69 73 74 65 6e 28 78 2c 20 79 29 20 30 0a 23  listen(x, y) 0.#
0970: 64 65 66 69 6e 65 20 61 63 63 65 70 74 28 78 2c  define accept(x,
0980: 20 79 2c 20 7a 29 20 61 66 6c 5f 61 63 63 65 70   y, z) afl_accep
0990: 74 28 78 2c 20 79 2c 20 7a 29 0a 23 64 65 66 69  t(x, y, z).#defi
09a0: 6e 65 20 63 6c 6f 73 65 28 78 29 20 7b 20 69 66  ne close(x) { if
09b0: 20 28 73 74 72 63 6d 70 28 23 78 2c 20 22 72 61   (strcmp(#x, "ra
09c0: 6e 64 6f 6d 5f 66 64 22 29 20 3d 3d 20 30 29 20  ndom_fd") == 0) 
09d0: 7b 20 63 6c 6f 73 65 28 78 29 3b 20 7d 20 65 6c  { close(x); } el
09e0: 73 65 20 7b 20 65 78 69 74 28 30 29 3b 20 7d 20  se { exit(0); } 
09f0: 7d 0a 23 64 65 66 69 6e 65 20 66 63 6c 6f 73 65  }.#define fclose
0a00: 28 78 29 20 65 78 69 74 28 30 29 0a 0a 73 74 61  (x) exit(0)..sta
0a10: 74 69 63 20 69 6e 74 20 61 66 6c 5f 61 63 63 65  tic int afl_acce
0a20: 70 74 28 69 6e 74 20 78 2c 20 76 6f 69 64 20 2a  pt(int x, void *
0a30: 61 64 64 72 2c 20 76 6f 69 64 20 2a 7a 29 20 7b  addr, void *z) {
0a40: 0a 09 28 28 73 74 72 75 63 74 20 73 6f 63 6b 61  ..((struct socka
0a50: 64 64 72 5f 69 6e 36 20 2a 29 20 61 64 64 72 29  ddr_in6 *) addr)
0a60: 2d 3e 73 69 6e 36 5f 66 61 6d 69 6c 79 20 3d 20  ->sin6_family = 
0a70: 41 46 5f 49 4e 45 54 20 2b 20 41 46 5f 49 4e 45  AF_INET + AF_INE
0a80: 54 36 20 2b 20 31 3b 0a 09 72 65 74 75 72 6e 28  T6 + 1;..return(
0a90: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09  STDIN_FILENO);..
0aa0: 78 20 3d 20 78 3b 0a 09 7a 20 3d 20 7a 3b 0a 7d  x = x;..z = z;.}
0ab0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 6c  ..static int afl
0ac0: 5f 62 69 6e 64 28 69 6e 74 20 78 2c 20 76 6f 69  _bind(int x, voi
0ad0: 64 20 2a 79 2c 20 73 6f 63 6b 6c 65 6e 5f 74 20  d *y, socklen_t 
0ae0: 7a 29 20 7b 0a 09 72 65 74 75 72 6e 28 38 31 39  z) {..return(819
0af0: 34 29 3b 0a 09 78 20 3d 20 78 3b 0a 09 79 20 3d  4);..x = x;..y =
0b00: 20 79 3b 0a 09 7a 20 3d 20 7a 3b 0a 7d 0a 0a 73   y;..z = z;.}..s
0b10: 74 61 74 69 63 20 69 6e 74 20 61 66 6c 5f 70 74  tatic int afl_pt
0b20: 68 72 65 61 64 5f 63 72 65 61 74 65 28 70 74 68  hread_create(pth
0b30: 72 65 61 64 5f 74 20 2a 74 68 72 65 61 64 2c 20  read_t *thread, 
0b40: 63 6f 6e 73 74 20 70 74 68 72 65 61 64 5f 61 74  const pthread_at
0b50: 74 72 5f 74 20 2a 61 74 74 72 2c 20 76 6f 69 64  tr_t *attr, void
0b60: 20 2a 28 2a 73 74 61 72 74 5f 72 6f 75 74 69 6e   *(*start_routin
0b70: 65 29 20 28 76 6f 69 64 20 2a 29 2c 20 76 6f 69  e) (void *), voi
0b80: 64 20 2a 61 72 67 29 20 7b 0a 09 73 74 61 72 74  d *arg) {..start
0b90: 5f 72 6f 75 74 69 6e 65 28 61 72 67 29 3b 0a 09  _routine(arg);..
0ba0: 65 78 69 74 28 33 29 3b 0a 09 74 68 72 65 61 64  exit(3);..thread
0bb0: 20 3d 20 74 68 72 65 61 64 3b 0a 09 61 74 74 72   = thread;..attr
0bc0: 20 3d 20 61 74 74 72 3b 0a 7d 0a 23 65 6e 64 69   = attr;.}.#endi
0bd0: 66 0a 0a 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74  f../* Configurat
0be0: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 74 68 61 74  ion options that
0bf0: 20 77 6f 72 6b 20 74 68 72 65 61 64 73 20 6e 65   work threads ne
0c00: 65 64 20 74 6f 20 62 65 20 61 77 61 72 65 20 6f  ed to be aware o
0c10: 66 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65  f */.struct file
0c20: 64 5f 6f 70 74 69 6f 6e 73 20 7b 0a 09 69 6e 74  d_options {..int
0c30: 20 76 68 6f 73 74 73 5f 65 6e 61 62 6c 65 64 3b   vhosts_enabled;
0c40: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 61  ..const char *fa
0c50: 6b 65 5f 6e 65 77 72 6f 6f 74 3b 0a 7d 3b 0a 0a  ke_newroot;.};..
0c60: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72  /* Arguments for
0c70: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20   worker threads 
0c80: 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f  */.struct filed_
0c90: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72  worker_thread_ar
0ca0: 67 73 20 7b 0a 09 69 6e 74 20 66 64 3b 0a 09 73  gs {..int fd;..s
0cb0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69  truct filed_opti
0cc0: 6f 6e 73 20 6f 70 74 69 6f 6e 73 3b 0a 7d 3b 0a  ons options;.};.
0cd0: 0a 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 66 6f  ./* Arguments fo
0ce0: 72 20 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64  r logging thread
0cf0: 73 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65  s */.struct file
0d00: 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64  d_logging_thread
0d10: 5f 61 72 67 73 20 7b 0a 09 46 49 4c 45 20 2a 66  _args {..FILE *f
0d20: 70 3b 0a 7d 3b 0a 0a 2f 2a 20 46 69 6c 65 20 69  p;.};../* File i
0d30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 73 74  nformation */.st
0d40: 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69  ruct filed_filei
0d50: 6e 66 6f 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  nfo {..pthread_m
0d60: 75 74 65 78 5f 74 20 6d 75 74 65 78 3b 0a 09 63  utex_t mutex;..c
0d70: 68 61 72 20 70 61 74 68 5b 46 49 4c 45 44 5f 50  har path[FILED_P
0d80: 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d  ATH_BUFFER_SIZE]
0d90: 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 6f 66 66 5f  ;..int fd;..off_
0da0: 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61  t len;..char *la
0db0: 73 74 6d 6f 64 3b 0a 09 63 68 61 72 20 6c 61 73  stmod;..char las
0dc0: 74 6d 6f 64 5f 62 5b 36 34 5d 3b 0a 09 63 6f 6e  tmod_b[64];..con
0dd0: 73 74 20 63 68 61 72 20 2a 74 79 70 65 3b 0a 09  st char *type;..
0de0: 63 68 61 72 20 65 74 61 67 5b 36 34 5d 3b 0a 7d  char etag[64];.}
0df0: 3b 0a 0a 2f 2a 20 52 65 71 75 65 73 74 20 76 61  ;../* Request va
0e00: 72 69 61 62 6c 65 73 20 2a 2f 0a 73 74 72 75 63  riables */.struc
0e10: 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71  t filed_http_req
0e20: 75 65 73 74 20 7b 0a 09 2f 2a 2a 20 42 75 66 66  uest {../** Buff
0e30: 65 72 73 20 2a 2a 2f 0a 09 73 74 72 75 63 74 20  ers **/..struct 
0e40: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 66  filed_fileinfo f
0e50: 69 6c 65 69 6e 66 6f 3b 0a 09 63 68 61 72 20 74  ileinfo;..char t
0e60: 6d 70 62 75 66 5b 46 49 4c 45 44 5f 50 41 54 48  mpbuf[FILED_PATH
0e70: 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a  _BUFFER_SIZE];..
0e80: 09 2f 2a 2a 20 48 54 54 50 20 52 65 71 75 65 73  ./** HTTP Reques
0e90: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2a  t information **
0ea0: 2f 0a 09 2f 2a 2a 2a 20 54 79 70 65 20 6f 66 20  /../*** Type of 
0eb0: 72 65 71 75 65 73 74 20 28 48 45 41 44 20 6f 72  request (HEAD or
0ec0: 20 47 45 54 29 20 2a 2a 2a 2f 0a 09 65 6e 75 6d   GET) ***/..enum
0ed0: 20 7b 0a 09 09 46 49 4c 45 44 5f 52 45 51 55 45   {...FILED_REQUE
0ee0: 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 2c 0a 09  ST_METHOD_GET,..
0ef0: 09 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d  .FILED_REQUEST_M
0f00: 45 54 48 4f 44 5f 48 45 41 44 0a 09 7d 20 6d 65  ETHOD_HEAD..} me
0f10: 74 68 6f 64 3b 0a 0a 09 2f 2a 2a 2a 20 50 61 74  thod;.../*** Pat
0f20: 68 20 62 65 69 6e 67 20 72 65 71 75 65 73 74 65  h being requeste
0f30: 64 20 2a 2a 2a 2f 0a 09 63 68 61 72 20 70 61 74  d ***/..char pat
0f40: 68 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46  h[FILED_PATH_BUF
0f50: 46 45 52 5f 53 49 5a 45 5d 3b 20 0a 0a 09 2f 2a  FER_SIZE]; .../*
0f60: 2a 2a 20 50 61 74 68 20 74 79 70 65 20 2a 2a 2a  ** Path type ***
0f70: 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45  /..enum {...FILE
0f80: 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 44  D_REQUEST_TYPE_D
0f90: 49 52 45 43 54 4f 52 59 2c 0a 09 09 46 49 4c 45  IRECTORY,...FILE
0fa0: 44 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 4f  D_REQUEST_TYPE_O
0fb0: 54 48 45 52 0a 09 7d 20 74 79 70 65 3b 0a 0a 09  THER..} type;...
0fc0: 73 74 72 75 63 74 20 7b 0a 09 09 73 74 72 75 63  struct {...struc
0fd0: 74 20 7b 0a 09 09 09 69 6e 74 20 70 72 65 73 65  t {....int prese
0fe0: 6e 74 3b 0a 09 09 09 6f 66 66 5f 74 20 6f 66 66  nt;....off_t off
0ff0: 73 65 74 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e 67  set;   /*** Rang
1000: 65 20 73 74 61 72 74 20 2a 2a 2a 2f 0a 09 09 09  e start ***/....
1010: 6f 66 66 5f 74 20 6c 65 6e 67 74 68 3b 20 20 20  off_t length;   
1020: 2f 2a 2a 2a 20 52 61 6e 67 65 20 6c 65 6e 67 74  /*** Range lengt
1030: 68 20 2a 2a 2a 2f 0a 09 09 7d 20 72 61 6e 67 65  h ***/...} range
1040: 3b 0a 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09  ;....struct {...
1050: 09 69 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09  .int present;...
1060: 09 63 68 61 72 20 68 6f 73 74 5b 46 49 4c 45 44  .char host[FILED
1070: 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a  _PATH_BUFFER_SIZ
1080: 45 5d 3b 0a 09 09 7d 20 68 6f 73 74 3b 0a 0a 09  E];...} host;...
1090: 09 65 6e 75 6d 20 7b 0a 09 09 09 46 49 4c 45 44  .enum {....FILED
10a0: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53  _CONNECTION_CLOS
10b0: 45 2c 0a 09 09 09 46 49 4c 45 44 5f 43 4f 4e 4e  E,....FILED_CONN
10c0: 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56  ECTION_KEEP_ALIV
10d0: 45 0a 09 09 7d 20 63 6f 6e 6e 65 63 74 69 6f 6e  E...} connection
10e0: 3b 0a 09 7d 20 68 65 61 64 65 72 73 3b 0a 7d 3b  ;..} headers;.};
10f0: 0a 0a 2f 2a 20 4c 6f 67 20 72 65 63 6f 72 64 20  ../* Log record 
1100: 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f  */.struct filed_
1110: 6c 6f 67 5f 65 6e 74 72 79 20 7b 0a 09 2f 2a 20  log_entry {../* 
1120: 54 79 70 65 20 6f 66 20 6c 6f 67 20 65 6e 74 72  Type of log entr
1130: 79 20 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46  y */..enum {...F
1140: 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45  ILED_LOG_TYPE_ME
1150: 53 53 41 47 45 2c 0a 09 09 46 49 4c 45 44 5f 4c  SSAGE,...FILED_L
1160: 4f 47 5f 54 59 50 45 5f 54 52 41 4e 53 46 45 52  OG_TYPE_TRANSFER
1170: 0a 09 7d 20 74 79 70 65 3b 0a 0a 09 2f 2a 20 4c  ..} type;.../* L
1180: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 2f  inked list head/
1190: 74 61 69 6c 20 2a 2f 0a 09 73 74 72 75 63 74 20  tail */..struct 
11a0: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20  filed_log_entry 
11b0: 2a 5f 6e 65 78 74 3b 0a 09 73 74 72 75 63 74 20  *_next;..struct 
11c0: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20  filed_log_entry 
11d0: 2a 5f 70 72 65 76 3b 0a 0a 09 2f 2a 20 54 68 72  *_prev;.../* Thr
11e0: 65 61 64 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ead from which t
11f0: 68 69 73 20 6c 6f 67 20 65 6e 74 72 79 20 65 6d  his log entry em
1200: 69 6e 61 74 65 73 20 2a 2f 0a 09 70 74 68 72 65  inates */..pthre
1210: 61 64 5f 74 20 74 68 72 65 61 64 3b 0a 0a 09 2f  ad_t thread;.../
1220: 2a 20 4d 65 73 73 61 67 65 20 62 75 66 66 65 72  * Message buffer
1230: 20 66 6f 72 20 74 79 70 65 20 3d 20 4d 45 53 53   for type = MESS
1240: 41 47 45 20 2a 2f 0a 09 2f 2a 20 50 61 74 68 20  AGE */../* Path 
1250: 62 75 66 66 65 72 20 66 6f 72 20 74 79 70 65 20  buffer for type 
1260: 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a 09 63  = TRANSFER */..c
1270: 68 61 72 20 62 75 66 66 65 72 5b 46 49 4c 45 44  har buffer[FILED
1280: 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a  _PATH_BUFFER_SIZ
1290: 45 5d 3b 0a 0a 09 2f 2a 20 49 74 65 6d 73 20 66  E];.../* Items f
12a0: 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e 53 46  or type = TRANSF
12b0: 45 52 20 2a 2f 0a 09 69 6e 74 20 68 74 74 70 5f  ER */..int http_
12c0: 63 6f 64 65 3b 0a 09 63 6f 6e 73 74 20 63 68 61  code;..const cha
12d0: 72 20 2a 72 65 61 73 6f 6e 3b 0a 09 74 69 6d 65  r *reason;..time
12e0: 5f 74 20 63 6f 6e 6e 65 63 74 74 69 6d 65 3b 0a  _t connecttime;.
12f0: 09 74 69 6d 65 5f 74 20 73 74 61 72 74 74 69 6d  .time_t starttim
1300: 65 3b 0a 09 74 69 6d 65 5f 74 20 65 6e 64 74 69  e;..time_t endti
1310: 6d 65 3b 0a 09 6f 66 66 5f 74 20 72 65 71 5f 6f  me;..off_t req_o
1320: 66 66 73 65 74 3b 0a 09 6f 66 66 5f 74 20 72 65  ffset;..off_t re
1330: 71 5f 6c 65 6e 67 74 68 3b 0a 09 6f 66 66 5f 74  q_length;..off_t
1340: 20 73 65 6e 74 5f 6c 65 6e 67 74 68 3b 0a 09 6f   sent_length;..o
1350: 66 66 5f 74 20 66 69 6c 65 5f 6c 65 6e 67 74 68  ff_t file_length
1360: 3b 0a 09 63 68 61 72 20 69 70 5b 31 32 38 5d 3b  ;..char ip[128];
1370: 0a 09 69 6e 74 20 70 6f 72 74 3b 0a 09 69 6e 74  ..int port;..int
1380: 20 6d 65 74 68 6f 64 3b 0a 7d 3b 0a 0a 2f 2a 20   method;.};../* 
1390: 47 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  Global variables
13a0: 20 2a 2f 0a 2f 2a 2a 20 4f 70 65 6e 20 46 69 6c   */./** Open Fil
13b0: 65 20 63 61 63 68 65 20 2a 2a 2f 0a 73 74 72 75  e cache **/.stru
13c0: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
13d0: 6f 20 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  o *filed_fileinf
13e0: 6f 5f 66 64 63 61 63 68 65 20 3d 20 4e 55 4c 4c  o_fdcache = NULL
13f0: 3b 0a 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66  ;.unsigned int f
1400: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1410: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 30 3b 0a  cache_size = 0;.
1420: 0a 2f 2a 2a 20 4c 6f 67 67 69 6e 67 20 2a 2a 2f  ./** Logging **/
1430: 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  .struct filed_lo
1440: 67 5f 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c  g_entry *filed_l
1450: 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 70 74 68  og_msg_list;.pth
1460: 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 66 69 6c  read_mutex_t fil
1470: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
1480: 6d 75 74 65 78 20 3d 20 50 54 48 52 45 41 44 5f  mutex = PTHREAD_
1490: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
14a0: 52 3b 0a 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f  R;.pthread_cond_
14b0: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  t filed_log_msg_
14c0: 6c 69 73 74 5f 72 65 61 64 79 20 3d 20 50 54 48  list_ready = PTH
14d0: 52 45 41 44 5f 43 4f 4e 44 5f 49 4e 49 54 49 41  READ_COND_INITIA
14e0: 4c 49 5a 45 52 3b 0a 0a 2f 2a 20 53 69 67 6e 61  LIZER;../* Signa
14f0: 6c 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 73 74 61  l Handler */.sta
1500: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73  tic void filed_s
1510: 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 28 69 6e  ignal_handler(in
1520: 74 20 73 69 67 6e 61 6c 5f 6e 75 6d 62 65 72 29  t signal_number)
1530: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
1540: 5f 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65  _fileinfo *cache
1550: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
1560: 69 64 78 3b 0a 0a 09 73 77 69 74 63 68 20 28 73  idx;...switch (s
1570: 69 67 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a  ignal_number) {.
1580: 09 09 63 61 73 65 20 53 49 47 48 55 50 3a 0a 09  ..case SIGHUP:..
1590: 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
15a0: 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65  idx < filed_file
15b0: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
15c0: 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  e; idx++) {.....
15d0: 63 61 63 68 65 20 3d 20 26 66 69 6c 65 64 5f 66  cache = &filed_f
15e0: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b  ileinfo_fdcache[
15f0: 69 64 78 5d 3b 0a 0a 09 09 09 09 70 74 68 72 65  idx];......pthre
1600: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63  ad_mutex_lock(&c
1610: 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09  ache->mutex);...
1620: 09 09 09 63 61 63 68 65 2d 3e 70 61 74 68 5b 30  ...cache->path[0
1630: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 09 09 69 66  ] = '\0';.....if
1640: 20 28 63 61 63 68 65 2d 3e 66 64 20 3e 3d 20 30   (cache->fd >= 0
1650: 29 20 7b 0a 09 09 09 09 09 63 6c 6f 73 65 28 63  ) {......close(c
1660: 61 63 68 65 2d 3e 66 64 29 3b 0a 0a 09 09 09 09  ache->fd);......
1670: 09 63 61 63 68 65 2d 3e 66 64 20 3d 20 2d 31 3b  .cache->fd = -1;
1680: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 68  .....}......cach
1690: 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b  e->lastmod = "";
16a0: 0a 09 09 09 09 63 61 63 68 65 2d 3e 74 79 70 65  .....cache->type
16b0: 20 3d 20 22 22 3b 0a 0a 09 09 09 09 70 74 68 72   = "";......pthr
16c0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
16d0: 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b  (&cache->mutex);
16e0: 0a 09 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a  ....}....break;.
16f0: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
1700: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61  /* Initialize ca
1710: 63 68 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  che */.static in
1720: 74 20 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63  t filed_init_cac
1730: 68 65 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  he(unsigned int 
1740: 63 61 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75  cache_size) {..u
1750: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b  nsigned int idx;
1760: 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74  ..int mutex_init
1770: 5f 72 65 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65  _ret;.../* Cache
1780: 20 6d 61 79 20 6e 6f 74 20 62 65 20 72 65 2d 69   may not be re-i
1790: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69  nitialized */..i
17a0: 66 20 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  f (filed_fileinf
17b0: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21  o_fdcache_size !
17c0: 3d 20 30 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c  = 0 || filed_fil
17d0: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 21 3d  einfo_fdcache !=
17e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
17f0: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 61  n(1);..}.../* Ca
1800: 63 68 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  che does not nee
1810: 64 20 74 6f 20 62 65 20 61 6c 6c 6f 63 61 74 65  d to be allocate
1820: 64 20 69 66 20 63 61 63 68 65 20 69 73 20 6e 6f  d if cache is no
1830: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 09 69 66  t enabled */..if
1840: 20 28 63 61 63 68 65 5f 73 69 7a 65 20 3d 3d 20   (cache_size == 
1850: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  0) {...return(0)
1860: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f 63 61  ;..}.../* Alloca
1870: 74 65 20 63 61 63 68 65 20 2a 2f 0a 09 66 69 6c  te cache */..fil
1880: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
1890: 63 68 65 5f 73 69 7a 65 20 3d 20 63 61 63 68 65  che_size = cache
18a0: 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64 5f 66 69  _size;..filed_fi
18b0: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d  leinfo_fdcache =
18c0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
18d0: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
18e0: 64 63 61 63 68 65 29 20 2a 20 66 69 6c 65 64 5f  dcache) * filed_
18f0: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
1900: 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 66 69 6c  _size);..if (fil
1910: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
1920: 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  che == NULL) {..
1930: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
1940: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63  ./* Initialize c
1950: 61 63 68 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a  ache entries */.
1960: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1970: 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69  dx < filed_filei
1980: 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65  nfo_fdcache_size
1990: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d 75 74  ; idx++) {...mut
19a0: 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 70 74  ex_init_ret = pt
19b0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
19c0: 28 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  (&filed_fileinfo
19d0: 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 6d 75  _fdcache[idx].mu
19e0: 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66  tex, NULL);...if
19f0: 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
1a00: 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   != 0) {....retu
1a10: 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 66 69  rn(1);...}....fi
1a20: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
1a30: 61 63 68 65 5b 69 64 78 5d 2e 70 61 74 68 5b 30  ache[idx].path[0
1a40: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 66 69 6c 65  ] = '\0';...file
1a50: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
1a60: 68 65 5b 69 64 78 5d 2e 66 64 20 3d 20 2d 31 3b  he[idx].fd = -1;
1a70: 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ...filed_fileinf
1a80: 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 6c  o_fdcache[idx].l
1a90: 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a 09 09 66  astmod = "";...f
1aa0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1ab0: 63 61 63 68 65 5b 69 64 78 5d 2e 74 79 70 65 20  cache[idx].type 
1ac0: 3d 20 22 22 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  = "";..}...retur
1ad0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  n(0);.}../* Init
1ae0: 69 61 6c 69 7a 65 20 70 72 6f 63 65 73 73 20 2a  ialize process *
1af0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
1b00: 65 64 5f 69 6e 69 74 28 75 6e 73 69 67 6e 65 64  ed_init(unsigned
1b10: 20 69 6e 74 20 63 61 63 68 65 5f 73 69 7a 65 29   int cache_size)
1b20: 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 63   {..static int c
1b30: 61 6c 6c 65 64 20 3d 20 30 3b 0a 09 73 74 72 75  alled = 0;..stru
1b40: 63 74 20 73 69 67 61 63 74 69 6f 6e 20 73 69 67  ct sigaction sig
1b50: 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e 66 6f  nal_handler_info
1b60: 3b 0a 09 73 69 67 73 65 74 5f 74 20 73 69 67 6e  ;..sigset_t sign
1b70: 61 6c 5f 68 61 6e 64 6c 65 72 5f 6d 61 73 6b 3b  al_handler_mask;
1b80: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
1b90: 65 74 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  et = 0;..unsigne
1ba0: 64 20 69 6e 74 20 72 61 6e 64 6f 6d 5f 76 61 6c  d int random_val
1bb0: 75 65 20 3d 20 30 3b 0a 09 69 6e 74 20 63 61 63  ue = 0;..int cac
1bc0: 68 65 5f 72 65 74 3b 0a 09 69 6e 74 20 72 61 6e  he_ret;..int ran
1bd0: 64 6f 6d 5f 66 64 3b 0a 0a 09 69 66 20 28 63 61  dom_fd;...if (ca
1be0: 6c 6c 65 64 29 20 7b 0a 09 09 72 65 74 75 72 6e  lled) {...return
1bf0: 28 30 29 3b 0a 09 7d 0a 0a 09 63 61 6c 6c 65 64  (0);..}...called
1c00: 20 3d 20 31 3b 0a 0a 09 2f 2a 20 41 74 74 65 6d   = 1;.../* Attem
1c10: 70 74 20 74 6f 20 6c 6f 63 6b 20 61 6c 6c 20 6d  pt to lock all m
1c20: 65 6d 6f 72 79 20 74 6f 20 70 68 79 73 69 63 61  emory to physica
1c30: 6c 20 52 41 4d 20 28 62 75 74 20 64 6f 6e 27 74  l RAM (but don't
1c40: 20 63 61 72 65 20 69 66 20 77 65 20 63 61 6e 27   care if we can'
1c50: 74 29 20 2a 2f 0a 09 6d 6c 6f 63 6b 61 6c 6c 28  t) */..mlockall(
1c60: 4d 43 4c 5f 43 55 52 52 45 4e 54 20 7c 20 4d 43  MCL_CURRENT | MC
1c70: 4c 5f 46 55 54 55 52 45 29 3b 0a 0a 09 2f 2a 20  L_FUTURE);.../* 
1c80: 45 73 74 61 62 6c 69 73 68 20 73 69 67 6e 61 6c  Establish signal
1c90: 20 68 61 6e 64 6c 65 72 73 20 2a 2f 0a 09 2f 2a   handlers */../*
1ca0: 20 53 49 47 50 49 50 45 20 73 68 6f 75 6c 64 20   SIGPIPE should 
1cb0: 69 6e 74 65 72 72 75 70 74 20 73 79 73 74 65 6d  interrupt system
1cc0: 20 63 61 6c 6c 73 20 2a 2f 0a 09 73 69 67 66 69   calls */..sigfi
1cd0: 6c 6c 73 65 74 28 26 73 69 67 6e 61 6c 5f 68 61  llset(&signal_ha
1ce0: 6e 64 6c 65 72 5f 6d 61 73 6b 29 3b 0a 09 73 69  ndler_mask);..si
1cf0: 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e 66  gnal_handler_inf
1d00: 6f 2e 73 61 5f 68 61 6e 64 6c 65 72 20 3d 20 66  o.sa_handler = f
1d10: 69 6c 65 64 5f 73 69 67 6e 61 6c 5f 68 61 6e 64  iled_signal_hand
1d20: 6c 65 72 3b 0a 09 73 69 67 6e 61 6c 5f 68 61 6e  ler;..signal_han
1d30: 64 6c 65 72 5f 69 6e 66 6f 2e 73 61 5f 6d 61 73  dler_info.sa_mas
1d40: 6b 20 3d 20 73 69 67 6e 61 6c 5f 68 61 6e 64 6c  k = signal_handl
1d50: 65 72 5f 6d 61 73 6b 3b 0a 09 73 69 67 6e 61 6c  er_mask;..signal
1d60: 5f 68 61 6e 64 6c 65 72 5f 69 6e 66 6f 2e 73 61  _handler_info.sa
1d70: 5f 66 6c 61 67 73 20 3d 20 53 41 5f 52 45 53 54  _flags = SA_REST
1d80: 41 52 54 3b 0a 09 73 69 67 61 63 74 69 6f 6e 28  ART;..sigaction(
1d90: 53 49 47 50 49 50 45 2c 20 26 73 69 67 6e 61 6c  SIGPIPE, &signal
1da0: 5f 68 61 6e 64 6c 65 72 5f 69 6e 66 6f 2c 20 4e  _handler_info, N
1db0: 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 48 61 6e 64 6c  ULL);.../* Handl
1dc0: 65 20 53 49 47 48 55 50 20 74 6f 20 72 65 6c 65  e SIGHUP to rele
1dd0: 61 73 65 20 61 6c 6c 20 63 61 63 68 65 73 20 2a  ase all caches *
1de0: 2f 0a 09 73 69 67 66 69 6c 6c 73 65 74 28 26 73  /..sigfillset(&s
1df0: 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 6d 61  ignal_handler_ma
1e00: 73 6b 29 3b 0a 09 73 69 67 6e 61 6c 5f 68 61 6e  sk);..signal_han
1e10: 64 6c 65 72 5f 69 6e 66 6f 2e 73 61 5f 68 61 6e  dler_info.sa_han
1e20: 64 6c 65 72 20 3d 20 66 69 6c 65 64 5f 73 69 67  dler = filed_sig
1e30: 6e 61 6c 5f 68 61 6e 64 6c 65 72 3b 0a 09 73 69  nal_handler;..si
1e40: 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 5f 69 6e 66  gnal_handler_inf
1e50: 6f 2e 73 61 5f 6d 61 73 6b 20 3d 20 73 69 67 6e  o.sa_mask = sign
1e60: 61 6c 5f 68 61 6e 64 6c 65 72 5f 6d 61 73 6b 3b  al_handler_mask;
1e70: 0a 09 73 69 67 6e 61 6c 5f 68 61 6e 64 6c 65 72  ..signal_handler
1e80: 5f 69 6e 66 6f 2e 73 61 5f 66 6c 61 67 73 20 3d  _info.sa_flags =
1e90: 20 30 3b 0a 09 73 69 67 61 63 74 69 6f 6e 28 53   0;..sigaction(S
1ea0: 49 47 48 55 50 2c 20 26 73 69 67 6e 61 6c 5f 68  IGHUP, &signal_h
1eb0: 61 6e 64 6c 65 72 5f 69 6e 66 6f 2c 20 4e 55 4c  andler_info, NUL
1ec0: 4c 29 3b 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c  L);.../* Initial
1ed0: 69 7a 65 20 63 61 63 68 65 20 73 74 72 75 63 74  ize cache struct
1ee0: 75 72 65 20 2a 2f 0a 09 63 61 63 68 65 5f 72 65  ure */..cache_re
1ef0: 74 20 3d 20 66 69 6c 65 64 5f 69 6e 69 74 5f 63  t = filed_init_c
1f00: 61 63 68 65 28 63 61 63 68 65 5f 73 69 7a 65 29  ache(cache_size)
1f10: 3b 0a 09 69 66 20 28 63 61 63 68 65 5f 72 65 74  ;..if (cache_ret
1f20: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   != 0) {...retur
1f30: 6e 28 63 61 63 68 65 5f 72 65 74 29 3b 0a 09 7d  n(cache_ret);..}
1f40: 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .../* Initialize
1f50: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
1f60: 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 09 72 61 6e  enerator */..ran
1f70: 64 6f 6d 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f  dom_fd = open("/
1f80: 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
1f90: 52 44 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 72 61  RDONLY);..if (ra
1fa0: 6e 64 6f 6d 5f 66 64 20 3e 3d 20 30 29 20 7b 0a  ndom_fd >= 0) {.
1fb0: 09 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61  ..read_ret = rea
1fc0: 64 28 72 61 6e 64 6f 6d 5f 66 64 2c 20 26 72 61  d(random_fd, &ra
1fd0: 6e 64 6f 6d 5f 76 61 6c 75 65 2c 20 73 69 7a 65  ndom_value, size
1fe0: 6f 66 28 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 29  of(random_value)
1ff0: 29 3b 0a 0a 09 09 63 6c 6f 73 65 28 72 61 6e 64  );....close(rand
2000: 6f 6d 5f 66 64 29 3b 0a 09 7d 0a 0a 09 72 61 6e  om_fd);..}...ran
2010: 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 67 65 74  dom_value ^= get
2020: 70 69 64 28 29 3b 0a 09 72 61 6e 64 6f 6d 5f 76  pid();..random_v
2030: 61 6c 75 65 20 5e 3d 20 67 65 74 75 69 64 28 29  alue ^= getuid()
2040: 3b 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20  ;..random_value 
2050: 5e 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 0a  ^= time(NULL);..
2060: 09 73 72 61 6e 64 6f 6d 28 72 61 6e 64 6f 6d 5f  .srandom(random_
2070: 76 61 6c 75 65 29 3b 0a 0a 09 72 65 74 75 72 6e  value);...return
2080: 28 30 29 3b 0a 0a 09 2f 2a 20 4e 4f 54 52 45 41  (0);.../* NOTREA
2090: 43 48 3a 20 52 65 61 64 20 6d 61 79 20 66 61 69  CH: Read may fai
20a0: 6c 20 6f 72 20 73 75 63 63 65 65 64 2c 20 77 65  l or succeed, we
20b0: 20 64 6f 6e 27 74 20 61 63 74 75 61 6c 6c 79 20   don't actually 
20c0: 63 61 72 65 20 2a 2f 0a 09 72 65 61 64 5f 72 65  care */..read_re
20d0: 74 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 7d 0a  t = read_ret;.}.
20e0: 0a 2f 2a 20 4c 69 73 74 65 6e 20 6f 6e 20 61 20  ./* Listen on a 
20f0: 70 61 72 74 69 63 75 6c 61 72 20 61 64 64 72 65  particular addre
2100: 73 73 2f 70 6f 72 74 20 2a 2f 0a 73 74 61 74 69  ss/port */.stati
2110: 63 20 69 6e 74 20 66 69 6c 65 64 5f 6c 69 73 74  c int filed_list
2120: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  en(const char *a
2130: 64 64 72 65 73 73 2c 20 75 6e 73 69 67 6e 65 64  ddress, unsigned
2140: 20 69 6e 74 20 70 6f 72 74 29 20 7b 0a 09 73 74   int port) {..st
2150: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
2160: 36 20 61 64 64 72 5f 76 36 3b 0a 09 73 74 72 75  6 addr_v6;..stru
2170: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 61  ct sockaddr_in a
2180: 64 64 72 5f 76 34 3b 0a 09 73 74 72 75 63 74 20  ddr_v4;..struct 
2190: 73 6f 63 6b 61 64 64 72 20 2a 61 64 64 72 3b 0a  sockaddr *addr;.
21a0: 09 73 6f 63 6b 6c 65 6e 5f 74 20 61 64 64 72 5f  .socklen_t addr_
21b0: 6c 65 6e 3b 0a 09 69 6e 74 20 70 74 6f 6e 5f 72  len;..int pton_r
21c0: 65 74 2c 20 62 69 6e 64 5f 72 65 74 2c 20 6c 69  et, bind_ret, li
21d0: 73 74 65 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 66  sten_ret;..int f
21e0: 61 6d 69 6c 79 3b 0a 09 69 6e 74 20 66 64 3b 0a  amily;..int fd;.
21f0: 0a 09 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e  ..family = AF_IN
2200: 45 54 36 3b 0a 09 70 74 6f 6e 5f 72 65 74 20 3d  ET6;..pton_ret =
2210: 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61 6d 69 6c   inet_pton(famil
2220: 79 2c 20 61 64 64 72 65 73 73 2c 20 26 61 64 64  y, address, &add
2230: 72 5f 76 36 2e 73 69 6e 36 5f 61 64 64 72 2e 73  r_v6.sin6_addr.s
2240: 36 5f 61 64 64 72 29 3b 0a 09 69 66 20 28 70 74  6_addr);..if (pt
2250: 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20 7b 0a 09  on_ret != 1) {..
2260: 09 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45  .family = AF_INE
2270: 54 3b 0a 09 09 70 74 6f 6e 5f 72 65 74 20 3d 20  T;...pton_ret = 
2280: 69 6e 65 74 5f 70 74 6f 6e 28 66 61 6d 69 6c 79  inet_pton(family
2290: 2c 20 61 64 64 72 65 73 73 2c 20 26 61 64 64 72  , address, &addr
22a0: 5f 76 34 2e 73 69 6e 5f 61 64 64 72 2e 73 5f 61  _v4.sin_addr.s_a
22b0: 64 64 72 29 3b 0a 09 09 69 66 20 28 70 74 6f 6e  ddr);...if (pton
22c0: 5f 72 65 74 20 21 3d 20 31 29 20 7b 0a 09 09 09  _ret != 1) {....
22d0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
22e0: 0a 09 09 61 64 64 72 5f 76 34 2e 73 69 6e 5f 66  ...addr_v4.sin_f
22f0: 61 6d 69 6c 79 20 3d 20 66 61 6d 69 6c 79 3b 0a  amily = family;.
2300: 09 09 61 64 64 72 5f 76 34 2e 73 69 6e 5f 70 6f  ..addr_v4.sin_po
2310: 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f 72 74 29  rt = htons(port)
2320: 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28 73 74 72  ;....addr = (str
2330: 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20  uct sockaddr *) 
2340: 26 61 64 64 72 5f 76 34 3b 0a 09 09 61 64 64 72  &addr_v4;...addr
2350: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64  _len = sizeof(ad
2360: 64 72 5f 76 34 29 3b 0a 09 7d 20 65 6c 73 65 20  dr_v4);..} else 
2370: 7b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36  {...addr_v6.sin6
2380: 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45  _family = AF_INE
2390: 54 36 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69  T6;...addr_v6.si
23a0: 6e 36 5f 66 6c 6f 77 69 6e 66 6f 20 3d 20 30 3b  n6_flowinfo = 0;
23b0: 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f  ...addr_v6.sin6_
23c0: 73 63 6f 70 65 5f 69 64 20 3d 20 30 3b 0a 09 09  scope_id = 0;...
23d0: 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 70 6f 72  addr_v6.sin6_por
23e0: 74 20 3d 20 68 74 6f 6e 73 28 70 6f 72 74 29 3b  t = htons(port);
23f0: 0a 0a 09 09 61 64 64 72 20 3d 20 28 73 74 72 75  ....addr = (stru
2400: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26  ct sockaddr *) &
2410: 61 64 64 72 5f 76 36 3b 0a 09 09 61 64 64 72 5f  addr_v6;...addr_
2420: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64 64  len = sizeof(add
2430: 72 5f 76 36 29 3b 0a 09 7d 0a 0a 09 66 64 20 3d  r_v6);..}...fd =
2440: 20 73 6f 63 6b 65 74 28 66 61 6d 69 6c 79 2c 20   socket(family, 
2450: 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29 3b  SOCK_STREAM, 0);
2460: 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a  ..if (fd < 0) {.
2470: 09 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d  ..return(fd);..}
2480: 0a 0a 09 62 69 6e 64 5f 72 65 74 20 3d 20 62 69  ...bind_ret = bi
2490: 6e 64 28 66 64 2c 20 61 64 64 72 2c 20 61 64 64  nd(fd, addr, add
24a0: 72 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 62 69 6e  r_len);..if (bin
24b0: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 63  d_ret < 0) {...c
24c0: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74  lose(fd);....ret
24d0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6c 69  urn(-1);..}...li
24e0: 73 74 65 6e 5f 72 65 74 20 3d 20 6c 69 73 74 65  sten_ret = liste
24f0: 6e 28 66 64 2c 20 31 32 38 29 3b 0a 09 69 66 20  n(fd, 128);..if 
2500: 28 6c 69 73 74 65 6e 5f 72 65 74 20 21 3d 20 30  (listen_ret != 0
2510: 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b  ) {...close(fd);
2520: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
2530: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b  .}...return(fd);
2540: 0a 7d 0a 0a 2f 2a 20 4c 6f 67 20 61 20 6d 65 73  .}../* Log a mes
2550: 73 61 67 65 20 2a 2f 0a 23 69 66 64 65 66 20 46  sage */.#ifdef F
2560: 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 23 20  ILED_DONT_LOG.# 
2570: 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f   define filed_lo
2580: 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69  gging_thread_ini
2590: 74 28 78 29 20 30 0a 23 20 20 64 65 66 69 6e 65  t(x) 0.#  define
25a0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64   filed_log_msg_d
25b0: 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a  ebug(x, ...) /**
25c0: 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  /.#  define file
25d0: 64 5f 6c 6f 67 5f 6d 73 67 28 78 2c 20 2e 2e 2e  d_log_msg(x, ...
25e0: 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65  ) /**/.#  define
25f0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
2600: 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69  (x) /**/.#  defi
2610: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28  ne filed_log_ip(
2620: 78 2c 20 2e 2e 2e 29 20 4e 55 4c 4c 0a 23 20 20  x, ...) NULL.#  
2630: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
2640: 5f 6e 65 77 28 78 29 20 26 6c 6f 63 61 6c 5f 64  _new(x) &local_d
2650: 75 6d 6d 79 5f 6c 6f 67 0a 23 20 20 64 65 66 69  ummy_log.#  defi
2660: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 66 72 65  ne filed_log_fre
2670: 65 28 78 29 20 2f 2a 2a 2f 0a 0a 2f 2a 20 52 65  e(x) /**/../* Re
2680: 74 75 72 6e 20 6c 6f 67 67 69 6e 67 20 68 61 6e  turn logging han
2690: 64 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 46 49  dle */.static FI
26a0: 4c 45 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70  LE *filed_log_op
26b0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  en(const char *f
26c0: 69 6c 65 29 20 7b 0a 09 72 65 74 75 72 6e 28 73  ile) {..return(s
26d0: 74 64 6f 75 74 29 3b 0a 09 66 69 6c 65 20 3d 20  tdout);..file = 
26e0: 66 69 6c 65 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  file;.}.#else.# 
26f0: 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f   define filed_lo
2700: 67 5f 66 72 65 65 28 78 29 20 66 72 65 65 28 78  g_free(x) free(x
2710: 29 0a 23 20 20 69 66 64 65 66 20 46 49 4c 45 44  ).#  ifdef FILED
2720: 5f 44 45 42 55 47 0a 23 20 20 20 20 64 65 66 69  _DEBUG.#    defi
2730: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ne filed_log_msg
2740: 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 7b  _debug(x, ...) {
2750: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2760: 20 78 2c 20 5f 5f 56 41 5f 41 52 47 53 5f 5f 29   x, __VA_ARGS__)
2770: 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ; fprintf(stderr
2780: 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28  , "\n"); fflush(
2790: 73 74 64 65 72 72 29 3b 20 7d 0a 23 20 20 65 6c  stderr); }.#  el
27a0: 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 66  se.#    define f
27b0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62  iled_log_msg_deb
27c0: 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a  ug(x, ...) /**/.
27d0: 23 20 20 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69  #  endif../* Ini
27e0: 74 69 61 6c 69 7a 65 20 6c 6f 67 67 69 6e 67 20  tialize logging 
27f0: 74 68 72 65 61 64 20 2a 2f 0a 73 74 61 74 69 63  thread */.static
2800: 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 6c 6f 67   void *filed_log
2810: 67 69 6e 67 5f 74 68 72 65 61 64 28 76 6f 69 64  ging_thread(void
2820: 20 2a 61 72 67 5f 70 29 20 7b 0a 09 73 74 72 75   *arg_p) {..stru
2830: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  ct filed_logging
2840: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72  _thread_args *ar
2850: 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  g;..struct filed
2860: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 63 75 72 72  _log_entry *curr
2870: 2c 20 2a 70 72 65 76 3b 0a 09 63 6f 6e 73 74 20  , *prev;..const 
2880: 63 68 61 72 20 2a 6d 65 74 68 6f 64 3b 0a 09 74  char *method;..t
2890: 69 6d 65 5f 74 20 6e 6f 77 3b 0a 09 46 49 4c 45  ime_t now;..FILE
28a0: 20 2a 66 70 3b 0a 0a 09 61 72 67 20 3d 20 61 72   *fp;...arg = ar
28b0: 67 5f 70 3b 0a 0a 09 66 70 20 3d 20 61 72 67 2d  g_p;...fp = arg-
28c0: 3e 66 70 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  >fp;...while (1)
28d0: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
28e0: 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c  ex_lock(&filed_l
28f0: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65  og_msg_list_mute
2900: 78 29 3b 0a 09 09 70 74 68 72 65 61 64 5f 63 6f  x);...pthread_co
2910: 6e 64 5f 77 61 69 74 28 26 66 69 6c 65 64 5f 6c  nd_wait(&filed_l
2920: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64  og_msg_list_read
2930: 79 2c 20 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  y, &filed_log_ms
2940: 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a  g_list_mutex);..
2950: 09 09 63 75 72 72 20 3d 20 66 69 6c 65 64 5f 6c  ..curr = filed_l
2960: 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 09 66  og_msg_list;...f
2970: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
2980: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 70 74 68  t = NULL;....pth
2990: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
29a0: 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  k(&filed_log_msg
29b0: 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09  _list_mutex);...
29c0: 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e 55 4c 4c  .now = time(NULL
29d0: 29 3b 0a 0a 09 09 70 72 65 76 20 3d 20 4e 55 4c  );....prev = NUL
29e0: 4c 3b 0a 09 09 66 6f 72 20 28 3b 20 63 75 72 72  L;...for (; curr
29f0: 3b 20 63 75 72 72 20 3d 20 63 75 72 72 2d 3e 5f  ; curr = curr->_
2a00: 6e 65 78 74 29 20 7b 0a 09 09 09 63 75 72 72 2d  next) {....curr-
2a10: 3e 5f 70 72 65 76 20 3d 20 70 72 65 76 3b 0a 0a  >_prev = prev;..
2a20: 09 09 09 70 72 65 76 20 3d 20 63 75 72 72 3b 0a  ...prev = curr;.
2a30: 09 09 7d 0a 0a 09 09 63 75 72 72 20 3d 20 70 72  ..}....curr = pr
2a40: 65 76 3b 0a 09 09 77 68 69 6c 65 20 28 63 75 72  ev;...while (cur
2a50: 72 29 20 7b 0a 09 09 09 73 77 69 74 63 68 20 28  r) {....switch (
2a60: 63 75 72 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  curr->type) {...
2a70: 09 09 63 61 73 65 20 46 49 4c 45 44 5f 4c 4f 47  ..case FILED_LOG
2a80: 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 3a 0a 09  _TYPE_MESSAGE:..
2a90: 09 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20  ....fprintf(fp, 
2aa0: 22 25 73 22 2c 20 63 75 72 72 2d 3e 62 75 66 66  "%s", curr->buff
2ab0: 65 72 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  er);.......break
2ac0: 3b 0a 09 09 09 09 63 61 73 65 20 46 49 4c 45 44  ;.....case FILED
2ad0: 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41 4e 53 46  _LOG_TYPE_TRANSF
2ae0: 45 52 3a 0a 09 09 09 09 09 73 77 69 74 63 68 20  ER:......switch 
2af0: 28 63 75 72 72 2d 3e 6d 65 74 68 6f 64 29 20 7b  (curr->method) {
2b00: 0a 09 09 09 09 09 09 63 61 73 65 20 46 49 4c 45  .......case FILE
2b10: 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44  D_REQUEST_METHOD
2b20: 5f 47 45 54 3a 0a 09 09 09 09 09 09 09 6d 65 74  _GET:........met
2b30: 68 6f 64 3d 22 47 45 54 22 3b 0a 09 09 09 09 09  hod="GET";......
2b40: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 63  ..break;.......c
2b50: 61 73 65 20 46 49 4c 45 44 5f 52 45 51 55 45 53  ase FILED_REQUES
2b60: 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 3a 0a 09  T_METHOD_HEAD:..
2b70: 09 09 09 09 09 09 6d 65 74 68 6f 64 3d 22 48 45  ......method="HE
2b80: 41 44 22 3b 0a 09 09 09 09 09 09 09 62 72 65 61  AD";........brea
2b90: 6b 3b 0a 09 09 09 09 09 09 64 65 66 61 75 6c 74  k;.......default
2ba0: 3a 0a 09 09 09 09 09 09 09 6d 65 74 68 6f 64 3d  :........method=
2bb0: 22 3c 75 6e 6b 6e 6f 77 6e 3e 22 3b 0a 09 09 09  "<unknown>";....
2bc0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
2bd0: 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72  }.......if (curr
2be0: 2d 3e 65 6e 64 74 69 6d 65 20 3d 3d 20 28 28 74  ->endtime == ((t
2bf0: 69 6d 65 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09  ime_t) -1)) {...
2c00: 09 09 09 09 63 75 72 72 2d 3e 65 6e 64 74 69 6d  ....curr->endtim
2c10: 65 20 3d 20 6e 6f 77 3b 0a 09 09 09 09 09 7d 0a  e = now;......}.
2c20: 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28 66 70  ......fprintf(fp
2c30: 2c 20 22 54 52 41 4e 53 46 45 52 20 4d 45 54 48  , "TRANSFER METH
2c40: 4f 44 3d 25 73 20 50 41 54 48 3d 25 73 20 53 52  OD=%s PATH=%s SR
2c50: 43 3d 25 73 3a 25 69 20 43 4c 49 45 4e 54 2e 54  C=%s:%i CLIENT.T
2c60: 49 4d 45 2e 43 4f 4e 4e 45 43 54 3d 25 6c 6c 75  IME.CONNECT=%llu
2c70: 20 52 45 51 55 45 53 54 2e 54 49 4d 45 2e 53 54   REQUEST.TIME.ST
2c80: 41 52 54 3d 25 6c 6c 75 20 52 45 51 55 45 53 54  ART=%llu REQUEST
2c90: 2e 54 49 4d 45 2e 45 4e 44 3d 25 6c 6c 75 20 43  .TIME.END=%llu C
2ca0: 4f 44 45 2e 56 41 4c 55 45 3d 25 75 20 43 4f 44  ODE.VALUE=%u COD
2cb0: 45 2e 52 45 41 53 4f 4e 3d 25 73 20 52 45 51 55  E.REASON=%s REQU
2cc0: 45 53 54 2e 4f 46 46 53 45 54 3d 25 6c 6c 75 20  EST.OFFSET=%llu 
2cd0: 52 45 51 55 45 53 54 2e 4c 45 4e 47 54 48 3d 25  REQUEST.LENGTH=%
2ce0: 6c 6c 75 20 46 49 4c 45 2e 4c 45 4e 47 54 48 3d  llu FILE.LENGTH=
2cf0: 25 6c 6c 75 20 54 52 41 4e 53 46 45 52 2e 4c 45  %llu TRANSFER.LE
2d00: 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 09  NGTH=%llu",.....
2d10: 09 09 6d 65 74 68 6f 64 2c 0a 09 09 09 09 09 09  ..method,.......
2d20: 63 75 72 72 2d 3e 62 75 66 66 65 72 2c 0a 09 09  curr->buffer,...
2d30: 09 09 09 09 63 75 72 72 2d 3e 69 70 2c 20 63 75  ....curr->ip, cu
2d40: 72 72 2d 3e 70 6f 72 74 2c 0a 09 09 09 09 09 09  rr->port,.......
2d50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2d60: 6f 6e 67 29 20 63 75 72 72 2d 3e 63 6f 6e 6e 65  ong) curr->conne
2d70: 63 74 74 69 6d 65 2c 0a 09 09 09 09 09 09 28 75  cttime,.......(u
2d80: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
2d90: 67 29 20 63 75 72 72 2d 3e 73 74 61 72 74 74 69  g) curr->startti
2da0: 6d 65 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67  me,.......(unsig
2db0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63  ned long long) c
2dc0: 75 72 72 2d 3e 65 6e 64 74 69 6d 65 2c 0a 09 09  urr->endtime,...
2dd0: 09 09 09 09 63 75 72 72 2d 3e 68 74 74 70 5f 63  ....curr->http_c
2de0: 6f 64 65 2c 20 63 75 72 72 2d 3e 72 65 61 73 6f  ode, curr->reaso
2df0: 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  n,.......(unsign
2e00: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
2e10: 72 72 2d 3e 72 65 71 5f 6f 66 66 73 65 74 2c 0a  rr->req_offset,.
2e20: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
2e30: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
2e40: 3e 72 65 71 5f 6c 65 6e 67 74 68 2c 0a 09 09 09  >req_length,....
2e50: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
2e60: 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 66 69  g long) curr->fi
2e70: 6c 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 09 09  le_length,......
2e80: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
2e90: 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73 65 6e 74  long) curr->sent
2ea0: 5f 6c 65 6e 67 74 68 0a 09 09 09 09 09 29 3b 0a  _length......);.
2eb0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
2ec0: 7d 0a 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c  }....fprintf(fp,
2ed0: 20 22 20 54 48 52 45 41 44 3d 25 6c 6c 75 20 54   " THREAD=%llu T
2ee0: 49 4d 45 3d 25 6c 6c 75 5c 6e 22 2c 0a 09 09 09  IME=%llu\n",....
2ef0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
2f00: 6c 6f 6e 67 29 20 28 28 69 6e 74 70 74 72 5f 74  long) ((intptr_t
2f10: 29 20 63 75 72 72 2d 3e 74 68 72 65 61 64 29 2c  ) curr->thread),
2f20: 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
2f30: 6f 6e 67 20 6c 6f 6e 67 29 20 6e 6f 77 0a 09 09  ong long) now...
2f40: 09 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70  .);....fflush(fp
2f50: 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75  );.....prev = cu
2f60: 72 72 3b 0a 09 09 09 63 75 72 72 20 3d 20 63 75  rr;....curr = cu
2f70: 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09 09 66  rr->_prev;.....f
2f80: 72 65 65 28 70 72 65 76 29 3b 0a 09 09 7d 0a 09  ree(prev);...}..
2f90: 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  }...return(NULL)
2fa0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2fb0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
2fc0: 28 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f  (struct filed_lo
2fd0: 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 29 20  g_entry *entry) 
2fe0: 7b 0a 09 65 6e 74 72 79 2d 3e 74 68 72 65 61 64  {..entry->thread
2ff0: 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   = pthread_self(
3000: 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  );...pthread_mut
3010: 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c  ex_lock(&filed_l
3020: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65  og_msg_list_mute
3030: 78 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f 6e 65  x);...entry->_ne
3040: 78 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  xt = filed_log_m
3050: 73 67 5f 6c 69 73 74 3b 0a 09 66 69 6c 65 64 5f  sg_list;..filed_
3060: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 65  log_msg_list = e
3070: 6e 74 72 79 3b 0a 0a 09 70 74 68 72 65 61 64 5f  ntry;...pthread_
3080: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69  mutex_unlock(&fi
3090: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
30a0: 5f 6d 75 74 65 78 29 3b 0a 0a 09 70 74 68 72 65  _mutex);...pthre
30b0: 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26  ad_cond_signal(&
30c0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
30d0: 73 74 5f 72 65 61 64 79 29 3b 0a 0a 09 72 65 74  st_ready);...ret
30e0: 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  urn;.}..static s
30f0: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f  truct filed_log_
3100: 65 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67  entry *filed_log
3110: 5f 6e 65 77 28 69 6e 74 20 69 6e 69 74 69 61 6c  _new(int initial
3120: 69 7a 65 29 20 7b 0a 09 73 74 72 75 63 74 20 66  ize) {..struct f
3130: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a  iled_log_entry *
3140: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
3150: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
3160: 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 69 66  (*retval));...if
3170: 20 28 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a   (initialize) {.
3180: 09 09 72 65 74 76 61 6c 2d 3e 62 75 66 66 65 72  ..retval->buffer
3190: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65  [0] = '\0';...re
31a0: 74 76 61 6c 2d 3e 68 74 74 70 5f 63 6f 64 65 20  tval->http_code 
31b0: 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c 2d 3e  = -1;...retval->
31c0: 63 6f 6e 6e 65 63 74 74 69 6d 65 20 3d 20 30 3b  connecttime = 0;
31d0: 0a 09 09 72 65 74 76 61 6c 2d 3e 73 74 61 72 74  ...retval->start
31e0: 74 69 6d 65 20 3d 20 30 3b 0a 09 09 72 65 74 76  time = 0;...retv
31f0: 61 6c 2d 3e 65 6e 64 74 69 6d 65 20 3d 20 30 3b  al->endtime = 0;
3200: 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6f  ...retval->req_o
3210: 66 66 73 65 74 20 3d 20 30 3b 0a 09 09 72 65 74  ffset = 0;...ret
3220: 76 61 6c 2d 3e 72 65 71 5f 6c 65 6e 67 74 68 20  val->req_length 
3230: 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 73  = 0;...retval->s
3240: 65 6e 74 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a  ent_length = 0;.
3250: 09 09 72 65 74 76 61 6c 2d 3e 66 69 6c 65 5f 6c  ..retval->file_l
3260: 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72 65 74  ength = 0;...ret
3270: 76 61 6c 2d 3e 69 70 5b 30 5d 20 3d 20 27 5c 30  val->ip[0] = '\0
3280: 27 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 70 6f 72  ';...retval->por
3290: 74 20 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c  t = -1;...retval
32a0: 2d 3e 6d 65 74 68 6f 64 20 3d 20 2d 31 3b 0a 09  ->method = -1;..
32b0: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
32c0: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  l);.}..static vo
32d0: 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  id filed_log_msg
32e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74  (const char *fmt
32f0: 2c 20 2e 2e 2e 29 20 7b 0a 09 73 74 72 75 63 74  , ...) {..struct
3300: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
3310: 20 2a 65 6e 74 72 79 3b 0a 09 76 61 5f 6c 69 73   *entry;..va_lis
3320: 74 20 61 72 67 73 3b 0a 0a 09 65 6e 74 72 79 20  t args;...entry 
3330: 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28  = filed_log_new(
3340: 30 29 3b 0a 0a 09 76 61 5f 73 74 61 72 74 28 61  0);...va_start(a
3350: 72 67 73 2c 20 66 6d 74 29 3b 0a 0a 09 76 73 6e  rgs, fmt);...vsn
3360: 70 72 69 6e 74 66 28 65 6e 74 72 79 2d 3e 62 75  printf(entry->bu
3370: 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 65 6e 74  ffer, sizeof(ent
3380: 72 79 2d 3e 62 75 66 66 65 72 29 2c 20 66 6d 74  ry->buffer), fmt
3390: 2c 20 61 72 67 73 29 3b 0a 0a 09 76 61 5f 65 6e  , args);...va_en
33a0: 64 28 61 72 67 73 29 3b 0a 0a 09 65 6e 74 72 79  d(args);...entry
33b0: 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 4c  ->type = FILED_L
33c0: 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 3b  OG_TYPE_MESSAGE;
33d0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ...filed_log_ent
33e0: 72 79 28 65 6e 74 72 79 29 3b 0a 0a 09 72 65 74  ry(entry);...ret
33f0: 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  urn;.}..static c
3400: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 64  onst char *filed
3410: 5f 6c 6f 67 5f 69 70 28 73 74 72 75 63 74 20 73  _log_ip(struct s
3420: 6f 63 6b 61 64 64 72 20 2a 61 64 64 72 2c 20 63  ockaddr *addr, c
3430: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
3440: 65 5f 74 20 62 75 66 66 65 72 6c 65 6e 29 20 7b  e_t bufferlen) {
3450: 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ..struct sockadd
3460: 72 5f 69 6e 20 2a 61 64 64 72 5f 76 34 3b 0a 09  r_in *addr_v4;..
3470: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
3480: 69 6e 36 20 2a 61 64 64 72 5f 76 36 3b 0a 09 63  in6 *addr_v6;..c
3490: 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 74 76 61  onst char *retva
34a0: 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 61 64 64 72  l = NULL;...addr
34b0: 5f 76 36 20 3d 20 28 73 74 72 75 63 74 20 73 6f  _v6 = (struct so
34c0: 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29 20 61 64  ckaddr_in6 *) ad
34d0: 64 72 3b 0a 0a 09 73 77 69 74 63 68 20 28 61 64  dr;...switch (ad
34e0: 64 72 5f 76 36 2d 3e 73 69 6e 36 5f 66 61 6d 69  dr_v6->sin6_fami
34f0: 6c 79 29 20 7b 0a 09 09 63 61 73 65 20 41 46 5f  ly) {...case AF_
3500: 49 4e 45 54 3a 0a 09 09 09 61 64 64 72 5f 76 34  INET:....addr_v4
3510: 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61   = (struct socka
3520: 64 64 72 5f 69 6e 20 2a 29 20 61 64 64 72 3b 0a  ddr_in *) addr;.
3530: 09 09 09 72 65 74 76 61 6c 20 3d 20 69 6e 65 74  ...retval = inet
3540: 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54 2c 20 26  _ntop(AF_INET, &
3550: 61 64 64 72 5f 76 34 2d 3e 73 69 6e 5f 61 64 64  addr_v4->sin_add
3560: 72 2c 20 62 75 66 66 65 72 2c 20 62 75 66 66 65  r, buffer, buffe
3570: 72 6c 65 6e 29 3b 0a 09 09 09 62 72 65 61 6b 3b  rlen);....break;
3580: 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36  ...case AF_INET6
3590: 3a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 69 6e  :....retval = in
35a0: 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54 36  et_ntop(AF_INET6
35b0: 2c 20 26 61 64 64 72 5f 76 36 2d 3e 73 69 6e 36  , &addr_v6->sin6
35c0: 5f 61 64 64 72 2c 20 62 75 66 66 65 72 2c 20 62  _addr, buffer, b
35d0: 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09 62 72  ufferlen);....br
35e0: 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  eak;..}...return
35f0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
3600: 74 69 63 20 46 49 4c 45 20 2a 66 69 6c 65 64 5f  tic FILE *filed_
3610: 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  log_open(const c
3620: 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a 09 46 49  har *file) {..FI
3630: 4c 45 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 69 66  LE *retval;...if
3640: 20 28 73 74 72 63 6d 70 28 66 69 6c 65 2c 20 22   (strcmp(file, "
3650: 2d 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  -") == 0) {...re
3660: 74 76 61 6c 20 3d 20 73 74 64 6f 75 74 3b 0a 09  tval = stdout;..
3670: 7d 20 65 6c 73 65 20 69 66 20 28 66 69 6c 65 5b  } else if (file[
3680: 30 5d 20 3d 3d 20 27 7c 27 29 20 7b 0a 09 09 66  0] == '|') {...f
3690: 69 6c 65 2b 2b 3b 0a 09 09 72 65 74 76 61 6c 20  ile++;...retval 
36a0: 3d 20 70 6f 70 65 6e 28 66 69 6c 65 2c 20 22 77  = popen(file, "w
36b0: 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
36c0: 72 65 74 76 61 6c 20 3d 20 66 6f 70 65 6e 28 66  retval = fopen(f
36d0: 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09 7d 0a 0a  ile, "a+");..}..
36e0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
36f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
3700: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
3710: 65 61 64 5f 69 6e 69 74 28 46 49 4c 45 20 2a 6c  ead_init(FILE *l
3720: 6f 67 66 70 29 20 7b 0a 09 73 74 72 75 63 74 20  ogfp) {..struct 
3730: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
3740: 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 73 3b  read_args *args;
3750: 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72 65  ..pthread_t thre
3760: 61 64 5f 69 64 3b 0a 0a 09 61 72 67 73 20 3d 20  ad_id;...args = 
3770: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 61  malloc(sizeof(*a
3780: 72 67 73 29 29 3b 0a 09 61 72 67 73 2d 3e 66 70  rgs));..args->fp
3790: 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66 69 6c 65   = logfp;...file
37a0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d  d_log_msg_list =
37b0: 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72 65 61 64   NULL;...pthread
37c0: 5f 63 72 65 61 74 65 28 26 74 68 72 65 61 64 5f  _create(&thread_
37d0: 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f  id, NULL, filed_
37e0: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 2c 20  logging_thread, 
37f0: 61 72 67 73 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c  args);...filed_l
3800: 6f 67 5f 6d 73 67 28 22 53 54 41 52 54 22 29 3b  og_msg("START");
3810: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
3820: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 46  #endif..#ifdef F
3830: 49 4c 45 44 5f 44 4f 4e 54 5f 54 49 4d 45 4f 55  ILED_DONT_TIMEOU
3840: 54 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  T.#define filed_
3850: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68  sockettimeout_th
3860: 72 65 61 64 5f 69 6e 69 74 28 29 20 30 0a 23 64  read_init() 0.#d
3870: 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b  efine filed_sock
3880: 65 74 74 69 6d 65 6f 75 74 5f 69 6e 69 74 28 29  ettimeout_init()
3890: 20 30 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64   0.#define filed
38a0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 61  _sockettimeout_a
38b0: 63 63 65 70 74 28 78 29 20 2f 2a 2a 2f 0a 23 64  ccept(x) /**/.#d
38c0: 65 66 69 6e 65 20 66 69 6c 65 64 5f 73 6f 63 6b  efine filed_sock
38d0: 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73  ettimeout_proces
38e0: 73 69 6e 67 5f 73 74 61 72 74 28 78 29 20 2f 2a  sing_start(x) /*
38f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64  */.#define filed
3900: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70  _sockettimeout_p
3910: 72 6f 63 65 73 73 69 6e 67 5f 65 6e 64 28 78 29  rocessing_end(x)
3920: 20 2f 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69   /**/.#define fi
3930: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
3940: 74 5f 63 6c 6f 73 65 28 78 2c 20 79 29 20 2f 2a  t_close(x, y) /*
3950: 2a 2f 0a 23 65 6c 73 65 0a 74 69 6d 65 5f 74 20  */.#else.time_t 
3960: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3970: 6f 75 74 5f 74 69 6d 65 3b 0a 73 74 72 75 63 74  out_time;.struct
3980: 20 7b 0a 09 74 69 6d 65 5f 74 20 65 78 70 69 72   {..time_t expir
3990: 61 74 69 6f 6e 5f 74 69 6d 65 3b 0a 09 70 74 68  ation_time;..pth
39a0: 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69 64  read_t thread_id
39b0: 3b 0a 09 65 6e 75 6d 20 7b 0a 09 09 66 69 6c 65  ;..enum {...file
39c0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
39d0: 76 61 6c 69 64 2c 0a 09 09 66 69 6c 65 64 5f 73  valid,...filed_s
39e0: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 69 6e 76  ockettimeout_inv
39f0: 61 6c 69 64 2c 0a 09 7d 20 76 61 6c 69 64 3b 0a  alid,..} valid;.
3a00: 7d 20 2a 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  } *filed_sockett
3a10: 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75  imeout_sockstatu
3a20: 73 3b 0a 6c 6f 6e 67 20 66 69 6c 65 64 5f 73 6f  s;.long filed_so
3a30: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b  ckettimeout_sock
3a40: 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 3b 0a 69  status_length;.i
3a50: 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  nt filed_sockett
3a60: 69 6d 65 6f 75 74 5f 64 65 76 6e 75 6c 6c 5f 66  imeout_devnull_f
3a70: 64 3b 0a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  d;.pthread_mutex
3a80: 5f 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  _t filed_sockett
3a90: 69 6d 65 6f 75 74 5f 6d 75 74 65 78 20 3d 20 50  imeout_mutex = P
3aa0: 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49  THREAD_MUTEX_INI
3ab0: 54 49 41 4c 49 5a 45 52 3b 0a 0a 73 74 61 74 69  TIALIZER;..stati
3ac0: 63 20 69 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b  c int filed_sock
3ad0: 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 66 64  ettimeout_sockfd
3ae0: 5f 69 6e 5f 72 61 6e 67 65 28 69 6e 74 20 73 6f  _in_range(int so
3af0: 63 6b 66 64 29 20 7b 0a 09 69 66 20 28 73 6f 63  ckfd) {..if (soc
3b00: 6b 66 64 20 3c 20 33 29 20 7b 0a 09 09 72 65 74  kfd < 3) {...ret
3b10: 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 69 66 20  urn(0);..}...if 
3b20: 28 73 6f 63 6b 66 64 20 3e 20 66 69 6c 65 64 5f  (sockfd > filed_
3b30: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f  sockettimeout_so
3b40: 63 6b 73 74 61 74 75 73 5f 6c 65 6e 67 74 68 29  ckstatus_length)
3b50: 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
3b60: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 31 29 3b 0a  .}...return(1);.
3b70: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
3b80: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3b90: 75 74 5f 65 78 70 69 72 65 28 69 6e 74 20 73 6f  ut_expire(int so
3ba0: 63 6b 66 64 2c 20 69 6e 74 20 6c 65 6e 67 74 68  ckfd, int length
3bb0: 2c 20 69 6e 74 20 6c 6f 63 6b 68 65 6c 64 29 20  , int lockheld) 
3bc0: 7b 0a 09 74 69 6d 65 5f 74 20 6e 6f 77 2c 20 65  {..time_t now, e
3bd0: 78 70 69 72 65 3b 0a 0a 09 69 66 20 28 21 6c 6f  xpire;...if (!lo
3be0: 63 6b 68 65 6c 64 29 20 7b 0a 09 09 70 74 68 72  ckheld) {...pthr
3bf0: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
3c00: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3c10: 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 09 7d 0a 0a  out_mutex);..}..
3c20: 09 6e 6f 77 20 3d 20 66 69 6c 65 64 5f 73 6f 63  .now = filed_soc
3c30: 6b 65 74 74 69 6d 65 6f 75 74 5f 74 69 6d 65 3b  kettimeout_time;
3c40: 0a 0a 09 65 78 70 69 72 65 20 3d 20 6e 6f 77 20  ...expire = now 
3c50: 2b 20 6c 65 6e 67 74 68 3b 0a 0a 09 66 69 6c 65  + length;...file
3c60: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3c70: 73 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66  sockstatus[sockf
3c80: 64 5d 2e 65 78 70 69 72 61 74 69 6f 6e 5f 74 69  d].expiration_ti
3c90: 6d 65 20 3d 20 65 78 70 69 72 65 3b 0a 0a 09 69  me = expire;...i
3ca0: 66 20 28 21 6c 6f 63 6b 68 65 6c 64 29 20 7b 0a  f (!lockheld) {.
3cb0: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
3cc0: 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 73 6f  unlock(&filed_so
3cd0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 6d 75 74 65  ckettimeout_mute
3ce0: 78 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b  x);..}...return;
3cf0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
3d00: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3d10: 6f 75 74 5f 61 63 63 65 70 74 28 69 6e 74 20 73  out_accept(int s
3d20: 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28 21 66  ockfd) {..if (!f
3d30: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3d40: 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e  ut_sockfd_in_ran
3d50: 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a 09 09  ge(sockfd)) {...
3d60: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 70 74 68  return;..}...pth
3d70: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
3d80: 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  &filed_sockettim
3d90: 65 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 66  eout_mutex);...f
3da0: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3db0: 75 74 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64  ut_expire(sockfd
3dc0: 2c 20 36 30 2c 20 31 29 3b 0a 0a 09 66 69 6c 65  , 60, 1);...file
3dd0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
3de0: 73 6f 63 6b 73 74 61 74 75 73 5b 73 6f 63 6b 66  sockstatus[sockf
3df0: 64 5d 2e 74 68 72 65 61 64 5f 69 64 20 3d 20 70  d].thread_id = p
3e00: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 0a  thread_self();..
3e10: 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  .filed_sockettim
3e20: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b  eout_sockstatus[
3e30: 73 6f 63 6b 66 64 5d 2e 76 61 6c 69 64 20 3d 20  sockfd].valid = 
3e40: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
3e50: 6f 75 74 5f 76 61 6c 69 64 3b 0a 0a 09 70 74 68  out_valid;...pth
3e60: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
3e70: 6b 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  k(&filed_sockett
3e80: 69 6d 65 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 0a  imeout_mutex);..
3e90: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
3ea0: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f  ic void filed_so
3eb0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63  ckettimeout_proc
3ec0: 65 73 73 69 6e 67 5f 73 74 61 72 74 28 69 6e 74  essing_start(int
3ed0: 20 73 6f 63 6b 66 64 29 20 7b 0a 09 69 66 20 28   sockfd) {..if (
3ee0: 21 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  !filed_sockettim
3ef0: 65 6f 75 74 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72  eout_sockfd_in_r
3f00: 61 6e 67 65 28 73 6f 63 6b 66 64 29 29 20 7b 0a  ange(sockfd)) {.
3f10: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
3f20: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
3f30: 75 74 5f 65 78 70 69 72 65 28 73 6f 63 6b 66 64  ut_expire(sockfd
3f40: 2c 20 38 36 34 30 30 2c 20 30 29 3b 0a 0a 09 72  , 86400, 0);...r
3f50: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
3f60: 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 6f 63 6b   void filed_sock
3f70: 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f 63 65 73  ettimeout_proces
3f80: 73 69 6e 67 5f 65 6e 64 28 69 6e 74 20 73 6f 63  sing_end(int soc
3f90: 6b 66 64 29 20 7b 0a 09 69 66 20 28 21 66 69 6c  kfd) {..if (!fil
3fa0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
3fb0: 5f 73 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65  _sockfd_in_range
3fc0: 28 73 6f 63 6b 66 64 29 29 20 7b 0a 09 09 72 65  (sockfd)) {...re
3fd0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64  turn;..}...filed
3fe0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 65  _sockettimeout_e
3ff0: 78 70 69 72 65 28 73 6f 63 6b 66 64 2c 20 36 30  xpire(sockfd, 60
4000: 2c 20 30 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  , 0);...return;.
4010: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
4020: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4030: 75 74 5f 63 6c 6f 73 65 28 69 6e 74 20 73 6f 63  ut_close(int soc
4040: 6b 66 64 2c 20 69 6e 74 20 6c 6f 63 6b 68 65 6c  kfd, int lockhel
4050: 64 29 20 7b 0a 09 69 66 20 28 21 66 69 6c 65 64  d) {..if (!filed
4060: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 73  _sockettimeout_s
4070: 6f 63 6b 66 64 5f 69 6e 5f 72 61 6e 67 65 28 73  ockfd_in_range(s
4080: 6f 63 6b 66 64 29 29 20 7b 0a 09 09 72 65 74 75  ockfd)) {...retu
4090: 72 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 6c 6f  rn;..}...if (!lo
40a0: 63 6b 68 65 6c 64 29 20 7b 0a 09 09 70 74 68 72  ckheld) {...pthr
40b0: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
40c0: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
40d0: 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 09 7d 0a 0a  out_mutex);..}..
40e0: 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  .filed_sockettim
40f0: 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b  eout_sockstatus[
4100: 73 6f 63 6b 66 64 5d 2e 76 61 6c 69 64 20 3d 20  sockfd].valid = 
4110: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
4120: 6f 75 74 5f 69 6e 76 61 6c 69 64 3b 0a 0a 09 69  out_invalid;...i
4130: 66 20 28 21 6c 6f 63 6b 68 65 6c 64 29 20 7b 0a  f (!lockheld) {.
4140: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
4150: 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 73 6f  unlock(&filed_so
4160: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 6d 75 74 65  ckettimeout_mute
4170: 78 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b  x);..}...return;
4180: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4190: 2a 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  *filed_sockettim
41a0: 65 6f 75 74 5f 74 68 72 65 61 64 28 76 6f 69 64  eout_thread(void
41b0: 20 2a 61 72 67 29 20 7b 0a 09 73 74 72 75 63 74   *arg) {..struct
41c0: 20 74 69 6d 65 73 70 65 63 20 73 6c 65 65 70 5f   timespec sleep_
41d0: 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74 20 6e 6f  time;..time_t no
41e0: 77 2c 20 65 78 70 69 72 61 74 69 6f 6e 5f 74 69  w, expiration_ti
41f0: 6d 65 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74  me;..pthread_t t
4200: 68 72 65 61 64 5f 69 64 3b 0a 09 6c 6f 6e 67 20  hread_id;..long 
4210: 69 64 78 3b 0a 09 69 6e 74 20 63 6f 75 6e 74 3b  idx;..int count;
4220: 0a 09 69 6e 74 20 76 61 6c 69 64 3b 0a 09 69 6e  ..int valid;..in
4230: 74 20 74 69 6d 65 5f 69 6e 74 65 72 76 61 6c 20  t time_interval 
4240: 3d 20 33 30 3b 0a 09 69 6e 74 20 63 68 65 63 6b  = 30;..int check
4250: 5f 70 65 72 69 6f 64 20 3d 20 39 30 3b 0a 0a 09  _period = 90;...
4260: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 66 6f  while (1) {...fo
4270: 72 20 28 63 6f 75 6e 74 20 3d 20 30 3b 20 63 6f  r (count = 0; co
4280: 75 6e 74 20 3c 20 28 63 68 65 63 6b 5f 70 65 72  unt < (check_per
4290: 69 6f 64 20 2f 20 74 69 6d 65 5f 69 6e 74 65 72  iod / time_inter
42a0: 76 61 6c 29 3b 20 63 6f 75 6e 74 2b 2b 29 20 7b  val); count++) {
42b0: 0a 09 09 09 73 6c 65 65 70 5f 74 69 6d 65 2e 74  ....sleep_time.t
42c0: 76 5f 73 65 63 20 3d 20 74 69 6d 65 5f 69 6e 74  v_sec = time_int
42d0: 65 72 76 61 6c 3b 0a 09 09 09 73 6c 65 65 70 5f  erval;....sleep_
42e0: 74 69 6d 65 2e 74 76 5f 6e 73 65 63 20 3d 20 30  time.tv_nsec = 0
42f0: 3b 0a 09 09 09 6e 61 6e 6f 73 6c 65 65 70 28 26  ;....nanosleep(&
4300: 73 6c 65 65 70 5f 74 69 6d 65 2c 20 4e 55 4c 4c  sleep_time, NULL
4310: 29 3b 0a 0a 09 09 09 70 74 68 72 65 61 64 5f 6d  );.....pthread_m
4320: 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64  utex_lock(&filed
4330: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 6d  _sockettimeout_m
4340: 75 74 65 78 29 3b 0a 0a 09 09 09 6e 6f 77 20 3d  utex);.....now =
4350: 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 09   time(NULL);....
4360: 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d  .filed_sockettim
4370: 65 6f 75 74 5f 74 69 6d 65 20 3d 20 6e 6f 77 3b  eout_time = now;
4380: 0a 0a 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74  .....pthread_mut
4390: 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64  ex_unlock(&filed
43a0: 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 6d  _sockettimeout_m
43b0: 75 74 65 78 29 3b 0a 09 09 7d 0a 0a 09 09 70 74  utex);...}....pt
43c0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
43d0: 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  (&filed_socketti
43e0: 6d 65 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 0a 09  meout_mutex);...
43f0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
4400: 64 78 20 3c 20 66 69 6c 65 64 5f 73 6f 63 6b 65  dx < filed_socke
4410: 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61  ttimeout_socksta
4420: 74 75 73 5f 6c 65 6e 67 74 68 3b 20 69 64 78 2b  tus_length; idx+
4430: 2b 29 20 7b 0a 09 09 09 76 61 6c 69 64 20 3d 20  +) {....valid = 
4440: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
4450: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69  out_sockstatus[i
4460: 64 78 5d 2e 76 61 6c 69 64 3b 0a 0a 09 09 09 69  dx].valid;.....i
4470: 66 20 28 76 61 6c 69 64 20 21 3d 20 66 69 6c 65  f (valid != file
4480: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
4490: 76 61 6c 69 64 29 20 7b 0a 09 09 09 09 63 6f 6e  valid) {.....con
44a0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
44b0: 65 78 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20  expiration_time 
44c0: 3d 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  = filed_socketti
44d0: 6d 65 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73  meout_sockstatus
44e0: 5b 69 64 78 5d 2e 65 78 70 69 72 61 74 69 6f 6e  [idx].expiration
44f0: 5f 74 69 6d 65 3b 0a 0a 09 09 09 74 68 72 65 61  _time;.....threa
4500: 64 5f 69 64 20 3d 20 66 69 6c 65 64 5f 73 6f 63  d_id = filed_soc
4510: 6b 65 74 74 69 6d 65 6f 75 74 5f 73 6f 63 6b 73  kettimeout_socks
4520: 74 61 74 75 73 5b 69 64 78 5d 2e 74 68 72 65 61  tatus[idx].threa
4530: 64 5f 69 64 3b 0a 0a 09 09 09 69 66 20 28 65 78  d_id;.....if (ex
4540: 70 69 72 61 74 69 6f 6e 5f 74 69 6d 65 20 3e 20  piration_time > 
4550: 6e 6f 77 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  now) {.....conti
4560: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 69  nue;....}.....fi
4570: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
4580: 74 5f 63 6c 6f 73 65 28 69 64 78 2c 20 31 29 3b  t_close(idx, 1);
4590: 0a 0a 09 09 09 64 75 70 32 28 66 69 6c 65 64 5f  .....dup2(filed_
45a0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 64 65  sockettimeout_de
45b0: 76 6e 75 6c 6c 5f 66 64 2c 20 69 64 78 29 3b 0a  vnull_fd, idx);.
45c0: 0a 09 09 09 70 74 68 72 65 61 64 5f 6b 69 6c 6c  ....pthread_kill
45d0: 28 74 68 72 65 61 64 5f 69 64 2c 20 53 49 47 50  (thread_id, SIGP
45e0: 49 50 45 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  IPE);...}....pth
45f0: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
4600: 6b 28 26 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  k(&filed_sockett
4610: 69 6d 65 6f 75 74 5f 6d 75 74 65 78 29 3b 0a 09  imeout_mutex);..
4620: 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  }...return(NULL)
4630: 3b 0a 0a 09 2f 2a 20 4e 4f 54 52 45 41 43 48 3a  ;.../* NOTREACH:
4640: 20 57 65 20 64 6f 6e 27 74 20 61 63 74 75 61 6c   We don't actual
4650: 6c 79 20 74 61 6b 65 20 61 6e 79 20 61 72 67 75  ly take any argu
4660: 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d 20  ments */..arg = 
4670: 61 72 67 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  arg;.}..static i
4680: 6e 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74  nt filed_sockett
4690: 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 5f 69 6e  imeout_thread_in
46a0: 69 74 28 76 6f 69 64 29 20 7b 0a 09 70 74 68 72  it(void) {..pthr
46b0: 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69 64 3b  ead_t thread_id;
46c0: 0a 0a 09 70 74 68 72 65 61 64 5f 63 72 65 61 74  ...pthread_creat
46d0: 65 28 26 74 68 72 65 61 64 5f 69 64 2c 20 4e 55  e(&thread_id, NU
46e0: 4c 4c 2c 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  LL, filed_socket
46f0: 74 69 6d 65 6f 75 74 5f 74 68 72 65 61 64 2c 20  timeout_thread, 
4700: 4e 55 4c 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  NULL);...return(
4710: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  0);.}..static in
4720: 74 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  t filed_socketti
4730: 6d 65 6f 75 74 5f 69 6e 69 74 28 76 6f 69 64 29  meout_init(void)
4740: 20 7b 0a 09 6c 6f 6e 67 20 6d 61 78 66 64 2c 20   {..long maxfd, 
4750: 69 64 78 3b 0a 0a 09 6d 61 78 66 64 20 3d 20 73  idx;...maxfd = s
4760: 79 73 63 6f 6e 66 28 5f 53 43 5f 4f 50 45 4e 5f  ysconf(_SC_OPEN_
4770: 4d 41 58 29 3b 0a 09 69 66 20 28 6d 61 78 66 64  MAX);..if (maxfd
4780: 20 3c 3d 20 30 29 20 7b 0a 09 09 6d 61 78 66 64   <= 0) {...maxfd
4790: 20 3d 20 34 30 39 36 3b 0a 09 7d 0a 0a 09 66 69   = 4096;..}...fi
47a0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
47b0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c 65 6e  t_sockstatus_len
47c0: 67 74 68 20 3d 20 6d 61 78 66 64 3b 0a 09 66 69  gth = maxfd;..fi
47d0: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
47e0: 74 5f 73 6f 63 6b 73 74 61 74 75 73 20 3d 20 6d  t_sockstatus = m
47f0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 66 69  alloc(sizeof(*fi
4800: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
4810: 74 5f 73 6f 63 6b 73 74 61 74 75 73 29 20 2a 20  t_sockstatus) * 
4820: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
4830: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5f 6c  out_sockstatus_l
4840: 65 6e 67 74 68 29 3b 0a 09 69 66 20 28 66 69 6c  ength);..if (fil
4850: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
4860: 5f 73 6f 63 6b 73 74 61 74 75 73 20 3d 3d 20 4e  _sockstatus == N
4870: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
4880: 2d 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  -1);..}...for (i
4890: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6d 61  dx = 0; idx < ma
48a0: 78 66 64 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  xfd; idx++) {...
48b0: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
48c0: 6f 75 74 5f 73 6f 63 6b 73 74 61 74 75 73 5b 69  out_sockstatus[i
48d0: 64 78 5d 2e 76 61 6c 69 64 20 3d 20 66 69 6c 65  dx].valid = file
48e0: 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f  d_sockettimeout_
48f0: 69 6e 76 61 6c 69 64 3b 0a 09 7d 0a 0a 09 66 69  invalid;..}...fi
4900: 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75  led_sockettimeou
4910: 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 20 3d 20 6f  t_devnull_fd = o
4920: 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c  pen("/dev/null",
4930: 20 4f 5f 52 44 57 52 29 3b 0a 09 69 66 20 28 66   O_RDWR);..if (f
4940: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
4950: 75 74 5f 64 65 76 6e 75 6c 6c 5f 66 64 20 3c 20  ut_devnull_fd < 
4960: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
4970: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  );..}...return(0
4980: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  );.}.#endif../* 
4990: 46 6f 72 6d 61 74 20 74 69 6d 65 20 70 65 72 20  Format time per 
49a0: 52 46 43 32 36 31 36 20 2a 2f 0a 73 74 61 74 69  RFC2616 */.stati
49b0: 63 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 66 6f  c char *filed_fo
49c0: 72 6d 61 74 5f 74 69 6d 65 28 63 68 61 72 20 2a  rmat_time(char *
49d0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62  buffer, size_t b
49e0: 75 66 66 65 72 5f 6c 65 6e 2c 20 63 6f 6e 73 74  uffer_len, const
49f0: 20 74 69 6d 65 5f 74 20 74 69 6d 65 69 6e 66 6f   time_t timeinfo
4a00: 29 20 7b 0a 09 73 74 72 75 63 74 20 74 6d 20 74  ) {..struct tm t
4a10: 69 6d 65 69 6e 66 6f 5f 74 6d 2c 20 2a 74 69 6d  imeinfo_tm, *tim
4a20: 65 69 6e 66 6f 5f 74 6d 5f 70 3b 0a 0a 09 74 69  einfo_tm_p;...ti
4a30: 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 20 67 6d  meinfo_tm_p = gm
4a40: 74 69 6d 65 5f 72 28 26 74 69 6d 65 69 6e 66 6f  time_r(&timeinfo
4a50: 2c 20 26 74 69 6d 65 69 6e 66 6f 5f 74 6d 29 3b  , &timeinfo_tm);
4a60: 0a 09 69 66 20 28 74 69 6d 65 69 6e 66 6f 5f 74  ..if (timeinfo_t
4a70: 6d 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  m_p == NULL) {..
4a80: 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e  .return("unknown
4a90: 22 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5b  ");..}...buffer[
4aa0: 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31 5d 20  buffer_len - 1] 
4ab0: 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72 5f  = '\0';..buffer_
4ac0: 6c 65 6e 20 3d 20 73 74 72 66 74 69 6d 65 28 62  len = strftime(b
4ad0: 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c 65  uffer, buffer_le
4ae0: 6e 20 2d 20 31 2c 20 22 25 61 2c 20 25 64 20 25  n - 1, "%a, %d %
4af0: 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 47 4d  b %Y %H:%M:%S GM
4b00: 54 22 2c 20 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f  T", timeinfo_tm_
4b10: 70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66  p);...return(buf
4b20: 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 68 61 73 68  fer);.}../* hash
4b30: 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67   */.static unsig
4b40: 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f 68 61  ned int filed_ha
4b50: 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  sh(const unsigne
4b60: 64 20 63 68 61 72 20 2a 76 61 6c 75 65 2c 20 75  d char *value, u
4b70: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 6f 64 75  nsigned int modu
4b80: 6c 75 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  lus) {..unsigned
4b90: 20 63 68 61 72 20 63 75 72 72 2c 20 70 72 65 76   char curr, prev
4ba0: 3b 0a 09 69 6e 74 20 64 69 66 66 3b 0a 09 75 6e  ;..int diff;..un
4bb0: 73 69 67 6e 65 64 20 69 6e 74 20 72 65 74 76 61  signed int retva
4bc0: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 6f  l;...retval = mo
4bd0: 64 75 6c 75 73 20 2d 20 31 3b 0a 09 70 72 65 76  dulus - 1;..prev
4be0: 20 3d 20 6d 6f 64 75 6c 75 73 20 25 20 32 35 35   = modulus % 255
4bf0: 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 75 72 72  ;...while ((curr
4c00: 20 3d 20 2a 76 61 6c 75 65 29 29 20 7b 0a 09 09   = *value)) {...
4c10: 69 66 20 28 63 75 72 72 20 3c 20 33 32 29 20 7b  if (curr < 32) {
4c20: 0a 09 09 09 63 75 72 72 20 3d 20 32 35 35 20 2d  ....curr = 255 -
4c30: 20 63 75 72 72 3b 0a 09 09 7d 20 65 6c 73 65 20   curr;...} else 
4c40: 7b 0a 09 09 09 63 75 72 72 20 2d 3d 20 33 32 3b  {....curr -= 32;
4c50: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 72 65 76  ...}....if (prev
4c60: 20 3c 20 63 75 72 72 29 20 7b 0a 09 09 09 64 69   < curr) {....di
4c70: 66 66 20 3d 20 63 75 72 72 20 2d 20 70 72 65 76  ff = curr - prev
4c80: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
4c90: 64 69 66 66 20 3d 20 70 72 65 76 20 2d 20 63 75  diff = prev - cu
4ca0: 72 72 3b 0a 09 09 7d 0a 0a 09 09 70 72 65 76 20  rr;...}....prev 
4cb0: 3d 20 63 75 72 72 3b 0a 0a 09 09 72 65 74 76 61  = curr;....retva
4cc0: 6c 20 3c 3c 3d 20 33 3b 0a 09 09 72 65 74 76 61  l <<= 3;...retva
4cd0: 6c 20 26 3d 20 30 78 46 46 46 46 46 46 46 46 4c  l &= 0xFFFFFFFFL
4ce0: 55 3b 0a 09 09 72 65 74 76 61 6c 20 5e 3d 20 64  U;...retval ^= d
4cf0: 69 66 66 3b 0a 0a 09 09 76 61 6c 75 65 2b 2b 3b  iff;....value++;
4d00: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72  ..}...retval = r
4d10: 65 74 76 61 6c 20 25 20 6d 6f 64 75 6c 75 73 3b  etval % modulus;
4d20: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
4d30: 29 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 20  );.}../* Find a 
4d40: 6d 69 6d 65 2d 74 79 70 65 20 62 61 73 65 64 20  mime-type based 
4d50: 6f 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  on the filename 
4d60: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
4d70: 63 68 61 72 20 2a 66 69 6c 65 64 5f 64 65 74 65  char *filed_dete
4d80: 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28 63  rmine_mimetype(c
4d90: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
4da0: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a   {..const char *
4db0: 70 3b 0a 0a 09 70 20 3d 20 73 74 72 72 63 68 72  p;...p = strrchr
4dc0: 28 70 61 74 68 2c 20 27 2e 27 29 3b 0a 09 69 66  (path, '.');..if
4dd0: 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09   (p == NULL) {..
4de0: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44 45  .return(FILED_DE
4df0: 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d 0a  FAULT_TYPE);..}.
4e00: 0a 09 70 2b 2b 3b 0a 09 69 66 20 28 2a 70 20 3d  ..p++;..if (*p =
4e10: 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75  = '\0') {...retu
4e20: 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54  rn(FILED_DEFAULT
4e30: 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c  _TYPE);..}...fil
4e40: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
4e50: 28 22 4c 6f 6f 6b 69 6e 67 20 75 70 20 4d 49 4d  ("Looking up MIM
4e60: 45 20 74 79 70 65 20 66 6f 72 20 25 73 20 28 68  E type for %s (h
4e70: 61 73 68 20 3d 20 25 6c 6c 75 29 22 2c 20 70 2c  ash = %llu)", p,
4e80: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
4e90: 6c 6f 6e 67 29 20 66 69 6c 65 64 5f 68 61 73 68  long) filed_hash
4ea0: 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ((const unsigned
4eb0: 20 63 68 61 72 20 2a 29 20 70 2c 20 31 36 37 37   char *) p, 1677
4ec0: 37 32 35 39 29 29 3b 0a 0a 23 69 6e 63 6c 75 64  7259));..#includ
4ed0: 65 20 22 66 69 6c 65 64 2d 6d 69 6d 65 2d 74 79  e "filed-mime-ty
4ee0: 70 65 73 2e 68 22 0a 0a 09 72 65 74 75 72 6e 28  pes.h"...return(
4ef0: 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59  FILED_DEFAULT_TY
4f00: 50 45 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  PE);.}../* Gener
4f10: 61 74 65 20 61 20 75 6e 69 71 75 65 20 69 64 65  ate a unique ide
4f20: 6e 74 69 66 69 65 72 20 2a 2f 0a 73 74 61 74 69  ntifier */.stati
4f30: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 67 65 6e  c void filed_gen
4f40: 65 72 61 74 65 5f 65 74 61 67 28 63 68 61 72 20  erate_etag(char 
4f50: 2a 65 74 61 67 2c 20 73 69 7a 65 5f 74 20 6c 65  *etag, size_t le
4f60: 6e 67 74 68 29 20 7b 0a 09 73 6e 70 72 69 6e 74  ngth) {..snprint
4f70: 66 28 65 74 61 67 2c 20 6c 65 6e 67 74 68 2c 20  f(etag, length, 
4f80: 22 25 6c 6c 78 2d 25 6c 6c 78 25 6c 6c 78 25 6c  "%llx-%llx%llx%l
4f90: 6c 78 25 6c 6c 78 22 2c 0a 09 09 28 75 6e 73 69  lx%llx",...(unsi
4fa0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
4fb0: 74 69 6d 65 28 4e 55 4c 4c 29 2c 0a 09 09 28 75  time(NULL),...(u
4fc0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
4fd0: 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28  g) random(),...(
4fe0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
4ff0: 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09  ng) random(),...
5000: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
5010: 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09  ong) random(),..
5020: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
5030: 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 0a 09  long) random()..
5040: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 46 49 4c  );.}..#ifdef FIL
5050: 45 44 5f 46 41 4b 45 5f 43 48 52 4f 4f 54 0a 2f  ED_FAKE_CHROOT./
5060: 2a 20 54 72 61 6e 73 6c 61 74 65 20 61 20 70 61  * Translate a pa
5070: 74 68 20 69 6e 74 6f 20 61 20 66 61 6b 65 20 63  th into a fake c
5080: 68 72 6f 6f 74 20 70 61 74 68 20 2a 2f 0a 73 74  hroot path */.st
5090: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
50a0: 2a 66 69 6c 65 64 5f 70 61 74 68 5f 74 72 61 6e  *filed_path_tran
50b0: 73 6c 61 74 65 28 63 6f 6e 73 74 20 63 68 61 72  slate(const char
50c0: 20 2a 70 61 74 68 2c 20 73 74 72 75 63 74 20 66   *path, struct f
50d0: 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70  iled_options *op
50e0: 74 69 6f 6e 73 29 20 7b 0a 09 73 74 61 74 69 63  tions) {..static
50f0: 20 5f 5f 74 68 72 65 61 64 20 63 68 61 72 20 70   __thread char p
5100: 61 74 68 42 75 66 66 65 72 5b 38 31 39 32 5d 3b  athBuffer[8192];
5110: 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72  ..int snprintf_r
5120: 65 74 3b 0a 0a 09 2f 2a 20 49 66 20 6e 6f 20 61  et;.../* If no a
5130: 6c 74 65 72 6e 61 74 69 76 65 20 72 6f 6f 74 20  lternative root 
5140: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  is specified, re
5150: 74 75 72 6e 20 74 68 65 20 75 6e 61 64 6f 72 6e  turn the unadorn
5160: 65 64 20 70 61 74 68 20 2a 2f 0a 09 69 66 20 28  ed path */..if (
5170: 21 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b 65 5f 6e  !options->fake_n
5180: 65 77 72 6f 6f 74 29 20 7b 0a 09 09 72 65 74 75  ewroot) {...retu
5190: 72 6e 28 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 2f  rn(path);..}.../
51a0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
51b0: 69 73 20 72 65 71 75 65 73 74 20 77 69 6c 6c 20  is request will 
51c0: 6e 6f 74 20 67 6f 20 6f 75 74 73 69 64 65 20 6f  not go outside o
51d0: 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
51e0: 72 6f 6f 74 20 2a 2f 0a 09 69 66 20 28 73 74 72  root */..if (str
51f0: 73 74 72 28 70 61 74 68 2c 20 22 2f 2e 2e 2f 22  str(path, "/../"
5200: 29 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 70 61 74  ) != NULL || pat
5210: 68 5b 30 5d 20 21 3d 20 27 2f 27 29 20 7b 0a 09  h[0] != '/') {..
5220: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64  .filed_log_msg_d
5230: 65 62 75 67 28 22 55 6e 61 62 6c 65 20 74 6f 20  ebug("Unable to 
5240: 74 72 61 6e 73 6c 61 74 65 20 70 61 74 68 20 5c  translate path \
5250: 22 25 73 5c 22 2c 20 63 6f 6e 74 61 69 6e 73 20  "%s\", contains 
5260: 69 6e 76 61 6c 69 64 20 63 68 61 72 61 63 74 65  invalid characte
5270: 72 73 22 2c 20 70 61 74 68 29 3b 0a 0a 09 09 72  rs", path);....r
5280: 65 74 75 72 6e 28 6f 70 74 69 6f 6e 73 2d 3e 66  eturn(options->f
5290: 61 6b 65 5f 6e 65 77 72 6f 6f 74 29 3b 0a 09 7d  ake_newroot);..}
52a0: 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .../* Create the
52b0: 20 6e 65 77 20 70 61 74 68 20 69 6e 74 6f 20 6f   new path into o
52c0: 75 72 20 6c 6f 63 61 6c 20 28 54 4c 53 29 20 73  ur local (TLS) s
52d0: 74 61 74 69 63 20 62 75 66 66 65 72 20 2a 2f 0a  tatic buffer */.
52e0: 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3d 20  .snprintf_ret = 
52f0: 73 6e 70 72 69 6e 74 66 28 70 61 74 68 42 75 66  snprintf(pathBuf
5300: 66 65 72 2c 20 73 69 7a 65 6f 66 28 70 61 74 68  fer, sizeof(path
5310: 42 75 66 66 65 72 29 2c 20 22 25 73 2f 25 73 22  Buffer), "%s/%s"
5320: 2c 20 6f 70 74 69 6f 6e 73 2d 3e 66 61 6b 65 5f  , options->fake_
5330: 6e 65 77 72 6f 6f 74 2c 20 70 61 74 68 29 3b 0a  newroot, path);.
5340: 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72 65  .if (snprintf_re
5350: 74 20 3c 20 30 20 7c 7c 20 28 28 75 6e 73 69 67  t < 0 || ((unsig
5360: 6e 65 64 20 69 6e 74 29 20 73 6e 70 72 69 6e 74  ned int) snprint
5370: 66 5f 72 65 74 29 20 3e 3d 20 73 69 7a 65 6f 66  f_ret) >= sizeof
5380: 28 70 61 74 68 42 75 66 66 65 72 29 29 20 7b 0a  (pathBuffer)) {.
5390: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
53a0: 64 65 62 75 67 28 22 55 6e 61 62 6c 65 20 74 6f  debug("Unable to
53b0: 20 74 72 61 6e 73 6c 61 74 65 20 70 61 74 68 20   translate path 
53c0: 5c 22 25 73 5c 22 2c 20 77 69 6c 6c 20 6e 6f 74  \"%s\", will not
53d0: 20 66 69 74 20 69 6e 74 6f 20 6e 65 77 20 62 75   fit into new bu
53e0: 66 66 65 72 22 2c 20 70 61 74 68 29 3b 0a 0a 09  ffer", path);...
53f0: 09 72 65 74 75 72 6e 28 6f 70 74 69 6f 6e 73 2d  .return(options-
5400: 3e 66 61 6b 65 5f 6e 65 77 72 6f 6f 74 29 3b 0a  >fake_newroot);.
5410: 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  .}...filed_log_m
5420: 73 67 5f 64 65 62 75 67 28 22 54 72 61 6e 73 6c  sg_debug("Transl
5430: 61 74 69 6e 67 20 70 61 74 68 20 5c 22 25 73 5c  ating path \"%s\
5440: 22 20 69 6e 74 6f 20 5c 22 25 73 5c 22 22 2c 20  " into \"%s\"", 
5450: 70 61 74 68 2c 20 70 61 74 68 42 75 66 66 65 72  path, pathBuffer
5460: 29 3b 0a 0a 09 2f 2a 20 52 65 74 75 72 6e 20 74  );.../* Return t
5470: 68 65 20 6e 65 77 20 70 61 74 68 20 2a 2f 0a 09  he new path */..
5480: 72 65 74 75 72 6e 28 70 61 74 68 42 75 66 66 65  return(pathBuffe
5490: 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  r);.}..static vo
54a0: 69 64 20 66 69 6c 65 64 5f 70 61 74 68 5f 74 72  id filed_path_tr
54b0: 61 6e 73 6c 61 74 65 5f 73 65 74 5f 72 6f 6f 74  anslate_set_root
54c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 72  (const char *var
54d0: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f  , struct filed_o
54e0: 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 2c  ptions *options,
54f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 61 6c   const char *val
5500: 29 20 7b 0a 09 6f 70 74 69 6f 6e 73 2d 3e 66 61  ) {..options->fa
5510: 6b 65 5f 6e 65 77 72 6f 6f 74 20 3d 20 73 74 72  ke_newroot = str
5520: 64 75 70 28 76 61 6c 29 3b 0a 0a 09 72 65 74 75  dup(val);...retu
5530: 72 6e 3b 0a 0a 09 2f 2a 20 76 61 72 20 69 73 20  rn;.../* var is 
5540: 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 74 68 65  only used in the
5550: 20 6d 61 63 72 6f 20 2d 2d 20 64 69 73 63 61 72   macro -- discar
5560: 64 20 69 74 20 68 65 72 65 20 2a 2f 0a 09 76 61  d it here */..va
5570: 72 20 3d 20 76 61 72 3b 0a 7d 0a 23 65 6c 73 65  r = var;.}.#else
5580: 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 70  .#define filed_p
5590: 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 28 70 61  ath_translate(pa
55a0: 74 68 2c 20 6f 70 74 69 6f 6e 73 29 20 70 61 74  th, options) pat
55b0: 68 0a 23 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  h.#define filed_
55c0: 70 61 74 68 5f 74 72 61 6e 73 6c 61 74 65 5f 73  path_translate_s
55d0: 65 74 5f 72 6f 6f 74 28 76 61 72 2c 20 6f 70 74  et_root(var, opt
55e0: 69 6f 6e 73 2c 20 76 61 6c 29 20 76 61 72 20 3d  ions, val) var =
55f0: 20 73 74 72 64 75 70 28 76 61 6c 29 0a 23 65 6e   strdup(val).#en
5600: 64 69 66 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66  dif../* Open a f
5610: 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 66  ile and return f
5620: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
5630: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
5640: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20   filed_fileinfo 
5650: 2a 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65  *filed_open_file
5660: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
5670: 68 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  h, struct filed_
5680: 66 69 6c 65 69 6e 66 6f 20 2a 62 75 66 66 65 72  fileinfo *buffer
5690: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f  , struct filed_o
56a0: 70 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29  ptions *options)
56b0: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
56c0: 5f 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65  _fileinfo *cache
56d0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
56e0: 63 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f  cache_idx;..off_
56f0: 74 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a  t len;..int fd;.
5700: 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69 6c 65  ..if (filed_file
5710: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
5720: 65 20 21 3d 20 30 29 20 7b 0a 09 09 63 61 63 68  e != 0) {...cach
5730: 65 5f 69 64 78 20 3d 20 66 69 6c 65 64 5f 68 61  e_idx = filed_ha
5740: 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sh((const unsign
5750: 65 64 20 63 68 61 72 20 2a 29 20 70 61 74 68 2c  ed char *) path,
5760: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f   filed_fileinfo_
5770: 66 64 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 0a  fdcache_size);..
5780: 09 09 63 61 63 68 65 20 3d 20 26 66 69 6c 65 64  ..cache = &filed
5790: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
57a0: 65 5b 63 61 63 68 65 5f 69 64 78 5d 3b 0a 0a 09  e[cache_idx];...
57b0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64  .filed_log_msg_d
57c0: 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67 20 6d 75  ebug("Locking mu
57d0: 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c 75  tex for idx: %lu
57e0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
57f0: 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a 0a  g) cache_idx);..
5800: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
5810: 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74  lock(&cache->mut
5820: 65 78 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f  ex);....filed_lo
5830: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d  g_msg_debug("Com
5840: 70 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6d  pleted locking m
5850: 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c  utex for idx: %l
5860: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
5870: 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a  ng) cache_idx);.
5880: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 68  .} else {...cach
5890: 65 5f 69 64 78 20 3d 20 30 3b 0a 09 09 63 61 63  e_idx = 0;...cac
58a0: 68 65 20 3d 20 62 75 66 66 65 72 3b 0a 09 09 63  he = buffer;...c
58b0: 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d 20 3d 20  ache->path[0] = 
58c0: 27 5c 30 27 3b 0a 09 09 63 61 63 68 65 2d 3e 66  '\0';...cache->f
58d0: 64 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 69 66 20  d = -1;..}...if 
58e0: 28 73 74 72 63 6d 70 28 70 61 74 68 2c 20 63 61  (strcmp(path, ca
58f0: 63 68 65 2d 3e 70 61 74 68 29 20 21 3d 20 30 29  che->path) != 0)
5900: 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d   {...filed_log_m
5910: 73 67 5f 64 65 62 75 67 28 22 43 61 63 68 65 20  sg_debug("Cache 
5920: 6d 69 73 73 20 66 6f 72 20 69 64 78 3a 20 25 6c  miss for idx: %l
5930: 75 3a 20 4f 4c 44 20 5c 22 25 73 5c 22 2c 20 4e  u: OLD \"%s\", N
5940: 45 57 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73  EW \"%s\"", (uns
5950: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68  igned long) cach
5960: 65 5f 69 64 78 2c 20 63 61 63 68 65 2d 3e 70 61  e_idx, cache->pa
5970: 74 68 2c 20 70 61 74 68 29 3b 0a 0a 09 09 66 64  th, path);....fd
5980: 20 3d 20 6f 70 65 6e 28 66 69 6c 65 64 5f 70 61   = open(filed_pa
5990: 74 68 5f 74 72 61 6e 73 6c 61 74 65 28 70 61 74  th_translate(pat
59a0: 68 2c 20 6f 70 74 69 6f 6e 73 29 2c 20 4f 5f 52  h, options), O_R
59b0: 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52 47 45 46  DONLY | O_LARGEF
59c0: 49 4c 45 29 3b 0a 09 09 69 66 20 28 66 64 20 3c  ILE);...if (fd <
59d0: 20 30 29 20 7b 0a 09 09 09 69 66 20 28 66 69 6c   0) {....if (fil
59e0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
59f0: 63 68 65 5f 73 69 7a 65 20 21 3d 20 30 29 20 7b  che_size != 0) {
5a00: 0a 09 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74  .....pthread_mut
5a10: 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65  ex_unlock(&cache
5a20: 2d 3e 6d 75 74 65 78 29 3b 0a 09 09 09 7d 0a 0a  ->mutex);....}..
5a30: 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
5a40: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 68  ...}....if (cach
5a50: 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a 09 09  e->fd >= 0) {...
5a60: 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66 64  .close(cache->fd
5a70: 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20 3d 20  );...}....len = 
5a80: 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53 45 45  lseek(fd, 0, SEE
5a90: 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65 6b 28  K_END);...lseek(
5aa0: 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  fd, 0, SEEK_SET)
5ab0: 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64 20 3d  ;....cache->fd =
5ac0: 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e 6c 65   fd;...cache->le
5ad0: 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73 74 72 63 70  n = len;...strcp
5ae0: 79 28 63 61 63 68 65 2d 3e 70 61 74 68 2c 20 70  y(cache->path, p
5af0: 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d 3e 74  ath);...cache->t
5b00: 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65 74 65  ype = filed_dete
5b10: 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28 70  rmine_mimetype(p
5b20: 61 74 68 29 3b 0a 09 09 66 69 6c 65 64 5f 67 65  ath);...filed_ge
5b30: 6e 65 72 61 74 65 5f 65 74 61 67 28 63 61 63 68  nerate_etag(cach
5b40: 65 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66 28  e->etag, sizeof(
5b50: 63 61 63 68 65 2d 3e 65 74 61 67 29 29 3b 0a 0a  cache->etag));..
5b60: 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 44  ../* XXX:TODO: D
5b70: 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09 09 63 61  etermine */...ca
5b80: 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 66  che->lastmod = f
5b90: 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65  iled_format_time
5ba0: 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f  (cache->lastmod_
5bb0: 62 2c 20 73 69 7a 65 6f 66 28 63 61 63 68 65 2d  b, sizeof(cache-
5bc0: 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20 74 69 6d  >lastmod_b), tim
5bd0: 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29 3b 0a 09  e(NULL) - 30);..
5be0: 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65 64  } else {...filed
5bf0: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
5c00: 43 61 63 68 65 20 68 69 74 20 66 6f 72 20 69 64  Cache hit for id
5c10: 78 3a 20 25 6c 75 3a 20 50 41 54 48 20 5c 22 25  x: %lu: PATH \"%
5c20: 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  s\"", (unsigned 
5c30: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 2c  long) cache_idx,
5c40: 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 69 66 20   path);..}...if 
5c50: 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  (filed_fileinfo_
5c60: 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20  fdcache_size != 
5c70: 30 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 57  0) {.../*... * W
5c80: 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61  e have to make a
5c90: 20 64 75 70 6c 69 63 61 74 65 20 46 44 2c 20 62   duplicate FD, b
5ca0: 65 63 61 75 73 65 20 6f 6e 63 65 20 77 65 20 72  ecause once we r
5cb0: 65 6c 65 61 73 65 20 74 68 65 20 63 61 63 68 65  elease the cache
5cc0: 0a 09 09 20 2a 20 6d 75 74 65 78 2c 20 74 68 65  ... * mutex, the
5cd0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5ce0: 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 0a 09   may be closed..
5cf0: 09 20 2a 2f 0a 09 09 66 64 20 3d 20 64 75 70 28  . */...fd = dup(
5d00: 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09 69 66  cache->fd);...if
5d10: 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 09 70   (fd < 0) {....p
5d20: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
5d30: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
5d40: 78 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e  x);.....return(N
5d50: 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 62 75 66  ULL);...}....buf
5d60: 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09  fer->fd = fd;...
5d70: 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63 61  buffer->len = ca
5d80: 63 68 65 2d 3e 6c 65 6e 3b 0a 09 09 62 75 66 66  che->len;...buff
5d90: 65 72 2d 3e 74 79 70 65 20 3d 20 63 61 63 68 65  er->type = cache
5da0: 2d 3e 74 79 70 65 3b 0a 09 09 6d 65 6d 63 70 79  ->type;...memcpy
5db0: 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64  (buffer->lastmod
5dc0: 5f 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d  _b, cache->lastm
5dd0: 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62 75 66  od_b, sizeof(buf
5de0: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29  fer->lastmod_b))
5df0: 3b 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 66 65  ;...memcpy(buffe
5e00: 72 2d 3e 65 74 61 67 2c 20 63 61 63 68 65 2d 3e  r->etag, cache->
5e10: 65 74 61 67 2c 20 73 69 7a 65 6f 66 28 62 75 66  etag, sizeof(buf
5e20: 66 65 72 2d 3e 65 74 61 67 29 29 3b 0a 09 09 62  fer->etag));...b
5e30: 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 20 3d  uffer->lastmod =
5e40: 20 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64   buffer->lastmod
5e50: 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e 6c 61 73  _b + (cache->las
5e60: 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d 3e 6c 61  tmod - cache->la
5e70: 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 09 70 74 68  stmod_b);....pth
5e80: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
5e90: 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29  k(&cache->mutex)
5ea0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 62 75  ;..}...return(bu
5eb0: 66 66 65 72 29 3b 0a 0a 09 2f 2a 20 6f 70 74 69  ffer);.../* opti
5ec0: 6f 6e 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ons is only used
5ed0: 20 69 66 20 66 61 6b 65 20 63 68 72 6f 6f 74 20   if fake chroot 
5ee0: 69 73 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6e 66  is enabled, conf
5ef0: 75 73 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  use the compiler
5f00: 20 2a 2f 0a 09 6f 70 74 69 6f 6e 73 20 3d 20 6f   */..options = o
5f10: 70 74 69 6f 6e 73 3b 0a 7d 0a 0a 2f 2a 20 50 72  ptions;.}../* Pr
5f20: 6f 63 65 73 73 20 61 6e 20 48 54 54 50 20 72 65  ocess an HTTP re
5f30: 71 75 65 73 74 20 61 6e 64 20 72 65 74 75 72 6e  quest and return
5f40: 20 74 68 65 20 70 61 74 68 20 72 65 71 75 65 73   the path reques
5f50: 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ted */.static st
5f60: 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f  ruct filed_http_
5f70: 72 65 71 75 65 73 74 20 2a 66 69 6c 65 64 5f 67  request *filed_g
5f80: 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28  et_http_request(
5f90: 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74  FILE *fp, struct
5fa0: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
5fb0: 65 73 74 20 2a 62 75 66 66 65 72 5f 73 74 2c 20  est *buffer_st, 
5fc0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74  struct filed_opt
5fd0: 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b  ions *options) {
5fe0: 0a 09 63 68 61 72 20 2a 6d 65 74 68 6f 64 2c 20  ..char *method, 
5ff0: 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 62 75  *path;..char *bu
6000: 66 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65  ffer, *workbuffe
6010: 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72 5f 6e  r, *workbuffer_n
6020: 65 78 74 3b 0a 09 63 68 61 72 20 2a 66 67 65 74  ext;..char *fget
6030: 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62  s_ret;..size_t b
6040: 75 66 66 65 72 5f 6c 65 6e 2c 20 70 61 74 68 5f  uffer_len, path_
6050: 6c 65 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e 67  len;..off_t rang
6060: 65 5f 73 74 61 72 74 2c 20 72 61 6e 67 65 5f 65  e_start, range_e
6070: 6e 64 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68  nd, range_length
6080: 3b 0a 09 69 6e 74 20 72 61 6e 67 65 5f 72 65 71  ;..int range_req
6090: 75 65 73 74 3b 0a 09 69 6e 74 20 73 6e 70 72 69  uest;..int snpri
60a0: 6e 74 66 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b  ntf_ret;..int i;
60b0: 0a 0a 09 2f 2a 20 53 65 74 20 74 6f 20 64 65 66  .../* Set to def
60c0: 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a 09  ault values */..
60d0: 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20 30 3b  range_start = 0;
60e0: 0a 09 72 61 6e 67 65 5f 65 6e 64 20 20 20 3d 20  ..range_end   = 
60f0: 30 3b 0a 09 72 61 6e 67 65 5f 72 65 71 75 65 73  0;..range_reques
6100: 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 6c 65  t = 0;..range_le
6110: 6e 67 74 68 20 3d 20 2d 31 3b 0a 09 62 75 66 66  ngth = -1;..buff
6120: 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68  er_st->headers.h
6130: 6f 73 74 2e 70 72 65 73 65 6e 74 20 3d 20 30 3b  ost.present = 0;
6140: 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61  ..buffer_st->hea
6150: 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f 6e 20  ders.connection 
6160: 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49  = FILED_CONNECTI
6170: 4f 4e 5f 43 4c 4f 53 45 3b 0a 0a 09 62 75 66 66  ON_CLOSE;...buff
6180: 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e  er = buffer_st->
6190: 74 6d 70 62 75 66 3b 0a 09 62 75 66 66 65 72 5f  tmpbuf;..buffer_
61a0: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66  len = sizeof(buf
61b0: 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 29 3b  fer_st->tmpbuf);
61c0: 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66  ...fgets_ret = f
61d0: 67 65 74 73 28 62 75 66 66 65 72 2c 20 62 75 66  gets(buffer, buf
61e0: 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 69  fer_len, fp);..i
61f0: 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20  f (fgets_ret == 
6200: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
6210: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 6d 65 74  (NULL);..}...met
6220: 68 6f 64 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09  hod = buffer;...
6230: 62 75 66 66 65 72 20 3d 20 73 74 72 63 68 72 28  buffer = strchr(
6240: 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a 09 69  buffer, ' ');..i
6250: 66 20 28 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c  f (buffer == NUL
6260: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55  L) {...return(NU
6270: 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 62 75 66 66 65  LL);..}...*buffe
6280: 72 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65  r = '\0';..buffe
6290: 72 2b 2b 3b 0a 0a 09 70 61 74 68 20 3d 20 62 75  r++;...path = bu
62a0: 66 66 65 72 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69  ffer;.../* Termi
62b0: 6e 61 74 65 20 70 61 74 68 20 63 6f 6d 70 6f 6e  nate path compon
62c0: 65 6e 74 20 2a 2f 0a 09 62 75 66 66 65 72 20 3d  ent */..buffer =
62d0: 20 73 74 72 70 62 72 6b 28 70 61 74 68 2c 20 22   strpbrk(path, "
62e0: 5c 72 5c 6e 20 22 29 3b 0a 09 69 66 20 28 62 75  \r\n ");..if (bu
62f0: 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ffer != NULL) {.
6300: 09 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30 27  ..*buffer = '\0'
6310: 3b 0a 09 09 62 75 66 66 65 72 2b 2b 3b 0a 09 7d  ;...buffer++;..}
6320: 0a 0a 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 68 61  .../* We only ha
6330: 6e 64 6c 65 20 74 68 65 20 22 47 45 54 22 20 61  ndle the "GET" a
6340: 6e 64 20 22 48 45 41 44 27 20 6d 65 74 68 6f 64  nd "HEAD' method
6350: 73 20 2a 2f 0a 09 69 66 20 28 73 74 72 63 61 73  s */..if (strcas
6360: 65 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22 68 65  ecmp(method, "he
6370: 61 64 22 29 20 21 3d 20 30 29 20 7b 0a 09 09 69  ad") != 0) {...i
6380: 66 20 28 73 74 72 63 61 73 65 63 6d 70 28 6d 65  f (strcasecmp(me
6390: 74 68 6f 64 2c 20 22 67 65 74 22 29 20 21 3d 20  thod, "get") != 
63a0: 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e  0) {....return(N
63b0: 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  ULL);...}..../* 
63c0: 47 45 54 20 72 65 71 75 65 73 74 20 2a 2f 0a 09  GET request */..
63d0: 09 62 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68  .buffer_st->meth
63e0: 6f 64 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45  od = FILED_REQUE
63f0: 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 3b 0a 09  ST_METHOD_GET;..
6400: 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 48 45  } else {.../* HE
6410: 41 44 20 72 65 71 75 65 73 74 20 2a 2f 0a 09 09  AD request */...
6420: 62 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f  buffer_st->metho
6430: 64 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53  d = FILED_REQUES
6440: 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 3b 0a 09  T_METHOD_HEAD;..
6450: 7d 0a 0a 09 2f 2a 20 4e 6f 74 65 20 70 61 74 68  }.../* Note path
6460: 20 2a 2f 0a 09 70 61 74 68 5f 6c 65 6e 20 3d 20   */..path_len = 
6470: 73 74 72 6c 65 6e 28 70 61 74 68 29 3b 0a 09 6d  strlen(path);..m
6480: 65 6d 63 70 79 28 62 75 66 66 65 72 5f 73 74 2d  emcpy(buffer_st-
6490: 3e 70 61 74 68 2c 20 70 61 74 68 2c 20 70 61 74  >path, path, pat
64a0: 68 5f 6c 65 6e 20 2b 20 31 29 3b 0a 0a 09 2f 2a  h_len + 1);.../*
64b0: 20 44 65 74 65 72 6d 69 6e 65 20 74 79 70 65 20   Determine type 
64c0: 6f 66 20 72 65 71 75 65 73 74 20 66 72 6f 6d 20  of request from 
64d0: 70 61 74 68 20 2a 2f 0a 09 69 66 20 28 70 61 74  path */..if (pat
64e0: 68 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  h_len == 0) {...
64f0: 62 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65 20  buffer_st->type 
6500: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
6510: 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a  TYPE_DIRECTORY;.
6520: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
6530: 70 61 74 68 5b 70 61 74 68 5f 6c 65 6e 20 2d 20  path[path_len - 
6540: 31 5d 20 3d 3d 20 27 2f 27 29 20 7b 0a 09 09 09  1] == '/') {....
6550: 62 75 66 66 65 72 5f 73 74 2d 3e 74 79 70 65 20  buffer_st->type 
6560: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
6570: 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 3b 0a  TYPE_DIRECTORY;.
6580: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 75  ..} else {....bu
6590: 66 66 65 72 5f 73 74 2d 3e 74 79 70 65 20 3d 20  ffer_st->type = 
65a0: 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 54 59  FILED_REQUEST_TY
65b0: 50 45 5f 4f 54 48 45 52 3b 0a 09 09 7d 0a 09 7d  PE_OTHER;...}..}
65c0: 0a 0a 09 2f 2a 20 52 65 73 65 74 20 62 75 66 66  .../* Reset buff
65d0: 65 72 20 66 6f 72 20 6c 61 74 65 72 20 75 73 65  er for later use
65e0: 20 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20 62 75   */..buffer = bu
65f0: 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b  ffer_st->tmpbuf;
6600: 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  ...for (i = 0; i
6610: 20 3c 20 31 30 30 3b 20 69 2b 2b 29 20 7b 0a 09   < 100; i++) {..
6620: 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65  .fgets_ret = fge
6630: 74 73 28 62 75 66 66 65 72 2c 20 62 75 66 66 65  ts(buffer, buffe
6640: 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 09 69 66  r_len, fp);...if
6650: 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e   (fgets_ret == N
6660: 55 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b  ULL) {....break;
6670: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 74 72 6e  ...}....if (strn
6680: 63 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c 20  casecmp(buffer, 
6690: 22 52 61 6e 67 65 3a 20 22 2c 20 37 29 20 3d 3d  "Range: ", 7) ==
66a0: 20 30 29 20 7b 0a 09 09 09 77 6f 72 6b 62 75 66   0) {....workbuf
66b0: 66 65 72 20 3d 20 62 75 66 66 65 72 20 2b 20 37  fer = buffer + 7
66c0: 3b 0a 0a 09 09 09 69 66 20 28 73 74 72 6e 63 61  ;.....if (strnca
66d0: 73 65 63 6d 70 28 77 6f 72 6b 62 75 66 66 65 72  secmp(workbuffer
66e0: 2c 20 22 62 79 74 65 73 3d 22 2c 20 36 29 20 3d  , "bytes=", 6) =
66f0: 3d 20 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62  = 0) {.....workb
6700: 75 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09 09  uffer += 6;.....
6710: 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d  .range_request =
6720: 20 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f 73   1;......range_s
6730: 74 61 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c 28  tart = strtoull(
6740: 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72  workbuffer, &wor
6750: 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30  kbuffer_next, 10
6760: 29 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66 66  );......workbuff
6770: 65 72 20 3d 20 77 6f 72 6b 62 75 66 66 65 72 5f  er = workbuffer_
6780: 6e 65 78 74 3b 0a 0a 09 09 09 09 69 66 20 28 2a  next;......if (*
6790: 77 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 2d  workbuffer == '-
67a0: 27 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62 75  ') {......workbu
67b0: 66 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69 66  ffer++;.......if
67c0: 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d   (*workbuffer !=
67d0: 20 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62 75   '\r' && *workbu
67e0: 66 66 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b 0a  ffer != '\n') {.
67f0: 09 09 09 09 09 09 72 61 6e 67 65 5f 65 6e 64 20  ......range_end 
6800: 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62  = strtoull(workb
6810: 75 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66 66  uffer, &workbuff
6820: 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09 09  er_next, 10);...
6830: 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ...}.....}....}.
6840: 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72  ..} else if (str
6850: 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c  ncasecmp(buffer,
6860: 20 22 48 6f 73 74 3a 20 22 2c 20 35 29 20 3d 3d   "Host: ", 5) ==
6870: 20 30 29 20 7b 0a 09 09 09 62 75 66 66 65 72 5f   0) {....buffer_
6880: 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74  st->headers.host
6890: 2e 70 72 65 73 65 6e 74 20 3d 20 31 3b 0a 0a 09  .present = 1;...
68a0: 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 73  ..workbuffer = s
68b0: 74 72 70 62 72 6b 28 62 75 66 66 65 72 20 2b 20  trpbrk(buffer + 
68c0: 35 2c 20 22 5c 72 5c 6e 3a 22 29 3b 0a 09 09 09  5, "\r\n:");....
68d0: 69 66 20 28 77 6f 72 6b 62 75 66 66 65 72 20 21  if (workbuffer !
68e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 77  = NULL) {.....*w
68f0: 6f 72 6b 62 75 66 66 65 72 20 3d 20 27 5c 30 27  orkbuffer = '\0'
6900: 3b 0a 09 09 09 7d 0a 0a 09 09 09 77 6f 72 6b 62  ;....}.....workb
6910: 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 20 2b  uffer = buffer +
6920: 20 35 3b 0a 09 09 09 77 68 69 6c 65 20 28 2a 77   5;....while (*w
6930: 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 20 27  orkbuffer == ' '
6940: 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75 66 66  ) {.....workbuff
6950: 65 72 2b 2b 3b 0a 09 09 09 7d 0a 0a 09 09 09 73  er++;....}.....s
6960: 74 72 63 70 79 28 62 75 66 66 65 72 5f 73 74 2d  trcpy(buffer_st-
6970: 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 68 6f  >headers.host.ho
6980: 73 74 2c 20 77 6f 72 6b 62 75 66 66 65 72 29 3b  st, workbuffer);
6990: 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 74  ...} else if (st
69a0: 72 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65 72  rncasecmp(buffer
69b0: 2c 20 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 4b  , "Connection: K
69c0: 65 65 70 2d 41 6c 69 76 65 22 2c 20 32 32 29 20  eep-Alive", 22) 
69d0: 3d 3d 20 30 29 20 7b 0a 09 09 09 62 75 66 66 65  == 0) {....buffe
69e0: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 63 6f  r_st->headers.co
69f0: 6e 6e 65 63 74 69 6f 6e 20 3d 20 46 49 4c 45 44  nnection = FILED
6a00: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50  _CONNECTION_KEEP
6a10: 5f 41 4c 49 56 45 3b 0a 09 09 7d 0a 0a 09 09 69  _ALIVE;...}....i
6a20: 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 66 65 72  f (memcmp(buffer
6a30: 2c 20 22 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d 20  , "\r\n", 2) == 
6a40: 30 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  0) {....break;..
6a50: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  .}..}.../* Deter
6a60: 6d 69 6e 65 20 72 61 6e 67 65 20 2a 2f 0a 09 69  mine range */..i
6a70: 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 21 3d 20  f (range_end != 
6a80: 30 29 20 7b 0a 09 09 69 66 20 28 72 61 6e 67 65  0) {...if (range
6a90: 5f 65 6e 64 20 3c 3d 20 72 61 6e 67 65 5f 73 74  _end <= range_st
6aa0: 61 72 74 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  art) {....return
6ab0: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 72  (NULL);...}....r
6ac0: 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 72 61  ange_length = ra
6ad0: 6e 67 65 5f 65 6e 64 20 2d 20 72 61 6e 67 65 5f  nge_end - range_
6ae0: 73 74 61 72 74 3b 0a 0a 09 09 66 69 6c 65 64 5f  start;....filed_
6af0: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43  log_msg_debug("C
6b00: 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68 20  omputing length 
6b10: 70 61 72 61 6d 65 74 65 72 3a 20 25 6c 6c 75 20  parameter: %llu 
6b20: 3d 20 25 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c 0a  = %llu - %llu",.
6b30: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
6b40: 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 6c 65  g long) range_le
6b50: 6e 67 74 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e  ngth,....(unsign
6b60: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61  ed long long) ra
6b70: 6e 67 65 5f 65 6e 64 2c 0a 09 09 09 28 75 6e 73  nge_end,....(uns
6b80: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
6b90: 20 72 61 6e 67 65 5f 73 74 61 72 74 0a 09 09 29   range_start...)
6ba0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20 75  ;..}.../* Fill u
6bb0: 70 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 72  p structure to r
6bc0: 65 74 75 72 6e 20 2a 2f 0a 09 62 75 66 66 65 72  eturn */..buffer
6bd0: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  _st->headers.ran
6be0: 67 65 2e 70 72 65 73 65 6e 74 20 3d 20 72 61 6e  ge.present = ran
6bf0: 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 62 75 66  ge_request;..buf
6c00: 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e  fer_st->headers.
6c10: 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d 20  range.offset  = 
6c20: 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62 75  range_start;..bu
6c30: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
6c40: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20 3d  .range.length  =
6c50: 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 0a   range_length;..
6c60: 09 2f 2a 20 49 66 20 76 68 6f 73 74 73 20 61 72  ./* If vhosts ar
6c70: 65 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6d 70 75  e enabled, compu
6c80: 74 65 20 6e 65 77 20 70 61 74 68 20 2a 2f 0a 09  te new path */..
6c90: 69 66 20 28 6f 70 74 69 6f 6e 73 2d 3e 76 68 6f  if (options->vho
6ca0: 73 74 73 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09  sts_enabled) {..
6cb0: 09 69 66 20 28 62 75 66 66 65 72 5f 73 74 2d 3e  .if (buffer_st->
6cc0: 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 70 72 65  headers.host.pre
6cd0: 73 65 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09  sent == 1) {....
6ce0: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f  buffer = buffer_
6cf0: 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 09 09 62  st->tmpbuf;....b
6d00: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
6d10: 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d  of(buffer_st->tm
6d20: 70 62 75 66 29 3b 0a 0a 09 09 09 73 6e 70 72 69  pbuf);.....snpri
6d30: 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e  ntf_ret = snprin
6d40: 74 66 28 62 75 66 66 65 72 2c 20 62 75 66 66 65  tf(buffer, buffe
6d50: 72 5f 6c 65 6e 2c 20 22 2f 25 73 25 73 25 73 22  r_len, "/%s%s%s"
6d60: 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74 2d  ,.....buffer_st-
6d70: 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 68 6f  >headers.host.ho
6d80: 73 74 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73  st,.....buffer_s
6d90: 74 2d 3e 70 61 74 68 5b 30 5d 20 3d 3d 20 27 2f  t->path[0] == '/
6da0: 27 20 3f 20 22 22 20 3a 20 22 2f 22 2c 0a 09 09  ' ? "" : "/",...
6db0: 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74  ..buffer_st->pat
6dc0: 68 0a 09 09 09 29 3b 0a 09 09 09 69 66 20 28 73  h....);....if (s
6dd0: 6e 70 72 69 6e 74 66 5f 72 65 74 20 3e 3d 20 30  nprintf_ret >= 0
6de0: 29 20 7b 0a 09 09 09 09 69 66 20 28 28 28 75 6e  ) {.....if (((un
6df0: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 6e 70 72  signed int) snpr
6e00: 69 6e 74 66 5f 72 65 74 29 20 3c 20 62 75 66 66  intf_ret) < buff
6e10: 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 09 73  er_len) {......s
6e20: 74 72 63 70 79 28 62 75 66 66 65 72 5f 73 74 2d  trcpy(buffer_st-
6e30: 3e 70 61 74 68 2c 20 62 75 66 66 65 72 29 3b 0a  >path, buffer);.
6e40: 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09  ....}....}...}..
6e50: 7d 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65  }...return(buffe
6e60: 72 5f 73 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  r_st);.}../* Ret
6e70: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 70 61 67  urn an error pag
6e80: 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e */.static void
6e90: 20 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67   filed_error_pag
6ea0: 65 28 46 49 4c 45 20 2a 66 70 2c 20 63 6f 6e 73  e(FILE *fp, cons
6eb0: 74 20 63 68 61 72 20 2a 64 61 74 65 5f 63 75 72  t char *date_cur
6ec0: 72 65 6e 74 2c 20 69 6e 74 20 65 72 72 6f 72 5f  rent, int error_
6ed0: 6e 75 6d 62 65 72 2c 20 69 6e 74 20 6d 65 74 68  number, int meth
6ee0: 6f 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  od, const char *
6ef0: 72 65 61 73 6f 6e 2c 20 73 74 72 75 63 74 20 66  reason, struct f
6f00: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a  iled_log_entry *
6f10: 6c 6f 67 29 20 7b 0a 09 63 68 61 72 20 2a 65 72  log) {..char *er
6f20: 72 6f 72 5f 73 74 72 69 6e 67 20 3d 20 22 3c 68  ror_string = "<h
6f30: 74 6d 6c 3e 3c 68 65 61 64 3e 3c 74 69 74 6c 65  tml><head><title
6f40: 3e 45 52 52 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f  >ERROR</title></
6f50: 68 65 61 64 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c  head><body>Unabl
6f60: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 72 65 71  e to process req
6f70: 75 65 73 74 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d  uest</body></htm
6f80: 6c 3e 22 3b 0a 0a 09 66 70 72 69 6e 74 66 28 66  l>";...fprintf(f
6f90: 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69 20  p, "HTTP/1.1 %i 
6fa0: 4e 6f 74 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20  Not OK\r\nDate: 
6fb0: 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69  %s\r\nServer: fi
6fc0: 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69  led\r\nLast-Modi
6fd0: 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74  fied: %s\r\nCont
6fe0: 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75  ent-Length: %llu
6ff0: 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65  \r\nContent-Type
7000: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69  : %s\r\nConnecti
7010: 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c  on: close\r\n\r\
7020: 6e 22 2c 0a 09 09 65 72 72 6f 72 5f 6e 75 6d 62  n",...error_numb
7030: 65 72 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65  er,...date_curre
7040: 6e 74 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65  nt,...date_curre
7050: 6e 74 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20  nt,...(unsigned 
7060: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 74 72 6c 65  long long) strle
7070: 6e 28 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 2c  n(error_string),
7080: 0a 09 09 22 74 65 78 74 2f 68 74 6d 6c 22 0a 09  ..."text/html"..
7090: 29 3b 0a 0a 09 2f 2a 20 73 69 6c 65 6e 63 65 20  );.../* silence 
70a0: 65 72 72 6f 72 20 73 74 72 69 6e 67 20 66 6f 72  error string for
70b0: 20 48 45 41 44 20 72 65 71 75 65 73 74 73 20 2a   HEAD requests *
70c0: 2f 0a 09 69 66 20 28 6d 65 74 68 6f 64 20 21 3d  /..if (method !=
70d0: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
70e0: 45 54 48 4f 44 5f 48 45 41 44 29 20 7b 0a 09 09  ETHOD_HEAD) {...
70f0: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73 22  fprintf(fp, "%s"
7100: 2c 20 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 3b  , error_string);
7110: 0a 09 7d 0a 0a 09 2f 2a 20 4c 6f 67 20 65 72 72  ..}.../* Log err
7120: 6f 72 20 2a 2f 0a 09 2f 2a 2a 20 72 65 61 73 6f  or */../** reaso
7130: 6e 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  n must point to 
7140: 61 20 67 6c 6f 62 61 6c 6c 79 20 61 6c 6c 6f 63  a globally alloc
7150: 61 74 65 64 20 76 61 6c 75 65 20 2a 2a 2f 0a 09  ated value **/..
7160: 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 72 65  log->reason = re
7170: 61 73 6f 6e 3b 0a 09 6c 6f 67 2d 3e 68 74 74 70  ason;..log->http
7180: 5f 63 6f 64 65 20 3d 20 65 72 72 6f 72 5f 6e 75  _code = error_nu
7190: 6d 62 65 72 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f  mber;...filed_lo
71a0: 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09  g_entry(log);...
71b0: 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65 63 74  /* Close connect
71c0: 69 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64 5f 73 6f  ion */..filed_so
71d0: 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f 73  ckettimeout_clos
71e0: 65 28 66 69 6c 65 6e 6f 28 66 70 29 2c 20 30 29  e(fileno(fp), 0)
71f0: 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a  ;...fclose(fp);.
7200: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  ..return;.}../* 
7210: 52 65 74 75 72 6e 20 61 20 72 65 64 69 72 65 63  Return a redirec
7220: 74 20 74 6f 20 69 6e 64 65 78 2e 68 74 6d 6c 20  t to index.html 
7230: 2a 2f 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 44  */.#ifndef FILED
7240: 5f 44 4f 4e 54 5f 52 45 44 49 52 45 43 54 5f 44  _DONT_REDIRECT_D
7250: 49 52 45 43 54 4f 52 49 45 53 0a 73 74 61 74 69  IRECTORIES.stati
7260: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 72 65 64  c void filed_red
7270: 69 72 65 63 74 5f 69 6e 64 65 78 28 46 49 4c 45  irect_index(FILE
7280: 20 2a 66 70 2c 20 63 6f 6e 73 74 20 63 68 61 72   *fp, const char
7290: 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20   *date_current, 
72a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
72b0: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  , struct filed_l
72c0: 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 29 20 7b  og_entry *log) {
72d0: 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 20  ..int http_code 
72e0: 3d 20 33 30 32 3b 0a 09 66 70 72 69 6e 74 66 28  = 302;..fprintf(
72f0: 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69  fp, "HTTP/1.1 %i
7300: 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c   OK\r\nDate: %s\
7310: 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64  r\nServer: filed
7320: 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65  \r\nLast-Modifie
7330: 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74  d: %s\r\nContent
7340: 2d 4c 65 6e 67 74 68 3a 20 30 5c 72 5c 6e 43 6f  -Length: 0\r\nCo
7350: 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c  nnection: close\
7360: 72 5c 6e 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 5c  r\nLocation: %s\
7370: 72 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 68 74 74 70  r\n\r\n",...http
7380: 5f 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63 75  _code,...date_cu
7390: 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f 63 75  rrent,...date_cu
73a0: 72 72 65 6e 74 2c 0a 09 09 22 69 6e 64 65 78 2e  rrent,..."index.
73b0: 68 74 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a 20 4c  html"..);.../* L
73c0: 6f 67 20 72 65 64 69 72 65 63 74 20 2a 2f 0a 09  og redirect */..
73d0: 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 72  log->reason = "r
73e0: 65 64 69 72 65 63 74 22 3b 0a 09 6c 6f 67 2d 3e  edirect";..log->
73f0: 68 74 74 70 5f 63 6f 64 65 20 3d 20 68 74 74 70  http_code = http
7400: 5f 63 6f 64 65 3b 0a 0a 09 66 69 6c 65 64 5f 6c  _code;...filed_l
7410: 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a  og_entry(log);..
7420: 09 2f 2a 20 43 6c 6f 73 65 20 63 6f 6e 6e 65 63  ./* Close connec
7430: 74 69 6f 6e 20 2a 2f 0a 09 66 69 6c 65 64 5f 73  tion */..filed_s
7440: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f  ockettimeout_clo
7450: 73 65 28 66 69 6c 65 6e 6f 28 66 70 29 2c 20 30  se(fileno(fp), 0
7460: 29 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b  );...fclose(fp);
7470: 0a 0a 09 72 65 74 75 72 6e 3b 0a 0a 09 2f 2a 20  ...return;.../* 
7480: 43 75 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64  Currently unused
7490: 3a 20 70 61 74 68 20 2a 2f 0a 09 70 61 74 68 20  : path */..path 
74a0: 3d 20 70 61 74 68 3b 0a 7d 0a 23 65 6e 64 69 66  = path;.}.#endif
74b0: 0a 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  ../* Convert an 
74c0: 65 6e 75 6d 20 72 65 70 72 65 73 65 6e 74 69 6e  enum representin
74d0: 67 20 74 68 65 20 22 43 6f 6e 6e 65 63 74 69 6f  g the "Connectio
74e0: 6e 22 20 68 65 61 64 65 72 20 76 61 6c 75 65 20  n" header value 
74f0: 74 6f 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 73  to a string */.s
7500: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7510: 20 2a 66 69 6c 65 64 5f 63 6f 6e 6e 65 63 74 69   *filed_connecti
7520: 6f 6e 5f 73 74 72 28 69 6e 74 20 63 6f 6e 6e 65  on_str(int conne
7530: 63 74 69 6f 6e 5f 76 61 6c 75 65 29 20 7b 0a 09  ction_value) {..
7540: 73 77 69 74 63 68 20 28 63 6f 6e 6e 65 63 74 69  switch (connecti
7550: 6f 6e 5f 76 61 6c 75 65 29 20 7b 0a 09 09 63 61  on_value) {...ca
7560: 73 65 20 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  se FILED_CONNECT
7570: 49 4f 4e 5f 43 4c 4f 53 45 3a 0a 09 09 09 72 65  ION_CLOSE:....re
7580: 74 75 72 6e 28 22 63 6c 6f 73 65 22 29 3b 0a 09  turn("close");..
7590: 09 63 61 73 65 20 46 49 4c 45 44 5f 43 4f 4e 4e  .case FILED_CONN
75a0: 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56  ECTION_KEEP_ALIV
75b0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 6b 65  E:....return("ke
75c0: 65 70 2d 61 6c 69 76 65 22 29 3b 0a 09 7d 0a 0a  ep-alive");..}..
75d0: 09 72 65 74 75 72 6e 28 22 63 6c 6f 73 65 22 29  .return("close")
75e0: 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20 61  ;.}../* Handle a
75f0: 20 73 69 6e 67 6c 65 20 72 65 71 75 65 73 74 20   single request 
7600: 66 72 6f 6d 20 61 20 63 6c 69 65 6e 74 20 2a 2f  from a client */
7610: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
7620: 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28  d_handle_client(
7630: 69 6e 74 20 66 64 2c 20 73 74 72 75 63 74 20 66  int fd, struct f
7640: 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73  iled_http_reques
7650: 74 20 2a 72 65 71 75 65 73 74 2c 20 73 74 72 75  t *request, stru
7660: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
7670: 72 79 20 2a 6c 6f 67 2c 20 73 74 72 75 63 74 20  ry *log, struct 
7680: 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f  filed_options *o
7690: 70 74 69 6f 6e 73 29 20 7b 0a 09 73 74 72 75 63  ptions) {..struc
76a0: 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  t filed_fileinfo
76b0: 20 2a 66 69 6c 65 69 6e 66 6f 3b 0a 09 73 73 69   *fileinfo;..ssi
76c0: 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 72 65  ze_t sendfile_re
76d0: 74 3b 0a 09 73 69 7a 65 5f 74 20 73 65 6e 64 66  t;..size_t sendf
76e0: 69 6c 65 5f 73 69 7a 65 3b 0a 09 6f 66 66 5f 74  ile_size;..off_t
76f0: 20 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74   sendfile_offset
7700: 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 2c  , sendfile_sent,
7710: 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09   sendfile_len;..
7720: 63 68 61 72 20 2a 70 61 74 68 3b 0a 09 63 68 61  char *path;..cha
7730: 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  r *date_current,
7740: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62 5b   date_current_b[
7750: 36 34 5d 3b 0a 09 69 6e 74 20 68 74 74 70 5f 63  64];..int http_c
7760: 6f 64 65 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a  ode;..FILE *fp;.
7770: 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68  ../* Indicate th
7780: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61  e connection sta
7790: 72 74 20 74 69 6d 65 20 2a 2f 0a 09 6c 6f 67 2d  rt time */..log-
77a0: 3e 63 6f 6e 6e 65 63 74 74 69 6d 65 20 3d 20 74  >connecttime = t
77b0: 69 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20  ime(NULL);.../* 
77c0: 44 65 74 65 72 6d 69 6e 65 20 63 75 72 72 65 6e  Determine curren
77d0: 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f  t time */..date_
77e0: 63 75 72 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f  current = filed_
77f0: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61 74 65  format_time(date
7800: 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65  _current_b, size
7810: 6f 66 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  of(date_current_
7820: 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b  b), time(NULL));
7830: 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65  .../* Open socke
7840: 74 20 61 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f  t as ANSI I/O fo
7850: 72 20 65 61 73 65 20 6f 66 20 75 73 65 20 2a 2f  r ease of use */
7860: 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e 28 66 64  ..fp = fdopen(fd
7870: 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66 20 28 66  , "w+b");..if (f
7880: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  p == NULL) {...f
7890: 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f  iled_sockettimeo
78a0: 75 74 5f 63 6c 6f 73 65 28 66 64 2c 20 30 29 3b  ut_close(fd, 0);
78b0: 0a 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a  ....close(fd);..
78c0: 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d  ..log->buffer[0]
78d0: 20 3d 20 27 5c 30 27 3b 0a 09 09 6c 6f 67 2d 3e   = '\0';...log->
78e0: 68 74 74 70 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a  http_code = -1;.
78f0: 09 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20  ..log->reason = 
7900: 22 66 64 6f 70 65 6e 5f 66 61 69 6c 65 64 22 3b  "fdopen_failed";
7910: 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  ....filed_log_en
7920: 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 09 72 65 74  try(log);....ret
7930: 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  urn(FILED_CONNEC
7940: 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a  TION_CLOSE);..}.
7950: 0a 09 72 65 71 75 65 73 74 20 3d 20 66 69 6c 65  ..request = file
7960: 64 5f 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65  d_get_http_reque
7970: 73 74 28 66 70 2c 20 72 65 71 75 65 73 74 2c 20  st(fp, request, 
7980: 6f 70 74 69 6f 6e 73 29 3b 0a 0a 09 69 66 20 28  options);...if (
7990: 72 65 71 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 29  request == NULL)
79a0: 20 7b 0a 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72   {...log->buffer
79b0: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 09 09 66  [0] = '\0';....f
79c0: 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28  iled_error_page(
79d0: 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74  fp, date_current
79e0: 2c 20 35 30 30 2c 20 46 49 4c 45 44 5f 52 45 51  , 500, FILED_REQ
79f0: 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 2c  UEST_METHOD_GET,
7a00: 20 22 66 6f 72 6d 61 74 22 2c 20 6c 6f 67 29 3b   "format", log);
7a10: 0a 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44  ....return(FILED
7a20: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53  _CONNECTION_CLOS
7a30: 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 73  E);..}...filed_s
7a40: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 70 72 6f  ockettimeout_pro
7a50: 63 65 73 73 69 6e 67 5f 73 74 61 72 74 28 66 64  cessing_start(fd
7a60: 29 3b 0a 0a 09 70 61 74 68 20 3d 20 72 65 71 75  );...path = requ
7a70: 65 73 74 2d 3e 70 61 74 68 3b 0a 09 73 74 72 63  est->path;..strc
7a80: 70 79 28 6c 6f 67 2d 3e 62 75 66 66 65 72 2c 20  py(log->buffer, 
7a90: 70 61 74 68 29 3b 0a 09 6c 6f 67 2d 3e 6d 65 74  path);..log->met
7aa0: 68 6f 64 20 3d 20 72 65 71 75 65 73 74 2d 3e 6d  hod = request->m
7ab0: 65 74 68 6f 64 3b 0a 0a 09 2f 2a 20 49 66 20 74  ethod;.../* If t
7ac0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 74  he requested pat
7ad0: 68 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  h is a directory
7ae0: 2c 20 72 65 64 69 72 65 63 74 20 74 6f 20 69 6e  , redirect to in
7af0: 64 65 78 20 70 61 67 65 20 2a 2f 0a 09 69 66 20  dex page */..if 
7b00: 28 72 65 71 75 65 73 74 2d 3e 74 79 70 65 20 3d  (request->type =
7b10: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
7b20: 54 59 50 45 5f 44 49 52 45 43 54 4f 52 59 29 20  TYPE_DIRECTORY) 
7b30: 7b 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44  {.#ifdef FILED_D
7b40: 4f 4e 54 5f 52 45 44 49 52 45 43 54 5f 44 49 52  ONT_REDIRECT_DIR
7b50: 45 43 54 4f 52 49 45 53 0a 09 09 63 68 61 72 20  ECTORIES...char 
7b60: 6c 6f 63 61 6c 70 61 74 68 5b 38 31 39 32 5d 3b  localpath[8192];
7b70: 0a 09 09 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f  ...int snprintf_
7b80: 72 65 74 3b 0a 0a 09 09 73 6e 70 72 69 6e 74 66  ret;....snprintf
7b90: 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74 66 28  _ret = snprintf(
7ba0: 6c 6f 63 61 6c 70 61 74 68 2c 20 73 69 7a 65 6f  localpath, sizeo
7bb0: 66 28 6c 6f 63 61 6c 70 61 74 68 29 2c 20 22 25  f(localpath), "%
7bc0: 73 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 70  s/index.html", p
7bd0: 61 74 68 29 3b 0a 0a 09 09 69 66 20 28 73 6e 70  ath);....if (snp
7be0: 72 69 6e 74 66 5f 72 65 74 20 3c 3d 20 30 20 7c  rintf_ret <= 0 |
7bf0: 7c 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3e  | snprintf_ret >
7c00: 20 28 73 69 7a 65 6f 66 28 6c 6f 63 61 6c 70 61   (sizeof(localpa
7c10: 74 68 29 20 2d 20 31 29 29 20 7b 0a 09 09 09 66  th) - 1)) {....f
7c20: 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28  iled_error_page(
7c30: 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74  fp, date_current
7c40: 2c 20 35 30 30 2c 20 72 65 71 75 65 73 74 2d 3e  , 500, request->
7c50: 6d 65 74 68 6f 64 2c 20 22 70 61 74 68 5f 66 6f  method, "path_fo
7c60: 72 6d 61 74 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09  rmat", log);....
7c70: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f  .return(FILED_CO
7c80: 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b  NNECTION_CLOSE);
7c90: 0a 09 09 7d 0a 0a 09 09 70 61 74 68 20 3d 20 6c  ...}....path = l
7ca0: 6f 63 61 6c 70 61 74 68 3b 0a 23 65 6c 73 65 0a  ocalpath;.#else.
7cb0: 09 09 66 69 6c 65 64 5f 72 65 64 69 72 65 63 74  ..filed_redirect
7cc0: 5f 69 6e 64 65 78 28 66 70 2c 20 64 61 74 65 5f  _index(fp, date_
7cd0: 63 75 72 72 65 6e 74 2c 20 70 61 74 68 2c 20 6c  current, path, l
7ce0: 6f 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 46  og);....return(F
7cf0: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
7d00: 43 4c 4f 53 45 29 3b 0a 23 65 6e 64 69 66 0a 09  CLOSE);.#endif..
7d10: 7d 0a 0a 09 66 69 6c 65 69 6e 66 6f 20 3d 20 66  }...fileinfo = f
7d20: 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 70  iled_open_file(p
7d30: 61 74 68 2c 20 26 72 65 71 75 65 73 74 2d 3e 66  ath, &request->f
7d40: 69 6c 65 69 6e 66 6f 2c 20 6f 70 74 69 6f 6e 73  ileinfo, options
7d50: 29 3b 0a 09 69 66 20 28 66 69 6c 65 69 6e 66 6f  );..if (fileinfo
7d60: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69   == NULL) {...fi
7d70: 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66  led_error_page(f
7d80: 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  p, date_current,
7d90: 20 34 30 34 2c 20 72 65 71 75 65 73 74 2d 3e 6d   404, request->m
7da0: 65 74 68 6f 64 2c 20 22 6f 70 65 6e 5f 66 61 69  ethod, "open_fai
7db0: 6c 65 64 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 72  led", log);....r
7dc0: 65 74 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e  eturn(FILED_CONN
7dd0: 45 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09  ECTION_CLOSE);..
7de0: 7d 0a 0a 09 69 66 20 28 72 65 71 75 65 73 74 2d  }...if (request-
7df0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 70  >headers.range.p
7e00: 72 65 73 65 6e 74 29 20 7b 0a 09 09 69 66 20 28  resent) {...if (
7e10: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
7e20: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 21 3d  .range.offset !=
7e30: 20 30 20 7c 7c 20 72 65 71 75 65 73 74 2d 3e 68   0 || request->h
7e40: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e  eaders.range.len
7e50: 67 74 68 20 3e 3d 20 30 29 20 7b 0a 09 09 09 69  gth >= 0) {....i
7e60: 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  f (request->head
7e70: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
7e80: 20 3e 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65   >= fileinfo->le
7e90: 6e 29 20 7b 0a 09 09 09 09 66 69 6c 65 64 5f 65  n) {.....filed_e
7ea0: 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64 61  rror_page(fp, da
7eb0: 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 31 36 2c  te_current, 416,
7ec0: 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64   request->method
7ed0: 2c 20 22 72 61 6e 67 65 5f 69 6e 76 61 6c 69 64  , "range_invalid
7ee0: 22 2c 20 6c 6f 67 29 3b 0a 0a 09 09 09 09 63 6c  ", log);......cl
7ef0: 6f 73 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64  ose(fileinfo->fd
7f00: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 46  );......return(F
7f10: 49 4c 45 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f  ILED_CONNECTION_
7f20: 43 4c 4f 53 45 29 3b 0a 09 09 09 7d 0a 0a 09 09  CLOSE);....}....
7f30: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
7f40: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
7f50: 74 68 20 3d 3d 20 28 28 6f 66 66 5f 74 29 20 2d  th == ((off_t) -
7f60: 31 29 29 20 7b 0a 09 09 09 09 66 69 6c 65 64 5f  1)) {.....filed_
7f70: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43  log_msg_debug("C
7f80: 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68 20  omputing length 
7f90: 74 6f 20 66 69 74 20 69 6e 20 62 6f 75 6e 64 73  to fit in bounds
7fa0: 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20  : fileinfo->len 
7fb0: 3d 20 25 6c 6c 75 2c 20 72 65 71 75 65 73 74 2d  = %llu, request-
7fc0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
7fd0: 66 66 73 65 74 20 3d 20 25 6c 6c 75 22 2c 0a 09  ffset = %llu",..
7fe0: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
7ff0: 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66  ng long) fileinf
8000: 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09 09 28 75 6e  o->len,......(un
8010: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
8020: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
8030: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a  rs.range.offset.
8040: 09 09 09 09 29 3b 0a 0a 09 09 09 09 72 65 71 75  ....);......requ
8050: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
8060: 67 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65  ge.length = file
8070: 69 6e 66 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75  info->len - requ
8080: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
8090: 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09 7d 0a  ge.offset;....}.
80a0: 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ....filed_log_ms
80b0: 67 5f 64 65 62 75 67 28 22 50 61 72 74 69 61 6c  g_debug("Partial
80c0: 20 72 65 71 75 65 73 74 2c 20 73 74 61 72 74 69   request, starti
80d0: 6e 67 20 61 74 3a 20 25 6c 6c 75 20 61 6e 64 20  ng at: %llu and 
80e0: 72 75 6e 6e 69 6e 67 20 66 6f 72 20 25 6c 6c 69  running for %lli
80f0: 20 62 79 74 65 73 22 2c 0a 09 09 09 09 28 75 6e   bytes",.....(un
8100: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
8110: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
8120: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c  rs.range.offset,
8130: 0a 09 09 09 09 28 6c 6f 6e 67 20 6c 6f 6e 67 29  .....(long long)
8140: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
8150: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 0a 09  s.range.length..
8160: 09 09 29 3b 0a 0a 09 09 7d 0a 0a 09 09 68 74 74  ..);....}....htt
8170: 70 5f 63 6f 64 65 20 3d 20 32 30 36 3b 0a 09 7d  p_code = 206;..}
8180: 20 65 6c 73 65 20 7b 0a 09 09 68 74 74 70 5f 63   else {...http_c
8190: 6f 64 65 20 3d 20 32 30 30 3b 0a 0a 09 09 2f 2a  ode = 200;..../*
81a0: 20 43 6f 6d 70 75 74 65 20 66 61 6b 65 20 72 61   Compute fake ra
81b0: 6e 67 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  nge parameters t
81c0: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
81d0: 20 65 6e 74 69 72 65 20 66 69 6c 65 20 2a 2f 0a   entire file */.
81e0: 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ..request->heade
81f0: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20  rs.range.offset 
8200: 3d 20 30 3b 0a 09 09 72 65 71 75 65 73 74 2d 3e  = 0;...request->
8210: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
8220: 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d  ngth = fileinfo-
8230: 3e 6c 65 6e 3b 0a 09 7d 0a 0a 09 66 70 72 69 6e  >len;..}...fprin
8240: 74 66 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31  tf(fp, "HTTP/1.1
8250: 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20   %i OK\r\nDate: 
8260: 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69  %s\r\nServer: fi
8270: 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69  led\r\nLast-Modi
8280: 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74  fied: %s\r\nCont
8290: 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75  ent-Length: %llu
82a0: 5c 72 5c 6e 41 63 63 65 70 74 2d 52 61 6e 67 65  \r\nAccept-Range
82b0: 73 3a 20 62 79 74 65 73 5c 72 5c 6e 43 6f 6e 74  s: bytes\r\nCont
82c0: 65 6e 74 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e  ent-Type: %s\r\n
82d0: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 25 73 5c 72  Connection: %s\r
82e0: 5c 6e 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c 72  \nETag: \"%s\"\r
82f0: 5c 6e 22 2c 0a 09 09 68 74 74 70 5f 63 6f 64 65  \n",...http_code
8300: 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74  ,...date_current
8310: 2c 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c 61  ,...fileinfo->la
8320: 73 74 6d 6f 64 2c 0a 09 09 28 75 6e 73 69 67 6e  stmod,...(unsign
8330: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65  ed long long) re
8340: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
8350: 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09 09 66  ange.length,...f
8360: 69 6c 65 69 6e 66 6f 2d 3e 74 79 70 65 2c 0a 09  ileinfo->type,..
8370: 09 66 69 6c 65 64 5f 63 6f 6e 6e 65 63 74 69 6f  .filed_connectio
8380: 6e 5f 73 74 72 28 72 65 71 75 65 73 74 2d 3e 68  n_str(request->h
8390: 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63 74 69 6f  eaders.connectio
83a0: 6e 29 2c 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e  n),...fileinfo->
83b0: 65 74 61 67 0a 09 29 3b 0a 0a 09 69 66 20 28 68  etag..);...if (h
83c0: 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32 30 36 29  ttp_code == 206)
83d0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 66 70 2c   {...fprintf(fp,
83e0: 20 22 43 6f 6e 74 65 6e 74 2d 52 61 6e 67 65 3a   "Content-Range:
83f0: 20 62 79 74 65 73 20 25 6c 6c 75 2d 25 6c 6c 75   bytes %llu-%llu
8400: 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a 09 09 09 28  /%llu\r\n",....(
8410: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
8420: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
8430: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
8440: 74 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20  t,....(unsigned 
8450: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 28 72 65 71 75  long long) (requ
8460: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
8470: 67 65 2e 6f 66 66 73 65 74 20 2b 20 72 65 71 75  ge.offset + requ
8480: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
8490: 67 65 2e 6c 65 6e 67 74 68 20 2d 20 31 29 2c 0a  ge.length - 1),.
84a0: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
84b0: 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f  g long) fileinfo
84c0: 2d 3e 6c 65 6e 0a 09 09 29 3b 0a 09 7d 0a 09 66  ->len...);..}..f
84d0: 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c 6e  printf(fp, "\r\n
84e0: 22 29 3b 0a 09 66 66 6c 75 73 68 28 66 70 29 3b  ");..fflush(fp);
84f0: 0a 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f 64  ...log->http_cod
8500: 65 20 3d 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09  e = http_code;..
8510: 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 4f  log->reason = "O
8520: 4b 22 3b 0a 09 6c 6f 67 2d 3e 73 74 61 72 74 74  K";..log->startt
8530: 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29  ime = time(NULL)
8540: 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f 6f 66 66 73  ;..log->req_offs
8550: 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65  et = request->he
8560: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
8570: 65 74 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f 6c 65  et;..log->req_le
8580: 6e 67 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e  ngth = request->
8590: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
85a0: 6e 67 74 68 3b 0a 09 6c 6f 67 2d 3e 66 69 6c 65  ngth;..log->file
85b0: 5f 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e  _length = filein
85c0: 66 6f 2d 3e 6c 65 6e 3b 0a 0a 23 69 66 64 65 66  fo->len;..#ifdef
85d0: 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f   FILED_NONBLOCK_
85e0: 48 54 54 50 0a 09 69 6e 74 20 73 6f 63 6b 65 74  HTTP..int socket
85f0: 5f 66 6c 61 67 73 3b 0a 09 66 64 5f 73 65 74 20  _flags;..fd_set 
8600: 72 66 64 2c 20 77 66 64 3b 0a 09 63 68 61 72 20  rfd, wfd;..char 
8610: 73 69 6e 6b 62 75 66 5b 38 31 39 32 5d 3b 0a 09  sinkbuf[8192];..
8620: 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74  ssize_t read_ret
8630: 3b 0a 0a 09 46 44 5f 5a 45 52 4f 28 26 72 66 64  ;...FD_ZERO(&rfd
8640: 29 3b 0a 09 46 44 5f 5a 45 52 4f 28 26 77 66 64  );..FD_ZERO(&wfd
8650: 29 3b 0a 09 46 44 5f 53 45 54 28 66 64 2c 20 26  );..FD_SET(fd, &
8660: 72 66 64 29 3b 0a 09 46 44 5f 53 45 54 28 66 64  rfd);..FD_SET(fd
8670: 2c 20 26 77 66 64 29 3b 0a 0a 09 73 6f 63 6b 65  , &wfd);...socke
8680: 74 5f 66 6c 61 67 73 20 3d 20 66 63 6e 74 6c 28  t_flags = fcntl(
8690: 66 64 2c 20 46 5f 47 45 54 46 4c 29 3b 0a 09 66  fd, F_GETFL);..f
86a0: 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 4c  cntl(fd, F_SETFL
86b0: 2c 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 7c  , socket_flags |
86c0: 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a 23 65   O_NONBLOCK);.#e
86d0: 6e 64 69 66 0a 09 73 65 6e 64 66 69 6c 65 5f 6f  ndif..sendfile_o
86e0: 66 66 73 65 74 20 3d 20 72 65 71 75 65 73 74 2d  ffset = request-
86f0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
8700: 66 66 73 65 74 3b 0a 09 73 65 6e 64 66 69 6c 65  ffset;..sendfile
8710: 5f 6c 65 6e 20 3d 20 72 65 71 75 65 73 74 2d 3e  _len = request->
8720: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
8730: 6e 67 74 68 3b 0a 09 73 65 6e 64 66 69 6c 65 5f  ngth;..sendfile_
8740: 73 65 6e 74 20 3d 20 30 3b 0a 09 77 68 69 6c 65  sent = 0;..while
8750: 20 28 72 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f   (request->metho
8760: 64 20 3d 3d 20 46 49 4c 45 44 5f 52 45 51 55 45  d == FILED_REQUE
8770: 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 29 20 7b  ST_METHOD_GET) {
8780: 0a 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f  ...if (sendfile_
8790: 6c 65 6e 20 3e 20 46 49 4c 45 44 5f 53 45 4e 44  len > FILED_SEND
87a0: 46 49 4c 45 5f 4d 41 58 29 20 7b 0a 09 09 09 73  FILE_MAX) {....s
87b0: 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 46  endfile_size = F
87c0: 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45 5f 4d 41  ILED_SENDFILE_MA
87d0: 58 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  X;...} else {...
87e0: 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d  .sendfile_size =
87f0: 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09   sendfile_len;..
8800: 09 7d 0a 0a 09 09 73 65 6e 64 66 69 6c 65 5f 72  .}....sendfile_r
8810: 65 74 20 3d 20 73 65 6e 64 66 69 6c 65 28 66 64  et = sendfile(fd
8820: 2c 20 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c 20  , fileinfo->fd, 
8830: 26 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74  &sendfile_offset
8840: 2c 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 29  , sendfile_size)
8850: 3b 0a 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65  ;...if (sendfile
8860: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 23 69 66  _ret <= 0) {.#if
8870: 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f  def FILED_NONBLO
8880: 43 4b 5f 48 54 54 50 0a 09 09 09 69 66 20 28 65  CK_HTTP....if (e
8890: 72 72 6e 6f 20 3d 3d 20 45 41 47 41 49 4e 29 20  rrno == EAGAIN) 
88a0: 7b 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 72  {.....sendfile_r
88b0: 65 74 20 3d 20 30 3b 0a 0a 09 09 09 09 77 68 69  et = 0;......whi
88c0: 6c 65 20 28 31 29 20 7b 0a 09 09 09 09 09 73 65  le (1) {......se
88d0: 6c 65 63 74 28 66 64 20 2b 20 31 2c 20 26 72 66  lect(fd + 1, &rf
88e0: 64 2c 20 26 77 66 64 2c 20 4e 55 4c 4c 2c 20 4e  d, &wfd, NULL, N
88f0: 55 4c 4c 29 3b 0a 09 09 09 09 09 69 66 20 28 46  ULL);......if (F
8900: 44 5f 49 53 53 45 54 28 66 64 2c 20 26 72 66 64  D_ISSET(fd, &rfd
8910: 29 29 20 7b 0a 09 09 09 09 09 09 72 65 61 64 5f  )) {.......read_
8920: 72 65 74 20 3d 20 72 65 61 64 28 66 64 2c 20 73  ret = read(fd, s
8930: 69 6e 6b 62 75 66 2c 20 73 69 7a 65 6f 66 28 73  inkbuf, sizeof(s
8940: 69 6e 6b 62 75 66 29 29 3b 0a 0a 09 09 09 09 09  inkbuf));.......
8950: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
8960: 20 30 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65   0) {........bre
8970: 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ak;.......}.....
8980: 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 46 44 5f  .}.......if (FD_
8990: 49 53 53 45 54 28 66 64 2c 20 26 77 66 64 29 29  ISSET(fd, &wfd))
89a0: 20 7b 0a 09 09 09 09 09 09 72 65 61 64 5f 72 65   {.......read_re
89b0: 74 20 3d 20 31 3b 0a 0a 09 09 09 09 09 09 62 72  t = 1;........br
89c0: 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  eak;......}.....
89d0: 7d 0a 0a 09 09 09 09 69 66 20 28 72 65 61 64 5f  }......if (read_
89e0: 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09  ret <= 0) {.....
89f0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
8a00: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 62 72  .} else {.....br
8a10: 65 61 6b 3b 0a 09 09 09 7d 0a 23 65 6c 73 65 0a  eak;....}.#else.
8a20: 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ...break;.#endif
8a30: 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 66 69 6c 65  ...}....sendfile
8a40: 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64 66 69 6c 65  _len -= sendfile
8a50: 5f 72 65 74 3b 0a 09 09 73 65 6e 64 66 69 6c 65  _ret;...sendfile
8a60: 5f 73 65 6e 74 20 2b 3d 20 73 65 6e 64 66 69 6c  _sent += sendfil
8a70: 65 5f 72 65 74 3b 0a 09 09 69 66 20 28 73 65 6e  e_ret;...if (sen
8a80: 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29 20  dfile_len == 0) 
8a90: 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  {....break;...}.
8aa0: 09 7d 0a 0a 09 6c 6f 67 2d 3e 65 6e 64 74 69 6d  .}...log->endtim
8ab0: 65 20 3d 20 28 74 69 6d 65 5f 74 29 20 2d 31 3b  e = (time_t) -1;
8ac0: 0a 09 6c 6f 67 2d 3e 73 65 6e 74 5f 6c 65 6e 67  ..log->sent_leng
8ad0: 74 68 20 3d 20 73 65 6e 64 66 69 6c 65 5f 73 65  th = sendfile_se
8ae0: 6e 74 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  nt;...filed_log_
8af0: 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 63 6c  entry(log);...cl
8b00: 6f 73 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64  ose(fileinfo->fd
8b10: 29 3b 0a 0a 09 69 66 20 28 72 65 71 75 65 73 74  );...if (request
8b20: 2d 3e 68 65 61 64 65 72 73 2e 63 6f 6e 6e 65 63  ->headers.connec
8b30: 74 69 6f 6e 20 21 3d 20 46 49 4c 45 44 5f 43 4f  tion != FILED_CO
8b40: 4e 4e 45 43 54 49 4f 4e 5f 4b 45 45 50 5f 41 4c  NNECTION_KEEP_AL
8b50: 49 56 45 29 20 7b 0a 09 09 66 69 6c 65 64 5f 73  IVE) {...filed_s
8b60: 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 63 6c 6f  ockettimeout_clo
8b70: 73 65 28 66 64 2c 20 30 29 3b 0a 0a 09 09 66 63  se(fd, 0);....fc
8b80: 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 09 72 65 74  lose(fp);....ret
8b90: 75 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43  urn(FILED_CONNEC
8ba0: 54 49 4f 4e 5f 43 4c 4f 53 45 29 3b 0a 09 7d 0a  TION_CLOSE);..}.
8bb0: 0a 09 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69  ..filed_socketti
8bc0: 6d 65 6f 75 74 5f 70 72 6f 63 65 73 73 69 6e 67  meout_processing
8bd0: 5f 65 6e 64 28 66 64 29 3b 0a 0a 09 72 65 74 75  _end(fd);...retu
8be0: 72 6e 28 46 49 4c 45 44 5f 43 4f 4e 4e 45 43 54  rn(FILED_CONNECT
8bf0: 49 4f 4e 5f 4b 45 45 50 5f 41 4c 49 56 45 29 3b  ION_KEEP_ALIVE);
8c00: 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20 69 6e  .}../* Handle in
8c10: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
8c20: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
8c30: 64 20 2a 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f  d *filed_worker_
8c40: 74 68 72 65 61 64 28 76 6f 69 64 20 2a 61 72 67  thread(void *arg
8c50: 5f 76 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69  _v) {..struct fi
8c60: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
8c70: 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09 73 74  d_args *arg;..st
8c80: 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f  ruct filed_http_
8c90: 72 65 71 75 65 73 74 20 72 65 71 75 65 73 74 3b  request request;
8ca0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
8cb0: 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 2c 20 6c  og_entry *log, l
8cc0: 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 3b 0a  ocal_dummy_log;.
8cd0: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70  .struct filed_op
8ce0: 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 3b 0a  tions *options;.
8cf0: 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  .struct sockaddr
8d00: 5f 69 6e 36 20 61 64 64 72 3b 0a 09 73 6f 63 6b  _in6 addr;..sock
8d10: 6c 65 6e 5f 74 20 61 64 64 72 6c 65 6e 3b 0a 09  len_t addrlen;..
8d20: 69 6e 74 20 66 61 69 6c 75 72 65 5f 63 6f 75 6e  int failure_coun
8d30: 74 20 3d 20 30 2c 20 6d 61 78 5f 66 61 69 6c 75  t = 0, max_failu
8d40: 72 65 5f 63 6f 75 6e 74 20 3d 20 46 49 4c 45 44  re_count = FILED
8d50: 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43 4f 55  _MAX_FAILURE_COU
8d60: 4e 54 3b 0a 09 69 6e 74 20 63 6f 6e 6e 65 63 74  NT;..int connect
8d70: 69 6f 6e 5f 73 74 61 74 65 20 3d 20 46 49 4c 45  ion_state = FILE
8d80: 44 5f 43 4f 4e 4e 45 43 54 49 4f 4e 5f 43 4c 4f  D_CONNECTION_CLO
8d90: 53 45 3b 0a 09 69 6e 74 20 6d 61 73 74 65 72 5f  SE;..int master_
8da0: 66 64 2c 20 66 64 20 3d 20 2d 31 3b 0a 0a 09 2f  fd, fd = -1;.../
8db0: 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73  * Read arguments
8dc0: 20 2a 2f 0a 09 61 72 67 20 3d 20 61 72 67 5f 76   */..arg = arg_v
8dd0: 3b 0a 0a 09 6d 61 73 74 65 72 5f 66 64 20 3d 20  ;...master_fd = 
8de0: 61 72 67 2d 3e 66 64 3b 0a 09 6f 70 74 69 6f 6e  arg->fd;..option
8df0: 73 20 3d 20 26 61 72 67 2d 3e 6f 70 74 69 6f 6e  s = &arg->option
8e00: 73 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b  s;...while (1) {
8e10: 0a 09 09 2f 2a 20 46 61 69 6c 75 72 65 20 6c 6f  .../* Failure lo
8e20: 6f 70 20 70 72 65 76 65 6e 74 69 6f 6e 20 2a 2f  op prevention */
8e30: 0a 09 09 69 66 20 28 66 61 69 6c 75 72 65 5f 63  ...if (failure_c
8e40: 6f 75 6e 74 20 3e 20 6d 61 78 5f 66 61 69 6c 75  ount > max_failu
8e50: 72 65 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 62  re_count) {....b
8e60: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  reak;...}..../* 
8e70: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 6c  Allocate a new l
8e80: 6f 67 20 62 75 66 66 65 72 20 2a 2f 0a 09 09 6c  og buffer */...l
8e90: 6f 67 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e  og = filed_log_n
8ea0: 65 77 28 31 29 3b 0a 09 09 69 66 20 28 6c 6f 67  ew(1);...if (log
8eb0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66   == NULL) {....f
8ec0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 41 4c  iled_log_msg("AL
8ed0: 4c 4f 43 41 54 45 5f 4c 4f 47 5f 4d 53 47 5f 46  LOCATE_LOG_MSG_F
8ee0: 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09 62 72 65  AILED");.....bre
8ef0: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 6c 6f 67 2d 3e  ak;...}....log->
8f00: 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 4c 4f 47  type = FILED_LOG
8f10: 5f 54 59 50 45 5f 54 52 41 4e 53 46 45 52 3b 0a  _TYPE_TRANSFER;.
8f20: 0a 09 09 2f 2a 20 49 66 20 77 65 20 63 6c 6f 73  .../* If we clos
8f30: 65 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 6e 65  ed the old conne
8f40: 63 74 69 6f 6e 2c 20 61 63 63 65 70 74 20 61 20  ction, accept a 
8f50: 6e 65 77 20 6f 6e 65 20 2a 2f 0a 09 09 69 66 20  new one */...if 
8f60: 28 63 6f 6e 6e 65 63 74 69 6f 6e 5f 73 74 61 74  (connection_stat
8f70: 65 20 3d 3d 20 46 49 4c 45 44 5f 43 4f 4e 4e 45  e == FILED_CONNE
8f80: 43 54 49 4f 4e 5f 43 4c 4f 53 45 29 20 7b 0a 09  CTION_CLOSE) {..
8f90: 09 09 2f 2a 20 41 63 63 65 70 74 20 61 20 6e 65  ../* Accept a ne
8fa0: 77 20 63 6c 69 65 6e 74 20 2a 2f 0a 09 09 09 61  w client */....a
8fb0: 64 64 72 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  ddrlen = sizeof(
8fc0: 61 64 64 72 29 3b 0a 0a 09 09 09 66 64 20 3d 20  addr);.....fd = 
8fd0: 61 63 63 65 70 74 28 6d 61 73 74 65 72 5f 66 64  accept(master_fd
8fe0: 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64  , (struct sockad
8ff0: 64 72 20 2a 29 20 26 61 64 64 72 2c 20 26 61 64  dr *) &addr, &ad
9000: 64 72 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 2f  drlen);...}..../
9010: 2a 0a 09 09 20 2a 20 49 66 20 77 65 20 66 61 69  *... * If we fai
9020: 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74 65 20 6f  l, make a note o
9030: 66 20 69 74 20 73 6f 20 77 65 20 64 6f 6e 27 74  f it so we don't
9040: 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f 6f 70 20   go into a loop 
9050: 6f 66 0a 09 09 20 2a 20 61 63 63 65 70 74 28 29  of... * accept()
9060: 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a 2f 0a 09   failing... */..
9070: 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09  .if (fd < 0) {..
9080: 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e 65 77  ../* Log the new
9090: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09   connection */..
90a0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
90b0: 22 41 43 43 45 50 54 5f 46 41 49 4c 45 44 22 29  "ACCEPT_FAILED")
90c0: 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65 5f 63 6f  ;.....failure_co
90d0: 75 6e 74 2b 2b 3b 0a 0a 09 09 09 66 69 6c 65 64  unt++;.....filed
90e0: 5f 6c 6f 67 5f 66 72 65 65 28 6c 6f 67 29 3b 0a  _log_free(log);.
90f0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
9100: 7d 0a 0a 09 09 66 69 6c 65 64 5f 73 6f 63 6b 65  }....filed_socke
9110: 74 74 69 6d 65 6f 75 74 5f 61 63 63 65 70 74 28  ttimeout_accept(
9120: 66 64 29 3b 0a 0a 09 09 2f 2a 20 46 69 6c 6c 20  fd);..../* Fill 
9130: 69 6e 20 6c 6f 67 20 73 74 72 75 63 74 75 72 65  in log structure
9140: 20 2a 2f 0a 09 09 69 66 20 28 66 69 6c 65 64 5f   */...if (filed_
9150: 6c 6f 67 5f 69 70 28 28 73 74 72 75 63 74 20 73  log_ip((struct s
9160: 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72  ockaddr *) &addr
9170: 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73 69 7a 65 6f  , log->ip, sizeo
9180: 66 28 6c 6f 67 2d 3e 69 70 29 29 20 3d 3d 20 4e  f(log->ip)) == N
9190: 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 2d 3e 69  ULL) {....log->i
91a0: 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 09  p[0] = '\0';....
91b0: 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 30 3b 0a 09  log->port = 0;..
91c0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f 67  .} else {....log
91d0: 2d 3e 70 6f 72 74 20 3d 20 61 64 64 72 2e 73 69  ->port = addr.si
91e0: 6e 36 5f 70 6f 72 74 3b 0a 09 09 7d 0a 0a 09 09  n6_port;...}....
91f0: 2f 2a 20 52 65 73 65 74 20 66 61 69 6c 75 72 65  /* Reset failure
9200: 20 63 6f 75 6e 74 2a 2f 0a 09 09 66 61 69 6c 75   count*/...failu
9210: 72 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  re_count = 0;...
9220: 09 2f 2a 20 48 61 6e 64 6c 65 20 73 6f 63 6b 65  ./* Handle socke
9230: 74 20 2a 2f 0a 09 09 63 6f 6e 6e 65 63 74 69 6f  t */...connectio
9240: 6e 5f 73 74 61 74 65 20 3d 20 66 69 6c 65 64 5f  n_state = filed_
9250: 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 66 64  handle_client(fd
9260: 2c 20 26 72 65 71 75 65 73 74 2c 20 6c 6f 67 2c  , &request, log,
9270: 20 6f 70 74 69 6f 6e 73 29 3b 0a 09 7d 0a 0a 09   options);..}...
9280: 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 20  /* Report error 
9290: 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  */..filed_log_ms
92a0: 67 28 22 54 48 52 45 41 44 5f 44 49 45 44 20 41  g("THREAD_DIED A
92b0: 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72 65 74  BNORMAL");...ret
92c0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20  urn(NULL);.../* 
92d0: 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 20  local_dummy_log 
92e0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
92f0: 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 20 69  FILED_DONT_LOG i
9300: 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74 68 65 72  s enabled, other
9310: 77 69 73 65 20 69 74 27 73 20 6e 6f 74 20 75 73  wise it's not us
9320: 65 64 2c 20 62 75 74 20 74 68 65 20 63 6f 6d 70  ed, but the comp
9330: 69 6c 65 72 20 68 61 74 65 73 20 74 68 61 74 20  iler hates that 
9340: 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61 6c 5f  idea. */..local_
9350: 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65 20 3d  dummy_log.type =
9360: 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d 79   0;..local_dummy
9370: 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f 63 61  _log.type = loca
9380: 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65  l_dummy_log.type
9390: 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 77  ;.}../* Create w
93a0: 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f  orker threads */
93b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
93c0: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73  d_worker_threads
93d0: 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c 20 69 6e  _init(int fd, in
93e0: 74 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 2c 20  t thread_count, 
93f0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74  struct filed_opt
9400: 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b  ions *options) {
9410: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  ..struct filed_w
9420: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
9430: 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65 61 64  s *arg;..pthread
9440: 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09 69 6e  _t threadid;..in
9450: 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b 0a 09  t pthread_ret;..
9460: 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69 20  int i;...for (i 
9470: 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61 64 5f  = 0; i < thread_
9480: 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 09  count; i++) {...
9490: 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  arg = malloc(siz
94a0: 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09 61  eof(*arg));....a
94b0: 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09 6d  rg->fd = fd;...m
94c0: 65 6d 63 70 79 28 26 61 72 67 2d 3e 6f 70 74 69  emcpy(&arg->opti
94d0: 6f 6e 73 2c 20 6f 70 74 69 6f 6e 73 2c 20 73 69  ons, options, si
94e0: 7a 65 6f 66 28 2a 6f 70 74 69 6f 6e 73 29 29 3b  zeof(*options));
94f0: 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 20  ....pthread_ret 
9500: 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65  = pthread_create
9510: 28 26 74 68 72 65 61 64 69 64 2c 20 4e 55 4c 4c  (&threadid, NULL
9520: 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74  , filed_worker_t
9530: 68 72 65 61 64 2c 20 61 72 67 29 3b 0a 09 09 69  hread, arg);...i
9540: 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 20 21  f (pthread_ret !
9550: 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  = 0) {....return
9560: 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72  (-1);...}..}...r
9570: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
9580: 44 69 73 70 6c 61 79 20 68 65 6c 70 20 2a 2f 0a  Display help */.
9590: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
95a0: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46 49 4c  d_print_help(FIL
95b0: 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74 20 6c  E *output, int l
95c0: 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73 74 20  ong_help, const 
95d0: 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b 0a 09  char *extra) {..
95e0: 69 66 20 28 65 78 74 72 61 29 20 7b 0a 09 09 66  if (extra) {...f
95f0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9600: 25 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b 0a 09  %s\n", extra);..
9610: 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  }...fprintf(outp
9620: 75 74 2c 20 22 55 73 61 67 65 3a 20 66 69 6c 65  ut, "Usage: file
9630: 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c 6e 22  d [<options>]\n"
9640: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
9650: 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73 3a 5c  ut, "  Options:\
9660: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
9670: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68 2c  tput, "      -h,
9680: 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09 66 70   --help\n");..fp
9690: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
96a0: 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65 6d 6f       -d, --daemo
96b0: 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  n\n");..fprintf(
96c0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
96d0: 76 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c 6e 22 29  v, --version\n")
96e0: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
96f0: 74 2c 20 22 20 20 20 20 20 20 2d 56 2c 20 2d 2d  t, "      -V, --
9700: 76 68 6f 73 74 5c 6e 22 29 3b 0a 09 66 70 72 69  vhost\n");..fpri
9710: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
9720: 20 20 20 2d 62 20 3c 61 64 64 72 65 73 73 3e 2c     -b <address>,
9730: 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72 65 73 73   --bind <address
9740: 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  >\n");..fprintf(
9750: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
9760: 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f 72 74  p <port>, --port
9770: 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09 66 70   <port>\n");..fp
9780: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9790: 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e 74 3e 2c       -t <count>,
97a0: 20 2d 2d 74 68 72 65 61 64 73 20 3c 63 6f 75 6e   --threads <coun
97b0: 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  t>\n");..fprintf
97c0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
97d0: 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c 20 2d 2d  -c <entries>, --
97e0: 63 61 63 68 65 20 3c 65 6e 74 72 69 65 73 3e 5c  cache <entries>\
97f0: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
9800: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20  tput, "      -l 
9810: 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20 3c 66  <file>, --log <f
9820: 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  ile>\n");..fprin
9830: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
9840: 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20 2d 2d 75    -u <user>, --u
9850: 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22 29 3b 0a  ser <user>\n");.
9860: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9870: 20 22 20 20 20 20 20 20 2d 72 20 3c 64 69 72 65   "      -r <dire
9880: 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74 20 3c  ctory>, --root <
9890: 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22 29 3b 0a  directory>\n");.
98a0: 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65 6c 70 29  ..if (long_help)
98b0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74   {...fprintf(out
98c0: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
98d0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
98e0: 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 09 09 66   Usage:\n");...f
98f0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9900: 20 20 20 20 20 20 2d 68 20 28 6f 72 20 2d 2d 68        -h (or --h
9910: 65 6c 70 29 20 70 72 69 6e 74 73 20 74 68 69 73  elp) prints this
9920: 20 75 73 61 67 65 20 69 6e 66 6f 72 6d 61 74 69   usage informati
9930: 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  on.\n");...fprin
9940: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
9950: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
9960: 75 74 2c 20 22 20 20 20 20 20 20 2d 64 20 28 6f  ut, "      -d (o
9970: 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e 73 74  r --daemon) inst
9980: 72 75 63 74 73 20 66 69 6c 65 64 20 74 6f 20 62  ructs filed to b
9990: 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 61  ecome a daemon a
99a0: 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e  fter initializin
99b0: 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  g\n");...fprintf
99c0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 74 68 65 20 6c 69 73 74 65 6e 69 6e 67 20 54   the listening T
99f0: 43 50 20 73 6f 63 6b 65 74 20 61 6e 64 20 6c 6f  CP socket and lo
9a00: 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09  g files.\n");...
9a10: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9a20: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
9a30: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9a40: 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73 69 6f 6e  -v (or --version
9a50: 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65  ) instructs file
9a60: 64 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20  d print out the 
9a70: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
9a80: 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b 0a 09 09  nd exit.\n");...
9a90: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
9aa0: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
9ab0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
9ac0: 2d 56 20 28 6f 72 20 2d 2d 76 68 6f 73 74 29 20  -V (or --vhost) 
9ad0: 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65 64 20  instructs filed 
9ae0: 74 6f 20 70 72 65 70 65 6e 64 20 61 6c 6c 20 72  to prepend all r
9af0: 65 71 75 65 73 74 73 20 77 69 74 68 20 74 68 65  equests with the
9b00: 69 72 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66  ir HTTP\n");...f
9b10: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 48 6f 73 74 20 68 65 61 64 65        Host heade
9b40: 72 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  r.\n");...fprint
9b50: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
9b60: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9b70: 74 2c 20 22 20 20 20 20 20 20 2d 62 20 28 6f 72  t, "      -b (or
9b80: 20 2d 2d 62 69 6e 64 29 20 73 70 65 63 69 66 69   --bind) specifi
9b90: 65 73 20 74 68 65 20 61 64 64 72 65 73 73 20 74  es the address t
9ba0: 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e 63  o listen for inc
9bb0: 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a  oming HTTP\n");.
9bc0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
9bd0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
9be0: 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73          requests
9bf0: 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c   on.  The defaul
9c00: 74 20 76 61 6c 75 65 20 69 73 20 5c 22 25 73 5c  t value is \"%s\
9c10: 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41 44 44 52  ".\n", BIND_ADDR
9c20: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9c30: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
9c40: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9c50: 20 20 20 20 20 2d 70 20 28 6f 72 20 2d 2d 70 6f       -p (or --po
9c60: 72 74 29 20 73 70 65 63 69 66 69 65 73 20 74 68  rt) specifies th
9c70: 65 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62 65  e TCP port numbe
9c80: 72 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20  r to listen for 
9c90: 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22  incoming HTTP\n"
9ca0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9cb0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
9cc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65             reque
9cd0: 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66  sts on.  The def
9ce0: 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e 22 2c 20  ault is %u.\n", 
9cf0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 50  (unsigned int) P
9d00: 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  ORT);...fprintf(
9d10: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
9d20: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
9d30: 20 22 20 20 20 20 20 20 2d 74 20 28 6f 72 20 2d   "      -t (or -
9d40: 2d 74 68 72 65 61 64 73 29 20 73 70 65 63 69 66  -threads) specif
9d50: 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
9d60: 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73  f worker threads
9d70: 20 74 6f 20 63 72 65 61 74 65 2e 20 45 61 63 68   to create. Each
9d80: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
9d90: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 20 63   worker thread c
9dc0: 61 6e 20 73 65 72 76 69 63 65 20 6f 6e 65 20 63  an service one c
9dd0: 6f 6e 63 75 72 72 65 6e 74 20 48 54 54 50 20 73  oncurrent HTTP s
9de0: 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66  ession.\n");...f
9df0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 20 20 20 20 20 54 68 75 73 20 74 68 65          Thus the
9e20: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61   number of threa
9e30: 64 73 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20  ds created will 
9e40: 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 5c 6e 22  determine how\n"
9e50: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9e60: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
9e80: 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  ny simultaneous 
9e90: 74 72 61 6e 73 66 65 72 73 20 77 69 6c 6c 20 62  transfers will b
9ea0: 65 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 5c  e possible. The\
9eb0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
9ec0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75 2e 5c  default is %lu.\
9ef0: 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  n", (unsigned lo
9f00: 6e 67 29 20 54 48 52 45 41 44 5f 43 4f 55 4e 54  ng) THREAD_COUNT
9f10: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
9f20: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
9f30: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
9f40: 20 20 20 20 20 2d 63 20 28 6f 72 20 2d 2d 63 61       -c (or --ca
9f50: 63 68 65 29 20 73 70 65 63 69 66 69 65 73 20 74  che) specifies t
9f60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 6c  he number of fil
9f70: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61  e information ca
9f80: 63 68 65 20 65 6e 74 72 69 65 73 5c 6e 22 29 3b  che entries\n");
9f90: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
9fa0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
9fb0: 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 6c 6c            to all
9fc0: 6f 63 61 74 65 2e 20 20 45 61 63 68 20 63 61 63  ocate.  Each cac
9fd0: 68 65 20 65 6e 74 72 79 20 68 6f 6c 64 73 20 66  he entry holds f
9fe0: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
9ff0: 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  as\n");...fprint
a000: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f 70 65 6e   well as an open
a030: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a040: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 73 6f   to the file, so
a050: 20 72 65 73 6f 75 72 63 65 5c 6e 22 29 3b 0a 09   resource\n");..
a060: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
a070: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
a080: 20 20 20 20 20 20 20 20 6c 69 6d 69 74 73 20 28          limits (
a090: 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29 20 73 68  i.e., ulimit) sh
a0a0: 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72  ould be consider
a0b0: 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ed.  This should
a0c0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a0d0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
a0f0: 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62 65 72  e a prime number
a100: 20 66 6f 72 20 69 64 65 61 6c 20 75 73 65 20 77   for ideal use w
a110: 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75 70 20 6d  ith the lookup m
a120: 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09 66 70  ethod.\n");...fp
a130: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a150: 20 20 20 20 20 54 68 65 20 64 65 66 61 75 6c 74       The default
a160: 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e   is %lu.\n", (un
a170: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
a180: 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66 70 72 69  HE_SIZE);...fpri
a190: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
a1a0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
a1b0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20 28  put, "      -l (
a1c0: 6f 72 20 2d 2d 6c 6f 67 29 20 73 70 65 63 69 66  or --log) specif
a1d0: 69 65 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 74  ies a filename t
a1e0: 6f 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  o open for writi
a1f0: 6e 67 20 6c 6f 67 20 65 6e 74 72 69 65 73 2e 20  ng log entries. 
a200: 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69   Log\n");...fpri
a210: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
a240: 65 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73 74  e for various st
a250: 61 67 65 73 20 69 6e 20 74 72 61 6e 73 66 65 72  ages in transfer
a260: 69 6e 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a  ing files.\n");.
a270: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
a280: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
a290: 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 20 66         The log f
a2a0: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 65  ile is opened be
a2b0: 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 75  fore switching u
a2c0: 73 65 72 73 20 28 73 65 65 20 5c 22 2d 75 5c 22  sers (see \"-u\"
a2d0: 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  )\n");...fprintf
a2e0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
a300: 64 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69  d root directori
a310: 65 73 20 28 73 65 65 20 5c 22 2d 72 5c 22 29 2e  es (see \"-r\").
a320: 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 69    The log file i
a330: 73 20 6e 65 76 65 72 5c 6e 22 29 3b 0a 09 09 66  s never\n");...f
a340: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 63 6c 6f 73 65 64 20 73 6f 20 6c 6f      closed so lo
a370: 67 20 72 6f 74 61 74 69 6f 6e 20 77 69 74 68 6f  g rotation witho
a380: 75 74 20 73 74 6f 70 70 69 6e 67 20 74 68 65 20  ut stopping the 
a390: 64 61 65 6d 6f 6e 20 69 73 20 77 69 6c 6c 5c 6e  daemon is will\n
a3a0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
a3b0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
a3c0: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 77             not w
a3d0: 6f 72 6b 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ork.  The value 
a3e0: 6f 66 20 5c 22 2d 5c 22 20 69 6e 64 69 63 61 74  of \"-\" indicat
a3f0: 65 73 20 74 68 61 74 20 73 74 61 6e 64 61 72 64  es that standard
a400: 20 6f 75 74 70 75 74 5c 6e 22 29 3b 0a 09 09 66   output\n");...f
a410: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 75 73      should be us
a440: 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 2e 20  ed for logging. 
a450: 20 49 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   If the filename
a460: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 5c 6e   begins with a\n
a470: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
a480: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
a490: 20 20 20 20 20 20 20 20 20 20 20 70 69 70 65 20             pipe 
a4a0: 28 5c 22 7c 5c 22 29 20 74 68 65 6e 20 61 20 70  (\"|\") then a p
a4b0: 72 6f 63 65 73 73 20 69 73 20 73 74 61 72 74 65  rocess is starte
a4c0: 64 20 61 6e 64 20 75 73 65 64 20 66 6f 72 20 6c  d and used for l
a4d0: 6f 67 67 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70  ogging\n");...fp
a4e0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20     instead of a 
a510: 66 69 6c 65 2e 20 20 54 68 65 20 64 65 66 61 75  file.  The defau
a520: 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22  lt is \"%s\".\n"
a530: 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a 23 69 66  , LOG_FILE);.#if
a540: 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c  def FILED_DONT_L
a550: 4f 47 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  OG...fprintf(out
a560: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
a570: 20 20 20 20 20 20 20 20 20 20 4e 6f 74 65 20 74            Note t
a580: 68 61 74 20 6c 6f 67 67 69 6e 67 20 69 73 20 63  hat logging is c
a590: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 61 62 6c  ompletely disabl
a5a0: 65 64 20 73 6f 20 74 68 69 73 20 6f 70 74 69 6f  ed so this optio
a5b0: 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09 09 66 70  n does\n");...fp
a5c0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5e0: 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e 20 74 68     nothing in th
a5f0: 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23  is build.\n");.#
a600: 65 6e 64 69 66 0a 09 09 66 70 72 69 6e 74 66 28  endif...fprintf(
a610: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
a620: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
a630: 20 22 20 20 20 20 20 20 2d 75 20 28 6f 72 20 2d   "      -u (or -
a640: 2d 75 73 65 72 29 20 73 70 65 63 69 66 69 65 73  -user) specifies
a650: 20 74 68 65 20 75 73 65 72 20 74 6f 20 73 77 69   the user to swi
a660: 74 63 68 20 75 73 65 72 20 49 44 73 20 74 6f 20  tch user IDs to 
a670: 62 65 66 6f 72 65 20 73 65 72 76 69 63 69 6e 67  before servicing
a680: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a690: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
a6b0: 71 75 65 73 74 73 2e 20 20 54 68 65 20 64 65 66  quests.  The def
a6c0: 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61 6e  ault is not chan
a6d0: 67 65 20 75 73 65 72 20 49 44 73 2e 5c 6e 22 29  ge user IDs.\n")
a6e0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
a6f0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
a700: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
a710: 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d 72 6f 6f      -r (or --roo
a720: 74 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65  t) specifies the
a730: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 61 63   directory to ac
a740: 74 20 61 73 20 74 68 65 20 72 6f 6f 74 20 64 69  t as the root di
a750: 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e 22 29 3b  rectory for\n");
a760: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
a770: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
a780: 20 20 20 20 20 20 20 20 20 74 68 65 20 66 69 6c           the fil
a790: 65 20 73 65 72 76 65 72 2e 20 20 49 66 20 74 68  e server.  If th
a7a0: 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 73 70 65  is option is spe
a7b0: 63 69 66 69 65 64 2c 20 63 68 72 6f 6f 74 28 32  cified, chroot(2
a7c0: 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  )\n");...fprintf
a7d0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
a7f0: 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 20 64  s called.  The d
a800: 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68  efault is not ch
a810: 61 6e 67 65 20 72 6f 6f 74 20 64 69 72 65 63 74  ange root direct
a820: 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09 09 66 70  ories,\n");...fp
a830: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 20 20 20 74 68 61 74 20 69 73 2c 20 74 68 65      that is, the
a860: 20 5c 22 2f 5c 22 20 64 69 72 65 63 74 6f 72 79   \"/\" directory
a870: 20 69 73 20 73 68 61 72 65 64 20 6f 75 74 2e 20   is shared out. 
a880: 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a   This will\n");.
a890: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
a8a0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
a8b0: 20 20 20 20 20 20 20 20 6c 69 6b 65 6c 79 20 62          likely b
a8c0: 65 20 61 20 73 65 63 75 72 69 74 79 20 69 73 73  e a security iss
a8d0: 75 65 2c 20 73 6f 20 74 68 69 73 20 6f 70 74 69  ue, so this opti
a8e0: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
a8f0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
a900: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
a920: 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a   used.\n");..}..
a930: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41  .return;.}../* A
a940: 64 64 20 61 20 67 65 74 6f 70 74 20 6f 70 74 69  dd a getopt opti
a950: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
a960: 64 20 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  d filed_getopt_l
a970: 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74 72 75 63  ong_setopt(struc
a980: 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74 2c 20 63  t option *opt, c
a990: 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c  onst char *name,
a9a0: 20 69 6e 74 20 68 61 73 5f 61 72 67 2c 20 69 6e   int has_arg, in
a9b0: 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e 6e  t val) {..opt->n
a9c0: 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d 65 3b 0a  ame     = name;.
a9d0: 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67 20 20 3d  .opt->has_arg  =
a9e0: 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70 74 2d 3e   has_arg;..opt->
a9f0: 66 6c 61 67 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  flag     = NULL;
aa00: 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20 20 20 20  ..opt->val      
aa10: 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75 72 6e 3b  = val;...return;
aa20: 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61  .}../* Resolve a
aa30: 20 75 73 65 72 6e 61 6d 65 20 74 6f 20 61 20 55   username to a U
aa40: 49 44 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ID */.static int
aa50: 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b   filed_user_look
aa60: 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  up(const char *u
aa70: 73 65 72 2c 20 75 69 64 5f 74 20 2a 75 73 65 72  ser, uid_t *user
aa80: 5f 69 64 29 20 7b 0a 09 63 68 61 72 20 2a 6e 65  _id) {..char *ne
aa90: 78 74 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 5f  xt;..uid_t user_
aaa0: 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66 6e 64 65  id_check;.#ifnde
aab0: 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45 54 50 57  f FILED_NO_GETPW
aac0: 4e 41 4d 0a 09 73 74 72 75 63 74 20 70 61 73 73  NAM..struct pass
aad0: 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20 3d  wd *ent;...ent =
aae0: 20 67 65 74 70 77 6e 61 6d 28 75 73 65 72 29 3b   getpwnam(user);
aaf0: 0a 09 69 66 20 28 65 6e 74 20 21 3d 20 4e 55 4c  ..if (ent != NUL
ab00: 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f 69 64 20  L) {...*user_id 
ab10: 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a 0a  = ent->pw_uid;..
ab20: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
ab30: 23 65 6e 64 69 66 0a 0a 09 75 73 65 72 5f 69 64  #endif...user_id
ab40: 5f 63 68 65 63 6b 20 3d 20 73 74 72 74 6f 75 6c  _check = strtoul
ab50: 6c 28 75 73 65 72 2c 20 26 6e 65 78 74 2c 20 31  l(user, &next, 1
ab60: 30 29 3b 0a 09 69 66 20 28 6e 65 78 74 20 3d 3d  0);..if (next ==
ab70: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
ab80: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e  n(1);..}...if (n
ab90: 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20  ext[0] != '\0') 
aba0: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
abb0: 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20 3d 20 75  }...*user_id = u
abc0: 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a 09  ser_id_check;...
abd0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
abe0: 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73 74   Daemonize */.st
abf0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 64  atic int filed_d
ac00: 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29 20 7b  aemonize(void) {
ac10: 0a 09 70 69 64 5f 74 20 73 65 74 73 69 64 5f 72  ..pid_t setsid_r
ac20: 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b 0a 09 69  et, fork_ret;..i
ac30: 6e 74 20 63 68 64 69 72 5f 72 65 74 2c 20 64 75  nt chdir_ret, du
ac40: 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20 66 64 5f  p2_ret;..int fd_
ac50: 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a 09 63 68  in, fd_out;...ch
ac60: 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72 28  dir_ret = chdir(
ac70: 22 2f 22 29 3b 0a 09 69 66 20 28 63 68 64 69 72  "/");..if (chdir
ac80: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72  _ret != 0) {...r
ac90: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66  eturn(1);..}...f
aca0: 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72 6b 28 29  ork_ret = fork()
acb0: 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74 20  ;..if (fork_ret 
acc0: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
acd0: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 6f 72  1);..}...if (for
ace0: 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 2f  k_ret > 0) {.../
acf0: 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09 09 77 61  * Parent */...wa
ad00: 69 74 70 69 64 28 66 6f 72 6b 5f 72 65 74 2c 20  itpid(fork_ret, 
ad10: 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 65 78 69  NULL, 0);....exi
ad20: 74 28 45 58 49 54 5f 53 55 43 43 45 53 53 29 3b  t(EXIT_SUCCESS);
ad30: 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c 64 20 2a  ..}.../* Child *
ad40: 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29 20 21 3d  /..if (fork() !=
ad50: 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68 69 6c 64   0) {.../* Child
ad60: 20 2a 2f 0a 09 09 65 78 69 74 28 45 58 49 54 5f   */...exit(EXIT_
ad70: 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f  SUCCESS);..}.../
ad80: 2a 20 47 72 61 6e 64 20 63 68 69 6c 64 20 2a 2f  * Grand child */
ad90: 0a 09 73 65 74 73 69 64 5f 72 65 74 20 3d 20 73  ..setsid_ret = s
ada0: 65 74 73 69 64 28 29 3b 0a 09 69 66 20 28 73 65  etsid();..if (se
adb0: 74 73 69 64 5f 72 65 74 20 3d 3d 20 28 28 70 69  tsid_ret == ((pi
adc0: 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 72 65  d_t) -1)) {...re
add0: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 64  turn(1);..}...fd
ade0: 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76  _in = open("/dev
adf0: 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59  /null", O_RDONLY
ae00: 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20 6f 70 65  );..fd_out = ope
ae10: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f  n("/dev/null", O
ae20: 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 66  _WRONLY);..if (f
ae30: 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66 64 5f 6f  d_in < 0 || fd_o
ae40: 75 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  ut < 0) {...retu
ae50: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32  rn(1);..}...dup2
ae60: 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f 69  _ret = dup2(fd_i
ae70: 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29  n, STDIN_FILENO)
ae80: 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74 20  ;..if (dup2_ret 
ae90: 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29  != STDIN_FILENO)
aea0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
aeb0: 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20  .}...dup2_ret = 
aec0: 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54 44  dup2(fd_out, STD
aed0: 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66  OUT_FILENO);..if
aee0: 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54   (dup2_ret != ST
aef0: 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09  DOUT_FILENO) {..
af00: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
af10: 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32  .dup2_ret = dup2
af20: 28 66 64 5f 6f 75 74 2c 20 53 54 44 45 52 52 5f  (fd_out, STDERR_
af30: 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75  FILENO);..if (du
af40: 70 32 5f 72 65 74 20 21 3d 20 53 54 44 45 52 52  p2_ret != STDERR
af50: 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74  _FILENO) {...ret
af60: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c 6f  urn(1);..}...clo
af70: 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f 73  se(fd_in);..clos
af80: 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09 72 65 74  e(fd_out);...ret
af90: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 75  urn(0);.}../* Ru
afa0: 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a 69 6e 74  n process */.int
afb0: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
afc0: 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09  char **argv) {..
afd0: 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20 6f 70  struct option op
afe0: 74 69 6f 6e 73 5b 31 32 5d 3b 0a 09 73 74 72 75  tions[12];..stru
aff0: 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73  ct filed_options
b000: 20 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73 20   thread_options 
b010: 3d 20 7b 30 7d 3b 0a 09 63 6f 6e 73 74 20 63 68  = {0};..const ch
b020: 61 72 20 2a 62 69 6e 64 5f 61 64 64 72 20 3d 20  ar *bind_addr = 
b030: 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e 65 77 72  BIND_ADDR, *newr
b040: 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f 67  oot = NULL, *log
b050: 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46 49 4c 45  _file = LOG_FILE
b060: 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f 66 70 3b  ;..FILE *log_fp;
b070: 0a 09 75 69 64 5f 74 20 75 73 65 72 20 3d 20 30  ..uid_t user = 0
b080: 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d 20 50 4f  ;..int port = PO
b090: 52 54 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  RT, thread_count
b0a0: 20 3d 20 54 48 52 45 41 44 5f 43 4f 55 4e 54 3b   = THREAD_COUNT;
b0b0: 0a 09 69 6e 74 20 63 61 63 68 65 5f 73 69 7a 65  ..int cache_size
b0c0: 20 3d 20 43 41 43 48 45 5f 53 49 5a 45 3b 0a 09   = CACHE_SIZE;..
b0d0: 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c 20 63 68  int init_ret, ch
b0e0: 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74 75 69 64  root_ret, setuid
b0f0: 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f 72 65 74  _ret, lookup_ret
b100: 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a 09 69 6e  , chdir_ret;..in
b110: 74 20 73 65 74 75 69 64 5f 65 6e 61 62 6c 65 64  t setuid_enabled
b120: 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f 65 6e 61   = 0, daemon_ena
b130: 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20 63  bled = 0;..int c
b140: 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 2f 2a  h;..int fd;.../*
b150: 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d 65 6e   Process argumen
b160: 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67 65 74  ts */..filed_get
b170: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
b180: 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22 70 6f  &options[0], "po
b190: 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72  rt", required_ar
b1a0: 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a 09 66  gument, 'p');..f
b1b0: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
b1c0: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
b1d0: 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22 2c 20  [1], "threads", 
b1e0: 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e  required_argumen
b1f0: 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 't');..filed_
b200: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
b210: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d 2c 20  pt(&options[2], 
b220: 22 63 61 63 68 65 22 2c 20 72 65 71 75 69 72 65  "cache", require
b230: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63 27 29  d_argument, 'c')
b240: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
b250: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
b260: 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64 22 2c  ions[3], "bind",
b270: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
b280: 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c 65 64  nt, 'b');..filed
b290: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
b2a0: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34 5d 2c  opt(&options[4],
b2b0: 20 22 75 73 65 72 22 2c 20 72 65 71 75 69 72 65   "user", require
b2c0: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75 27 29  d_argument, 'u')
b2d0: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
b2e0: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
b2f0: 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74 22 2c  ions[5], "root",
b300: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
b310: 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c 65 64  nt, 'r');..filed
b320: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
b330: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36 5d 2c  opt(&options[6],
b340: 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72 67 75   "help", no_argu
b350: 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66 69 6c  ment, 'h');..fil
b360: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
b370: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 37  etopt(&options[7
b380: 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e 6f 5f  ], "daemon", no_
b390: 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29 3b 0a  argument, 'd');.
b3a0: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
b3b0: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
b3c0: 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20 72 65  ns[8], "log", re
b3d0: 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c  quired_argument,
b3e0: 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'l');..filed_ge
b3f0: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
b400: 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20 22 76  (&options[9], "v
b410: 65 72 73 69 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75  ersion", no_argu
b420: 6d 65 6e 74 2c 20 27 76 27 29 3b 0a 09 66 69 6c  ment, 'v');..fil
b430: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
b440: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31  etopt(&options[1
b450: 30 5d 2c 20 22 76 68 6f 73 74 22 2c 20 6e 6f 5f  0], "vhost", no_
b460: 61 72 67 75 6d 65 6e 74 2c 20 27 56 27 29 3b 0a  argument, 'V');.
b470: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
b480: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
b490: 6e 73 5b 31 31 5d 2c 20 4e 55 4c 4c 2c 20 30 2c  ns[11], NULL, 0,
b4a0: 20 30 29 3b 0a 09 77 68 69 6c 65 20 28 28 63 68   0);..while ((ch
b4b0: 20 3d 20 67 65 74 6f 70 74 5f 6c 6f 6e 67 28 61   = getopt_long(a
b4c0: 72 67 63 2c 20 61 72 67 76 2c 20 22 70 3a 74 3a  rgc, argv, "p:t:
b4d0: 63 3a 62 3a 75 3a 72 3a 6c 3a 68 64 76 56 22 2c  c:b:u:r:l:hdvV",
b4e0: 20 6f 70 74 69 6f 6e 73 2c 20 4e 55 4c 4c 29 29   options, NULL))
b4f0: 20 21 3d 20 2d 31 29 20 7b 0a 09 09 73 77 69 74   != -1) {...swit
b500: 63 68 28 63 68 29 20 7b 0a 09 09 09 63 61 73 65  ch(ch) {....case
b510: 20 27 70 27 3a 0a 09 09 09 09 70 6f 72 74 20 3d   'p':.....port =
b520: 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09   atoi(optarg);..
b530: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
b540: 65 20 27 74 27 3a 0a 09 09 09 09 74 68 72 65 61  e 't':.....threa
b550: 64 5f 63 6f 75 6e 74 20 3d 20 61 74 6f 69 28 6f  d_count = atoi(o
b560: 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61  ptarg);.....brea
b570: 6b 3b 0a 09 09 09 63 61 73 65 20 27 63 27 3a 0a  k;....case 'c':.
b580: 09 09 09 09 63 61 63 68 65 5f 73 69 7a 65 20 3d  ....cache_size =
b590: 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09   atoi(optarg);..
b5a0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
b5b0: 65 20 27 62 27 3a 0a 09 09 09 09 62 69 6e 64 5f  e 'b':.....bind_
b5c0: 61 64 64 72 20 3d 20 73 74 72 64 75 70 28 6f 70  addr = strdup(op
b5d0: 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b  targ);.....break
b5e0: 3b 0a 09 09 09 63 61 73 65 20 27 75 27 3a 0a 09  ;....case 'u':..
b5f0: 09 09 09 73 65 74 75 69 64 5f 65 6e 61 62 6c 65  ...setuid_enable
b600: 64 20 3d 20 31 3b 0a 09 09 09 09 6c 6f 6f 6b 75  d = 1;.....looku
b610: 70 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 75 73  p_ret = filed_us
b620: 65 72 5f 6c 6f 6f 6b 75 70 28 6f 70 74 61 72 67  er_lookup(optarg
b630: 2c 20 26 75 73 65 72 29 3b 0a 09 09 09 09 69 66  , &user);.....if
b640: 20 28 6c 6f 6f 6b 75 70 5f 72 65 74 20 21 3d 20   (lookup_ret != 
b650: 30 29 20 7b 0a 09 09 09 09 09 66 69 6c 65 64 5f  0) {......filed_
b660: 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65 72  print_help(stder
b670: 72 2c 20 30 2c 20 22 49 6e 76 61 6c 69 64 20 75  r, 0, "Invalid u
b680: 73 65 72 6e 61 6d 65 20 73 70 65 63 69 66 69 65  sername specifie
b690: 64 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  d");.......retur
b6a0: 6e 28 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  n(1);.....}.....
b6b0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
b6c0: 72 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 61  r':.....filed_pa
b6d0: 74 68 5f 74 72 61 6e 73 6c 61 74 65 5f 73 65 74  th_translate_set
b6e0: 5f 72 6f 6f 74 28 6e 65 77 72 6f 6f 74 2c 20 26  _root(newroot, &
b6f0: 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73 2c 20  thread_options, 
b700: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
b710: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 6c 27 3a  ak;....case 'l':
b720: 0a 09 09 09 09 6c 6f 67 5f 66 69 6c 65 20 3d 20  .....log_file = 
b730: 73 74 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a  strdup(optarg);.
b740: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
b750: 73 65 20 27 64 27 3a 0a 09 09 09 09 64 61 65 6d  se 'd':.....daem
b760: 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  on_enabled = 1;.
b770: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
b780: 73 65 20 27 56 27 3a 0a 09 09 09 09 74 68 72 65  se 'V':.....thre
b790: 61 64 5f 6f 70 74 69 6f 6e 73 2e 76 68 6f 73 74  ad_options.vhost
b7a0: 73 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 0a  s_enabled = 1;..
b7b0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
b7c0: 73 65 20 27 76 27 3a 0a 09 09 09 09 70 72 69 6e  se 'v':.....prin
b7d0: 74 66 28 22 66 69 6c 65 64 20 76 65 72 73 69 6f  tf("filed versio
b7e0: 6e 20 25 73 5c 6e 22 2c 20 46 49 4c 45 44 5f 56  n %s\n", FILED_V
b7f0: 45 52 53 49 4f 4e 29 3b 0a 0a 09 09 09 09 72 65  ERSION);......re
b800: 74 75 72 6e 28 30 29 3b 0a 09 09 09 63 61 73 65  turn(0);....case
b810: 20 27 3f 27 3a 0a 09 09 09 63 61 73 65 20 27 3a   '?':....case ':
b820: 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 72 69  ':.....filed_pri
b830: 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20  nt_help(stderr, 
b840: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09 72  0, NULL);......r
b850: 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 63 61 73  eturn(1);....cas
b860: 65 20 27 68 27 3a 0a 09 09 09 09 66 69 6c 65 64  e 'h':.....filed
b870: 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 6f  _print_help(stdo
b880: 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  ut, 1, NULL);...
b890: 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09  ...return(0);...
b8a0: 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65 6e 20 6c  }..}.../* Open l
b8b0: 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 6c 6f 67 5f  og file */..log_
b8c0: 66 70 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6f  fp = filed_log_o
b8d0: 70 65 6e 28 6c 6f 67 5f 66 69 6c 65 29 3b 0a 09  pen(log_file);..
b8e0: 69 66 20 28 6c 6f 67 5f 66 70 20 3d 3d 20 4e 55  if (log_fp == NU
b8f0: 4c 4c 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22  LL) {...perror("
b900: 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 22 29  filed_log_open")
b910: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29 3b 0a  ;....return(4);.
b920: 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c  .}.../* Create l
b930: 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 20  istening socket 
b940: 2a 2f 0a 09 66 64 20 3d 20 66 69 6c 65 64 5f 6c  */..fd = filed_l
b950: 69 73 74 65 6e 28 62 69 6e 64 5f 61 64 64 72 2c  isten(bind_addr,
b960: 20 70 6f 72 74 29 3b 0a 09 69 66 20 28 66 64 20   port);..if (fd 
b970: 3c 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28  < 0) {...perror(
b980: 22 66 69 6c 65 64 5f 6c 69 73 74 65 6e 22 29 3b  "filed_listen");
b990: 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
b9a0: 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  }.../* Initializ
b9b0: 65 20 74 69 6d 65 6f 75 74 20 73 74 72 75 63 74  e timeout struct
b9c0: 75 72 65 73 20 2a 2f 0a 09 69 6e 69 74 5f 72 65  ures */..init_re
b9d0: 74 20 3d 20 66 69 6c 65 64 5f 73 6f 63 6b 65 74  t = filed_socket
b9e0: 74 69 6d 65 6f 75 74 5f 69 6e 69 74 28 29 3b 0a  timeout_init();.
b9f0: 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d  .if (init_ret !=
ba00: 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22   0) {...perror("
ba10: 66 69 6c 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65  filed_sockettime
ba20: 6f 75 74 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72  out_init");....r
ba30: 65 74 75 72 6e 28 38 29 3b 0a 09 7d 0a 0a 09 2f  eturn(8);..}.../
ba40: 2a 20 42 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f  * Become a daemo
ba50: 6e 20 2a 2f 0a 09 69 66 20 28 64 61 65 6d 6f 6e  n */..if (daemon
ba60: 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 69 6e  _enabled) {...in
ba70: 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 64  it_ret = filed_d
ba80: 61 65 6d 6f 6e 69 7a 65 28 29 3b 0a 09 09 69 66  aemonize();...if
ba90: 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29   (init_ret != 0)
baa0: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 66 69   {....perror("fi
bab0: 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 22 29 3b  led_daemonize");
bac0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 36 29 3b 0a  .....return(6);.
bad0: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 43 68 72 6f  ..}..}.../* Chro
bae0: 6f 74 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61  ot, if appropria
baf0: 74 65 20 2a 2f 0a 09 69 66 20 28 6e 65 77 72 6f  te */..if (newro
bb00: 6f 74 29 20 7b 0a 09 09 63 68 64 69 72 5f 72 65  ot) {...chdir_re
bb10: 74 20 3d 20 63 68 64 69 72 28 6e 65 77 72 6f 6f  t = chdir(newroo
bb20: 74 29 3b 0a 09 09 69 66 20 28 63 68 64 69 72 5f  t);...if (chdir_
bb30: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70  ret != 0) {....p
bb40: 65 72 72 6f 72 28 22 63 68 64 69 72 22 29 3b 0a  error("chdir");.
bb50: 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
bb60: 09 7d 0a 0a 09 09 63 68 72 6f 6f 74 5f 72 65 74  .}....chroot_ret
bb70: 20 3d 20 63 68 72 6f 6f 74 28 22 2e 22 29 3b 0a   = chroot(".");.
bb80: 09 09 69 66 20 28 63 68 72 6f 6f 74 5f 72 65 74  ..if (chroot_ret
bb90: 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72   != 0) {....perr
bba0: 6f 72 28 22 63 68 72 6f 6f 74 22 29 3b 0a 0a 09  or("chroot");...
bbb0: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d  ..return(1);...}
bbc0: 0a 09 7d 0a 0a 09 2f 2a 20 44 72 6f 70 20 70 72  ..}.../* Drop pr
bbd0: 69 76 69 6c 65 67 65 73 2c 20 69 66 20 61 70 70  ivileges, if app
bbe0: 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66 20  ropriate */..if 
bbf0: 28 73 65 74 75 69 64 5f 65 6e 61 62 6c 65 64 29  (setuid_enabled)
bc00: 20 7b 0a 09 09 73 65 74 75 69 64 5f 72 65 74 20   {...setuid_ret 
bc10: 3d 20 73 65 74 75 69 64 28 75 73 65 72 29 3b 0a  = setuid(user);.
bc20: 09 09 69 66 20 28 73 65 74 75 69 64 5f 72 65 74  ..if (setuid_ret
bc30: 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72   != 0) {....perr
bc40: 6f 72 28 22 73 65 74 75 69 64 22 29 3b 0a 0a 09  or("setuid");...
bc50: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d  ..return(1);...}
bc60: 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c  ..}.../* Initial
bc70: 69 7a 65 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74  ize */..init_ret
bc80: 20 3d 20 66 69 6c 65 64 5f 69 6e 69 74 28 63 61   = filed_init(ca
bc90: 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28  che_size);..if (
bca0: 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b  init_ret != 0) {
bcb0: 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64  ...perror("filed
bcc0: 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75  _init");....retu
bcd0: 72 6e 28 33 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  rn(3);..}.../* C
bce0: 72 65 61 74 65 20 6c 6f 67 67 69 6e 67 20 74 68  reate logging th
bcf0: 72 65 61 64 20 2a 2f 0a 09 69 6e 69 74 5f 72 65  read */..init_re
bd00: 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  t = filed_loggin
bd10: 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 6c 6f  g_thread_init(lo
bd20: 67 5f 66 70 29 3b 0a 09 69 66 20 28 69 6e 69 74  g_fp);..if (init
bd30: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70  _ret != 0) {...p
bd40: 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67  error("filed_log
bd50: 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74  ging_thread_init
bd60: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29  ");....return(4)
bd70: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65  ;..}.../* Create
bd80: 20 73 6f 63 6b 65 74 20 74 65 72 6d 69 6e 61 74   socket terminat
bd90: 69 6f 6e 20 74 68 72 65 61 64 20 2a 2f 0a 09 69  ion thread */..i
bda0: 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  nit_ret = filed_
bdb0: 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74 5f 74 68  sockettimeout_th
bdc0: 72 65 61 64 5f 69 6e 69 74 28 29 3b 0a 09 69 66  read_init();..if
bdd0: 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29   (init_ret != 0)
bde0: 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c   {...perror("fil
bdf0: 65 64 5f 73 6f 63 6b 65 74 74 69 6d 65 6f 75 74  ed_sockettimeout
be00: 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a  _thread_init");.
be10: 0a 09 09 72 65 74 75 72 6e 28 37 29 3b 0a 09 7d  ...return(7);..}
be20: 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 77 6f 72  .../* Create wor
be30: 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 09  ker threads */..
be40: 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64  init_ret = filed
be50: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f  _worker_threads_
be60: 69 6e 69 74 28 66 64 2c 20 74 68 72 65 61 64 5f  init(fd, thread_
be70: 63 6f 75 6e 74 2c 20 26 74 68 72 65 61 64 5f 6f  count, &thread_o
be80: 70 74 69 6f 6e 73 29 3b 0a 09 69 66 20 28 69 6e  ptions);..if (in
be90: 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
bea0: 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 77  .perror("filed_w
beb0: 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e  orker_threads_in
bec0: 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  it");....return(
bed0: 35 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69 74  5);..}.../* Wait
bee0: 20 66 6f 72 20 74 68 72 65 61 64 73 20 74 6f 20   for threads to 
bef0: 65 78 69 74 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a  exit */../* XXX:
bf00: 54 4f 44 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74 68  TODO: Monitor th
bf10: 72 65 61 64 20 75 73 61 67 65 20 2a 2f 0a 09 77  read usage */..w
bf20: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 73 6c 65  hile (1) {...sle
bf30: 65 70 28 38 36 34 30 30 29 3b 0a 09 7d 0a 0a 09  ep(86400);..}...
bf40: 2f 2a 20 52 65 74 75 72 6e 20 69 6e 20 66 61 69  /* Return in fai
bf50: 6c 75 72 65 20 2a 2f 0a 09 72 65 74 75 72 6e 28  lure */..return(
bf60: 32 29 3b 0a 7d 0a                                2);.}.