Hex Artifact Content

Artifact 386b3803b7c18fd72231875d8a66f72ceb265eec:


0000: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 65  #include <sys/se
0010: 6e 64 66 69 6c 65 2e 68 3e 0a 23 69 6e 63 6c 75  ndfile.h>.#inclu
0020: 64 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68  de <sys/socket.h
0030: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0040: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  types.h>.#includ
0050: 65 20 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a  e <arpa/inet.h>.
0060: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d  #include <sys/mm
0070: 61 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  an.h>.#include <
0080: 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63  sys/stat.h>.#inc
0090: 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e 68  lude <sys/wait.h
00a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  >.#include <pthr
00b0: 65 61 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ead.h>.#include 
00c0: 3c 73 74 72 69 6e 67 73 2e 68 3e 0a 23 69 6e 63  <strings.h>.#inc
00d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
00e0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
00f0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0100: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0110: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0120: 6c 75 64 65 20 3c 67 65 74 6f 70 74 2e 68 3e 0a  lude <getopt.h>.
0130: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67  #include <stdarg
0140: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
0150: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
0160: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0170: 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e  de <errno.h>.#in
0180: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23  clude <time.h>.#
0190: 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a  include <pwd.h>.
01a0: 0a 2f 2a 20 43 6f 6d 70 69 6c 65 20 74 69 6d 65  ./* Compile time
01b0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 23 64   constants */.#d
01c0: 65 66 69 6e 65 20 46 49 4c 45 44 5f 56 45 52 53  efine FILED_VERS
01d0: 49 4f 4e 20 22 31 2e 37 22 0a 23 64 65 66 69 6e  ION "1.7".#defin
01e0: 65 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45  e FILED_SENDFILE
01f0: 5f 4d 41 58 20 31 36 37 37 37 32 31 35 0a 23 64  _MAX 16777215.#d
0200: 65 66 69 6e 65 20 46 49 4c 45 44 5f 4d 41 58 5f  efine FILED_MAX_
0210: 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 20 33 30  FAILURE_COUNT 30
0220: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44  .#define FILED_D
0230: 45 46 41 55 4c 54 5f 54 59 50 45 20 22 61 70 70  EFAULT_TYPE "app
0240: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
0250: 74 72 65 61 6d 22 0a 23 64 65 66 69 6e 65 20 46  tream".#define F
0260: 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52  ILED_PATH_BUFFER
0270: 5f 53 49 5a 45 20 31 30 31 30 0a 0a 2f 2a 20 44  _SIZE 1010../* D
0280: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f  efault values */
0290: 0a 23 64 65 66 69 6e 65 20 50 4f 52 54 20 38 30  .#define PORT 80
02a0: 0a 23 64 65 66 69 6e 65 20 54 48 52 45 41 44 5f  .#define THREAD_
02b0: 43 4f 55 4e 54 20 35 0a 23 64 65 66 69 6e 65 20  COUNT 5.#define 
02c0: 42 49 4e 44 5f 41 44 44 52 20 22 3a 3a 22 0a 23  BIND_ADDR "::".#
02d0: 64 65 66 69 6e 65 20 43 41 43 48 45 5f 53 49 5a  define CACHE_SIZ
02e0: 45 20 38 32 30 39 0a 23 64 65 66 69 6e 65 20 4c  E 8209.#define L
02f0: 4f 47 5f 46 49 4c 45 20 22 2d 22 0a 0a 2f 2a 20  OG_FILE "-"../* 
0300: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  Configuration op
0310: 74 69 6f 6e 73 20 74 68 61 74 20 77 6f 72 6b 20  tions that work 
0320: 74 68 72 65 61 64 73 20 6e 65 65 64 20 74 6f 20  threads need to 
0330: 62 65 20 61 77 61 72 65 20 6f 66 20 2a 2f 0a 73  be aware of */.s
0340: 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69  truct filed_opti
0350: 6f 6e 73 20 7b 0a 09 69 6e 74 20 76 68 6f 73 74  ons {..int vhost
0360: 73 5f 65 6e 61 62 6c 65 64 3b 0a 7d 3b 0a 0a 2f  s_enabled;.};../
0370: 2a 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  * Arguments for 
0380: 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a  worker threads *
0390: 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  /.struct filed_w
03a0: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
03b0: 73 20 7b 0a 09 69 6e 74 20 66 64 3b 0a 09 73 74  s {..int fd;..st
03c0: 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f  ruct filed_optio
03d0: 6e 73 20 6f 70 74 69 6f 6e 73 3b 0a 7d 3b 0a 0a  ns options;.};..
03e0: 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72  /* Arguments for
03f0: 20 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 73   logging threads
0400: 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64   */.struct filed
0410: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
0420: 61 72 67 73 20 7b 0a 09 46 49 4c 45 20 2a 66 70  args {..FILE *fp
0430: 3b 0a 7d 3b 0a 0a 2f 2a 20 46 69 6c 65 20 69 6e  ;.};../* File in
0440: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 73 74 72  formation */.str
0450: 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  uct filed_filein
0460: 66 6f 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  fo {..pthread_mu
0470: 74 65 78 5f 74 20 6d 75 74 65 78 3b 0a 09 63 68  tex_t mutex;..ch
0480: 61 72 20 70 61 74 68 5b 46 49 4c 45 44 5f 50 41  ar path[FILED_PA
0490: 54 48 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b  TH_BUFFER_SIZE];
04a0: 0a 09 69 6e 74 20 66 64 3b 0a 09 6f 66 66 5f 74  ..int fd;..off_t
04b0: 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 73   len;..char *las
04c0: 74 6d 6f 64 3b 0a 09 63 68 61 72 20 6c 61 73 74  tmod;..char last
04d0: 6d 6f 64 5f 62 5b 36 34 5d 3b 0a 09 63 6f 6e 73  mod_b[64];..cons
04e0: 74 20 63 68 61 72 20 2a 74 79 70 65 3b 0a 09 63  t char *type;..c
04f0: 68 61 72 20 65 74 61 67 5b 36 34 5d 3b 0a 7d 3b  har etag[64];.};
0500: 0a 0a 2f 2a 20 52 65 71 75 65 73 74 20 76 61 72  ../* Request var
0510: 69 61 62 6c 65 73 20 2a 2f 0a 73 74 72 75 63 74  iables */.struct
0520: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
0530: 65 73 74 20 7b 0a 09 2f 2a 2a 20 42 75 66 66 65  est {../** Buffe
0540: 72 73 20 2a 2a 2f 0a 09 73 74 72 75 63 74 20 66  rs **/..struct f
0550: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 66 69  iled_fileinfo fi
0560: 6c 65 69 6e 66 6f 3b 0a 09 63 68 61 72 20 74 6d  leinfo;..char tm
0570: 70 62 75 66 5b 46 49 4c 45 44 5f 50 41 54 48 5f  pbuf[FILED_PATH_
0580: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09  BUFFER_SIZE];...
0590: 2f 2a 2a 20 48 54 54 50 20 52 65 71 75 65 73 74  /** HTTP Request
05a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2a 2f   information **/
05b0: 0a 09 2f 2a 2a 2a 20 54 79 70 65 20 6f 66 20 72  ../*** Type of r
05c0: 65 71 75 65 73 74 20 28 48 45 41 44 20 6f 72 20  equest (HEAD or 
05d0: 47 45 54 29 20 2a 2a 2a 2f 0a 09 65 6e 75 6d 20  GET) ***/..enum 
05e0: 7b 0a 09 09 46 49 4c 45 44 5f 52 45 51 55 45 53  {...FILED_REQUES
05f0: 54 5f 4d 45 54 48 4f 44 5f 47 45 54 2c 0a 09 09  T_METHOD_GET,...
0600: 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45  FILED_REQUEST_ME
0610: 54 48 4f 44 5f 48 45 41 44 0a 09 7d 20 6d 65 74  THOD_HEAD..} met
0620: 68 6f 64 3b 0a 0a 09 2f 2a 2a 2a 20 50 61 74 68  hod;.../*** Path
0630: 20 62 65 69 6e 67 20 72 65 71 75 65 73 74 65 64   being requested
0640: 20 2a 2a 2a 2f 0a 09 63 68 61 72 20 70 61 74 68   ***/..char path
0650: 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46  [FILED_PATH_BUFF
0660: 45 52 5f 53 49 5a 45 5d 3b 20 0a 0a 09 73 74 72  ER_SIZE]; ...str
0670: 75 63 74 20 7b 0a 09 09 73 74 72 75 63 74 20 7b  uct {...struct {
0680: 0a 09 09 09 69 6e 74 20 70 72 65 73 65 6e 74 3b  ....int present;
0690: 0a 09 09 09 6f 66 66 5f 74 20 6f 66 66 73 65 74  ....off_t offset
06a0: 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e 67 65 20 73  ;   /*** Range s
06b0: 74 61 72 74 20 2a 2a 2a 2f 0a 09 09 09 6f 66 66  tart ***/....off
06c0: 5f 74 20 6c 65 6e 67 74 68 3b 20 20 20 2f 2a 2a  _t length;   /**
06d0: 2a 20 52 61 6e 67 65 20 6c 65 6e 67 74 68 20 2a  * Range length *
06e0: 2a 2a 2f 0a 09 09 7d 20 72 61 6e 67 65 3b 0a 0a  **/...} range;..
06f0: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 69 6e  ..struct {....in
0700: 74 20 70 72 65 73 65 6e 74 3b 0a 09 09 09 63 68  t present;....ch
0710: 61 72 20 68 6f 73 74 5b 46 49 4c 45 44 5f 50 41  ar host[FILED_PA
0720: 54 48 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b  TH_BUFFER_SIZE];
0730: 0a 09 09 7d 20 68 6f 73 74 3b 0a 09 7d 20 68 65  ...} host;..} he
0740: 61 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c 6f  aders;.};../* Lo
0750: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72 75  g record */.stru
0760: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
0770: 72 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20 6f 66  ry {../* Type of
0780: 20 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a 09 65   log entry */..e
0790: 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 4c 4f  num {...FILED_LO
07a0: 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 2c 0a  G_TYPE_MESSAGE,.
07b0: 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45  ..FILED_LOG_TYPE
07c0: 5f 54 52 41 4e 53 46 45 52 0a 09 7d 20 74 79 70  _TRANSFER..} typ
07d0: 65 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64 20 6c  e;.../* Linked l
07e0: 69 73 74 20 68 65 61 64 2f 74 61 69 6c 20 2a 2f  ist head/tail */
07f0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
0800: 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78 74 3b  og_entry *_next;
0810: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
0820: 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65 76 3b  og_entry *_prev;
0830: 0a 0a 09 2f 2a 20 54 68 72 65 61 64 20 66 72 6f  .../* Thread fro
0840: 6d 20 77 68 69 63 68 20 74 68 69 73 20 6c 6f 67  m which this log
0850: 20 65 6e 74 72 79 20 65 6d 69 6e 61 74 65 73 20   entry eminates 
0860: 2a 2f 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68  */..pthread_t th
0870: 72 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73 73 61  read;.../* Messa
0880: 67 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 79  ge buffer for ty
0890: 70 65 20 3d 20 4d 45 53 53 41 47 45 20 2a 2f 0a  pe = MESSAGE */.
08a0: 09 2f 2a 20 50 61 74 68 20 62 75 66 66 65 72 20  ./* Path buffer 
08b0: 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e 53  for type = TRANS
08c0: 46 45 52 20 2a 2f 0a 09 63 68 61 72 20 62 75 66  FER */..char buf
08d0: 66 65 72 5b 46 49 4c 45 44 5f 50 41 54 48 5f 42  fer[FILED_PATH_B
08e0: 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09 2f  UFFER_SIZE];.../
08f0: 2a 20 49 74 65 6d 73 20 66 6f 72 20 74 79 70 65  * Items for type
0900: 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a 09   = TRANSFER */..
0910: 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09  int http_code;..
0920: 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61 73  const char *reas
0930: 6f 6e 3b 0a 09 74 69 6d 65 5f 74 20 73 74 61 72  on;..time_t star
0940: 74 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74 20 65  ttime;..time_t e
0950: 6e 64 74 69 6d 65 3b 0a 09 6f 66 66 5f 74 20 72  ndtime;..off_t r
0960: 65 71 5f 6f 66 66 73 65 74 3b 0a 09 6f 66 66 5f  eq_offset;..off_
0970: 74 20 72 65 71 5f 6c 65 6e 67 74 68 3b 0a 09 6f  t req_length;..o
0980: 66 66 5f 74 20 73 65 6e 74 5f 6c 65 6e 67 74 68  ff_t sent_length
0990: 3b 0a 09 6f 66 66 5f 74 20 66 69 6c 65 5f 6c 65  ;..off_t file_le
09a0: 6e 67 74 68 3b 0a 09 63 68 61 72 20 69 70 5b 31  ngth;..char ip[1
09b0: 32 38 5d 3b 0a 09 69 6e 74 20 70 6f 72 74 3b 0a  28];..int port;.
09c0: 09 69 6e 74 20 6d 65 74 68 6f 64 3b 0a 7d 3b 0a  .int method;.};.
09d0: 0a 2f 2a 20 47 6c 6f 62 61 6c 20 76 61 72 69 61  ./* Global varia
09e0: 62 6c 65 73 20 2a 2f 0a 2f 2a 2a 20 4f 70 65 6e  bles */./** Open
09f0: 20 46 69 6c 65 20 63 61 63 68 65 20 2a 2a 2f 0a   File cache **/.
0a00: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c  struct filed_fil
0a10: 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 66 69 6c  einfo *filed_fil
0a20: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d 20  einfo_fdcache = 
0a30: 4e 55 4c 4c 3b 0a 75 6e 73 69 67 6e 65 64 20 69  NULL;.unsigned i
0a40: 6e 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  nt filed_fileinf
0a50: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 3d  o_fdcache_size =
0a60: 20 30 3b 0a 0a 2f 2a 2a 20 4c 6f 67 67 69 6e 67   0;../** Logging
0a70: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65   **/.struct file
0a80: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66 69 6c  d_log_entry *fil
0a90: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b  ed_log_msg_list;
0aa0: 0a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
0ab0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c   filed_log_msg_l
0ac0: 69 73 74 5f 6d 75 74 65 78 3b 0a 70 74 68 72 65  ist_mutex;.pthre
0ad0: 61 64 5f 63 6f 6e 64 5f 74 20 66 69 6c 65 64 5f  ad_cond_t filed_
0ae0: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61  log_msg_list_rea
0af0: 64 79 3b 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69  dy;../* Initiali
0b00: 7a 65 20 63 61 63 68 65 20 2a 2f 0a 73 74 61 74  ze cache */.stat
0b10: 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 69 6e 69  ic int filed_ini
0b20: 74 5f 63 61 63 68 65 28 75 6e 73 69 67 6e 65 64  t_cache(unsigned
0b30: 20 69 6e 74 20 63 61 63 68 65 5f 73 69 7a 65 29   int cache_size)
0b40: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74   {..unsigned int
0b50: 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
0b60: 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 2f 2a 20  _init_ret;.../* 
0b70: 43 61 63 68 65 20 6d 61 79 20 6e 6f 74 20 62 65  Cache may not be
0b80: 20 72 65 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20   re-initialized 
0b90: 2a 2f 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69  */..if (filed_fi
0ba0: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73  leinfo_fdcache_s
0bb0: 69 7a 65 20 21 3d 20 30 20 7c 7c 20 66 69 6c 65  ize != 0 || file
0bc0: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
0bd0: 68 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  he != NULL) {...
0be0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
0bf0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 61 63 68  /* Allocate cach
0c00: 65 20 2a 2f 0a 09 66 69 6c 65 64 5f 66 69 6c 65  e */..filed_file
0c10: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
0c20: 65 20 3d 20 63 61 63 68 65 5f 73 69 7a 65 3b 0a  e = cache_size;.
0c30: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
0c40: 66 64 63 61 63 68 65 20 3d 20 6d 61 6c 6c 6f 63  fdcache = malloc
0c50: 28 73 69 7a 65 6f 66 28 2a 66 69 6c 65 64 5f 66  (sizeof(*filed_f
0c60: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 29  ileinfo_fdcache)
0c70: 20 2a 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66   * filed_fileinf
0c80: 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29 3b  o_fdcache_size);
0c90: 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69 6c 65  ..if (filed_file
0ca0: 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d 3d 20  info_fdcache == 
0cb0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
0cc0: 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69  (1);..}.../* Ini
0cd0: 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20 65 6e  tialize cache en
0ce0: 74 72 69 65 73 20 2a 2f 0a 09 66 6f 72 20 28 69  tries */..for (i
0cf0: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 66 69  dx = 0; idx < fi
0d00: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63  led_fileinfo_fdc
0d10: 61 63 68 65 5f 73 69 7a 65 3b 20 69 64 78 2b 2b  ache_size; idx++
0d20: 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74  ) {...mutex_init
0d30: 5f 72 65 74 20 3d 20 70 74 68 72 65 61 64 5f 6d  _ret = pthread_m
0d40: 75 74 65 78 5f 69 6e 69 74 28 26 66 69 6c 65 64  utex_init(&filed
0d50: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
0d60: 65 5b 69 64 78 5d 2e 6d 75 74 65 78 2c 20 4e 55  e[idx].mutex, NU
0d70: 4c 4c 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 78  LL);...if (mutex
0d80: 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  _init_ret != 0) 
0d90: 7b 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  {....return(1);.
0da0: 09 09 7d 0a 0a 09 09 66 69 6c 65 64 5f 66 69 6c  ..}....filed_fil
0db0: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64  einfo_fdcache[id
0dc0: 78 5d 2e 70 61 74 68 5b 30 5d 20 3d 20 27 5c 30  x].path[0] = '\0
0dd0: 27 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69  ';...filed_filei
0de0: 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d  nfo_fdcache[idx]
0df0: 2e 66 64 20 3d 20 2d 31 3b 0a 09 09 66 69 6c 65  .fd = -1;...file
0e00: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
0e10: 68 65 5b 69 64 78 5d 2e 6c 61 73 74 6d 6f 64 20  he[idx].lastmod 
0e20: 3d 20 22 22 3b 0a 09 09 66 69 6c 65 64 5f 66 69  = "";...filed_fi
0e30: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69  leinfo_fdcache[i
0e40: 64 78 5d 2e 74 79 70 65 20 3d 20 22 22 3b 0a 09  dx].type = "";..
0e50: 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  }...return(0);.}
0e60: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
0e70: 70 72 6f 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  process */.stati
0e80: 63 20 69 6e 74 20 66 69 6c 65 64 5f 69 6e 69 74  c int filed_init
0e90: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  (unsigned int ca
0ea0: 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 73 74 61  che_size) {..sta
0eb0: 74 69 63 20 69 6e 74 20 63 61 6c 6c 65 64 20 3d  tic int called =
0ec0: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e   0;..unsigned in
0ed0: 74 20 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 3d  t random_value =
0ee0: 20 30 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 72   0;..int cache_r
0ef0: 65 74 3b 0a 09 69 6e 74 20 72 61 6e 64 6f 6d 5f  et;..int random_
0f00: 66 64 3b 0a 0a 09 69 66 20 28 63 61 6c 6c 65 64  fd;...if (called
0f10: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  ) {...return(0);
0f20: 0a 09 7d 0a 0a 09 63 61 6c 6c 65 64 20 3d 20 31  ..}...called = 1
0f30: 3b 0a 0a 09 2f 2a 20 41 74 74 65 6d 70 74 20 74  ;.../* Attempt t
0f40: 6f 20 6c 6f 63 6b 20 61 6c 6c 20 6d 65 6d 6f 72  o lock all memor
0f50: 79 20 74 6f 20 70 68 79 73 69 63 61 6c 20 52 41  y to physical RA
0f60: 4d 20 28 62 75 74 20 64 6f 6e 27 74 20 63 61 72  M (but don't car
0f70: 65 20 69 66 20 77 65 20 63 61 6e 27 74 29 20 2a  e if we can't) *
0f80: 2f 0a 09 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f  /..mlockall(MCL_
0f90: 43 55 52 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55  CURRENT | MCL_FU
0fa0: 54 55 52 45 29 3b 0a 0a 09 2f 2a 20 49 67 6e 6f  TURE);.../* Igno
0fb0: 72 65 20 53 49 47 50 49 50 45 20 2a 2f 0a 09 73  re SIGPIPE */..s
0fc0: 69 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20 53  ignal(SIGPIPE, S
0fd0: 49 47 5f 49 47 4e 29 3b 0a 0a 09 2f 2a 20 49 6e  IG_IGN);.../* In
0fe0: 69 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20 73  itialize cache s
0ff0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 09 63 61 63  tructure */..cac
1000: 68 65 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 69  he_ret = filed_i
1010: 6e 69 74 5f 63 61 63 68 65 28 63 61 63 68 65 5f  nit_cache(cache_
1020: 73 69 7a 65 29 3b 0a 09 69 66 20 28 63 61 63 68  size);..if (cach
1030: 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  e_ret != 0) {...
1040: 72 65 74 75 72 6e 28 63 61 63 68 65 5f 72 65 74  return(cache_ret
1050: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69  );..}.../* Initi
1060: 61 6c 69 7a 65 20 72 61 6e 64 6f 6d 20 6e 75 6d  alize random num
1070: 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f  ber generator */
1080: 0a 09 72 61 6e 64 6f 6d 5f 66 64 20 3d 20 6f 70  ..random_fd = op
1090: 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
10a0: 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 69  ", O_RDONLY);..i
10b0: 66 20 28 72 61 6e 64 6f 6d 5f 66 64 20 3e 3d 20  f (random_fd >= 
10c0: 30 29 20 7b 0a 09 09 72 65 61 64 28 72 61 6e 64  0) {...read(rand
10d0: 6f 6d 5f 66 64 2c 20 26 72 61 6e 64 6f 6d 5f 76  om_fd, &random_v
10e0: 61 6c 75 65 2c 20 73 69 7a 65 6f 66 28 72 61 6e  alue, sizeof(ran
10f0: 64 6f 6d 5f 76 61 6c 75 65 29 29 3b 0a 0a 09 09  dom_value));....
1100: 63 6c 6f 73 65 28 72 61 6e 64 6f 6d 5f 66 64 29  close(random_fd)
1110: 3b 0a 09 7d 0a 0a 09 72 61 6e 64 6f 6d 5f 76 61  ;..}...random_va
1120: 6c 75 65 20 5e 3d 20 67 65 74 70 69 64 28 29 3b  lue ^= getpid();
1130: 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e  ..random_value ^
1140: 3d 20 67 65 74 75 69 64 28 29 3b 0a 09 72 61 6e  = getuid();..ran
1150: 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 74 69 6d  dom_value ^= tim
1160: 65 28 4e 55 4c 4c 29 3b 0a 0a 09 73 72 61 6e 64  e(NULL);...srand
1170: 6f 6d 28 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 29  om(random_value)
1180: 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
1190: 0a 0a 2f 2a 20 4c 69 73 74 65 6e 20 6f 6e 20 61  ../* Listen on a
11a0: 20 70 61 72 74 69 63 75 6c 61 72 20 61 64 64 72   particular addr
11b0: 65 73 73 2f 70 6f 72 74 20 2a 2f 0a 73 74 61 74  ess/port */.stat
11c0: 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 6c 69 73  ic int filed_lis
11d0: 74 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ten(const char *
11e0: 61 64 64 72 65 73 73 2c 20 75 6e 73 69 67 6e 65  address, unsigne
11f0: 64 20 69 6e 74 20 70 6f 72 74 29 20 7b 0a 09 73  d int port) {..s
1200: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
1210: 6e 36 20 61 64 64 72 5f 76 36 3b 0a 09 73 74 72  n6 addr_v6;..str
1220: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20  uct sockaddr_in 
1230: 61 64 64 72 5f 76 34 3b 0a 09 73 74 72 75 63 74  addr_v4;..struct
1240: 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64 72 3b   sockaddr *addr;
1250: 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 61 64 64 72  ..socklen_t addr
1260: 5f 6c 65 6e 3b 0a 09 69 6e 74 20 70 74 6f 6e 5f  _len;..int pton_
1270: 72 65 74 2c 20 62 69 6e 64 5f 72 65 74 2c 20 6c  ret, bind_ret, l
1280: 69 73 74 65 6e 5f 72 65 74 3b 0a 09 69 6e 74 20  isten_ret;..int 
1290: 66 61 6d 69 6c 79 3b 0a 09 69 6e 74 20 66 64 3b  family;..int fd;
12a0: 0a 0a 0a 09 66 61 6d 69 6c 79 20 3d 20 41 46 5f  ....family = AF_
12b0: 49 4e 45 54 36 3b 0a 09 70 74 6f 6e 5f 72 65 74  INET6;..pton_ret
12c0: 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61 6d   = inet_pton(fam
12d0: 69 6c 79 2c 20 61 64 64 72 65 73 73 2c 20 26 61  ily, address, &a
12e0: 64 64 72 5f 76 36 2e 73 69 6e 36 5f 61 64 64 72  ddr_v6.sin6_addr
12f0: 2e 73 36 5f 61 64 64 72 29 3b 0a 09 69 66 20 28  .s6_addr);..if (
1300: 70 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20 7b  pton_ret != 1) {
1310: 0a 09 09 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49  ...family = AF_I
1320: 4e 45 54 3b 0a 09 09 70 74 6f 6e 5f 72 65 74 20  NET;...pton_ret 
1330: 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61 6d 69  = inet_pton(fami
1340: 6c 79 2c 20 61 64 64 72 65 73 73 2c 20 26 61 64  ly, address, &ad
1350: 64 72 5f 76 34 2e 73 69 6e 5f 61 64 64 72 2e 73  dr_v4.sin_addr.s
1360: 5f 61 64 64 72 29 3b 0a 09 09 69 66 20 28 70 74  _addr);...if (pt
1370: 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20 7b 0a 09  on_ret != 1) {..
1380: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
1390: 7d 0a 0a 09 09 61 64 64 72 5f 76 34 2e 73 69 6e  }....addr_v4.sin
13a0: 5f 66 61 6d 69 6c 79 20 3d 20 66 61 6d 69 6c 79  _family = family
13b0: 3b 0a 09 09 61 64 64 72 5f 76 34 2e 73 69 6e 5f  ;...addr_v4.sin_
13c0: 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f 72  port = htons(por
13d0: 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28 73  t);....addr = (s
13e0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
13f0: 29 20 26 61 64 64 72 5f 76 34 3b 0a 09 09 61 64  ) &addr_v4;...ad
1400: 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  dr_len = sizeof(
1410: 61 64 64 72 5f 76 34 29 3b 0a 09 7d 20 65 6c 73  addr_v4);..} els
1420: 65 20 7b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69  e {...addr_v6.si
1430: 6e 36 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49  n6_family = AF_I
1440: 4e 45 54 36 3b 0a 09 09 61 64 64 72 5f 76 36 2e  NET6;...addr_v6.
1450: 73 69 6e 36 5f 66 6c 6f 77 69 6e 66 6f 20 3d 20  sin6_flowinfo = 
1460: 30 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e  0;...addr_v6.sin
1470: 36 5f 73 63 6f 70 65 5f 69 64 20 3d 20 30 3b 0a  6_scope_id = 0;.
1480: 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 70  ..addr_v6.sin6_p
1490: 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f 72 74  ort = htons(port
14a0: 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28 73 74  );....addr = (st
14b0: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29  ruct sockaddr *)
14c0: 20 26 61 64 64 72 5f 76 36 3b 0a 09 09 61 64 64   &addr_v6;...add
14d0: 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61  r_len = sizeof(a
14e0: 64 64 72 5f 76 36 29 3b 0a 09 7d 0a 0a 09 66 64  ddr_v6);..}...fd
14f0: 20 3d 20 73 6f 63 6b 65 74 28 66 61 6d 69 6c 79   = socket(family
1500: 2c 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30  , SOCK_STREAM, 0
1510: 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20  );..if (fd < 0) 
1520: 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  {...return(fd);.
1530: 09 7d 0a 0a 09 62 69 6e 64 5f 72 65 74 20 3d 20  .}...bind_ret = 
1540: 62 69 6e 64 28 66 64 2c 20 61 64 64 72 2c 20 61  bind(fd, addr, a
1550: 64 64 72 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 62  ddr_len);..if (b
1560: 69 6e 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ind_ret < 0) {..
1570: 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72  .close(fd);....r
1580: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
1590: 6c 69 73 74 65 6e 5f 72 65 74 20 3d 20 6c 69 73  listen_ret = lis
15a0: 74 65 6e 28 66 64 2c 20 31 32 38 29 3b 0a 09 69  ten(fd, 128);..i
15b0: 66 20 28 6c 69 73 74 65 6e 5f 72 65 74 20 21 3d  f (listen_ret !=
15c0: 20 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64   0) {...close(fd
15d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
15e0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64  ;..}...return(fd
15f0: 29 3b 0a 7d 0a 0a 2f 2a 20 4c 6f 67 20 61 20 6d  );.}../* Log a m
1600: 65 73 73 61 67 65 20 2a 2f 0a 23 69 66 64 65 66  essage */.#ifdef
1610: 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a   FILED_DONT_LOG.
1620: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
1630: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69  logging_thread_i
1640: 6e 69 74 28 78 29 20 30 0a 23 20 20 64 65 66 69  nit(x) 0.#  defi
1650: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ne filed_log_msg
1660: 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f  _debug(x, ...) /
1670: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69  **/.#  define fi
1680: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 78 2c 20 2e  led_log_msg(x, .
1690: 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69  ..) /**/.#  defi
16a0: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ne filed_log_ent
16b0: 72 79 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  ry(x) /**/.#  de
16c0: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 69  fine filed_log_i
16d0: 70 28 78 2c 20 2e 2e 2e 29 20 4e 55 4c 4c 0a 23  p(x, ...) NULL.#
16e0: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
16f0: 6f 67 5f 6e 65 77 28 78 29 20 26 6c 6f 63 61 6c  og_new(x) &local
1700: 5f 64 75 6d 6d 79 5f 6c 6f 67 0a 23 20 20 64 65  _dummy_log.#  de
1710: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6f  fine filed_log_o
1720: 70 65 6e 28 78 29 20 73 74 64 6f 75 74 0a 23 65  pen(x) stdout.#e
1730: 6c 73 65 0a 23 20 20 69 66 64 65 66 20 46 49 4c  lse.#  ifdef FIL
1740: 45 44 5f 44 45 42 55 47 0a 23 20 20 20 20 64 65  ED_DEBUG.#    de
1750: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  fine filed_log_m
1760: 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29  sg_debug(x, ...)
1770: 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72   { fprintf(stder
1780: 72 2c 20 78 2c 20 5f 5f 56 41 5f 41 52 47 53 5f  r, x, __VA_ARGS_
1790: 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65  _); fprintf(stde
17a0: 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75 73  rr, "\n"); fflus
17b0: 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20 20  h(stderr); }.#  
17c0: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
17d0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64   filed_log_msg_d
17e0: 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a  ebug(x, ...) /**
17f0: 2f 0a 23 20 20 65 6e 64 69 66 0a 0a 2f 2a 20 49  /.#  endif../* I
1800: 6e 69 74 69 61 6c 69 7a 65 20 6c 6f 67 67 69 6e  nitialize loggin
1810: 67 20 74 68 72 65 61 64 20 2a 2f 0a 73 74 61 74  g thread */.stat
1820: 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 6c  ic void *filed_l
1830: 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 28 76 6f  ogging_thread(vo
1840: 69 64 20 2a 61 72 67 5f 70 29 20 7b 0a 09 73 74  id *arg_p) {..st
1850: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69  ruct filed_loggi
1860: 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a  ng_thread_args *
1870: 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c  arg;..struct fil
1880: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 63 75  ed_log_entry *cu
1890: 72 72 2c 20 2a 70 72 65 76 3b 0a 09 63 6f 6e 73  rr, *prev;..cons
18a0: 74 20 63 68 61 72 20 2a 6d 65 74 68 6f 64 3b 0a  t char *method;.
18b0: 09 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 09 46 49  .time_t now;..FI
18c0: 4c 45 20 2a 66 70 3b 0a 0a 09 61 72 67 20 3d 20  LE *fp;...arg = 
18d0: 61 72 67 5f 70 3b 0a 0a 09 66 70 20 3d 20 61 72  arg_p;...fp = ar
18e0: 67 2d 3e 66 70 3b 0a 0a 09 77 68 69 6c 65 20 28  g->fp;...while (
18f0: 31 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  1) {...pthread_m
1900: 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64  utex_lock(&filed
1910: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
1920: 74 65 78 29 3b 0a 09 09 70 74 68 72 65 61 64 5f  tex);...pthread_
1930: 63 6f 6e 64 5f 77 61 69 74 28 26 66 69 6c 65 64  cond_wait(&filed
1940: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65  _log_msg_list_re
1950: 61 64 79 2c 20 26 66 69 6c 65 64 5f 6c 6f 67 5f  ady, &filed_log_
1960: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
1970: 0a 0a 09 09 63 75 72 72 20 3d 20 66 69 6c 65 64  ....curr = filed
1980: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09  _log_msg_list;..
1990: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  .filed_log_msg_l
19a0: 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 70  ist = NULL;....p
19b0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
19c0: 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d  ock(&filed_log_m
19d0: 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a  sg_list_mutex);.
19e0: 0a 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e 55  ...now = time(NU
19f0: 4c 4c 29 3b 0a 0a 09 09 70 72 65 76 20 3d 20 4e  LL);....prev = N
1a00: 55 4c 4c 3b 0a 09 09 66 6f 72 20 28 3b 20 63 75  ULL;...for (; cu
1a10: 72 72 3b 20 63 75 72 72 20 3d 20 63 75 72 72 2d  rr; curr = curr-
1a20: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 63 75 72  >_next) {....cur
1a30: 72 2d 3e 5f 70 72 65 76 20 3d 20 70 72 65 76 3b  r->_prev = prev;
1a40: 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75 72 72  .....prev = curr
1a50: 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72 20 3d 20  ;...}....curr = 
1a60: 70 72 65 76 3b 0a 09 09 77 68 69 6c 65 20 28 63  prev;...while (c
1a70: 75 72 72 29 20 7b 0a 09 09 09 73 77 69 74 63 68  urr) {....switch
1a80: 20 28 63 75 72 72 2d 3e 74 79 70 65 29 20 7b 0a   (curr->type) {.
1a90: 09 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f 4c  ....case FILED_L
1aa0: 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 3a  OG_TYPE_MESSAGE:
1ab0: 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28 66 70  ......fprintf(fp
1ac0: 2c 20 22 25 73 22 2c 20 63 75 72 72 2d 3e 62 75  , "%s", curr->bu
1ad0: 66 66 65 72 29 3b 0a 0a 09 09 09 09 09 62 72 65  ffer);.......bre
1ae0: 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 46 49 4c  ak;.....case FIL
1af0: 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41 4e  ED_LOG_TYPE_TRAN
1b00: 53 46 45 52 3a 0a 09 09 09 09 09 73 77 69 74 63  SFER:......switc
1b10: 68 20 28 63 75 72 72 2d 3e 6d 65 74 68 6f 64 29  h (curr->method)
1b20: 20 7b 0a 09 09 09 09 09 09 63 61 73 65 20 46 49   {.......case FI
1b30: 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48  LED_REQUEST_METH
1b40: 4f 44 5f 47 45 54 3a 0a 09 09 09 09 09 09 09 6d  OD_GET:........m
1b50: 65 74 68 6f 64 3d 22 47 45 54 22 3b 0a 09 09 09  ethod="GET";....
1b60: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1b70: 09 63 61 73 65 20 46 49 4c 45 44 5f 52 45 51 55  .case FILED_REQU
1b80: 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 3a  EST_METHOD_HEAD:
1b90: 0a 09 09 09 09 09 09 09 6d 65 74 68 6f 64 3d 22  ........method="
1ba0: 48 45 41 44 22 3b 0a 09 09 09 09 09 09 09 62 72  HEAD";........br
1bb0: 65 61 6b 3b 0a 09 09 09 09 09 09 64 65 66 61 75  eak;.......defau
1bc0: 6c 74 3a 0a 09 09 09 09 09 09 09 6d 65 74 68 6f  lt:........metho
1bd0: 64 3d 22 3c 75 6e 6b 6e 6f 77 6e 3e 22 3b 0a 09  d="<unknown>";..
1be0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bf0: 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
1c00: 72 72 2d 3e 65 6e 64 74 69 6d 65 20 3d 3d 20 28  rr->endtime == (
1c10: 28 74 69 6d 65 5f 74 29 20 2d 31 29 29 20 7b 0a  (time_t) -1)) {.
1c20: 09 09 09 09 09 09 63 75 72 72 2d 3e 65 6e 64 74  ......curr->endt
1c30: 69 6d 65 20 3d 20 6e 6f 77 3b 0a 09 09 09 09 09  ime = now;......
1c40: 7d 0a 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28  }.......fprintf(
1c50: 66 70 2c 20 22 54 52 41 4e 53 46 45 52 20 4d 45  fp, "TRANSFER ME
1c60: 54 48 4f 44 3d 25 73 20 50 41 54 48 3d 25 73 20  THOD=%s PATH=%s 
1c70: 53 52 43 3d 25 73 3a 25 69 20 54 49 4d 45 2e 53  SRC=%s:%i TIME.S
1c80: 54 41 52 54 3d 25 6c 6c 75 20 54 49 4d 45 2e 45  TART=%llu TIME.E
1c90: 4e 44 3d 25 6c 6c 75 20 43 4f 44 45 2e 56 41 4c  ND=%llu CODE.VAL
1ca0: 55 45 3d 25 75 20 43 4f 44 45 2e 52 45 41 53 4f  UE=%u CODE.REASO
1cb0: 4e 3d 25 73 20 52 45 51 55 45 53 54 2e 4f 46 46  N=%s REQUEST.OFF
1cc0: 53 45 54 3d 25 6c 6c 75 20 52 45 51 55 45 53 54  SET=%llu REQUEST
1cd0: 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 20 46 49 4c  .LENGTH=%llu FIL
1ce0: 45 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 20 54 52  E.LENGTH=%llu TR
1cf0: 41 4e 53 46 45 52 2e 4c 45 4e 47 54 48 3d 25 6c  ANSFER.LENGTH=%l
1d00: 6c 75 22 2c 0a 09 09 09 09 09 09 6d 65 74 68 6f  lu",.......metho
1d10: 64 2c 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 62  d,.......curr->b
1d20: 75 66 66 65 72 2c 0a 09 09 09 09 09 09 63 75 72  uffer,.......cur
1d30: 72 2d 3e 69 70 2c 20 63 75 72 72 2d 3e 70 6f 72  r->ip, curr->por
1d40: 74 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  t,.......(unsign
1d50: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
1d60: 72 72 2d 3e 73 74 61 72 74 74 69 6d 65 2c 0a 09  rr->starttime,..
1d70: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
1d80: 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e  ong long) curr->
1d90: 65 6e 64 74 69 6d 65 2c 0a 09 09 09 09 09 09 63  endtime,.......c
1da0: 75 72 72 2d 3e 68 74 74 70 5f 63 6f 64 65 2c 20  urr->http_code, 
1db0: 63 75 72 72 2d 3e 72 65 61 73 6f 6e 2c 0a 09 09  curr->reason,...
1dc0: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
1dd0: 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 72  ng long) curr->r
1de0: 65 71 5f 6f 66 66 73 65 74 2c 0a 09 09 09 09 09  eq_offset,......
1df0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
1e00: 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 72 65 71 5f  long) curr->req_
1e10: 6c 65 6e 67 74 68 2c 0a 09 09 09 09 09 09 28 75  length,.......(u
1e20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
1e30: 67 29 20 63 75 72 72 2d 3e 66 69 6c 65 5f 6c 65  g) curr->file_le
1e40: 6e 67 74 68 2c 0a 09 09 09 09 09 09 28 75 6e 73  ngth,.......(uns
1e50: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
1e60: 20 63 75 72 72 2d 3e 73 65 6e 74 5f 6c 65 6e 67   curr->sent_leng
1e70: 74 68 0a 09 09 09 09 09 29 3b 0a 0a 09 09 09 09  th......);......
1e80: 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 09  .break;....}....
1e90: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 54 48  fprintf(fp, " TH
1ea0: 52 45 41 44 3d 25 6c 6c 75 20 54 49 4d 45 3d 25  READ=%llu TIME=%
1eb0: 6c 6c 75 5c 6e 22 2c 0a 09 09 09 09 28 75 6e 73  llu\n",.....(uns
1ec0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
1ed0: 20 63 75 72 72 2d 3e 74 68 72 65 61 64 2c 0a 09   curr->thread,..
1ee0: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
1ef0: 67 20 6c 6f 6e 67 29 20 6e 6f 77 0a 09 09 09 29  g long) now....)
1f00: 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70 29 3b  ;....fflush(fp);
1f10: 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75 72 72  .....prev = curr
1f20: 3b 0a 09 09 09 63 75 72 72 20 3d 20 63 75 72 72  ;....curr = curr
1f30: 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09 09 66 72 65  ->_prev;.....fre
1f40: 65 28 70 72 65 76 29 3b 0a 09 09 7d 0a 09 7d 0a  e(prev);...}..}.
1f50: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
1f60: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1f70: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 73  iled_log_entry(s
1f80: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f  truct filed_log_
1f90: 65 6e 74 72 79 20 2a 65 6e 74 72 79 29 20 7b 0a  entry *entry) {.
1fa0: 09 65 6e 74 72 79 2d 3e 74 68 72 65 61 64 20 3d  .entry->thread =
1fb0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
1fc0: 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
1fd0: 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67  _lock(&filed_log
1fe0: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
1ff0: 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f 6e 65 78 74  ;...entry->_next
2000: 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67   = filed_log_msg
2010: 5f 6c 69 73 74 3b 0a 09 66 69 6c 65 64 5f 6c 6f  _list;..filed_lo
2020: 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 65 6e 74  g_msg_list = ent
2030: 72 79 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75  ry;...pthread_mu
2040: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65  tex_unlock(&file
2050: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
2060: 75 74 65 78 29 3b 0a 0a 09 70 74 68 72 65 61 64  utex);...pthread
2070: 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26 66 69  _cond_signal(&fi
2080: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
2090: 5f 72 65 61 64 79 29 3b 0a 0a 09 72 65 74 75 72  _ready);...retur
20a0: 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  n;.}..static str
20b0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
20c0: 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6e  try *filed_log_n
20d0: 65 77 28 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ew(int initializ
20e0: 65 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c  e) {..struct fil
20f0: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 72 65  ed_log_entry *re
2100: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
2110: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
2120: 72 65 74 76 61 6c 29 29 3b 0a 0a 09 69 66 20 28  retval));...if (
2130: 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 09  initialize) {...
2140: 72 65 74 76 61 6c 2d 3e 62 75 66 66 65 72 5b 30  retval->buffer[0
2150: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65 74 76  ] = '\0';...retv
2160: 61 6c 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20  al->http_code = 
2170: 2d 31 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 73 74  -1;...retval->st
2180: 61 72 74 74 69 6d 65 20 3d 20 30 3b 0a 09 09 72  arttime = 0;...r
2190: 65 74 76 61 6c 2d 3e 65 6e 64 74 69 6d 65 20 3d  etval->endtime =
21a0: 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65   0;...retval->re
21b0: 71 5f 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09 09  q_offset = 0;...
21c0: 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6c 65 6e 67  retval->req_leng
21d0: 74 68 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c  th = 0;...retval
21e0: 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 20 3d 20  ->sent_length = 
21f0: 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 66 69 6c  0;...retval->fil
2200: 65 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09  e_length = 0;...
2210: 72 65 74 76 61 6c 2d 3e 69 70 5b 30 5d 20 3d 20  retval->ip[0] = 
2220: 27 5c 30 27 3b 0a 09 09 72 65 74 76 61 6c 2d 3e  '\0';...retval->
2230: 70 6f 72 74 20 3d 20 2d 31 3b 0a 09 09 72 65 74  port = -1;...ret
2240: 76 61 6c 2d 3e 6d 65 74 68 6f 64 20 3d 20 2d 31  val->method = -1
2250: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
2260: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
2270: 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f   void filed_log_
2280: 6d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  msg(const char *
2290: 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09 73 74 72  fmt, ...) {..str
22a0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
22b0: 74 72 79 20 2a 65 6e 74 72 79 3b 0a 09 76 61 5f  try *entry;..va_
22c0: 6c 69 73 74 20 61 72 67 73 3b 0a 0a 09 65 6e 74  list args;...ent
22d0: 72 79 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e  ry = filed_log_n
22e0: 65 77 28 30 29 3b 0a 0a 09 76 61 5f 73 74 61 72  ew(0);...va_star
22f0: 74 28 61 72 67 73 2c 20 66 6d 74 29 3b 0a 0a 09  t(args, fmt);...
2300: 76 73 6e 70 72 69 6e 74 66 28 65 6e 74 72 79 2d  vsnprintf(entry-
2310: 3e 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28  >buffer, sizeof(
2320: 65 6e 74 72 79 2d 3e 62 75 66 66 65 72 29 2c 20  entry->buffer), 
2330: 66 6d 74 2c 20 61 72 67 73 29 3b 0a 0a 09 76 61  fmt, args);...va
2340: 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a 09 65 6e  _end(args);...en
2350: 74 72 79 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45  try->type = FILE
2360: 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41  D_LOG_TYPE_MESSA
2370: 47 45 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  GE;...filed_log_
2380: 65 6e 74 72 79 28 65 6e 74 72 79 29 3b 0a 0a 09  entry(entry);...
2390: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
23a0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69  c const char *fi
23b0: 6c 65 64 5f 6c 6f 67 5f 69 70 28 73 74 72 75 63  led_log_ip(struc
23c0: 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64 72  t sockaddr *addr
23d0: 2c 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  , char *buffer, 
23e0: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 6c 65 6e  size_t bufferlen
23f0: 29 20 7b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b  ) {..struct sock
2400: 61 64 64 72 5f 69 6e 20 2a 61 64 64 72 5f 76 34  addr_in *addr_v4
2410: 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ;..struct sockad
2420: 64 72 5f 69 6e 36 20 2a 61 64 64 72 5f 76 36 3b  dr_in6 *addr_v6;
2430: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65  ..const char *re
2440: 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 61  tval = NULL;...a
2450: 64 64 72 5f 76 36 20 3d 20 28 73 74 72 75 63 74  ddr_v6 = (struct
2460: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29   sockaddr_in6 *)
2470: 20 61 64 64 72 3b 0a 0a 09 73 77 69 74 63 68 20   addr;...switch 
2480: 28 61 64 64 72 5f 76 36 2d 3e 73 69 6e 36 5f 66  (addr_v6->sin6_f
2490: 61 6d 69 6c 79 29 20 7b 0a 09 09 63 61 73 65 20  amily) {...case 
24a0: 41 46 5f 49 4e 45 54 3a 0a 09 09 09 61 64 64 72  AF_INET:....addr
24b0: 5f 76 34 20 3d 20 28 73 74 72 75 63 74 20 73 6f  _v4 = (struct so
24c0: 63 6b 61 64 64 72 5f 69 6e 20 2a 29 20 61 64 64  ckaddr_in *) add
24d0: 72 3b 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 69  r;....retval = i
24e0: 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54  net_ntop(AF_INET
24f0: 2c 20 26 61 64 64 72 5f 76 34 2d 3e 73 69 6e 5f  , &addr_v4->sin_
2500: 61 64 64 72 2c 20 62 75 66 66 65 72 2c 20 62 75  addr, buffer, bu
2510: 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09 62 72 65  fferlen);....bre
2520: 61 6b 3b 0a 09 09 63 61 73 65 20 41 46 5f 49 4e  ak;...case AF_IN
2530: 45 54 36 3a 0a 09 09 09 72 65 74 76 61 6c 20 3d  ET6:....retval =
2540: 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e   inet_ntop(AF_IN
2550: 45 54 36 2c 20 26 61 64 64 72 5f 76 36 2d 3e 73  ET6, &addr_v6->s
2560: 69 6e 36 5f 61 64 64 72 2c 20 62 75 66 66 65 72  in6_addr, buffer
2570: 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09  , bufferlen);...
2580: 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74  .break;..}...ret
2590: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
25a0: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 69 6c  static FILE *fil
25b0: 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73  ed_log_open(cons
25c0: 74 20 63 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a  t char *file) {.
25d0: 09 46 49 4c 45 20 2a 72 65 74 76 61 6c 3b 0a 0a  .FILE *retval;..
25e0: 09 69 66 20 28 73 74 72 63 6d 70 28 66 69 6c 65  .if (strcmp(file
25f0: 2c 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b 0a 09  , "-") == 0) {..
2600: 09 72 65 74 76 61 6c 20 3d 20 73 74 64 6f 75 74  .retval = stdout
2610: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 66 69  ;..} else if (fi
2620: 6c 65 5b 30 5d 20 3d 3d 20 27 7c 27 29 20 7b 0a  le[0] == '|') {.
2630: 09 09 66 69 6c 65 2b 2b 3b 0a 09 09 72 65 74 76  ..file++;...retv
2640: 61 6c 20 3d 20 70 6f 70 65 6e 28 66 69 6c 65 2c  al = popen(file,
2650: 20 22 77 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b   "w");..} else {
2660: 0a 09 09 72 65 74 76 61 6c 20 3d 20 66 6f 70 65  ...retval = fope
2670: 6e 28 66 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09  n(file, "a+");..
2680: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
2690: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  l);.}..static in
26a0: 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  t filed_logging_
26b0: 74 68 72 65 61 64 5f 69 6e 69 74 28 46 49 4c 45  thread_init(FILE
26c0: 20 2a 6c 6f 67 66 70 29 20 7b 0a 09 73 74 72 75   *logfp) {..stru
26d0: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  ct filed_logging
26e0: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72  _thread_args *ar
26f0: 67 73 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74  gs;..pthread_t t
2700: 68 72 65 61 64 5f 69 64 3b 0a 0a 09 61 72 67 73  hread_id;...args
2710: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
2720: 28 2a 61 72 67 73 29 29 3b 0a 09 61 72 67 73 2d  (*args));..args-
2730: 3e 66 70 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66  >fp = logfp;...f
2740: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
2750: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72  t = NULL;...pthr
2760: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26  ead_mutex_init(&
2770: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
2780: 73 74 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  st_mutex, NULL);
2790: 0a 0a 09 70 74 68 72 65 61 64 5f 63 72 65 61 74  ...pthread_creat
27a0: 65 28 26 74 68 72 65 61 64 5f 69 64 2c 20 4e 55  e(&thread_id, NU
27b0: 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  LL, filed_loggin
27c0: 67 5f 74 68 72 65 61 64 2c 20 61 72 67 73 29 3b  g_thread, args);
27d0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
27e0: 28 22 53 54 41 52 54 22 29 3b 0a 0a 09 72 65 74  ("START");...ret
27f0: 75 72 6e 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66  urn(0);.}.#endif
2800: 0a 0a 2f 2a 20 46 6f 72 6d 61 74 20 74 69 6d 65  ../* Format time
2810: 20 70 65 72 20 52 46 43 32 36 31 36 20 2a 2f 0a   per RFC2616 */.
2820: 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 69 6c  static char *fil
2830: 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28 63  ed_format_time(c
2840: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
2850: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
2860: 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 74 69 6d  const time_t tim
2870: 65 69 6e 66 6f 29 20 7b 0a 09 73 74 72 75 63 74  einfo) {..struct
2880: 20 74 6d 20 74 69 6d 65 69 6e 66 6f 5f 74 6d 2c   tm timeinfo_tm,
2890: 20 2a 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 3b   *timeinfo_tm_p;
28a0: 0a 0a 09 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70  ...timeinfo_tm_p
28b0: 20 3d 20 67 6d 74 69 6d 65 5f 72 28 26 74 69 6d   = gmtime_r(&tim
28c0: 65 69 6e 66 6f 2c 20 26 74 69 6d 65 69 6e 66 6f  einfo, &timeinfo
28d0: 5f 74 6d 29 3b 0a 09 69 66 20 28 74 69 6d 65 69  _tm);..if (timei
28e0: 6e 66 6f 5f 74 6d 5f 70 20 3d 3d 20 4e 55 4c 4c  nfo_tm_p == NULL
28f0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 22 75 6e  ) {...return("un
2900: 6b 6e 6f 77 6e 22 29 3b 0a 09 7d 0a 0a 09 62 75  known");..}...bu
2910: 66 66 65 72 5b 62 75 66 66 65 72 5f 6c 65 6e 20  ffer[buffer_len 
2920: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 62 75  - 1] = '\0';..bu
2930: 66 66 65 72 5f 6c 65 6e 20 3d 20 73 74 72 66 74  ffer_len = strft
2940: 69 6d 65 28 62 75 66 66 65 72 2c 20 62 75 66 66  ime(buffer, buff
2950: 65 72 5f 6c 65 6e 20 2d 20 31 2c 20 22 25 61 2c  er_len - 1, "%a,
2960: 20 25 64 20 25 62 20 25 59 20 25 48 3a 25 4d 3a   %d %b %Y %H:%M:
2970: 25 53 20 47 4d 54 22 2c 20 74 69 6d 65 69 6e 66  %S GMT", timeinf
2980: 6f 5f 74 6d 5f 70 29 3b 0a 0a 09 72 65 74 75 72  o_tm_p);...retur
2990: 6e 28 62 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a  n(buffer);.}../*
29a0: 20 68 61 73 68 20 2a 2f 0a 73 74 61 74 69 63 20   hash */.static 
29b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c  unsigned int fil
29c0: 65 64 5f 68 61 73 68 28 63 6f 6e 73 74 20 75 6e  ed_hash(const un
29d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 76 61 6c  signed char *val
29e0: 75 65 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ue, unsigned int
29f0: 20 6d 6f 64 75 6c 75 73 29 20 7b 0a 09 75 6e 73   modulus) {..uns
2a00: 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 2c  igned char curr,
2a10: 20 70 72 65 76 3b 0a 09 69 6e 74 20 64 69 66 66   prev;..int diff
2a20: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
2a30: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
2a40: 20 3d 20 6d 6f 64 75 6c 75 73 20 2d 20 31 3b 0a   = modulus - 1;.
2a50: 09 70 72 65 76 20 3d 20 6d 6f 64 75 6c 75 73 20  .prev = modulus 
2a60: 25 20 32 35 35 3b 0a 0a 09 77 68 69 6c 65 20 28  % 255;...while (
2a70: 28 63 75 72 72 20 3d 20 2a 76 61 6c 75 65 29 29  (curr = *value))
2a80: 20 7b 0a 09 09 69 66 20 28 63 75 72 72 20 3c 20   {...if (curr < 
2a90: 33 32 29 20 7b 0a 09 09 09 63 75 72 72 20 3d 20  32) {....curr = 
2aa0: 32 35 35 20 2d 20 63 75 72 72 3b 0a 09 09 7d 20  255 - curr;...} 
2ab0: 65 6c 73 65 20 7b 0a 09 09 09 63 75 72 72 20 2d  else {....curr -
2ac0: 3d 20 33 32 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  = 32;...}....if 
2ad0: 28 70 72 65 76 20 3c 20 63 75 72 72 29 20 7b 0a  (prev < curr) {.
2ae0: 09 09 09 64 69 66 66 20 3d 20 63 75 72 72 20 2d  ...diff = curr -
2af0: 20 70 72 65 76 3b 0a 09 09 7d 20 65 6c 73 65 20   prev;...} else 
2b00: 7b 0a 09 09 09 64 69 66 66 20 3d 20 70 72 65 76  {....diff = prev
2b10: 20 2d 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09 09   - curr;...}....
2b20: 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 0a 09 09  prev = curr;....
2b30: 72 65 74 76 61 6c 20 3c 3c 3d 20 33 3b 0a 09 09  retval <<= 3;...
2b40: 72 65 74 76 61 6c 20 26 3d 20 30 78 46 46 46 46  retval &= 0xFFFF
2b50: 46 46 46 46 4c 55 3b 0a 09 09 72 65 74 76 61 6c  FFFFLU;...retval
2b60: 20 5e 3d 20 64 69 66 66 3b 0a 0a 09 09 76 61 6c   ^= diff;....val
2b70: 75 65 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ue++;..}...retva
2b80: 6c 20 3d 20 72 65 74 76 61 6c 20 25 20 6d 6f 64  l = retval % mod
2b90: 75 6c 75 73 3b 0a 0a 09 72 65 74 75 72 6e 28 72  ulus;...return(r
2ba0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46 69  etval);.}../* Fi
2bb0: 6e 64 20 61 20 6d 69 6d 65 2d 74 79 70 65 20 62  nd a mime-type b
2bc0: 61 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  ased on the file
2bd0: 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  name */.static c
2be0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 64  onst char *filed
2bf0: 5f 64 65 74 65 72 6d 69 6e 65 5f 6d 69 6d 65 74  _determine_mimet
2c00: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
2c10: 70 61 74 68 29 20 7b 0a 09 63 6f 6e 73 74 20 63  path) {..const c
2c20: 68 61 72 20 2a 70 3b 0a 0a 09 70 20 3d 20 73 74  har *p;...p = st
2c30: 72 72 63 68 72 28 70 61 74 68 2c 20 27 2e 27 29  rrchr(path, '.')
2c40: 3b 0a 09 69 66 20 28 70 20 3d 3d 20 4e 55 4c 4c  ;..if (p == NULL
2c50: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 46 49 4c  ) {...return(FIL
2c60: 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 29  ED_DEFAULT_TYPE)
2c70: 3b 0a 09 7d 0a 0a 09 70 2b 2b 3b 0a 09 69 66 20  ;..}...p++;..if 
2c80: 28 2a 70 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  (*p == '\0') {..
2c90: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44 45  .return(FILED_DE
2ca0: 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d 0a  FAULT_TYPE);..}.
2cb0: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
2cc0: 64 65 62 75 67 28 22 4c 6f 6f 6b 69 6e 67 20 75  debug("Looking u
2cd0: 70 20 4d 49 4d 45 20 74 79 70 65 20 66 6f 72 20  p MIME type for 
2ce0: 25 73 20 28 68 61 73 68 20 3d 20 25 6c 6c 75 29  %s (hash = %llu)
2cf0: 22 2c 20 70 2c 20 28 75 6e 73 69 67 6e 65 64 20  ", p, (unsigned 
2d00: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 64  long long) filed
2d10: 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73  _hash((const uns
2d20: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70 2c  igned char *) p,
2d30: 20 31 36 37 37 37 32 35 39 29 29 3b 0a 0a 23 69   16777259));..#i
2d40: 6e 63 6c 75 64 65 20 22 66 69 6c 65 64 2d 6d 69  nclude "filed-mi
2d50: 6d 65 2d 74 79 70 65 73 2e 68 22 0a 0a 09 72 65  me-types.h"...re
2d60: 74 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55  turn(FILED_DEFAU
2d70: 4c 54 5f 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 20  LT_TYPE);.}../* 
2d80: 47 65 6e 65 72 61 74 65 20 61 20 75 6e 69 71 75  Generate a uniqu
2d90: 65 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  e identifier */.
2da0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
2db0: 64 5f 67 65 6e 65 72 61 74 65 5f 65 74 61 67 28  d_generate_etag(
2dc0: 63 68 61 72 20 2a 65 74 61 67 2c 20 73 69 7a 65  char *etag, size
2dd0: 5f 74 20 6c 65 6e 67 74 68 29 20 7b 0a 09 73 6e  _t length) {..sn
2de0: 70 72 69 6e 74 66 28 65 74 61 67 2c 20 6c 65 6e  printf(etag, len
2df0: 67 74 68 2c 20 22 25 6c 6c 78 2d 25 6c 6c 78 25  gth, "%llx-%llx%
2e00: 6c 6c 78 25 6c 6c 78 25 6c 6c 78 22 2c 0a 09 09  llx%llx%llx",...
2e10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
2e20: 6f 6e 67 29 20 74 69 6d 65 28 4e 55 4c 4c 29 2c  ong) time(NULL),
2e30: 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
2e40: 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29  g long) random()
2e50: 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ,...(unsigned lo
2e60: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28  ng long) random(
2e70: 29 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ),...(unsigned l
2e80: 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d  ong long) random
2e90: 28 29 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20  (),...(unsigned 
2ea0: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f  long long) rando
2eb0: 6d 28 29 0a 09 29 3b 0a 7d 0a 0a 2f 2a 20 4f 70  m()..);.}../* Op
2ec0: 65 6e 20 61 20 66 69 6c 65 20 61 6e 64 20 72 65  en a file and re
2ed0: 74 75 72 6e 20 66 69 6c 65 20 69 6e 66 6f 72 6d  turn file inform
2ee0: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
2ef0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c  struct filed_fil
2f00: 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 6f 70 65  einfo *filed_ope
2f10: 6e 5f 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61  n_file(const cha
2f20: 72 20 2a 70 61 74 68 2c 20 73 74 72 75 63 74 20  r *path, struct 
2f30: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a  filed_fileinfo *
2f40: 62 75 66 66 65 72 29 20 7b 0a 09 73 74 72 75 63  buffer) {..struc
2f50: 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  t filed_fileinfo
2f60: 20 2a 63 61 63 68 65 3b 0a 09 63 6f 6e 73 74 20   *cache;..const 
2f70: 63 68 61 72 20 2a 6f 70 65 6e 5f 70 61 74 68 3b  char *open_path;
2f80: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63  ..unsigned int c
2f90: 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f 74  ache_idx;..off_t
2fa0: 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a   len;..int fd;..
2fb0: 09 63 61 63 68 65 5f 69 64 78 20 3d 20 66 69 6c  .cache_idx = fil
2fc0: 65 64 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75  ed_hash((const u
2fd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
2fe0: 70 61 74 68 2c 20 66 69 6c 65 64 5f 66 69 6c 65  path, filed_file
2ff0: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
3000: 65 29 3b 0a 0a 09 63 61 63 68 65 20 3d 20 26 66  e);...cache = &f
3010: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
3020: 63 61 63 68 65 5b 63 61 63 68 65 5f 69 64 78 5d  cache[cache_idx]
3030: 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ;...filed_log_ms
3040: 67 5f 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67  g_debug("Locking
3050: 20 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20   mutex for idx: 
3060: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
3070: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29  long) cache_idx)
3080: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ;...pthread_mute
3090: 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  x_lock(&cache->m
30a0: 75 74 65 78 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c  utex);...filed_l
30b0: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f  og_msg_debug("Co
30c0: 6d 70 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20  mpleted locking 
30d0: 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25  mutex for idx: %
30e0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
30f0: 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b  ong) cache_idx);
3100: 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 70 61  ...if (strcmp(pa
3110: 74 68 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 29  th, cache->path)
3120: 20 21 3d 20 30 29 20 7b 0a 09 09 66 69 6c 65 64   != 0) {...filed
3130: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
3140: 43 61 63 68 65 20 6d 69 73 73 20 66 6f 72 20 69  Cache miss for i
3150: 64 78 3a 20 25 6c 75 3a 20 4f 4c 44 20 5c 22 25  dx: %lu: OLD \"%
3160: 73 5c 22 2c 20 4e 45 57 20 5c 22 25 73 5c 22 22  s\", NEW \"%s\""
3170: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
3180: 29 20 63 61 63 68 65 5f 69 64 78 2c 20 63 61 63  ) cache_idx, cac
3190: 68 65 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b  he->path, path);
31a0: 0a 0a 09 09 2f 2a 20 46 6f 72 20 72 65 71 75 65  ..../* For reque
31b0: 73 74 73 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  sts for the root
31c0: 20 64 69 72 65 63 74 6f 72 79 2c 20 73 65 72 76   directory, serv
31d0: 65 20 6f 75 74 20 69 6e 64 65 78 2e 68 74 6d 6c  e out index.html
31e0: 20 2a 2f 0a 09 09 69 66 20 28 70 61 74 68 5b 30   */...if (path[0
31f0: 5d 20 3d 3d 20 27 5c 30 27 20 7c 7c 20 28 70 61  ] == '\0' || (pa
3200: 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 20 26 26 20  th[0] == '/' && 
3210: 70 61 74 68 5b 31 5d 20 3d 3d 20 27 5c 30 27 29  path[1] == '\0')
3220: 29 20 7b 0a 09 09 09 6f 70 65 6e 5f 70 61 74 68  ) {....open_path
3230: 20 3d 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22   = "/index.html"
3240: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
3250: 6f 70 65 6e 5f 70 61 74 68 20 3d 20 70 61 74 68  open_path = path
3260: 3b 0a 09 09 7d 0a 0a 09 09 66 64 20 3d 20 6f 70  ;...}....fd = op
3270: 65 6e 28 6f 70 65 6e 5f 70 61 74 68 2c 20 4f 5f  en(open_path, O_
3280: 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52 47 45  RDONLY | O_LARGE
3290: 46 49 4c 45 29 3b 0a 09 09 69 66 20 28 66 64 20  FILE);...if (fd 
32a0: 3c 20 30 29 20 7b 0a 09 09 09 70 74 68 72 65 61  < 0) {....pthrea
32b0: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
32c0: 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  cache->mutex);..
32d0: 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
32e0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 68  ...}....if (cach
32f0: 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a 09 09  e->fd >= 0) {...
3300: 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66 64  .close(cache->fd
3310: 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20 3d 20  );...}....len = 
3320: 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53 45 45  lseek(fd, 0, SEE
3330: 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65 6b 28  K_END);...lseek(
3340: 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  fd, 0, SEEK_SET)
3350: 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64 20 3d  ;....cache->fd =
3360: 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e 6c 65   fd;...cache->le
3370: 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73 74 72 63 70  n = len;...strcp
3380: 79 28 63 61 63 68 65 2d 3e 70 61 74 68 2c 20 70  y(cache->path, p
3390: 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d 3e 74  ath);...cache->t
33a0: 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65 74 65  ype = filed_dete
33b0: 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28 6f  rmine_mimetype(o
33c0: 70 65 6e 5f 70 61 74 68 29 3b 0a 09 09 66 69 6c  pen_path);...fil
33d0: 65 64 5f 67 65 6e 65 72 61 74 65 5f 65 74 61 67  ed_generate_etag
33e0: 28 63 61 63 68 65 2d 3e 65 74 61 67 2c 20 73 69  (cache->etag, si
33f0: 7a 65 6f 66 28 63 61 63 68 65 2d 3e 65 74 61 67  zeof(cache->etag
3400: 29 29 3b 0a 0a 09 09 2f 2a 20 58 58 58 3a 54 4f  ));..../* XXX:TO
3410: 44 4f 3a 20 44 65 74 65 72 6d 69 6e 65 20 2a 2f  DO: Determine */
3420: 0a 09 09 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  ...cache->lastmo
3430: 64 20 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74  d = filed_format
3440: 5f 74 69 6d 65 28 63 61 63 68 65 2d 3e 6c 61 73  _time(cache->las
3450: 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 63  tmod_b, sizeof(c
3460: 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29  ache->lastmod_b)
3470: 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 33  , time(NULL) - 3
3480: 30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0);..} else {...
3490: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
34a0: 62 75 67 28 22 43 61 63 68 65 20 68 69 74 20 66  bug("Cache hit f
34b0: 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20 50 41 54  or idx: %lu: PAT
34c0: 48 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73 69  H \"%s\"", (unsi
34d0: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65  gned long) cache
34e0: 5f 69 64 78 2c 20 70 61 74 68 29 3b 0a 09 7d 0a  _idx, path);..}.
34f0: 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76 65  ../*.. * We have
3500: 20 74 6f 20 6d 61 6b 65 20 61 20 64 75 70 6c 69   to make a dupli
3510: 63 61 74 65 20 46 44 2c 20 62 65 63 61 75 73 65  cate FD, because
3520: 20 6f 6e 63 65 20 77 65 20 72 65 6c 65 61 73 65   once we release
3530: 20 74 68 65 20 63 61 63 68 65 0a 09 20 2a 20 6d   the cache.. * m
3540: 75 74 65 78 2c 20 74 68 65 20 66 69 6c 65 20 64  utex, the file d
3550: 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 62 65  escriptor may be
3560: 20 63 6c 6f 73 65 64 0a 09 20 2a 2f 0a 09 66 64   closed.. */..fd
3570: 20 3d 20 64 75 70 28 63 61 63 68 65 2d 3e 66 64   = dup(cache->fd
3580: 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20  );..if (fd < 0) 
3590: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
35a0: 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d  x_unlock(&cache-
35b0: 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 72 65 74 75  >mutex);....retu
35c0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62  rn(NULL);..}...b
35d0: 75 66 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  uffer->fd = fd;.
35e0: 09 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63  .buffer->len = c
35f0: 61 63 68 65 2d 3e 6c 65 6e 3b 0a 09 62 75 66 66  ache->len;..buff
3600: 65 72 2d 3e 74 79 70 65 20 3d 20 63 61 63 68 65  er->type = cache
3610: 2d 3e 74 79 70 65 3b 0a 09 6d 65 6d 63 70 79 28  ->type;..memcpy(
3620: 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f  buffer->lastmod_
3630: 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  b, cache->lastmo
3640: 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62 75 66 66  d_b, sizeof(buff
3650: 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29 3b  er->lastmod_b));
3660: 0a 09 6d 65 6d 63 70 79 28 62 75 66 66 65 72 2d  ..memcpy(buffer-
3670: 3e 65 74 61 67 2c 20 63 61 63 68 65 2d 3e 65 74  >etag, cache->et
3680: 61 67 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65  ag, sizeof(buffe
3690: 72 2d 3e 65 74 61 67 29 29 3b 0a 09 62 75 66 66  r->etag));..buff
36a0: 65 72 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 62 75  er->lastmod = bu
36b0: 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 20  ffer->lastmod_b 
36c0: 2b 20 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  + (cache->lastmo
36d0: 64 20 2d 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d  d - cache->lastm
36e0: 6f 64 5f 62 29 3b 0a 0a 09 70 74 68 72 65 61 64  od_b);...pthread
36f0: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63  _mutex_unlock(&c
3700: 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09  ache->mutex);...
3710: 72 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b 0a  return(buffer);.
3720: 7d 0a 0a 2f 2a 20 50 72 6f 63 65 73 73 20 61 6e  }../* Process an
3730: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 61 6e   HTTP request an
3740: 64 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 74  d return the pat
3750: 68 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 73  h requested */.s
3760: 74 61 74 69 63 20 73 74 72 75 63 74 20 66 69 6c  tatic struct fil
3770: 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20  ed_http_request 
3780: 2a 66 69 6c 65 64 5f 67 65 74 5f 68 74 74 70 5f  *filed_get_http_
3790: 72 65 71 75 65 73 74 28 46 49 4c 45 20 2a 66 70  request(FILE *fp
37a0: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68  , struct filed_h
37b0: 74 74 70 5f 72 65 71 75 65 73 74 20 2a 62 75 66  ttp_request *buf
37c0: 66 65 72 5f 73 74 2c 20 73 74 72 75 63 74 20 66  fer_st, struct f
37d0: 69 6c 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70  iled_options *op
37e0: 74 69 6f 6e 73 29 20 7b 0a 09 63 68 61 72 20 2a  tions) {..char *
37f0: 6d 65 74 68 6f 64 2c 20 2a 70 61 74 68 3b 0a 09  method, *path;..
3800: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 2a 77  char *buffer, *w
3810: 6f 72 6b 62 75 66 66 65 72 2c 20 2a 77 6f 72 6b  orkbuffer, *work
3820: 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 09 63 68  buffer_next;..ch
3830: 61 72 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09  ar *fgets_ret;..
3840: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
3850: 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65 5f  n;..off_t range_
3860: 73 74 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e 64  start, range_end
3870: 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  , range_length;.
3880: 09 69 6e 74 20 72 61 6e 67 65 5f 72 65 71 75 65  .int range_reque
3890: 73 74 3b 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74  st;..int snprint
38a0: 66 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a 0a  f_ret;..int i;..
38b0: 09 2f 2a 20 53 65 74 20 74 6f 20 64 65 66 61 75  ./* Set to defau
38c0: 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a 09 72 61  lt values */..ra
38d0: 6e 67 65 5f 73 74 61 72 74 20 3d 20 30 3b 0a 09  nge_start = 0;..
38e0: 72 61 6e 67 65 5f 65 6e 64 20 20 20 3d 20 30 3b  range_end   = 0;
38f0: 0a 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20  ..range_request 
3900: 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 6c 65 6e 67  = 0;..range_leng
3910: 74 68 20 3d 20 2d 31 3b 0a 09 62 75 66 66 65 72  th = -1;..buffer
3920: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73  _st->headers.hos
3930: 74 2e 70 72 65 73 65 6e 74 20 3d 20 30 3b 0a 0a  t.present = 0;..
3940: 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  .buffer = buffer
3950: 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 62 75  _st->tmpbuf;..bu
3960: 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  ffer_len = sizeo
3970: 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70  f(buffer_st->tmp
3980: 62 75 66 29 3b 0a 0a 09 66 67 65 74 73 5f 72 65  buf);...fgets_re
3990: 74 20 3d 20 66 67 65 74 73 28 62 75 66 66 65 72  t = fgets(buffer
39a0: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70  , buffer_len, fp
39b0: 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f 72 65  );..if (fgets_re
39c0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
39d0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
39e0: 0a 09 6d 65 74 68 6f 64 20 3d 20 62 75 66 66 65  ..method = buffe
39f0: 72 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 73 74  r;...buffer = st
3a00: 72 63 68 72 28 62 75 66 66 65 72 2c 20 27 20 27  rchr(buffer, ' '
3a10: 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20 3d  );..if (buffer =
3a20: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
3a30: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a  rn(NULL);..}...*
3a40: 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09  buffer = '\0';..
3a50: 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 70 61 74 68  buffer++;...path
3a60: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 2f 2a 20   = buffer;.../* 
3a70: 54 65 72 6d 69 6e 61 74 65 20 70 61 74 68 20 63  Terminate path c
3a80: 6f 6d 70 6f 6e 65 6e 74 20 2a 2f 0a 09 62 75 66  omponent */..buf
3a90: 66 65 72 20 3d 20 73 74 72 70 62 72 6b 28 70 61  fer = strpbrk(pa
3aa0: 74 68 2c 20 22 5c 72 5c 6e 20 22 29 3b 0a 09 69  th, "\r\n ");..i
3ab0: 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55 4c  f (buffer != NUL
3ac0: 4c 29 20 7b 0a 09 09 2a 62 75 66 66 65 72 20 3d  L) {...*buffer =
3ad0: 20 27 5c 30 27 3b 0a 09 09 62 75 66 66 65 72 2b   '\0';...buffer+
3ae0: 2b 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 65 20 6f 6e  +;..}.../* We on
3af0: 6c 79 20 68 61 6e 64 6c 65 20 74 68 65 20 22 47  ly handle the "G
3b00: 45 54 22 20 61 6e 64 20 22 48 45 41 44 27 20 6d  ET" and "HEAD' m
3b10: 65 74 68 6f 64 73 20 2a 2f 0a 09 69 66 20 28 73  ethods */..if (s
3b20: 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68 6f 64  trcasecmp(method
3b30: 2c 20 22 68 65 61 64 22 29 20 21 3d 20 30 29 20  , "head") != 0) 
3b40: 7b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  {...if (strcasec
3b50: 6d 70 28 6d 65 74 68 6f 64 2c 20 22 67 65 74 22  mp(method, "get"
3b60: 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  ) != 0) {....ret
3b70: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a  urn(NULL);...}..
3b80: 09 09 2f 2a 20 47 45 54 20 72 65 71 75 65 73 74  ../* GET request
3b90: 20 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74 2d   */...buffer_st-
3ba0: 3e 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f  >method = FILED_
3bb0: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47  REQUEST_METHOD_G
3bc0: 45 54 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ET;..} else {...
3bd0: 2f 2a 20 48 45 41 44 20 72 65 71 75 65 73 74 20  /* HEAD request 
3be0: 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  */...buffer_st->
3bf0: 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f 52  method = FILED_R
3c00: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45  EQUEST_METHOD_HE
3c10: 41 44 3b 0a 09 7d 0a 0a 09 2f 2a 20 4e 6f 74 65  AD;..}.../* Note
3c20: 20 70 61 74 68 20 2a 2f 0a 09 73 74 72 63 70 79   path */..strcpy
3c30: 28 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68  (buffer_st->path
3c40: 2c 20 70 61 74 68 29 3b 0a 0a 09 2f 2a 20 52 65  , path);.../* Re
3c50: 73 65 74 20 62 75 66 66 65 72 20 66 6f 72 20 6c  set buffer for l
3c60: 61 74 65 72 20 75 73 65 20 2a 2f 0a 09 62 75 66  ater use */..buf
3c70: 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d  fer = buffer_st-
3c80: 3e 74 6d 70 62 75 66 3b 0a 0a 09 66 6f 72 20 28  >tmpbuf;...for (
3c90: 69 20 3d 20 30 3b 20 69 20 3c 20 31 30 30 3b 20  i = 0; i < 100; 
3ca0: 69 2b 2b 29 20 7b 0a 09 09 66 67 65 74 73 5f 72  i++) {...fgets_r
3cb0: 65 74 20 3d 20 66 67 65 74 73 28 62 75 66 66 65  et = fgets(buffe
3cc0: 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66  r, buffer_len, f
3cd0: 70 29 3b 0a 09 09 69 66 20 28 66 67 65 74 73 5f  p);...if (fgets_
3ce0: 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ret == NULL) {..
3cf0: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
3d00: 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28  if (strncasecmp(
3d10: 62 75 66 66 65 72 2c 20 22 52 61 6e 67 65 3a 20  buffer, "Range: 
3d20: 22 2c 20 37 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 7) == 0) {...
3d30: 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 62 75  .workbuffer = bu
3d40: 66 66 65 72 20 2b 20 37 3b 0a 0a 09 09 09 69 66  ffer + 7;.....if
3d50: 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28 77 6f   (strncasecmp(wo
3d60: 72 6b 62 75 66 66 65 72 2c 20 22 62 79 74 65 73  rkbuffer, "bytes
3d70: 3d 22 2c 20 36 29 20 3d 3d 20 30 29 20 7b 0a 09  =", 6) == 0) {..
3d80: 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 2b 3d  ...workbuffer +=
3d90: 20 36 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f 72   6;......range_r
3da0: 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 09 09 09  equest = 1;.....
3db0: 09 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20 73  .range_start = s
3dc0: 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75 66 66  trtoull(workbuff
3dd0: 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65 72 5f  er, &workbuffer_
3de0: 6e 65 78 74 2c 20 31 30 29 3b 0a 0a 09 09 09 09  next, 10);......
3df0: 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 77 6f 72  workbuffer = wor
3e00: 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 0a 09  kbuffer_next;...
3e10: 09 09 09 69 66 20 28 2a 77 6f 72 6b 62 75 66 66  ...if (*workbuff
3e20: 65 72 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 09  er == '-') {....
3e30: 09 09 77 6f 72 6b 62 75 66 66 65 72 2b 2b 3b 0a  ..workbuffer++;.
3e40: 0a 09 09 09 09 09 69 66 20 28 2a 77 6f 72 6b 62  ......if (*workb
3e50: 75 66 66 65 72 20 21 3d 20 27 5c 72 27 20 26 26  uffer != '\r' &&
3e60: 20 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20   *workbuffer != 
3e70: 27 5c 6e 27 29 20 7b 0a 09 09 09 09 09 09 72 61  '\n') {.......ra
3e80: 6e 67 65 5f 65 6e 64 20 3d 20 73 74 72 74 6f 75  nge_end = strtou
3e90: 6c 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 26  ll(workbuffer, &
3ea0: 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c  workbuffer_next,
3eb0: 20 31 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09   10);......}....
3ec0: 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  .}....}...} else
3ed0: 20 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70   if (strncasecmp
3ee0: 28 62 75 66 66 65 72 2c 20 22 48 6f 73 74 3a 20  (buffer, "Host: 
3ef0: 22 2c 20 35 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 5) == 0) {...
3f00: 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64  .buffer_st->head
3f10: 65 72 73 2e 68 6f 73 74 2e 70 72 65 73 65 6e 74  ers.host.present
3f20: 20 3d 20 31 3b 0a 0a 09 09 09 77 6f 72 6b 62 75   = 1;.....workbu
3f30: 66 66 65 72 20 3d 20 73 74 72 70 62 72 6b 28 62  ffer = strpbrk(b
3f40: 75 66 66 65 72 20 2b 20 35 2c 20 22 5c 72 5c 6e  uffer + 5, "\r\n
3f50: 3a 22 29 3b 0a 09 09 09 69 66 20 28 77 6f 72 6b  :");....if (work
3f60: 62 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20  buffer != NULL) 
3f70: 7b 0a 09 09 09 09 2a 77 6f 72 6b 62 75 66 66 65  {.....*workbuffe
3f80: 72 20 3d 20 27 5c 30 27 3b 0a 09 09 09 7d 0a 0a  r = '\0';....}..
3f90: 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20  ...workbuffer = 
3fa0: 62 75 66 66 65 72 20 2b 20 35 3b 0a 09 09 09 77  buffer + 5;....w
3fb0: 68 69 6c 65 20 28 2a 77 6f 72 6b 62 75 66 66 65  hile (*workbuffe
3fc0: 72 20 3d 3d 20 27 20 27 29 20 7b 0a 09 09 09 09  r == ' ') {.....
3fd0: 77 6f 72 6b 62 75 66 66 65 72 2b 2b 3b 0a 09 09  workbuffer++;...
3fe0: 09 7d 0a 0a 09 09 09 73 74 72 63 70 79 28 62 75  .}.....strcpy(bu
3ff0: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
4000: 2e 68 6f 73 74 2e 68 6f 73 74 2c 20 77 6f 72 6b  .host.host, work
4010: 62 75 66 66 65 72 29 3b 0a 09 09 7d 0a 0a 09 09  buffer);...}....
4020: 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 66 65  if (memcmp(buffe
4030: 72 2c 20 22 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d  r, "\r\n", 2) ==
4040: 20 30 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a   0) {....break;.
4050: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
4060: 72 6d 69 6e 65 20 72 61 6e 67 65 20 2a 2f 0a 09  rmine range */..
4070: 69 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 21 3d  if (range_end !=
4080: 20 30 29 20 7b 0a 09 09 69 66 20 28 72 61 6e 67   0) {...if (rang
4090: 65 5f 65 6e 64 20 3c 3d 20 72 61 6e 67 65 5f 73  e_end <= range_s
40a0: 74 61 72 74 29 20 7b 0a 09 09 09 72 65 74 75 72  tart) {....retur
40b0: 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09  n(NULL);...}....
40c0: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 72  range_length = r
40d0: 61 6e 67 65 5f 65 6e 64 20 2d 20 72 61 6e 67 65  ange_end - range
40e0: 5f 73 74 61 72 74 3b 0a 0a 09 09 66 69 6c 65 64  _start;....filed
40f0: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
4100: 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68  Computing length
4110: 20 70 61 72 61 6d 65 74 65 72 3a 20 25 6c 6c 75   parameter: %llu
4120: 20 3d 20 25 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c   = %llu - %llu",
4130: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
4140: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 6c  ng long) range_l
4150: 65 6e 67 74 68 2c 0a 09 09 09 28 75 6e 73 69 67  ength,....(unsig
4160: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
4170: 61 6e 67 65 5f 65 6e 64 2c 0a 09 09 09 28 75 6e  ange_end,....(un
4180: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
4190: 29 20 72 61 6e 67 65 5f 73 74 61 72 74 0a 09 09  ) range_start...
41a0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20  );..}.../* Fill 
41b0: 75 70 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  up structure to 
41c0: 72 65 74 75 72 6e 20 2a 2f 0a 09 62 75 66 66 65  return */..buffe
41d0: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  r_st->headers.ra
41e0: 6e 67 65 2e 70 72 65 73 65 6e 74 20 3d 20 72 61  nge.present = ra
41f0: 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 62 75  nge_request;..bu
4200: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
4210: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d  .range.offset  =
4220: 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62   range_start;..b
4230: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
4240: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20  s.range.length  
4250: 3d 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  = range_length;.
4260: 0a 09 2f 2a 20 49 66 20 76 68 6f 73 74 73 20 61  ../* If vhosts a
4270: 72 65 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6d 70  re enabled, comp
4280: 75 74 65 20 6e 65 77 20 70 61 74 68 20 2a 2f 0a  ute new path */.
4290: 09 69 66 20 28 6f 70 74 69 6f 6e 73 2d 3e 76 68  .if (options->vh
42a0: 6f 73 74 73 5f 65 6e 61 62 6c 65 64 29 20 7b 0a  osts_enabled) {.
42b0: 09 09 69 66 20 28 62 75 66 66 65 72 5f 73 74 2d  ..if (buffer_st-
42c0: 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 70 72  >headers.host.pr
42d0: 65 73 65 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  esent == 1) {...
42e0: 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  .buffer = buffer
42f0: 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 09 09  _st->tmpbuf;....
4300: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a  buffer_len = siz
4310: 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74  eof(buffer_st->t
4320: 6d 70 62 75 66 29 3b 0a 0a 09 09 09 73 6e 70 72  mpbuf);.....snpr
4330: 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70 72 69  intf_ret = snpri
4340: 6e 74 66 28 62 75 66 66 65 72 2c 20 62 75 66 66  ntf(buffer, buff
4350: 65 72 5f 6c 65 6e 2c 20 22 2f 25 73 25 73 25 73  er_len, "/%s%s%s
4360: 22 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74  ",.....buffer_st
4370: 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73 74 2e 68  ->headers.host.h
4380: 6f 73 74 2c 0a 09 09 09 09 62 75 66 66 65 72 5f  ost,.....buffer_
4390: 73 74 2d 3e 70 61 74 68 5b 30 5d 20 3d 3d 20 27  st->path[0] == '
43a0: 2f 27 20 3f 20 22 22 20 3a 20 22 2f 22 2c 0a 09  /' ? "" : "/",..
43b0: 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 70 61  ...buffer_st->pa
43c0: 74 68 0a 09 09 09 29 3b 0a 09 09 09 69 66 20 28  th....);....if (
43d0: 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3e 3d 20  snprintf_ret >= 
43e0: 30 29 20 7b 0a 09 09 09 09 69 66 20 28 28 28 75  0) {.....if (((u
43f0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73 6e 70  nsigned int) snp
4400: 72 69 6e 74 66 5f 72 65 74 29 20 3c 20 62 75 66  rintf_ret) < buf
4410: 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 09  fer_len) {......
4420: 73 74 72 63 70 79 28 62 75 66 66 65 72 5f 73 74  strcpy(buffer_st
4430: 2d 3e 70 61 74 68 2c 20 62 75 66 66 65 72 29 3b  ->path, buffer);
4440: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a  .....}....}...}.
4450: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66  .}...return(buff
4460: 65 72 5f 73 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  er_st);.}../* Re
4470: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 70 61  turn an error pa
4480: 67 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ge */.static voi
4490: 64 20 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61  d filed_error_pa
44a0: 67 65 28 46 49 4c 45 20 2a 66 70 2c 20 63 6f 6e  ge(FILE *fp, con
44b0: 73 74 20 63 68 61 72 20 2a 64 61 74 65 5f 63 75  st char *date_cu
44c0: 72 72 65 6e 74 2c 20 69 6e 74 20 65 72 72 6f 72  rrent, int error
44d0: 5f 6e 75 6d 62 65 72 2c 20 69 6e 74 20 6d 65 74  _number, int met
44e0: 68 6f 64 29 20 7b 0a 09 63 68 61 72 20 2a 65 72  hod) {..char *er
44f0: 72 6f 72 5f 73 74 72 69 6e 67 20 3d 20 22 3c 68  ror_string = "<h
4500: 74 6d 6c 3e 3c 68 65 61 64 3e 3c 74 69 74 6c 65  tml><head><title
4510: 3e 45 52 52 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f  >ERROR</title></
4520: 68 65 61 64 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c  head><body>Unabl
4530: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 72 65 71  e to process req
4540: 75 65 73 74 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d  uest</body></htm
4550: 6c 3e 22 3b 0a 0a 09 66 70 72 69 6e 74 66 28 66  l>";...fprintf(f
4560: 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69 20  p, "HTTP/1.1 %i 
4570: 4e 6f 74 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20  Not OK\r\nDate: 
4580: 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69  %s\r\nServer: fi
4590: 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69  led\r\nLast-Modi
45a0: 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74  fied: %s\r\nCont
45b0: 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75  ent-Length: %llu
45c0: 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65  \r\nContent-Type
45d0: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69  : %s\r\nConnecti
45e0: 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c  on: close\r\n\r\
45f0: 6e 22 2c 0a 09 09 65 72 72 6f 72 5f 6e 75 6d 62  n",...error_numb
4600: 65 72 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65  er,...date_curre
4610: 6e 74 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65  nt,...date_curre
4620: 6e 74 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20  nt,...(unsigned 
4630: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 74 72 6c 65  long long) strle
4640: 6e 28 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 2c  n(error_string),
4650: 0a 09 09 22 74 65 78 74 2f 68 74 6d 6c 22 0a 09  ..."text/html"..
4660: 29 3b 0a 0a 09 2f 2a 20 73 69 6c 65 6e 63 65 20  );.../* silence 
4670: 65 72 72 6f 72 20 73 74 72 69 6e 67 20 66 6f 72  error string for
4680: 20 48 45 41 44 20 72 65 71 75 65 73 74 73 20 2a   HEAD requests *
4690: 2f 0a 09 69 66 20 28 6d 65 74 68 6f 64 20 21 3d  /..if (method !=
46a0: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
46b0: 45 54 48 4f 44 5f 48 45 41 44 29 20 7b 0a 09 09  ETHOD_HEAD) {...
46c0: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25 73 22  fprintf(fp, "%s"
46d0: 2c 20 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 3b  , error_string);
46e0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ..}...return;.}.
46f0: 0a 2f 2a 20 48 61 6e 64 6c 65 20 61 20 73 69 6e  ./* Handle a sin
4700: 67 6c 65 20 72 65 71 75 65 73 74 20 66 72 6f 6d  gle request from
4710: 20 61 20 63 6c 69 65 6e 74 20 2a 2f 0a 73 74 61   a client */.sta
4720: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 68  tic void filed_h
4730: 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 69 6e 74  andle_client(int
4740: 20 66 64 2c 20 73 74 72 75 63 74 20 66 69 6c 65   fd, struct file
4750: 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a  d_http_request *
4760: 72 65 71 75 65 73 74 2c 20 73 74 72 75 63 74 20  request, struct 
4770: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20  filed_log_entry 
4780: 2a 6c 6f 67 2c 20 73 74 72 75 63 74 20 66 69 6c  *log, struct fil
4790: 65 64 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 74 69  ed_options *opti
47a0: 6f 6e 73 29 20 7b 0a 09 73 74 72 75 63 74 20 66  ons) {..struct f
47b0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66  iled_fileinfo *f
47c0: 69 6c 65 69 6e 66 6f 3b 0a 09 73 73 69 7a 65 5f  ileinfo;..ssize_
47d0: 74 20 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a  t sendfile_ret;.
47e0: 09 73 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65  .size_t sendfile
47f0: 5f 73 69 7a 65 3b 0a 09 6f 66 66 5f 74 20 73 65  _size;..off_t se
4800: 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73  ndfile_offset, s
4810: 65 6e 64 66 69 6c 65 5f 73 65 6e 74 2c 20 73 65  endfile_sent, se
4820: 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09 63 68 61  ndfile_len;..cha
4830: 72 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a  r *path;..char *
4840: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 64 61  date_current, da
4850: 74 65 5f 63 75 72 72 65 6e 74 5f 62 5b 36 34 5d  te_current_b[64]
4860: 3b 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65  ;..int http_code
4870: 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 2f  ;..FILE *fp;.../
4880: 2a 20 44 65 74 65 72 6d 69 6e 65 20 63 75 72 72  * Determine curr
4890: 65 6e 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74  ent time */..dat
48a0: 65 5f 63 75 72 72 65 6e 74 20 3d 20 66 69 6c 65  e_current = file
48b0: 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61  d_format_time(da
48c0: 74 65 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73 69  te_current_b, si
48d0: 7a 65 6f 66 28 64 61 74 65 5f 63 75 72 72 65 6e  zeof(date_curren
48e0: 74 5f 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29  t_b), time(NULL)
48f0: 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63  );.../* Open soc
4900: 6b 65 74 20 61 73 20 41 4e 53 49 20 49 2f 4f 20  ket as ANSI I/O 
4910: 66 6f 72 20 65 61 73 65 20 6f 66 20 75 73 65 20  for ease of use 
4920: 2a 2f 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e 28  */..fp = fdopen(
4930: 66 64 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66 20  fd, "w+b");..if 
4940: 28 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fp == NULL) {..
4950: 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 66  .close(fd);....f
4960: 72 65 65 28 6c 6f 67 29 3b 0a 0a 09 09 72 65 74  ree(log);....ret
4970: 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65 71 75 65 73  urn;..}...reques
4980: 74 20 3d 20 66 69 6c 65 64 5f 67 65 74 5f 68 74  t = filed_get_ht
4990: 74 70 5f 72 65 71 75 65 73 74 28 66 70 2c 20 72  tp_request(fp, r
49a0: 65 71 75 65 73 74 2c 20 6f 70 74 69 6f 6e 73 29  equest, options)
49b0: 3b 0a 0a 09 69 66 20 28 72 65 71 75 65 73 74 20  ;...if (request 
49c0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c  == NULL) {...fil
49d0: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70  ed_error_page(fp
49e0: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20  , date_current, 
49f0: 35 30 30 2c 20 46 49 4c 45 44 5f 52 45 51 55 45  500, FILED_REQUE
4a00: 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 29 3b 0a  ST_METHOD_GET);.
4a10: 0a 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30  ...log->buffer[0
4a20: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 6c 6f 67 2d  ] = '\0';...log-
4a30: 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 35 30 30  >http_code = 500
4a40: 3b 0a 09 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20  ;...log->reason 
4a50: 3d 20 22 66 6f 72 6d 61 74 22 3b 0a 0a 09 09 66  = "format";....f
4a60: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c  iled_log_entry(l
4a70: 6f 67 29 3b 0a 0a 09 09 66 63 6c 6f 73 65 28 66  og);....fclose(f
4a80: 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09  p);....return;..
4a90: 7d 0a 0a 09 70 61 74 68 20 3d 20 72 65 71 75 65  }...path = reque
4aa0: 73 74 2d 3e 70 61 74 68 3b 0a 09 73 74 72 63 70  st->path;..strcp
4ab0: 79 28 6c 6f 67 2d 3e 62 75 66 66 65 72 2c 20 70  y(log->buffer, p
4ac0: 61 74 68 29 3b 0a 09 6c 6f 67 2d 3e 6d 65 74 68  ath);..log->meth
4ad0: 6f 64 20 3d 20 72 65 71 75 65 73 74 2d 3e 6d 65  od = request->me
4ae0: 74 68 6f 64 3b 0a 0a 09 68 74 74 70 5f 63 6f 64  thod;...http_cod
4af0: 65 20 3d 20 2d 31 3b 0a 0a 09 66 69 6c 65 69 6e  e = -1;...filein
4b00: 66 6f 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e 5f  fo = filed_open_
4b10: 66 69 6c 65 28 70 61 74 68 2c 20 26 72 65 71 75  file(path, &requ
4b20: 65 73 74 2d 3e 66 69 6c 65 69 6e 66 6f 29 3b 0a  est->fileinfo);.
4b30: 09 69 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d 3d  .if (fileinfo ==
4b40: 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64   NULL) {...filed
4b50: 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20  _error_page(fp, 
4b60: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 30  date_current, 40
4b70: 34 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68  4, request->meth
4b80: 6f 64 29 3b 0a 0a 09 09 6c 6f 67 2d 3e 68 74 74  od);....log->htt
4b90: 70 5f 63 6f 64 65 20 3d 20 34 30 34 3b 0a 09 09  p_code = 404;...
4ba0: 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 6f  log->reason = "o
4bb0: 70 65 6e 5f 66 61 69 6c 65 64 22 3b 0a 0a 09 09  pen_failed";....
4bc0: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28  filed_log_entry(
4bd0: 6c 6f 67 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  log);..} else {.
4be0: 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
4bf0: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
4c00: 73 65 74 20 21 3d 20 30 20 7c 7c 20 72 65 71 75  set != 0 || requ
4c10: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
4c20: 67 65 2e 6c 65 6e 67 74 68 20 3e 3d 20 30 29 20  ge.length >= 0) 
4c30: 7b 0a 09 09 09 69 66 20 28 72 65 71 75 65 73 74  {....if (request
4c40: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
4c50: 6f 66 66 73 65 74 20 3e 3d 20 66 69 6c 65 69 6e  offset >= filein
4c60: 66 6f 2d 3e 6c 65 6e 29 20 7b 0a 09 09 09 09 66  fo->len) {.....f
4c70: 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28  iled_error_page(
4c80: 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74  fp, date_current
4c90: 2c 20 34 31 36 2c 20 72 65 71 75 65 73 74 2d 3e  , 416, request->
4ca0: 6d 65 74 68 6f 64 29 3b 0a 0a 09 09 09 09 6c 6f  method);......lo
4cb0: 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 34  g->http_code = 4
4cc0: 31 36 3b 0a 09 09 09 09 6c 6f 67 2d 3e 72 65 61  16;.....log->rea
4cd0: 73 6f 6e 20 3d 20 22 72 61 6e 67 65 5f 69 6e 76  son = "range_inv
4ce0: 61 6c 69 64 22 3b 0a 0a 09 09 09 09 66 69 6c 65  alid";......file
4cf0: 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29  d_log_entry(log)
4d00: 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
4d10: 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
4d20: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e  eaders.range.len
4d30: 67 74 68 20 3d 3d 20 28 28 6f 66 66 5f 74 29 20  gth == ((off_t) 
4d40: 2d 31 29 29 20 7b 0a 09 09 09 09 09 66 69 6c 65  -1)) {......file
4d50: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
4d60: 22 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74  "Computing lengt
4d70: 68 20 74 6f 20 66 69 74 20 69 6e 20 62 6f 75 6e  h to fit in boun
4d80: 64 73 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65  ds: fileinfo->le
4d90: 6e 20 3d 20 25 6c 6c 75 2c 20 72 65 71 75 65 73  n = %llu, reques
4da0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
4db0: 2e 6f 66 66 73 65 74 20 3d 20 25 6c 6c 75 22 2c  .offset = %llu",
4dc0: 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64  .......(unsigned
4dd0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65   long long) file
4de0: 69 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09 09  info->len,......
4df0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
4e00: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
4e10: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
4e20: 73 65 74 0a 09 09 09 09 09 29 3b 0a 0a 09 09 09  set......);.....
4e30: 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ..request->heade
4e40: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
4e50: 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20  = fileinfo->len 
4e60: 2d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  - request->heade
4e70: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b  rs.range.offset;
4e80: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66 69 6c 65  .....}......file
4e90: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
4ea0: 22 50 61 72 74 69 61 6c 20 72 65 71 75 65 73 74  "Partial request
4eb0: 2c 20 73 74 61 72 74 69 6e 67 20 61 74 3a 20 25  , starting at: %
4ec0: 6c 6c 75 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20  llu and running 
4ed0: 66 6f 72 20 25 6c 6c 69 20 62 79 74 65 73 22 2c  for %lli bytes",
4ee0: 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
4ef0: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65  long long) reque
4f00: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
4f10: 65 2e 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 28  e.offset,......(
4f20: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65  long long) reque
4f30: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
4f40: 65 2e 6c 65 6e 67 74 68 0a 09 09 09 09 29 3b 0a  e.length.....);.
4f50: 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d  .....http_code =
4f60: 20 32 30 36 3b 0a 09 09 09 7d 0a 09 09 7d 20 65   206;....}...} e
4f70: 6c 73 65 20 7b 0a 09 09 09 69 66 20 28 72 65 71  lse {....if (req
4f80: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
4f90: 6e 67 65 2e 70 72 65 73 65 6e 74 29 20 7b 0a 09  nge.present) {..
4fa0: 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d 20 32  ...http_code = 2
4fb0: 30 36 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  06;....} else {.
4fc0: 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d 20  ....http_code = 
4fd0: 32 30 30 3b 0a 09 09 09 7d 0a 09 09 09 72 65 71  200;....}....req
4fe0: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
4ff0: 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20 30 3b 0a  nge.offset = 0;.
5000: 09 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64  ...request->head
5010: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
5020: 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e   = fileinfo->len
5030: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 68 74 74  ;...}....if (htt
5040: 70 5f 63 6f 64 65 20 3e 20 30 29 20 7b 0a 09 09  p_code > 0) {...
5050: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 48 54  .fprintf(fp, "HT
5060: 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e  TP/1.1 %i OK\r\n
5070: 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76  Date: %s\r\nServ
5080: 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73  er: filed\r\nLas
5090: 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72  t-Modified: %s\r
50a0: 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68  \nContent-Length
50b0: 3a 20 25 6c 6c 75 5c 72 5c 6e 41 63 63 65 70 74  : %llu\r\nAccept
50c0: 2d 52 61 6e 67 65 73 3a 20 62 79 74 65 73 5c 72  -Ranges: bytes\r
50d0: 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20  \nContent-Type: 
50e0: 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e  %s\r\nConnection
50f0: 3a 20 63 6c 6f 73 65 5c 72 5c 6e 45 54 61 67 3a  : close\r\nETag:
5100: 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 0a 09 09   \"%s\"\r\n",...
5110: 09 09 68 74 74 70 5f 63 6f 64 65 2c 0a 09 09 09  ..http_code,....
5120: 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09  .date_current,..
5130: 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c 61 73  ...fileinfo->las
5140: 74 6d 6f 64 2c 0a 09 09 09 09 28 75 6e 73 69 67  tmod,.....(unsig
5150: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
5160: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
5170: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09 09  range.length,...
5180: 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79 70 65  ..fileinfo->type
5190: 2c 0a 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e  ,.....fileinfo->
51a0: 65 74 61 67 0a 09 09 09 29 3b 0a 09 09 09 69 66  etag....);....if
51b0: 20 28 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32   (http_code == 2
51c0: 30 36 29 20 7b 0a 09 09 09 09 66 70 72 69 6e 74  06) {.....fprint
51d0: 66 28 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52  f(fp, "Content-R
51e0: 61 6e 67 65 3a 20 62 79 74 65 73 20 25 6c 6c 75  ange: bytes %llu
51f0: 2d 25 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c  -%llu/%llu\r\n",
5200: 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
5210: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65  long long) reque
5220: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
5230: 65 2e 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 28  e.offset,......(
5240: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
5250: 6e 67 29 20 28 72 65 71 75 65 73 74 2d 3e 68 65  ng) (request->he
5260: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
5270: 65 74 20 2b 20 72 65 71 75 65 73 74 2d 3e 68 65  et + request->he
5280: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
5290: 74 68 20 2d 20 31 29 2c 0a 09 09 09 09 09 28 75  th - 1),......(u
52a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
52b0: 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e  g) fileinfo->len
52c0: 0a 09 09 09 09 29 3b 0a 09 09 09 7d 0a 09 09 09  .....);....}....
52d0: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c  fprintf(fp, "\r\
52e0: 6e 22 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66  n");....fflush(f
52f0: 70 29 3b 0a 0a 09 09 09 6c 6f 67 2d 3e 68 74 74  p);.....log->htt
5300: 70 5f 63 6f 64 65 20 3d 20 68 74 74 70 5f 63 6f  p_code = http_co
5310: 64 65 3b 0a 09 09 09 6c 6f 67 2d 3e 72 65 61 73  de;....log->reas
5320: 6f 6e 20 3d 20 22 4f 4b 22 3b 0a 09 09 09 6c 6f  on = "OK";....lo
5330: 67 2d 3e 73 74 61 72 74 74 69 6d 65 20 3d 20 74  g->starttime = t
5340: 69 6d 65 28 4e 55 4c 4c 29 3b 0a 09 09 09 6c 6f  ime(NULL);....lo
5350: 67 2d 3e 72 65 71 5f 6f 66 66 73 65 74 20 3d 20  g->req_offset = 
5360: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
5370: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09  .range.offset;..
5380: 09 09 6c 6f 67 2d 3e 72 65 71 5f 6c 65 6e 67 74  ..log->req_lengt
5390: 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61  h = request->hea
53a0: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
53b0: 68 3b 0a 09 09 09 6c 6f 67 2d 3e 66 69 6c 65 5f  h;....log->file_
53c0: 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66  length = fileinf
53d0: 6f 2d 3e 6c 65 6e 3b 0a 0a 23 69 66 64 65 66 20  o->len;..#ifdef 
53e0: 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48  FILED_NONBLOCK_H
53f0: 54 54 50 0a 09 09 09 69 6e 74 20 73 6f 63 6b 65  TTP....int socke
5400: 74 5f 66 6c 61 67 73 3b 0a 09 09 09 66 64 5f 73  t_flags;....fd_s
5410: 65 74 20 72 66 64 2c 20 77 66 64 3b 0a 09 09 09  et rfd, wfd;....
5420: 63 68 61 72 20 73 69 6e 6b 62 75 66 5b 38 31 39  char sinkbuf[819
5430: 32 5d 3b 0a 09 09 09 73 73 69 7a 65 5f 74 20 72  2];....ssize_t r
5440: 65 61 64 5f 72 65 74 3b 0a 0a 09 09 09 46 44 5f  ead_ret;.....FD_
5450: 5a 45 52 4f 28 26 72 66 64 29 3b 0a 09 09 09 46  ZERO(&rfd);....F
5460: 44 5f 5a 45 52 4f 28 26 77 66 64 29 3b 0a 09 09  D_ZERO(&wfd);...
5470: 09 46 44 5f 53 45 54 28 66 64 2c 20 26 72 66 64  .FD_SET(fd, &rfd
5480: 29 3b 0a 09 09 09 46 44 5f 53 45 54 28 66 64 2c  );....FD_SET(fd,
5490: 20 26 77 66 64 29 3b 0a 0a 09 09 09 73 6f 63 6b   &wfd);.....sock
54a0: 65 74 5f 66 6c 61 67 73 20 3d 20 66 63 6e 74 6c  et_flags = fcntl
54b0: 28 66 64 2c 20 46 5f 47 45 54 46 4c 29 3b 0a 09  (fd, F_GETFL);..
54c0: 09 09 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45  ..fcntl(fd, F_SE
54d0: 54 46 4c 2c 20 73 6f 63 6b 65 74 5f 66 6c 61 67  TFL, socket_flag
54e0: 73 20 7c 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29 3b  s | O_NONBLOCK);
54f0: 0a 23 65 6e 64 69 66 0a 0a 09 09 09 73 65 6e 64  .#endif.....send
5500: 66 69 6c 65 5f 6f 66 66 73 65 74 20 3d 20 72 65  file_offset = re
5510: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
5520: 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09  ange.offset;....
5530: 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 20 72  sendfile_len = r
5540: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
5550: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 3b 0a 09 09  range.length;...
5560: 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 20 3d  .sendfile_sent =
5570: 20 30 3b 0a 09 09 09 77 68 69 6c 65 20 28 72 65   0;....while (re
5580: 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 20 3d 3d  quest->method ==
5590: 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d   FILED_REQUEST_M
55a0: 45 54 48 4f 44 5f 47 45 54 29 20 7b 0a 09 09 09  ETHOD_GET) {....
55b0: 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65  .if (sendfile_le
55c0: 6e 20 3e 20 46 49 4c 45 44 5f 53 45 4e 44 46 49  n > FILED_SENDFI
55d0: 4c 45 5f 4d 41 58 29 20 7b 0a 09 09 09 09 09 73  LE_MAX) {......s
55e0: 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 46  endfile_size = F
55f0: 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45 5f 4d 41  ILED_SENDFILE_MA
5600: 58 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  X;.....} else {.
5610: 09 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69  .....sendfile_si
5620: 7a 65 20 3d 20 73 65 6e 64 66 69 6c 65 5f 6c 65  ze = sendfile_le
5630: 6e 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65  n;.....}......se
5640: 6e 64 66 69 6c 65 5f 72 65 74 20 3d 20 73 65 6e  ndfile_ret = sen
5650: 64 66 69 6c 65 28 66 64 2c 20 66 69 6c 65 69 6e  dfile(fd, filein
5660: 66 6f 2d 3e 66 64 2c 20 26 73 65 6e 64 66 69 6c  fo->fd, &sendfil
5670: 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e 64 66 69  e_offset, sendfi
5680: 6c 65 5f 73 69 7a 65 29 3b 0a 09 09 09 09 69 66  le_size);.....if
5690: 20 28 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3c   (sendfile_ret <
56a0: 3d 20 30 29 20 7b 0a 23 69 66 64 65 66 20 46 49  = 0) {.#ifdef FI
56b0: 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54  LED_NONBLOCK_HTT
56c0: 50 0a 09 09 09 09 09 69 66 20 28 65 72 72 6e 6f  P......if (errno
56d0: 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09   == EAGAIN) {...
56e0: 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74  ....sendfile_ret
56f0: 20 3d 20 30 3b 0a 0a 09 09 09 09 09 09 77 68 69   = 0;........whi
5700: 6c 65 20 28 31 29 20 7b 0a 09 09 09 09 09 09 09  le (1) {........
5710: 73 65 6c 65 63 74 28 66 64 20 2b 20 31 2c 20 26  select(fd + 1, &
5720: 72 66 64 2c 20 26 77 66 64 2c 20 4e 55 4c 4c 2c  rfd, &wfd, NULL,
5730: 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 09 09 09 69   NULL);........i
5740: 66 20 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20  f (FD_ISSET(fd, 
5750: 26 72 66 64 29 29 20 7b 0a 09 09 09 09 09 09 09  &rfd)) {........
5760: 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64  .read_ret = read
5770: 28 66 64 2c 20 73 69 6e 6b 62 75 66 2c 20 73 69  (fd, sinkbuf, si
5780: 7a 65 6f 66 28 73 69 6e 6b 62 75 66 29 29 3b 0a  zeof(sinkbuf));.
5790: 0a 09 09 09 09 09 09 09 09 69 66 20 28 72 65 61  .........if (rea
57a0: 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
57b0: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
57c0: 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 09 7d  ......}........}
57d0: 0a 0a 09 09 09 09 09 09 09 69 66 20 28 46 44 5f  .........if (FD_
57e0: 49 53 53 45 54 28 66 64 2c 20 26 77 66 64 29 29  ISSET(fd, &wfd))
57f0: 20 7b 0a 09 09 09 09 09 09 09 09 72 65 61 64 5f   {.........read_
5800: 72 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 09 09  ret = 1;........
5810: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 09  ..break;........
5820: 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  }.......}.......
5830: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
5840: 20 30 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65   0) {........bre
5850: 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ak;.......}.....
5860: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
5870: 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 23 65  break;......}.#e
5880: 6c 73 65 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  lse......break;.
5890: 23 65 6e 64 69 66 0a 09 09 09 09 7d 0a 0a 09 09  #endif.....}....
58a0: 09 09 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 2d  ..sendfile_len -
58b0: 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a  = sendfile_ret;.
58c0: 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e  ....sendfile_sen
58d0: 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65  t += sendfile_re
58e0: 74 3b 0a 09 09 09 09 69 66 20 28 73 65 6e 64 66  t;.....if (sendf
58f0: 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  ile_len == 0) {.
5900: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
5910: 7d 0a 09 09 09 7d 0a 0a 09 09 09 6c 6f 67 2d 3e  }....}.....log->
5920: 65 6e 64 74 69 6d 65 20 3d 20 28 74 69 6d 65 5f  endtime = (time_
5930: 74 29 20 2d 31 3b 0a 09 09 09 6c 6f 67 2d 3e 73  t) -1;....log->s
5940: 65 6e 74 5f 6c 65 6e 67 74 68 20 3d 20 73 65 6e  ent_length = sen
5950: 64 66 69 6c 65 5f 73 65 6e 74 3b 0a 0a 09 09 09  dfile_sent;.....
5960: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28  filed_log_entry(
5970: 6c 6f 67 29 3b 0a 09 09 7d 0a 0a 09 09 63 6c 6f  log);...}....clo
5980: 73 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29  se(fileinfo->fd)
5990: 3b 0a 09 7d 0a 0a 09 66 63 6c 6f 73 65 28 66 70  ;..}...fclose(fp
59a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
59b0: 2f 2a 20 48 61 6e 64 6c 65 20 69 6e 63 6f 6d 69  /* Handle incomi
59c0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
59d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66  /.static void *f
59e0: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
59f0: 61 64 28 76 6f 69 64 20 2a 61 72 67 5f 76 29 20  ad(void *arg_v) 
5a00: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
5a10: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72  worker_thread_ar
5a20: 67 73 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74  gs *arg;..struct
5a30: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
5a40: 65 73 74 20 72 65 71 75 65 73 74 3b 0a 09 73 74  est request;..st
5a50: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
5a60: 6e 74 72 79 20 2a 6c 6f 67 2c 20 6c 6f 63 61 6c  ntry *log, local
5a70: 5f 64 75 6d 6d 79 5f 6c 6f 67 3b 0a 09 73 74 72  _dummy_log;..str
5a80: 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e  uct filed_option
5a90: 73 20 2a 6f 70 74 69 6f 6e 73 3b 0a 09 73 74 72  s *options;..str
5aa0: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36  uct sockaddr_in6
5ab0: 20 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f   addr;..socklen_
5ac0: 74 20 61 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20  t addrlen;..int 
5ad0: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20  failure_count = 
5ae0: 30 2c 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63  0, max_failure_c
5af0: 6f 75 6e 74 20 3d 20 46 49 4c 45 44 5f 4d 41 58  ount = FILED_MAX
5b00: 5f 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a  _FAILURE_COUNT;.
5b10: 09 69 6e 74 20 6d 61 73 74 65 72 5f 66 64 2c 20  .int master_fd, 
5b20: 66 64 3b 0a 0a 09 2f 2a 20 52 65 61 64 20 61 72  fd;.../* Read ar
5b30: 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20  guments */..arg 
5b40: 3d 20 61 72 67 5f 76 3b 0a 0a 09 6d 61 73 74 65  = arg_v;...maste
5b50: 72 5f 66 64 20 3d 20 61 72 67 2d 3e 66 64 3b 0a  r_fd = arg->fd;.
5b60: 09 6f 70 74 69 6f 6e 73 20 3d 20 26 61 72 67 2d  .options = &arg-
5b70: 3e 6f 70 74 69 6f 6e 73 3b 0a 0a 09 77 68 69 6c  >options;...whil
5b80: 65 20 28 31 29 20 7b 0a 09 09 2f 2a 20 46 61 69  e (1) {.../* Fai
5b90: 6c 75 72 65 20 6c 6f 6f 70 20 70 72 65 76 65 6e  lure loop preven
5ba0: 74 69 6f 6e 20 2a 2f 0a 09 09 69 66 20 28 66 61  tion */...if (fa
5bb0: 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3e 20 6d 61  ilure_count > ma
5bc0: 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 29  x_failure_count)
5bd0: 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d   {....break;...}
5be0: 0a 0a 09 09 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..../* Allocate 
5bf0: 61 20 6e 65 77 20 6c 6f 67 20 62 75 66 66 65 72  a new log buffer
5c00: 20 2a 2f 0a 09 09 6c 6f 67 20 3d 20 66 69 6c 65   */...log = file
5c10: 64 5f 6c 6f 67 5f 6e 65 77 28 31 29 3b 0a 09 09  d_log_new(1);...
5c20: 69 66 20 28 6c 6f 67 20 3d 3d 20 4e 55 4c 4c 29  if (log == NULL)
5c30: 20 7b 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f   {....filed_log_
5c40: 6d 73 67 28 22 41 4c 4c 4f 43 41 54 45 5f 4c 4f  msg("ALLOCATE_LO
5c50: 47 5f 4d 53 47 5f 46 41 49 4c 45 44 22 29 3b 0a  G_MSG_FAILED");.
5c60: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
5c70: 09 09 6c 6f 67 2d 3e 74 79 70 65 20 3d 20 46 49  ..log->type = FI
5c80: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41  LED_LOG_TYPE_TRA
5c90: 4e 53 46 45 52 3b 0a 0a 09 09 2f 2a 20 41 63 63  NSFER;..../* Acc
5ca0: 65 70 74 20 61 20 6e 65 77 20 63 6c 69 65 6e 74  ept a new client
5cb0: 20 2a 2f 0a 09 09 61 64 64 72 6c 65 6e 20 3d 20   */...addrlen = 
5cc0: 73 69 7a 65 6f 66 28 61 64 64 72 29 3b 0a 09 09  sizeof(addr);...
5cd0: 66 64 20 3d 20 61 63 63 65 70 74 28 6d 61 73 74  fd = accept(mast
5ce0: 65 72 5f 66 64 2c 20 28 73 74 72 75 63 74 20 73  er_fd, (struct s
5cf0: 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72  ockaddr *) &addr
5d00: 2c 20 26 61 64 64 72 6c 65 6e 29 3b 0a 0a 09 09  , &addrlen);....
5d10: 2f 2a 0a 09 09 20 2a 20 49 66 20 77 65 20 66 61  /*... * If we fa
5d20: 69 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74 65 20  il, make a note 
5d30: 6f 66 20 69 74 20 73 6f 20 77 65 20 64 6f 6e 27  of it so we don'
5d40: 74 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f 6f 70  t go into a loop
5d50: 20 6f 66 0a 09 09 20 2a 20 61 63 63 65 70 74 28   of... * accept(
5d60: 29 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a 2f 0a  ) failing... */.
5d70: 09 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a  ..if (fd < 0) {.
5d80: 09 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e 65  .../* Log the ne
5d90: 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  w connection */.
5da0: 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
5db0: 28 22 41 43 43 45 50 54 5f 46 41 49 4c 45 44 22  ("ACCEPT_FAILED"
5dc0: 29 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65 5f 63  );.....failure_c
5dd0: 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 66 72 65 65  ount++;.....free
5de0: 28 6c 6f 67 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  (log);.....conti
5df0: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 46  nue;...}..../* F
5e00: 69 6c 6c 20 69 6e 20 6c 6f 67 20 73 74 72 75 63  ill in log struc
5e10: 74 75 72 65 20 2a 2f 0a 09 09 69 66 20 28 66 69  ture */...if (fi
5e20: 6c 65 64 5f 6c 6f 67 5f 69 70 28 28 73 74 72 75  led_log_ip((stru
5e30: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26  ct sockaddr *) &
5e40: 61 64 64 72 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73  addr, log->ip, s
5e50: 69 7a 65 6f 66 28 6c 6f 67 2d 3e 69 70 29 29 20  izeof(log->ip)) 
5e60: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f  == NULL) {....lo
5e70: 67 2d 3e 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b  g->ip[0] = '\0';
5e80: 0a 09 09 09 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20  ....log->port = 
5e90: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0;...} else {...
5ea0: 09 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 61 64 64  .log->port = add
5eb0: 72 2e 73 69 6e 36 5f 70 6f 72 74 3b 0a 09 09 7d  r.sin6_port;...}
5ec0: 0a 0a 09 09 2f 2a 20 52 65 73 65 74 20 66 61 69  ..../* Reset fai
5ed0: 6c 75 72 65 20 63 6f 75 6e 74 2a 2f 0a 09 09 66  lure count*/...f
5ee0: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30  ailure_count = 0
5ef0: 3b 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20 73  ;..../* Handle s
5f00: 6f 63 6b 65 74 20 2a 2f 0a 09 09 66 69 6c 65 64  ocket */...filed
5f10: 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 66  _handle_client(f
5f20: 64 2c 20 26 72 65 71 75 65 73 74 2c 20 6c 6f 67  d, &request, log
5f30: 2c 20 6f 70 74 69 6f 6e 73 29 3b 0a 09 7d 0a 0a  , options);..}..
5f40: 09 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72  ./* Report error
5f50: 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d   */..filed_log_m
5f60: 73 67 28 22 54 48 52 45 41 44 5f 44 49 45 44 20  sg("THREAD_DIED 
5f70: 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72 65  ABNORMAL");...re
5f80: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a  turn(NULL);.../*
5f90: 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67   local_dummy_log
5fa0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
5fb0: 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 20   FILED_DONT_LOG 
5fc0: 69 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74 68 65  is enabled, othe
5fd0: 72 77 69 73 65 20 69 74 27 73 20 6e 6f 74 20 75  rwise it's not u
5fe0: 73 65 64 2c 20 62 75 74 20 74 68 65 20 63 6f 6d  sed, but the com
5ff0: 70 69 6c 65 72 20 68 61 74 65 73 20 74 68 61 74  piler hates that
6000: 20 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61 6c   idea. */..local
6010: 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65 20  _dummy_log.type 
6020: 3d 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d  = 0;..local_dumm
6030: 79 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f 63  y_log.type = loc
6040: 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70  al_dummy_log.typ
6050: 65 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20  e;.}../* Create 
6060: 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a  worker threads *
6070: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
6080: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
6090: 73 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c 20 69  s_init(int fd, i
60a0: 6e 74 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 2c  nt thread_count,
60b0: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70   struct filed_op
60c0: 74 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20  tions *options) 
60d0: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
60e0: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72  worker_thread_ar
60f0: 67 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65 61  gs *arg;..pthrea
6100: 64 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09 69  d_t threadid;..i
6110: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b 0a  nt pthread_ret;.
6120: 09 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69  .int i;...for (i
6130: 20 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61 64   = 0; i < thread
6140: 5f 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09  _count; i++) {..
6150: 09 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  .arg = malloc(si
6160: 7a 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09  zeof(*arg));....
6170: 61 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09  arg->fd = fd;...
6180: 6d 65 6d 63 70 79 28 26 61 72 67 2d 3e 6f 70 74  memcpy(&arg->opt
6190: 69 6f 6e 73 2c 20 6f 70 74 69 6f 6e 73 2c 20 73  ions, options, s
61a0: 69 7a 65 6f 66 28 2a 6f 70 74 69 6f 6e 73 29 29  izeof(*options))
61b0: 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
61c0: 20 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61 74   = pthread_creat
61d0: 65 28 26 74 68 72 65 61 64 69 64 2c 20 4e 55 4c  e(&threadid, NUL
61e0: 4c 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f  L, filed_worker_
61f0: 74 68 72 65 61 64 2c 20 61 72 67 29 3b 0a 09 09  thread, arg);...
6200: 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 20  if (pthread_ret 
6210: 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72  != 0) {....retur
6220: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  n(-1);...}..}...
6230: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
6240: 20 44 69 73 70 6c 61 79 20 68 65 6c 70 20 2a 2f   Display help */
6250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
6260: 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46 49  ed_print_help(FI
6270: 4c 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74 20  LE *output, int 
6280: 6c 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73 74  long_help, const
6290: 20 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b 0a   char *extra) {.
62a0: 09 69 66 20 28 65 78 74 72 61 29 20 7b 0a 09 09  .if (extra) {...
62b0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
62c0: 22 25 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b 0a  "%s\n", extra);.
62d0: 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  .}...fprintf(out
62e0: 70 75 74 2c 20 22 55 73 61 67 65 3a 20 66 69 6c  put, "Usage: fil
62f0: 65 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c 6e  ed [<options>]\n
6300: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
6310: 70 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73 3a  put, "  Options:
6320: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
6330: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68  utput, "      -h
6340: 2c 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09 66  , --help\n");..f
6350: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6360: 20 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65 6d        -d, --daem
6370: 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  on\n");..fprintf
6380: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6390: 2d 76 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c 6e 22  -v, --version\n"
63a0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
63b0: 75 74 2c 20 22 20 20 20 20 20 20 2d 56 2c 20 2d  ut, "      -V, -
63c0: 2d 76 68 6f 73 74 5c 6e 22 29 3b 0a 09 66 70 72  -vhost\n");..fpr
63d0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
63e0: 20 20 20 20 2d 62 20 3c 61 64 64 72 65 73 73 3e      -b <address>
63f0: 2c 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72 65 73  , --bind <addres
6400: 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  s>\n");..fprintf
6410: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6420: 2d 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f 72  -p <port>, --por
6430: 74 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09 66  t <port>\n");..f
6440: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6450: 20 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e 74 3e        -t <count>
6460: 2c 20 2d 2d 74 68 72 65 61 64 73 20 3c 63 6f 75  , --threads <cou
6470: 6e 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  nt>\n");..fprint
6480: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6490: 20 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c 20 2d   -c <entries>, -
64a0: 2d 63 61 63 68 65 20 3c 65 6e 74 72 69 65 73 3e  -cache <entries>
64b0: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
64c0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c  utput, "      -l
64d0: 20 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20 3c   <file>, --log <
64e0: 66 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  file>\n");..fpri
64f0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
6500: 20 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20 2d 2d     -u <user>, --
6510: 75 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22 29 3b  user <user>\n");
6520: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
6530: 2c 20 22 20 20 20 20 20 20 2d 72 20 3c 64 69 72  , "      -r <dir
6540: 65 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74 20  ectory>, --root 
6550: 3c 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22 29 3b  <directory>\n");
6560: 0a 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65 6c 70  ...if (long_help
6570: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ) {...fprintf(ou
6580: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
6590: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
65a0: 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 09 09    Usage:\n");...
65b0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
65c0: 22 20 20 20 20 20 20 2d 68 20 28 6f 72 20 2d 2d  "      -h (or --
65d0: 68 65 6c 70 29 20 70 72 69 6e 74 73 20 74 68 69  help) prints thi
65e0: 73 20 75 73 61 67 65 20 69 6e 66 6f 72 6d 61 74  s usage informat
65f0: 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69  ion.\n");...fpri
6600: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
6610: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
6620: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64 20 28  put, "      -d (
6630: 6f 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e 73  or --daemon) ins
6640: 74 72 75 63 74 73 20 66 69 6c 65 64 20 74 6f 20  tructs filed to 
6650: 62 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20  become a daemon 
6660: 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a 69  after initializi
6670: 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ng\n");...fprint
6680: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 74 68 65 20 6c 69 73 74 65 6e 69 6e 67 20    the listening 
66b0: 54 43 50 20 73 6f 63 6b 65 74 20 61 6e 64 20 6c  TCP socket and l
66c0: 6f 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09  og files.\n");..
66d0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
66e0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
66f0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6700: 20 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73 69 6f   -v (or --versio
6710: 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c  n) instructs fil
6720: 65 64 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65  ed print out the
6730: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
6740: 61 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b 0a 09  and exit.\n");..
6750: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6760: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
6770: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6780: 20 2d 56 20 28 6f 72 20 2d 2d 76 68 6f 73 74 29   -V (or --vhost)
6790: 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65 64   instructs filed
67a0: 20 74 6f 20 70 72 65 70 65 6e 64 20 61 6c 6c 20   to prepend all 
67b0: 72 65 71 75 65 73 74 73 20 77 69 74 68 20 74 68  requests with th
67c0: 65 69 72 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09  eir HTTP\n");...
67d0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
67e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
67f0: 20 20 20 20 20 20 20 48 6f 73 74 20 68 65 61 64         Host head
6800: 65 72 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  er.\n");...fprin
6810: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
6820: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
6830: 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20 28 6f  ut, "      -b (o
6840: 72 20 2d 2d 62 69 6e 64 29 20 73 70 65 63 69 66  r --bind) specif
6850: 69 65 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ies the address 
6860: 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e  to listen for in
6870: 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b  coming HTTP\n");
6880: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
6890: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
68a0: 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74           request
68b0: 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75  s on.  The defau
68c0: 6c 74 20 76 61 6c 75 65 20 69 73 20 5c 22 25 73  lt value is \"%s
68d0: 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41 44 44  \".\n", BIND_ADD
68e0: 52 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  R);...fprintf(ou
68f0: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
6900: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6910: 20 20 20 20 20 20 2d 70 20 28 6f 72 20 2d 2d 70        -p (or --p
6920: 6f 72 74 29 20 73 70 65 63 69 66 69 65 73 20 74  ort) specifies t
6930: 68 65 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62  he TCP port numb
6940: 65 72 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72  er to listen for
6950: 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e   incoming HTTP\n
6960: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
6970: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
6980: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75              requ
6990: 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65  ests on.  The de
69a0: 66 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e 22 2c  fault is %u.\n",
69b0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
69c0: 50 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e 74 66  PORT);...fprintf
69d0: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
69e0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
69f0: 2c 20 22 20 20 20 20 20 20 2d 74 20 28 6f 72 20  , "      -t (or 
6a00: 2d 2d 74 68 72 65 61 64 73 29 20 73 70 65 63 69  --threads) speci
6a10: 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
6a20: 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  of worker thread
6a30: 73 20 74 6f 20 63 72 65 61 74 65 2e 20 45 61 63  s to create. Eac
6a40: 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  h\n");...fprintf
6a50: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 20    worker thread 
6a80: 63 61 6e 20 73 65 72 76 69 63 65 20 6f 6e 65 20  can service one 
6a90: 63 6f 6e 63 75 72 72 65 6e 74 20 48 54 54 50 20  concurrent HTTP 
6aa0: 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09  session.\n");...
6ab0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6ac0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6ad0: 20 20 20 20 20 20 20 20 20 54 68 75 73 20 74 68           Thus th
6ae0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65  e number of thre
6af0: 61 64 73 20 63 72 65 61 74 65 64 20 77 69 6c 6c  ads created will
6b00: 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 5c 6e   determine how\n
6b10: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
6b20: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
6b40: 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  any simultaneous
6b50: 20 74 72 61 6e 73 66 65 72 73 20 77 69 6c 6c 20   transfers will 
6b60: 62 65 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65  be possible. The
6b70: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
6b80: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75 2e   default is %lu.
6bb0: 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \n", (unsigned l
6bc0: 6f 6e 67 29 20 54 48 52 45 41 44 5f 43 4f 55 4e  ong) THREAD_COUN
6bd0: 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  T);...fprintf(ou
6be0: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
6bf0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6c00: 20 20 20 20 20 20 2d 63 20 28 6f 72 20 2d 2d 63        -c (or --c
6c10: 61 63 68 65 29 20 73 70 65 63 69 66 69 65 73 20  ache) specifies 
6c20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
6c30: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  le information c
6c40: 61 63 68 65 20 65 6e 74 72 69 65 73 5c 6e 22 29  ache entries\n")
6c50: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
6c60: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
6c70: 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 6c             to al
6c80: 6c 6f 63 61 74 65 2e 20 20 45 61 63 68 20 63 61  locate.  Each ca
6c90: 63 68 65 20 65 6e 74 72 79 20 68 6f 6c 64 73 20  che entry holds 
6ca0: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
6cb0: 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e   as\n");...fprin
6cc0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f 70 65    well as an ope
6cf0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
6d00: 72 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 73  r to the file, s
6d10: 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22 29 3b 0a  o resource\n");.
6d20: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
6d30: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
6d40: 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 73 20           limits 
6d50: 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29 20 73  (i.e., ulimit) s
6d60: 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65  hould be conside
6d70: 72 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  red.  This shoul
6d80: 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  d\n");...fprintf
6d90: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62 65  be a prime numbe
6dc0: 72 20 66 6f 72 20 69 64 65 61 6c 20 75 73 65 20  r for ideal use 
6dd0: 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75 70 20  with the lookup 
6de0: 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09 66  method.\n");...f
6df0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75 6c        The defaul
6e20: 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75  t is %lu.\n", (u
6e30: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
6e40: 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66 70 72  CHE_SIZE);...fpr
6e50: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
6e60: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
6e70: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20  tput, "      -l 
6e80: 28 6f 72 20 2d 2d 6c 6f 67 29 20 73 70 65 63 69  (or --log) speci
6e90: 66 69 65 73 20 61 20 66 69 6c 65 6e 61 6d 65 20  fies a filename 
6ea0: 74 6f 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  to open for writ
6eb0: 69 6e 67 20 6c 6f 67 20 65 6e 74 72 69 65 73 2e  ing log entries.
6ec0: 20 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09 66 70 72    Log\n");...fpr
6ed0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61    entries are ma
6f00: 64 65 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73  de for various s
6f10: 74 61 67 65 73 20 69 6e 20 74 72 61 6e 73 66 65  tages in transfe
6f20: 72 69 6e 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b  ring files.\n");
6f30: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
6f40: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
6f50: 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 20          The log 
6f60: 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
6f70: 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
6f80: 75 73 65 72 73 20 28 73 65 65 20 5c 22 2d 75 5c  users (see \"-u\
6f90: 22 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ")\n");...fprint
6fa0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
6fc0: 6e 64 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72  nd root director
6fd0: 69 65 73 20 28 73 65 65 20 5c 22 2d 72 5c 22 29  ies (see \"-r\")
6fe0: 2e 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20  .  The log file 
6ff0: 69 73 20 6e 65 76 65 72 5c 6e 22 29 3b 0a 09 09  is never\n");...
7000: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
7010: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7020: 20 20 20 20 20 63 6c 6f 73 65 64 20 73 6f 20 6c       closed so l
7030: 6f 67 20 72 6f 74 61 74 69 6f 6e 20 77 69 74 68  og rotation with
7040: 6f 75 74 20 73 74 6f 70 70 69 6e 67 20 74 68 65  out stopping the
7050: 20 64 61 65 6d 6f 6e 20 69 73 20 77 69 6c 6c 5c   daemon is will\
7060: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
7070: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
7080: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20              not 
7090: 77 6f 72 6b 2e 20 20 54 68 65 20 76 61 6c 75 65  work.  The value
70a0: 20 6f 66 20 5c 22 2d 5c 22 20 69 6e 64 69 63 61   of \"-\" indica
70b0: 74 65 73 20 74 68 61 74 20 73 74 61 6e 64 61 72  tes that standar
70c0: 64 20 6f 75 74 70 75 74 5c 6e 22 29 3b 0a 09 09  d output\n");...
70d0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
70e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
70f0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 75       should be u
7100: 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 2e  sed for logging.
7110: 20 20 49 66 20 74 68 65 20 66 69 6c 65 6e 61 6d    If the filenam
7120: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 5c  e begins with a\
7130: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
7140: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
7150: 20 20 20 20 20 20 20 20 20 20 20 20 70 69 70 65              pipe
7160: 20 28 5c 22 7c 5c 22 29 20 74 68 65 6e 20 61 20   (\"|\") then a 
7170: 70 72 6f 63 65 73 73 20 69 73 20 73 74 61 72 74  process is start
7180: 65 64 20 61 6e 64 20 75 73 65 64 20 66 6f 72 20  ed and used for 
7190: 6c 6f 67 67 69 6e 67 5c 6e 22 29 3b 0a 09 09 66  logging\n");...f
71a0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 69 6e 73 74 65 61 64 20 6f 66 20 61      instead of a
71d0: 20 66 69 6c 65 2e 20 20 54 68 65 20 64 65 66 61   file.  The defa
71e0: 75 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e  ult is \"%s\".\n
71f0: 22 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a 23 69  ", LOG_FILE);.#i
7200: 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f  fdef FILED_DONT_
7210: 4c 4f 47 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  LOG...fprintf(ou
7220: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
7230: 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 65 20             Note 
7240: 74 68 61 74 20 6c 6f 67 67 69 6e 67 20 69 73 20  that logging is 
7250: 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 61 62  completely disab
7260: 6c 65 64 20 73 6f 20 74 68 69 73 20 6f 70 74 69  led so this opti
7270: 6f 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09 09 66  on does\n");...f
7280: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e 20 74      nothing in t
72b0: 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a  his build.\n");.
72c0: 23 65 6e 64 69 66 0a 09 09 66 70 72 69 6e 74 66  #endif...fprintf
72d0: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
72e0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
72f0: 2c 20 22 20 20 20 20 20 20 2d 75 20 28 6f 72 20  , "      -u (or 
7300: 2d 2d 75 73 65 72 29 20 73 70 65 63 69 66 69 65  --user) specifie
7310: 73 20 74 68 65 20 75 73 65 72 20 74 6f 20 73 77  s the user to sw
7320: 69 74 63 68 20 75 73 65 72 20 49 44 73 20 74 6f  itch user IDs to
7330: 20 62 65 66 6f 72 65 20 73 65 72 76 69 63 69 6e   before servicin
7340: 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  g\n");...fprintf
7350: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7370: 65 71 75 65 73 74 73 2e 20 20 54 68 65 20 64 65  equests.  The de
7380: 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61  fault is not cha
7390: 6e 67 65 20 75 73 65 72 20 49 44 73 2e 5c 6e 22  nge user IDs.\n"
73a0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
73b0: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
73c0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
73d0: 20 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d 72 6f       -r (or --ro
73e0: 6f 74 29 20 73 70 65 63 69 66 69 65 73 20 74 68  ot) specifies th
73f0: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 61  e directory to a
7400: 63 74 20 61 73 20 74 68 65 20 72 6f 6f 74 20 64  ct as the root d
7410: 69 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e 22 29  irectory for\n")
7420: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
7430: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
7440: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 66 69            the fi
7450: 6c 65 20 73 65 72 76 65 72 2e 20 20 49 66 20 74  le server.  If t
7460: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 73 70  his option is sp
7470: 65 63 69 66 69 65 64 2c 20 63 68 72 6f 6f 74 28  ecified, chroot(
7480: 32 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  2)\n");...fprint
7490: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 20  is called.  The 
74c0: 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63  default is not c
74d0: 68 61 6e 67 65 20 72 6f 6f 74 20 64 69 72 65 63  hange root direc
74e0: 74 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09 09 66  tories,\n");...f
74f0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 20 74 68 61 74 20 69 73 2c 20 74 68       that is, th
7520: 65 20 5c 22 2f 5c 22 20 64 69 72 65 63 74 6f 72  e \"/\" director
7530: 79 20 69 73 20 73 68 61 72 65 64 20 6f 75 74 2e  y is shared out.
7540: 20 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22 29 3b    This will\n");
7550: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
7560: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
7570: 20 20 20 20 20 20 20 20 20 6c 69 6b 65 6c 79 20           likely 
7580: 62 65 20 61 20 73 65 63 75 72 69 74 79 20 69 73  be a security is
7590: 73 75 65 2c 20 73 6f 20 74 68 69 73 20 6f 70 74  sue, so this opt
75a0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
75b0: 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  s\n");...fprintf
75c0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
75e0: 65 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a  e used.\n");..}.
75f0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  ..return;.}../* 
7600: 41 64 64 20 61 20 67 65 74 6f 70 74 20 6f 70 74  Add a getopt opt
7610: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion */.static vo
7620: 69 64 20 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  id filed_getopt_
7630: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74 72 75  long_setopt(stru
7640: 63 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74 2c 20  ct option *opt, 
7650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
7660: 2c 20 69 6e 74 20 68 61 73 5f 61 72 67 2c 20 69  , int has_arg, i
7670: 6e 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e  nt val) {..opt->
7680: 6e 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d 65 3b  name     = name;
7690: 0a 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67 20 20  ..opt->has_arg  
76a0: 3d 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70 74 2d  = has_arg;..opt-
76b0: 3e 66 6c 61 67 20 20 20 20 20 3d 20 4e 55 4c 4c  >flag     = NULL
76c0: 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20 20 20  ;..opt->val     
76d0: 20 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75 72 6e   = val;...return
76e0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20  ;.}../* Resolve 
76f0: 61 20 75 73 65 72 6e 61 6d 65 20 74 6f 20 61 20  a username to a 
7700: 55 49 44 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  UID */.static in
7710: 74 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f  t filed_user_loo
7720: 6b 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  kup(const char *
7730: 75 73 65 72 2c 20 75 69 64 5f 74 20 2a 75 73 65  user, uid_t *use
7740: 72 5f 69 64 29 20 7b 0a 09 63 68 61 72 20 2a 6e  r_id) {..char *n
7750: 65 78 74 3b 0a 09 75 69 64 5f 74 20 75 73 65 72  ext;..uid_t user
7760: 5f 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66 6e 64  _id_check;.#ifnd
7770: 65 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45 54 50  ef FILED_NO_GETP
7780: 57 4e 41 4d 0a 09 73 74 72 75 63 74 20 70 61 73  WNAM..struct pas
7790: 73 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20  swd *ent;...ent 
77a0: 3d 20 67 65 74 70 77 6e 61 6d 28 75 73 65 72 29  = getpwnam(user)
77b0: 3b 0a 09 69 66 20 28 65 6e 74 20 21 3d 20 4e 55  ;..if (ent != NU
77c0: 4c 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f 69 64  LL) {...*user_id
77d0: 20 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a   = ent->pw_uid;.
77e0: 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
77f0: 0a 23 65 6e 64 69 66 0a 0a 09 75 73 65 72 5f 69  .#endif...user_i
7800: 64 5f 63 68 65 63 6b 20 3d 20 73 74 72 74 6f 75  d_check = strtou
7810: 6c 6c 28 75 73 65 72 2c 20 26 6e 65 78 74 2c 20  ll(user, &next, 
7820: 31 30 29 3b 0a 09 69 66 20 28 6e 65 78 74 20 3d  10);..if (next =
7830: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
7840: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn(1);..}...if (
7850: 6e 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30 27 29  next[0] != '\0')
7860: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
7870: 09 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20 3d 20  .}...*user_id = 
7880: 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a  user_id_check;..
7890: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
78a0: 2a 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73  * Daemonize */.s
78b0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f  tatic int filed_
78c0: 64 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29 20  daemonize(void) 
78d0: 7b 0a 09 70 69 64 5f 74 20 73 65 74 73 69 64 5f  {..pid_t setsid_
78e0: 72 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b 0a 09  ret, fork_ret;..
78f0: 69 6e 74 20 63 68 64 69 72 5f 72 65 74 2c 20 64  int chdir_ret, d
7900: 75 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20 66 64  up2_ret;..int fd
7910: 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a 09 63  _in, fd_out;...c
7920: 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72  hdir_ret = chdir
7930: 28 22 2f 22 29 3b 0a 09 69 66 20 28 63 68 64 69  ("/");..if (chdi
7940: 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  r_ret != 0) {...
7950: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
7960: 66 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72 6b 28  fork_ret = fork(
7970: 29 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74  );..if (fork_ret
7980: 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
7990: 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 6f  (1);..}...if (fo
79a0: 72 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  rk_ret > 0) {...
79b0: 2f 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09 09 77  /* Parent */...w
79c0: 61 69 74 70 69 64 28 66 6f 72 6b 5f 72 65 74 2c  aitpid(fork_ret,
79d0: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 65 78   NULL, 0);....ex
79e0: 69 74 28 45 58 49 54 5f 53 55 43 43 45 53 53 29  it(EXIT_SUCCESS)
79f0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c 64 20  ;..}.../* Child 
7a00: 2a 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29 20 21  */..if (fork() !
7a10: 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68 69 6c  = 0) {.../* Chil
7a20: 64 20 2a 2f 0a 09 09 65 78 69 74 28 45 58 49 54  d */...exit(EXIT
7a30: 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09  _SUCCESS);..}...
7a40: 2f 2a 20 47 72 61 6e 64 20 63 68 69 6c 64 20 2a  /* Grand child *
7a50: 2f 0a 09 73 65 74 73 69 64 5f 72 65 74 20 3d 20  /..setsid_ret = 
7a60: 73 65 74 73 69 64 28 29 3b 0a 09 69 66 20 28 73  setsid();..if (s
7a70: 65 74 73 69 64 5f 72 65 74 20 3d 3d 20 28 28 70  etsid_ret == ((p
7a80: 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 72  id_t) -1)) {...r
7a90: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66  eturn(1);..}...f
7aa0: 64 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f 64 65  d_in = open("/de
7ab0: 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c  v/null", O_RDONL
7ac0: 59 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20 6f 70  Y);..fd_out = op
7ad0: 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20  en("/dev/null", 
7ae0: 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66 20 28  O_WRONLY);..if (
7af0: 66 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66 64 5f  fd_in < 0 || fd_
7b00: 6f 75 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  out < 0) {...ret
7b10: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70  urn(1);..}...dup
7b20: 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f  2_ret = dup2(fd_
7b30: 69 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f  in, STDIN_FILENO
7b40: 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74  );..if (dup2_ret
7b50: 20 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f   != STDIN_FILENO
7b60: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
7b70: 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d  ..}...dup2_ret =
7b80: 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54   dup2(fd_out, ST
7b90: 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69  DOUT_FILENO);..i
7ba0: 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53  f (dup2_ret != S
7bb0: 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a  TDOUT_FILENO) {.
7bc0: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
7bd0: 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70  ..dup2_ret = dup
7be0: 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 45 52 52  2(fd_out, STDERR
7bf0: 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64  _FILENO);..if (d
7c00: 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 45 52  up2_ret != STDER
7c10: 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65  R_FILENO) {...re
7c20: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c  turn(1);..}...cl
7c30: 6f 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f  ose(fd_in);..clo
7c40: 73 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09 72 65  se(fd_out);...re
7c50: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
7c60: 75 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a 69 6e  un process */.in
7c70: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
7c80: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a   char **argv) {.
7c90: 09 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20 6f  .struct option o
7ca0: 70 74 69 6f 6e 73 5b 31 32 5d 3b 0a 09 73 74 72  ptions[12];..str
7cb0: 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e  uct filed_option
7cc0: 73 20 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73  s thread_options
7cd0: 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  ;..const char *b
7ce0: 69 6e 64 5f 61 64 64 72 20 3d 20 42 49 4e 44 5f  ind_addr = BIND_
7cf0: 41 44 44 52 2c 20 2a 6e 65 77 72 6f 6f 74 20 3d  ADDR, *newroot =
7d00: 20 4e 55 4c 4c 2c 20 2a 6c 6f 67 5f 66 69 6c 65   NULL, *log_file
7d10: 20 3d 20 4c 4f 47 5f 46 49 4c 45 3b 0a 09 46 49   = LOG_FILE;..FI
7d20: 4c 45 20 2a 6c 6f 67 5f 66 70 3b 0a 09 75 69 64  LE *log_fp;..uid
7d30: 5f 74 20 75 73 65 72 20 3d 20 30 3b 0a 09 69 6e  _t user = 0;..in
7d40: 74 20 70 6f 72 74 20 3d 20 50 4f 52 54 2c 20 74  t port = PORT, t
7d50: 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 54 48  hread_count = TH
7d60: 52 45 41 44 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74  READ_COUNT;..int
7d70: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 43 41   cache_size = CA
7d80: 43 48 45 5f 53 49 5a 45 3b 0a 09 69 6e 74 20 69  CHE_SIZE;..int i
7d90: 6e 69 74 5f 72 65 74 2c 20 63 68 72 6f 6f 74 5f  nit_ret, chroot_
7da0: 72 65 74 2c 20 73 65 74 75 69 64 5f 72 65 74 2c  ret, setuid_ret,
7db0: 20 6c 6f 6f 6b 75 70 5f 72 65 74 2c 20 63 68 64   lookup_ret, chd
7dc0: 69 72 5f 72 65 74 3b 0a 09 69 6e 74 20 73 65 74  ir_ret;..int set
7dd0: 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 30 2c  uid_enabled = 0,
7de0: 20 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20   daemon_enabled 
7df0: 3d 20 30 3b 0a 09 69 6e 74 20 63 68 3b 0a 09 69  = 0;..int ch;..i
7e00: 6e 74 20 66 64 3b 0a 0a 09 2f 2a 20 53 65 74 20  nt fd;.../* Set 
7e10: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a  default values *
7e20: 2f 0a 09 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e  /..thread_option
7e30: 73 2e 76 68 6f 73 74 73 5f 65 6e 61 62 6c 65 64  s.vhosts_enabled
7e40: 20 3d 20 30 3b 0a 0a 09 2f 2a 20 50 72 6f 63 65   = 0;.../* Proce
7e50: 73 73 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ss arguments */.
7e60: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
7e70: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
7e80: 6e 73 5b 30 5d 2c 20 22 70 6f 72 74 22 2c 20 72  ns[0], "port", r
7e90: 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74  equired_argument
7ea0: 2c 20 27 70 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'p');..filed_g
7eb0: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
7ec0: 74 28 26 6f 70 74 69 6f 6e 73 5b 31 5d 2c 20 22  t(&options[1], "
7ed0: 74 68 72 65 61 64 73 22 2c 20 72 65 71 75 69 72  threads", requir
7ee0: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 74 27  ed_argument, 't'
7ef0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
7f00: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
7f10: 74 69 6f 6e 73 5b 32 5d 2c 20 22 63 61 63 68 65  tions[2], "cache
7f20: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
7f30: 6d 65 6e 74 2c 20 27 63 27 29 3b 0a 09 66 69 6c  ment, 'c');..fil
7f40: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
7f50: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 33  etopt(&options[3
7f60: 5d 2c 20 22 62 69 6e 64 22 2c 20 72 65 71 75 69  ], "bind", requi
7f70: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 62  red_argument, 'b
7f80: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
7f90: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
7fa0: 70 74 69 6f 6e 73 5b 34 5d 2c 20 22 75 73 65 72  ptions[4], "user
7fb0: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
7fc0: 6d 65 6e 74 2c 20 27 75 27 29 3b 0a 09 66 69 6c  ment, 'u');..fil
7fd0: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
7fe0: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 35  etopt(&options[5
7ff0: 5d 2c 20 22 72 6f 6f 74 22 2c 20 72 65 71 75 69  ], "root", requi
8000: 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 72  red_argument, 'r
8010: 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70  ');..filed_getop
8020: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f  t_long_setopt(&o
8030: 70 74 69 6f 6e 73 5b 36 5d 2c 20 22 68 65 6c 70  ptions[6], "help
8040: 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20  ", no_argument, 
8050: 27 68 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'h');..filed_get
8060: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
8070: 26 6f 70 74 69 6f 6e 73 5b 37 5d 2c 20 22 64 61  &options[7], "da
8080: 65 6d 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65  emon", no_argume
8090: 6e 74 2c 20 27 64 27 29 3b 0a 09 66 69 6c 65 64  nt, 'd');..filed
80a0: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
80b0: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 38 5d 2c  opt(&options[8],
80c0: 20 22 6c 6f 67 22 2c 20 72 65 71 75 69 72 65 64   "log", required
80d0: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 6c 27 29 3b  _argument, 'l');
80e0: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
80f0: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
8100: 6f 6e 73 5b 39 5d 2c 20 22 76 65 72 73 69 6f 6e  ons[9], "version
8110: 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20  ", no_argument, 
8120: 27 76 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74  'v');..filed_get
8130: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
8140: 26 6f 70 74 69 6f 6e 73 5b 31 30 5d 2c 20 22 76  &options[10], "v
8150: 68 6f 73 74 22 2c 20 6e 6f 5f 61 72 67 75 6d 65  host", no_argume
8160: 6e 74 2c 20 27 56 27 29 3b 0a 09 66 69 6c 65 64  nt, 'V');..filed
8170: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
8180: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31 31 5d  opt(&options[11]
8190: 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 09  , NULL, 0, 0);..
81a0: 77 68 69 6c 65 20 28 28 63 68 20 3d 20 67 65 74  while ((ch = get
81b0: 6f 70 74 5f 6c 6f 6e 67 28 61 72 67 63 2c 20 61  opt_long(argc, a
81c0: 72 67 76 2c 20 22 70 3a 74 3a 63 3a 62 3a 75 3a  rgv, "p:t:c:b:u:
81d0: 72 3a 6c 3a 68 64 76 56 22 2c 20 6f 70 74 69 6f  r:l:hdvV", optio
81e0: 6e 73 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 2d 31  ns, NULL)) != -1
81f0: 29 20 7b 0a 09 09 73 77 69 74 63 68 28 63 68 29  ) {...switch(ch)
8200: 20 7b 0a 09 09 09 63 61 73 65 20 27 70 27 3a 0a   {....case 'p':.
8210: 09 09 09 09 70 6f 72 74 20 3d 20 61 74 6f 69 28  ....port = atoi(
8220: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
8230: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 74 27 3a  ak;....case 't':
8240: 0a 09 09 09 09 74 68 72 65 61 64 5f 63 6f 75 6e  .....thread_coun
8250: 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29  t = atoi(optarg)
8260: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
8270: 63 61 73 65 20 27 63 27 3a 0a 09 09 09 09 63 61  case 'c':.....ca
8280: 63 68 65 5f 73 69 7a 65 20 3d 20 61 74 6f 69 28  che_size = atoi(
8290: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
82a0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 62 27 3a  ak;....case 'b':
82b0: 0a 09 09 09 09 62 69 6e 64 5f 61 64 64 72 20 3d  .....bind_addr =
82c0: 20 73 74 72 64 75 70 28 6f 70 74 61 72 67 29 3b   strdup(optarg);
82d0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
82e0: 61 73 65 20 27 75 27 3a 0a 09 09 09 09 73 65 74  ase 'u':.....set
82f0: 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b  uid_enabled = 1;
8300: 0a 09 09 09 09 6c 6f 6f 6b 75 70 5f 72 65 74 20  .....lookup_ret 
8310: 3d 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f  = filed_user_loo
8320: 6b 75 70 28 6f 70 74 61 72 67 2c 20 26 75 73 65  kup(optarg, &use
8330: 72 29 3b 0a 09 09 09 09 69 66 20 28 6c 6f 6f 6b  r);.....if (look
8340: 75 70 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  up_ret != 0) {..
8350: 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f  ....filed_print_
8360: 68 65 6c 70 28 73 74 64 65 72 72 2c 20 30 2c 20  help(stderr, 0, 
8370: 22 49 6e 76 61 6c 69 64 20 75 73 65 72 6e 61 6d  "Invalid usernam
8380: 65 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 0a  e specified");..
8390: 09 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  .....return(1);.
83a0: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
83b0: 0a 09 09 09 63 61 73 65 20 27 72 27 3a 0a 09 09  ....case 'r':...
83c0: 09 09 6e 65 77 72 6f 6f 74 20 3d 20 73 74 72 64  ..newroot = strd
83d0: 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09  up(optarg);.....
83e0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
83f0: 6c 27 3a 0a 09 09 09 09 6c 6f 67 5f 66 69 6c 65  l':.....log_file
8400: 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72 67   = strdup(optarg
8410: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
8420: 09 63 61 73 65 20 27 64 27 3a 0a 09 09 09 09 64  .case 'd':.....d
8430: 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20  aemon_enabled = 
8440: 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
8450: 09 63 61 73 65 20 27 56 27 3a 0a 09 09 09 09 74  .case 'V':.....t
8460: 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73 2e 76 68  hread_options.vh
8470: 6f 73 74 73 5f 65 6e 61 62 6c 65 64 20 3d 20 31  osts_enabled = 1
8480: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
8490: 09 63 61 73 65 20 27 76 27 3a 0a 09 09 09 09 70  .case 'v':.....p
84a0: 72 69 6e 74 66 28 22 66 69 6c 65 64 20 76 65 72  rintf("filed ver
84b0: 73 69 6f 6e 20 25 73 5c 6e 22 2c 20 46 49 4c 45  sion %s\n", FILE
84c0: 44 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 09 09  D_VERSION);.....
84d0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 09 63  .return(0);....c
84e0: 61 73 65 20 27 3f 27 3a 0a 09 09 09 63 61 73 65  ase '?':....case
84f0: 20 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f   ':':.....filed_
8500: 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65 72  print_help(stder
8510: 72 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  r, 0, NULL);....
8520: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09  ..return(1);....
8530: 63 61 73 65 20 27 68 27 3a 0a 09 09 09 09 66 69  case 'h':.....fi
8540: 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73  led_print_help(s
8550: 74 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b  tdout, 1, NULL);
8560: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 30 29 3b  ......return(0);
8570: 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65  ...}..}.../* Ope
8580: 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 6c  n log file */..l
8590: 6f 67 5f 66 70 20 3d 20 66 69 6c 65 64 5f 6c 6f  og_fp = filed_lo
85a0: 67 5f 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c 65 29  g_open(log_file)
85b0: 3b 0a 09 69 66 20 28 6c 6f 67 5f 66 70 20 3d 3d  ;..if (log_fp ==
85c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 65 72 72 6f   NULL) {...perro
85d0: 72 28 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65  r("filed_log_ope
85e0: 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34  n");....return(4
85f0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74  );..}.../* Creat
8600: 65 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b  e listening sock
8610: 65 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69 6c 65  et */..fd = file
8620: 64 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f 61 64  d_listen(bind_ad
8630: 64 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66 20 28  dr, port);..if (
8640: 66 64 20 3c 20 30 29 20 7b 0a 09 09 70 65 72 72  fd < 0) {...perr
8650: 6f 72 28 22 66 69 6c 65 64 5f 6c 69 73 74 65 6e  or("filed_listen
8660: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29  ");....return(1)
8670: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 63 6f 6d 65  ;..}.../* Become
8680: 20 61 20 64 61 65 6d 6f 6e 20 2a 2f 0a 09 69 66   a daemon */..if
8690: 20 28 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64   (daemon_enabled
86a0: 29 20 7b 0a 09 09 69 6e 69 74 5f 72 65 74 20 3d  ) {...init_ret =
86b0: 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65   filed_daemonize
86c0: 28 29 3b 0a 09 09 69 66 20 28 69 6e 69 74 5f 72  ();...if (init_r
86d0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65  et != 0) {....pe
86e0: 72 72 6f 72 28 22 66 69 6c 65 64 5f 64 61 65 6d  rror("filed_daem
86f0: 6f 6e 69 7a 65 22 29 3b 0a 0a 09 09 09 72 65 74  onize");.....ret
8700: 75 72 6e 28 36 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  urn(6);...}..}..
8710: 09 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66 20 61  ./* Chroot, if a
8720: 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69  ppropriate */..i
8730: 66 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09  f (newroot) {...
8740: 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69  chdir_ret = chdi
8750: 72 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09 69 66  r(newroot);...if
8760: 20 28 63 68 64 69 72 5f 72 65 74 20 21 3d 20 30   (chdir_ret != 0
8770: 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63  ) {....perror("c
8780: 68 64 69 72 22 29 3b 0a 0a 09 09 09 72 65 74 75  hdir");.....retu
8790: 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 63 68  rn(1);...}....ch
87a0: 72 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72 6f 6f  root_ret = chroo
87b0: 74 28 22 2e 22 29 3b 0a 09 09 69 66 20 28 63 68  t(".");...if (ch
87c0: 72 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29 20 7b  root_ret != 0) {
87d0: 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68 72 6f  ....perror("chro
87e0: 6f 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ot");.....return
87f0: 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a  (1);...}..}.../*
8800: 20 44 72 6f 70 20 70 72 69 76 69 6c 65 67 65 73   Drop privileges
8810: 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  , if appropriate
8820: 20 2a 2f 0a 09 69 66 20 28 73 65 74 75 69 64 5f   */..if (setuid_
8830: 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73 65 74  enabled) {...set
8840: 75 69 64 5f 72 65 74 20 3d 20 73 65 74 75 69 64  uid_ret = setuid
8850: 28 75 73 65 72 29 3b 0a 09 09 69 66 20 28 73 65  (user);...if (se
8860: 74 75 69 64 5f 72 65 74 20 21 3d 20 30 29 20 7b  tuid_ret != 0) {
8870: 0a 09 09 09 70 65 72 72 6f 72 28 22 73 65 74 75  ....perror("setu
8880: 69 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  id");.....return
8890: 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a  (1);...}..}.../*
88a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 09   Initialize */..
88b0: 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64  init_ret = filed
88c0: 5f 69 6e 69 74 28 63 61 63 68 65 5f 73 69 7a 65  _init(cache_size
88d0: 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74  );..if (init_ret
88e0: 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f   != 0) {...perro
88f0: 72 28 22 66 69 6c 65 64 5f 69 6e 69 74 22 29 3b  r("filed_init");
8900: 0a 0a 09 09 72 65 74 75 72 6e 28 33 29 3b 0a 09  ....return(3);..
8910: 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c 6f  }.../* Create lo
8920: 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a  gging thread */.
8930: 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65  .init_ret = file
8940: 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64  d_logging_thread
8950: 5f 69 6e 69 74 28 6c 6f 67 5f 66 70 29 3b 0a 09  _init(log_fp);..
8960: 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20  if (init_ret != 
8970: 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66  0) {...perror("f
8980: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
8990: 65 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72  ead_init");....r
89a0: 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09 2f  eturn(4);..}.../
89b0: 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20  * Create worker 
89c0: 74 68 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69 74  threads */..init
89d0: 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f 72  _ret = filed_wor
89e0: 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74  ker_threads_init
89f0: 28 66 64 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e  (fd, thread_coun
8a00: 74 2c 20 26 74 68 72 65 61 64 5f 6f 70 74 69 6f  t, &thread_optio
8a10: 6e 73 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  ns);..if (init_r
8a20: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
8a30: 72 6f 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b 65  ror("filed_worke
8a40: 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 22 29  r_threads_init")
8a50: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 35 29 3b 0a  ;....return(5);.
8a60: 09 7d 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f 72  .}.../* Wait for
8a70: 20 74 68 72 65 61 64 73 20 74 6f 20 65 78 69 74   threads to exit
8a80: 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44 4f   */../* XXX:TODO
8a90: 3a 20 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61 64  : Monitor thread
8aa0: 20 75 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c 65   usage */..while
8ab0: 20 28 31 29 20 7b 0a 09 09 73 6c 65 65 70 28 36   (1) {...sleep(6
8ac0: 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74 75  0);..}.../* Retu
8ad0: 72 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  rn in failure */
8ae0: 0a 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a     ..return(2);.}.