Hex Artifact Content

Artifact 3f7bad2ab61c8e0f2a504996e73a51ae7124b994:


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 39 22 0a 23 64 65 66 69 6e  ION "1.9".#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 2f 2a 2a  ER_SIZE]; .../**
0670: 2a 20 50 61 74 68 20 74 79 70 65 20 2a 2a 2a 2f  * Path type ***/
0680: 0a 09 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44  ..enum {...FILED
0690: 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 44 49  _REQUEST_TYPE_DI
06a0: 52 45 43 54 4f 52 59 2c 0a 09 09 46 49 4c 45 44  RECTORY,...FILED
06b0: 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 4f 54  _REQUEST_TYPE_OT
06c0: 48 45 52 0a 09 7d 20 74 79 70 65 3b 0a 0a 09 73  HER..} type;...s
06d0: 74 72 75 63 74 20 7b 0a 09 09 73 74 72 75 63 74  truct {...struct
06e0: 20 7b 0a 09 09 09 69 6e 74 20 70 72 65 73 65 6e   {....int presen
06f0: 74 3b 0a 09 09 09 6f 66 66 5f 74 20 6f 66 66 73  t;....off_t offs
0700: 65 74 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e 67 65  et;   /*** Range
0710: 20 73 74 61 72 74 20 2a 2a 2a 2f 0a 09 09 09 6f   start ***/....o
0720: 66 66 5f 74 20 6c 65 6e 67 74 68 3b 20 20 20 2f  ff_t length;   /
0730: 2a 2a 2a 20 52 61 6e 67 65 20 6c 65 6e 67 74 68  *** Range length
0740: 20 2a 2a 2a 2f 0a 09 09 7d 20 72 61 6e 67 65 3b   ***/...} range;
0750: 0a 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09  ....struct {....
0760: 69 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09 09  int present;....
0770: 63 68 61 72 20 68 6f 73 74 5b 46 49 4c 45 44 5f  char host[FILED_
0780: 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a 45  PATH_BUFFER_SIZE
0790: 5d 3b 0a 09 09 7d 20 68 6f 73 74 3b 0a 09 7d 20  ];...} host;..} 
07a0: 68 65 61 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20  headers;.};../* 
07b0: 4c 6f 67 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74  Log record */.st
07c0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
07d0: 6e 74 72 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20  ntry {../* Type 
07e0: 6f 66 20 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a  of log entry */.
07f0: 09 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f  .enum {...FILED_
0800: 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45  LOG_TYPE_MESSAGE
0810: 2c 0a 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59  ,...FILED_LOG_TY
0820: 50 45 5f 54 52 41 4e 53 46 45 52 0a 09 7d 20 74  PE_TRANSFER..} t
0830: 79 70 65 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64  ype;.../* Linked
0840: 20 6c 69 73 74 20 68 65 61 64 2f 74 61 69 6c 20   list head/tail 
0850: 2a 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  */..struct filed
0860: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78  _log_entry *_nex
0870: 74 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  t;..struct filed
0880: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65  _log_entry *_pre
0890: 76 3b 0a 0a 09 2f 2a 20 54 68 72 65 61 64 20 66  v;.../* Thread f
08a0: 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 6c  rom which this l
08b0: 6f 67 20 65 6e 74 72 79 20 65 6d 69 6e 61 74 65  og entry eminate
08c0: 73 20 2a 2f 0a 09 70 74 68 72 65 61 64 5f 74 20  s */..pthread_t 
08d0: 74 68 72 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73  thread;.../* Mes
08e0: 73 61 67 65 20 62 75 66 66 65 72 20 66 6f 72 20  sage buffer for 
08f0: 74 79 70 65 20 3d 20 4d 45 53 53 41 47 45 20 2a  type = MESSAGE *
0900: 2f 0a 09 2f 2a 20 50 61 74 68 20 62 75 66 66 65  /../* Path buffe
0910: 72 20 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41  r for type = TRA
0920: 4e 53 46 45 52 20 2a 2f 0a 09 63 68 61 72 20 62  NSFER */..char b
0930: 75 66 66 65 72 5b 46 49 4c 45 44 5f 50 41 54 48  uffer[FILED_PATH
0940: 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a  _BUFFER_SIZE];..
0950: 09 2f 2a 20 49 74 65 6d 73 20 66 6f 72 20 74 79  ./* Items for ty
0960: 70 65 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f  pe = TRANSFER */
0970: 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b  ..int http_code;
0980: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65  ..const char *re
0990: 61 73 6f 6e 3b 0a 09 74 69 6d 65 5f 74 20 73 74  ason;..time_t st
09a0: 61 72 74 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74  arttime;..time_t
09b0: 20 65 6e 64 74 69 6d 65 3b 0a 09 6f 66 66 5f 74   endtime;..off_t
09c0: 20 72 65 71 5f 6f 66 66 73 65 74 3b 0a 09 6f 66   req_offset;..of
09d0: 66 5f 74 20 72 65 71 5f 6c 65 6e 67 74 68 3b 0a  f_t req_length;.
09e0: 09 6f 66 66 5f 74 20 73 65 6e 74 5f 6c 65 6e 67  .off_t sent_leng
09f0: 74 68 3b 0a 09 6f 66 66 5f 74 20 66 69 6c 65 5f  th;..off_t file_
0a00: 6c 65 6e 67 74 68 3b 0a 09 63 68 61 72 20 69 70  length;..char ip
0a10: 5b 31 32 38 5d 3b 0a 09 69 6e 74 20 70 6f 72 74  [128];..int port
0a20: 3b 0a 09 69 6e 74 20 6d 65 74 68 6f 64 3b 0a 7d  ;..int method;.}
0a30: 3b 0a 0a 2f 2a 20 47 6c 6f 62 61 6c 20 76 61 72  ;../* Global var
0a40: 69 61 62 6c 65 73 20 2a 2f 0a 2f 2a 2a 20 4f 70  iables */./** Op
0a50: 65 6e 20 46 69 6c 65 20 63 61 63 68 65 20 2a 2a  en File cache **
0a60: 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66  /.struct filed_f
0a70: 69 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 66  ileinfo *filed_f
0a80: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20  ileinfo_fdcache 
0a90: 3d 20 4e 55 4c 4c 3b 0a 75 6e 73 69 67 6e 65 64  = NULL;.unsigned
0aa0: 20 69 6e 74 20 66 69 6c 65 64 5f 66 69 6c 65 69   int filed_filei
0ab0: 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65  nfo_fdcache_size
0ac0: 20 3d 20 30 3b 0a 0a 2f 2a 2a 20 4c 6f 67 67 69   = 0;../** Loggi
0ad0: 6e 67 20 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69  ng **/.struct fi
0ae0: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66  led_log_entry *f
0af0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
0b00: 74 3b 0a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t;.pthread_mutex
0b10: 5f 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  _t filed_log_msg
0b20: 5f 6c 69 73 74 5f 6d 75 74 65 78 3b 0a 70 74 68  _list_mutex;.pth
0b30: 72 65 61 64 5f 63 6f 6e 64 5f 74 20 66 69 6c 65  read_cond_t file
0b40: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72  d_log_msg_list_r
0b50: 65 61 64 79 3b 0a 0a 2f 2a 20 53 69 67 6e 61 6c  eady;../* Signal
0b60: 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 73 74 61 74   Handler */.stat
0b70: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 73 69  ic void filed_si
0b80: 67 6e 61 6c 5f 68 61 6e 64 6c 65 72 28 69 6e 74  gnal_handler(int
0b90: 20 73 69 67 6e 61 6c 5f 6e 75 6d 62 65 72 29 20   signal_number) 
0ba0: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
0bb0: 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b  fileinfo *cache;
0bc0: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69  ..unsigned int i
0bd0: 64 78 3b 0a 0a 09 73 77 69 74 63 68 20 28 73 69  dx;...switch (si
0be0: 67 6e 61 6c 5f 6e 75 6d 62 65 72 29 20 7b 0a 09  gnal_number) {..
0bf0: 09 63 61 73 65 20 53 49 47 48 55 50 3a 0a 09 09  .case SIGHUP:...
0c00: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
0c10: 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c 65 69  dx < filed_filei
0c20: 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65  nfo_fdcache_size
0c30: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63  ; idx++) {.....c
0c40: 61 63 68 65 20 3d 20 26 66 69 6c 65 64 5f 66 69  ache = &filed_fi
0c50: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69  leinfo_fdcache[i
0c60: 64 78 5d 3b 0a 0a 09 09 09 09 70 74 68 72 65 61  dx];......pthrea
0c70: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61  d_mutex_lock(&ca
0c80: 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09  che->mutex);....
0c90: 09 09 63 61 63 68 65 2d 3e 70 61 74 68 5b 30 5d  ..cache->path[0]
0ca0: 20 3d 20 27 5c 30 27 3b 0a 09 09 09 09 69 66 20   = '\0';.....if 
0cb0: 28 63 61 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29  (cache->fd >= 0)
0cc0: 20 7b 0a 09 09 09 09 09 63 6c 6f 73 65 28 63 61   {......close(ca
0cd0: 63 68 65 2d 3e 66 64 29 3b 0a 0a 09 09 09 09 09  che->fd);.......
0ce0: 63 61 63 68 65 2d 3e 66 64 20 3d 20 2d 31 3b 0a  cache->fd = -1;.
0cf0: 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 68 65  ....}......cache
0d00: 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a  ->lastmod = "";.
0d10: 09 09 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20  ....cache->type 
0d20: 3d 20 22 22 3b 0a 0a 09 09 09 09 70 74 68 72 65  = "";......pthre
0d30: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
0d40: 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a  &cache->mutex);.
0d50: 09 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ...}....break;..
0d60: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
0d70: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63  * Initialize cac
0d80: 68 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  he */.static int
0d90: 20 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68   filed_init_cach
0da0: 65 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63  e(unsigned int c
0db0: 61 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e  ache_size) {..un
0dc0: 73 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a  signed int idx;.
0dd0: 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f  .int mutex_init_
0de0: 72 65 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20  ret;.../* Cache 
0df0: 6d 61 79 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e  may not be re-in
0e00: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66  itialized */..if
0e10: 20 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f   (filed_fileinfo
0e20: 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d  _fdcache_size !=
0e30: 20 30 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65   0 || filed_file
0e40: 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 21 3d 20  info_fdcache != 
0e50: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
0e60: 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c  (1);..}.../* All
0e70: 6f 63 61 74 65 20 63 61 63 68 65 20 2a 2f 0a 09  ocate cache */..
0e80: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
0e90: 64 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 63 61  dcache_size = ca
0ea0: 63 68 65 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64  che_size;..filed
0eb0: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
0ec0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  e = malloc(sizeo
0ed0: 66 28 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  f(*filed_fileinf
0ee0: 6f 5f 66 64 63 61 63 68 65 29 20 2a 20 66 69 6c  o_fdcache) * fil
0ef0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
0f00: 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28  che_size);..if (
0f10: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
0f20: 64 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20  dcache == NULL) 
0f30: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
0f40: 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  }.../* Initializ
0f50: 65 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 20  e cache entries 
0f60: 2a 2f 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  */..for (idx = 0
0f70: 3b 20 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69  ; idx < filed_fi
0f80: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73  leinfo_fdcache_s
0f90: 69 7a 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ize; idx++) {...
0fa0: 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d  mutex_init_ret =
0fb0: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69   pthread_mutex_i
0fc0: 6e 69 74 28 26 66 69 6c 65 64 5f 66 69 6c 65 69  nit(&filed_filei
0fd0: 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d  nfo_fdcache[idx]
0fe0: 2e 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09  .mutex, NULL);..
0ff0: 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f  .if (mutex_init_
1000: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72  ret != 0) {....r
1010: 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09  eturn(1);...}...
1020: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
1030: 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 70 61 74  fdcache[idx].pat
1040: 68 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 66  h[0] = '\0';...f
1050: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1060: 63 61 63 68 65 5b 69 64 78 5d 2e 66 64 20 3d 20  cache[idx].fd = 
1070: 2d 31 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65  -1;...filed_file
1080: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78  info_fdcache[idx
1090: 5d 2e 6c 61 73 74 6d 6f 64 20 3d 20 22 22 3b 0a  ].lastmod = "";.
10a0: 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  ..filed_fileinfo
10b0: 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 74 79  _fdcache[idx].ty
10c0: 70 65 20 3d 20 22 22 3b 0a 09 7d 0a 0a 09 72 65  pe = "";..}...re
10d0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 49  turn(0);.}../* I
10e0: 6e 69 74 69 61 6c 69 7a 65 20 70 72 6f 63 65 73  nitialize proces
10f0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1100: 66 69 6c 65 64 5f 69 6e 69 74 28 75 6e 73 69 67  filed_init(unsig
1110: 6e 65 64 20 69 6e 74 20 63 61 63 68 65 5f 73 69  ned int cache_si
1120: 7a 65 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e  ze) {..static in
1130: 74 20 63 61 6c 6c 65 64 20 3d 20 30 3b 0a 09 75  t called = 0;..u
1140: 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 61 6e 64  nsigned int rand
1150: 6f 6d 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 09 69  om_value = 0;..i
1160: 6e 74 20 63 61 63 68 65 5f 72 65 74 3b 0a 09 69  nt cache_ret;..i
1170: 6e 74 20 72 61 6e 64 6f 6d 5f 66 64 3b 0a 0a 09  nt random_fd;...
1180: 69 66 20 28 63 61 6c 6c 65 64 29 20 7b 0a 09 09  if (called) {...
1190: 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
11a0: 63 61 6c 6c 65 64 20 3d 20 31 3b 0a 0a 09 2f 2a  called = 1;.../*
11b0: 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   Attempt to lock
11c0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 74 6f 20 70   all memory to p
11d0: 68 79 73 69 63 61 6c 20 52 41 4d 20 28 62 75 74  hysical RAM (but
11e0: 20 64 6f 6e 27 74 20 63 61 72 65 20 69 66 20 77   don't care if w
11f0: 65 20 63 61 6e 27 74 29 20 2a 2f 0a 09 6d 6c 6f  e can't) */..mlo
1200: 63 6b 61 6c 6c 28 4d 43 4c 5f 43 55 52 52 45 4e  ckall(MCL_CURREN
1210: 54 20 7c 20 4d 43 4c 5f 46 55 54 55 52 45 29 3b  T | MCL_FUTURE);
1220: 0a 0a 09 2f 2a 20 49 67 6e 6f 72 65 20 53 49 47  .../* Ignore SIG
1230: 50 49 50 45 20 2a 2f 0a 09 73 69 67 6e 61 6c 28  PIPE */..signal(
1240: 53 49 47 50 49 50 45 2c 20 53 49 47 5f 49 47 4e  SIGPIPE, SIG_IGN
1250: 29 3b 0a 0a 09 2f 2a 20 48 61 6e 64 6c 65 20 53  );.../* Handle S
1260: 49 47 48 55 50 20 74 6f 20 72 65 6c 65 61 73 65  IGHUP to release
1270: 20 61 6c 6c 20 63 61 63 68 65 73 20 2a 2f 0a 09   all caches */..
1280: 73 69 67 6e 61 6c 28 53 49 47 48 55 50 2c 20 66  signal(SIGHUP, f
1290: 69 6c 65 64 5f 73 69 67 6e 61 6c 5f 68 61 6e 64  iled_signal_hand
12a0: 6c 65 72 29 3b 0a 0a 09 2f 2a 20 49 6e 69 74 69  ler);.../* Initi
12b0: 61 6c 69 7a 65 20 63 61 63 68 65 20 73 74 72 75  alize cache stru
12c0: 63 74 75 72 65 20 2a 2f 0a 09 63 61 63 68 65 5f  cture */..cache_
12d0: 72 65 74 20 3d 20 66 69 6c 65 64 5f 69 6e 69 74  ret = filed_init
12e0: 5f 63 61 63 68 65 28 63 61 63 68 65 5f 73 69 7a  _cache(cache_siz
12f0: 65 29 3b 0a 09 69 66 20 28 63 61 63 68 65 5f 72  e);..if (cache_r
1300: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  et != 0) {...ret
1310: 75 72 6e 28 63 61 63 68 65 5f 72 65 74 29 3b 0a  urn(cache_ret);.
1320: 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69  .}.../* Initiali
1330: 7a 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  ze random number
1340: 20 67 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 09 72   generator */..r
1350: 61 6e 64 6f 6d 5f 66 64 20 3d 20 6f 70 65 6e 28  andom_fd = open(
1360: 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
1370: 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09 69 66 20 28  O_RDONLY);..if (
1380: 72 61 6e 64 6f 6d 5f 66 64 20 3e 3d 20 30 29 20  random_fd >= 0) 
1390: 7b 0a 09 09 72 65 61 64 28 72 61 6e 64 6f 6d 5f  {...read(random_
13a0: 66 64 2c 20 26 72 61 6e 64 6f 6d 5f 76 61 6c 75  fd, &random_valu
13b0: 65 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  e, sizeof(random
13c0: 5f 76 61 6c 75 65 29 29 3b 0a 0a 09 09 63 6c 6f  _value));....clo
13d0: 73 65 28 72 61 6e 64 6f 6d 5f 66 64 29 3b 0a 09  se(random_fd);..
13e0: 7d 0a 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65  }...random_value
13f0: 20 5e 3d 20 67 65 74 70 69 64 28 29 3b 0a 09 72   ^= getpid();..r
1400: 61 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 67  andom_value ^= g
1410: 65 74 75 69 64 28 29 3b 0a 09 72 61 6e 64 6f 6d  etuid();..random
1420: 5f 76 61 6c 75 65 20 5e 3d 20 74 69 6d 65 28 4e  _value ^= time(N
1430: 55 4c 4c 29 3b 0a 0a 09 73 72 61 6e 64 6f 6d 28  ULL);...srandom(
1440: 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 29 3b 0a 0a  random_value);..
1450: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
1460: 2a 20 4c 69 73 74 65 6e 20 6f 6e 20 61 20 70 61  * Listen on a pa
1470: 72 74 69 63 75 6c 61 72 20 61 64 64 72 65 73 73  rticular address
1480: 2f 70 6f 72 74 20 2a 2f 0a 73 74 61 74 69 63 20  /port */.static 
1490: 69 6e 74 20 66 69 6c 65 64 5f 6c 69 73 74 65 6e  int filed_listen
14a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 64 64  (const char *add
14b0: 72 65 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 69  ress, unsigned i
14c0: 6e 74 20 70 6f 72 74 29 20 7b 0a 09 73 74 72 75  nt port) {..stru
14d0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  ct sockaddr_in6 
14e0: 61 64 64 72 5f 76 36 3b 0a 09 73 74 72 75 63 74  addr_v6;..struct
14f0: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 61 64 64   sockaddr_in add
1500: 72 5f 76 34 3b 0a 09 73 74 72 75 63 74 20 73 6f  r_v4;..struct so
1510: 63 6b 61 64 64 72 20 2a 61 64 64 72 3b 0a 09 73  ckaddr *addr;..s
1520: 6f 63 6b 6c 65 6e 5f 74 20 61 64 64 72 5f 6c 65  ocklen_t addr_le
1530: 6e 3b 0a 09 69 6e 74 20 70 74 6f 6e 5f 72 65 74  n;..int pton_ret
1540: 2c 20 62 69 6e 64 5f 72 65 74 2c 20 6c 69 73 74  , bind_ret, list
1550: 65 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 66 61 6d  en_ret;..int fam
1560: 69 6c 79 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 0a  ily;..int fd;...
1570: 09 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45  .family = AF_INE
1580: 54 36 3b 0a 09 70 74 6f 6e 5f 72 65 74 20 3d 20  T6;..pton_ret = 
1590: 69 6e 65 74 5f 70 74 6f 6e 28 66 61 6d 69 6c 79  inet_pton(family
15a0: 2c 20 61 64 64 72 65 73 73 2c 20 26 61 64 64 72  , address, &addr
15b0: 5f 76 36 2e 73 69 6e 36 5f 61 64 64 72 2e 73 36  _v6.sin6_addr.s6
15c0: 5f 61 64 64 72 29 3b 0a 09 69 66 20 28 70 74 6f  _addr);..if (pto
15d0: 6e 5f 72 65 74 20 21 3d 20 31 29 20 7b 0a 09 09  n_ret != 1) {...
15e0: 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54  family = AF_INET
15f0: 3b 0a 09 09 70 74 6f 6e 5f 72 65 74 20 3d 20 69  ;...pton_ret = i
1600: 6e 65 74 5f 70 74 6f 6e 28 66 61 6d 69 6c 79 2c  net_pton(family,
1610: 20 61 64 64 72 65 73 73 2c 20 26 61 64 64 72 5f   address, &addr_
1620: 76 34 2e 73 69 6e 5f 61 64 64 72 2e 73 5f 61 64  v4.sin_addr.s_ad
1630: 64 72 29 3b 0a 09 09 69 66 20 28 70 74 6f 6e 5f  dr);...if (pton_
1640: 72 65 74 20 21 3d 20 31 29 20 7b 0a 09 09 09 72  ret != 1) {....r
1650: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
1660: 09 09 61 64 64 72 5f 76 34 2e 73 69 6e 5f 66 61  ..addr_v4.sin_fa
1670: 6d 69 6c 79 20 3d 20 66 61 6d 69 6c 79 3b 0a 09  mily = family;..
1680: 09 61 64 64 72 5f 76 34 2e 73 69 6e 5f 70 6f 72  .addr_v4.sin_por
1690: 74 20 3d 20 68 74 6f 6e 73 28 70 6f 72 74 29 3b  t = htons(port);
16a0: 0a 0a 09 09 61 64 64 72 20 3d 20 28 73 74 72 75  ....addr = (stru
16b0: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26  ct sockaddr *) &
16c0: 61 64 64 72 5f 76 34 3b 0a 09 09 61 64 64 72 5f  addr_v4;...addr_
16d0: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64 64  len = sizeof(add
16e0: 72 5f 76 34 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  r_v4);..} else {
16f0: 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f  ...addr_v6.sin6_
1700: 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54  family = AF_INET
1710: 36 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e  6;...addr_v6.sin
1720: 36 5f 66 6c 6f 77 69 6e 66 6f 20 3d 20 30 3b 0a  6_flowinfo = 0;.
1730: 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 73  ..addr_v6.sin6_s
1740: 63 6f 70 65 5f 69 64 20 3d 20 30 3b 0a 09 09 61  cope_id = 0;...a
1750: 64 64 72 5f 76 36 2e 73 69 6e 36 5f 70 6f 72 74  ddr_v6.sin6_port
1760: 20 3d 20 68 74 6f 6e 73 28 70 6f 72 74 29 3b 0a   = htons(port);.
1770: 0a 09 09 61 64 64 72 20 3d 20 28 73 74 72 75 63  ...addr = (struc
1780: 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61  t sockaddr *) &a
1790: 64 64 72 5f 76 36 3b 0a 09 09 61 64 64 72 5f 6c  ddr_v6;...addr_l
17a0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72  en = sizeof(addr
17b0: 5f 76 36 29 3b 0a 09 7d 0a 0a 09 66 64 20 3d 20  _v6);..}...fd = 
17c0: 73 6f 63 6b 65 74 28 66 61 6d 69 6c 79 2c 20 53  socket(family, S
17d0: 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29 3b 0a  OCK_STREAM, 0);.
17e0: 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09  .if (fd < 0) {..
17f0: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1800: 0a 09 62 69 6e 64 5f 72 65 74 20 3d 20 62 69 6e  ..bind_ret = bin
1810: 64 28 66 64 2c 20 61 64 64 72 2c 20 61 64 64 72  d(fd, addr, addr
1820: 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 62 69 6e 64  _len);..if (bind
1830: 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 63 6c  _ret < 0) {...cl
1840: 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74 75  ose(fd);....retu
1850: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6c 69 73  rn(-1);..}...lis
1860: 74 65 6e 5f 72 65 74 20 3d 20 6c 69 73 74 65 6e  ten_ret = listen
1870: 28 66 64 2c 20 31 32 38 29 3b 0a 09 69 66 20 28  (fd, 128);..if (
1880: 6c 69 73 74 65 6e 5f 72 65 74 20 21 3d 20 30 29  listen_ret != 0)
1890: 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a   {...close(fd);.
18a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
18b0: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
18c0: 7d 0a 0a 2f 2a 20 4c 6f 67 20 61 20 6d 65 73 73  }../* Log a mess
18d0: 61 67 65 20 2a 2f 0a 23 69 66 64 65 66 20 46 49  age */.#ifdef FI
18e0: 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 23 20 20  LED_DONT_LOG.#  
18f0: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
1900: 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74  ging_thread_init
1910: 28 78 29 20 30 0a 23 20 20 64 65 66 69 6e 65 20  (x) 0.#  define 
1920: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
1930: 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f  bug(x, ...) /**/
1940: 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64  .#  define filed
1950: 5f 6c 6f 67 5f 6d 73 67 28 78 2c 20 2e 2e 2e 29  _log_msg(x, ...)
1960: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
1970: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28  filed_log_entry(
1980: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  x) /**/.#  defin
1990: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 78  e filed_log_ip(x
19a0: 2c 20 2e 2e 2e 29 20 4e 55 4c 4c 0a 23 20 20 64  , ...) NULL.#  d
19b0: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
19c0: 6e 65 77 28 78 29 20 26 6c 6f 63 61 6c 5f 64 75  new(x) &local_du
19d0: 6d 6d 79 5f 6c 6f 67 0a 23 20 20 64 65 66 69 6e  mmy_log.#  defin
19e0: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e  e filed_log_open
19f0: 28 78 29 20 73 74 64 6f 75 74 0a 23 65 6c 73 65  (x) stdout.#else
1a00: 0a 23 20 20 69 66 64 65 66 20 46 49 4c 45 44 5f  .#  ifdef FILED_
1a10: 44 45 42 55 47 0a 23 20 20 20 20 64 65 66 69 6e  DEBUG.#    defin
1a20: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  e filed_log_msg_
1a30: 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 7b 20  debug(x, ...) { 
1a40: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1a50: 78 2c 20 5f 5f 56 41 5f 41 52 47 53 5f 5f 29 3b  x, __VA_ARGS__);
1a60: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1a70: 20 22 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 73   "\n"); fflush(s
1a80: 74 64 65 72 72 29 3b 20 7d 0a 23 20 20 65 6c 73  tderr); }.#  els
1a90: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 66 69  e.#    define fi
1aa0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
1ab0: 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23  g(x, ...) /**/.#
1ac0: 20 20 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74    endif../* Init
1ad0: 69 61 6c 69 7a 65 20 6c 6f 67 67 69 6e 67 20 74  ialize logging t
1ae0: 68 72 65 61 64 20 2a 2f 0a 73 74 61 74 69 63 20  hread */.static 
1af0: 76 6f 69 64 20 2a 66 69 6c 65 64 5f 6c 6f 67 67  void *filed_logg
1b00: 69 6e 67 5f 74 68 72 65 61 64 28 76 6f 69 64 20  ing_thread(void 
1b10: 2a 61 72 67 5f 70 29 20 7b 0a 09 73 74 72 75 63  *arg_p) {..struc
1b20: 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  t filed_logging_
1b30: 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67  thread_args *arg
1b40: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
1b50: 6c 6f 67 5f 65 6e 74 72 79 20 2a 63 75 72 72 2c  log_entry *curr,
1b60: 20 2a 70 72 65 76 3b 0a 09 63 6f 6e 73 74 20 63   *prev;..const c
1b70: 68 61 72 20 2a 6d 65 74 68 6f 64 3b 0a 09 74 69  har *method;..ti
1b80: 6d 65 5f 74 20 6e 6f 77 3b 0a 09 46 49 4c 45 20  me_t now;..FILE 
1b90: 2a 66 70 3b 0a 0a 09 61 72 67 20 3d 20 61 72 67  *fp;...arg = arg
1ba0: 5f 70 3b 0a 0a 09 66 70 20 3d 20 61 72 67 2d 3e  _p;...fp = arg->
1bb0: 66 70 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20  fp;...while (1) 
1bc0: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
1bd0: 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f  x_lock(&filed_lo
1be0: 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78  g_msg_list_mutex
1bf0: 29 3b 0a 09 09 70 74 68 72 65 61 64 5f 63 6f 6e  );...pthread_con
1c00: 64 5f 77 61 69 74 28 26 66 69 6c 65 64 5f 6c 6f  d_wait(&filed_lo
1c10: 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64 79  g_msg_list_ready
1c20: 2c 20 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  , &filed_log_msg
1c30: 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09  _list_mutex);...
1c40: 09 63 75 72 72 20 3d 20 66 69 6c 65 64 5f 6c 6f  .curr = filed_lo
1c50: 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 09 66 69  g_msg_list;...fi
1c60: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
1c70: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 70 74 68 72   = NULL;....pthr
1c80: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
1c90: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
1ca0: 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 09  list_mutex);....
1cb0: 6e 6f 77 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29  now = time(NULL)
1cc0: 3b 0a 0a 09 09 70 72 65 76 20 3d 20 4e 55 4c 4c  ;....prev = NULL
1cd0: 3b 0a 09 09 66 6f 72 20 28 3b 20 63 75 72 72 3b  ;...for (; curr;
1ce0: 20 63 75 72 72 20 3d 20 63 75 72 72 2d 3e 5f 6e   curr = curr->_n
1cf0: 65 78 74 29 20 7b 0a 09 09 09 63 75 72 72 2d 3e  ext) {....curr->
1d00: 5f 70 72 65 76 20 3d 20 70 72 65 76 3b 0a 0a 09  _prev = prev;...
1d10: 09 09 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 09  ..prev = curr;..
1d20: 09 7d 0a 0a 09 09 63 75 72 72 20 3d 20 70 72 65  .}....curr = pre
1d30: 76 3b 0a 09 09 77 68 69 6c 65 20 28 63 75 72 72  v;...while (curr
1d40: 29 20 7b 0a 09 09 09 73 77 69 74 63 68 20 28 63  ) {....switch (c
1d50: 75 72 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  urr->type) {....
1d60: 09 63 61 73 65 20 46 49 4c 45 44 5f 4c 4f 47 5f  .case FILED_LOG_
1d70: 54 59 50 45 5f 4d 45 53 53 41 47 45 3a 0a 09 09  TYPE_MESSAGE:...
1d80: 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  ...fprintf(fp, "
1d90: 25 73 22 2c 20 63 75 72 72 2d 3e 62 75 66 66 65  %s", curr->buffe
1da0: 72 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  r);.......break;
1db0: 0a 09 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f  .....case FILED_
1dc0: 4c 4f 47 5f 54 59 50 45 5f 54 52 41 4e 53 46 45  LOG_TYPE_TRANSFE
1dd0: 52 3a 0a 09 09 09 09 09 73 77 69 74 63 68 20 28  R:......switch (
1de0: 63 75 72 72 2d 3e 6d 65 74 68 6f 64 29 20 7b 0a  curr->method) {.
1df0: 09 09 09 09 09 09 63 61 73 65 20 46 49 4c 45 44  ......case FILED
1e00: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
1e10: 47 45 54 3a 0a 09 09 09 09 09 09 09 6d 65 74 68  GET:........meth
1e20: 6f 64 3d 22 47 45 54 22 3b 0a 09 09 09 09 09 09  od="GET";.......
1e30: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 63 61  .break;.......ca
1e40: 73 65 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54  se FILED_REQUEST
1e50: 5f 4d 45 54 48 4f 44 5f 48 45 41 44 3a 0a 09 09  _METHOD_HEAD:...
1e60: 09 09 09 09 09 6d 65 74 68 6f 64 3d 22 48 45 41  .....method="HEA
1e70: 44 22 3b 0a 09 09 09 09 09 09 09 62 72 65 61 6b  D";........break
1e80: 3b 0a 09 09 09 09 09 09 64 65 66 61 75 6c 74 3a  ;.......default:
1e90: 0a 09 09 09 09 09 09 09 6d 65 74 68 6f 64 3d 22  ........method="
1ea0: 3c 75 6e 6b 6e 6f 77 6e 3e 22 3b 0a 09 09 09 09  <unknown>";.....
1eb0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1ec0: 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 2d  .......if (curr-
1ed0: 3e 65 6e 64 74 69 6d 65 20 3d 3d 20 28 28 74 69  >endtime == ((ti
1ee0: 6d 65 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 09  me_t) -1)) {....
1ef0: 09 09 09 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65  ...curr->endtime
1f00: 20 3d 20 6e 6f 77 3b 0a 09 09 09 09 09 7d 0a 0a   = now;......}..
1f10: 09 09 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c  .....fprintf(fp,
1f20: 20 22 54 52 41 4e 53 46 45 52 20 4d 45 54 48 4f   "TRANSFER METHO
1f30: 44 3d 25 73 20 50 41 54 48 3d 25 73 20 53 52 43  D=%s PATH=%s SRC
1f40: 3d 25 73 3a 25 69 20 54 49 4d 45 2e 53 54 41 52  =%s:%i TIME.STAR
1f50: 54 3d 25 6c 6c 75 20 54 49 4d 45 2e 45 4e 44 3d  T=%llu TIME.END=
1f60: 25 6c 6c 75 20 43 4f 44 45 2e 56 41 4c 55 45 3d  %llu CODE.VALUE=
1f70: 25 75 20 43 4f 44 45 2e 52 45 41 53 4f 4e 3d 25  %u CODE.REASON=%
1f80: 73 20 52 45 51 55 45 53 54 2e 4f 46 46 53 45 54  s REQUEST.OFFSET
1f90: 3d 25 6c 6c 75 20 52 45 51 55 45 53 54 2e 4c 45  =%llu REQUEST.LE
1fa0: 4e 47 54 48 3d 25 6c 6c 75 20 46 49 4c 45 2e 4c  NGTH=%llu FILE.L
1fb0: 45 4e 47 54 48 3d 25 6c 6c 75 20 54 52 41 4e 53  ENGTH=%llu TRANS
1fc0: 46 45 52 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 22  FER.LENGTH=%llu"
1fd0: 2c 0a 09 09 09 09 09 09 6d 65 74 68 6f 64 2c 0a  ,.......method,.
1fe0: 09 09 09 09 09 09 63 75 72 72 2d 3e 62 75 66 66  ......curr->buff
1ff0: 65 72 2c 0a 09 09 09 09 09 09 63 75 72 72 2d 3e  er,.......curr->
2000: 69 70 2c 20 63 75 72 72 2d 3e 70 6f 72 74 2c 0a  ip, curr->port,.
2010: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
2020: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
2030: 3e 73 74 61 72 74 74 69 6d 65 2c 0a 09 09 09 09  >starttime,.....
2040: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
2050: 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 65 6e 64   long) curr->end
2060: 74 69 6d 65 2c 0a 09 09 09 09 09 09 63 75 72 72  time,.......curr
2070: 2d 3e 68 74 74 70 5f 63 6f 64 65 2c 20 63 75 72  ->http_code, cur
2080: 72 2d 3e 72 65 61 73 6f 6e 2c 0a 09 09 09 09 09  r->reason,......
2090: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
20a0: 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 72 65 71 5f  long) curr->req_
20b0: 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 09 28 75  offset,.......(u
20c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
20d0: 67 29 20 63 75 72 72 2d 3e 72 65 71 5f 6c 65 6e  g) curr->req_len
20e0: 67 74 68 2c 0a 09 09 09 09 09 09 28 75 6e 73 69  gth,.......(unsi
20f0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2100: 63 75 72 72 2d 3e 66 69 6c 65 5f 6c 65 6e 67 74  curr->file_lengt
2110: 68 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  h,.......(unsign
2120: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
2130: 72 72 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 0a  rr->sent_length.
2140: 09 09 09 09 09 29 3b 0a 0a 09 09 09 09 09 62 72  .....);.......br
2150: 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 09 66 70 72  eak;....}....fpr
2160: 69 6e 74 66 28 66 70 2c 20 22 20 54 48 52 45 41  intf(fp, " THREA
2170: 44 3d 25 6c 6c 75 20 54 49 4d 45 3d 25 6c 6c 75  D=%llu TIME=%llu
2180: 5c 6e 22 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e  \n",.....(unsign
2190: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75  ed long long) cu
21a0: 72 72 2d 3e 74 68 72 65 61 64 2c 0a 09 09 09 09  rr->thread,.....
21b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
21c0: 6f 6e 67 29 20 6e 6f 77 0a 09 09 09 29 3b 0a 09  ong) now....);..
21d0: 09 09 66 66 6c 75 73 68 28 66 70 29 3b 0a 0a 09  ..fflush(fp);...
21e0: 09 09 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 09  ..prev = curr;..
21f0: 09 09 63 75 72 72 20 3d 20 63 75 72 72 2d 3e 5f  ..curr = curr->_
2200: 70 72 65 76 3b 0a 0a 09 09 09 66 72 65 65 28 70  prev;.....free(p
2210: 72 65 76 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72  rev);...}..}...r
2220: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a  eturn(NULL);.}..
2230: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
2240: 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 73 74 72 75  d_log_entry(stru
2250: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
2260: 72 79 20 2a 65 6e 74 72 79 29 20 7b 0a 09 65 6e  ry *entry) {..en
2270: 74 72 79 2d 3e 74 68 72 65 61 64 20 3d 20 70 74  try->thread = pt
2280: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 0a 09  hread_self();...
2290: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
22a0: 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ck(&filed_log_ms
22b0: 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a  g_list_mutex);..
22c0: 09 65 6e 74 72 79 2d 3e 5f 6e 65 78 74 20 3d 20  .entry->_next = 
22d0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
22e0: 73 74 3b 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  st;..filed_log_m
22f0: 73 67 5f 6c 69 73 74 20 3d 20 65 6e 74 72 79 3b  sg_list = entry;
2300: 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
2310: 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c  _unlock(&filed_l
2320: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65  og_msg_list_mute
2330: 78 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 6f  x);...pthread_co
2340: 6e 64 5f 73 69 67 6e 61 6c 28 26 66 69 6c 65 64  nd_signal(&filed
2350: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65  _log_msg_list_re
2360: 61 64 79 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  ady);...return;.
2370: 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
2380: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
2390: 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28   *filed_log_new(
23a0: 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 29 20  int initialize) 
23b0: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
23c0: 6c 6f 67 5f 65 6e 74 72 79 20 2a 72 65 74 76 61  log_entry *retva
23d0: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
23e0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 72 65 74  lloc(sizeof(*ret
23f0: 76 61 6c 29 29 3b 0a 0a 09 69 66 20 28 69 6e 69  val));...if (ini
2400: 74 69 61 6c 69 7a 65 29 20 7b 0a 09 09 72 65 74  tialize) {...ret
2410: 76 61 6c 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d  val->buffer[0] =
2420: 20 27 5c 30 27 3b 0a 09 09 72 65 74 76 61 6c 2d   '\0';...retval-
2430: 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 2d 31 3b  >http_code = -1;
2440: 0a 09 09 72 65 74 76 61 6c 2d 3e 73 74 61 72 74  ...retval->start
2450: 74 69 6d 65 20 3d 20 30 3b 0a 09 09 72 65 74 76  time = 0;...retv
2460: 61 6c 2d 3e 65 6e 64 74 69 6d 65 20 3d 20 30 3b  al->endtime = 0;
2470: 0a 09 09 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6f  ...retval->req_o
2480: 66 66 73 65 74 20 3d 20 30 3b 0a 09 09 72 65 74  ffset = 0;...ret
2490: 76 61 6c 2d 3e 72 65 71 5f 6c 65 6e 67 74 68 20  val->req_length 
24a0: 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 73  = 0;...retval->s
24b0: 65 6e 74 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a  ent_length = 0;.
24c0: 09 09 72 65 74 76 61 6c 2d 3e 66 69 6c 65 5f 6c  ..retval->file_l
24d0: 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72 65 74  ength = 0;...ret
24e0: 76 61 6c 2d 3e 69 70 5b 30 5d 20 3d 20 27 5c 30  val->ip[0] = '\0
24f0: 27 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 70 6f 72  ';...retval->por
2500: 74 20 3d 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c  t = -1;...retval
2510: 2d 3e 6d 65 74 68 6f 64 20 3d 20 2d 31 3b 0a 09  ->method = -1;..
2520: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
2530: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  l);.}..static vo
2540: 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  id filed_log_msg
2550: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74  (const char *fmt
2560: 2c 20 2e 2e 2e 29 20 7b 0a 09 73 74 72 75 63 74  , ...) {..struct
2570: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
2580: 20 2a 65 6e 74 72 79 3b 0a 09 76 61 5f 6c 69 73   *entry;..va_lis
2590: 74 20 61 72 67 73 3b 0a 0a 09 65 6e 74 72 79 20  t args;...entry 
25a0: 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28  = filed_log_new(
25b0: 30 29 3b 0a 0a 09 76 61 5f 73 74 61 72 74 28 61  0);...va_start(a
25c0: 72 67 73 2c 20 66 6d 74 29 3b 0a 0a 09 76 73 6e  rgs, fmt);...vsn
25d0: 70 72 69 6e 74 66 28 65 6e 74 72 79 2d 3e 62 75  printf(entry->bu
25e0: 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 65 6e 74  ffer, sizeof(ent
25f0: 72 79 2d 3e 62 75 66 66 65 72 29 2c 20 66 6d 74  ry->buffer), fmt
2600: 2c 20 61 72 67 73 29 3b 0a 0a 09 76 61 5f 65 6e  , args);...va_en
2610: 64 28 61 72 67 73 29 3b 0a 0a 09 65 6e 74 72 79  d(args);...entry
2620: 2d 3e 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 4c  ->type = FILED_L
2630: 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 3b  OG_TYPE_MESSAGE;
2640: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ...filed_log_ent
2650: 72 79 28 65 6e 74 72 79 29 3b 0a 0a 09 72 65 74  ry(entry);...ret
2660: 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  urn;.}..static c
2670: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 64  onst char *filed
2680: 5f 6c 6f 67 5f 69 70 28 73 74 72 75 63 74 20 73  _log_ip(struct s
2690: 6f 63 6b 61 64 64 72 20 2a 61 64 64 72 2c 20 63  ockaddr *addr, c
26a0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
26b0: 65 5f 74 20 62 75 66 66 65 72 6c 65 6e 29 20 7b  e_t bufferlen) {
26c0: 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64  ..struct sockadd
26d0: 72 5f 69 6e 20 2a 61 64 64 72 5f 76 34 3b 0a 09  r_in *addr_v4;..
26e0: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
26f0: 69 6e 36 20 2a 61 64 64 72 5f 76 36 3b 0a 09 63  in6 *addr_v6;..c
2700: 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 74 76 61  onst char *retva
2710: 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 61 64 64 72  l = NULL;...addr
2720: 5f 76 36 20 3d 20 28 73 74 72 75 63 74 20 73 6f  _v6 = (struct so
2730: 63 6b 61 64 64 72 5f 69 6e 36 20 2a 29 20 61 64  ckaddr_in6 *) ad
2740: 64 72 3b 0a 0a 09 73 77 69 74 63 68 20 28 61 64  dr;...switch (ad
2750: 64 72 5f 76 36 2d 3e 73 69 6e 36 5f 66 61 6d 69  dr_v6->sin6_fami
2760: 6c 79 29 20 7b 0a 09 09 63 61 73 65 20 41 46 5f  ly) {...case AF_
2770: 49 4e 45 54 3a 0a 09 09 09 61 64 64 72 5f 76 34  INET:....addr_v4
2780: 20 3d 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61   = (struct socka
2790: 64 64 72 5f 69 6e 20 2a 29 20 61 64 64 72 3b 0a  ddr_in *) addr;.
27a0: 09 09 09 72 65 74 76 61 6c 20 3d 20 69 6e 65 74  ...retval = inet
27b0: 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54 2c 20 26  _ntop(AF_INET, &
27c0: 61 64 64 72 5f 76 34 2d 3e 73 69 6e 5f 61 64 64  addr_v4->sin_add
27d0: 72 2c 20 62 75 66 66 65 72 2c 20 62 75 66 66 65  r, buffer, buffe
27e0: 72 6c 65 6e 29 3b 0a 09 09 09 62 72 65 61 6b 3b  rlen);....break;
27f0: 0a 09 09 63 61 73 65 20 41 46 5f 49 4e 45 54 36  ...case AF_INET6
2800: 3a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 69 6e  :....retval = in
2810: 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54 36  et_ntop(AF_INET6
2820: 2c 20 26 61 64 64 72 5f 76 36 2d 3e 73 69 6e 36  , &addr_v6->sin6
2830: 5f 61 64 64 72 2c 20 62 75 66 66 65 72 2c 20 62  _addr, buffer, b
2840: 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09 62 72  ufferlen);....br
2850: 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  eak;..}...return
2860: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
2870: 74 69 63 20 46 49 4c 45 20 2a 66 69 6c 65 64 5f  tic FILE *filed_
2880: 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  log_open(const c
2890: 68 61 72 20 2a 66 69 6c 65 29 20 7b 0a 09 46 49  har *file) {..FI
28a0: 4c 45 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 69 66  LE *retval;...if
28b0: 20 28 73 74 72 63 6d 70 28 66 69 6c 65 2c 20 22   (strcmp(file, "
28c0: 2d 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  -") == 0) {...re
28d0: 74 76 61 6c 20 3d 20 73 74 64 6f 75 74 3b 0a 09  tval = stdout;..
28e0: 7d 20 65 6c 73 65 20 69 66 20 28 66 69 6c 65 5b  } else if (file[
28f0: 30 5d 20 3d 3d 20 27 7c 27 29 20 7b 0a 09 09 66  0] == '|') {...f
2900: 69 6c 65 2b 2b 3b 0a 09 09 72 65 74 76 61 6c 20  ile++;...retval 
2910: 3d 20 70 6f 70 65 6e 28 66 69 6c 65 2c 20 22 77  = popen(file, "w
2920: 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
2930: 72 65 74 76 61 6c 20 3d 20 66 6f 70 65 6e 28 66  retval = fopen(f
2940: 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09 7d 0a 0a  ile, "a+");..}..
2950: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2960: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
2970: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
2980: 65 61 64 5f 69 6e 69 74 28 46 49 4c 45 20 2a 6c  ead_init(FILE *l
2990: 6f 67 66 70 29 20 7b 0a 09 73 74 72 75 63 74 20  ogfp) {..struct 
29a0: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
29b0: 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 73 3b  read_args *args;
29c0: 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72 65  ..pthread_t thre
29d0: 61 64 5f 69 64 3b 0a 0a 09 61 72 67 73 20 3d 20  ad_id;...args = 
29e0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 61  malloc(sizeof(*a
29f0: 72 67 73 29 29 3b 0a 09 61 72 67 73 2d 3e 66 70  rgs));..args->fp
2a00: 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66 69 6c 65   = logfp;...file
2a10: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d  d_log_msg_list =
2a20: 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72 65 61 64   NULL;...pthread
2a30: 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 66 69 6c  _mutex_init(&fil
2a40: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
2a50: 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  mutex, NULL);...
2a60: 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26  pthread_create(&
2a70: 74 68 72 65 61 64 5f 69 64 2c 20 4e 55 4c 4c 2c  thread_id, NULL,
2a80: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
2a90: 68 72 65 61 64 2c 20 61 72 67 73 29 3b 0a 0a 09  hread, args);...
2aa0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 53  filed_log_msg("S
2ab0: 54 41 52 54 22 29 3b 0a 0a 09 72 65 74 75 72 6e  TART");...return
2ac0: 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  (0);.}.#endif../
2ad0: 2a 20 46 6f 72 6d 61 74 20 74 69 6d 65 20 70 65  * Format time pe
2ae0: 72 20 52 46 43 32 36 31 36 20 2a 2f 0a 73 74 61  r RFC2616 */.sta
2af0: 74 69 63 20 63 68 61 72 20 2a 66 69 6c 65 64 5f  tic char *filed_
2b00: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 63 68 61 72  format_time(char
2b10: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
2b20: 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 63 6f 6e   buffer_len, con
2b30: 73 74 20 74 69 6d 65 5f 74 20 74 69 6d 65 69 6e  st time_t timein
2b40: 66 6f 29 20 7b 0a 09 73 74 72 75 63 74 20 74 6d  fo) {..struct tm
2b50: 20 74 69 6d 65 69 6e 66 6f 5f 74 6d 2c 20 2a 74   timeinfo_tm, *t
2b60: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 3b 0a 0a 09  imeinfo_tm_p;...
2b70: 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 20  timeinfo_tm_p = 
2b80: 67 6d 74 69 6d 65 5f 72 28 26 74 69 6d 65 69 6e  gmtime_r(&timein
2b90: 66 6f 2c 20 26 74 69 6d 65 69 6e 66 6f 5f 74 6d  fo, &timeinfo_tm
2ba0: 29 3b 0a 09 69 66 20 28 74 69 6d 65 69 6e 66 6f  );..if (timeinfo
2bb0: 5f 74 6d 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  _tm_p == NULL) {
2bc0: 0a 09 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f  ...return("unkno
2bd0: 77 6e 22 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65  wn");..}...buffe
2be0: 72 5b 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31  r[buffer_len - 1
2bf0: 5d 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65  ] = '\0';..buffe
2c00: 72 5f 6c 65 6e 20 3d 20 73 74 72 66 74 69 6d 65  r_len = strftime
2c10: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f  (buffer, buffer_
2c20: 6c 65 6e 20 2d 20 31 2c 20 22 25 61 2c 20 25 64  len - 1, "%a, %d
2c30: 20 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20   %b %Y %H:%M:%S 
2c40: 47 4d 54 22 2c 20 74 69 6d 65 69 6e 66 6f 5f 74  GMT", timeinfo_t
2c50: 6d 5f 70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62  m_p);...return(b
2c60: 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 68 61  uffer);.}../* ha
2c70: 73 68 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  sh */.static uns
2c80: 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f  igned int filed_
2c90: 68 61 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67  hash(const unsig
2ca0: 6e 65 64 20 63 68 61 72 20 2a 76 61 6c 75 65 2c  ned char *value,
2cb0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 6f   unsigned int mo
2cc0: 64 75 6c 75 73 29 20 7b 0a 09 75 6e 73 69 67 6e  dulus) {..unsign
2cd0: 65 64 20 63 68 61 72 20 63 75 72 72 2c 20 70 72  ed char curr, pr
2ce0: 65 76 3b 0a 09 69 6e 74 20 64 69 66 66 3b 0a 09  ev;..int diff;..
2cf0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 65 74  unsigned int ret
2d00: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
2d10: 6d 6f 64 75 6c 75 73 20 2d 20 31 3b 0a 09 70 72  modulus - 1;..pr
2d20: 65 76 20 3d 20 6d 6f 64 75 6c 75 73 20 25 20 32  ev = modulus % 2
2d30: 35 35 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 75  55;...while ((cu
2d40: 72 72 20 3d 20 2a 76 61 6c 75 65 29 29 20 7b 0a  rr = *value)) {.
2d50: 09 09 69 66 20 28 63 75 72 72 20 3c 20 33 32 29  ..if (curr < 32)
2d60: 20 7b 0a 09 09 09 63 75 72 72 20 3d 20 32 35 35   {....curr = 255
2d70: 20 2d 20 63 75 72 72 3b 0a 09 09 7d 20 65 6c 73   - curr;...} els
2d80: 65 20 7b 0a 09 09 09 63 75 72 72 20 2d 3d 20 33  e {....curr -= 3
2d90: 32 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 72  2;...}....if (pr
2da0: 65 76 20 3c 20 63 75 72 72 29 20 7b 0a 09 09 09  ev < curr) {....
2db0: 64 69 66 66 20 3d 20 63 75 72 72 20 2d 20 70 72  diff = curr - pr
2dc0: 65 76 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ev;...} else {..
2dd0: 09 09 64 69 66 66 20 3d 20 70 72 65 76 20 2d 20  ..diff = prev - 
2de0: 63 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 70 72 65  curr;...}....pre
2df0: 76 20 3d 20 63 75 72 72 3b 0a 0a 09 09 72 65 74  v = curr;....ret
2e00: 76 61 6c 20 3c 3c 3d 20 33 3b 0a 09 09 72 65 74  val <<= 3;...ret
2e10: 76 61 6c 20 26 3d 20 30 78 46 46 46 46 46 46 46  val &= 0xFFFFFFF
2e20: 46 4c 55 3b 0a 09 09 72 65 74 76 61 6c 20 5e 3d  FLU;...retval ^=
2e30: 20 64 69 66 66 3b 0a 0a 09 09 76 61 6c 75 65 2b   diff;....value+
2e40: 2b 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  +;..}...retval =
2e50: 20 72 65 74 76 61 6c 20 25 20 6d 6f 64 75 6c 75   retval % modulu
2e60: 73 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  s;...return(retv
2e70: 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20  al);.}../* Find 
2e80: 61 20 6d 69 6d 65 2d 74 79 70 65 20 62 61 73 65  a mime-type base
2e90: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d  d on the filenam
2ea0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  e */.static cons
2eb0: 74 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 64 65  t char *filed_de
2ec0: 74 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65  termine_mimetype
2ed0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
2ee0: 68 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72  h) {..const char
2ef0: 20 2a 70 3b 0a 0a 09 70 20 3d 20 73 74 72 72 63   *p;...p = strrc
2f00: 68 72 28 70 61 74 68 2c 20 27 2e 27 29 3b 0a 09  hr(path, '.');..
2f10: 69 66 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  if (p == NULL) {
2f20: 0a 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f  ...return(FILED_
2f30: 44 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09  DEFAULT_TYPE);..
2f40: 7d 0a 0a 09 70 2b 2b 3b 0a 09 69 66 20 28 2a 70  }...p++;..if (*p
2f50: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65   == '\0') {...re
2f60: 74 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55  turn(FILED_DEFAU
2f70: 4c 54 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 66  LT_TYPE);..}...f
2f80: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62  iled_log_msg_deb
2f90: 75 67 28 22 4c 6f 6f 6b 69 6e 67 20 75 70 20 4d  ug("Looking up M
2fa0: 49 4d 45 20 74 79 70 65 20 66 6f 72 20 25 73 20  IME type for %s 
2fb0: 28 68 61 73 68 20 3d 20 25 6c 6c 75 29 22 2c 20  (hash = %llu)", 
2fc0: 70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  p, (unsigned lon
2fd0: 67 20 6c 6f 6e 67 29 20 66 69 6c 65 64 5f 68 61  g long) filed_ha
2fe0: 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sh((const unsign
2ff0: 65 64 20 63 68 61 72 20 2a 29 20 70 2c 20 31 36  ed char *) p, 16
3000: 37 37 37 32 35 39 29 29 3b 0a 0a 23 69 6e 63 6c  777259));..#incl
3010: 75 64 65 20 22 66 69 6c 65 64 2d 6d 69 6d 65 2d  ude "filed-mime-
3020: 74 79 70 65 73 2e 68 22 0a 0a 09 72 65 74 75 72  types.h"...retur
3030: 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f  n(FILED_DEFAULT_
3040: 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  TYPE);.}../* Gen
3050: 65 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 69  erate a unique i
3060: 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 73 74 61  dentifier */.sta
3070: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 67  tic void filed_g
3080: 65 6e 65 72 61 74 65 5f 65 74 61 67 28 63 68 61  enerate_etag(cha
3090: 72 20 2a 65 74 61 67 2c 20 73 69 7a 65 5f 74 20  r *etag, size_t 
30a0: 6c 65 6e 67 74 68 29 20 7b 0a 09 73 6e 70 72 69  length) {..snpri
30b0: 6e 74 66 28 65 74 61 67 2c 20 6c 65 6e 67 74 68  ntf(etag, length
30c0: 2c 20 22 25 6c 6c 78 2d 25 6c 6c 78 25 6c 6c 78  , "%llx-%llx%llx
30d0: 25 6c 6c 78 25 6c 6c 78 22 2c 0a 09 09 28 75 6e  %llx%llx",...(un
30e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
30f0: 29 20 74 69 6d 65 28 4e 55 4c 4c 29 2c 0a 09 09  ) time(NULL),...
3100: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
3110: 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09  ong) random(),..
3120: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
3130: 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a  long) random(),.
3140: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
3150: 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29 2c   long) random(),
3160: 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
3170: 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28 29  g long) random()
3180: 0a 09 29 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20  ..);.}../* Open 
3190: 61 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72  a file and retur
31a0: 6e 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  n file informati
31b0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  on */.static str
31c0: 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  uct filed_filein
31d0: 66 6f 20 2a 66 69 6c 65 64 5f 6f 70 65 6e 5f 66  fo *filed_open_f
31e0: 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
31f0: 70 61 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c  path, struct fil
3200: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 62 75 66  ed_fileinfo *buf
3210: 66 65 72 29 20 7b 0a 09 73 74 72 75 63 74 20 66  fer) {..struct f
3220: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 63  iled_fileinfo *c
3230: 61 63 68 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ache;..unsigned 
3240: 69 6e 74 20 63 61 63 68 65 5f 69 64 78 3b 0a 09  int cache_idx;..
3250: 6f 66 66 5f 74 20 6c 65 6e 3b 0a 09 69 6e 74 20  off_t len;..int 
3260: 66 64 3b 0a 0a 09 63 61 63 68 65 5f 69 64 78 20  fd;...cache_idx 
3270: 3d 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f  = filed_hash((co
3280: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3290: 72 20 2a 29 20 70 61 74 68 2c 20 66 69 6c 65 64  r *) path, filed
32a0: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
32b0: 65 5f 73 69 7a 65 29 3b 0a 0a 09 63 61 63 68 65  e_size);...cache
32c0: 20 3d 20 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e   = &filed_filein
32d0: 66 6f 5f 66 64 63 61 63 68 65 5b 63 61 63 68 65  fo_fdcache[cache
32e0: 5f 69 64 78 5d 3b 0a 0a 09 66 69 6c 65 64 5f 6c  _idx];...filed_l
32f0: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f  og_msg_debug("Lo
3300: 63 6b 69 6e 67 20 6d 75 74 65 78 20 66 6f 72 20  cking mutex for 
3310: 69 64 78 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69  idx: %lu", (unsi
3320: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65  gned long) cache
3330: 5f 69 64 78 29 3b 0a 0a 09 70 74 68 72 65 61 64  _idx);...pthread
3340: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63  _mutex_lock(&cac
3350: 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 66 69  he->mutex);...fi
3360: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
3370: 67 28 22 43 6f 6d 70 6c 65 74 65 64 20 6c 6f 63  g("Completed loc
3380: 6b 69 6e 67 20 6d 75 74 65 78 20 66 6f 72 20 69  king mutex for i
3390: 64 78 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  dx: %lu", (unsig
33a0: 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f  ned long) cache_
33b0: 69 64 78 29 3b 0a 0a 09 69 66 20 28 73 74 72 63  idx);...if (strc
33c0: 6d 70 28 70 61 74 68 2c 20 63 61 63 68 65 2d 3e  mp(path, cache->
33d0: 70 61 74 68 29 20 21 3d 20 30 29 20 7b 0a 09 09  path) != 0) {...
33e0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
33f0: 62 75 67 28 22 43 61 63 68 65 20 6d 69 73 73 20  bug("Cache miss 
3400: 66 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20 4f 4c  for idx: %lu: OL
3410: 44 20 5c 22 25 73 5c 22 2c 20 4e 45 57 20 5c 22  D \"%s\", NEW \"
3420: 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64  %s\"", (unsigned
3430: 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78   long) cache_idx
3440: 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 2c 20 70  , cache->path, p
3450: 61 74 68 29 3b 0a 0a 09 09 66 64 20 3d 20 6f 70  ath);....fd = op
3460: 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c  en(path, O_RDONL
3470: 59 20 7c 20 4f 5f 4c 41 52 47 45 46 49 4c 45 29  Y | O_LARGEFILE)
3480: 3b 0a 09 09 69 66 20 28 66 64 20 3c 20 30 29 20  ;...if (fd < 0) 
3490: 7b 0a 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74  {....pthread_mut
34a0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65  ex_unlock(&cache
34b0: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 09 72 65  ->mutex);.....re
34c0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a  turn(NULL);...}.
34d0: 0a 09 09 69 66 20 28 63 61 63 68 65 2d 3e 66 64  ...if (cache->fd
34e0: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 63 6c 6f 73   >= 0) {....clos
34f0: 65 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09  e(cache->fd);...
3500: 7d 0a 0a 09 09 6c 65 6e 20 3d 20 6c 73 65 65 6b  }....len = lseek
3510: 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (fd, 0, SEEK_END
3520: 29 3b 0a 09 09 6c 73 65 65 6b 28 66 64 2c 20 30  );...lseek(fd, 0
3530: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 09 09  , SEEK_SET);....
3540: 63 61 63 68 65 2d 3e 66 64 20 3d 20 66 64 3b 0a  cache->fd = fd;.
3550: 09 09 63 61 63 68 65 2d 3e 6c 65 6e 20 3d 20 6c  ..cache->len = l
3560: 65 6e 3b 0a 09 09 73 74 72 63 70 79 28 63 61 63  en;...strcpy(cac
3570: 68 65 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b  he->path, path);
3580: 0a 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d  ...cache->type =
3590: 20 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65   filed_determine
35a0: 5f 6d 69 6d 65 74 79 70 65 28 70 61 74 68 29 3b  _mimetype(path);
35b0: 0a 09 09 66 69 6c 65 64 5f 67 65 6e 65 72 61 74  ...filed_generat
35c0: 65 5f 65 74 61 67 28 63 61 63 68 65 2d 3e 65 74  e_etag(cache->et
35d0: 61 67 2c 20 73 69 7a 65 6f 66 28 63 61 63 68 65  ag, sizeof(cache
35e0: 2d 3e 65 74 61 67 29 29 3b 0a 0a 09 09 2f 2a 20  ->etag));..../* 
35f0: 58 58 58 3a 54 4f 44 4f 3a 20 44 65 74 65 72 6d  XXX:TODO: Determ
3600: 69 6e 65 20 2a 2f 0a 09 09 63 61 63 68 65 2d 3e  ine */...cache->
3610: 6c 61 73 74 6d 6f 64 20 3d 20 66 69 6c 65 64 5f  lastmod = filed_
3620: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 63 61 63 68  format_time(cach
3630: 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20 73 69  e->lastmod_b, si
3640: 7a 65 6f 66 28 63 61 63 68 65 2d 3e 6c 61 73 74  zeof(cache->last
3650: 6d 6f 64 5f 62 29 2c 20 74 69 6d 65 28 4e 55 4c  mod_b), time(NUL
3660: 4c 29 20 2d 20 33 30 29 3b 0a 09 7d 20 65 6c 73  L) - 30);..} els
3670: 65 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  e {...filed_log_
3680: 6d 73 67 5f 64 65 62 75 67 28 22 43 61 63 68 65  msg_debug("Cache
3690: 20 68 69 74 20 66 6f 72 20 69 64 78 3a 20 25 6c   hit for idx: %l
36a0: 75 3a 20 50 41 54 48 20 5c 22 25 73 5c 22 22 2c  u: PATH \"%s\"",
36b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
36c0: 20 63 61 63 68 65 5f 69 64 78 2c 20 70 61 74 68   cache_idx, path
36d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 57  );..}.../*.. * W
36e0: 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61  e have to make a
36f0: 20 64 75 70 6c 69 63 61 74 65 20 46 44 2c 20 62   duplicate FD, b
3700: 65 63 61 75 73 65 20 6f 6e 63 65 20 77 65 20 72  ecause once we r
3710: 65 6c 65 61 73 65 20 74 68 65 20 63 61 63 68 65  elease the cache
3720: 0a 09 20 2a 20 6d 75 74 65 78 2c 20 74 68 65 20  .. * mutex, the 
3730: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
3740: 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 0a 09 20  may be closed.. 
3750: 2a 2f 0a 09 66 64 20 3d 20 64 75 70 28 63 61 63  */..fd = dup(cac
3760: 68 65 2d 3e 66 64 29 3b 0a 09 69 66 20 28 66 64  he->fd);..if (fd
3770: 20 3c 20 30 29 20 7b 0a 09 09 70 74 68 72 65 61   < 0) {...pthrea
3780: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
3790: 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  cache->mutex);..
37a0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
37b0: 09 7d 0a 0a 09 62 75 66 66 65 72 2d 3e 66 64 20  .}...buffer->fd 
37c0: 3d 20 66 64 3b 0a 09 62 75 66 66 65 72 2d 3e 6c  = fd;..buffer->l
37d0: 65 6e 20 3d 20 63 61 63 68 65 2d 3e 6c 65 6e 3b  en = cache->len;
37e0: 0a 09 62 75 66 66 65 72 2d 3e 74 79 70 65 20 3d  ..buffer->type =
37f0: 20 63 61 63 68 65 2d 3e 74 79 70 65 3b 0a 09 6d   cache->type;..m
3800: 65 6d 63 70 79 28 62 75 66 66 65 72 2d 3e 6c 61  emcpy(buffer->la
3810: 73 74 6d 6f 64 5f 62 2c 20 63 61 63 68 65 2d 3e  stmod_b, cache->
3820: 6c 61 73 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f  lastmod_b, sizeo
3830: 66 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f  f(buffer->lastmo
3840: 64 5f 62 29 29 3b 0a 09 6d 65 6d 63 70 79 28 62  d_b));..memcpy(b
3850: 75 66 66 65 72 2d 3e 65 74 61 67 2c 20 63 61 63  uffer->etag, cac
3860: 68 65 2d 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66  he->etag, sizeof
3870: 28 62 75 66 66 65 72 2d 3e 65 74 61 67 29 29 3b  (buffer->etag));
3880: 0a 09 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f  ..buffer->lastmo
3890: 64 20 3d 20 62 75 66 66 65 72 2d 3e 6c 61 73 74  d = buffer->last
38a0: 6d 6f 64 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e  mod_b + (cache->
38b0: 6c 61 73 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d  lastmod - cache-
38c0: 3e 6c 61 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 70  >lastmod_b);...p
38d0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
38e0: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
38f0: 78 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66  x);...return(buf
3900: 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f 63  fer);.}../* Proc
3910: 65 73 73 20 61 6e 20 48 54 54 50 20 72 65 71 75  ess an HTTP requ
3920: 65 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  est and return t
3930: 68 65 20 70 61 74 68 20 72 65 71 75 65 73 74 65  he path requeste
3940: 64 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  d */.static stru
3950: 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65  ct filed_http_re
3960: 71 75 65 73 74 20 2a 66 69 6c 65 64 5f 67 65 74  quest *filed_get
3970: 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28 46 49  _http_request(FI
3980: 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 66  LE *fp, struct f
3990: 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73  iled_http_reques
39a0: 74 20 2a 62 75 66 66 65 72 5f 73 74 2c 20 73 74  t *buffer_st, st
39b0: 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f  ruct filed_optio
39c0: 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09  ns *options) {..
39d0: 63 68 61 72 20 2a 6d 65 74 68 6f 64 2c 20 2a 70  char *method, *p
39e0: 61 74 68 3b 0a 09 63 68 61 72 20 2a 62 75 66 66  ath;..char *buff
39f0: 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72 2c  er, *workbuffer,
3a00: 20 2a 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78   *workbuffer_nex
3a10: 74 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73 5f  t;..char *fgets_
3a20: 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66  ret;..size_t buf
3a30: 66 65 72 5f 6c 65 6e 2c 20 70 61 74 68 5f 6c 65  fer_len, path_le
3a40: 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65 5f  n;..off_t range_
3a50: 73 74 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e 64  start, range_end
3a60: 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  , range_length;.
3a70: 09 69 6e 74 20 72 61 6e 67 65 5f 72 65 71 75 65  .int range_reque
3a80: 73 74 3b 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74  st;..int snprint
3a90: 66 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a 0a  f_ret;..int i;..
3aa0: 09 2f 2a 20 53 65 74 20 74 6f 20 64 65 66 61 75  ./* Set to defau
3ab0: 6c 74 20 76 61 6c 75 65 73 20 2a 2f 0a 09 72 61  lt values */..ra
3ac0: 6e 67 65 5f 73 74 61 72 74 20 3d 20 30 3b 0a 09  nge_start = 0;..
3ad0: 72 61 6e 67 65 5f 65 6e 64 20 20 20 3d 20 30 3b  range_end   = 0;
3ae0: 0a 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20  ..range_request 
3af0: 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 6c 65 6e 67  = 0;..range_leng
3b00: 74 68 20 3d 20 2d 31 3b 0a 09 62 75 66 66 65 72  th = -1;..buffer
3b10: 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f 73  _st->headers.hos
3b20: 74 2e 70 72 65 73 65 6e 74 20 3d 20 30 3b 0a 0a  t.present = 0;..
3b30: 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  .buffer = buffer
3b40: 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 62 75  _st->tmpbuf;..bu
3b50: 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  ffer_len = sizeo
3b60: 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70  f(buffer_st->tmp
3b70: 62 75 66 29 3b 0a 0a 09 66 67 65 74 73 5f 72 65  buf);...fgets_re
3b80: 74 20 3d 20 66 67 65 74 73 28 62 75 66 66 65 72  t = fgets(buffer
3b90: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70  , buffer_len, fp
3ba0: 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f 72 65  );..if (fgets_re
3bb0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
3bc0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
3bd0: 0a 09 6d 65 74 68 6f 64 20 3d 20 62 75 66 66 65  ..method = buffe
3be0: 72 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 73 74  r;...buffer = st
3bf0: 72 63 68 72 28 62 75 66 66 65 72 2c 20 27 20 27  rchr(buffer, ' '
3c00: 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20 3d  );..if (buffer =
3c10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
3c20: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a  rn(NULL);..}...*
3c30: 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09  buffer = '\0';..
3c40: 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 70 61 74 68  buffer++;...path
3c50: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 2f 2a 20   = buffer;.../* 
3c60: 54 65 72 6d 69 6e 61 74 65 20 70 61 74 68 20 63  Terminate path c
3c70: 6f 6d 70 6f 6e 65 6e 74 20 2a 2f 0a 09 62 75 66  omponent */..buf
3c80: 66 65 72 20 3d 20 73 74 72 70 62 72 6b 28 70 61  fer = strpbrk(pa
3c90: 74 68 2c 20 22 5c 72 5c 6e 20 22 29 3b 0a 09 69  th, "\r\n ");..i
3ca0: 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55 4c  f (buffer != NUL
3cb0: 4c 29 20 7b 0a 09 09 2a 62 75 66 66 65 72 20 3d  L) {...*buffer =
3cc0: 20 27 5c 30 27 3b 0a 09 09 62 75 66 66 65 72 2b   '\0';...buffer+
3cd0: 2b 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 65 20 6f 6e  +;..}.../* We on
3ce0: 6c 79 20 68 61 6e 64 6c 65 20 74 68 65 20 22 47  ly handle the "G
3cf0: 45 54 22 20 61 6e 64 20 22 48 45 41 44 27 20 6d  ET" and "HEAD' m
3d00: 65 74 68 6f 64 73 20 2a 2f 0a 09 69 66 20 28 73  ethods */..if (s
3d10: 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68 6f 64  trcasecmp(method
3d20: 2c 20 22 68 65 61 64 22 29 20 21 3d 20 30 29 20  , "head") != 0) 
3d30: 7b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65 63  {...if (strcasec
3d40: 6d 70 28 6d 65 74 68 6f 64 2c 20 22 67 65 74 22  mp(method, "get"
3d50: 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  ) != 0) {....ret
3d60: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a  urn(NULL);...}..
3d70: 09 09 2f 2a 20 47 45 54 20 72 65 71 75 65 73 74  ../* GET request
3d80: 20 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74 2d   */...buffer_st-
3d90: 3e 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f  >method = FILED_
3da0: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47  REQUEST_METHOD_G
3db0: 45 54 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ET;..} else {...
3dc0: 2f 2a 20 48 45 41 44 20 72 65 71 75 65 73 74 20  /* HEAD request 
3dd0: 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  */...buffer_st->
3de0: 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f 52  method = FILED_R
3df0: 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45  EQUEST_METHOD_HE
3e00: 41 44 3b 0a 09 7d 0a 0a 09 2f 2a 20 4e 6f 74 65  AD;..}.../* Note
3e10: 20 70 61 74 68 20 2a 2f 0a 09 70 61 74 68 5f 6c   path */..path_l
3e20: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 61 74 68  en = strlen(path
3e30: 29 3b 0a 09 6d 65 6d 63 70 79 28 62 75 66 66 65  );..memcpy(buffe
3e40: 72 5f 73 74 2d 3e 70 61 74 68 2c 20 70 61 74 68  r_st->path, path
3e50: 2c 20 70 61 74 68 5f 6c 65 6e 20 2b 20 31 29 3b  , path_len + 1);
3e60: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
3e70: 74 79 70 65 20 6f 66 20 72 65 71 75 65 73 74 20  type of request 
3e80: 66 72 6f 6d 20 70 61 74 68 20 2a 2f 0a 09 69 66  from path */..if
3e90: 20 28 70 61 74 68 5f 6c 65 6e 20 3d 3d 20 30 29   (path_len == 0)
3ea0: 20 7b 0a 09 09 62 75 66 66 65 72 5f 73 74 2d 3e   {...buffer_st->
3eb0: 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 52 45 51  type = FILED_REQ
3ec0: 55 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54  UEST_TYPE_DIRECT
3ed0: 4f 52 59 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ORY;..} else {..
3ee0: 09 69 66 20 28 70 61 74 68 5b 70 61 74 68 5f 6c  .if (path[path_l
3ef0: 65 6e 20 2d 20 31 5d 20 3d 3d 20 27 2f 27 29 20  en - 1] == '/') 
3f00: 7b 0a 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e  {....buffer_st->
3f10: 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 52 45 51  type = FILED_REQ
3f20: 55 45 53 54 5f 54 59 50 45 5f 44 49 52 45 43 54  UEST_TYPE_DIRECT
3f30: 4f 52 59 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ORY;...} else {.
3f40: 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 74 79  ...buffer_st->ty
3f50: 70 65 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45  pe = FILED_REQUE
3f60: 53 54 5f 54 59 50 45 5f 4f 54 48 45 52 3b 0a 09  ST_TYPE_OTHER;..
3f70: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 52 65 73 65 74  .}..}.../* Reset
3f80: 20 62 75 66 66 65 72 20 66 6f 72 20 6c 61 74 65   buffer for late
3f90: 72 20 75 73 65 20 2a 2f 0a 09 62 75 66 66 65 72  r use */..buffer
3fa0: 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d   = buffer_st->tm
3fb0: 70 62 75 66 3b 0a 0a 09 66 6f 72 20 28 69 20 3d  pbuf;...for (i =
3fc0: 20 30 3b 20 69 20 3c 20 31 30 30 3b 20 69 2b 2b   0; i < 100; i++
3fd0: 29 20 7b 0a 09 09 66 67 65 74 73 5f 72 65 74 20  ) {...fgets_ret 
3fe0: 3d 20 66 67 65 74 73 28 62 75 66 66 65 72 2c 20  = fgets(buffer, 
3ff0: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b  buffer_len, fp);
4000: 0a 09 09 69 66 20 28 66 67 65 74 73 5f 72 65 74  ...if (fgets_ret
4010: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 62   == NULL) {....b
4020: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
4030: 28 73 74 72 6e 63 61 73 65 63 6d 70 28 62 75 66  (strncasecmp(buf
4040: 66 65 72 2c 20 22 52 61 6e 67 65 3a 20 22 2c 20  fer, "Range: ", 
4050: 37 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 77 6f  7) == 0) {....wo
4060: 72 6b 62 75 66 66 65 72 20 3d 20 62 75 66 66 65  rkbuffer = buffe
4070: 72 20 2b 20 37 3b 0a 0a 09 09 09 69 66 20 28 73  r + 7;.....if (s
4080: 74 72 6e 63 61 73 65 63 6d 70 28 77 6f 72 6b 62  trncasecmp(workb
4090: 75 66 66 65 72 2c 20 22 62 79 74 65 73 3d 22 2c  uffer, "bytes=",
40a0: 20 36 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09   6) == 0) {.....
40b0: 77 6f 72 6b 62 75 66 66 65 72 20 2b 3d 20 36 3b  workbuffer += 6;
40c0: 0a 0a 09 09 09 09 72 61 6e 67 65 5f 72 65 71 75  ......range_requ
40d0: 65 73 74 20 3d 20 31 3b 0a 0a 09 09 09 09 72 61  est = 1;......ra
40e0: 6e 67 65 5f 73 74 61 72 74 20 3d 20 73 74 72 74  nge_start = strt
40f0: 6f 75 6c 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c  oull(workbuffer,
4100: 20 26 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78   &workbuffer_nex
4110: 74 2c 20 31 30 29 3b 0a 0a 09 09 09 09 77 6f 72  t, 10);......wor
4120: 6b 62 75 66 66 65 72 20 3d 20 77 6f 72 6b 62 75  kbuffer = workbu
4130: 66 66 65 72 5f 6e 65 78 74 3b 0a 0a 09 09 09 09  ffer_next;......
4140: 69 66 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20  if (*workbuffer 
4150: 3d 3d 20 27 2d 27 29 20 7b 0a 09 09 09 09 09 77  == '-') {......w
4160: 6f 72 6b 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 09  orkbuffer++;....
4170: 09 09 09 69 66 20 28 2a 77 6f 72 6b 62 75 66 66  ...if (*workbuff
4180: 65 72 20 21 3d 20 27 5c 72 27 20 26 26 20 2a 77  er != '\r' && *w
4190: 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 27 5c 6e  orkbuffer != '\n
41a0: 27 29 20 7b 0a 09 09 09 09 09 09 72 61 6e 67 65  ') {.......range
41b0: 5f 65 6e 64 20 3d 20 73 74 72 74 6f 75 6c 6c 28  _end = strtoull(
41c0: 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72  workbuffer, &wor
41d0: 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30  kbuffer_next, 10
41e0: 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  );......}.....}.
41f0: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 69 66  ...}...} else if
4200: 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28 62 75   (strncasecmp(bu
4210: 66 66 65 72 2c 20 22 48 6f 73 74 3a 20 22 2c 20  ffer, "Host: ", 
4220: 35 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 75  5) == 0) {....bu
4230: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
4240: 2e 68 6f 73 74 2e 70 72 65 73 65 6e 74 20 3d 20  .host.present = 
4250: 31 3b 0a 0a 09 09 09 77 6f 72 6b 62 75 66 66 65  1;.....workbuffe
4260: 72 20 3d 20 73 74 72 70 62 72 6b 28 62 75 66 66  r = strpbrk(buff
4270: 65 72 20 2b 20 35 2c 20 22 5c 72 5c 6e 3a 22 29  er + 5, "\r\n:")
4280: 3b 0a 09 09 09 69 66 20 28 77 6f 72 6b 62 75 66  ;....if (workbuf
4290: 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  fer != NULL) {..
42a0: 09 09 09 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d  ...*workbuffer =
42b0: 20 27 5c 30 27 3b 0a 09 09 09 7d 0a 0a 09 09 09   '\0';....}.....
42c0: 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 62 75 66  workbuffer = buf
42d0: 66 65 72 20 2b 20 35 3b 0a 09 09 09 77 68 69 6c  fer + 5;....whil
42e0: 65 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d  e (*workbuffer =
42f0: 3d 20 27 20 27 29 20 7b 0a 09 09 09 09 77 6f 72  = ' ') {.....wor
4300: 6b 62 75 66 66 65 72 2b 2b 3b 0a 09 09 09 7d 0a  kbuffer++;....}.
4310: 0a 09 09 09 73 74 72 63 70 79 28 62 75 66 66 65  ....strcpy(buffe
4320: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 68 6f  r_st->headers.ho
4330: 73 74 2e 68 6f 73 74 2c 20 77 6f 72 6b 62 75 66  st.host, workbuf
4340: 66 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  fer);...}....if 
4350: 28 6d 65 6d 63 6d 70 28 62 75 66 66 65 72 2c 20  (memcmp(buffer, 
4360: 22 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d 20 30 29  "\r\n", 2) == 0)
4370: 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d   {....break;...}
4380: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
4390: 6e 65 20 72 61 6e 67 65 20 2a 2f 0a 09 69 66 20  ne range */..if 
43a0: 28 72 61 6e 67 65 5f 65 6e 64 20 21 3d 20 30 29  (range_end != 0)
43b0: 20 7b 0a 09 09 69 66 20 28 72 61 6e 67 65 5f 65   {...if (range_e
43c0: 6e 64 20 3c 3d 20 72 61 6e 67 65 5f 73 74 61 72  nd <= range_star
43d0: 74 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e  t) {....return(N
43e0: 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 72 61 6e  ULL);...}....ran
43f0: 67 65 5f 6c 65 6e 67 74 68 20 3d 20 72 61 6e 67  ge_length = rang
4400: 65 5f 65 6e 64 20 2d 20 72 61 6e 67 65 5f 73 74  e_end - range_st
4410: 61 72 74 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f  art;....filed_lo
4420: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d  g_msg_debug("Com
4430: 70 75 74 69 6e 67 20 6c 65 6e 67 74 68 20 70 61  puting length pa
4440: 72 61 6d 65 74 65 72 3a 20 25 6c 6c 75 20 3d 20  rameter: %llu = 
4450: 25 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c 0a 09 09  %llu - %llu",...
4460: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
4470: 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 6c 65 6e 67  long) range_leng
4480: 74 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64  th,....(unsigned
4490: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67   long long) rang
44a0: 65 5f 65 6e 64 2c 0a 09 09 09 28 75 6e 73 69 67  e_end,....(unsig
44b0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
44c0: 61 6e 67 65 5f 73 74 61 72 74 0a 09 09 29 3b 0a  ange_start...);.
44d0: 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20 75 70 20  .}.../* Fill up 
44e0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 74  structure to ret
44f0: 75 72 6e 20 2a 2f 0a 09 62 75 66 66 65 72 5f 73  urn */..buffer_s
4500: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
4510: 2e 70 72 65 73 65 6e 74 20 3d 20 72 61 6e 67 65  .present = range
4520: 5f 72 65 71 75 65 73 74 3b 0a 09 62 75 66 66 65  _request;..buffe
4530: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  r_st->headers.ra
4540: 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d 20 72 61  nge.offset  = ra
4550: 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62 75 66 66  nge_start;..buff
4560: 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  er_st->headers.r
4570: 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20 3d 20 72  ange.length  = r
4580: 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 0a 09 2f  ange_length;.../
4590: 2a 20 49 66 20 76 68 6f 73 74 73 20 61 72 65 20  * If vhosts are 
45a0: 65 6e 61 62 6c 65 64 2c 20 63 6f 6d 70 75 74 65  enabled, compute
45b0: 20 6e 65 77 20 70 61 74 68 20 2a 2f 0a 09 69 66   new path */..if
45c0: 20 28 6f 70 74 69 6f 6e 73 2d 3e 76 68 6f 73 74   (options->vhost
45d0: 73 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 69  s_enabled) {...i
45e0: 66 20 28 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  f (buffer_st->he
45f0: 61 64 65 72 73 2e 68 6f 73 74 2e 70 72 65 73 65  aders.host.prese
4600: 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 62 75  nt == 1) {....bu
4610: 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74  ffer = buffer_st
4620: 2d 3e 74 6d 70 62 75 66 3b 0a 09 09 09 62 75 66  ->tmpbuf;....buf
4630: 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  fer_len = sizeof
4640: 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62  (buffer_st->tmpb
4650: 75 66 29 3b 0a 0a 09 09 09 73 6e 70 72 69 6e 74  uf);.....snprint
4660: 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74 66  f_ret = snprintf
4670: 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f  (buffer, buffer_
4680: 6c 65 6e 2c 20 22 2f 25 73 25 73 25 73 22 2c 0a  len, "/%s%s%s",.
4690: 09 09 09 09 62 75 66 66 65 72 5f 73 74 2d 3e 68  ....buffer_st->h
46a0: 65 61 64 65 72 73 2e 68 6f 73 74 2e 68 6f 73 74  eaders.host.host
46b0: 2c 0a 09 09 09 09 62 75 66 66 65 72 5f 73 74 2d  ,.....buffer_st-
46c0: 3e 70 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 20  >path[0] == '/' 
46d0: 3f 20 22 22 20 3a 20 22 2f 22 2c 0a 09 09 09 09  ? "" : "/",.....
46e0: 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 0a  buffer_st->path.
46f0: 09 09 09 29 3b 0a 09 09 09 69 66 20 28 73 6e 70  ...);....if (snp
4700: 72 69 6e 74 66 5f 72 65 74 20 3e 3d 20 30 29 20  rintf_ret >= 0) 
4710: 7b 0a 09 09 09 09 69 66 20 28 28 28 75 6e 73 69  {.....if (((unsi
4720: 67 6e 65 64 20 69 6e 74 29 20 73 6e 70 72 69 6e  gned int) snprin
4730: 74 66 5f 72 65 74 29 20 3c 20 62 75 66 66 65 72  tf_ret) < buffer
4740: 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 09 73 74 72  _len) {......str
4750: 63 70 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 70  cpy(buffer_st->p
4760: 61 74 68 2c 20 62 75 66 66 65 72 29 3b 0a 09 09  ath, buffer);...
4770: 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  ..}....}...}..}.
4780: 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f  ..return(buffer_
4790: 73 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  st);.}../* Retur
47a0: 6e 20 61 6e 20 65 72 72 6f 72 20 70 61 67 65 20  n an error page 
47b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
47c0: 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28  iled_error_page(
47d0: 46 49 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20  FILE *fp, const 
47e0: 63 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65  char *date_curre
47f0: 6e 74 2c 20 69 6e 74 20 65 72 72 6f 72 5f 6e 75  nt, int error_nu
4800: 6d 62 65 72 2c 20 69 6e 74 20 6d 65 74 68 6f 64  mber, int method
4810: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65  , const char *re
4820: 61 73 6f 6e 2c 20 73 74 72 75 63 74 20 66 69 6c  ason, struct fil
4830: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f  ed_log_entry *lo
4840: 67 29 20 7b 0a 09 63 68 61 72 20 2a 65 72 72 6f  g) {..char *erro
4850: 72 5f 73 74 72 69 6e 67 20 3d 20 22 3c 68 74 6d  r_string = "<htm
4860: 6c 3e 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 45  l><head><title>E
4870: 52 52 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65  RROR</title></he
4880: 61 64 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c 65 20  ad><body>Unable 
4890: 74 6f 20 70 72 6f 63 65 73 73 20 72 65 71 75 65  to process reque
48a0: 73 74 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c 3e  st</body></html>
48b0: 22 3b 0a 0a 09 66 70 72 69 6e 74 66 28 66 70 2c  ";...fprintf(fp,
48c0: 20 22 48 54 54 50 2f 31 2e 31 20 25 69 20 4e 6f   "HTTP/1.1 %i No
48d0: 74 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73  t OK\r\nDate: %s
48e0: 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65  \r\nServer: file
48f0: 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69  d\r\nLast-Modifi
4900: 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e  ed: %s\r\nConten
4910: 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72  t-Length: %llu\r
4920: 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20  \nContent-Type: 
4930: 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e  %s\r\nConnection
4940: 3a 20 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c 6e 22  : close\r\n\r\n"
4950: 2c 0a 09 09 65 72 72 6f 72 5f 6e 75 6d 62 65 72  ,...error_number
4960: 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74  ,...date_current
4970: 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74  ,...date_current
4980: 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ,...(unsigned lo
4990: 6e 67 20 6c 6f 6e 67 29 20 73 74 72 6c 65 6e 28  ng long) strlen(
49a0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 2c 0a 09  error_string),..
49b0: 09 22 74 65 78 74 2f 68 74 6d 6c 22 0a 09 29 3b  ."text/html"..);
49c0: 0a 0a 09 2f 2a 20 73 69 6c 65 6e 63 65 20 65 72  .../* silence er
49d0: 72 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20 48  ror string for H
49e0: 45 41 44 20 72 65 71 75 65 73 74 73 20 2a 2f 0a  EAD requests */.
49f0: 09 69 66 20 28 6d 65 74 68 6f 64 20 21 3d 20 46  .if (method != F
4a00: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54  ILED_REQUEST_MET
4a10: 48 4f 44 5f 48 45 41 44 29 20 7b 0a 09 09 66 70  HOD_HEAD) {...fp
4a20: 72 69 6e 74 66 28 66 70 2c 20 22 25 73 22 2c 20  rintf(fp, "%s", 
4a30: 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 3b 0a 09  error_string);..
4a40: 7d 0a 0a 09 2f 2a 20 4c 6f 67 20 65 72 72 6f 72  }.../* Log error
4a50: 20 2a 2f 0a 09 2f 2a 2a 20 72 65 61 73 6f 6e 20   */../** reason 
4a60: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
4a70: 67 6c 6f 62 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  globally allocat
4a80: 65 64 20 76 61 6c 75 65 20 2a 2a 2f 0a 09 6c 6f  ed value **/..lo
4a90: 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 72 65 61 73  g->reason = reas
4aa0: 6f 6e 3b 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f 63  on;..log->http_c
4ab0: 6f 64 65 20 3d 20 65 72 72 6f 72 5f 6e 75 6d 62  ode = error_numb
4ac0: 65 72 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  er;...filed_log_
4ad0: 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 2f 2a  entry(log);.../*
4ae0: 20 43 6c 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   Close connectio
4af0: 6e 20 2a 2f 0a 09 66 63 6c 6f 73 65 28 66 70 29  n */..fclose(fp)
4b00: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
4b10: 2a 20 52 65 74 75 72 6e 20 61 20 72 65 64 69 72  * Return a redir
4b20: 65 63 74 20 74 6f 20 69 6e 64 65 78 2e 68 74 6d  ect to index.htm
4b30: 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l */.static void
4b40: 20 66 69 6c 65 64 5f 72 65 64 69 72 65 63 74 5f   filed_redirect_
4b50: 69 6e 64 65 78 28 46 49 4c 45 20 2a 66 70 2c 20  index(FILE *fp, 
4b60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 65  const char *date
4b70: 5f 63 75 72 72 65 6e 74 2c 20 63 6f 6e 73 74 20  _current, const 
4b80: 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75  char *path, stru
4b90: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
4ba0: 72 79 20 2a 6c 6f 67 29 20 7b 0a 09 69 6e 74 20  ry *log) {..int 
4bb0: 68 74 74 70 5f 63 6f 64 65 20 3d 20 33 30 31 3b  http_code = 301;
4bc0: 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 48  ..fprintf(fp, "H
4bd0: 54 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c  TTP/1.1 %i OK\r\
4be0: 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72  nDate: %s\r\nSer
4bf0: 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61  ver: filed\r\nLa
4c00: 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c  st-Modified: %s\
4c10: 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74  r\nContent-Lengt
4c20: 68 3a 20 30 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69  h: 0\r\nConnecti
4c30: 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 4c 6f 63  on: close\r\nLoc
4c40: 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 5c 72 5c  ation: %s\r\n\r\
4c50: 6e 22 2c 0a 09 09 68 74 74 70 5f 63 6f 64 65 2c  n",...http_code,
4c60: 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
4c70: 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
4c80: 0a 09 09 22 69 6e 64 65 78 2e 68 74 6d 6c 22 0a  ..."index.html".
4c90: 09 29 3b 0a 0a 09 2f 2a 20 4c 6f 67 20 72 65 64  .);.../* Log red
4ca0: 69 72 65 63 74 20 2a 2f 0a 09 6c 6f 67 2d 3e 72  irect */..log->r
4cb0: 65 61 73 6f 6e 20 3d 20 22 72 65 64 69 72 65 63  eason = "redirec
4cc0: 74 22 3b 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f 63  t";..log->http_c
4cd0: 6f 64 65 20 3d 20 68 74 74 70 5f 63 6f 64 65 3b  ode = http_code;
4ce0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ...filed_log_ent
4cf0: 72 79 28 6c 6f 67 29 3b 0a 0a 09 2f 2a 20 43 6c  ry(log);.../* Cl
4d00: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ose connection *
4d10: 2f 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a  /..fclose(fp);..
4d20: 09 72 65 74 75 72 6e 3b 0a 0a 09 2f 2a 20 43 75  .return;.../* Cu
4d30: 72 72 65 6e 74 6c 79 20 75 6e 75 73 65 64 3a 20  rrently unused: 
4d40: 70 61 74 68 20 2a 2f 0a 09 70 61 74 68 20 3d 20  path */..path = 
4d50: 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64  path;.}../* Hand
4d60: 6c 65 20 61 20 73 69 6e 67 6c 65 20 72 65 71 75  le a single requ
4d70: 65 73 74 20 66 72 6f 6d 20 61 20 63 6c 69 65 6e  est from a clien
4d80: 74 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t */.static void
4d90: 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f 63 6c   filed_handle_cl
4da0: 69 65 6e 74 28 69 6e 74 20 66 64 2c 20 73 74 72  ient(int fd, str
4db0: 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72  uct filed_http_r
4dc0: 65 71 75 65 73 74 20 2a 72 65 71 75 65 73 74 2c  equest *request,
4dd0: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f   struct filed_lo
4de0: 67 5f 65 6e 74 72 79 20 2a 6c 6f 67 2c 20 73 74  g_entry *log, st
4df0: 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f  ruct filed_optio
4e00: 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b 0a 09  ns *options) {..
4e10: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c  struct filed_fil
4e20: 65 69 6e 66 6f 20 2a 66 69 6c 65 69 6e 66 6f 3b  einfo *fileinfo;
4e30: 0a 09 73 73 69 7a 65 5f 74 20 73 65 6e 64 66 69  ..ssize_t sendfi
4e40: 6c 65 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  le_ret;..size_t 
4e50: 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 3b 0a 09  sendfile_size;..
4e60: 6f 66 66 5f 74 20 73 65 6e 64 66 69 6c 65 5f 6f  off_t sendfile_o
4e70: 66 66 73 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f  ffset, sendfile_
4e80: 73 65 6e 74 2c 20 73 65 6e 64 66 69 6c 65 5f 6c  sent, sendfile_l
4e90: 65 6e 3b 0a 09 63 68 61 72 20 2a 70 61 74 68 3b  en;..char *path;
4ea0: 0a 09 63 68 61 72 20 2a 64 61 74 65 5f 63 75 72  ..char *date_cur
4eb0: 72 65 6e 74 2c 20 64 61 74 65 5f 63 75 72 72 65  rent, date_curre
4ec0: 6e 74 5f 62 5b 36 34 5d 3b 0a 09 69 6e 74 20 68  nt_b[64];..int h
4ed0: 74 74 70 5f 63 6f 64 65 3b 0a 09 46 49 4c 45 20  ttp_code;..FILE 
4ee0: 2a 66 70 3b 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  *fp;.../* Determ
4ef0: 69 6e 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  ine current time
4f00: 20 2a 2f 0a 09 64 61 74 65 5f 63 75 72 72 65 6e   */..date_curren
4f10: 74 20 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74  t = filed_format
4f20: 5f 74 69 6d 65 28 64 61 74 65 5f 63 75 72 72 65  _time(date_curre
4f30: 6e 74 5f 62 2c 20 73 69 7a 65 6f 66 28 64 61 74  nt_b, sizeof(dat
4f40: 65 5f 63 75 72 72 65 6e 74 5f 62 29 2c 20 74 69  e_current_b), ti
4f50: 6d 65 28 4e 55 4c 4c 29 29 3b 0a 0a 09 2f 2a 20  me(NULL));.../* 
4f60: 4f 70 65 6e 20 73 6f 63 6b 65 74 20 61 73 20 41  Open socket as A
4f70: 4e 53 49 20 49 2f 4f 20 66 6f 72 20 65 61 73 65  NSI I/O for ease
4f80: 20 6f 66 20 75 73 65 20 2a 2f 0a 09 66 70 20 3d   of use */..fp =
4f90: 20 66 64 6f 70 65 6e 28 66 64 2c 20 22 77 2b 62   fdopen(fd, "w+b
4fa0: 22 29 3b 0a 09 69 66 20 28 66 70 20 3d 3d 20 4e  ");..if (fp == N
4fb0: 55 4c 4c 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66  ULL) {...close(f
4fc0: 64 29 3b 0a 0a 09 09 6c 6f 67 2d 3e 62 75 66 66  d);....log->buff
4fd0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  er[0] = '\0';...
4fe0: 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d  log->http_code =
4ff0: 20 2d 31 3b 0a 09 09 6c 6f 67 2d 3e 72 65 61 73   -1;...log->reas
5000: 6f 6e 20 3d 20 22 66 64 6f 70 65 6e 5f 66 61 69  on = "fdopen_fai
5010: 6c 65 64 22 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c  led";....filed_l
5020: 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a  og_entry(log);..
5030: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 72  ..return;..}...r
5040: 65 71 75 65 73 74 20 3d 20 66 69 6c 65 64 5f 67  equest = filed_g
5050: 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28  et_http_request(
5060: 66 70 2c 20 72 65 71 75 65 73 74 2c 20 6f 70 74  fp, request, opt
5070: 69 6f 6e 73 29 3b 0a 0a 09 69 66 20 28 72 65 71  ions);...if (req
5080: 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  uest == NULL) {.
5090: 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d  ..log->buffer[0]
50a0: 20 3d 20 27 5c 30 27 3b 0a 0a 09 09 66 69 6c 65   = '\0';....file
50b0: 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c  d_error_page(fp,
50c0: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 35   date_current, 5
50d0: 30 30 2c 20 46 49 4c 45 44 5f 52 45 51 55 45 53  00, FILED_REQUES
50e0: 54 5f 4d 45 54 48 4f 44 5f 47 45 54 2c 20 22 66  T_METHOD_GET, "f
50f0: 6f 72 6d 61 74 22 2c 20 6c 6f 67 29 3b 0a 0a 09  ormat", log);...
5100: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 70 61  .return;..}...pa
5110: 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 70 61  th = request->pa
5120: 74 68 3b 0a 09 73 74 72 63 70 79 28 6c 6f 67 2d  th;..strcpy(log-
5130: 3e 62 75 66 66 65 72 2c 20 70 61 74 68 29 3b 0a  >buffer, path);.
5140: 09 6c 6f 67 2d 3e 6d 65 74 68 6f 64 20 3d 20 72  .log->method = r
5150: 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 3b 0a  equest->method;.
5160: 0a 09 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75  ../* If the requ
5170: 65 73 74 65 64 20 70 61 74 68 20 69 73 20 61 20  ested path is a 
5180: 64 69 72 65 63 74 6f 72 79 2c 20 72 65 64 69 72  directory, redir
5190: 65 63 74 20 74 6f 20 69 6e 64 65 78 20 70 61 67  ect to index pag
51a0: 65 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  e */..if (reques
51b0: 74 2d 3e 74 79 70 65 20 3d 3d 20 46 49 4c 45 44  t->type == FILED
51c0: 5f 52 45 51 55 45 53 54 5f 54 59 50 45 5f 44 49  _REQUEST_TYPE_DI
51d0: 52 45 43 54 4f 52 59 29 20 7b 0a 09 09 66 69 6c  RECTORY) {...fil
51e0: 65 64 5f 72 65 64 69 72 65 63 74 5f 69 6e 64 65  ed_redirect_inde
51f0: 78 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65  x(fp, date_curre
5200: 6e 74 2c 20 70 61 74 68 2c 20 6c 6f 67 29 3b 0a  nt, path, log);.
5210: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
5220: 66 69 6c 65 69 6e 66 6f 20 3d 20 66 69 6c 65 64  fileinfo = filed
5230: 5f 6f 70 65 6e 5f 66 69 6c 65 28 70 61 74 68 2c  _open_file(path,
5240: 20 26 72 65 71 75 65 73 74 2d 3e 66 69 6c 65 69   &request->filei
5250: 6e 66 6f 29 3b 0a 09 69 66 20 28 66 69 6c 65 69  nfo);..if (filei
5260: 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
5270: 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67  .filed_error_pag
5280: 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65  e(fp, date_curre
5290: 6e 74 2c 20 34 30 34 2c 20 72 65 71 75 65 73 74  nt, 404, request
52a0: 2d 3e 6d 65 74 68 6f 64 2c 20 22 6f 70 65 6e 5f  ->method, "open_
52b0: 66 61 69 6c 65 64 22 2c 20 6c 6f 67 29 3b 0a 0a  failed", log);..
52c0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 69  ..return;..}...i
52d0: 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  f (request->head
52e0: 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e  ers.range.presen
52f0: 74 29 20 7b 0a 09 09 69 66 20 28 72 65 71 75 65  t) {...if (reque
5300: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
5310: 65 2e 6f 66 66 73 65 74 20 21 3d 20 30 20 7c 7c  e.offset != 0 ||
5320: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
5330: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3e  s.range.length >
5340: 3d 20 30 29 20 7b 0a 09 09 09 69 66 20 28 72 65  = 0) {....if (re
5350: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
5360: 61 6e 67 65 2e 6f 66 66 73 65 74 20 3e 3d 20 66  ange.offset >= f
5370: 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 29 20 7b 0a  ileinfo->len) {.
5380: 09 09 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f  ....filed_error_
5390: 70 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75  page(fp, date_cu
53a0: 72 72 65 6e 74 2c 20 34 31 36 2c 20 72 65 71 75  rrent, 416, requ
53b0: 65 73 74 2d 3e 6d 65 74 68 6f 64 2c 20 22 72 61  est->method, "ra
53c0: 6e 67 65 5f 69 6e 76 61 6c 69 64 22 2c 20 6c 6f  nge_invalid", lo
53d0: 67 29 3b 0a 0a 09 09 09 09 63 6c 6f 73 65 28 66  g);......close(f
53e0: 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a 0a 09  ileinfo->fd);...
53f0: 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a  ...return;....}.
5400: 0a 09 09 09 69 66 20 28 72 65 71 75 65 73 74 2d  ....if (request-
5410: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
5420: 65 6e 67 74 68 20 3d 3d 20 28 28 6f 66 66 5f 74  ength == ((off_t
5430: 29 20 2d 31 29 29 20 7b 0a 09 09 09 09 66 69 6c  ) -1)) {.....fil
5440: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
5450: 28 22 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67  ("Computing leng
5460: 74 68 20 74 6f 20 66 69 74 20 69 6e 20 62 6f 75  th to fit in bou
5470: 6e 64 73 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  nds: fileinfo->l
5480: 65 6e 20 3d 20 25 6c 6c 75 2c 20 72 65 71 75 65  en = %llu, reque
5490: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
54a0: 65 2e 6f 66 66 73 65 74 20 3d 20 25 6c 6c 75 22  e.offset = %llu"
54b0: 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64  ,......(unsigned
54c0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65   long long) file
54d0: 69 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09 09  info->len,......
54e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
54f0: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
5500: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
5510: 65 74 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09 72  et.....);......r
5520: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
5530: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 20 66  range.length = f
5540: 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 2d 20 72  ileinfo->len - r
5550: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
5560: 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09  range.offset;...
5570: 09 7d 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67  .}.....filed_log
5580: 5f 6d 73 67 5f 64 65 62 75 67 28 22 50 61 72 74  _msg_debug("Part
5590: 69 61 6c 20 72 65 71 75 65 73 74 2c 20 73 74 61  ial request, sta
55a0: 72 74 69 6e 67 20 61 74 3a 20 25 6c 6c 75 20 61  rting at: %llu a
55b0: 6e 64 20 72 75 6e 6e 69 6e 67 20 66 6f 72 20 25  nd running for %
55c0: 6c 6c 69 20 62 79 74 65 73 22 2c 0a 09 09 09 09  lli bytes",.....
55d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
55e0: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
55f0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
5600: 65 74 2c 0a 09 09 09 09 28 6c 6f 6e 67 20 6c 6f  et,.....(long lo
5610: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
5620: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
5630: 68 0a 09 09 09 29 3b 0a 0a 09 09 7d 0a 0a 09 09  h....);....}....
5640: 68 74 74 70 5f 63 6f 64 65 20 3d 20 32 30 36 3b  http_code = 206;
5650: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 74 74  ..} else {...htt
5660: 70 5f 63 6f 64 65 20 3d 20 32 30 30 3b 0a 0a 09  p_code = 200;...
5670: 09 2f 2a 20 43 6f 6d 70 75 74 65 20 66 61 6b 65  ./* Compute fake
5680: 20 72 61 6e 67 65 20 70 61 72 61 6d 65 74 65 72   range parameter
5690: 73 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  s that includes 
56a0: 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 20  the entire file 
56b0: 2a 2f 0a 09 09 72 65 71 75 65 73 74 2d 3e 68 65  */...request->he
56c0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
56d0: 65 74 20 3d 20 30 3b 0a 09 09 72 65 71 75 65 73  et = 0;...reques
56e0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
56f0: 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e  .length = filein
5700: 66 6f 2d 3e 6c 65 6e 3b 0a 09 7d 0a 0a 09 66 70  fo->len;..}...fp
5710: 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f  rintf(fp, "HTTP/
5720: 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74  1.1 %i OK\r\nDat
5730: 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a  e: %s\r\nServer:
5740: 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d   filed\r\nLast-M
5750: 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43  odified: %s\r\nC
5760: 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25  ontent-Length: %
5770: 6c 6c 75 5c 72 5c 6e 41 63 63 65 70 74 2d 52 61  llu\r\nAccept-Ra
5780: 6e 67 65 73 3a 20 62 79 74 65 73 5c 72 5c 6e 43  nges: bytes\r\nC
5790: 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 73 5c  ontent-Type: %s\
57a0: 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63  r\nConnection: c
57b0: 6c 6f 73 65 5c 72 5c 6e 45 54 61 67 3a 20 5c 22  lose\r\nETag: \"
57c0: 25 73 5c 22 5c 72 5c 6e 22 2c 0a 09 09 68 74 74  %s\"\r\n",...htt
57d0: 70 5f 63 6f 64 65 2c 0a 09 09 64 61 74 65 5f 63  p_code,...date_c
57e0: 75 72 72 65 6e 74 2c 0a 09 09 66 69 6c 65 69 6e  urrent,...filein
57f0: 66 6f 2d 3e 6c 61 73 74 6d 6f 64 2c 0a 09 09 28  fo->lastmod,...(
5800: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
5810: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
5820: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
5830: 68 2c 0a 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74  h,...fileinfo->t
5840: 79 70 65 2c 0a 09 09 66 69 6c 65 69 6e 66 6f 2d  ype,...fileinfo-
5850: 3e 65 74 61 67 0a 09 29 3b 0a 0a 09 69 66 20 28  >etag..);...if (
5860: 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32 30 36  http_code == 206
5870: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 66 70  ) {...fprintf(fp
5880: 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61 6e 67 65  , "Content-Range
5890: 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d 25 6c 6c  : bytes %llu-%ll
58a0: 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a 09 09 09  u/%llu\r\n",....
58b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
58c0: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
58d0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
58e0: 65 74 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64  et,....(unsigned
58f0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 28 72 65 71   long long) (req
5900: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
5910: 6e 67 65 2e 6f 66 66 73 65 74 20 2b 20 72 65 71  nge.offset + req
5920: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
5930: 6e 67 65 2e 6c 65 6e 67 74 68 20 2d 20 31 29 2c  nge.length - 1),
5940: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
5950: 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66  ng long) fileinf
5960: 6f 2d 3e 6c 65 6e 0a 09 09 29 3b 0a 09 7d 0a 09  o->len...);..}..
5970: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c  fprintf(fp, "\r\
5980: 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 66 70 29  n");..fflush(fp)
5990: 3b 0a 0a 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f  ;...log->http_co
59a0: 64 65 20 3d 20 68 74 74 70 5f 63 6f 64 65 3b 0a  de = http_code;.
59b0: 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22  .log->reason = "
59c0: 4f 4b 22 3b 0a 09 6c 6f 67 2d 3e 73 74 61 72 74  OK";..log->start
59d0: 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c  time = time(NULL
59e0: 29 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f 6f 66 66  );..log->req_off
59f0: 73 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68  set = request->h
5a00: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
5a10: 73 65 74 3b 0a 09 6c 6f 67 2d 3e 72 65 71 5f 6c  set;..log->req_l
5a20: 65 6e 67 74 68 20 3d 20 72 65 71 75 65 73 74 2d  ength = request-
5a30: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
5a40: 65 6e 67 74 68 3b 0a 09 6c 6f 67 2d 3e 66 69 6c  ength;..log->fil
5a50: 65 5f 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69  e_length = filei
5a60: 6e 66 6f 2d 3e 6c 65 6e 3b 0a 0a 23 69 66 64 65  nfo->len;..#ifde
5a70: 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b  f FILED_NONBLOCK
5a80: 5f 48 54 54 50 0a 09 69 6e 74 20 73 6f 63 6b 65  _HTTP..int socke
5a90: 74 5f 66 6c 61 67 73 3b 0a 09 66 64 5f 73 65 74  t_flags;..fd_set
5aa0: 20 72 66 64 2c 20 77 66 64 3b 0a 09 63 68 61 72   rfd, wfd;..char
5ab0: 20 73 69 6e 6b 62 75 66 5b 38 31 39 32 5d 3b 0a   sinkbuf[8192];.
5ac0: 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65  .ssize_t read_re
5ad0: 74 3b 0a 0a 09 46 44 5f 5a 45 52 4f 28 26 72 66  t;...FD_ZERO(&rf
5ae0: 64 29 3b 0a 09 46 44 5f 5a 45 52 4f 28 26 77 66  d);..FD_ZERO(&wf
5af0: 64 29 3b 0a 09 46 44 5f 53 45 54 28 66 64 2c 20  d);..FD_SET(fd, 
5b00: 26 72 66 64 29 3b 0a 09 46 44 5f 53 45 54 28 66  &rfd);..FD_SET(f
5b10: 64 2c 20 26 77 66 64 29 3b 0a 0a 09 73 6f 63 6b  d, &wfd);...sock
5b20: 65 74 5f 66 6c 61 67 73 20 3d 20 66 63 6e 74 6c  et_flags = fcntl
5b30: 28 66 64 2c 20 46 5f 47 45 54 46 4c 29 3b 0a 09  (fd, F_GETFL);..
5b40: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  fcntl(fd, F_SETF
5b50: 4c 2c 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20  L, socket_flags 
5b60: 7c 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a 23  | O_NONBLOCK);.#
5b70: 65 6e 64 69 66 0a 09 73 65 6e 64 66 69 6c 65 5f  endif..sendfile_
5b80: 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65 73 74  offset = request
5b90: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
5ba0: 6f 66 66 73 65 74 3b 0a 09 73 65 6e 64 66 69 6c  offset;..sendfil
5bb0: 65 5f 6c 65 6e 20 3d 20 72 65 71 75 65 73 74 2d  e_len = request-
5bc0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
5bd0: 65 6e 67 74 68 3b 0a 09 73 65 6e 64 66 69 6c 65  ength;..sendfile
5be0: 5f 73 65 6e 74 20 3d 20 30 3b 0a 09 77 68 69 6c  _sent = 0;..whil
5bf0: 65 20 28 72 65 71 75 65 73 74 2d 3e 6d 65 74 68  e (request->meth
5c00: 6f 64 20 3d 3d 20 46 49 4c 45 44 5f 52 45 51 55  od == FILED_REQU
5c10: 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54 29 20  EST_METHOD_GET) 
5c20: 7b 0a 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65  {...if (sendfile
5c30: 5f 6c 65 6e 20 3e 20 46 49 4c 45 44 5f 53 45 4e  _len > FILED_SEN
5c40: 44 46 49 4c 45 5f 4d 41 58 29 20 7b 0a 09 09 09  DFILE_MAX) {....
5c50: 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20  sendfile_size = 
5c60: 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45 5f 4d  FILED_SENDFILE_M
5c70: 41 58 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  AX;...} else {..
5c80: 09 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20  ..sendfile_size 
5c90: 3d 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a  = sendfile_len;.
5ca0: 09 09 7d 0a 0a 09 09 73 65 6e 64 66 69 6c 65 5f  ..}....sendfile_
5cb0: 72 65 74 20 3d 20 73 65 6e 64 66 69 6c 65 28 66  ret = sendfile(f
5cc0: 64 2c 20 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c  d, fileinfo->fd,
5cd0: 20 26 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65   &sendfile_offse
5ce0: 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  t, sendfile_size
5cf0: 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 66 69 6c  );...if (sendfil
5d00: 65 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 23 69  e_ret <= 0) {.#i
5d10: 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c  fdef FILED_NONBL
5d20: 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69 66 20 28  OCK_HTTP....if (
5d30: 65 72 72 6e 6f 20 3d 3d 20 45 41 47 41 49 4e 29  errno == EAGAIN)
5d40: 20 7b 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f   {.....sendfile_
5d50: 72 65 74 20 3d 20 30 3b 0a 0a 09 09 09 09 77 68  ret = 0;......wh
5d60: 69 6c 65 20 28 31 29 20 7b 0a 09 09 09 09 09 73  ile (1) {......s
5d70: 65 6c 65 63 74 28 66 64 20 2b 20 31 2c 20 26 72  elect(fd + 1, &r
5d80: 66 64 2c 20 26 77 66 64 2c 20 4e 55 4c 4c 2c 20  fd, &wfd, NULL, 
5d90: 4e 55 4c 4c 29 3b 0a 09 09 09 09 09 69 66 20 28  NULL);......if (
5da0: 46 44 5f 49 53 53 45 54 28 66 64 2c 20 26 72 66  FD_ISSET(fd, &rf
5db0: 64 29 29 20 7b 0a 09 09 09 09 09 09 72 65 61 64  d)) {.......read
5dc0: 5f 72 65 74 20 3d 20 72 65 61 64 28 66 64 2c 20  _ret = read(fd, 
5dd0: 73 69 6e 6b 62 75 66 2c 20 73 69 7a 65 6f 66 28  sinkbuf, sizeof(
5de0: 73 69 6e 6b 62 75 66 29 29 3b 0a 0a 09 09 09 09  sinkbuf));......
5df0: 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c  ..if (read_ret <
5e00: 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 62 72  = 0) {........br
5e10: 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  eak;.......}....
5e20: 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 46 44  ..}.......if (FD
5e30: 5f 49 53 53 45 54 28 66 64 2c 20 26 77 66 64 29  _ISSET(fd, &wfd)
5e40: 29 20 7b 0a 09 09 09 09 09 09 72 65 61 64 5f 72  ) {.......read_r
5e50: 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 09 09 62  et = 1;........b
5e60: 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
5e70: 09 7d 0a 0a 09 09 09 09 69 66 20 28 72 65 61 64  .}......if (read
5e80: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
5e90: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09  ..break;.....}..
5ea0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 62  ..} else {.....b
5eb0: 72 65 61 6b 3b 0a 09 09 09 7d 0a 23 65 6c 73 65  reak;....}.#else
5ec0: 0a 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  ....break;.#endi
5ed0: 66 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 66 69 6c  f...}....sendfil
5ee0: 65 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64 66 69 6c  e_len -= sendfil
5ef0: 65 5f 72 65 74 3b 0a 09 09 73 65 6e 64 66 69 6c  e_ret;...sendfil
5f00: 65 5f 73 65 6e 74 20 2b 3d 20 73 65 6e 64 66 69  e_sent += sendfi
5f10: 6c 65 5f 72 65 74 3b 0a 09 09 69 66 20 28 73 65  le_ret;...if (se
5f20: 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29  ndfile_len == 0)
5f30: 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d   {....break;...}
5f40: 0a 09 7d 0a 0a 09 6c 6f 67 2d 3e 65 6e 64 74 69  ..}...log->endti
5f50: 6d 65 20 3d 20 28 74 69 6d 65 5f 74 29 20 2d 31  me = (time_t) -1
5f60: 3b 0a 09 6c 6f 67 2d 3e 73 65 6e 74 5f 6c 65 6e  ;..log->sent_len
5f70: 67 74 68 20 3d 20 73 65 6e 64 66 69 6c 65 5f 73  gth = sendfile_s
5f80: 65 6e 74 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  ent;...filed_log
5f90: 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 63  _entry(log);...c
5fa0: 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66  lose(fileinfo->f
5fb0: 64 29 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29  d);...fclose(fp)
5fc0: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
5fd0: 2a 20 48 61 6e 64 6c 65 20 69 6e 63 6f 6d 69 6e  * Handle incomin
5fe0: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
5ff0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69  .static void *fi
6000: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
6010: 64 28 76 6f 69 64 20 2a 61 72 67 5f 76 29 20 7b  d(void *arg_v) {
6020: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  ..struct filed_w
6030: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
6040: 73 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20  s *arg;..struct 
6050: 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65  filed_http_reque
6060: 73 74 20 72 65 71 75 65 73 74 3b 0a 09 73 74 72  st request;..str
6070: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
6080: 74 72 79 20 2a 6c 6f 67 2c 20 6c 6f 63 61 6c 5f  try *log, local_
6090: 64 75 6d 6d 79 5f 6c 6f 67 3b 0a 09 73 74 72 75  dummy_log;..stru
60a0: 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73  ct filed_options
60b0: 20 2a 6f 70 74 69 6f 6e 73 3b 0a 09 73 74 72 75   *options;..stru
60c0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  ct sockaddr_in6 
60d0: 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74  addr;..socklen_t
60e0: 20 61 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66   addrlen;..int f
60f0: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30  ailure_count = 0
6100: 2c 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f  , max_failure_co
6110: 75 6e 74 20 3d 20 46 49 4c 45 44 5f 4d 41 58 5f  unt = FILED_MAX_
6120: 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a 09  FAILURE_COUNT;..
6130: 69 6e 74 20 6d 61 73 74 65 72 5f 66 64 2c 20 66  int master_fd, f
6140: 64 3b 0a 0a 09 2f 2a 20 52 65 61 64 20 61 72 67  d;.../* Read arg
6150: 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d  uments */..arg =
6160: 20 61 72 67 5f 76 3b 0a 0a 09 6d 61 73 74 65 72   arg_v;...master
6170: 5f 66 64 20 3d 20 61 72 67 2d 3e 66 64 3b 0a 09  _fd = arg->fd;..
6180: 6f 70 74 69 6f 6e 73 20 3d 20 26 61 72 67 2d 3e  options = &arg->
6190: 6f 70 74 69 6f 6e 73 3b 0a 0a 09 77 68 69 6c 65  options;...while
61a0: 20 28 31 29 20 7b 0a 09 09 2f 2a 20 46 61 69 6c   (1) {.../* Fail
61b0: 75 72 65 20 6c 6f 6f 70 20 70 72 65 76 65 6e 74  ure loop prevent
61c0: 69 6f 6e 20 2a 2f 0a 09 09 69 66 20 28 66 61 69  ion */...if (fai
61d0: 6c 75 72 65 5f 63 6f 75 6e 74 20 3e 20 6d 61 78  lure_count > max
61e0: 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 29 20  _failure_count) 
61f0: 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  {....break;...}.
6200: 0a 09 09 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .../* Allocate a
6210: 20 6e 65 77 20 6c 6f 67 20 62 75 66 66 65 72 20   new log buffer 
6220: 2a 2f 0a 09 09 6c 6f 67 20 3d 20 66 69 6c 65 64  */...log = filed
6230: 5f 6c 6f 67 5f 6e 65 77 28 31 29 3b 0a 09 09 69  _log_new(1);...i
6240: 66 20 28 6c 6f 67 20 3d 3d 20 4e 55 4c 4c 29 20  f (log == NULL) 
6250: 7b 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  {....filed_log_m
6260: 73 67 28 22 41 4c 4c 4f 43 41 54 45 5f 4c 4f 47  sg("ALLOCATE_LOG
6270: 5f 4d 53 47 5f 46 41 49 4c 45 44 22 29 3b 0a 0a  _MSG_FAILED");..
6280: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
6290: 09 6c 6f 67 2d 3e 74 79 70 65 20 3d 20 46 49 4c  .log->type = FIL
62a0: 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41 4e  ED_LOG_TYPE_TRAN
62b0: 53 46 45 52 3b 0a 0a 09 09 2f 2a 20 41 63 63 65  SFER;..../* Acce
62c0: 70 74 20 61 20 6e 65 77 20 63 6c 69 65 6e 74 20  pt a new client 
62d0: 2a 2f 0a 09 09 61 64 64 72 6c 65 6e 20 3d 20 73  */...addrlen = s
62e0: 69 7a 65 6f 66 28 61 64 64 72 29 3b 0a 09 09 66  izeof(addr);...f
62f0: 64 20 3d 20 61 63 63 65 70 74 28 6d 61 73 74 65  d = accept(maste
6300: 72 5f 66 64 2c 20 28 73 74 72 75 63 74 20 73 6f  r_fd, (struct so
6310: 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72 2c  ckaddr *) &addr,
6320: 20 26 61 64 64 72 6c 65 6e 29 3b 0a 0a 09 09 2f   &addrlen);..../
6330: 2a 0a 09 09 20 2a 20 49 66 20 77 65 20 66 61 69  *... * If we fai
6340: 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74 65 20 6f  l, make a note o
6350: 66 20 69 74 20 73 6f 20 77 65 20 64 6f 6e 27 74  f it so we don't
6360: 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f 6f 70 20   go into a loop 
6370: 6f 66 0a 09 09 20 2a 20 61 63 63 65 70 74 28 29  of... * accept()
6380: 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a 2f 0a 09   failing... */..
6390: 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09  .if (fd < 0) {..
63a0: 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e 65 77  ../* Log the new
63b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09   connection */..
63c0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
63d0: 22 41 43 43 45 50 54 5f 46 41 49 4c 45 44 22 29  "ACCEPT_FAILED")
63e0: 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65 5f 63 6f  ;.....failure_co
63f0: 75 6e 74 2b 2b 3b 0a 0a 09 09 09 66 72 65 65 28  unt++;.....free(
6400: 6c 6f 67 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  log);.....contin
6410: 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 46 69  ue;...}..../* Fi
6420: 6c 6c 20 69 6e 20 6c 6f 67 20 73 74 72 75 63 74  ll in log struct
6430: 75 72 65 20 2a 2f 0a 09 09 69 66 20 28 66 69 6c  ure */...if (fil
6440: 65 64 5f 6c 6f 67 5f 69 70 28 28 73 74 72 75 63  ed_log_ip((struc
6450: 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61  t sockaddr *) &a
6460: 64 64 72 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73 69  ddr, log->ip, si
6470: 7a 65 6f 66 28 6c 6f 67 2d 3e 69 70 29 29 20 3d  zeof(log->ip)) =
6480: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67  = NULL) {....log
6490: 2d 3e 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ->ip[0] = '\0';.
64a0: 09 09 09 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 30  ...log->port = 0
64b0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
64c0: 6c 6f 67 2d 3e 70 6f 72 74 20 3d 20 61 64 64 72  log->port = addr
64d0: 2e 73 69 6e 36 5f 70 6f 72 74 3b 0a 09 09 7d 0a  .sin6_port;...}.
64e0: 0a 09 09 2f 2a 20 52 65 73 65 74 20 66 61 69 6c  .../* Reset fail
64f0: 75 72 65 20 63 6f 75 6e 74 2a 2f 0a 09 09 66 61  ure count*/...fa
6500: 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 3b  ilure_count = 0;
6510: 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20 73 6f  ..../* Handle so
6520: 63 6b 65 74 20 2a 2f 0a 09 09 66 69 6c 65 64 5f  cket */...filed_
6530: 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 66 64  handle_client(fd
6540: 2c 20 26 72 65 71 75 65 73 74 2c 20 6c 6f 67 2c  , &request, log,
6550: 20 6f 70 74 69 6f 6e 73 29 3b 0a 09 7d 0a 0a 09   options);..}...
6560: 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 20  /* Report error 
6570: 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  */..filed_log_ms
6580: 67 28 22 54 48 52 45 41 44 5f 44 49 45 44 20 41  g("THREAD_DIED A
6590: 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72 65 74  BNORMAL");...ret
65a0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20  urn(NULL);.../* 
65b0: 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 20  local_dummy_log 
65c0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
65d0: 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 20 69  FILED_DONT_LOG i
65e0: 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74 68 65 72  s enabled, other
65f0: 77 69 73 65 20 69 74 27 73 20 6e 6f 74 20 75 73  wise it's not us
6600: 65 64 2c 20 62 75 74 20 74 68 65 20 63 6f 6d 70  ed, but the comp
6610: 69 6c 65 72 20 68 61 74 65 73 20 74 68 61 74 20  iler hates that 
6620: 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61 6c 5f  idea. */..local_
6630: 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65 20 3d  dummy_log.type =
6640: 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d 79   0;..local_dummy
6650: 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f 63 61  _log.type = loca
6660: 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65  l_dummy_log.type
6670: 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 77  ;.}../* Create w
6680: 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f  orker threads */
6690: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
66a0: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73  d_worker_threads
66b0: 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c 20 69 6e  _init(int fd, in
66c0: 74 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 2c 20  t thread_count, 
66d0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6f 70 74  struct filed_opt
66e0: 69 6f 6e 73 20 2a 6f 70 74 69 6f 6e 73 29 20 7b  ions *options) {
66f0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  ..struct filed_w
6700: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
6710: 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65 61 64  s *arg;..pthread
6720: 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09 69 6e  _t threadid;..in
6730: 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b 0a 09  t pthread_ret;..
6740: 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69 20  int i;...for (i 
6750: 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61 64 5f  = 0; i < thread_
6760: 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 09  count; i++) {...
6770: 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  arg = malloc(siz
6780: 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09 61  eof(*arg));....a
6790: 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09 6d  rg->fd = fd;...m
67a0: 65 6d 63 70 79 28 26 61 72 67 2d 3e 6f 70 74 69  emcpy(&arg->opti
67b0: 6f 6e 73 2c 20 6f 70 74 69 6f 6e 73 2c 20 73 69  ons, options, si
67c0: 7a 65 6f 66 28 2a 6f 70 74 69 6f 6e 73 29 29 3b  zeof(*options));
67d0: 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 20  ....pthread_ret 
67e0: 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65  = pthread_create
67f0: 28 26 74 68 72 65 61 64 69 64 2c 20 4e 55 4c 4c  (&threadid, NULL
6800: 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74  , filed_worker_t
6810: 68 72 65 61 64 2c 20 61 72 67 29 3b 0a 09 09 69  hread, arg);...i
6820: 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 20 21  f (pthread_ret !
6830: 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  = 0) {....return
6840: 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72  (-1);...}..}...r
6850: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
6860: 44 69 73 70 6c 61 79 20 68 65 6c 70 20 2a 2f 0a  Display help */.
6870: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
6880: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46 49 4c  d_print_help(FIL
6890: 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74 20 6c  E *output, int l
68a0: 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73 74 20  ong_help, const 
68b0: 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b 0a 09  char *extra) {..
68c0: 69 66 20 28 65 78 74 72 61 29 20 7b 0a 09 09 66  if (extra) {...f
68d0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
68e0: 25 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b 0a 09  %s\n", extra);..
68f0: 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  }...fprintf(outp
6900: 75 74 2c 20 22 55 73 61 67 65 3a 20 66 69 6c 65  ut, "Usage: file
6910: 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c 6e 22  d [<options>]\n"
6920: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
6930: 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73 3a 5c  ut, "  Options:\
6940: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
6950: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68 2c  tput, "      -h,
6960: 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09 66 70   --help\n");..fp
6970: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6980: 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65 6d 6f       -d, --daemo
6990: 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  n\n");..fprintf(
69a0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
69b0: 76 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c 6e 22 29  v, --version\n")
69c0: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
69d0: 74 2c 20 22 20 20 20 20 20 20 2d 56 2c 20 2d 2d  t, "      -V, --
69e0: 76 68 6f 73 74 5c 6e 22 29 3b 0a 09 66 70 72 69  vhost\n");..fpri
69f0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
6a00: 20 20 20 2d 62 20 3c 61 64 64 72 65 73 73 3e 2c     -b <address>,
6a10: 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72 65 73 73   --bind <address
6a20: 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  >\n");..fprintf(
6a30: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
6a40: 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f 72 74  p <port>, --port
6a50: 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09 66 70   <port>\n");..fp
6a60: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6a70: 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e 74 3e 2c       -t <count>,
6a80: 20 2d 2d 74 68 72 65 61 64 73 20 3c 63 6f 75 6e   --threads <coun
6a90: 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  t>\n");..fprintf
6aa0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6ab0: 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c 20 2d 2d  -c <entries>, --
6ac0: 63 61 63 68 65 20 3c 65 6e 74 72 69 65 73 3e 5c  cache <entries>\
6ad0: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
6ae0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20  tput, "      -l 
6af0: 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20 3c 66  <file>, --log <f
6b00: 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  ile>\n");..fprin
6b10: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6b20: 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20 2d 2d 75    -u <user>, --u
6b30: 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22 29 3b 0a  ser <user>\n");.
6b40: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6b50: 20 22 20 20 20 20 20 20 2d 72 20 3c 64 69 72 65   "      -r <dire
6b60: 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74 20 3c  ctory>, --root <
6b70: 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22 29 3b 0a  directory>\n");.
6b80: 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65 6c 70 29  ..if (long_help)
6b90: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74   {...fprintf(out
6ba0: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
6bb0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6bc0: 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 09 09 66   Usage:\n");...f
6bd0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6be0: 20 20 20 20 20 20 2d 68 20 28 6f 72 20 2d 2d 68        -h (or --h
6bf0: 65 6c 70 29 20 70 72 69 6e 74 73 20 74 68 69 73  elp) prints this
6c00: 20 75 73 61 67 65 20 69 6e 66 6f 72 6d 61 74 69   usage informati
6c10: 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  on.\n");...fprin
6c20: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
6c30: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
6c40: 75 74 2c 20 22 20 20 20 20 20 20 2d 64 20 28 6f  ut, "      -d (o
6c50: 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e 73 74  r --daemon) inst
6c60: 72 75 63 74 73 20 66 69 6c 65 64 20 74 6f 20 62  ructs filed to b
6c70: 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 61  ecome a daemon a
6c80: 66 74 65 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e  fter initializin
6c90: 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  g\n");...fprintf
6ca0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 74 68 65 20 6c 69 73 74 65 6e 69 6e 67 20 54   the listening T
6cd0: 43 50 20 73 6f 63 6b 65 74 20 61 6e 64 20 6c 6f  CP socket and lo
6ce0: 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09  g files.\n");...
6cf0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6d00: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
6d10: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6d20: 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73 69 6f 6e  -v (or --version
6d30: 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65  ) instructs file
6d40: 64 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20  d print out the 
6d50: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
6d60: 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b 0a 09 09  nd exit.\n");...
6d70: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6d80: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
6d90: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6da0: 2d 56 20 28 6f 72 20 2d 2d 76 68 6f 73 74 29 20  -V (or --vhost) 
6db0: 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65 64 20  instructs filed 
6dc0: 74 6f 20 70 72 65 70 65 6e 64 20 61 6c 6c 20 72  to prepend all r
6dd0: 65 71 75 65 73 74 73 20 77 69 74 68 20 74 68 65  equests with the
6de0: 69 72 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66  ir HTTP\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 48 6f 73 74 20 68 65 61 64 65        Host heade
6e20: 72 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  r.\n");...fprint
6e30: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
6e40: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
6e50: 74 2c 20 22 20 20 20 20 20 20 2d 62 20 28 6f 72  t, "      -b (or
6e60: 20 2d 2d 62 69 6e 64 29 20 73 70 65 63 69 66 69   --bind) specifi
6e70: 65 73 20 74 68 65 20 61 64 64 72 65 73 73 20 74  es the address t
6e80: 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e 63  o listen for inc
6e90: 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a  oming HTTP\n");.
6ea0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
6eb0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
6ec0: 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73          requests
6ed0: 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c   on.  The defaul
6ee0: 74 20 76 61 6c 75 65 20 69 73 20 5c 22 25 73 5c  t value is \"%s\
6ef0: 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41 44 44 52  ".\n", BIND_ADDR
6f00: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
6f10: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
6f20: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6f30: 20 20 20 20 20 2d 70 20 28 6f 72 20 2d 2d 70 6f       -p (or --po
6f40: 72 74 29 20 73 70 65 63 69 66 69 65 73 20 74 68  rt) specifies th
6f50: 65 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62 65  e TCP port numbe
6f60: 72 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20  r to listen for 
6f70: 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22  incoming HTTP\n"
6f80: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
6f90: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
6fa0: 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65             reque
6fb0: 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66  sts on.  The def
6fc0: 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e 22 2c 20  ault is %u.\n", 
6fd0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 50  (unsigned int) P
6fe0: 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  ORT);...fprintf(
6ff0: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
7000: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
7010: 20 22 20 20 20 20 20 20 2d 74 20 28 6f 72 20 2d   "      -t (or -
7020: 2d 74 68 72 65 61 64 73 29 20 73 70 65 63 69 66  -threads) specif
7030: 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
7040: 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73  f worker threads
7050: 20 74 6f 20 63 72 65 61 74 65 2e 20 45 61 63 68   to create. Each
7060: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
7070: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 20 63   worker thread c
70a0: 61 6e 20 73 65 72 76 69 63 65 20 6f 6e 65 20 63  an service one c
70b0: 6f 6e 63 75 72 72 65 6e 74 20 48 54 54 50 20 73  oncurrent HTTP s
70c0: 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66  ession.\n");...f
70d0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 54 68 75 73 20 74 68 65          Thus the
7100: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61   number of threa
7110: 64 73 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20  ds created will 
7120: 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 5c 6e 22  determine how\n"
7130: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
7140: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
7160: 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  ny simultaneous 
7170: 74 72 61 6e 73 66 65 72 73 20 77 69 6c 6c 20 62  transfers will b
7180: 65 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 5c  e possible. The\
7190: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
71a0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75 2e 5c  default is %lu.\
71d0: 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  n", (unsigned lo
71e0: 6e 67 29 20 54 48 52 45 41 44 5f 43 4f 55 4e 54  ng) THREAD_COUNT
71f0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
7200: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
7210: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
7220: 20 20 20 20 20 2d 63 20 28 6f 72 20 2d 2d 63 61       -c (or --ca
7230: 63 68 65 29 20 73 70 65 63 69 66 69 65 73 20 74  che) specifies t
7240: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 6c  he number of fil
7250: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61  e information ca
7260: 63 68 65 20 65 6e 74 72 69 65 73 5c 6e 22 29 3b  che entries\n");
7270: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
7280: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
7290: 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 6c 6c            to all
72a0: 6f 63 61 74 65 2e 20 20 45 61 63 68 20 63 61 63  ocate.  Each cac
72b0: 68 65 20 65 6e 74 72 79 20 68 6f 6c 64 73 20 66  he entry holds f
72c0: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
72d0: 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  as\n");...fprint
72e0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f 70 65 6e   well as an open
7310: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7320: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 73 6f   to the file, so
7330: 20 72 65 73 6f 75 72 63 65 5c 6e 22 29 3b 0a 09   resource\n");..
7340: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
7350: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
7360: 20 20 20 20 20 20 20 20 6c 69 6d 69 74 73 20 28          limits (
7370: 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29 20 73 68  i.e., ulimit) sh
7380: 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72  ould be consider
7390: 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ed.  This should
73a0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
73b0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
73d0: 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62 65 72  e a prime number
73e0: 20 66 6f 72 20 69 64 65 61 6c 20 75 73 65 20 77   for ideal use w
73f0: 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75 70 20 6d  ith the lookup m
7400: 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09 66 70  ethod.\n");...fp
7410: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 54 68 65 20 64 65 66 61 75 6c 74       The default
7440: 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e   is %lu.\n", (un
7450: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
7460: 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66 70 72 69  HE_SIZE);...fpri
7470: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
7480: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
7490: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20 28  put, "      -l (
74a0: 6f 72 20 2d 2d 6c 6f 67 29 20 73 70 65 63 69 66  or --log) specif
74b0: 69 65 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 74  ies a filename t
74c0: 6f 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  o open for writi
74d0: 6e 67 20 6c 6f 67 20 65 6e 74 72 69 65 73 2e 20  ng log entries. 
74e0: 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69   Log\n");...fpri
74f0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
7520: 65 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73 74  e for various st
7530: 61 67 65 73 20 69 6e 20 74 72 61 6e 73 66 65 72  ages in transfer
7540: 69 6e 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a  ing files.\n");.
7550: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
7560: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
7570: 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 20 66         The log f
7580: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 65  ile is opened be
7590: 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 75  fore switching u
75a0: 73 65 72 73 20 28 73 65 65 20 5c 22 2d 75 5c 22  sers (see \"-u\"
75b0: 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  )\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 61 6e                an
75e0: 64 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69  d root directori
75f0: 65 73 20 28 73 65 65 20 5c 22 2d 72 5c 22 29 2e  es (see \"-r\").
7600: 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 69    The log file i
7610: 73 20 6e 65 76 65 72 5c 6e 22 29 3b 0a 09 09 66  s never\n");...f
7620: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 20 20 20 63 6c 6f 73 65 64 20 73 6f 20 6c 6f      closed so lo
7650: 67 20 72 6f 74 61 74 69 6f 6e 20 77 69 74 68 6f  g rotation witho
7660: 75 74 20 73 74 6f 70 70 69 6e 67 20 74 68 65 20  ut stopping the 
7670: 64 61 65 6d 6f 6e 20 69 73 20 77 69 6c 6c 5c 6e  daemon is will\n
7680: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
7690: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
76a0: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 77             not w
76b0: 6f 72 6b 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ork.  The value 
76c0: 6f 66 20 5c 22 2d 5c 22 20 69 6e 64 69 63 61 74  of \"-\" indicat
76d0: 65 73 20 74 68 61 74 20 73 74 61 6e 64 61 72 64  es that standard
76e0: 20 6f 75 74 70 75 74 5c 6e 22 29 3b 0a 09 09 66   output\n");...f
76f0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 75 73      should be us
7720: 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 2e 20  ed for logging. 
7730: 20 49 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   If the filename
7740: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 5c 6e   begins with a\n
7750: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
7760: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
7770: 20 20 20 20 20 20 20 20 20 20 20 70 69 70 65 20             pipe 
7780: 28 5c 22 7c 5c 22 29 20 74 68 65 6e 20 61 20 70  (\"|\") then a p
7790: 72 6f 63 65 73 73 20 69 73 20 73 74 61 72 74 65  rocess is starte
77a0: 64 20 61 6e 64 20 75 73 65 64 20 66 6f 72 20 6c  d and used for l
77b0: 6f 67 67 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70  ogging\n");...fp
77c0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20     instead of a 
77f0: 66 69 6c 65 2e 20 20 54 68 65 20 64 65 66 61 75  file.  The defau
7800: 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22  lt is \"%s\".\n"
7810: 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a 23 69 66  , LOG_FILE);.#if
7820: 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c  def FILED_DONT_L
7830: 4f 47 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  OG...fprintf(out
7840: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
7850: 20 20 20 20 20 20 20 20 20 20 4e 6f 74 65 20 74            Note t
7860: 68 61 74 20 6c 6f 67 67 69 6e 67 20 69 73 20 63  hat logging is c
7870: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 61 62 6c  ompletely disabl
7880: 65 64 20 73 6f 20 74 68 69 73 20 6f 70 74 69 6f  ed so this optio
7890: 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09 09 66 70  n does\n");...fp
78a0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e 20 74 68     nothing in th
78d0: 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23  is build.\n");.#
78e0: 65 6e 64 69 66 0a 09 09 66 70 72 69 6e 74 66 28  endif...fprintf(
78f0: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
7900: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
7910: 20 22 20 20 20 20 20 20 2d 75 20 28 6f 72 20 2d   "      -u (or -
7920: 2d 75 73 65 72 29 20 73 70 65 63 69 66 69 65 73  -user) specifies
7930: 20 74 68 65 20 75 73 65 72 20 74 6f 20 73 77 69   the user to swi
7940: 74 63 68 20 75 73 65 72 20 49 44 73 20 74 6f 20  tch user IDs to 
7950: 62 65 66 6f 72 65 20 73 65 72 76 69 63 69 6e 67  before servicing
7960: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
7970: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7990: 71 75 65 73 74 73 2e 20 20 54 68 65 20 64 65 66  quests.  The def
79a0: 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61 6e  ault is not chan
79b0: 67 65 20 75 73 65 72 20 49 44 73 2e 5c 6e 22 29  ge user IDs.\n")
79c0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
79d0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
79e0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
79f0: 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d 72 6f 6f      -r (or --roo
7a00: 74 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65  t) specifies the
7a10: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 61 63   directory to ac
7a20: 74 20 61 73 20 74 68 65 20 72 6f 6f 74 20 64 69  t as the root di
7a30: 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e 22 29 3b  rectory for\n");
7a40: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
7a50: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
7a60: 20 20 20 20 20 20 20 20 20 74 68 65 20 66 69 6c           the fil
7a70: 65 20 73 65 72 76 65 72 2e 20 20 49 66 20 74 68  e server.  If th
7a80: 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 73 70 65  is option is spe
7a90: 63 69 66 69 65 64 2c 20 63 68 72 6f 6f 74 28 32  cified, chroot(2
7aa0: 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  )\n");...fprintf
7ab0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
7ad0: 73 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 20 64  s called.  The d
7ae0: 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68  efault is not ch
7af0: 61 6e 67 65 20 72 6f 6f 74 20 64 69 72 65 63 74  ange root direct
7b00: 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09 09 66 70  ories,\n");...fp
7b10: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 20 20 20 20 74 68 61 74 20 69 73 2c 20 74 68 65      that is, the
7b40: 20 5c 22 2f 5c 22 20 64 69 72 65 63 74 6f 72 79   \"/\" directory
7b50: 20 69 73 20 73 68 61 72 65 64 20 6f 75 74 2e 20   is shared out. 
7b60: 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a   This will\n");.
7b70: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
7b80: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
7b90: 20 20 20 20 20 20 20 20 6c 69 6b 65 6c 79 20 62          likely b
7ba0: 65 20 61 20 73 65 63 75 72 69 74 79 20 69 73 73  e a security iss
7bb0: 75 65 2c 20 73 6f 20 74 68 69 73 20 6f 70 74 69  ue, so this opti
7bc0: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
7bd0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
7be0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
7c00: 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a   used.\n");..}..
7c10: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41  .return;.}../* A
7c20: 64 64 20 61 20 67 65 74 6f 70 74 20 6f 70 74 69  dd a getopt opti
7c30: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
7c40: 64 20 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  d filed_getopt_l
7c50: 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74 72 75 63  ong_setopt(struc
7c60: 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74 2c 20 63  t option *opt, c
7c70: 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c  onst char *name,
7c80: 20 69 6e 74 20 68 61 73 5f 61 72 67 2c 20 69 6e   int has_arg, in
7c90: 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e 6e  t val) {..opt->n
7ca0: 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d 65 3b 0a  ame     = name;.
7cb0: 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67 20 20 3d  .opt->has_arg  =
7cc0: 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70 74 2d 3e   has_arg;..opt->
7cd0: 66 6c 61 67 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  flag     = NULL;
7ce0: 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20 20 20 20  ..opt->val      
7cf0: 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75 72 6e 3b  = val;...return;
7d00: 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61  .}../* Resolve a
7d10: 20 75 73 65 72 6e 61 6d 65 20 74 6f 20 61 20 55   username to a U
7d20: 49 44 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ID */.static int
7d30: 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b   filed_user_look
7d40: 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  up(const char *u
7d50: 73 65 72 2c 20 75 69 64 5f 74 20 2a 75 73 65 72  ser, uid_t *user
7d60: 5f 69 64 29 20 7b 0a 09 63 68 61 72 20 2a 6e 65  _id) {..char *ne
7d70: 78 74 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 5f  xt;..uid_t user_
7d80: 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66 6e 64 65  id_check;.#ifnde
7d90: 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45 54 50 57  f FILED_NO_GETPW
7da0: 4e 41 4d 0a 09 73 74 72 75 63 74 20 70 61 73 73  NAM..struct pass
7db0: 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20 3d  wd *ent;...ent =
7dc0: 20 67 65 74 70 77 6e 61 6d 28 75 73 65 72 29 3b   getpwnam(user);
7dd0: 0a 09 69 66 20 28 65 6e 74 20 21 3d 20 4e 55 4c  ..if (ent != NUL
7de0: 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f 69 64 20  L) {...*user_id 
7df0: 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a 0a  = ent->pw_uid;..
7e00: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
7e10: 23 65 6e 64 69 66 0a 0a 09 75 73 65 72 5f 69 64  #endif...user_id
7e20: 5f 63 68 65 63 6b 20 3d 20 73 74 72 74 6f 75 6c  _check = strtoul
7e30: 6c 28 75 73 65 72 2c 20 26 6e 65 78 74 2c 20 31  l(user, &next, 1
7e40: 30 29 3b 0a 09 69 66 20 28 6e 65 78 74 20 3d 3d  0);..if (next ==
7e50: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
7e60: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e  n(1);..}...if (n
7e70: 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20  ext[0] != '\0') 
7e80: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
7e90: 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20 3d 20 75  }...*user_id = u
7ea0: 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a 09  ser_id_check;...
7eb0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
7ec0: 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73 74   Daemonize */.st
7ed0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 64  atic int filed_d
7ee0: 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29 20 7b  aemonize(void) {
7ef0: 0a 09 70 69 64 5f 74 20 73 65 74 73 69 64 5f 72  ..pid_t setsid_r
7f00: 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b 0a 09 69  et, fork_ret;..i
7f10: 6e 74 20 63 68 64 69 72 5f 72 65 74 2c 20 64 75  nt chdir_ret, du
7f20: 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20 66 64 5f  p2_ret;..int fd_
7f30: 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a 09 63 68  in, fd_out;...ch
7f40: 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72 28  dir_ret = chdir(
7f50: 22 2f 22 29 3b 0a 09 69 66 20 28 63 68 64 69 72  "/");..if (chdir
7f60: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72  _ret != 0) {...r
7f70: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66  eturn(1);..}...f
7f80: 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72 6b 28 29  ork_ret = fork()
7f90: 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74 20  ;..if (fork_ret 
7fa0: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
7fb0: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 6f 72  1);..}...if (for
7fc0: 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 2f  k_ret > 0) {.../
7fd0: 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09 09 77 61  * Parent */...wa
7fe0: 69 74 70 69 64 28 66 6f 72 6b 5f 72 65 74 2c 20  itpid(fork_ret, 
7ff0: 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 65 78 69  NULL, 0);....exi
8000: 74 28 45 58 49 54 5f 53 55 43 43 45 53 53 29 3b  t(EXIT_SUCCESS);
8010: 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c 64 20 2a  ..}.../* Child *
8020: 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29 20 21 3d  /..if (fork() !=
8030: 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68 69 6c 64   0) {.../* Child
8040: 20 2a 2f 0a 09 09 65 78 69 74 28 45 58 49 54 5f   */...exit(EXIT_
8050: 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f  SUCCESS);..}.../
8060: 2a 20 47 72 61 6e 64 20 63 68 69 6c 64 20 2a 2f  * Grand child */
8070: 0a 09 73 65 74 73 69 64 5f 72 65 74 20 3d 20 73  ..setsid_ret = s
8080: 65 74 73 69 64 28 29 3b 0a 09 69 66 20 28 73 65  etsid();..if (se
8090: 74 73 69 64 5f 72 65 74 20 3d 3d 20 28 28 70 69  tsid_ret == ((pi
80a0: 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 72 65  d_t) -1)) {...re
80b0: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 64  turn(1);..}...fd
80c0: 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76  _in = open("/dev
80d0: 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59  /null", O_RDONLY
80e0: 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20 6f 70 65  );..fd_out = ope
80f0: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f  n("/dev/null", O
8100: 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 66  _WRONLY);..if (f
8110: 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66 64 5f 6f  d_in < 0 || fd_o
8120: 75 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  ut < 0) {...retu
8130: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32  rn(1);..}...dup2
8140: 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f 69  _ret = dup2(fd_i
8150: 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29  n, STDIN_FILENO)
8160: 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74 20  ;..if (dup2_ret 
8170: 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29  != STDIN_FILENO)
8180: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
8190: 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20  .}...dup2_ret = 
81a0: 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54 44  dup2(fd_out, STD
81b0: 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66  OUT_FILENO);..if
81c0: 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54   (dup2_ret != ST
81d0: 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09  DOUT_FILENO) {..
81e0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
81f0: 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32  .dup2_ret = dup2
8200: 28 66 64 5f 6f 75 74 2c 20 53 54 44 45 52 52 5f  (fd_out, STDERR_
8210: 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75  FILENO);..if (du
8220: 70 32 5f 72 65 74 20 21 3d 20 53 54 44 45 52 52  p2_ret != STDERR
8230: 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74  _FILENO) {...ret
8240: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c 6f  urn(1);..}...clo
8250: 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f 73  se(fd_in);..clos
8260: 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09 72 65 74  e(fd_out);...ret
8270: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 75  urn(0);.}../* Ru
8280: 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a 69 6e 74  n process */.int
8290: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
82a0: 63 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09  char **argv) {..
82b0: 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20 6f 70  struct option op
82c0: 74 69 6f 6e 73 5b 31 32 5d 3b 0a 09 73 74 72 75  tions[12];..stru
82d0: 63 74 20 66 69 6c 65 64 5f 6f 70 74 69 6f 6e 73  ct filed_options
82e0: 20 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73 3b   thread_options;
82f0: 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 69  ..const char *bi
8300: 6e 64 5f 61 64 64 72 20 3d 20 42 49 4e 44 5f 41  nd_addr = BIND_A
8310: 44 44 52 2c 20 2a 6e 65 77 72 6f 6f 74 20 3d 20  DDR, *newroot = 
8320: 4e 55 4c 4c 2c 20 2a 6c 6f 67 5f 66 69 6c 65 20  NULL, *log_file 
8330: 3d 20 4c 4f 47 5f 46 49 4c 45 3b 0a 09 46 49 4c  = LOG_FILE;..FIL
8340: 45 20 2a 6c 6f 67 5f 66 70 3b 0a 09 75 69 64 5f  E *log_fp;..uid_
8350: 74 20 75 73 65 72 20 3d 20 30 3b 0a 09 69 6e 74  t user = 0;..int
8360: 20 70 6f 72 74 20 3d 20 50 4f 52 54 2c 20 74 68   port = PORT, th
8370: 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 54 48 52  read_count = THR
8380: 45 41 44 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20  EAD_COUNT;..int 
8390: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 43 41 43  cache_size = CAC
83a0: 48 45 5f 53 49 5a 45 3b 0a 09 69 6e 74 20 69 6e  HE_SIZE;..int in
83b0: 69 74 5f 72 65 74 2c 20 63 68 72 6f 6f 74 5f 72  it_ret, chroot_r
83c0: 65 74 2c 20 73 65 74 75 69 64 5f 72 65 74 2c 20  et, setuid_ret, 
83d0: 6c 6f 6f 6b 75 70 5f 72 65 74 2c 20 63 68 64 69  lookup_ret, chdi
83e0: 72 5f 72 65 74 3b 0a 09 69 6e 74 20 73 65 74 75  r_ret;..int setu
83f0: 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 30 2c 20  id_enabled = 0, 
8400: 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d  daemon_enabled =
8410: 20 30 3b 0a 09 69 6e 74 20 63 68 3b 0a 09 69 6e   0;..int ch;..in
8420: 74 20 66 64 3b 0a 0a 09 2f 2a 20 53 65 74 20 64  t fd;.../* Set d
8430: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f  efault values */
8440: 0a 09 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e 73  ..thread_options
8450: 2e 76 68 6f 73 74 73 5f 65 6e 61 62 6c 65 64 20  .vhosts_enabled 
8460: 3d 20 30 3b 0a 0a 09 2f 2a 20 50 72 6f 63 65 73  = 0;.../* Proces
8470: 73 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09  s arguments */..
8480: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
8490: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
84a0: 73 5b 30 5d 2c 20 22 70 6f 72 74 22 2c 20 72 65  s[0], "port", re
84b0: 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c  quired_argument,
84c0: 20 27 70 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'p');..filed_ge
84d0: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
84e0: 28 26 6f 70 74 69 6f 6e 73 5b 31 5d 2c 20 22 74  (&options[1], "t
84f0: 68 72 65 61 64 73 22 2c 20 72 65 71 75 69 72 65  hreads", require
8500: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 74 27 29  d_argument, 't')
8510: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
8520: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
8530: 69 6f 6e 73 5b 32 5d 2c 20 22 63 61 63 68 65 22  ions[2], "cache"
8540: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
8550: 65 6e 74 2c 20 27 63 27 29 3b 0a 09 66 69 6c 65  ent, 'c');..file
8560: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
8570: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 33 5d  topt(&options[3]
8580: 2c 20 22 62 69 6e 64 22 2c 20 72 65 71 75 69 72  , "bind", requir
8590: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 62 27  ed_argument, 'b'
85a0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
85b0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
85c0: 74 69 6f 6e 73 5b 34 5d 2c 20 22 75 73 65 72 22  tions[4], "user"
85d0: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
85e0: 65 6e 74 2c 20 27 75 27 29 3b 0a 09 66 69 6c 65  ent, 'u');..file
85f0: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
8600: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 35 5d  topt(&options[5]
8610: 2c 20 22 72 6f 6f 74 22 2c 20 72 65 71 75 69 72  , "root", requir
8620: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 72 27  ed_argument, 'r'
8630: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
8640: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
8650: 74 69 6f 6e 73 5b 36 5d 2c 20 22 68 65 6c 70 22  tions[6], "help"
8660: 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27  , no_argument, '
8670: 68 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  h');..filed_geto
8680: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
8690: 6f 70 74 69 6f 6e 73 5b 37 5d 2c 20 22 64 61 65  options[7], "dae
86a0: 6d 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e  mon", no_argumen
86b0: 74 2c 20 27 64 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'd');..filed_
86c0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
86d0: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 38 5d 2c 20  pt(&options[8], 
86e0: 22 6c 6f 67 22 2c 20 72 65 71 75 69 72 65 64 5f  "log", required_
86f0: 61 72 67 75 6d 65 6e 74 2c 20 27 6c 27 29 3b 0a  argument, 'l');.
8700: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
8710: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
8720: 6e 73 5b 39 5d 2c 20 22 76 65 72 73 69 6f 6e 22  ns[9], "version"
8730: 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27  , no_argument, '
8740: 76 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  v');..filed_geto
8750: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
8760: 6f 70 74 69 6f 6e 73 5b 31 30 5d 2c 20 22 76 68  options[10], "vh
8770: 6f 73 74 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e  ost", no_argumen
8780: 74 2c 20 27 56 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'V');..filed_
8790: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
87a0: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31 31 5d 2c  pt(&options[11],
87b0: 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 09 77   NULL, 0, 0);..w
87c0: 68 69 6c 65 20 28 28 63 68 20 3d 20 67 65 74 6f  hile ((ch = geto
87d0: 70 74 5f 6c 6f 6e 67 28 61 72 67 63 2c 20 61 72  pt_long(argc, ar
87e0: 67 76 2c 20 22 70 3a 74 3a 63 3a 62 3a 75 3a 72  gv, "p:t:c:b:u:r
87f0: 3a 6c 3a 68 64 76 56 22 2c 20 6f 70 74 69 6f 6e  :l:hdvV", option
8800: 73 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 2d 31 29  s, NULL)) != -1)
8810: 20 7b 0a 09 09 73 77 69 74 63 68 28 63 68 29 20   {...switch(ch) 
8820: 7b 0a 09 09 09 63 61 73 65 20 27 70 27 3a 0a 09  {....case 'p':..
8830: 09 09 09 70 6f 72 74 20 3d 20 61 74 6f 69 28 6f  ...port = atoi(o
8840: 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61  ptarg);.....brea
8850: 6b 3b 0a 09 09 09 63 61 73 65 20 27 74 27 3a 0a  k;....case 't':.
8860: 09 09 09 09 74 68 72 65 61 64 5f 63 6f 75 6e 74  ....thread_count
8870: 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b   = atoi(optarg);
8880: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
8890: 61 73 65 20 27 63 27 3a 0a 09 09 09 09 63 61 63  ase 'c':.....cac
88a0: 68 65 5f 73 69 7a 65 20 3d 20 61 74 6f 69 28 6f  he_size = atoi(o
88b0: 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61  ptarg);.....brea
88c0: 6b 3b 0a 09 09 09 63 61 73 65 20 27 62 27 3a 0a  k;....case 'b':.
88d0: 09 09 09 09 62 69 6e 64 5f 61 64 64 72 20 3d 20  ....bind_addr = 
88e0: 73 74 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a  strdup(optarg);.
88f0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
8900: 73 65 20 27 75 27 3a 0a 09 09 09 09 73 65 74 75  se 'u':.....setu
8910: 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  id_enabled = 1;.
8920: 09 09 09 09 6c 6f 6f 6b 75 70 5f 72 65 74 20 3d  ....lookup_ret =
8930: 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b   filed_user_look
8940: 75 70 28 6f 70 74 61 72 67 2c 20 26 75 73 65 72  up(optarg, &user
8950: 29 3b 0a 09 09 09 09 69 66 20 28 6c 6f 6f 6b 75  );.....if (looku
8960: 70 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  p_ret != 0) {...
8970: 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68  ...filed_print_h
8980: 65 6c 70 28 73 74 64 65 72 72 2c 20 30 2c 20 22  elp(stderr, 0, "
8990: 49 6e 76 61 6c 69 64 20 75 73 65 72 6e 61 6d 65  Invalid username
89a0: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 0a 09   specified");...
89b0: 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
89c0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
89d0: 09 09 09 63 61 73 65 20 27 72 27 3a 0a 09 09 09  ...case 'r':....
89e0: 09 6e 65 77 72 6f 6f 74 20 3d 20 73 74 72 64 75  .newroot = strdu
89f0: 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  p(optarg);.....b
8a00: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 6c  reak;....case 'l
8a10: 27 3a 0a 09 09 09 09 6c 6f 67 5f 66 69 6c 65 20  ':.....log_file 
8a20: 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72 67 29  = strdup(optarg)
8a30: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
8a40: 63 61 73 65 20 27 64 27 3a 0a 09 09 09 09 64 61  case 'd':.....da
8a50: 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20 31  emon_enabled = 1
8a60: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
8a70: 63 61 73 65 20 27 56 27 3a 0a 09 09 09 09 74 68  case 'V':.....th
8a80: 72 65 61 64 5f 6f 70 74 69 6f 6e 73 2e 76 68 6f  read_options.vho
8a90: 73 74 73 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b  sts_enabled = 1;
8aa0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
8ab0: 63 61 73 65 20 27 76 27 3a 0a 09 09 09 09 70 72  case 'v':.....pr
8ac0: 69 6e 74 66 28 22 66 69 6c 65 64 20 76 65 72 73  intf("filed vers
8ad0: 69 6f 6e 20 25 73 5c 6e 22 2c 20 46 49 4c 45 44  ion %s\n", FILED
8ae0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 09 09 09  _VERSION);......
8af0: 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 09 63 61  return(0);....ca
8b00: 73 65 20 27 3f 27 3a 0a 09 09 09 63 61 73 65 20  se '?':....case 
8b10: 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70  ':':.....filed_p
8b20: 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72  rint_help(stderr
8b30: 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09  , 0, NULL);.....
8b40: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 63  .return(1);....c
8b50: 61 73 65 20 27 68 27 3a 0a 09 09 09 09 66 69 6c  ase 'h':.....fil
8b60: 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74  ed_print_help(st
8b70: 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b 0a  dout, 1, NULL);.
8b80: 0a 09 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  .....return(0);.
8b90: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65 6e  ..}..}.../* Open
8ba0: 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 6c 6f   log file */..lo
8bb0: 67 5f 66 70 20 3d 20 66 69 6c 65 64 5f 6c 6f 67  g_fp = filed_log
8bc0: 5f 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c 65 29 3b  _open(log_file);
8bd0: 0a 09 69 66 20 28 6c 6f 67 5f 66 70 20 3d 3d 20  ..if (log_fp == 
8be0: 4e 55 4c 4c 29 20 7b 0a 09 09 70 65 72 72 6f 72  NULL) {...perror
8bf0: 28 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e  ("filed_log_open
8c00: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29  ");....return(4)
8c10: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65  ;..}.../* Create
8c20: 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65   listening socke
8c30: 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69 6c 65 64  t */..fd = filed
8c40: 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f 61 64 64  _listen(bind_add
8c50: 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66 20 28 66  r, port);..if (f
8c60: 64 20 3c 20 30 29 20 7b 0a 09 09 70 65 72 72 6f  d < 0) {...perro
8c70: 72 28 22 66 69 6c 65 64 5f 6c 69 73 74 65 6e 22  r("filed_listen"
8c80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
8c90: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 63 6f 6d 65 20  ..}.../* Become 
8ca0: 61 20 64 61 65 6d 6f 6e 20 2a 2f 0a 09 69 66 20  a daemon */..if 
8cb0: 28 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 29  (daemon_enabled)
8cc0: 20 7b 0a 09 09 69 6e 69 74 5f 72 65 74 20 3d 20   {...init_ret = 
8cd0: 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 28  filed_daemonize(
8ce0: 29 3b 0a 09 09 69 66 20 28 69 6e 69 74 5f 72 65  );...if (init_re
8cf0: 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72  t != 0) {....per
8d00: 72 6f 72 28 22 66 69 6c 65 64 5f 64 61 65 6d 6f  ror("filed_daemo
8d10: 6e 69 7a 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  nize");.....retu
8d20: 72 6e 28 36 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  rn(6);...}..}...
8d30: 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66 20 61 70  /* Chroot, if ap
8d40: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66  propriate */..if
8d50: 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09 63   (newroot) {...c
8d60: 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72  hdir_ret = chdir
8d70: 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09 69 66 20  (newroot);...if 
8d80: 28 63 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29  (chdir_ret != 0)
8d90: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68   {....perror("ch
8da0: 64 69 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  dir");.....retur
8db0: 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 63 68 72  n(1);...}....chr
8dc0: 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72 6f 6f 74  oot_ret = chroot
8dd0: 28 22 2e 22 29 3b 0a 09 09 69 66 20 28 63 68 72  (".");...if (chr
8de0: 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  oot_ret != 0) {.
8df0: 09 09 09 70 65 72 72 6f 72 28 22 63 68 72 6f 6f  ...perror("chroo
8e00: 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
8e10: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  1);...}..}.../* 
8e20: 44 72 6f 70 20 70 72 69 76 69 6c 65 67 65 73 2c  Drop privileges,
8e30: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 20   if appropriate 
8e40: 2a 2f 0a 09 69 66 20 28 73 65 74 75 69 64 5f 65  */..if (setuid_e
8e50: 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73 65 74 75  nabled) {...setu
8e60: 69 64 5f 72 65 74 20 3d 20 73 65 74 75 69 64 28  id_ret = setuid(
8e70: 75 73 65 72 29 3b 0a 09 09 69 66 20 28 73 65 74  user);...if (set
8e80: 75 69 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  uid_ret != 0) {.
8e90: 09 09 09 70 65 72 72 6f 72 28 22 73 65 74 75 69  ...perror("setui
8ea0: 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
8eb0: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  1);...}..}.../* 
8ec0: 49 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 09 69  Initialize */..i
8ed0: 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  nit_ret = filed_
8ee0: 69 6e 69 74 28 63 61 63 68 65 5f 73 69 7a 65 29  init(cache_size)
8ef0: 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20  ;..if (init_ret 
8f00: 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72  != 0) {...perror
8f10: 28 22 66 69 6c 65 64 5f 69 6e 69 74 22 29 3b 0a  ("filed_init");.
8f20: 0a 09 09 72 65 74 75 72 6e 28 33 29 3b 0a 09 7d  ...return(3);..}
8f30: 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c 6f 67  .../* Create log
8f40: 67 69 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a 09  ging thread */..
8f50: 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64  init_ret = filed
8f60: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
8f70: 69 6e 69 74 28 6c 6f 67 5f 66 70 29 3b 0a 09 69  init(log_fp);..i
8f80: 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30  f (init_ret != 0
8f90: 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69  ) {...perror("fi
8fa0: 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65  led_logging_thre
8fb0: 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65  ad_init");....re
8fc0: 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(4);..}.../*
8fd0: 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20 74   Create worker t
8fe0: 68 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69 74 5f  hreads */..init_
8ff0: 72 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f 72 6b  ret = filed_work
9000: 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28  er_threads_init(
9010: 66 64 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  fd, thread_count
9020: 2c 20 26 74 68 72 65 61 64 5f 6f 70 74 69 6f 6e  , &thread_option
9030: 73 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65  s);..if (init_re
9040: 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72  t != 0) {...perr
9050: 6f 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b 65 72  or("filed_worker
9060: 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 22 29 3b  _threads_init");
9070: 0a 0a 09 09 72 65 74 75 72 6e 28 35 29 3b 0a 09  ....return(5);..
9080: 7d 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f 72 20  }.../* Wait for 
9090: 74 68 72 65 61 64 73 20 74 6f 20 65 78 69 74 20  threads to exit 
90a0: 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a  */../* XXX:TODO:
90b0: 20 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61 64 20   Monitor thread 
90c0: 75 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c 65 20  usage */..while 
90d0: 28 31 29 20 7b 0a 09 09 73 6c 65 65 70 28 36 30  (1) {...sleep(60
90e0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74 75 72  );..}.../* Retur
90f0: 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  n in failure */.
9100: 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a        .return(2);.}.