Hex Artifact Content

Artifact 521ac713bc5b3fec0bc9048f5f4ca593efb71979:


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 53 45 4e 44  efine FILED_SEND
01d0: 46 49 4c 45 5f 4d 41 58 20 31 36 37 37 37 32 31  FILE_MAX 1677721
01e0: 35 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 46 41  5.#define MAX_FA
01f0: 49 4c 55 52 45 5f 43 4f 55 4e 54 20 33 30 0a 23  ILURE_COUNT 30.#
0200: 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44 45 46  define FILED_DEF
0210: 41 55 4c 54 5f 54 59 50 45 20 22 61 70 70 6c 69  AULT_TYPE "appli
0220: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
0230: 65 61 6d 22 0a 0a 2f 2a 20 44 65 66 61 75 6c 74  eam"../* Default
0240: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
0250: 6e 65 20 50 4f 52 54 20 38 30 0a 23 64 65 66 69  ne PORT 80.#defi
0260: 6e 65 20 54 48 52 45 41 44 5f 43 4f 55 4e 54 20  ne THREAD_COUNT 
0270: 35 0a 23 64 65 66 69 6e 65 20 42 49 4e 44 5f 41  5.#define BIND_A
0280: 44 44 52 20 22 3a 3a 22 0a 23 64 65 66 69 6e 65  DDR "::".#define
0290: 20 43 41 43 48 45 5f 53 49 5a 45 20 38 32 30 39   CACHE_SIZE 8209
02a0: 0a 23 64 65 66 69 6e 65 20 4c 4f 47 5f 46 49 4c  .#define LOG_FIL
02b0: 45 20 22 2d 22 0a 0a 2f 2a 20 41 72 67 75 6d 65  E "-"../* Argume
02c0: 6e 74 73 20 66 6f 72 20 77 6f 72 6b 65 72 20 74  nts for worker t
02d0: 68 72 65 61 64 73 20 2a 2f 0a 73 74 72 75 63 74  hreads */.struct
02e0: 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68   filed_worker_th
02f0: 72 65 61 64 5f 61 72 67 73 20 7b 0a 09 69 6e 74  read_args {..int
0300: 20 66 64 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67 75   fd;.};../* Argu
0310: 6d 65 6e 74 73 20 66 6f 72 20 6c 6f 67 67 69 6e  ments for loggin
0320: 67 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72  g threads */.str
0330: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  uct filed_loggin
0340: 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 7b 0a  g_thread_args {.
0350: 09 46 49 4c 45 20 2a 66 70 3b 0a 7d 3b 0a 0a 2f  .FILE *fp;.};../
0360: 2a 20 46 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  * File informati
0370: 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  on */.struct fil
0380: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 7b 0a 09 70  ed_fileinfo {..p
0390: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
03a0: 75 74 65 78 3b 0a 09 63 68 61 72 20 2a 70 61 74  utex;..char *pat
03b0: 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 6f 66 66  h;..int fd;..off
03c0: 5f 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c  _t len;..char *l
03d0: 61 73 74 6d 6f 64 3b 0a 09 63 68 61 72 20 6c 61  astmod;..char la
03e0: 73 74 6d 6f 64 5f 62 5b 36 34 5d 3b 0a 09 63 6f  stmod_b[64];..co
03f0: 6e 73 74 20 63 68 61 72 20 2a 74 79 70 65 3b 0a  nst char *type;.
0400: 7d 3b 0a 0a 2f 2a 20 52 65 71 75 65 73 74 20 76  };../* Request v
0410: 61 72 69 61 62 6c 65 73 20 2a 2f 0a 73 74 72 75  ariables */.stru
0420: 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65  ct filed_http_re
0430: 71 75 65 73 74 20 7b 0a 09 2f 2a 2a 20 42 75 66  quest {../** Buf
0440: 66 65 72 73 20 2a 2a 2f 0a 09 73 74 72 75 63 74  fers **/..struct
0450: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20   filed_fileinfo 
0460: 66 69 6c 65 69 6e 66 6f 3b 0a 09 63 68 61 72 20  fileinfo;..char 
0470: 70 61 74 68 5f 62 5b 31 30 31 30 5d 3b 0a 09 63  path_b[1010];..c
0480: 68 61 72 20 74 6d 70 62 75 66 5b 31 30 31 30 5d  har tmpbuf[1010]
0490: 3b 0a 0a 09 2f 2a 2a 20 48 54 54 50 20 52 65 71  ;.../** HTTP Req
04a0: 75 65 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  uest information
04b0: 20 2a 2a 2f 0a 09 63 68 61 72 20 2a 70 61 74 68   **/..char *path
04c0: 3b 20 20 20 20 20 2f 2a 2a 2a 20 50 61 74 68 20  ;     /*** Path 
04d0: 62 65 69 6e 67 20 72 65 71 75 65 73 74 65 64 20  being requested 
04e0: 2a 2a 2a 2f 0a 0a 09 73 74 72 75 63 74 20 7b 0a  ***/...struct {.
04f0: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 69 6e  ..struct {....in
0500: 74 20 70 72 65 73 65 6e 74 3b 0a 09 09 09 6f 66  t present;....of
0510: 66 5f 74 20 6f 66 66 73 65 74 3b 20 20 20 2f 2a  f_t offset;   /*
0520: 2a 2a 20 52 61 6e 67 65 20 73 74 61 72 74 20 2a  ** Range start *
0530: 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20 6c 65 6e  **/....off_t len
0540: 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e 67  gth;   /*** Rang
0550: 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f 0a 09 09  e length ***/...
0560: 7d 20 72 61 6e 67 65 3b 0a 09 7d 20 68 65 61 64  } range;..} head
0570: 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c 6f 67 20  ers;.};../* Log 
0580: 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72 75 63 74  record */.struct
0590: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
05a0: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
05b0: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78  _log_entry *_nex
05c0: 74 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  t;..struct filed
05d0: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65  _log_entry *_pre
05e0: 76 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68  v;..pthread_t th
05f0: 72 65 61 64 3b 0a 09 63 68 61 72 20 62 75 66 66  read;..char buff
0600: 65 72 5b 31 30 31 30 5d 3b 0a 09 69 6e 74 20 6c  er[1010];..int l
0610: 65 76 65 6c 3b 0a 7d 3b 0a 0a 2f 2a 20 47 6c 6f  evel;.};../* Glo
0620: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  bal variables */
0630: 0a 2f 2a 2a 20 4f 70 65 6e 20 46 69 6c 65 20 63  ./** Open File c
0640: 61 63 68 65 20 2a 2a 2f 0a 73 74 72 75 63 74 20  ache **/.struct 
0650: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a  filed_fileinfo *
0660: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
0670: 64 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 75  dcache = NULL;.u
0680: 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65  nsigned int file
0690: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
06a0: 68 65 5f 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a  he_size = 0;../*
06b0: 2a 20 4c 6f 67 67 69 6e 67 20 2a 2a 2f 0a 73 74  * Logging **/.st
06c0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
06d0: 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f  ntry *filed_log_
06e0: 6d 73 67 5f 6c 69 73 74 3b 0a 70 74 68 72 65 61  msg_list;.pthrea
06f0: 64 5f 6d 75 74 65 78 5f 74 20 66 69 6c 65 64 5f  d_mutex_t filed_
0700: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74  log_msg_list_mut
0710: 65 78 3b 0a 70 74 68 72 65 61 64 5f 63 6f 6e 64  ex;.pthread_cond
0720: 5f 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  _t filed_log_msg
0730: 5f 6c 69 73 74 5f 72 65 61 64 79 3b 0a 0a 2f 2a  _list_ready;../*
0740: 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68   Initialize cach
0750: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
0760: 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65  filed_init_cache
0770: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  (unsigned int ca
0780: 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e 73  che_size) {..uns
0790: 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 09  igned int idx;..
07a0: 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
07b0: 65 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20 6d  et;.../* Cache m
07c0: 61 79 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e 69  ay not be re-ini
07d0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66 20  tialized */..if 
07e0: 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  (filed_fileinfo_
07f0: 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20  fdcache_size != 
0800: 30 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65 69  0 || filed_filei
0810: 6e 66 6f 5f 66 64 63 61 63 68 65 20 21 3d 20 4e  nfo_fdcache != N
0820: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
0830: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f  1);..}.../* Allo
0840: 63 61 74 65 20 63 61 63 68 65 20 2a 2f 0a 09 66  cate cache */..f
0850: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
0860: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 63 61 63  cache_size = cac
0870: 68 65 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64 5f  he_size;..filed_
0880: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
0890: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
08a0: 28 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  (*filed_fileinfo
08b0: 5f 66 64 63 61 63 68 65 29 20 2a 20 66 69 6c 65  _fdcache) * file
08c0: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
08d0: 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 66  he_size);..if (f
08e0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
08f0: 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  cache == NULL) {
0900: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
0910: 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .../* Initialize
0920: 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 20 2a   cache entries *
0930: 2f 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  /..for (idx = 0;
0940: 20 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c   idx < filed_fil
0950: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69  einfo_fdcache_si
0960: 7a 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d  ze; idx++) {...m
0970: 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20  utex_init_ret = 
0980: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
0990: 69 74 28 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e  it(&filed_filein
09a0: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
09b0: 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09  mutex, NULL);...
09c0: 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72  if (mutex_init_r
09d0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65  et != 0) {....re
09e0: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09  turn(1);...}....
09f0: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
0a00: 64 63 61 63 68 65 5b 69 64 78 5d 2e 70 61 74 68  dcache[idx].path
0a10: 20 3d 20 73 74 72 64 75 70 28 22 22 29 3b 0a 09   = strdup("");..
0a20: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
0a30: 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 66 64 20  fdcache[idx].fd 
0a40: 3d 20 2d 31 3b 0a 09 09 66 69 6c 65 64 5f 66 69  = -1;...filed_fi
0a50: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69  leinfo_fdcache[i
0a60: 64 78 5d 2e 6c 61 73 74 6d 6f 64 20 3d 20 22 22  dx].lastmod = ""
0a70: 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e  ;...filed_filein
0a80: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
0a90: 74 79 70 65 20 3d 20 22 22 3b 0a 09 7d 0a 0a 09  type = "";..}...
0aa0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
0ab0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 70 72 6f 63   Initialize proc
0ac0: 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
0ad0: 74 20 66 69 6c 65 64 5f 69 6e 69 74 28 75 6e 73  t filed_init(uns
0ae0: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 5f  igned int cache_
0af0: 73 69 7a 65 29 20 7b 0a 09 73 74 61 74 69 63 20  size) {..static 
0b00: 69 6e 74 20 63 61 6c 6c 65 64 20 3d 20 30 3b 0a  int called = 0;.
0b10: 09 69 6e 74 20 63 61 63 68 65 5f 72 65 74 3b 0a  .int cache_ret;.
0b20: 0a 09 69 66 20 28 63 61 6c 6c 65 64 29 20 7b 0a  ..if (called) {.
0b30: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
0b40: 0a 09 63 61 6c 6c 65 64 20 3d 20 31 3b 0a 0a 09  ..called = 1;...
0b50: 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f 43 55 52  mlockall(MCL_CUR
0b60: 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55 54 55 52  RENT | MCL_FUTUR
0b70: 45 29 3b 0a 0a 09 73 69 67 6e 61 6c 28 53 49 47  E);...signal(SIG
0b80: 50 49 50 45 2c 20 53 49 47 5f 49 47 4e 29 3b 0a  PIPE, SIG_IGN);.
0b90: 0a 09 63 61 63 68 65 5f 72 65 74 20 3d 20 66 69  ..cache_ret = fi
0ba0: 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65 28 63  led_init_cache(c
0bb0: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20  ache_size);..if 
0bc0: 28 63 61 63 68 65 5f 72 65 74 20 21 3d 20 30 29  (cache_ret != 0)
0bd0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 63 61 63 68   {...return(cach
0be0: 65 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 72 65 74  e_ret);..}...ret
0bf0: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 4c 69  urn(0);.}../* Li
0c00: 73 74 65 6e 20 6f 6e 20 61 20 70 61 72 74 69 63  sten on a partic
0c10: 75 6c 61 72 20 61 64 64 72 65 73 73 2f 70 6f 72  ular address/por
0c20: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
0c30: 66 69 6c 65 64 5f 6c 69 73 74 65 6e 28 63 6f 6e  filed_listen(con
0c40: 73 74 20 63 68 61 72 20 2a 61 64 64 72 65 73 73  st char *address
0c50: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70  , unsigned int p
0c60: 6f 72 74 29 20 7b 0a 09 73 74 72 75 63 74 20 73  ort) {..struct s
0c70: 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72  ockaddr_in6 addr
0c80: 5f 76 36 3b 0a 09 73 74 72 75 63 74 20 73 6f 63  _v6;..struct soc
0c90: 6b 61 64 64 72 5f 69 6e 20 61 64 64 72 5f 76 34  kaddr_in addr_v4
0ca0: 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ;..struct sockad
0cb0: 64 72 20 2a 61 64 64 72 3b 0a 09 73 6f 63 6b 6c  dr *addr;..sockl
0cc0: 65 6e 5f 74 20 61 64 64 72 5f 6c 65 6e 3b 0a 09  en_t addr_len;..
0cd0: 69 6e 74 20 70 74 6f 6e 5f 72 65 74 2c 20 62 69  int pton_ret, bi
0ce0: 6e 64 5f 72 65 74 2c 20 6c 69 73 74 65 6e 5f 72  nd_ret, listen_r
0cf0: 65 74 3b 0a 09 69 6e 74 20 66 61 6d 69 6c 79 3b  et;..int family;
0d00: 0a 09 69 6e 74 20 66 64 3b 0a 0a 0a 09 66 61 6d  ..int fd;....fam
0d10: 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a  ily = AF_INET6;.
0d20: 09 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74  .pton_ret = inet
0d30: 5f 70 74 6f 6e 28 66 61 6d 69 6c 79 2c 20 61 64  _pton(family, ad
0d40: 64 72 65 73 73 2c 20 26 61 64 64 72 5f 76 36 2e  dress, &addr_v6.
0d50: 73 69 6e 36 5f 61 64 64 72 2e 73 36 5f 61 64 64  sin6_addr.s6_add
0d60: 72 29 3b 0a 09 69 66 20 28 70 74 6f 6e 5f 72 65  r);..if (pton_re
0d70: 74 20 21 3d 20 31 29 20 7b 0a 09 09 66 61 6d 69  t != 1) {...fami
0d80: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 3b 0a 09 09  ly = AF_INET;...
0d90: 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f  pton_ret = inet_
0da0: 70 74 6f 6e 28 66 61 6d 69 6c 79 2c 20 61 64 64  pton(family, add
0db0: 72 65 73 73 2c 20 26 61 64 64 72 5f 76 34 2e 73  ress, &addr_v4.s
0dc0: 69 6e 5f 61 64 64 72 2e 73 5f 61 64 64 72 29 3b  in_addr.s_addr);
0dd0: 0a 09 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20  ...if (pton_ret 
0de0: 21 3d 20 31 29 20 7b 0a 09 09 09 72 65 74 75 72  != 1) {....retur
0df0: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 61 64  n(-1);...}....ad
0e00: 64 72 5f 76 34 2e 73 69 6e 5f 66 61 6d 69 6c 79  dr_v4.sin_family
0e10: 20 3d 20 66 61 6d 69 6c 79 3b 0a 09 09 61 64 64   = family;...add
0e20: 72 5f 76 34 2e 73 69 6e 5f 70 6f 72 74 20 3d 20  r_v4.sin_port = 
0e30: 68 74 6f 6e 73 28 70 6f 72 74 29 3b 0a 0a 09 09  htons(port);....
0e40: 61 64 64 72 20 3d 20 28 73 74 72 75 63 74 20 73  addr = (struct s
0e50: 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72  ockaddr *) &addr
0e60: 5f 76 34 3b 0a 09 09 61 64 64 72 5f 6c 65 6e 20  _v4;...addr_len 
0e70: 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 5f 76 34  = sizeof(addr_v4
0e80: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 61  );..} else {...a
0e90: 64 64 72 5f 76 36 2e 73 69 6e 36 5f 66 61 6d 69  ddr_v6.sin6_fami
0ea0: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09  ly = AF_INET6;..
0eb0: 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 66 6c  .addr_v6.sin6_fl
0ec0: 6f 77 69 6e 66 6f 20 3d 20 30 3b 0a 09 09 61 64  owinfo = 0;...ad
0ed0: 64 72 5f 76 36 2e 73 69 6e 36 5f 73 63 6f 70 65  dr_v6.sin6_scope
0ee0: 5f 69 64 20 3d 20 30 3b 0a 09 09 61 64 64 72 5f  _id = 0;...addr_
0ef0: 76 36 2e 73 69 6e 36 5f 70 6f 72 74 20 3d 20 68  v6.sin6_port = h
0f00: 74 6f 6e 73 28 70 6f 72 74 29 3b 0a 0a 09 09 61  tons(port);....a
0f10: 64 64 72 20 3d 20 28 73 74 72 75 63 74 20 73 6f  ddr = (struct so
0f20: 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72 5f  ckaddr *) &addr_
0f30: 76 36 3b 0a 09 09 61 64 64 72 5f 6c 65 6e 20 3d  v6;...addr_len =
0f40: 20 73 69 7a 65 6f 66 28 61 64 64 72 5f 76 36 29   sizeof(addr_v6)
0f50: 3b 0a 09 7d 0a 0a 09 66 64 20 3d 20 73 6f 63 6b  ;..}...fd = sock
0f60: 65 74 28 66 61 6d 69 6c 79 2c 20 53 4f 43 4b 5f  et(family, SOCK_
0f70: 53 54 52 45 41 4d 2c 20 30 29 3b 0a 09 69 66 20  STREAM, 0);..if 
0f80: 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  (fd < 0) {...ret
0f90: 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 62 69  urn(fd);..}...bi
0fa0: 6e 64 5f 72 65 74 20 3d 20 62 69 6e 64 28 66 64  nd_ret = bind(fd
0fb0: 2c 20 61 64 64 72 2c 20 61 64 64 72 5f 6c 65 6e  , addr, addr_len
0fc0: 29 3b 0a 09 69 66 20 28 62 69 6e 64 5f 72 65 74  );..if (bind_ret
0fd0: 20 3c 20 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28   < 0) {...close(
0fe0: 66 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  fd);....return(-
0ff0: 31 29 3b 0a 09 7d 0a 0a 09 6c 69 73 74 65 6e 5f  1);..}...listen_
1000: 72 65 74 20 3d 20 6c 69 73 74 65 6e 28 66 64 2c  ret = listen(fd,
1010: 20 31 32 38 29 3b 0a 09 69 66 20 28 6c 69 73 74   128);..if (list
1020: 65 6e 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  en_ret != 0) {..
1030: 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72  .close(fd);....r
1040: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
1050: 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 2f  return(fd);.}../
1060: 2a 20 4c 6f 67 20 61 20 6d 65 73 73 61 67 65 20  * Log a message 
1070: 2a 2f 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f  */.#ifdef FILED_
1080: 44 4f 4e 54 5f 4c 4f 47 0a 23 20 20 64 65 66 69  DONT_LOG.#  defi
1090: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  ne filed_logging
10a0: 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 78 29 20  _thread_init(x) 
10b0: 30 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  0.#  define file
10c0: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
10d0: 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  x, ...) /**/.#  
10e0: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
10f0: 5f 6d 73 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a  _msg(x, ...) /**
1100: 2f 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 46  /.#else.#ifdef F
1110: 49 4c 45 44 5f 44 45 42 55 47 0a 23 20 20 64 65  ILED_DEBUG.#  de
1120: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  fine filed_log_m
1130: 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29  sg_debug(x, ...)
1140: 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72   { fprintf(stder
1150: 72 2c 20 78 2c 20 5f 5f 56 41 5f 41 52 47 53 5f  r, x, __VA_ARGS_
1160: 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65  _); fprintf(stde
1170: 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75 73  rr, "\n"); fflus
1180: 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 65 6c  h(stderr); }.#el
1190: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c  se.#  define fil
11a0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
11b0: 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 65  (x, ...) /**/.#e
11c0: 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ndif../* Initial
11d0: 69 7a 65 20 6c 6f 67 67 69 6e 67 20 74 68 72 65  ize logging thre
11e0: 61 64 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ad */.static voi
11f0: 64 20 2a 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  d *filed_logging
1200: 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a 61 72  _thread(void *ar
1210: 67 5f 70 29 20 7b 0a 09 73 74 72 75 63 74 20 66  g_p) {..struct f
1220: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
1230: 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09  ead_args *arg;..
1240: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
1250: 5f 65 6e 74 72 79 20 2a 63 75 72 72 2c 20 2a 70  _entry *curr, *p
1260: 72 65 76 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a  rev;..FILE *fp;.
1270: 0a 09 61 72 67 20 3d 20 61 72 67 5f 70 3b 0a 0a  ..arg = arg_p;..
1280: 09 66 70 20 3d 20 61 72 67 2d 3e 66 70 3b 0a 0a  .fp = arg->fp;..
1290: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 70  .while (1) {...p
12a0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
12b0: 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  k(&filed_log_msg
12c0: 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 09 09  _list_mutex);...
12d0: 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69  pthread_cond_wai
12e0: 74 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  t(&filed_log_msg
12f0: 5f 6c 69 73 74 5f 72 65 61 64 79 2c 20 26 66 69  _list_ready, &fi
1300: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
1310: 5f 6d 75 74 65 78 29 3b 0a 0a 09 09 63 75 72 72  _mutex);....curr
1320: 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67   = filed_log_msg
1330: 5f 6c 69 73 74 3b 0a 09 09 66 69 6c 65 64 5f 6c  _list;...filed_l
1340: 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 4e 55  og_msg_list = NU
1350: 4c 4c 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 6d  LL;....pthread_m
1360: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c  utex_unlock(&fil
1370: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
1380: 6d 75 74 65 78 29 3b 0a 0a 09 09 70 72 65 76 20  mutex);....prev 
1390: 3d 20 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20 28 3b  = NULL;...for (;
13a0: 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 63 75   curr; curr = cu
13b0: 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
13c0: 63 75 72 72 2d 3e 5f 70 72 65 76 20 3d 20 70 72  curr->_prev = pr
13d0: 65 76 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63  ev;.....prev = c
13e0: 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72  urr;...}....curr
13f0: 20 3d 20 70 72 65 76 3b 0a 09 09 77 68 69 6c 65   = prev;...while
1400: 20 28 63 75 72 72 29 20 7b 0a 09 09 09 66 70 72   (curr) {....fpr
1410: 69 6e 74 66 28 66 70 2c 20 22 25 73 20 54 48 52  intf(fp, "%s THR
1420: 45 41 44 3d 25 6c 6c 75 5c 6e 22 2c 20 63 75 72  EAD=%llu\n", cur
1430: 72 2d 3e 62 75 66 66 65 72 2c 20 28 75 6e 73 69  r->buffer, (unsi
1440: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
1450: 63 75 72 72 2d 3e 74 68 72 65 61 64 29 3b 0a 09  curr->thread);..
1460: 09 09 66 66 6c 75 73 68 28 66 70 29 3b 0a 0a 09  ..fflush(fp);...
1470: 09 09 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 09  ..prev = curr;..
1480: 09 09 63 75 72 72 20 3d 20 63 75 72 72 2d 3e 5f  ..curr = curr->_
1490: 70 72 65 76 3b 0a 0a 09 09 09 66 72 65 65 28 70  prev;.....free(p
14a0: 72 65 76 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72  rev);...}..}...r
14b0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a  eturn(NULL);.}..
14c0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
14d0: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
14e0: 69 6e 69 74 28 46 49 4c 45 20 2a 6c 6f 67 66 70  init(FILE *logfp
14f0: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
1500: 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64  d_logging_thread
1510: 5f 61 72 67 73 20 2a 61 72 67 73 3b 0a 09 70 74  _args *args;..pt
1520: 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f 69  hread_t thread_i
1530: 64 3b 0a 0a 09 61 72 67 73 20 3d 20 6d 61 6c 6c  d;...args = mall
1540: 6f 63 28 73 69 7a 65 6f 66 28 2a 61 72 67 73 29  oc(sizeof(*args)
1550: 29 3b 0a 09 61 72 67 73 2d 3e 66 70 20 3d 20 6c  );..args->fp = l
1560: 6f 67 66 70 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f  ogfp;...filed_lo
1570: 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 4e 55 4c  g_msg_list = NUL
1580: 4c 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  L;...pthread_mut
1590: 65 78 5f 69 6e 69 74 28 26 66 69 6c 65 64 5f 6c  ex_init(&filed_l
15a0: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65  og_msg_list_mute
15b0: 78 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 70 74 68 72  x, NULL);...pthr
15c0: 65 61 64 5f 63 72 65 61 74 65 28 26 74 68 72 65  ead_create(&thre
15d0: 61 64 5f 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c  ad_id, NULL, fil
15e0: 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61  ed_logging_threa
15f0: 64 2c 20 61 72 67 73 29 3b 0a 0a 09 72 65 74 75  d, args);...retu
1600: 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(0);.}..static
1610: 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c 6f 67 5f   void filed_log_
1620: 6d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  msg(const char *
1630: 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09 73 74 72  fmt, ...) {..str
1640: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
1650: 74 72 79 20 2a 65 6e 74 72 79 3b 0a 09 76 61 5f  try *entry;..va_
1660: 6c 69 73 74 20 61 72 67 73 3b 0a 0a 09 65 6e 74  list args;...ent
1670: 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ry = malloc(size
1680: 6f 66 28 2a 65 6e 74 72 79 29 29 3b 0a 0a 09 76  of(*entry));...v
1690: 61 5f 73 74 61 72 74 28 61 72 67 73 2c 20 66 6d  a_start(args, fm
16a0: 74 29 3b 0a 0a 09 76 73 6e 70 72 69 6e 74 66 28  t);...vsnprintf(
16b0: 65 6e 74 72 79 2d 3e 62 75 66 66 65 72 2c 20 73  entry->buffer, s
16c0: 69 7a 65 6f 66 28 65 6e 74 72 79 2d 3e 62 75 66  izeof(entry->buf
16d0: 66 65 72 29 2c 20 66 6d 74 2c 20 61 72 67 73 29  fer), fmt, args)
16e0: 3b 0a 0a 09 76 61 5f 65 6e 64 28 61 72 67 73 29  ;...va_end(args)
16f0: 3b 0a 0a 09 65 6e 74 72 79 2d 3e 74 68 72 65 61  ;...entry->threa
1700: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
1710: 28 29 3b 0a 09 65 6e 74 72 79 2d 3e 6c 65 76 65  ();..entry->leve
1720: 6c 20 3d 20 30 3b 0a 0a 09 70 74 68 72 65 61 64  l = 0;...pthread
1730: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c  _mutex_lock(&fil
1740: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
1750: 6d 75 74 65 78 29 3b 0a 0a 09 65 6e 74 72 79 2d  mutex);...entry-
1760: 3e 5f 6e 65 78 74 20 3d 20 66 69 6c 65 64 5f 6c  >_next = filed_l
1770: 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 66 69  og_msg_list;..fi
1780: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
1790: 20 3d 20 65 6e 74 72 79 3b 0a 0a 09 70 74 68 72   = entry;...pthr
17a0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
17b0: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
17c0: 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 70  list_mutex);...p
17d0: 74 68 72 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e  thread_cond_sign
17e0: 61 6c 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  al(&filed_log_ms
17f0: 67 5f 6c 69 73 74 5f 72 65 61 64 79 29 3b 0a 0a  g_list_ready);..
1800: 09 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69  .return;.}.#endi
1810: 66 0a 0a 2f 2a 20 46 6f 72 6d 61 74 20 74 69 6d  f../* Format tim
1820: 65 20 70 65 72 20 52 46 43 32 36 31 36 20 2a 2f  e per RFC2616 */
1830: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 69  .static char *fi
1840: 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28  led_format_time(
1850: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
1860: 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c  ze_t buffer_len,
1870: 20 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 74 69   const time_t ti
1880: 6d 65 69 6e 66 6f 29 20 7b 0a 09 73 74 72 75 63  meinfo) {..struc
1890: 74 20 74 6d 20 74 69 6d 65 69 6e 66 6f 5f 74 6d  t tm timeinfo_tm
18a0: 2c 20 2a 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70  , *timeinfo_tm_p
18b0: 3b 0a 0a 09 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f  ;...timeinfo_tm_
18c0: 70 20 3d 20 67 6d 74 69 6d 65 5f 72 28 26 74 69  p = gmtime_r(&ti
18d0: 6d 65 69 6e 66 6f 2c 20 26 74 69 6d 65 69 6e 66  meinfo, &timeinf
18e0: 6f 5f 74 6d 29 3b 0a 09 69 66 20 28 74 69 6d 65  o_tm);..if (time
18f0: 69 6e 66 6f 5f 74 6d 5f 70 20 3d 3d 20 4e 55 4c  info_tm_p == NUL
1900: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 22 75  L) {...return("u
1910: 6e 6b 6e 6f 77 6e 22 29 3b 0a 09 7d 0a 0a 09 62  nknown");..}...b
1920: 75 66 66 65 72 5b 62 75 66 66 65 72 5f 6c 65 6e  uffer[buffer_len
1930: 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 62   - 1] = '\0';..b
1940: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 74 72 66  uffer_len = strf
1950: 74 69 6d 65 28 62 75 66 66 65 72 2c 20 62 75 66  time(buffer, buf
1960: 66 65 72 5f 6c 65 6e 20 2d 20 31 2c 20 22 25 61  fer_len - 1, "%a
1970: 2c 20 25 64 20 25 62 20 25 59 20 25 48 3a 25 4d  , %d %b %Y %H:%M
1980: 3a 25 53 20 47 4d 54 22 2c 20 74 69 6d 65 69 6e  :%S GMT", timein
1990: 66 6f 5f 74 6d 5f 70 29 3b 0a 0a 09 72 65 74 75  fo_tm_p);...retu
19a0: 72 6e 28 62 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f  rn(buffer);.}../
19b0: 2a 20 68 61 73 68 20 2a 2f 0a 73 74 61 74 69 63  * hash */.static
19c0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69   unsigned int fi
19d0: 6c 65 64 5f 68 61 73 68 28 63 6f 6e 73 74 20 75  led_hash(const u
19e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 76 61  nsigned char *va
19f0: 6c 75 65 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  lue, unsigned in
1a00: 74 20 6d 6f 64 75 6c 75 73 29 20 7b 0a 09 75 6e  t modulus) {..un
1a10: 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72  signed char curr
1a20: 2c 20 70 72 65 76 3b 0a 09 69 6e 74 20 64 69 66  , prev;..int dif
1a30: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  f;..unsigned int
1a40: 20 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61   retval;...retva
1a50: 6c 20 3d 20 6d 6f 64 75 6c 75 73 20 2d 20 31 3b  l = modulus - 1;
1a60: 0a 09 70 72 65 76 20 3d 20 6d 6f 64 75 6c 75 73  ..prev = modulus
1a70: 20 25 20 32 35 35 3b 0a 0a 09 77 68 69 6c 65 20   % 255;...while 
1a80: 28 28 63 75 72 72 20 3d 20 2a 76 61 6c 75 65 29  ((curr = *value)
1a90: 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 20 3c  ) {...if (curr <
1aa0: 20 33 32 29 20 7b 0a 09 09 09 63 75 72 72 20 3d   32) {....curr =
1ab0: 20 32 35 35 20 2d 20 63 75 72 72 3b 0a 09 09 7d   255 - curr;...}
1ac0: 20 65 6c 73 65 20 7b 0a 09 09 09 63 75 72 72 20   else {....curr 
1ad0: 2d 3d 20 33 32 3b 0a 09 09 7d 0a 0a 09 09 69 66  -= 32;...}....if
1ae0: 20 28 70 72 65 76 20 3c 20 63 75 72 72 29 20 7b   (prev < curr) {
1af0: 0a 09 09 09 64 69 66 66 20 3d 20 63 75 72 72 20  ....diff = curr 
1b00: 2d 20 70 72 65 76 3b 0a 09 09 7d 20 65 6c 73 65  - prev;...} else
1b10: 20 7b 0a 09 09 09 64 69 66 66 20 3d 20 70 72 65   {....diff = pre
1b20: 76 20 2d 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09  v - curr;...}...
1b30: 09 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 0a 09  .prev = curr;...
1b40: 09 72 65 74 76 61 6c 20 3c 3c 3d 20 33 3b 0a 09  .retval <<= 3;..
1b50: 09 72 65 74 76 61 6c 20 26 3d 20 30 78 46 46 46  .retval &= 0xFFF
1b60: 46 46 46 46 46 4c 55 3b 0a 09 09 72 65 74 76 61  FFFFFLU;...retva
1b70: 6c 20 5e 3d 20 64 69 66 66 3b 0a 0a 09 09 76 61  l ^= diff;....va
1b80: 6c 75 65 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 76  lue++;..}...retv
1b90: 61 6c 20 3d 20 72 65 74 76 61 6c 20 25 20 6d 6f  al = retval % mo
1ba0: 64 75 6c 75 73 3b 0a 0a 09 72 65 74 75 72 6e 28  dulus;...return(
1bb0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46  retval);.}../* F
1bc0: 69 6e 64 20 61 20 6d 69 6d 65 2d 74 79 70 65 20  ind a mime-type 
1bd0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c  based on the fil
1be0: 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20  ename */.static 
1bf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
1c00: 64 5f 64 65 74 65 72 6d 69 6e 65 5f 6d 69 6d 65  d_determine_mime
1c10: 74 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  type(const char 
1c20: 2a 70 61 74 68 29 20 7b 0a 09 63 6f 6e 73 74 20  *path) {..const 
1c30: 63 68 61 72 20 2a 70 3b 0a 0a 09 70 20 3d 20 73  char *p;...p = s
1c40: 74 72 72 63 68 72 28 70 61 74 68 2c 20 27 2e 27  trrchr(path, '.'
1c50: 29 3b 0a 09 69 66 20 28 70 20 3d 3d 20 4e 55 4c  );..if (p == NUL
1c60: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 46 49  L) {...return(FI
1c70: 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45  LED_DEFAULT_TYPE
1c80: 29 3b 0a 09 7d 0a 0a 09 70 2b 2b 3b 0a 09 69 66  );..}...p++;..if
1c90: 20 28 2a 70 20 3d 3d 20 27 5c 30 27 29 20 7b 0a   (*p == '\0') {.
1ca0: 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44  ..return(FILED_D
1cb0: 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d  EFAULT_TYPE);..}
1cc0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
1cd0: 5f 64 65 62 75 67 28 22 4c 6f 6f 6b 69 6e 67 20  _debug("Looking 
1ce0: 75 70 20 4d 49 4d 45 20 74 79 70 65 20 66 6f 72  up MIME type for
1cf0: 20 25 73 20 28 68 61 73 68 20 3d 20 25 6c 6c 75   %s (hash = %llu
1d00: 29 22 2c 20 70 2c 20 28 75 6e 73 69 67 6e 65 64  )", p, (unsigned
1d10: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65   long long) file
1d20: 64 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75 6e  d_hash((const un
1d30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70  signed char *) p
1d40: 2c 20 31 36 37 37 37 32 35 39 29 29 3b 0a 0a 23  , 16777259));..#
1d50: 69 6e 63 6c 75 64 65 20 22 66 69 6c 65 64 2d 6d  include "filed-m
1d60: 69 6d 65 2d 74 79 70 65 73 2e 68 22 0a 0a 09 72  ime-types.h"...r
1d70: 65 74 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41  eturn(FILED_DEFA
1d80: 55 4c 54 5f 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  ULT_TYPE);.}../*
1d90: 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 61 6e 64   Open a file and
1da0: 20 72 65 74 75 72 6e 20 66 69 6c 65 20 69 6e 66   return file inf
1db0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  ormation */.stat
1dc0: 69 63 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ic struct filed_
1dd0: 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f  fileinfo *filed_
1de0: 6f 70 65 6e 5f 66 69 6c 65 28 63 6f 6e 73 74 20  open_file(const 
1df0: 63 68 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75  char *path, stru
1e00: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
1e10: 6f 20 2a 62 75 66 66 65 72 29 20 7b 0a 09 73 74  o *buffer) {..st
1e20: 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69  ruct filed_filei
1e30: 6e 66 6f 20 2a 63 61 63 68 65 3b 0a 09 63 6f 6e  nfo *cache;..con
1e40: 73 74 20 63 68 61 72 20 2a 6f 70 65 6e 5f 70 61  st char *open_pa
1e50: 74 68 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  th;..unsigned in
1e60: 74 20 63 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66  t cache_idx;..of
1e70: 66 5f 74 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64  f_t len;..int fd
1e80: 3b 0a 0a 09 63 61 63 68 65 5f 69 64 78 20 3d 20  ;...cache_idx = 
1e90: 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f 6e 73  filed_hash((cons
1ea0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1eb0: 2a 29 20 70 61 74 68 2c 20 66 69 6c 65 64 5f 66  *) path, filed_f
1ec0: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f  ileinfo_fdcache_
1ed0: 73 69 7a 65 29 3b 0a 0a 09 63 61 63 68 65 20 3d  size);...cache =
1ee0: 20 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f   &filed_fileinfo
1ef0: 5f 66 64 63 61 63 68 65 5b 63 61 63 68 65 5f 69  _fdcache[cache_i
1f00: 64 78 5d 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  dx];...filed_log
1f10: 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f 63 6b  _msg_debug("Lock
1f20: 69 6e 67 20 6d 75 74 65 78 20 66 6f 72 20 69 64  ing mutex for id
1f30: 78 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  x: %lu", (unsign
1f40: 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69  ed long) cache_i
1f50: 64 78 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d  dx);...pthread_m
1f60: 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65  utex_lock(&cache
1f70: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 66 69 6c 65  ->mutex);...file
1f80: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
1f90: 22 43 6f 6d 70 6c 65 74 65 64 20 6c 6f 63 6b 69  "Completed locki
1fa0: 6e 67 20 6d 75 74 65 78 20 66 6f 72 20 69 64 78  ng mutex for idx
1fb0: 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  : %lu", (unsigne
1fc0: 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64  d long) cache_id
1fd0: 78 29 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d 70  x);...if (strcmp
1fe0: 28 70 61 74 68 2c 20 63 61 63 68 65 2d 3e 70 61  (path, cache->pa
1ff0: 74 68 29 20 21 3d 20 30 29 20 7b 0a 09 09 66 69  th) != 0) {...fi
2000: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
2010: 67 28 22 43 61 63 68 65 20 6d 69 73 73 20 66 6f  g("Cache miss fo
2020: 72 20 69 64 78 3a 20 25 6c 75 3a 20 4f 4c 44 20  r idx: %lu: OLD 
2030: 5c 22 25 73 5c 22 2c 20 4e 45 57 20 5c 22 25 73  \"%s\", NEW \"%s
2040: 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \"", (unsigned l
2050: 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 2c 20  ong) cache_idx, 
2060: 63 61 63 68 65 2d 3e 70 61 74 68 2c 20 70 61 74  cache->path, pat
2070: 68 29 3b 0a 0a 09 09 2f 2a 20 46 6f 72 20 72 65  h);..../* For re
2080: 71 75 65 73 74 73 20 66 6f 72 20 74 68 65 20 72  quests for the r
2090: 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73  oot directory, s
20a0: 65 72 76 65 20 6f 75 74 20 69 6e 64 65 78 2e 68  erve out index.h
20b0: 74 6d 6c 20 2a 2f 0a 09 09 69 66 20 28 70 61 74  tml */...if (pat
20c0: 68 5b 30 5d 20 3d 3d 20 27 5c 30 27 20 7c 7c 20  h[0] == '\0' || 
20d0: 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 20  (path[0] == '/' 
20e0: 26 26 20 70 61 74 68 5b 31 5d 20 3d 3d 20 27 5c  && path[1] == '\
20f0: 30 27 29 29 20 7b 0a 09 09 09 6f 70 65 6e 5f 70  0')) {....open_p
2100: 61 74 68 20 3d 20 22 2f 69 6e 64 65 78 2e 68 74  ath = "/index.ht
2110: 6d 6c 22 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ml";...} else {.
2120: 09 09 09 6f 70 65 6e 5f 70 61 74 68 20 3d 20 70  ...open_path = p
2130: 61 74 68 3b 0a 09 09 7d 0a 0a 09 09 66 64 20 3d  ath;...}....fd =
2140: 20 6f 70 65 6e 28 6f 70 65 6e 5f 70 61 74 68 2c   open(open_path,
2150: 20 4f 5f 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41   O_RDONLY | O_LA
2160: 52 47 45 46 49 4c 45 29 3b 0a 09 09 69 66 20 28  RGEFILE);...if (
2170: 66 64 20 3c 20 30 29 20 7b 0a 09 09 09 70 74 68  fd < 0) {....pth
2180: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
2190: 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29  k(&cache->mutex)
21a0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c  ;.....return(NUL
21b0: 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  L);...}....free(
21c0: 63 61 63 68 65 2d 3e 70 61 74 68 29 3b 0a 09 09  cache->path);...
21d0: 69 66 20 28 63 61 63 68 65 2d 3e 66 64 20 3e 3d  if (cache->fd >=
21e0: 20 30 29 20 7b 0a 09 09 09 63 6c 6f 73 65 28 63   0) {....close(c
21f0: 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09 7d 0a 0a  ache->fd);...}..
2200: 09 09 6c 65 6e 20 3d 20 6c 73 65 65 6b 28 66 64  ..len = lseek(fd
2210: 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  , 0, SEEK_END);.
2220: 09 09 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53  ..lseek(fd, 0, S
2230: 45 45 4b 5f 53 45 54 29 3b 0a 0a 09 09 63 61 63  EEK_SET);....cac
2240: 68 65 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09 63  he->fd = fd;...c
2250: 61 63 68 65 2d 3e 6c 65 6e 20 3d 20 6c 65 6e 3b  ache->len = len;
2260: 0a 09 09 63 61 63 68 65 2d 3e 70 61 74 68 20 3d  ...cache->path =
2270: 20 73 74 72 64 75 70 28 70 61 74 68 29 3b 0a 09   strdup(path);..
2280: 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d 20 66  .cache->type = f
2290: 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65 5f 6d  iled_determine_m
22a0: 69 6d 65 74 79 70 65 28 6f 70 65 6e 5f 70 61 74  imetype(open_pat
22b0: 68 29 3b 0a 0a 09 09 2f 2a 20 58 58 58 3a 54 4f  h);..../* XXX:TO
22c0: 44 4f 3a 20 44 65 74 65 72 6d 69 6e 65 20 2a 2f  DO: Determine */
22d0: 0a 09 09 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  ...cache->lastmo
22e0: 64 20 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74  d = filed_format
22f0: 5f 74 69 6d 65 28 63 61 63 68 65 2d 3e 6c 61 73  _time(cache->las
2300: 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 63  tmod_b, sizeof(c
2310: 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29  ache->lastmod_b)
2320: 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 33  , time(NULL) - 3
2330: 30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0);..} else {...
2340: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
2350: 62 75 67 28 22 43 61 63 68 65 20 68 69 74 20 66  bug("Cache hit f
2360: 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20 50 41 54  or idx: %lu: PAT
2370: 48 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73 69  H \"%s\"", (unsi
2380: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65  gned long) cache
2390: 5f 69 64 78 2c 20 70 61 74 68 29 3b 0a 09 7d 0a  _idx, path);..}.
23a0: 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76 65  ../*.. * We have
23b0: 20 74 6f 20 6d 61 6b 65 20 61 20 64 75 70 6c 69   to make a dupli
23c0: 63 61 74 65 20 46 44 2c 20 62 65 63 61 75 73 65  cate FD, because
23d0: 20 6f 6e 63 65 20 77 65 20 72 65 6c 65 61 73 65   once we release
23e0: 20 74 68 65 20 63 61 63 68 65 0a 09 20 2a 20 6d   the cache.. * m
23f0: 75 74 65 78 2c 20 74 68 65 20 66 69 6c 65 20 64  utex, the file d
2400: 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 62 65  escriptor may be
2410: 20 63 6c 6f 73 65 64 0a 09 20 2a 2f 0a 09 66 64   closed.. */..fd
2420: 20 3d 20 64 75 70 28 63 61 63 68 65 2d 3e 66 64   = dup(cache->fd
2430: 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20  );..if (fd < 0) 
2440: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
2450: 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d  x_unlock(&cache-
2460: 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 72 65 74 75  >mutex);....retu
2470: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62  rn(NULL);..}...b
2480: 75 66 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  uffer->fd = fd;.
2490: 09 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63  .buffer->len = c
24a0: 61 63 68 65 2d 3e 6c 65 6e 3b 0a 09 62 75 66 66  ache->len;..buff
24b0: 65 72 2d 3e 74 79 70 65 20 3d 20 63 61 63 68 65  er->type = cache
24c0: 2d 3e 74 79 70 65 3b 0a 09 6d 65 6d 63 70 79 28  ->type;..memcpy(
24d0: 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f  buffer->lastmod_
24e0: 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f  b, cache->lastmo
24f0: 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62 75 66 66  d_b, sizeof(buff
2500: 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29 3b  er->lastmod_b));
2510: 0a 09 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f  ..buffer->lastmo
2520: 64 20 3d 20 62 75 66 66 65 72 2d 3e 6c 61 73 74  d = buffer->last
2530: 6d 6f 64 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e  mod_b + (cache->
2540: 6c 61 73 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d  lastmod - cache-
2550: 3e 6c 61 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 70  >lastmod_b);...p
2560: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
2570: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
2580: 78 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66  x);...return(buf
2590: 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f 63  fer);.}../* Proc
25a0: 65 73 73 20 61 6e 20 48 54 54 50 20 72 65 71 75  ess an HTTP requ
25b0: 65 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  est and return t
25c0: 68 65 20 70 61 74 68 20 72 65 71 75 65 73 74 65  he path requeste
25d0: 64 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  d */.static stru
25e0: 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65  ct filed_http_re
25f0: 71 75 65 73 74 20 2a 66 69 6c 65 64 5f 67 65 74  quest *filed_get
2600: 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28 46 49  _http_request(FI
2610: 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 66  LE *fp, struct f
2620: 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73  iled_http_reques
2630: 74 20 2a 62 75 66 66 65 72 5f 73 74 29 20 7b 0a  t *buffer_st) {.
2640: 09 63 68 61 72 20 2a 6d 65 74 68 6f 64 2c 20 2a  .char *method, *
2650: 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 62 75 66  path;..char *buf
2660: 66 65 72 2c 20 2a 74 6d 70 62 75 66 66 65 72 2c  fer, *tmpbuffer,
2670: 20 2a 77 6f 72 6b 62 75 66 66 65 72 2c 20 2a 77   *workbuffer, *w
2680: 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a  orkbuffer_next;.
2690: 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c  .size_t buffer_l
26a0: 65 6e 2c 20 74 6d 70 62 75 66 66 65 72 5f 6c 65  en, tmpbuffer_le
26b0: 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65 5f  n;..off_t range_
26c0: 73 74 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e 64  start, range_end
26d0: 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  , range_length;.
26e0: 09 69 6e 74 20 72 61 6e 67 65 5f 72 65 71 75 65  .int range_reque
26f0: 73 74 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 69 6e  st;..int fd;..in
2700: 74 20 69 3b 0a 0a 09 66 64 20 3d 20 66 69 6c 65  t i;...fd = file
2710: 6e 6f 28 66 70 29 3b 0a 0a 09 72 61 6e 67 65 5f  no(fp);...range_
2720: 73 74 61 72 74 20 3d 20 30 3b 0a 09 72 61 6e 67  start = 0;..rang
2730: 65 5f 65 6e 64 20 20 20 3d 20 30 3b 0a 09 72 61  e_end   = 0;..ra
2740: 6e 67 65 5f 72 65 71 75 65 73 74 20 3d 20 30 3b  nge_request = 0;
2750: 0a 09 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d  ..range_length =
2760: 20 2d 31 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20   -1;...buffer = 
2770: 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 5f  buffer_st->path_
2780: 62 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d  b;..buffer_len =
2790: 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 5f 73   sizeof(buffer_s
27a0: 74 2d 3e 70 61 74 68 5f 62 29 3b 0a 0a 09 74 6d  t->path_b);...tm
27b0: 70 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  pbuffer = buffer
27c0: 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 74 6d  _st->tmpbuf;..tm
27d0: 70 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69  pbuffer_len = si
27e0: 7a 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e  zeof(buffer_st->
27f0: 74 6d 70 62 75 66 29 3b 0a 0a 09 66 69 6c 65 64  tmpbuf);...filed
2800: 5f 6c 6f 67 5f 6d 73 67 28 22 57 41 49 54 5f 46  _log_msg("WAIT_F
2810: 4f 52 5f 52 45 51 55 45 53 54 20 46 44 3d 25 69  OR_REQUEST FD=%i
2820: 22 2c 20 66 64 29 3b 0a 0a 09 66 67 65 74 73 28  ", fd);...fgets(
2830: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c  buffer, buffer_l
2840: 65 6e 2c 20 66 70 29 3b 0a 0a 09 6d 65 74 68 6f  en, fp);...metho
2850: 64 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75  d = buffer;...bu
2860: 66 66 65 72 20 3d 20 73 74 72 63 68 72 28 62 75  ffer = strchr(bu
2870: 66 66 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20  ffer, ' ');..if 
2880: 28 62 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29  (buffer == NULL)
2890: 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d   {...filed_log_m
28a0: 73 67 28 22 47 4f 54 5f 52 45 51 55 45 53 54 20  sg("GOT_REQUEST 
28b0: 46 44 3d 25 69 20 45 52 52 4f 52 3d 66 6f 72 6d  FD=%i ERROR=form
28c0: 61 74 22 2c 20 66 64 29 3b 0a 0a 09 09 72 65 74  at", fd);....ret
28d0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
28e0: 2a 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a  *buffer = '\0';.
28f0: 09 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 70 61 74  .buffer++;...pat
2900: 68 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75  h = buffer;...bu
2910: 66 66 65 72 20 3d 20 73 74 72 63 68 72 28 62 75  ffer = strchr(bu
2920: 66 66 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20  ffer, ' ');..if 
2930: 28 62 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29  (buffer != NULL)
2940: 20 7b 0a 09 09 2a 62 75 66 66 65 72 20 3d 20 27   {...*buffer = '
2950: 5c 30 27 3b 0a 09 09 62 75 66 66 65 72 2b 2b 3b  \0';...buffer++;
2960: 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  ..}...filed_log_
2970: 6d 73 67 28 22 47 4f 54 5f 52 45 51 55 45 53 54  msg("GOT_REQUEST
2980: 20 46 44 3d 25 69 20 50 41 54 48 3d 25 73 22 2c   FD=%i PATH=%s",
2990: 20 66 64 2c 20 70 61 74 68 29 3b 0a 0a 09 66 69   fd, path);...fi
29a0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 57 41 49  led_log_msg("WAI
29b0: 54 5f 46 4f 52 5f 48 45 41 44 45 52 53 20 46 44  T_FOR_HEADERS FD
29c0: 3d 25 69 22 2c 20 66 64 29 3b 0a 0a 09 66 6f 72  =%i", fd);...for
29d0: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 30 30   (i = 0; i < 100
29e0: 3b 20 69 2b 2b 29 20 7b 0a 09 09 66 67 65 74 73  ; i++) {...fgets
29f0: 28 74 6d 70 62 75 66 66 65 72 2c 20 74 6d 70 62  (tmpbuffer, tmpb
2a00: 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a  uffer_len, fp);.
2a10: 0a 09 09 69 66 20 28 73 74 72 6e 63 61 73 65 63  ...if (strncasec
2a20: 6d 70 28 74 6d 70 62 75 66 66 65 72 2c 20 22 52  mp(tmpbuffer, "R
2a30: 61 6e 67 65 3a 20 22 2c 20 37 29 20 3d 3d 20 30  ange: ", 7) == 0
2a40: 29 20 7b 0a 09 09 09 77 6f 72 6b 62 75 66 66 65  ) {....workbuffe
2a50: 72 20 3d 20 74 6d 70 62 75 66 66 65 72 20 2b 20  r = tmpbuffer + 
2a60: 37 3b 0a 0a 09 09 09 69 66 20 28 73 74 72 6e 63  7;.....if (strnc
2a70: 61 73 65 63 6d 70 28 77 6f 72 6b 62 75 66 66 65  asecmp(workbuffe
2a80: 72 2c 20 22 62 79 74 65 73 3d 22 2c 20 36 29 20  r, "bytes=", 6) 
2a90: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b  == 0) {.....work
2aa0: 62 75 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09  buffer += 6;....
2ab0: 09 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20  ..range_request 
2ac0: 3d 20 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f  = 1;......range_
2ad0: 73 74 61 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c  start = strtoull
2ae0: 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f  (workbuffer, &wo
2af0: 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31  rkbuffer_next, 1
2b00: 30 29 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66  0);......workbuf
2b10: 66 65 72 20 3d 20 77 6f 72 6b 62 75 66 66 65 72  fer = workbuffer
2b20: 5f 6e 65 78 74 3b 0a 0a 09 09 09 09 69 66 20 28  _next;......if (
2b30: 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27  *workbuffer == '
2b40: 2d 27 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62  -') {......workb
2b50: 75 66 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69  uffer++;.......i
2b60: 66 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 21  f (*workbuffer !
2b70: 3d 20 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62  = '\r' && *workb
2b80: 75 66 66 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b  uffer != '\n') {
2b90: 0a 09 09 09 09 09 09 72 61 6e 67 65 5f 65 6e 64  .......range_end
2ba0: 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b   = strtoull(work
2bb0: 62 75 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66  buffer, &workbuf
2bc0: 66 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09  fer_next, 10);..
2bd0: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
2be0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 65 6d 63  ...}....if (memc
2bf0: 6d 70 28 74 6d 70 62 75 66 66 65 72 2c 20 22 5c  mp(tmpbuffer, "\
2c00: 72 5c 6e 22 2c 20 32 29 20 3d 3d 20 30 29 20 7b  r\n", 2) == 0) {
2c10: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
2c20: 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  }...filed_log_ms
2c30: 67 28 22 47 4f 54 5f 48 45 41 44 45 52 53 20 46  g("GOT_HEADERS F
2c40: 44 3d 25 69 22 2c 20 66 64 29 3b 0a 0a 09 2f 2a  D=%i", fd);.../*
2c50: 20 57 65 20 6f 6e 6c 79 20 68 61 6e 64 6c 65 20   We only handle 
2c60: 74 68 65 20 22 47 45 54 22 20 6d 65 74 68 6f 64  the "GET" method
2c70: 20 2a 2f 0a 09 69 66 20 28 73 74 72 63 61 73 65   */..if (strcase
2c80: 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22 67 65 74  cmp(method, "get
2c90: 22 29 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  ") != 0) {...ret
2ca0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
2cb0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 61 6e  /* Determine ran
2cc0: 67 65 20 2a 2f 0a 09 69 66 20 28 72 61 6e 67 65  ge */..if (range
2cd0: 5f 65 6e 64 20 21 3d 20 30 29 20 7b 0a 09 09 69  _end != 0) {...i
2ce0: 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 3c 3d 20  f (range_end <= 
2cf0: 72 61 6e 67 65 5f 73 74 61 72 74 29 20 7b 0a 09  range_start) {..
2d00: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
2d10: 09 09 7d 0a 0a 09 09 72 61 6e 67 65 5f 6c 65 6e  ..}....range_len
2d20: 67 74 68 20 3d 20 72 61 6e 67 65 5f 65 6e 64 20  gth = range_end 
2d30: 2d 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 0a  - range_start;..
2d40: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
2d50: 64 65 62 75 67 28 22 43 6f 6d 70 75 74 69 6e 67  debug("Computing
2d60: 20 6c 65 6e 67 74 68 20 70 61 72 61 6d 65 74 65   length paramete
2d70: 72 3a 20 25 6c 6c 75 20 3d 20 25 6c 6c 75 20 2d  r: %llu = %llu -
2d80: 20 25 6c 6c 75 22 2c 0a 09 09 09 28 75 6e 73 69   %llu",....(unsi
2d90: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2da0: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 2c 0a 09 09  range_length,...
2db0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
2dc0: 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 65 6e 64 2c  long) range_end,
2dd0: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
2de0: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 73  ng long) range_s
2df0: 74 61 72 74 0a 09 09 29 3b 0a 09 7d 0a 0a 09 2f  tart...);..}.../
2e00: 2a 20 46 69 6c 6c 20 75 70 20 73 74 72 75 63 74  * Fill up struct
2e10: 75 72 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ure to return */
2e20: 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74  ..buffer_st->pat
2e30: 68 20 20 20 3d 20 70 61 74 68 3b 0a 09 62 75 66  h   = path;..buf
2e40: 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e  fer_st->headers.
2e50: 72 61 6e 67 65 2e 70 72 65 73 65 6e 74 20 3d 20  range.present = 
2e60: 72 61 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09  range_request;..
2e70: 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65  buffer_st->heade
2e80: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20  rs.range.offset 
2e90: 20 3d 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a   = range_start;.
2ea0: 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64  .buffer_st->head
2eb0: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
2ec0: 20 20 3d 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68    = range_length
2ed0: 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65  ;...return(buffe
2ee0: 72 5f 73 74 29 3b 0a 0a 09 2f 2a 20 4d 61 6b 65  r_st);.../* Make
2ef0: 20 63 6f 6d 70 69 6c 65 72 20 68 61 70 70 79 20   compiler happy 
2f00: 2a 2f 0a 09 66 64 20 3d 20 66 64 3b 0a 7d 0a 0a  */..fd = fd;.}..
2f10: 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  /* Return an err
2f20: 6f 72 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69  or page */.stati
2f30: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 65 72 72  c void filed_err
2f40: 6f 72 5f 70 61 67 65 28 46 49 4c 45 20 2a 66 70  or_page(FILE *fp
2f50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61  , const char *da
2f60: 74 65 5f 63 75 72 72 65 6e 74 2c 20 69 6e 74 20  te_current, int 
2f70: 65 72 72 6f 72 5f 6e 75 6d 62 65 72 29 20 7b 0a  error_number) {.
2f80: 09 63 68 61 72 20 2a 65 72 72 6f 72 5f 73 74 72  .char *error_str
2f90: 69 6e 67 20 3d 20 22 3c 68 74 6d 6c 3e 3c 68 65  ing = "<html><he
2fa0: 61 64 3e 3c 74 69 74 6c 65 3e 45 52 52 4f 52 3c  ad><title>ERROR<
2fb0: 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 3c 62  /title></head><b
2fc0: 6f 64 79 3e 55 6e 61 62 6c 65 20 74 6f 20 70 72  ody>Unable to pr
2fd0: 6f 63 65 73 73 20 72 65 71 75 65 73 74 3c 2f 62  ocess request</b
2fe0: 6f 64 79 3e 3c 2f 68 74 6d 6c 3e 22 3b 0a 0a 09  ody></html>";...
2ff0: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54  fprintf(fp, "HTT
3000: 50 2f 31 2e 31 20 25 69 20 4e 6f 74 20 4f 4b 5c  P/1.1 %i Not OK\
3010: 72 5c 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53  r\nDate: %s\r\nS
3020: 65 72 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e  erver: filed\r\n
3030: 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25  Last-Modified: %
3040: 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e  s\r\nContent-Len
3050: 67 74 68 3a 20 25 6c 6c 75 5c 72 5c 6e 43 6f 6e  gth: %llu\r\nCon
3060: 74 65 6e 74 2d 54 79 70 65 3a 20 25 73 5c 72 5c  tent-Type: %s\r\
3070: 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f  nConnection: clo
3080: 73 65 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c 0a 09  se\r\n\r\n%s",..
3090: 09 65 72 72 6f 72 5f 6e 75 6d 62 65 72 2c 0a 09  .error_number,..
30a0: 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09  .date_current,..
30b0: 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09  .date_current,..
30c0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
30d0: 6c 6f 6e 67 29 20 73 74 72 6c 65 6e 28 65 72 72  long) strlen(err
30e0: 6f 72 5f 73 74 72 69 6e 67 29 2c 0a 09 09 22 74  or_string),..."t
30f0: 65 78 74 2f 68 74 6d 6c 22 2c 0a 09 09 65 72 72  ext/html",...err
3100: 6f 72 5f 73 74 72 69 6e 67 0a 09 29 3b 0a 7d 0a  or_string..);.}.
3110: 0a 2f 2a 20 48 61 6e 64 6c 65 20 61 20 73 69 6e  ./* Handle a sin
3120: 67 6c 65 20 72 65 71 75 65 73 74 20 66 72 6f 6d  gle request from
3130: 20 61 20 63 6c 69 65 6e 74 20 2a 2f 0a 73 74 61   a client */.sta
3140: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 68  tic void filed_h
3150: 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 69 6e 74  andle_client(int
3160: 20 66 64 2c 20 73 74 72 75 63 74 20 66 69 6c 65   fd, struct file
3170: 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a  d_http_request *
3180: 72 65 71 75 65 73 74 29 20 7b 0a 09 73 74 72 75  request) {..stru
3190: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
31a0: 6f 20 2a 66 69 6c 65 69 6e 66 6f 3b 0a 09 73 73  o *fileinfo;..ss
31b0: 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 72  ize_t sendfile_r
31c0: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 73 65 6e 64  et;..size_t send
31d0: 66 69 6c 65 5f 6c 65 6e 2c 20 73 65 6e 64 66 69  file_len, sendfi
31e0: 6c 65 5f 73 65 6e 74 2c 20 73 65 6e 64 66 69 6c  le_sent, sendfil
31f0: 65 5f 73 69 7a 65 3b 0a 09 6f 66 66 5f 74 20 73  e_size;..off_t s
3200: 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 3b 0a  endfile_offset;.
3210: 09 63 68 61 72 20 2a 70 61 74 68 3b 0a 09 63 68  .char *path;..ch
3220: 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74  ar *date_current
3230: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62  , date_current_b
3240: 5b 36 34 5d 3b 0a 09 69 6e 74 20 68 74 74 70 5f  [64];..int http_
3250: 63 6f 64 65 3b 0a 09 46 49 4c 45 20 2a 66 70 3b  code;..FILE *fp;
3260: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
3270: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 2a 2f 0a  current time */.
3280: 09 64 61 74 65 5f 63 75 72 72 65 6e 74 20 3d 20  .date_current = 
3290: 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d  filed_format_tim
32a0: 65 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62  e(date_current_b
32b0: 2c 20 73 69 7a 65 6f 66 28 64 61 74 65 5f 63 75  , sizeof(date_cu
32c0: 72 72 65 6e 74 5f 62 29 2c 20 74 69 6d 65 28 4e  rrent_b), time(N
32d0: 55 4c 4c 29 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ULL));.../* Open
32e0: 20 73 6f 63 6b 65 74 20 61 73 20 41 4e 53 49 20   socket as ANSI 
32f0: 49 2f 4f 20 66 6f 72 20 65 61 73 65 20 6f 66 20  I/O for ease of 
3300: 75 73 65 20 2a 2f 0a 09 66 70 20 3d 20 66 64 6f  use */..fp = fdo
3310: 70 65 6e 28 66 64 2c 20 22 77 2b 62 22 29 3b 0a  pen(fd, "w+b");.
3320: 09 69 66 20 28 66 70 20 3d 3d 20 4e 55 4c 4c 29  .if (fp == NULL)
3330: 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a   {...close(fd);.
3340: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
3350: 72 65 71 75 65 73 74 20 3d 20 66 69 6c 65 64 5f  request = filed_
3360: 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74  get_http_request
3370: 28 66 70 2c 20 72 65 71 75 65 73 74 29 3b 0a 0a  (fp, request);..
3380: 09 69 66 20 28 72 65 71 75 65 73 74 20 3d 3d 20  .if (request == 
3390: 4e 55 4c 4c 20 7c 7c 20 72 65 71 75 65 73 74 2d  NULL || request-
33a0: 3e 70 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b  >path == NULL) {
33b0: 0a 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70  ...filed_error_p
33c0: 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72  age(fp, date_cur
33d0: 72 65 6e 74 2c 20 35 30 30 29 3b 0a 0a 09 09 66  rent, 500);....f
33e0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 49 4e  iled_log_msg("IN
33f0: 56 41 4c 49 44 5f 52 45 51 55 45 53 54 20 46 44  VALID_REQUEST FD
3400: 3d 25 69 20 45 52 52 4f 52 3d 35 30 30 22 2c 20  =%i ERROR=500", 
3410: 66 64 29 3b 0a 0a 09 09 66 63 6c 6f 73 65 28 66  fd);....fclose(f
3420: 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09  p);....return;..
3430: 7d 0a 0a 09 69 66 20 28 72 65 71 75 65 73 74 2d  }...if (request-
3440: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 70  >headers.range.p
3450: 72 65 73 65 6e 74 29 20 7b 0a 09 09 66 69 6c 65  resent) {...file
3460: 64 5f 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45  d_log_msg("PROCE
3470: 53 53 5f 52 45 50 4c 59 5f 53 54 41 52 54 20 46  SS_REPLY_START F
3480: 44 3d 25 69 20 50 41 54 48 3d 25 73 20 52 41 4e  D=%i PATH=%s RAN
3490: 47 45 5f 53 54 41 52 54 3d 25 6c 6c 75 20 52 41  GE_START=%llu RA
34a0: 4e 47 45 5f 4c 45 4e 47 54 48 3d 25 6c 6c 75 22  NGE_LENGTH=%llu"
34b0: 2c 0a 09 09 09 66 64 2c 0a 09 09 09 72 65 71 75  ,....fd,....requ
34c0: 65 73 74 2d 3e 70 61 74 68 2c 0a 09 09 09 28 75  est->path,....(u
34d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
34e0: 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  g) request->head
34f0: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3500: 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ,....(unsigned l
3510: 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73  ong long) reques
3520: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
3530: 2e 6c 65 6e 67 74 68 0a 09 09 29 3b 0a 09 7d 20  .length...);..} 
3540: 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65 64 5f 6c  else {...filed_l
3550: 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45 53 53 5f  og_msg("PROCESS_
3560: 52 45 50 4c 59 5f 53 54 41 52 54 20 46 44 3d 25  REPLY_START FD=%
3570: 69 20 50 41 54 48 3d 25 73 22 2c 20 66 64 2c 20  i PATH=%s", fd, 
3580: 72 65 71 75 65 73 74 2d 3e 70 61 74 68 29 3b 0a  request->path);.
3590: 09 7d 0a 0a 09 70 61 74 68 20 3d 20 72 65 71 75  .}...path = requ
35a0: 65 73 74 2d 3e 70 61 74 68 3b 0a 0a 09 68 74 74  est->path;...htt
35b0: 70 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a 0a 09 66  p_code = -1;...f
35c0: 69 6c 65 69 6e 66 6f 20 3d 20 66 69 6c 65 64 5f  ileinfo = filed_
35d0: 6f 70 65 6e 5f 66 69 6c 65 28 70 61 74 68 2c 20  open_file(path, 
35e0: 26 72 65 71 75 65 73 74 2d 3e 66 69 6c 65 69 6e  &request->filein
35f0: 66 6f 29 3b 0a 09 69 66 20 28 66 69 6c 65 69 6e  fo);..if (filein
3600: 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
3610: 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65  filed_error_page
3620: 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e  (fp, date_curren
3630: 74 2c 20 34 30 34 29 3b 0a 0a 09 09 66 69 6c 65  t, 404);....file
3640: 64 5f 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45  d_log_msg("PROCE
3650: 53 53 5f 52 45 50 4c 59 5f 43 4f 4d 50 4c 45 54  SS_REPLY_COMPLET
3660: 45 20 46 44 3d 25 69 20 45 52 52 4f 52 3d 34 30  E FD=%i ERROR=40
3670: 34 22 2c 20 66 64 29 3b 0a 09 7d 20 65 6c 73 65  4", fd);..} else
3680: 20 7b 0a 09 09 69 66 20 28 72 65 71 75 65 73 74   {...if (request
3690: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
36a0: 6f 66 66 73 65 74 20 21 3d 20 30 20 7c 7c 20 72  offset != 0 || r
36b0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
36c0: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3e 3d 20  range.length >= 
36d0: 30 29 20 7b 0a 09 09 09 69 66 20 28 72 65 71 75  0) {....if (requ
36e0: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
36f0: 67 65 2e 6f 66 66 73 65 74 20 3e 3d 20 66 69 6c  ge.offset >= fil
3700: 65 69 6e 66 6f 2d 3e 6c 65 6e 29 20 7b 0a 09 09  einfo->len) {...
3710: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
3720: 22 50 52 4f 43 45 53 53 5f 52 45 50 4c 59 5f 43  "PROCESS_REPLY_C
3730: 4f 4d 50 4c 45 54 45 20 46 44 3d 25 69 20 45 52  OMPLETE FD=%i ER
3740: 52 4f 52 3d 34 31 36 22 2c 20 66 64 29 3b 0a 0a  ROR=416", fd);..
3750: 09 09 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f  ....filed_error_
3760: 70 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75  page(fp, date_cu
3770: 72 72 65 6e 74 2c 20 34 31 36 29 3b 0a 09 09 09  rrent, 416);....
3780: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
3790: 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72  (request->header
37a0: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3c  s.range.length <
37b0: 20 30 29 20 7b 0a 09 09 09 09 09 66 69 6c 65 64   0) {......filed
37c0: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
37d0: 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68  Computing length
37e0: 20 74 6f 20 66 69 74 20 69 6e 20 62 6f 75 6e 64   to fit in bound
37f0: 73 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e  s: fileinfo->len
3800: 20 3d 20 25 6c 6c 75 2c 20 72 65 71 75 65 73 74   = %llu, request
3810: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3820: 6f 66 66 73 65 74 20 3d 20 25 6c 6c 75 22 2c 0a  offset = %llu",.
3830: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
3840: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69  long long) filei
3850: 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09 09 09  nfo->len,.......
3860: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
3870: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
3880: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
3890: 65 74 0a 09 09 09 09 09 29 3b 0a 0a 09 09 09 09  et......);......
38a0: 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72  .request->header
38b0: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d  s.range.length =
38c0: 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 2d   fileinfo->len -
38d0: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
38e0: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a  s.range.offset;.
38f0: 09 09 09 09 7d 0a 0a 09 09 09 09 66 69 6c 65 64  ....}......filed
3900: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
3910: 50 61 72 74 69 61 6c 20 72 65 71 75 65 73 74 2c  Partial request,
3920: 20 73 74 61 72 74 69 6e 67 20 61 74 3a 20 25 6c   starting at: %l
3930: 6c 75 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20 66  lu and running f
3940: 6f 72 20 25 6c 6c 75 20 62 79 74 65 73 22 2c 0a  or %llu bytes",.
3950: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
3960: 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73  ong long) reques
3970: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
3980: 2e 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 28 75  .offset,......(u
3990: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
39a0: 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  g) request->head
39b0: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
39c0: 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09 68 74 74  .....);......htt
39d0: 70 5f 63 6f 64 65 20 3d 20 32 30 36 3b 0a 09 09  p_code = 206;...
39e0: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
39f0: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
3a00: 61 64 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73  aders.range.pres
3a10: 65 6e 74 29 20 7b 0a 09 09 09 09 68 74 74 70 5f  ent) {.....http_
3a20: 63 6f 64 65 20 3d 20 32 30 36 3b 0a 09 09 09 7d  code = 206;....}
3a30: 20 65 6c 73 65 20 7b 0a 09 09 09 09 68 74 74 70   else {.....http
3a40: 5f 63 6f 64 65 20 3d 20 32 30 30 3b 0a 09 09 09  _code = 200;....
3a50: 7d 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 68 65  }....request->he
3a60: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
3a70: 65 74 20 3d 20 30 3b 0a 09 09 09 72 65 71 75 65  et = 0;....reque
3a80: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3a90: 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69  e.length = filei
3aa0: 6e 66 6f 2d 3e 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  nfo->len;...}...
3ab0: 09 69 66 20 28 68 74 74 70 5f 63 6f 64 65 20 3e  .if (http_code >
3ac0: 20 30 29 20 7b 0a 09 09 09 66 70 72 69 6e 74 66   0) {....fprintf
3ad0: 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25  (fp, "HTTP/1.1 %
3ae0: 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73  i OK\r\nDate: %s
3af0: 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65  \r\nServer: file
3b00: 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69  d\r\nLast-Modifi
3b10: 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e  ed: %s\r\nConten
3b20: 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72  t-Length: %llu\r
3b30: 5c 6e 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a  \nAccept-Ranges:
3b40: 20 62 79 74 65 73 5c 72 5c 6e 43 6f 6e 74 65 6e   bytes\r\nConten
3b50: 74 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f  t-Type: %s\r\nCo
3b60: 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c  nnection: close\
3b70: 72 5c 6e 22 2c 0a 09 09 09 09 68 74 74 70 5f 63  r\n",.....http_c
3b80: 6f 64 65 2c 0a 09 09 09 09 64 61 74 65 5f 63 75  ode,.....date_cu
3b90: 72 72 65 6e 74 2c 0a 09 09 09 09 66 69 6c 65 69  rrent,.....filei
3ba0: 6e 66 6f 2d 3e 6c 61 73 74 6d 6f 64 2c 0a 09 09  nfo->lastmod,...
3bb0: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
3bc0: 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e   long) request->
3bd0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
3be0: 6e 67 74 68 2c 0a 09 09 09 09 66 69 6c 65 69 6e  ngth,.....filein
3bf0: 66 6f 2d 3e 74 79 70 65 0a 09 09 09 29 3b 0a 09  fo->type....);..
3c00: 09 09 69 66 20 28 68 74 74 70 5f 63 6f 64 65 20  ..if (http_code 
3c10: 3d 3d 20 32 30 36 29 20 7b 0a 09 09 09 09 66 70  == 206) {.....fp
3c20: 72 69 6e 74 66 28 66 70 2c 20 22 43 6f 6e 74 65  rintf(fp, "Conte
3c30: 6e 74 2d 52 61 6e 67 65 3a 20 62 79 74 65 73 20  nt-Range: bytes 
3c40: 25 6c 6c 75 2d 25 6c 6c 75 2f 25 6c 6c 75 5c 72  %llu-%llu/%llu\r
3c50: 5c 6e 22 2c 0a 09 09 09 09 09 28 75 6e 73 69 67  \n",......(unsig
3c60: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
3c70: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
3c80: 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09 09  range.offset,...
3c90: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
3ca0: 67 20 6c 6f 6e 67 29 20 28 72 65 71 75 65 73 74  g long) (request
3cb0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3cc0: 6f 66 66 73 65 74 20 2b 20 72 65 71 75 65 73 74  offset + request
3cd0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3ce0: 6c 65 6e 67 74 68 20 2d 20 31 29 2c 0a 09 09 09  length - 1),....
3cf0: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
3d00: 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d   long) fileinfo-
3d10: 3e 6c 65 6e 0a 09 09 09 09 29 3b 0a 09 09 09 7d  >len.....);....}
3d20: 0a 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20  ....fprintf(fp, 
3d30: 22 5c 72 5c 6e 22 29 3b 0a 09 09 09 66 66 6c 75  "\r\n");....fflu
3d40: 73 68 28 66 70 29 3b 0a 0a 09 09 09 66 69 6c 65  sh(fp);.....file
3d50: 64 5f 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45  d_log_msg("PROCE
3d60: 53 53 5f 52 45 50 4c 59 5f 43 4f 4d 50 4c 45 54  SS_REPLY_COMPLET
3d70: 45 20 46 44 3d 25 69 20 53 54 41 54 55 53 3d 25  E FD=%i STATUS=%
3d80: 69 22 2c 20 66 64 2c 20 68 74 74 70 5f 63 6f 64  i", fd, http_cod
3d90: 65 29 3b 0a 0a 23 69 66 64 65 66 20 46 49 4c 45  e);..#ifdef FILE
3da0: 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54 50 0a  D_NONBLOCK_HTTP.
3db0: 09 09 09 69 6e 74 20 73 6f 63 6b 65 74 5f 66 6c  ...int socket_fl
3dc0: 61 67 73 3b 0a 09 09 09 66 64 5f 73 65 74 20 72  ags;....fd_set r
3dd0: 66 64 2c 20 77 66 64 3b 0a 09 09 09 63 68 61 72  fd, wfd;....char
3de0: 20 73 69 6e 6b 62 75 66 5b 38 31 39 32 5d 3b 0a   sinkbuf[8192];.
3df0: 09 09 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f  ...ssize_t read_
3e00: 72 65 74 3b 0a 0a 09 09 09 46 44 5f 5a 45 52 4f  ret;.....FD_ZERO
3e10: 28 26 72 66 64 29 3b 0a 09 09 09 46 44 5f 5a 45  (&rfd);....FD_ZE
3e20: 52 4f 28 26 77 66 64 29 3b 0a 09 09 09 46 44 5f  RO(&wfd);....FD_
3e30: 53 45 54 28 66 64 2c 20 26 72 66 64 29 3b 0a 09  SET(fd, &rfd);..
3e40: 09 09 46 44 5f 53 45 54 28 66 64 2c 20 26 77 66  ..FD_SET(fd, &wf
3e50: 64 29 3b 0a 0a 09 09 09 73 6f 63 6b 65 74 5f 66  d);.....socket_f
3e60: 6c 61 67 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c  lags = fcntl(fd,
3e70: 20 46 5f 47 45 54 46 4c 29 3b 0a 09 09 09 66 63   F_GETFL);....fc
3e80: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 4c 2c  ntl(fd, F_SETFL,
3e90: 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 7c 20   socket_flags | 
3ea0: 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a 23 65 6e  O_NONBLOCK);.#en
3eb0: 64 69 66 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f  dif.....filed_lo
3ec0: 67 5f 6d 73 67 28 22 53 45 4e 44 5f 53 54 41 52  g_msg("SEND_STAR
3ed0: 54 20 46 49 4c 45 5f 46 44 3d 25 69 20 46 44 3d  T FILE_FD=%i FD=
3ee0: 25 69 20 42 59 54 45 53 3d 25 6c 6c 75 20 4f 46  %i BYTES=%llu OF
3ef0: 46 53 45 54 3d 25 6c 6c 75 22 2c 0a 09 09 09 09  FSET=%llu",.....
3f00: 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c 0a 09 09  fileinfo->fd,...
3f10: 09 09 66 64 2c 0a 09 09 09 09 28 75 6e 73 69 67  ..fd,.....(unsig
3f20: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
3f30: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
3f40: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09 09  range.length,...
3f50: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
3f60: 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e   long) request->
3f70: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
3f80: 66 73 65 74 0a 09 09 09 29 3b 0a 0a 09 09 09 73  fset....);.....s
3f90: 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 20 3d  endfile_offset =
3fa0: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
3fb0: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a  s.range.offset;.
3fc0: 09 09 09 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20  ...sendfile_len 
3fd0: 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  = request->heade
3fe0: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 3b  rs.range.length;
3ff0: 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e  ....sendfile_sen
4000: 74 20 3d 20 30 3b 0a 09 09 09 77 68 69 6c 65 20  t = 0;....while 
4010: 28 31 29 20 7b 0a 09 09 09 09 69 66 20 28 73 65  (1) {.....if (se
4020: 6e 64 66 69 6c 65 5f 6c 65 6e 20 3e 20 46 49 4c  ndfile_len > FIL
4030: 45 44 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 29  ED_SENDFILE_MAX)
4040: 20 7b 0a 09 09 09 09 09 73 65 6e 64 66 69 6c 65   {......sendfile
4050: 5f 73 69 7a 65 20 3d 20 46 49 4c 45 44 5f 53 45  _size = FILED_SE
4060: 4e 44 46 49 4c 45 5f 4d 41 58 3b 0a 09 09 09 09  NDFILE_MAX;.....
4070: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 73 65  } else {......se
4080: 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 73 65  ndfile_size = se
4090: 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09 09 09 09  ndfile_len;.....
40a0: 7d 0a 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f  }......sendfile_
40b0: 72 65 74 20 3d 20 73 65 6e 64 66 69 6c 65 28 66  ret = sendfile(f
40c0: 64 2c 20 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c  d, fileinfo->fd,
40d0: 20 26 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65   &sendfile_offse
40e0: 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  t, sendfile_size
40f0: 29 3b 0a 09 09 09 09 69 66 20 28 73 65 6e 64 66  );.....if (sendf
4100: 69 6c 65 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ile_ret <= 0) {.
4110: 23 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e  #ifdef FILED_NON
4120: 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 09 09  BLOCK_HTTP......
4130: 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20 45 41 47  if (errno == EAG
4140: 41 49 4e 29 20 7b 0a 09 09 09 09 09 09 73 65 6e  AIN) {.......sen
4150: 64 66 69 6c 65 5f 72 65 74 20 3d 20 30 3b 0a 0a  dfile_ret = 0;..
4160: 09 09 09 09 09 09 77 68 69 6c 65 20 28 31 29 20  ......while (1) 
4170: 7b 0a 09 09 09 09 09 09 09 73 65 6c 65 63 74 28  {........select(
4180: 66 64 20 2b 20 31 2c 20 26 72 66 64 2c 20 26 77  fd + 1, &rfd, &w
4190: 66 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  fd, NULL, NULL);
41a0: 0a 09 09 09 09 09 09 09 69 66 20 28 46 44 5f 49  ........if (FD_I
41b0: 53 53 45 54 28 66 64 2c 20 26 72 66 64 29 29 20  SSET(fd, &rfd)) 
41c0: 7b 0a 09 09 09 09 09 09 09 09 72 65 61 64 5f 72  {.........read_r
41d0: 65 74 20 3d 20 72 65 61 64 28 66 64 2c 20 73 69  et = read(fd, si
41e0: 6e 6b 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  nkbuf, sizeof(si
41f0: 6e 6b 62 75 66 29 29 3b 0a 0a 09 09 09 09 09 09  nkbuf));........
4200: 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c  ..if (read_ret <
4210: 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 09 09  = 0) {..........
4220: 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 09 09 7d  break;.........}
4230: 0a 09 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  ........}.......
4240: 09 09 69 66 20 28 46 44 5f 49 53 53 45 54 28 66  ..if (FD_ISSET(f
4250: 64 2c 20 26 77 66 64 29 29 20 7b 0a 09 09 09 09  d, &wfd)) {.....
4260: 09 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 31  ....read_ret = 1
4270: 3b 0a 0a 09 09 09 09 09 09 09 09 62 72 65 61 6b  ;..........break
4280: 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09  ;........}......
4290: 09 7d 0a 0a 09 09 09 09 09 09 69 66 20 28 72 65  .}........if (re
42a0: 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
42b0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
42c0: 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65  ...}......} else
42d0: 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
42e0: 09 09 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09  .....}.#else....
42f0: 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
4300: 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 66  ....}......sendf
4310: 69 6c 65 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64 66  ile_len -= sendf
4320: 69 6c 65 5f 72 65 74 3b 0a 09 09 09 09 73 65 6e  ile_ret;.....sen
4330: 64 66 69 6c 65 5f 73 65 6e 74 20 2b 3d 20 73 65  dfile_sent += se
4340: 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 09 09 09  ndfile_ret;.....
4350: 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  if (sendfile_len
4360: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72   == 0) {......br
4370: 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  eak;.....}....}.
4380: 0a 09 09 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f  ..../* XXX: TODO
4390: 3a 20 52 65 70 6f 72 74 20 73 74 61 74 75 73 20  : Report status 
43a0: 2a 2f 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  */....filed_log_
43b0: 6d 73 67 28 22 53 45 4e 44 5f 43 4f 4d 50 4c 45  msg("SEND_COMPLE
43c0: 54 45 20 53 54 41 54 55 53 3d 25 73 20 46 49 4c  TE STATUS=%s FIL
43d0: 45 5f 46 44 3d 25 69 20 46 44 3d 25 69 20 42 59  E_FD=%i FD=%i BY
43e0: 54 45 53 3d 25 6c 6c 75 20 42 59 54 45 53 5f 53  TES=%llu BYTES_S
43f0: 45 4e 54 3d 25 6c 6c 75 22 2c 0a 09 09 09 09 22  ENT=%llu",....."
4400: 3c 75 6e 6b 6e 6f 77 6e 3e 22 2c 0a 09 09 09 09  <unknown>",.....
4410: 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c 0a 09 09  fileinfo->fd,...
4420: 09 09 66 64 2c 0a 09 09 09 09 28 75 6e 73 69 67  ..fd,.....(unsig
4430: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
4440: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
4450: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09 09  range.length,...
4460: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
4470: 20 6c 6f 6e 67 29 20 73 65 6e 64 66 69 6c 65 5f   long) sendfile_
4480: 73 65 6e 74 0a 09 09 09 29 3b 0a 09 09 7d 0a 0a  sent....);...}..
4490: 09 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e 66 6f  ..close(fileinfo
44a0: 2d 3e 66 64 29 3b 0a 0a 09 09 66 69 6c 65 64 5f  ->fd);....filed_
44b0: 6c 6f 67 5f 6d 73 67 28 22 43 4c 4f 53 45 5f 46  log_msg("CLOSE_F
44c0: 49 4c 45 20 46 44 3d 25 69 22 2c 20 66 64 29 3b  ILE FD=%i", fd);
44d0: 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  ..}...filed_log_
44e0: 6d 73 67 28 22 43 4c 4f 53 45 5f 43 4f 4e 4e 45  msg("CLOSE_CONNE
44f0: 43 54 49 4f 4e 20 46 44 3d 25 69 22 2c 20 66 64  CTION FD=%i", fd
4500: 29 3b 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b  );...fclose(fp);
4510: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
4520: 20 48 61 6e 64 6c 65 20 69 6e 63 6f 6d 69 6e 67   Handle incoming
4530: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
4540: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c  static void *fil
4550: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
4560: 28 76 6f 69 64 20 2a 61 72 67 5f 76 29 20 7b 0a  (void *arg_v) {.
4570: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77 6f  .struct filed_wo
4580: 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67 73  rker_thread_args
4590: 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66   *arg;..struct f
45a0: 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73  iled_http_reques
45b0: 74 20 72 65 71 75 65 73 74 3b 0a 09 73 74 72 75  t request;..stru
45c0: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  ct sockaddr_in6 
45d0: 61 64 64 72 3b 0a 09 63 68 61 72 20 6c 6f 67 62  addr;..char logb
45e0: 75 66 5f 69 70 5b 31 32 38 5d 3b 0a 09 73 6f 63  uf_ip[128];..soc
45f0: 6b 6c 65 6e 5f 74 20 61 64 64 72 6c 65 6e 3b 0a  klen_t addrlen;.
4600: 09 69 6e 74 20 66 61 69 6c 75 72 65 5f 63 6f 75  .int failure_cou
4610: 6e 74 20 3d 20 30 2c 20 6d 61 78 5f 66 61 69 6c  nt = 0, max_fail
4620: 75 72 65 5f 63 6f 75 6e 74 20 3d 20 4d 41 58 5f  ure_count = MAX_
4630: 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a 09  FAILURE_COUNT;..
4640: 69 6e 74 20 6d 61 73 74 65 72 5f 66 64 2c 20 66  int master_fd, f
4650: 64 3b 0a 0a 09 2f 2a 20 52 65 61 64 20 61 72 67  d;.../* Read arg
4660: 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d  uments */..arg =
4670: 20 61 72 67 5f 76 3b 0a 0a 09 6d 61 73 74 65 72   arg_v;...master
4680: 5f 66 64 20 3d 20 61 72 67 2d 3e 66 64 3b 0a 0a  _fd = arg->fd;..
4690: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 2f  .while (1) {.../
46a0: 2a 20 46 61 69 6c 75 72 65 20 6c 6f 6f 70 20 70  * Failure loop p
46b0: 72 65 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 09 69  revention */...i
46c0: 66 20 28 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74  f (failure_count
46d0: 20 3e 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63   > max_failure_c
46e0: 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b  ount) {....break
46f0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 41 63 63 65  ;...}..../* Acce
4700: 70 74 20 61 20 6e 65 77 20 63 6c 69 65 6e 74 20  pt a new client 
4710: 2a 2f 0a 09 09 61 64 64 72 6c 65 6e 20 3d 20 73  */...addrlen = s
4720: 69 7a 65 6f 66 28 61 64 64 72 29 3b 0a 09 09 66  izeof(addr);...f
4730: 64 20 3d 20 61 63 63 65 70 74 28 6d 61 73 74 65  d = accept(maste
4740: 72 5f 66 64 2c 20 28 73 74 72 75 63 74 20 73 6f  r_fd, (struct so
4750: 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72 2c  ckaddr *) &addr,
4760: 20 26 61 64 64 72 6c 65 6e 29 3b 0a 0a 09 09 2f   &addrlen);..../
4770: 2a 0a 09 09 20 2a 20 49 66 20 77 65 20 66 61 69  *... * If we fai
4780: 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74 65 20 6f  l, make a note o
4790: 66 20 69 74 20 73 6f 20 77 65 20 64 6f 6e 27 74  f it so we don't
47a0: 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f 6f 70 20   go into a loop 
47b0: 6f 66 0a 09 09 20 2a 20 61 63 63 65 70 74 28 29  of... * accept()
47c0: 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a 2f 0a 09   failing... */..
47d0: 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09  .if (fd < 0) {..
47e0: 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e 65 77  ../* Log the new
47f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09   connection */..
4800: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
4810: 22 41 43 43 45 50 54 5f 46 41 49 4c 45 44 22 29  "ACCEPT_FAILED")
4820: 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65 5f 63 6f  ;.....failure_co
4830: 75 6e 74 2b 2b 3b 0a 0a 09 09 09 63 6f 6e 74 69  unt++;.....conti
4840: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 4c  nue;...}..../* L
4850: 6f 67 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  og the new conne
4860: 63 74 69 6f 6e 20 2a 2f 0a 09 09 66 69 6c 65 64  ction */...filed
4870: 5f 6c 6f 67 5f 6d 73 67 28 22 4e 45 57 5f 43 4f  _log_msg("NEW_CO
4880: 4e 4e 45 43 54 49 4f 4e 20 53 52 43 5f 41 44 44  NNECTION SRC_ADD
4890: 52 3d 25 73 20 53 52 43 5f 50 4f 52 54 3d 25 6c  R=%s SRC_PORT=%l
48a0: 75 20 46 44 3d 25 69 22 2c 0a 09 09 09 69 6e 65  u FD=%i",....ine
48b0: 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45 54 36 2c  t_ntop(AF_INET6,
48c0: 20 26 61 64 64 72 2e 73 69 6e 36 5f 61 64 64 72   &addr.sin6_addr
48d0: 2c 20 6c 6f 67 62 75 66 5f 69 70 2c 20 73 69 7a  , logbuf_ip, siz
48e0: 65 6f 66 28 6c 6f 67 62 75 66 5f 69 70 29 29 20  eof(logbuf_ip)) 
48f0: 3f 20 6c 6f 67 62 75 66 5f 69 70 20 3a 20 22 3c  ? logbuf_ip : "<
4900: 75 6e 6b 6e 6f 77 6e 3e 22 2c 0a 09 09 09 28 75  unknown>",....(u
4910: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64  nsigned long) ad
4920: 64 72 2e 73 69 6e 36 5f 70 6f 72 74 2c 0a 09 09  dr.sin6_port,...
4930: 09 66 64 0a 09 09 29 3b 0a 0a 09 09 2f 2a 20 52  .fd...);..../* R
4940: 65 73 65 74 20 66 61 69 6c 75 72 65 20 63 6f 75  eset failure cou
4950: 6e 74 2a 2f 0a 09 09 66 61 69 6c 75 72 65 5f 63  nt*/...failure_c
4960: 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 2f 2a 20  ount = 0;..../* 
4970: 48 61 6e 64 6c 65 20 73 6f 63 6b 65 74 20 2a 2f  Handle socket */
4980: 0a 09 09 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f  ...filed_handle_
4990: 63 6c 69 65 6e 74 28 66 64 2c 20 26 72 65 71 75  client(fd, &requ
49a0: 65 73 74 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65  est);..}.../* Re
49b0: 70 6f 72 74 20 65 72 72 6f 72 20 2a 2f 0a 09 66  port error */..f
49c0: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 54 48  iled_log_msg("TH
49d0: 52 45 41 44 5f 44 49 45 44 20 41 42 4e 4f 52 4d  READ_DIED ABNORM
49e0: 41 4c 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 4e  AL");...return(N
49f0: 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 4d 61 6b 65 20  ULL);.../* Make 
4a00: 63 6f 6d 70 69 6c 65 72 20 68 61 70 70 79 20 2a  compiler happy *
4a10: 2f 0a 09 6c 6f 67 62 75 66 5f 69 70 5b 30 5d 20  /..logbuf_ip[0] 
4a20: 3d 20 27 5c 30 27 3b 0a 09 6c 6f 67 62 75 66 5f  = '\0';..logbuf_
4a30: 69 70 5b 30 5d 20 3d 20 6c 6f 67 62 75 66 5f 69  ip[0] = logbuf_i
4a40: 70 5b 30 5d 3b 0a 0a 7d 0a 0a 2f 2a 20 43 72 65  p[0];..}../* Cre
4a50: 61 74 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61  ate worker threa
4a60: 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds */.static int
4a70: 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68   filed_worker_th
4a80: 72 65 61 64 73 5f 69 6e 69 74 28 69 6e 74 20 66  reads_init(int f
4a90: 64 2c 20 69 6e 74 20 74 68 72 65 61 64 5f 63 6f  d, int thread_co
4aa0: 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 66  unt) {..struct f
4ab0: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
4ac0: 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09 70  ad_args *arg;..p
4ad0: 74 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 69  thread_t threadi
4ae0: 64 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  d;..int pthread_
4af0: 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09 66  ret;..int i;...f
4b00: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 74  or (i = 0; i < t
4b10: 68 72 65 61 64 5f 63 6f 75 6e 74 3b 20 69 2b 2b  hread_count; i++
4b20: 29 20 7b 0a 09 09 61 72 67 20 3d 20 6d 61 6c 6c  ) {...arg = mall
4b30: 6f 63 28 73 69 7a 65 6f 66 28 2a 61 72 67 29 29  oc(sizeof(*arg))
4b40: 3b 0a 0a 09 09 61 72 67 2d 3e 66 64 20 3d 20 66  ;....arg->fd = f
4b50: 64 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  d;....pthread_re
4b60: 74 20 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61  t = pthread_crea
4b70: 74 65 28 26 74 68 72 65 61 64 69 64 2c 20 4e 55  te(&threadid, NU
4b80: 4c 4c 2c 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  LL, filed_worker
4b90: 5f 74 68 72 65 61 64 2c 20 61 72 67 29 3b 0a 09  _thread, arg);..
4ba0: 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
4bb0: 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   != 0) {....retu
4bc0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
4bd0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
4be0: 2a 20 44 69 73 70 6c 61 79 20 68 65 6c 70 20 2a  * Display help *
4bf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
4c00: 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46  led_print_help(F
4c10: 49 4c 45 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74  ILE *output, int
4c20: 20 6c 6f 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73   long_help, cons
4c30: 74 20 63 68 61 72 20 2a 65 78 74 72 61 29 20 7b  t char *extra) {
4c40: 0a 09 69 66 20 28 65 78 74 72 61 29 20 7b 0a 09  ..if (extra) {..
4c50: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4c60: 20 22 25 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b   "%s\n", extra);
4c70: 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75  ..}...fprintf(ou
4c80: 74 70 75 74 2c 20 22 55 73 61 67 65 3a 20 66 69  tput, "Usage: fi
4c90: 6c 65 64 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c  led [<options>]\
4ca0: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
4cb0: 74 70 75 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73  tput, "  Options
4cc0: 3a 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  :\n");..fprintf(
4cd0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
4ce0: 68 2c 20 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09  h, --help\n");..
4cf0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
4d00: 22 20 20 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65  "      -d, --dae
4d10: 6d 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  mon\n");..fprint
4d20: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
4d30: 20 2d 62 20 3c 61 64 64 72 65 73 73 3e 2c 20 2d   -b <address>, -
4d40: 2d 62 69 6e 64 20 3c 61 64 64 72 65 73 73 3e 5c  -bind <address>\
4d50: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
4d60: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 70 20  tput, "      -p 
4d70: 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f 72 74 20 3c  <port>, --port <
4d80: 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  port>\n");..fpri
4d90: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
4da0: 20 20 20 2d 74 20 3c 63 6f 75 6e 74 3e 2c 20 2d     -t <count>, -
4db0: 2d 74 68 72 65 61 64 73 20 3c 63 6f 75 6e 74 3e  -threads <count>
4dc0: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
4dd0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 63  utput, "      -c
4de0: 20 3c 65 6e 74 72 69 65 73 3e 2c 20 2d 2d 63 61   <entries>, --ca
4df0: 63 68 65 20 3c 65 6e 74 72 69 65 73 3e 5c 6e 22  che <entries>\n"
4e00: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
4e10: 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20 3c 66  ut, "      -l <f
4e20: 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20 3c 66 69 6c  ile>, --log <fil
4e30: 65 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  e>\n");..fprintf
4e40: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
4e50: 2d 75 20 3c 75 73 65 72 3e 2c 20 2d 2d 75 73 65  -u <user>, --use
4e60: 72 20 3c 75 73 65 72 3e 5c 6e 22 29 3b 0a 09 66  r <user>\n");..f
4e70: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4e80: 20 20 20 20 20 20 2d 72 20 3c 64 69 72 65 63 74        -r <direct
4e90: 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74 20 3c 64 69  ory>, --root <di
4ea0: 72 65 63 74 6f 72 79 3e 5c 6e 22 29 3b 0a 0a 09  rectory>\n");...
4eb0: 69 66 20 28 6c 6f 6e 67 5f 68 65 6c 70 29 20 7b  if (long_help) {
4ec0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
4ed0: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
4ee0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 55  ntf(output, "  U
4ef0: 73 61 67 65 3a 5c 6e 22 29 3b 0a 09 09 66 70 72  sage:\n");...fpr
4f00: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
4f10: 20 20 20 20 2d 68 20 28 6f 72 20 2d 2d 68 65 6c      -h (or --hel
4f20: 70 29 20 70 72 69 6e 74 73 20 74 68 69 73 20 75  p) prints this u
4f30: 73 61 67 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  sage information
4f40: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
4f50: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
4f60: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
4f70: 2c 20 22 20 20 20 20 20 20 2d 64 20 28 6f 72 20  , "      -d (or 
4f80: 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e 73 74 72 75  --daemon) instru
4f90: 63 74 73 20 66 69 6c 65 64 20 74 6f 20 62 65 63  cts filed to bec
4fa0: 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 61 66 74  ome a daemon aft
4fb0: 65 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 5c  er initializing\
4fc0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
4fd0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
4ff0: 68 65 20 6c 69 73 74 65 6e 69 6e 67 20 54 43 50  he listening TCP
5000: 20 73 6f 63 6b 65 74 20 61 6e 64 20 6c 6f 67 20   socket and log 
5010: 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70  files.\n");...fp
5020: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
5030: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5040: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62  utput, "      -b
5050: 20 28 6f 72 20 2d 2d 62 69 6e 64 29 20 73 70 65   (or --bind) spe
5060: 63 69 66 69 65 73 20 74 68 65 20 61 64 64 72 65  cifies the addre
5070: 73 73 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72  ss to listen for
5080: 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e   incoming HTTP\n
5090: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
50a0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75              requ
50c0: 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65  ests on.  The de
50d0: 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73 20 5c  fault value is \
50e0: 22 25 73 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f  "%s\".\n", BIND_
50f0: 41 44 44 52 29 3b 0a 09 09 66 70 72 69 6e 74 66  ADDR);...fprintf
5100: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
5110: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5120: 2c 20 22 20 20 20 20 20 20 2d 70 20 28 6f 72 20  , "      -p (or 
5130: 2d 2d 70 6f 72 74 29 20 73 70 65 63 69 66 69 65  --port) specifie
5140: 73 20 74 68 65 20 54 43 50 20 70 6f 72 74 20 6e  s the TCP port n
5150: 75 6d 62 65 72 20 74 6f 20 6c 69 73 74 65 6e 20  umber to listen 
5160: 66 6f 72 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54  for incoming HTT
5170: 50 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  P\n");...fprintf
5180: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
51a0: 65 71 75 65 73 74 73 20 6f 6e 2e 20 20 54 68 65  equests on.  The
51b0: 20 64 65 66 61 75 6c 74 20 69 73 20 25 75 2e 5c   default is %u.\
51c0: 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  n", (unsigned in
51d0: 74 29 20 50 4f 52 54 29 3b 0a 09 09 66 70 72 69  t) PORT);...fpri
51e0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
51f0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5200: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 74 20 28  put, "      -t (
5210: 6f 72 20 2d 2d 74 68 72 65 61 64 73 29 20 73 70  or --threads) sp
5220: 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
5230: 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72  er of worker thr
5240: 65 61 64 73 20 74 6f 20 63 72 65 61 74 65 2e 20  eads to create. 
5250: 45 61 63 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69  Each\n");...fpri
5260: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 77 6f 72 6b 65 72 20 74 68 72 65       worker thre
5290: 61 64 20 63 61 6e 20 73 65 72 76 69 63 65 20 6f  ad can service o
52a0: 6e 65 20 63 6f 6e 63 75 72 72 65 6e 74 20 48 54  ne concurrent HT
52b0: 54 50 20 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b  TP session.\n");
52c0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
52d0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 75 73              Thus
52f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
5300: 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 77  hreads created w
5310: 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ill determine ho
5320: 77 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  w\n");...fprintf
5330: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 6d 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65    many simultane
5360: 6f 75 73 20 74 72 61 6e 73 66 65 72 73 20 77 69  ous transfers wi
5370: 6c 6c 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 20  ll be possible. 
5380: 54 68 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  The\n");...fprin
5390: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 20 20 20 20 64 65 66 61 75 6c 74 20 69 73 20 25      default is %
53c0: 6c 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65  lu.\n", (unsigne
53d0: 64 20 6c 6f 6e 67 29 20 54 48 52 45 41 44 5f 43  d long) THREAD_C
53e0: 4f 55 4e 54 29 3b 0a 09 09 66 70 72 69 6e 74 66  OUNT);...fprintf
53f0: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
5400: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5410: 2c 20 22 20 20 20 20 20 20 2d 63 20 28 6f 72 20  , "      -c (or 
5420: 2d 2d 63 61 63 68 65 29 20 73 70 65 63 69 66 69  --cache) specifi
5430: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
5440: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
5450: 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 5c  n cache entries\
5460: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5470: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f                to
5490: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 45 61 63 68   allocate.  Each
54a0: 20 63 61 63 68 65 20 65 6e 74 72 79 20 68 6f 6c   cache entry hol
54b0: 64 73 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  ds file informat
54c0: 69 6f 6e 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70  ion as\n");...fp
54d0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 20 77 65 6c 6c 20 61 73 20 61 6e 20       well as an 
5500: 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
5510: 70 74 6f 72 20 74 6f 20 74 68 65 20 66 69 6c 65  ptor to the file
5520: 2c 20 73 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22  , so resource\n"
5530: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5540: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
5550: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69              limi
5560: 74 73 20 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74  ts (i.e., ulimit
5570: 29 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73  ) should be cons
5580: 69 64 65 72 65 64 2e 20 20 54 68 69 73 20 73 68  idered.  This sh
5590: 6f 75 6c 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69  ould\n");...fpri
55a0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75     be a prime nu
55d0: 6d 62 65 72 20 66 6f 72 20 69 64 65 61 6c 20 75  mber for ideal u
55e0: 73 65 20 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b  se with the look
55f0: 75 70 20 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a  up method.\n");.
5600: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5610: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
5620: 20 20 20 20 20 20 20 20 20 54 68 65 20 64 65 66           The def
5630: 61 75 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c  ault is %lu.\n",
5640: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
5650: 20 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09   CACHE_SIZE);...
5660: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
5670: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
5680: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
5690: 2d 6c 20 28 6f 72 20 2d 2d 6c 6f 67 29 20 73 70  -l (or --log) sp
56a0: 65 63 69 66 69 65 73 20 61 20 66 69 6c 65 6e 61  ecifies a filena
56b0: 6d 65 20 74 6f 20 6f 70 65 6e 20 66 6f 72 20 77  me to open for w
56c0: 72 69 74 69 6e 67 20 6c 6f 67 20 65 6e 74 72 69  riting log entri
56d0: 65 73 2e 20 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09  es.  Log\n");...
56e0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
56f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5700: 20 20 20 20 20 65 6e 74 72 69 65 73 20 61 72 65       entries are
5710: 20 6d 61 64 65 20 66 6f 72 20 76 61 72 69 6f 75   made for variou
5720: 73 20 73 74 61 67 65 73 20 69 6e 20 74 72 61 6e  s stages in tran
5730: 73 66 65 72 69 6e 67 20 66 69 6c 65 73 2e 5c 6e  sfering files.\n
5740: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
5750: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
5760: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6c             The l
5770: 6f 67 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  og file is opene
5780: 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69  d before switchi
5790: 6e 67 20 75 73 65 72 73 20 28 73 65 65 20 5c 22  ng users (see \"
57a0: 2d 75 5c 22 29 5c 6e 22 29 3b 0a 09 09 66 70 72  -u\")\n");...fpr
57b0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 61 6e 64 20 72 6f 6f 74 20 64 69 72 65 63    and root direc
57e0: 74 6f 72 69 65 73 20 28 73 65 65 20 5c 22 2d 72  tories (see \"-r
57f0: 5c 22 29 2e 20 20 54 68 65 20 6c 6f 67 20 66 69  \").  The log fi
5800: 6c 65 20 69 73 20 6e 65 76 65 72 5c 6e 22 29 3b  le is never\n");
5810: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5820: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
5830: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 64 20 73          closed s
5840: 6f 20 6c 6f 67 20 72 6f 74 61 74 69 6f 6e 20 77  o log rotation w
5850: 69 74 68 6f 75 74 20 73 74 6f 70 70 69 6e 67 20  ithout stopping 
5860: 74 68 65 20 64 61 65 6d 6f 6e 20 69 73 20 77 69  the daemon is wi
5870: 6c 6c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ll\n");...fprint
5880: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
58a0: 6f 74 20 77 6f 72 6b 2e 20 20 54 68 65 20 76 61  ot work.  The va
58b0: 6c 75 65 20 6f 66 20 5c 22 2d 5c 22 20 69 6e 64  lue of \"-\" ind
58c0: 69 63 61 74 65 73 20 74 68 61 74 20 73 74 61 6e  icates that stan
58d0: 64 61 72 64 20 6f 75 74 70 75 74 5c 6e 22 29 3b  dard output\n");
58e0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
58f0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
5900: 20 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62          should b
5910: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69  e used for loggi
5920: 6e 67 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  ng.  The default
5930: 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 20   is \"%s\".\n", 
5940: 4c 4f 47 5f 46 49 4c 45 29 3b 0a 09 09 66 70 72  LOG_FILE);...fpr
5950: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
5960: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
5970: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 75 20  tput, "      -u 
5980: 28 6f 72 20 2d 2d 75 73 65 72 29 20 73 70 65 63  (or --user) spec
5990: 69 66 69 65 73 20 74 68 65 20 75 73 65 72 20 74  ifies the user t
59a0: 6f 20 73 77 69 74 63 68 20 75 73 65 72 20 49 44  o switch user ID
59b0: 73 20 74 6f 20 62 65 66 6f 72 65 20 73 65 72 76  s to before serv
59c0: 69 63 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72  icing\n");...fpr
59d0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 72 65 71 75 65 73 74 73 2e 20 20 54 68     requests.  Th
5a00: 65 20 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74  e default is not
5a10: 20 63 68 61 6e 67 65 20 75 73 65 72 20 49 44 73   change user IDs
5a20: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
5a30: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
5a40: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5a50: 2c 20 22 20 20 20 20 20 20 2d 72 20 28 6f 72 20  , "      -r (or 
5a60: 2d 2d 72 6f 6f 74 29 20 73 70 65 63 69 66 69 65  --root) specifie
5a70: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
5a80: 74 6f 20 61 63 74 20 61 73 20 74 68 65 20 72 6f  to act as the ro
5a90: 6f 74 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  ot directory for
5aa0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
5ab0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
5ad0: 65 20 66 69 6c 65 20 73 65 72 76 65 72 2e 20 20  e file server.  
5ae0: 49 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69  If this option i
5af0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 63 68 72  s specified, chr
5b00: 6f 6f 74 28 32 29 5c 6e 22 29 3b 0a 09 09 66 70  oot(2)\n");...fp
5b10: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 69 73 20 63 61 6c 6c 65 64 2e 20 20      is called.  
5b40: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 6e  The default is n
5b50: 6f 74 20 63 68 61 6e 67 65 20 72 6f 6f 74 20 64  ot change root d
5b60: 69 72 65 63 74 6f 72 69 65 73 2c 5c 6e 22 29 3b  irectories,\n");
5b70: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5b80: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
5b90: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 73           that is
5ba0: 2c 20 74 68 65 20 5c 22 2f 5c 22 20 64 69 72 65  , the \"/\" dire
5bb0: 63 74 6f 72 79 20 69 73 20 73 68 61 72 65 64 20  ctory is shared 
5bc0: 6f 75 74 2e 20 20 54 68 69 73 20 77 69 6c 6c 5c  out.  This will\
5bd0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5be0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6b               lik
5c00: 65 6c 79 20 62 65 20 61 20 73 65 63 75 72 69 74  ely be a securit
5c10: 79 20 69 73 73 75 65 2c 20 73 6f 20 74 68 69 73  y issue, so this
5c20: 20 6f 70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61   option should a
5c30: 6c 77 61 79 73 5c 6e 22 29 3b 0a 09 09 66 70 72  lways\n");...fpr
5c40: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 62 65 20 75 73 65 64 2e 5c 6e 22 29 3b     be used.\n");
5c70: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ..}...return;.}.
5c80: 0a 2f 2a 20 41 64 64 20 61 20 67 65 74 6f 70 74  ./* Add a getopt
5c90: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69   option */.stati
5ca0: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 67 65 74  c void filed_get
5cb0: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
5cc0: 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20 2a 6f  struct option *o
5cd0: 70 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pt, const char *
5ce0: 6e 61 6d 65 2c 20 69 6e 74 20 68 61 73 5f 61 72  name, int has_ar
5cf0: 67 2c 20 69 6e 74 20 76 61 6c 29 20 7b 0a 09 6f  g, int val) {..o
5d00: 70 74 2d 3e 6e 61 6d 65 20 20 20 20 20 3d 20 6e  pt->name     = n
5d10: 61 6d 65 3b 0a 09 6f 70 74 2d 3e 68 61 73 5f 61  ame;..opt->has_a
5d20: 72 67 20 20 3d 20 68 61 73 5f 61 72 67 3b 0a 09  rg  = has_arg;..
5d30: 6f 70 74 2d 3e 66 6c 61 67 20 20 20 20 20 3d 20  opt->flag     = 
5d40: 4e 55 4c 4c 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20  NULL;..opt->val 
5d50: 20 20 20 20 20 3d 20 76 61 6c 3b 0a 0a 09 72 65       = val;...re
5d60: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f  turn;.}../* Reso
5d70: 6c 76 65 20 61 20 75 73 65 72 6e 61 6d 65 20 74  lve a username t
5d80: 6f 20 61 20 55 49 44 20 2a 2f 0a 73 74 61 74 69  o a UID */.stati
5d90: 63 20 69 6e 74 20 66 69 6c 65 64 5f 75 73 65 72  c int filed_user
5da0: 5f 6c 6f 6f 6b 75 70 28 63 6f 6e 73 74 20 63 68  _lookup(const ch
5db0: 61 72 20 2a 75 73 65 72 2c 20 75 69 64 5f 74 20  ar *user, uid_t 
5dc0: 2a 75 73 65 72 5f 69 64 29 20 7b 0a 09 63 68 61  *user_id) {..cha
5dd0: 72 20 2a 6e 65 78 74 3b 0a 09 75 69 64 5f 74 20  r *next;..uid_t 
5de0: 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 23  user_id_check;.#
5df0: 69 66 6e 64 65 66 20 46 49 4c 45 44 5f 4e 4f 5f  ifndef FILED_NO_
5e00: 47 45 54 50 57 4e 41 4d 0a 09 73 74 72 75 63 74  GETPWNAM..struct
5e10: 20 70 61 73 73 77 64 20 2a 65 6e 74 3b 0a 0a 09   passwd *ent;...
5e20: 65 6e 74 20 3d 20 67 65 74 70 77 6e 61 6d 28 75  ent = getpwnam(u
5e30: 73 65 72 29 3b 0a 09 69 66 20 28 65 6e 74 20 21  ser);..if (ent !
5e40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 75 73 65  = NULL) {...*use
5e50: 72 5f 69 64 20 3d 20 65 6e 74 2d 3e 70 77 5f 75  r_id = ent->pw_u
5e60: 69 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30 29  id;....return(0)
5e70: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 75 73  ;..}.#endif...us
5e80: 65 72 5f 69 64 5f 63 68 65 63 6b 20 3d 20 73 74  er_id_check = st
5e90: 72 74 6f 75 6c 6c 28 75 73 65 72 2c 20 26 6e 65  rtoull(user, &ne
5ea0: 78 74 2c 20 31 30 29 3b 0a 09 69 66 20 28 6e 65  xt, 10);..if (ne
5eb0: 78 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  xt == NULL) {...
5ec0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
5ed0: 69 66 20 28 6e 65 78 74 5b 30 5d 20 21 3d 20 27  if (next[0] != '
5ee0: 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  \0') {...return(
5ef0: 31 29 3b 0a 09 7d 0a 0a 09 2a 75 73 65 72 5f 69  1);..}...*user_i
5f00: 64 20 3d 20 75 73 65 72 5f 69 64 5f 63 68 65 63  d = user_id_chec
5f10: 6b 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  k;...return(0);.
5f20: 7d 0a 0a 2f 2a 20 44 61 65 6d 6f 6e 69 7a 65 20  }../* Daemonize 
5f30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
5f40: 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 76 6f  led_daemonize(vo
5f50: 69 64 29 20 7b 0a 09 70 69 64 5f 74 20 73 65 74  id) {..pid_t set
5f60: 73 69 64 5f 72 65 74 2c 20 66 6f 72 6b 5f 72 65  sid_ret, fork_re
5f70: 74 3b 0a 09 69 6e 74 20 63 68 64 69 72 5f 72 65  t;..int chdir_re
5f80: 74 2c 20 64 75 70 32 5f 72 65 74 3b 0a 09 69 6e  t, dup2_ret;..in
5f90: 74 20 66 64 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b  t fd_in, fd_out;
5fa0: 0a 0a 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63  ...chdir_ret = c
5fb0: 68 64 69 72 28 22 2f 22 29 3b 0a 09 69 66 20 28  hdir("/");..if (
5fc0: 63 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29 20  chdir_ret != 0) 
5fd0: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
5fe0: 7d 0a 0a 09 66 6f 72 6b 5f 72 65 74 20 3d 20 66  }...fork_ret = f
5ff0: 6f 72 6b 28 29 3b 0a 09 69 66 20 28 66 6f 72 6b  ork();..if (fork
6000: 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65  _ret < 0) {...re
6010: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
6020: 20 28 66 6f 72 6b 5f 72 65 74 20 3e 20 30 29 20   (fork_ret > 0) 
6030: 7b 0a 09 09 2f 2a 20 50 61 72 65 6e 74 20 2a 2f  {.../* Parent */
6040: 0a 09 09 77 61 69 74 70 69 64 28 66 6f 72 6b 5f  ...waitpid(fork_
6050: 72 65 74 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  ret, NULL, 0);..
6060: 09 09 65 78 69 74 28 45 58 49 54 5f 53 55 43 43  ..exit(EXIT_SUCC
6070: 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68  ESS);..}.../* Ch
6080: 69 6c 64 20 2a 2f 0a 09 69 66 20 28 66 6f 72 6b  ild */..if (fork
6090: 28 29 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  () != 0) {.../* 
60a0: 43 68 69 6c 64 20 2a 2f 0a 09 09 65 78 69 74 28  Child */...exit(
60b0: 45 58 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09  EXIT_SUCCESS);..
60c0: 7d 0a 0a 09 2f 2a 20 47 72 61 6e 64 20 63 68 69  }.../* Grand chi
60d0: 6c 64 20 2a 2f 0a 09 73 65 74 73 69 64 5f 72 65  ld */..setsid_re
60e0: 74 20 3d 20 73 65 74 73 69 64 28 29 3b 0a 09 69  t = setsid();..i
60f0: 66 20 28 73 65 74 73 69 64 5f 72 65 74 20 3d 3d  f (setsid_ret ==
6100: 20 28 28 70 69 64 5f 74 29 20 2d 31 29 29 20 7b   ((pid_t) -1)) {
6110: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
6120: 0a 0a 09 66 64 5f 69 6e 20 3d 20 6f 70 65 6e 28  ...fd_in = open(
6130: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52  "/dev/null", O_R
6140: 44 4f 4e 4c 59 29 3b 0a 09 66 64 5f 6f 75 74 20  DONLY);..fd_out 
6150: 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c  = open("/dev/nul
6160: 6c 22 2c 20 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09  l", O_WRONLY);..
6170: 69 66 20 28 66 64 5f 69 6e 20 3c 20 30 20 7c 7c  if (fd_in < 0 ||
6180: 20 66 64 5f 6f 75 74 20 3c 20 30 29 20 7b 0a 09   fd_out < 0) {..
6190: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
61a0: 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32  .dup2_ret = dup2
61b0: 28 66 64 5f 69 6e 2c 20 53 54 44 49 4e 5f 46 49  (fd_in, STDIN_FI
61c0: 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32  LENO);..if (dup2
61d0: 5f 72 65 74 20 21 3d 20 53 54 44 49 4e 5f 46 49  _ret != STDIN_FI
61e0: 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e  LENO) {...return
61f0: 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72  (1);..}...dup2_r
6200: 65 74 20 3d 20 64 75 70 32 28 66 64 5f 6f 75 74  et = dup2(fd_out
6210: 2c 20 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29  , STDOUT_FILENO)
6220: 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74 20  ;..if (dup2_ret 
6230: 21 3d 20 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f  != STDOUT_FILENO
6240: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
6250: 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d  ..}...dup2_ret =
6260: 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54   dup2(fd_out, ST
6270: 44 45 52 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69  DERR_FILENO);..i
6280: 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53  f (dup2_ret != S
6290: 54 44 45 52 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a  TDERR_FILENO) {.
62a0: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
62b0: 0a 09 63 6c 6f 73 65 28 66 64 5f 69 6e 29 3b 0a  ..close(fd_in);.
62c0: 09 63 6c 6f 73 65 28 66 64 5f 6f 75 74 29 3b 0a  .close(fd_out);.
62d0: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
62e0: 2f 2a 20 52 75 6e 20 70 72 6f 63 65 73 73 20 2a  /* Run process *
62f0: 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  /.int main(int a
6300: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
6310: 29 20 7b 0a 09 73 74 72 75 63 74 20 6f 70 74 69  ) {..struct opti
6320: 6f 6e 20 6f 70 74 69 6f 6e 73 5b 31 30 5d 3b 0a  on options[10];.
6330: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 69 6e  .const char *bin
6340: 64 5f 61 64 64 72 20 3d 20 42 49 4e 44 5f 41 44  d_addr = BIND_AD
6350: 44 52 2c 20 2a 6e 65 77 72 6f 6f 74 20 3d 20 4e  DR, *newroot = N
6360: 55 4c 4c 2c 20 2a 6c 6f 67 5f 66 69 6c 65 20 3d  ULL, *log_file =
6370: 20 4c 4f 47 5f 46 49 4c 45 3b 0a 09 46 49 4c 45   LOG_FILE;..FILE
6380: 20 2a 6c 6f 67 5f 66 70 3b 0a 09 75 69 64 5f 74   *log_fp;..uid_t
6390: 20 75 73 65 72 20 3d 20 30 3b 0a 09 69 6e 74 20   user = 0;..int 
63a0: 70 6f 72 74 20 3d 20 50 4f 52 54 2c 20 74 68 72  port = PORT, thr
63b0: 65 61 64 5f 63 6f 75 6e 74 20 3d 20 54 48 52 45  ead_count = THRE
63c0: 41 44 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 63  AD_COUNT;..int c
63d0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 43 41 43 48  ache_size = CACH
63e0: 45 5f 53 49 5a 45 3b 0a 09 69 6e 74 20 69 6e 69  E_SIZE;..int ini
63f0: 74 5f 72 65 74 2c 20 63 68 72 6f 6f 74 5f 72 65  t_ret, chroot_re
6400: 74 2c 20 73 65 74 75 69 64 5f 72 65 74 2c 20 6c  t, setuid_ret, l
6410: 6f 6f 6b 75 70 5f 72 65 74 2c 20 63 68 64 69 72  ookup_ret, chdir
6420: 5f 72 65 74 3b 0a 09 69 6e 74 20 73 65 74 75 69  _ret;..int setui
6430: 64 5f 65 6e 61 62 6c 65 64 20 3d 20 30 2c 20 64  d_enabled = 0, d
6440: 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20  aemon_enabled = 
6450: 30 3b 0a 09 69 6e 74 20 63 68 3b 0a 09 69 6e 74  0;..int ch;..int
6460: 20 66 64 3b 0a 0a 09 2f 2a 20 50 72 6f 63 65 73   fd;.../* Proces
6470: 73 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09  s arguments */..
6480: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
6490: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
64a0: 73 5b 30 5d 2c 20 22 70 6f 72 74 22 2c 20 72 65  s[0], "port", re
64b0: 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c  quired_argument,
64c0: 20 27 70 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'p');..filed_ge
64d0: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
64e0: 28 26 6f 70 74 69 6f 6e 73 5b 31 5d 2c 20 22 74  (&options[1], "t
64f0: 68 72 65 61 64 73 22 2c 20 72 65 71 75 69 72 65  hreads", require
6500: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 74 27 29  d_argument, 't')
6510: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
6520: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
6530: 69 6f 6e 73 5b 32 5d 2c 20 22 63 61 63 68 65 22  ions[2], "cache"
6540: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
6550: 65 6e 74 2c 20 27 63 27 29 3b 0a 09 66 69 6c 65  ent, 'c');..file
6560: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
6570: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 33 5d  topt(&options[3]
6580: 2c 20 22 62 69 6e 64 22 2c 20 72 65 71 75 69 72  , "bind", requir
6590: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 62 27  ed_argument, 'b'
65a0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
65b0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
65c0: 74 69 6f 6e 73 5b 34 5d 2c 20 22 75 73 65 72 22  tions[4], "user"
65d0: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
65e0: 65 6e 74 2c 20 27 75 27 29 3b 0a 09 66 69 6c 65  ent, 'u');..file
65f0: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
6600: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 35 5d  topt(&options[5]
6610: 2c 20 22 72 6f 6f 74 22 2c 20 72 65 71 75 69 72  , "root", requir
6620: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 72 27  ed_argument, 'r'
6630: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
6640: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
6650: 74 69 6f 6e 73 5b 36 5d 2c 20 22 68 65 6c 70 22  tions[6], "help"
6660: 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27  , no_argument, '
6670: 68 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  h');..filed_geto
6680: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
6690: 6f 70 74 69 6f 6e 73 5b 37 5d 2c 20 22 64 61 65  options[7], "dae
66a0: 6d 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e  mon", no_argumen
66b0: 74 2c 20 27 64 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'd');..filed_
66c0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
66d0: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 38 5d 2c 20  pt(&options[8], 
66e0: 22 6c 6f 67 22 2c 20 72 65 71 75 69 72 65 64 5f  "log", required_
66f0: 61 72 67 75 6d 65 6e 74 2c 20 27 6c 27 29 3b 0a  argument, 'l');.
6700: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
6710: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
6720: 6e 73 5b 39 5d 2c 20 4e 55 4c 4c 2c 20 30 2c 20  ns[9], NULL, 0, 
6730: 30 29 3b 0a 09 77 68 69 6c 65 20 28 28 63 68 20  0);..while ((ch 
6740: 3d 20 67 65 74 6f 70 74 5f 6c 6f 6e 67 28 61 72  = getopt_long(ar
6750: 67 63 2c 20 61 72 67 76 2c 20 22 70 3a 74 3a 63  gc, argv, "p:t:c
6760: 3a 62 3a 75 3a 72 3a 6c 3a 68 64 22 2c 20 6f 70  :b:u:r:l:hd", op
6770: 74 69 6f 6e 73 2c 20 4e 55 4c 4c 29 29 20 21 3d  tions, NULL)) !=
6780: 20 2d 31 29 20 7b 0a 09 09 73 77 69 74 63 68 28   -1) {...switch(
6790: 63 68 29 20 7b 0a 09 09 09 63 61 73 65 20 27 70  ch) {....case 'p
67a0: 27 3a 0a 09 09 09 09 70 6f 72 74 20 3d 20 61 74  ':.....port = at
67b0: 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09  oi(optarg);.....
67c0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
67d0: 74 27 3a 0a 09 09 09 09 74 68 72 65 61 64 5f 63  t':.....thread_c
67e0: 6f 75 6e 74 20 3d 20 61 74 6f 69 28 6f 70 74 61  ount = atoi(opta
67f0: 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  rg);.....break;.
6800: 09 09 09 63 61 73 65 20 27 63 27 3a 0a 09 09 09  ...case 'c':....
6810: 09 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 61 74  .cache_size = at
6820: 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09  oi(optarg);.....
6830: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
6840: 62 27 3a 0a 09 09 09 09 62 69 6e 64 5f 61 64 64  b':.....bind_add
6850: 72 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72  r = strdup(optar
6860: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
6870: 09 09 63 61 73 65 20 27 75 27 3a 0a 09 09 09 09  ..case 'u':.....
6880: 73 65 74 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d  setuid_enabled =
6890: 20 31 3b 0a 09 09 09 09 6c 6f 6f 6b 75 70 5f 72   1;.....lookup_r
68a0: 65 74 20 3d 20 66 69 6c 65 64 5f 75 73 65 72 5f  et = filed_user_
68b0: 6c 6f 6f 6b 75 70 28 6f 70 74 61 72 67 2c 20 26  lookup(optarg, &
68c0: 75 73 65 72 29 3b 0a 09 09 09 09 69 66 20 28 6c  user);.....if (l
68d0: 6f 6f 6b 75 70 5f 72 65 74 20 21 3d 20 30 29 20  ookup_ret != 0) 
68e0: 7b 0a 09 09 09 09 09 66 69 6c 65 64 5f 70 72 69  {......filed_pri
68f0: 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20  nt_help(stderr, 
6900: 30 2c 20 22 49 6e 76 61 6c 69 64 20 75 73 65 72  0, "Invalid user
6910: 6e 61 6d 65 20 73 70 65 63 69 66 69 65 64 22 29  name specified")
6920: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 31  ;.......return(1
6930: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
6940: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 72 27 3a  ak;....case 'r':
6950: 0a 09 09 09 09 6e 65 77 72 6f 6f 74 20 3d 20 73  .....newroot = s
6960: 74 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09  trdup(optarg);..
6970: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
6980: 65 20 27 6c 27 3a 0a 09 09 09 09 6c 6f 67 5f 66  e 'l':.....log_f
6990: 69 6c 65 20 3d 20 73 74 72 64 75 70 28 6f 70 74  ile = strdup(opt
69a0: 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  arg);.....break;
69b0: 0a 09 09 09 63 61 73 65 20 27 64 27 3a 0a 09 09  ....case 'd':...
69c0: 09 09 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64  ..daemon_enabled
69d0: 20 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b   = 1;.....break;
69e0: 0a 09 09 09 63 61 73 65 20 27 3f 27 3a 0a 09 09  ....case '?':...
69f0: 09 63 61 73 65 20 27 3a 27 3a 0a 09 09 09 09 66  .case ':':.....f
6a00: 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28  iled_print_help(
6a10: 73 74 64 65 72 72 2c 20 30 2c 20 4e 55 4c 4c 29  stderr, 0, NULL)
6a20: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29  ;......return(1)
6a30: 3b 0a 09 09 09 63 61 73 65 20 27 68 27 3a 0a 09  ;....case 'h':..
6a40: 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68  ...filed_print_h
6a50: 65 6c 70 28 73 74 64 6f 75 74 2c 20 31 2c 20 4e  elp(stdout, 1, N
6a60: 55 4c 4c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  ULL);......retur
6a70: 6e 28 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(0);...}..}.../
6a80: 2a 20 4f 70 65 6e 20 6c 6f 67 20 66 69 6c 65 20  * Open log file 
6a90: 2a 2f 0a 09 69 66 20 28 73 74 72 63 6d 70 28 6c  */..if (strcmp(l
6aa0: 6f 67 5f 66 69 6c 65 2c 20 22 2d 22 29 20 3d 3d  og_file, "-") ==
6ab0: 20 30 29 20 7b 0a 09 09 6c 6f 67 5f 66 70 20 3d   0) {...log_fp =
6ac0: 20 73 74 64 6f 75 74 3b 0a 09 7d 20 65 6c 73 65   stdout;..} else
6ad0: 20 7b 0a 09 09 6c 6f 67 5f 66 70 20 3d 20 66 6f   {...log_fp = fo
6ae0: 70 65 6e 28 6c 6f 67 5f 66 69 6c 65 2c 20 22 61  pen(log_file, "a
6af0: 2b 22 29 3b 0a 09 09 69 66 20 28 6c 6f 67 5f 66  +");...if (log_f
6b00: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  p == NULL) {....
6b10: 70 65 72 72 6f 72 28 22 66 6f 70 65 6e 22 29 3b  perror("fopen");
6b20: 0a 0a 09 09 09 72 65 74 75 72 6e 28 34 29 3b 0a  .....return(4);.
6b30: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  ..}..}.../* Crea
6b40: 74 65 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63  te listening soc
6b50: 6b 65 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69 6c  ket */..fd = fil
6b60: 65 64 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f 61  ed_listen(bind_a
6b70: 64 64 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66 20  ddr, port);..if 
6b80: 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 70 65 72  (fd < 0) {...per
6b90: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 69 73 74 65  ror("filed_liste
6ba0: 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  n");....return(1
6bb0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68 72 6f 6f  );..}.../* Chroo
6bc0: 74 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  t, if appropriat
6bd0: 65 20 2a 2f 0a 09 69 66 20 28 6e 65 77 72 6f 6f  e */..if (newroo
6be0: 74 29 20 7b 0a 09 09 63 68 64 69 72 5f 72 65 74  t) {...chdir_ret
6bf0: 20 3d 20 63 68 64 69 72 28 6e 65 77 72 6f 6f 74   = chdir(newroot
6c00: 29 3b 0a 09 09 69 66 20 28 63 68 64 69 72 5f 72  );...if (chdir_r
6c10: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 65  et != 0) {....pe
6c20: 72 72 6f 72 28 22 63 68 64 69 72 22 29 3b 0a 0a  rror("chdir");..
6c30: 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
6c40: 7d 0a 0a 09 09 63 68 72 6f 6f 74 5f 72 65 74 20  }....chroot_ret 
6c50: 3d 20 63 68 72 6f 6f 74 28 22 2e 22 29 3b 0a 09  = chroot(".");..
6c60: 09 69 66 20 28 63 68 72 6f 6f 74 5f 72 65 74 20  .if (chroot_ret 
6c70: 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f  != 0) {....perro
6c80: 72 28 22 63 68 72 6f 6f 74 22 29 3b 0a 0a 09 09  r("chroot");....
6c90: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a  .return(1);...}.
6ca0: 09 7d 0a 0a 09 2f 2a 20 44 72 6f 70 20 70 72 69  .}.../* Drop pri
6cb0: 76 69 6c 65 67 65 73 2c 20 69 66 20 61 70 70 72  vileges, if appr
6cc0: 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66 20 28  opriate */..if (
6cd0: 73 65 74 75 69 64 5f 65 6e 61 62 6c 65 64 29 20  setuid_enabled) 
6ce0: 7b 0a 09 09 73 65 74 75 69 64 5f 72 65 74 20 3d  {...setuid_ret =
6cf0: 20 73 65 74 75 69 64 28 75 73 65 72 29 3b 0a 09   setuid(user);..
6d00: 09 69 66 20 28 73 65 74 75 69 64 5f 72 65 74 20  .if (setuid_ret 
6d10: 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f  != 0) {....perro
6d20: 72 28 22 73 65 74 75 69 64 22 29 3b 0a 0a 09 09  r("setuid");....
6d30: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a  .return(1);...}.
6d40: 09 7d 0a 0a 09 2f 2a 20 42 65 63 6f 6d 65 20 61  .}.../* Become a
6d50: 20 64 61 65 6d 6f 6e 20 2a 2f 0a 09 69 66 20 28   daemon */..if (
6d60: 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 29 20  daemon_enabled) 
6d70: 7b 0a 09 09 66 69 6c 65 64 5f 64 61 65 6d 6f 6e  {...filed_daemon
6d80: 69 7a 65 28 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49  ize();..}.../* I
6d90: 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 09 69 6e  nitialize */..in
6da0: 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 69  it_ret = filed_i
6db0: 6e 69 74 28 63 61 63 68 65 5f 73 69 7a 65 29 3b  nit(cache_size);
6dc0: 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21  ..if (init_ret !
6dd0: 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28  = 0) {...perror(
6de0: 22 66 69 6c 65 64 5f 69 6e 69 74 22 29 3b 0a 0a  "filed_init");..
6df0: 09 09 72 65 74 75 72 6e 28 33 29 3b 0a 09 7d 0a  ..return(3);..}.
6e00: 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c 6f 67 67  ../* Create logg
6e10: 69 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a 09 69  ing thread */..i
6e20: 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  nit_ret = filed_
6e30: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69  logging_thread_i
6e40: 6e 69 74 28 6c 6f 67 5f 66 70 29 3b 0a 09 69 66  nit(log_fp);..if
6e50: 20 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29   (init_ret != 0)
6e60: 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c   {...perror("fil
6e70: 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61  ed_logging_threa
6e80: 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74  d_init");....ret
6e90: 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  urn(4);..}.../* 
6ea0: 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20 74 68  Create worker th
6eb0: 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69 74 5f 72  reads */..init_r
6ec0: 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f 72 6b 65  et = filed_worke
6ed0: 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28 66  r_threads_init(f
6ee0: 64 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 29  d, thread_count)
6ef0: 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20  ;..if (init_ret 
6f00: 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72  != 0) {...perror
6f10: 28 22 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74  ("filed_worker_t
6f20: 68 72 65 61 64 73 5f 69 6e 69 74 22 29 3b 0a 0a  hreads_init");..
6f30: 09 09 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a  ..return(4);..}.
6f40: 0a 09 2f 2a 20 57 61 69 74 20 66 6f 72 20 74 68  ../* Wait for th
6f50: 72 65 61 64 73 20 74 6f 20 65 78 69 74 20 2a 2f  reads to exit */
6f60: 0a 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4d  ../* XXX:TODO: M
6f70: 6f 6e 69 74 6f 72 20 74 68 72 65 61 64 20 75 73  onitor thread us
6f80: 61 67 65 20 2a 2f 0a 09 77 68 69 6c 65 20 28 31  age */..while (1
6f90: 29 20 7b 0a 09 09 73 6c 65 65 70 28 36 30 29 3b  ) {...sleep(60);
6fa0: 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74 75 72 6e 20  ..}.../* Return 
6fb0: 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 72  in failure */..r
6fc0: 65 74 75 72 6e 28 32 29 3b 0a 7d 0a              eturn(2);.}.