Hex Artifact Content

Artifact 1e9ce665310952023c1dde56ada66a4f4d80fa87:


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: 3b 0a 09 69 6e 74 20 70 74 6f 6e 5f 72 65 74 2c  ;..int pton_ret,
0c90: 20 62 69 6e 64 5f 72 65 74 2c 20 6c 69 73 74 65   bind_ret, liste
0ca0: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 66 64 3b 0a  n_ret;..int fd;.
0cb0: 0a 09 61 64 64 72 2e 73 69 6e 36 5f 66 61 6d 69  ..addr.sin6_fami
0cc0: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09  ly = AF_INET6;..
0cd0: 61 64 64 72 2e 73 69 6e 36 5f 66 6c 6f 77 69 6e  addr.sin6_flowin
0ce0: 66 6f 20 3d 20 30 3b 0a 09 61 64 64 72 2e 73 69  fo = 0;..addr.si
0cf0: 6e 36 5f 73 63 6f 70 65 5f 69 64 20 3d 20 30 3b  n6_scope_id = 0;
0d00: 0a 09 61 64 64 72 2e 73 69 6e 36 5f 70 6f 72 74  ..addr.sin6_port
0d10: 20 3d 20 68 74 6f 6e 73 28 70 6f 72 74 29 3b 0a   = htons(port);.
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 41 46 5f 49 4e 45 54 36 2c 20  _pton(AF_INET6, 
0d40: 61 64 64 72 65 73 73 2c 20 61 64 64 72 2e 73 69  address, addr.si
0d50: 6e 36 5f 61 64 64 72 2e 73 36 5f 61 64 64 72 29  n6_addr.s6_addr)
0d60: 3b 0a 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20  ;..if (pton_ret 
0d70: 21 3d 20 31 29 20 7b 0a 09 09 72 65 74 75 72 6e  != 1) {...return
0d80: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 66 64 20 3d 20  (-1);..}...fd = 
0d90: 73 6f 63 6b 65 74 28 41 46 5f 49 4e 45 54 36 2c  socket(AF_INET6,
0da0: 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29   SOCK_STREAM, 0)
0db0: 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b  ;..if (fd < 0) {
0dc0: 0a 09 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09  ...return(fd);..
0dd0: 7d 0a 0a 09 62 69 6e 64 5f 72 65 74 20 3d 20 62  }...bind_ret = b
0de0: 69 6e 64 28 66 64 2c 20 28 63 6f 6e 73 74 20 73  ind(fd, (const s
0df0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
0e00: 29 20 26 61 64 64 72 2c 20 73 69 7a 65 6f 66 28  ) &addr, sizeof(
0e10: 61 64 64 72 29 29 3b 0a 09 69 66 20 28 62 69 6e  addr));..if (bin
0e20: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 63  d_ret < 0) {...c
0e30: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74  lose(fd);....ret
0e40: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6c 69  urn(-1);..}...li
0e50: 73 74 65 6e 5f 72 65 74 20 3d 20 6c 69 73 74 65  sten_ret = liste
0e60: 6e 28 66 64 2c 20 31 32 38 29 3b 0a 09 69 66 20  n(fd, 128);..if 
0e70: 28 6c 69 73 74 65 6e 5f 72 65 74 20 21 3d 20 30  (listen_ret != 0
0e80: 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b  ) {...close(fd);
0e90: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
0ea0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b  .}...return(fd);
0eb0: 0a 7d 0a 0a 2f 2a 20 4c 6f 67 20 61 20 6d 65 73  .}../* Log a mes
0ec0: 73 61 67 65 20 2a 2f 0a 23 69 66 64 65 66 20 46  sage */.#ifdef F
0ed0: 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 23 20  ILED_DONT_LOG.# 
0ee0: 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f   define filed_lo
0ef0: 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69  gging_thread_ini
0f00: 74 28 78 29 20 30 0a 23 20 20 64 65 66 69 6e 65  t(x) 0.#  define
0f10: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64   filed_log_msg_d
0f20: 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a  ebug(x, ...) /**
0f30: 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  /.#  define file
0f40: 64 5f 6c 6f 67 5f 6d 73 67 28 78 2c 20 2e 2e 2e  d_log_msg(x, ...
0f50: 29 20 2f 2a 2a 2f 0a 23 65 6c 73 65 0a 23 69 66  ) /**/.#else.#if
0f60: 64 65 66 20 46 49 4c 45 44 5f 44 45 42 55 47 0a  def FILED_DEBUG.
0f70: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
0f80: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c  log_msg_debug(x,
0f90: 20 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28   ...) { fprintf(
0fa0: 73 74 64 65 72 72 2c 20 78 2c 20 5f 5f 56 41 5f  stderr, x, __VA_
0fb0: 41 52 47 53 5f 5f 29 3b 20 66 70 72 69 6e 74 66  ARGS__); fprintf
0fc0: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20  (stderr, "\n"); 
0fd0: 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20  fflush(stderr); 
0fe0: 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
0ff0: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  e filed_log_msg_
1000: 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a  debug(x, ...) /*
1010: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e  */.#endif../* In
1020: 69 74 69 61 6c 69 7a 65 20 6c 6f 67 67 69 6e 67  itialize logging
1030: 20 74 68 72 65 61 64 20 2a 2f 0a 73 74 61 74 69   thread */.stati
1040: 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 6c 6f  c void *filed_lo
1050: 67 67 69 6e 67 5f 74 68 72 65 61 64 28 76 6f 69  gging_thread(voi
1060: 64 20 2a 61 72 67 5f 70 29 20 7b 0a 09 73 74 72  d *arg_p) {..str
1070: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  uct filed_loggin
1080: 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61  g_thread_args *a
1090: 72 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  rg;..struct file
10a0: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 63 75 72  d_log_entry *cur
10b0: 72 2c 20 2a 70 72 65 76 3b 0a 09 46 49 4c 45 20  r, *prev;..FILE 
10c0: 2a 66 70 3b 0a 0a 09 61 72 67 20 3d 20 61 72 67  *fp;...arg = arg
10d0: 5f 70 3b 0a 0a 09 66 70 20 3d 20 61 72 67 2d 3e  _p;...fp = arg->
10e0: 66 70 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20  fp;...while (1) 
10f0: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
1100: 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f  x_lock(&filed_lo
1110: 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78  g_msg_list_mutex
1120: 29 3b 0a 09 09 70 74 68 72 65 61 64 5f 63 6f 6e  );...pthread_con
1130: 64 5f 77 61 69 74 28 26 66 69 6c 65 64 5f 6c 6f  d_wait(&filed_lo
1140: 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64 79  g_msg_list_ready
1150: 2c 20 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  , &filed_log_msg
1160: 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09  _list_mutex);...
1170: 09 63 75 72 72 20 3d 20 66 69 6c 65 64 5f 6c 6f  .curr = filed_lo
1180: 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 09 66 69  g_msg_list;...fi
1190: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
11a0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 70 74 68 72   = NULL;....pthr
11b0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
11c0: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
11d0: 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 09  list_mutex);....
11e0: 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 09 66  prev = NULL;...f
11f0: 6f 72 20 28 3b 20 63 75 72 72 3b 20 63 75 72 72  or (; curr; curr
1200: 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20   = curr->_next) 
1210: 7b 0a 09 09 09 63 75 72 72 2d 3e 5f 70 72 65 76  {....curr->_prev
1220: 20 3d 20 70 72 65 76 3b 0a 0a 09 09 09 70 72 65   = prev;.....pre
1230: 76 20 3d 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09  v = curr;...}...
1240: 09 63 75 72 72 20 3d 20 70 72 65 76 3b 0a 09 09  .curr = prev;...
1250: 77 68 69 6c 65 20 28 63 75 72 72 29 20 7b 0a 09  while (curr) {..
1260: 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25  ..fprintf(fp, "%
1270: 73 20 54 48 52 45 41 44 3d 25 6c 6c 75 5c 6e 22  s THREAD=%llu\n"
1280: 2c 20 63 75 72 72 2d 3e 62 75 66 66 65 72 2c 20  , curr->buffer, 
1290: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
12a0: 6f 6e 67 29 20 63 75 72 72 2d 3e 74 68 72 65 61  ong) curr->threa
12b0: 64 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70  d);....fflush(fp
12c0: 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75  );.....prev = cu
12d0: 72 72 3b 0a 09 09 09 63 75 72 72 20 3d 20 63 75  rr;....curr = cu
12e0: 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09 09 66  rr->_prev;.....f
12f0: 72 65 65 28 70 72 65 76 29 3b 0a 09 09 7d 0a 09  ree(prev);...}..
1300: 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  }...return(NULL)
1310: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1320: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
1330: 72 65 61 64 5f 69 6e 69 74 28 46 49 4c 45 20 2a  read_init(FILE *
1340: 6c 6f 67 66 70 29 20 7b 0a 09 73 74 72 75 63 74  logfp) {..struct
1350: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
1360: 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 73  hread_args *args
1370: 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72  ;..pthread_t thr
1380: 65 61 64 5f 69 64 3b 0a 0a 09 61 72 67 73 20 3d  ead_id;...args =
1390: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
13a0: 61 72 67 73 29 29 3b 0a 09 61 72 67 73 2d 3e 66  args));..args->f
13b0: 70 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66 69 6c  p = logfp;...fil
13c0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20  ed_log_msg_list 
13d0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72 65 61  = NULL;...pthrea
13e0: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 66 69  d_mutex_init(&fi
13f0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
1400: 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 0a  _mutex, NULL);..
1410: 09 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28  .pthread_create(
1420: 26 74 68 72 65 61 64 5f 69 64 2c 20 4e 55 4c 4c  &thread_id, NULL
1430: 2c 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  , filed_logging_
1440: 74 68 72 65 61 64 2c 20 61 72 67 73 29 3b 0a 0a  thread, args);..
1450: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
1460: 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64  tatic void filed
1470: 5f 6c 6f 67 5f 6d 73 67 28 63 6f 6e 73 74 20 63  _log_msg(const c
1480: 68 61 72 20 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b  har *fmt, ...) {
1490: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
14a0: 6f 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b  og_entry *entry;
14b0: 0a 09 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a  ..va_list args;.
14c0: 0a 09 65 6e 74 72 79 20 3d 20 6d 61 6c 6c 6f 63  ..entry = malloc
14d0: 28 73 69 7a 65 6f 66 28 2a 65 6e 74 72 79 29 29  (sizeof(*entry))
14e0: 3b 0a 0a 09 76 61 5f 73 74 61 72 74 28 61 72 67  ;...va_start(arg
14f0: 73 2c 20 66 6d 74 29 3b 0a 0a 09 76 73 6e 70 72  s, fmt);...vsnpr
1500: 69 6e 74 66 28 65 6e 74 72 79 2d 3e 62 75 66 66  intf(entry->buff
1510: 65 72 2c 20 73 69 7a 65 6f 66 28 65 6e 74 72 79  er, sizeof(entry
1520: 2d 3e 62 75 66 66 65 72 29 2c 20 66 6d 74 2c 20  ->buffer), fmt, 
1530: 61 72 67 73 29 3b 0a 0a 09 76 61 5f 65 6e 64 28  args);...va_end(
1540: 61 72 67 73 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e  args);...entry->
1550: 74 68 72 65 61 64 20 3d 20 70 74 68 72 65 61 64  thread = pthread
1560: 5f 73 65 6c 66 28 29 3b 0a 09 65 6e 74 72 79 2d  _self();..entry-
1570: 3e 6c 65 76 65 6c 20 3d 20 30 3b 0a 0a 09 70 74  >level = 0;...pt
1580: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
1590: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
15a0: 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 65  list_mutex);...e
15b0: 6e 74 72 79 2d 3e 5f 6e 65 78 74 20 3d 20 66 69  ntry->_next = fi
15c0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
15d0: 3b 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ;..filed_log_msg
15e0: 5f 6c 69 73 74 20 3d 20 65 6e 74 72 79 3b 0a 0a  _list = entry;..
15f0: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  .pthread_mutex_u
1600: 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67  nlock(&filed_log
1610: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
1620: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 6f 6e 64  ;...pthread_cond
1630: 5f 73 69 67 6e 61 6c 28 26 66 69 6c 65 64 5f 6c  _signal(&filed_l
1640: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64  og_msg_list_read
1650: 79 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  y);...return;.}.
1660: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 6d 61  #endif../* Forma
1670: 74 20 74 69 6d 65 20 70 65 72 20 52 46 43 32 36  t time per RFC26
1680: 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  16 */.static cha
1690: 72 20 2a 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f  r *filed_format_
16a0: 74 69 6d 65 28 63 68 61 72 20 2a 62 75 66 66 65  time(char *buffe
16b0: 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72  r, size_t buffer
16c0: 5f 6c 65 6e 2c 20 63 6f 6e 73 74 20 74 69 6d 65  _len, const time
16d0: 5f 74 20 74 69 6d 65 69 6e 66 6f 29 20 7b 0a 09  _t timeinfo) {..
16e0: 73 74 72 75 63 74 20 74 6d 20 74 69 6d 65 69 6e  struct tm timein
16f0: 66 6f 5f 74 6d 2c 20 2a 74 69 6d 65 69 6e 66 6f  fo_tm, *timeinfo
1700: 5f 74 6d 5f 70 3b 0a 0a 09 74 69 6d 65 69 6e 66  _tm_p;...timeinf
1710: 6f 5f 74 6d 5f 70 20 3d 20 67 6d 74 69 6d 65 5f  o_tm_p = gmtime_
1720: 72 28 26 74 69 6d 65 69 6e 66 6f 2c 20 26 74 69  r(&timeinfo, &ti
1730: 6d 65 69 6e 66 6f 5f 74 6d 29 3b 0a 09 69 66 20  meinfo_tm);..if 
1740: 28 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d  (timeinfo_tm_p =
1750: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1760: 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a 09  rn("unknown");..
1770: 7d 0a 0a 09 62 75 66 66 65 72 5b 62 75 66 66 65  }...buffer[buffe
1780: 72 5f 6c 65 6e 20 2d 20 31 5d 20 3d 20 27 5c 30  r_len - 1] = '\0
1790: 27 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d  ';..buffer_len =
17a0: 20 73 74 72 66 74 69 6d 65 28 62 75 66 66 65 72   strftime(buffer
17b0: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31  , buffer_len - 1
17c0: 2c 20 22 25 61 2c 20 25 64 20 25 62 20 25 59 20  , "%a, %d %b %Y 
17d0: 25 48 3a 25 4d 3a 25 53 20 47 4d 54 22 2c 20 74  %H:%M:%S GMT", t
17e0: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 29 3b 0a 0a  imeinfo_tm_p);..
17f0: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b  .return(buffer);
1800: 0a 7d 0a 0a 2f 2a 20 68 61 73 68 20 2a 2f 0a 73  .}../* hash */.s
1810: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
1820: 6e 74 20 66 69 6c 65 64 5f 68 61 73 68 28 63 6f  nt filed_hash(co
1830: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1840: 72 20 2a 76 61 6c 75 65 2c 20 75 6e 73 69 67 6e  r *value, unsign
1850: 65 64 20 69 6e 74 20 6d 6f 64 75 6c 75 73 29 20  ed int modulus) 
1860: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
1870: 20 63 75 72 72 2c 20 70 72 65 76 3b 0a 09 69 6e   curr, prev;..in
1880: 74 20 64 69 66 66 3b 0a 09 75 6e 73 69 67 6e 65  t diff;..unsigne
1890: 64 20 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09  d int retval;...
18a0: 72 65 74 76 61 6c 20 3d 20 6d 6f 64 75 6c 75 73  retval = modulus
18b0: 20 2d 20 31 3b 0a 09 70 72 65 76 20 3d 20 6d 6f   - 1;..prev = mo
18c0: 64 75 6c 75 73 20 25 20 32 35 35 3b 0a 0a 09 77  dulus % 255;...w
18d0: 68 69 6c 65 20 28 28 63 75 72 72 20 3d 20 2a 76  hile ((curr = *v
18e0: 61 6c 75 65 29 29 20 7b 0a 09 09 69 66 20 28 63  alue)) {...if (c
18f0: 75 72 72 20 3c 20 33 32 29 20 7b 0a 09 09 09 63  urr < 32) {....c
1900: 75 72 72 20 3d 20 32 35 35 20 2d 20 63 75 72 72  urr = 255 - curr
1910: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1920: 63 75 72 72 20 2d 3d 20 33 32 3b 0a 09 09 7d 0a  curr -= 32;...}.
1930: 0a 09 09 69 66 20 28 70 72 65 76 20 3c 20 63 75  ...if (prev < cu
1940: 72 72 29 20 7b 0a 09 09 09 64 69 66 66 20 3d 20  rr) {....diff = 
1950: 63 75 72 72 20 2d 20 70 72 65 76 3b 0a 09 09 7d  curr - prev;...}
1960: 20 65 6c 73 65 20 7b 0a 09 09 09 64 69 66 66 20   else {....diff 
1970: 3d 20 70 72 65 76 20 2d 20 63 75 72 72 3b 0a 09  = prev - curr;..
1980: 09 7d 0a 0a 09 09 70 72 65 76 20 3d 20 63 75 72  .}....prev = cur
1990: 72 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3c 3c 3d  r;....retval <<=
19a0: 20 33 3b 0a 09 09 72 65 74 76 61 6c 20 26 3d 20   3;...retval &= 
19b0: 30 78 46 46 46 46 46 46 46 46 4c 55 3b 0a 09 09  0xFFFFFFFFLU;...
19c0: 72 65 74 76 61 6c 20 5e 3d 20 64 69 66 66 3b 0a  retval ^= diff;.
19d0: 0a 09 09 76 61 6c 75 65 2b 2b 3b 0a 09 7d 0a 0a  ...value++;..}..
19e0: 09 72 65 74 76 61 6c 20 3d 20 72 65 74 76 61 6c  .retval = retval
19f0: 20 25 20 6d 6f 64 75 6c 75 73 3b 0a 0a 09 72 65   % modulus;...re
1a00: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
1a10: 0a 2f 2a 20 46 69 6e 64 20 61 20 6d 69 6d 65 2d  ./* Find a mime-
1a20: 74 79 70 65 20 62 61 73 65 64 20 6f 6e 20 74 68  type based on th
1a30: 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74  e filename */.st
1a40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1a50: 2a 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65  *filed_determine
1a60: 5f 6d 69 6d 65 74 79 70 65 28 63 6f 6e 73 74 20  _mimetype(const 
1a70: 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 09 63  char *path) {..c
1a80: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 0a 09  onst char *p;...
1a90: 70 20 3d 20 73 74 72 72 63 68 72 28 70 61 74 68  p = strrchr(path
1aa0: 2c 20 27 2e 27 29 3b 0a 09 69 66 20 28 70 20 3d  , '.');..if (p =
1ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1ac0: 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54  rn(FILED_DEFAULT
1ad0: 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 70 2b 2b  _TYPE);..}...p++
1ae0: 3b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 27 5c 30  ;..if (*p == '\0
1af0: 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 46 49  ') {...return(FI
1b00: 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45  LED_DEFAULT_TYPE
1b10: 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f  );..}...filed_lo
1b20: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f 6f  g_msg_debug("Loo
1b30: 6b 69 6e 67 20 75 70 20 4d 49 4d 45 20 74 79 70  king up MIME typ
1b40: 65 20 66 6f 72 20 25 73 20 28 68 61 73 68 20 3d  e for %s (hash =
1b50: 20 25 6c 6c 75 29 22 2c 20 70 2c 20 28 75 6e 73   %llu)", p, (uns
1b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
1b70: 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f 6e   filed_hash((con
1b80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b90: 20 2a 29 20 70 2c 20 31 36 37 37 37 32 35 39 29   *) p, 16777259)
1ba0: 29 3b 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 69  );..#include "fi
1bb0: 6c 65 64 2d 6d 69 6d 65 2d 74 79 70 65 73 2e 68  led-mime-types.h
1bc0: 22 0a 0a 09 72 65 74 75 72 6e 28 46 49 4c 45 44  "...return(FILED
1bd0: 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a  _DEFAULT_TYPE);.
1be0: 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c  }../* Open a fil
1bf0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 66 69 6c  e and return fil
1c00: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
1c10: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 66  .static struct f
1c20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66  iled_fileinfo *f
1c30: 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 63  iled_open_file(c
1c40: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
1c50: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69   struct filed_fi
1c60: 6c 65 69 6e 66 6f 20 2a 62 75 66 66 65 72 29 20  leinfo *buffer) 
1c70: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
1c80: 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b  fileinfo *cache;
1c90: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63  ..unsigned int c
1ca0: 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f 74  ache_idx;..off_t
1cb0: 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a   len;..int fd;..
1cc0: 09 63 61 63 68 65 5f 69 64 78 20 3d 20 66 69 6c  .cache_idx = fil
1cd0: 65 64 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75  ed_hash((const u
1ce0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1cf0: 70 61 74 68 2c 20 66 69 6c 65 64 5f 66 69 6c 65  path, filed_file
1d00: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
1d10: 65 29 3b 0a 0a 09 63 61 63 68 65 20 3d 20 26 66  e);...cache = &f
1d20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1d30: 63 61 63 68 65 5b 63 61 63 68 65 5f 69 64 78 5d  cache[cache_idx]
1d40: 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ;...filed_log_ms
1d50: 67 5f 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67  g_debug("Locking
1d60: 20 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20   mutex for idx: 
1d70: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
1d80: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29  long) cache_idx)
1d90: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ;...pthread_mute
1da0: 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  x_lock(&cache->m
1db0: 75 74 65 78 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c  utex);...filed_l
1dc0: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f  og_msg_debug("Co
1dd0: 6d 70 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20  mpleted locking 
1de0: 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25  mutex for idx: %
1df0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
1e00: 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b  ong) cache_idx);
1e10: 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 70 61  ...if (strcmp(pa
1e20: 74 68 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 29  th, cache->path)
1e30: 20 21 3d 20 30 29 20 7b 0a 09 09 66 69 6c 65 64   != 0) {...filed
1e40: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
1e50: 43 61 63 68 65 20 6d 69 73 73 20 66 6f 72 20 69  Cache miss for i
1e60: 64 78 3a 20 25 6c 75 3a 20 4f 4c 44 20 5c 22 25  dx: %lu: OLD \"%
1e70: 73 5c 22 2c 20 4e 45 57 20 5c 22 25 73 5c 22 22  s\", NEW \"%s\""
1e80: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1e90: 29 20 63 61 63 68 65 5f 69 64 78 2c 20 63 61 63  ) cache_idx, cac
1ea0: 68 65 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b  he->path, path);
1eb0: 0a 0a 09 09 66 64 20 3d 20 6f 70 65 6e 28 70 61  ....fd = open(pa
1ec0: 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 20 7c 20 4f  th, O_RDONLY | O
1ed0: 5f 4c 41 52 47 45 46 49 4c 45 29 3b 0a 09 09 69  _LARGEFILE);...i
1ee0: 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 09  f (fd < 0) {....
1ef0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
1f00: 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74  lock(&cache->mut
1f10: 65 78 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ex);.....return(
1f20: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 72  NULL);...}....fr
1f30: 65 65 28 63 61 63 68 65 2d 3e 70 61 74 68 29 3b  ee(cache->path);
1f40: 0a 09 09 69 66 20 28 63 61 63 68 65 2d 3e 66 64  ...if (cache->fd
1f50: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 63 6c 6f 73   >= 0) {....clos
1f60: 65 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09  e(cache->fd);...
1f70: 7d 0a 0a 09 09 6c 65 6e 20 3d 20 6c 73 65 65 6b  }....len = lseek
1f80: 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (fd, 0, SEEK_END
1f90: 29 3b 0a 09 09 6c 73 65 65 6b 28 66 64 2c 20 30  );...lseek(fd, 0
1fa0: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 09 09  , SEEK_SET);....
1fb0: 63 61 63 68 65 2d 3e 66 64 20 3d 20 66 64 3b 0a  cache->fd = fd;.
1fc0: 09 09 63 61 63 68 65 2d 3e 6c 65 6e 20 3d 20 6c  ..cache->len = l
1fd0: 65 6e 3b 0a 09 09 63 61 63 68 65 2d 3e 70 61 74  en;...cache->pat
1fe0: 68 20 3d 20 73 74 72 64 75 70 28 70 61 74 68 29  h = strdup(path)
1ff0: 3b 0a 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20  ;...cache->type 
2000: 3d 20 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e  = filed_determin
2010: 65 5f 6d 69 6d 65 74 79 70 65 28 70 61 74 68 29  e_mimetype(path)
2020: 3b 0a 0a 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f  ;..../* XXX:TODO
2030: 3a 20 44 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09  : Determine */..
2040: 09 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20  .cache->lastmod 
2050: 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74  = filed_format_t
2060: 69 6d 65 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d  ime(cache->lastm
2070: 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 63 61 63  od_b, sizeof(cac
2080: 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20  he->lastmod_b), 
2090: 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29  time(NULL) - 30)
20a0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69  ;..} else {...fi
20b0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
20c0: 67 28 22 43 61 63 68 65 20 68 69 74 20 66 6f 72  g("Cache hit for
20d0: 20 69 64 78 3a 20 25 6c 75 3a 20 50 41 54 48 20   idx: %lu: PATH 
20e0: 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e  \"%s\"", (unsign
20f0: 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69  ed long) cache_i
2100: 64 78 2c 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09  dx, path);..}...
2110: 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76 65 20 74  /*.. * We have t
2120: 6f 20 6d 61 6b 65 20 61 20 64 75 70 6c 69 63 61  o make a duplica
2130: 74 65 20 46 44 2c 20 62 65 63 61 75 73 65 20 6f  te FD, because o
2140: 6e 63 65 20 77 65 20 72 65 6c 65 61 73 65 20 74  nce we release t
2150: 68 65 20 63 61 63 68 65 0a 09 20 2a 20 6d 75 74  he cache.. * mut
2160: 65 78 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  ex, the file des
2170: 63 72 69 70 74 6f 72 20 6d 61 79 20 62 65 20 63  criptor may be c
2180: 6c 6f 73 65 64 0a 09 20 2a 2f 0a 09 66 64 20 3d  losed.. */..fd =
2190: 20 64 75 70 28 63 61 63 68 65 2d 3e 66 64 29 3b   dup(cache->fd);
21a0: 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a  ..if (fd < 0) {.
21b0: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
21c0: 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  unlock(&cache->m
21d0: 75 74 65 78 29 3b 0a 0a 09 09 72 65 74 75 72 6e  utex);....return
21e0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
21f0: 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 62  fer->fd = fd;..b
2200: 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63 61 63  uffer->len = cac
2210: 68 65 2d 3e 6c 65 6e 3b 0a 09 62 75 66 66 65 72  he->len;..buffer
2220: 2d 3e 74 79 70 65 20 3d 20 63 61 63 68 65 2d 3e  ->type = cache->
2230: 74 79 70 65 3b 0a 09 6d 65 6d 63 70 79 28 62 75  type;..memcpy(bu
2240: 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c  ffer->lastmod_b,
2250: 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f   cache->lastmod_
2260: 62 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  b, sizeof(buffer
2270: 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29 3b 0a 09  ->lastmod_b));..
2280: 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 20  buffer->lastmod 
2290: 3d 20 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f  = buffer->lastmo
22a0: 64 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e 6c 61  d_b + (cache->la
22b0: 73 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d 3e 6c  stmod - cache->l
22c0: 61 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 70 74 68  astmod_b);...pth
22d0: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
22e0: 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29  k(&cache->mutex)
22f0: 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65  ;...return(buffe
2300: 72 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f 63 65 73  r);.}../* Proces
2310: 73 20 61 6e 20 48 54 54 50 20 72 65 71 75 65 73  s an HTTP reques
2320: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
2330: 20 70 61 74 68 20 72 65 71 75 65 73 74 65 64 20   path requested 
2340: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2350: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
2360: 65 73 74 20 2a 66 69 6c 65 64 5f 67 65 74 5f 68  est *filed_get_h
2370: 74 74 70 5f 72 65 71 75 65 73 74 28 46 49 4c 45  ttp_request(FILE
2380: 20 2a 66 70 2c 20 73 74 72 75 63 74 20 66 69 6c   *fp, struct fil
2390: 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20  ed_http_request 
23a0: 2a 62 75 66 66 65 72 5f 73 74 29 20 7b 0a 09 63  *buffer_st) {..c
23b0: 68 61 72 20 2a 6d 65 74 68 6f 64 2c 20 2a 70 61  har *method, *pa
23c0: 74 68 3b 0a 09 63 68 61 72 20 2a 62 75 66 66 65  th;..char *buffe
23d0: 72 2c 20 2a 74 6d 70 62 75 66 66 65 72 2c 20 2a  r, *tmpbuffer, *
23e0: 77 6f 72 6b 62 75 66 66 65 72 2c 20 2a 77 6f 72  workbuffer, *wor
23f0: 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 09 73  kbuffer_next;..s
2400: 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
2410: 2c 20 74 6d 70 62 75 66 66 65 72 5f 6c 65 6e 3b  , tmpbuffer_len;
2420: 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65 5f 73 74  ..off_t range_st
2430: 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e 64 2c 20  art, range_end, 
2440: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 09 69  range_length;..i
2450: 6e 74 20 72 61 6e 67 65 5f 72 65 71 75 65 73 74  nt range_request
2460: 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 69 6e 74 20  ;..int fd;..int 
2470: 69 3b 0a 0a 09 66 64 20 3d 20 66 69 6c 65 6e 6f  i;...fd = fileno
2480: 28 66 70 29 3b 0a 0a 09 72 61 6e 67 65 5f 73 74  (fp);...range_st
2490: 61 72 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f  art = 0;..range_
24a0: 65 6e 64 20 20 20 3d 20 30 3b 0a 09 72 61 6e 67  end   = 0;..rang
24b0: 65 5f 72 65 71 75 65 73 74 20 3d 20 30 3b 0a 09  e_request = 0;..
24c0: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 2d  range_length = -
24d0: 31 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 62 75  1;...buffer = bu
24e0: 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 5f 62 3b  ffer_st->path_b;
24f0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73  ..buffer_len = s
2500: 69 7a 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d  izeof(buffer_st-
2510: 3e 70 61 74 68 5f 62 29 3b 0a 0a 09 74 6d 70 62  >path_b);...tmpb
2520: 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73  uffer = buffer_s
2530: 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 74 6d 70 62  t->tmpbuf;..tmpb
2540: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
2550: 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d  of(buffer_st->tm
2560: 70 62 75 66 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c  pbuf);...filed_l
2570: 6f 67 5f 6d 73 67 28 22 57 41 49 54 5f 46 4f 52  og_msg("WAIT_FOR
2580: 5f 52 45 51 55 45 53 54 20 46 44 3d 25 69 22 2c  _REQUEST FD=%i",
2590: 20 66 64 29 3b 0a 0a 09 66 67 65 74 73 28 62 75   fd);...fgets(bu
25a0: 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e  ffer, buffer_len
25b0: 2c 20 66 70 29 3b 0a 0a 09 6d 65 74 68 6f 64 20  , fp);...method 
25c0: 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75 66 66  = buffer;...buff
25d0: 65 72 20 3d 20 73 74 72 63 68 72 28 62 75 66 66  er = strchr(buff
25e0: 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20 28 62  er, ' ');..if (b
25f0: 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  uffer == NULL) {
2600: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
2610: 28 22 47 4f 54 5f 52 45 51 55 45 53 54 20 46 44  ("GOT_REQUEST FD
2620: 3d 25 69 20 45 52 52 4f 52 3d 66 6f 72 6d 61 74  =%i ERROR=format
2630: 22 2c 20 66 64 29 3b 0a 0a 09 09 72 65 74 75 72  ", fd);....retur
2640: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 62  n(NULL);..}...*b
2650: 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09 62  uffer = '\0';..b
2660: 75 66 66 65 72 2b 2b 3b 0a 0a 09 70 61 74 68 20  uffer++;...path 
2670: 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75 66 66  = buffer;...buff
2680: 65 72 20 3d 20 73 74 72 63 68 72 28 62 75 66 66  er = strchr(buff
2690: 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20 28 62  er, ' ');..if (b
26a0: 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  uffer != NULL) {
26b0: 0a 09 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30  ...*buffer = '\0
26c0: 27 3b 0a 09 09 62 75 66 66 65 72 2b 2b 3b 0a 09  ';...buffer++;..
26d0: 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  }...filed_log_ms
26e0: 67 28 22 47 4f 54 5f 52 45 51 55 45 53 54 20 46  g("GOT_REQUEST F
26f0: 44 3d 25 69 20 50 41 54 48 3d 25 73 22 2c 20 66  D=%i PATH=%s", f
2700: 64 2c 20 70 61 74 68 29 3b 0a 0a 09 66 69 6c 65  d, path);...file
2710: 64 5f 6c 6f 67 5f 6d 73 67 28 22 57 41 49 54 5f  d_log_msg("WAIT_
2720: 46 4f 52 5f 48 45 41 44 45 52 53 20 46 44 3d 25  FOR_HEADERS FD=%
2730: 69 22 2c 20 66 64 29 3b 0a 0a 09 66 6f 72 20 28  i", fd);...for (
2740: 69 20 3d 20 30 3b 20 69 20 3c 20 31 30 30 3b 20  i = 0; i < 100; 
2750: 69 2b 2b 29 20 7b 0a 09 09 66 67 65 74 73 28 74  i++) {...fgets(t
2760: 6d 70 62 75 66 66 65 72 2c 20 74 6d 70 62 75 66  mpbuffer, tmpbuf
2770: 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 0a 09  fer_len, fp);...
2780: 09 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70  .if (strncasecmp
2790: 28 74 6d 70 62 75 66 66 65 72 2c 20 22 52 61 6e  (tmpbuffer, "Ran
27a0: 67 65 3a 20 22 2c 20 37 29 20 3d 3d 20 30 29 20  ge: ", 7) == 0) 
27b0: 7b 0a 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20  {....workbuffer 
27c0: 3d 20 74 6d 70 62 75 66 66 65 72 20 2b 20 37 3b  = tmpbuffer + 7;
27d0: 0a 0a 09 09 09 69 66 20 28 73 74 72 6e 63 61 73  .....if (strncas
27e0: 65 63 6d 70 28 77 6f 72 6b 62 75 66 66 65 72 2c  ecmp(workbuffer,
27f0: 20 22 62 79 74 65 73 3d 22 2c 20 36 29 20 3d 3d   "bytes=", 6) ==
2800: 20 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75   0) {.....workbu
2810: 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09 09 09  ffer += 6;......
2820: 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d 20  range_request = 
2830: 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f 73 74  1;......range_st
2840: 61 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77  art = strtoull(w
2850: 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72 6b  orkbuffer, &work
2860: 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30 29  buffer_next, 10)
2870: 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65  ;......workbuffe
2880: 72 20 3d 20 77 6f 72 6b 62 75 66 66 65 72 5f 6e  r = workbuffer_n
2890: 65 78 74 3b 0a 0a 09 09 09 09 69 66 20 28 2a 77  ext;......if (*w
28a0: 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 2d 27  orkbuffer == '-'
28b0: 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62 75 66  ) {......workbuf
28c0: 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69 66 20  fer++;.......if 
28d0: 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20  (*workbuffer != 
28e0: 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62 75 66  '\r' && *workbuf
28f0: 66 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b 0a 09  fer != '\n') {..
2900: 09 09 09 09 09 72 61 6e 67 65 5f 65 6e 64 20 3d  .....range_end =
2910: 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75   strtoull(workbu
2920: 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65  ffer, &workbuffe
2930: 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09 09 09  r_next, 10);....
2940: 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09  ..}.....}....}..
2950: 09 7d 0a 0a 09 09 69 66 20 28 6d 65 6d 63 6d 70  .}....if (memcmp
2960: 28 74 6d 70 62 75 66 66 65 72 2c 20 22 5c 72 5c  (tmpbuffer, "\r\
2970: 6e 22 2c 20 32 29 20 3d 3d 20 30 29 20 7b 0a 09  n", 2) == 0) {..
2980: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a  ..break;...}..}.
2990: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
29a0: 22 47 4f 54 5f 48 45 41 44 45 52 53 20 46 44 3d  "GOT_HEADERS FD=
29b0: 25 69 22 2c 20 66 64 29 3b 0a 0a 09 2f 2a 20 57  %i", fd);.../* W
29c0: 65 20 6f 6e 6c 79 20 68 61 6e 64 6c 65 20 74 68  e only handle th
29d0: 65 20 22 47 45 54 22 20 6d 65 74 68 6f 64 20 2a  e "GET" method *
29e0: 2f 0a 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  /..if (strcasecm
29f0: 70 28 6d 65 74 68 6f 64 2c 20 22 67 65 74 22 29  p(method, "get")
2a00: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   != 0) {...retur
2a10: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
2a20: 20 44 65 74 65 72 6d 69 6e 65 20 72 61 6e 67 65   Determine range
2a30: 20 2a 2f 0a 09 69 66 20 28 72 61 6e 67 65 5f 65   */..if (range_e
2a40: 6e 64 20 21 3d 20 30 29 20 7b 0a 09 09 69 66 20  nd != 0) {...if 
2a50: 28 72 61 6e 67 65 5f 65 6e 64 20 3c 3d 20 72 61  (range_end <= ra
2a60: 6e 67 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 09  nge_start) {....
2a70: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09  return(NULL);...
2a80: 7d 0a 0a 09 09 72 61 6e 67 65 5f 6c 65 6e 67 74  }....range_lengt
2a90: 68 20 3d 20 72 61 6e 67 65 5f 65 6e 64 20 2d 20  h = range_end - 
2aa0: 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 0a 09 09  range_start;....
2ab0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
2ac0: 62 75 67 28 22 43 6f 6d 70 75 74 69 6e 67 20 6c  bug("Computing l
2ad0: 65 6e 67 74 68 20 70 61 72 61 6d 65 74 65 72 3a  ength parameter:
2ae0: 20 25 6c 6c 75 20 3d 20 25 6c 6c 75 20 2d 20 25   %llu = %llu - %
2af0: 6c 6c 75 22 2c 0a 09 09 09 28 75 6e 73 69 67 6e  llu",....(unsign
2b00: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61  ed long long) ra
2b10: 6e 67 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 28  nge_length,....(
2b20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
2b30: 6e 67 29 20 72 61 6e 67 65 5f 65 6e 64 2c 0a 09  ng) range_end,..
2b40: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
2b50: 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 73 74 61   long) range_sta
2b60: 72 74 0a 09 09 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  rt...);..}.../* 
2b70: 46 69 6c 6c 20 75 70 20 73 74 72 75 63 74 75 72  Fill up structur
2b80: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 09  e to return */..
2b90: 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 20  buffer_st->path 
2ba0: 20 20 3d 20 70 61 74 68 3b 0a 09 62 75 66 66 65    = path;..buffe
2bb0: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  r_st->headers.ra
2bc0: 6e 67 65 2e 70 72 65 73 65 6e 74 20 3d 20 72 61  nge.present = ra
2bd0: 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 62 75  nge_request;..bu
2be0: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
2bf0: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d  .range.offset  =
2c00: 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62   range_start;..b
2c10: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
2c20: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20  s.range.length  
2c30: 3d 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  = range_length;.
2c40: 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f  ..return(buffer_
2c50: 73 74 29 3b 0a 0a 09 2f 2a 20 4d 61 6b 65 20 63  st);.../* Make c
2c60: 6f 6d 70 69 6c 65 72 20 68 61 70 70 79 20 2a 2f  ompiler happy */
2c70: 0a 09 66 64 20 3d 20 66 64 3b 0a 7d 0a 0a 2f 2a  ..fd = fd;.}../*
2c80: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
2c90: 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69 63 20   page */.static 
2ca0: 76 6f 69 64 20 66 69 6c 65 64 5f 65 72 72 6f 72  void filed_error
2cb0: 5f 70 61 67 65 28 46 49 4c 45 20 2a 66 70 2c 20  _page(FILE *fp, 
2cc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 65  const char *date
2cd0: 5f 63 75 72 72 65 6e 74 2c 20 69 6e 74 20 65 72  _current, int er
2ce0: 72 6f 72 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 63  ror_number) {..c
2cf0: 68 61 72 20 2a 65 72 72 6f 72 5f 73 74 72 69 6e  har *error_strin
2d00: 67 20 3d 20 22 3c 68 74 6d 6c 3e 3c 68 65 61 64  g = "<html><head
2d10: 3e 3c 74 69 74 6c 65 3e 45 52 52 4f 52 3c 2f 74  ><title>ERROR</t
2d20: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 3c 62 6f 64  itle></head><bod
2d30: 79 3e 55 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63  y>Unable to proc
2d40: 65 73 73 20 72 65 71 75 65 73 74 3c 2f 62 6f 64  ess request</bod
2d50: 79 3e 3c 2f 68 74 6d 6c 3e 22 3b 0a 0a 09 66 70  y></html>";...fp
2d60: 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f  rintf(fp, "HTTP/
2d70: 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74  1.1 %i OK\r\nDat
2d80: 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a  e: %s\r\nServer:
2d90: 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d   filed\r\nLast-M
2da0: 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43  odified: %s\r\nC
2db0: 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25  ontent-Length: %
2dc0: 6c 6c 75 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54  llu\r\nContent-T
2dd0: 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65  ype: %s\r\nConne
2de0: 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e  ction: close\r\n
2df0: 5c 72 5c 6e 25 73 22 2c 0a 09 09 65 72 72 6f 72  \r\n%s",...error
2e00: 5f 6e 75 6d 62 65 72 2c 0a 09 09 64 61 74 65 5f  _number,...date_
2e10: 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f  current,...date_
2e20: 63 75 72 72 65 6e 74 2c 0a 09 09 28 75 6e 73 69  current,...(unsi
2e30: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2e40: 73 74 72 6c 65 6e 28 65 72 72 6f 72 5f 73 74 72  strlen(error_str
2e50: 69 6e 67 29 2c 0a 09 09 22 74 65 78 74 2f 68 74  ing),..."text/ht
2e60: 6d 6c 22 2c 0a 09 09 65 72 72 6f 72 5f 73 74 72  ml",...error_str
2e70: 69 6e 67 0a 09 29 3b 0a 7d 0a 0a 2f 2a 20 48 61  ing..);.}../* Ha
2e80: 6e 64 6c 65 20 61 20 73 69 6e 67 6c 65 20 72 65  ndle a single re
2e90: 71 75 65 73 74 20 66 72 6f 6d 20 61 20 63 6c 69  quest from a cli
2ea0: 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent */.static vo
2eb0: 69 64 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f  id filed_handle_
2ec0: 63 6c 69 65 6e 74 28 69 6e 74 20 66 64 2c 20 73  client(int fd, s
2ed0: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
2ee0: 5f 72 65 71 75 65 73 74 20 2a 72 65 71 75 65 73  _request *reques
2ef0: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c  t) {..struct fil
2f00: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c  ed_fileinfo *fil
2f10: 65 69 6e 66 6f 3b 0a 09 73 73 69 7a 65 5f 74 20  einfo;..ssize_t 
2f20: 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 73  sendfile_ret;..s
2f30: 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 6c  ize_t sendfile_l
2f40: 65 6e 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e  en, sendfile_sen
2f50: 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  t, sendfile_size
2f60: 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 64 66 69 6c  ;..off_t sendfil
2f70: 65 5f 6f 66 66 73 65 74 3b 0a 09 63 68 61 72 20  e_offset;..char 
2f80: 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 64 61  *path;..char *da
2f90: 74 65 5f 63 75 72 72 65 6e 74 2c 20 64 61 74 65  te_current, date
2fa0: 5f 63 75 72 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a  _current_b[64];.
2fb0: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
2fc0: 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20  .FILE *fp;.../* 
2fd0: 44 65 74 65 72 6d 69 6e 65 20 63 75 72 72 65 6e  Determine curren
2fe0: 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f  t time */..date_
2ff0: 63 75 72 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f  current = filed_
3000: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61 74 65  format_time(date
3010: 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65  _current_b, size
3020: 6f 66 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  of(date_current_
3030: 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b  b), time(NULL));
3040: 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65  .../* Open socke
3050: 74 20 61 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f  t as ANSI I/O fo
3060: 72 20 65 61 73 65 20 6f 66 20 75 73 65 20 2a 2f  r ease of use */
3070: 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e 28 66 64  ..fp = fdopen(fd
3080: 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66 20 28 66  , "w+b");..if (f
3090: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  p == NULL) {...c
30a0: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74  lose(fd);....ret
30b0: 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65 71 75 65 73  urn;..}...reques
30c0: 74 20 3d 20 66 69 6c 65 64 5f 67 65 74 5f 68 74  t = filed_get_ht
30d0: 74 70 5f 72 65 71 75 65 73 74 28 66 70 2c 20 72  tp_request(fp, r
30e0: 65 71 75 65 73 74 29 3b 0a 0a 09 69 66 20 28 72  equest);...if (r
30f0: 65 71 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 20 7c  equest == NULL |
3100: 7c 20 72 65 71 75 65 73 74 2d 3e 70 61 74 68 20  | request->path 
3110: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c  == NULL) {...fil
3120: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70  ed_error_page(fp
3130: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20  , date_current, 
3140: 35 30 30 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c  500);....filed_l
3150: 6f 67 5f 6d 73 67 28 22 49 4e 56 41 4c 49 44 5f  og_msg("INVALID_
3160: 52 45 51 55 45 53 54 20 46 44 3d 25 69 20 45 52  REQUEST FD=%i ER
3170: 52 4f 52 3d 35 30 30 22 2c 20 66 64 29 3b 0a 0a  ROR=500", fd);..
3180: 09 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09  ..fclose(fp);...
3190: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 69 66  .return;..}...if
31a0: 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65   (request->heade
31b0: 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e 74  rs.range.present
31c0: 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ) {...filed_log_
31d0: 6d 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50  msg("PROCESS_REP
31e0: 4c 59 5f 53 54 41 52 54 20 46 44 3d 25 69 20 50  LY_START FD=%i P
31f0: 41 54 48 3d 25 73 20 52 41 4e 47 45 5f 53 54 41  ATH=%s RANGE_STA
3200: 52 54 3d 25 6c 6c 75 20 52 41 4e 47 45 5f 4c 45  RT=%llu RANGE_LE
3210: 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 66  NGTH=%llu",....f
3220: 64 2c 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 70  d,....request->p
3230: 61 74 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65  ath,....(unsigne
3240: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  d long long) req
3250: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
3260: 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09 09 09 28  nge.offset,....(
3270: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
3280: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
3290: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
32a0: 68 0a 09 09 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  h...);..} else {
32b0: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
32c0: 28 22 50 52 4f 43 45 53 53 5f 52 45 50 4c 59 5f  ("PROCESS_REPLY_
32d0: 53 54 41 52 54 20 46 44 3d 25 69 20 50 41 54 48  START FD=%i PATH
32e0: 3d 25 73 22 2c 20 66 64 2c 20 72 65 71 75 65 73  =%s", fd, reques
32f0: 74 2d 3e 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 70  t->path);..}...p
3300: 61 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 70  ath = request->p
3310: 61 74 68 3b 0a 0a 09 68 74 74 70 5f 63 6f 64 65  ath;...http_code
3320: 20 3d 20 2d 31 3b 0a 0a 09 66 69 6c 65 69 6e 66   = -1;...fileinf
3330: 6f 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66  o = filed_open_f
3340: 69 6c 65 28 70 61 74 68 2c 20 26 72 65 71 75 65  ile(path, &reque
3350: 73 74 2d 3e 66 69 6c 65 69 6e 66 6f 29 3b 0a 09  st->fileinfo);..
3360: 69 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d 3d 20  if (fileinfo == 
3370: 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64 5f  NULL) {...filed_
3380: 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64  error_page(fp, d
3390: 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 30 34  ate_current, 404
33a0: 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  );....filed_log_
33b0: 6d 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50  msg("PROCESS_REP
33c0: 4c 59 5f 43 4f 4d 50 4c 45 54 45 20 46 44 3d 25  LY_COMPLETE FD=%
33d0: 69 20 45 52 52 4f 52 3d 34 30 34 22 2c 20 66 64  i ERROR=404", fd
33e0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  );..} else {...i
33f0: 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  f (request->head
3400: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3410: 20 21 3d 20 30 20 7c 7c 20 72 65 71 75 65 73 74   != 0 || request
3420: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3430: 6c 65 6e 67 74 68 20 3e 3d 20 30 29 20 7b 0a 09  length >= 0) {..
3440: 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
3450: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
3460: 73 65 74 20 3e 3d 20 66 69 6c 65 69 6e 66 6f 2d  set >= fileinfo-
3470: 3e 6c 65 6e 29 20 7b 0a 09 09 09 09 66 69 6c 65  >len) {.....file
3480: 64 5f 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45  d_log_msg("PROCE
3490: 53 53 5f 52 45 50 4c 59 5f 43 4f 4d 50 4c 45 54  SS_REPLY_COMPLET
34a0: 45 20 46 44 3d 25 69 20 45 52 52 4f 52 3d 34 31  E FD=%i ERROR=41
34b0: 36 22 2c 20 66 64 29 3b 0a 0a 09 09 09 09 66 69  6", fd);......fi
34c0: 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66  led_error_page(f
34d0: 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  p, date_current,
34e0: 20 34 31 36 29 3b 0a 09 09 09 7d 20 65 6c 73 65   416);....} else
34f0: 20 7b 0a 09 09 09 09 69 66 20 28 72 65 71 75 65   {.....if (reque
3500: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3510: 65 2e 6c 65 6e 67 74 68 20 3c 20 30 29 20 7b 0a  e.length < 0) {.
3520: 09 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  .....filed_log_m
3530: 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75 74  sg_debug("Comput
3540: 69 6e 67 20 6c 65 6e 67 74 68 20 74 6f 20 66 69  ing length to fi
3550: 74 20 69 6e 20 62 6f 75 6e 64 73 3a 20 66 69 6c  t in bounds: fil
3560: 65 69 6e 66 6f 2d 3e 6c 65 6e 20 3d 20 25 6c 6c  einfo->len = %ll
3570: 75 2c 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  u, request->head
3580: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3590: 20 3d 20 25 6c 6c 75 22 2c 0a 09 09 09 09 09 09   = %llu",.......
35a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
35b0: 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  ong) fileinfo->l
35c0: 65 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67  en,.......(unsig
35d0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
35e0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
35f0: 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09 09  range.offset....
3600: 09 09 29 3b 0a 0a 09 09 09 09 09 72 65 71 75 65  ..);.......reque
3610: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3620: 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69  e.length = filei
3630: 6e 66 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75 65  nfo->len - reque
3640: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3650: 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09 09 7d 0a  e.offset;.....}.
3660: 0a 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  .....filed_log_m
3670: 73 67 5f 64 65 62 75 67 28 22 50 61 72 74 69 61  sg_debug("Partia
3680: 6c 20 72 65 71 75 65 73 74 2c 20 73 74 61 72 74  l request, start
3690: 69 6e 67 20 61 74 3a 20 25 6c 6c 75 20 61 6e 64  ing at: %llu and
36a0: 20 72 75 6e 6e 69 6e 67 20 66 6f 72 20 25 6c 6c   running for %ll
36b0: 75 20 62 79 74 65 73 22 2c 0a 09 09 09 09 09 28  u bytes",......(
36c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
36d0: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
36e0: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
36f0: 74 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65  t,......(unsigne
3700: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  d long long) req
3710: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
3720: 6e 67 65 2e 6c 65 6e 67 74 68 0a 09 09 09 09 29  nge.length.....)
3730: 3b 0a 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65  ;......http_code
3740: 20 3d 20 32 30 36 3b 0a 09 09 09 7d 0a 09 09 7d   = 206;....}...}
3750: 20 65 6c 73 65 20 7b 0a 09 09 09 69 66 20 28 72   else {....if (r
3760: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
3770: 72 61 6e 67 65 2e 70 72 65 73 65 6e 74 29 20 7b  range.present) {
3780: 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d  .....http_code =
3790: 20 32 30 36 3b 0a 09 09 09 7d 20 65 6c 73 65 20   206;....} else 
37a0: 7b 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20  {.....http_code 
37b0: 3d 20 32 30 30 3b 0a 09 09 09 7d 0a 09 09 09 72  = 200;....}....r
37c0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
37d0: 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20 30  range.offset = 0
37e0: 3b 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 68 65  ;....request->he
37f0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
3800: 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  th = fileinfo->l
3810: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 68  en;...}....if (h
3820: 74 74 70 5f 63 6f 64 65 20 3e 20 30 29 20 7b 0a  ttp_code > 0) {.
3830: 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  ...fprintf(fp, "
3840: 48 54 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72  HTTP/1.1 %i OK\r
3850: 5c 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65  \nDate: %s\r\nSe
3860: 72 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c  rver: filed\r\nL
3870: 61 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73  ast-Modified: %s
3880: 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67  \r\nContent-Leng
3890: 74 68 3a 20 25 6c 6c 75 5c 72 5c 6e 41 63 63 65  th: %llu\r\nAcce
38a0: 70 74 2d 52 61 6e 67 65 73 3a 20 62 79 74 65 73  pt-Ranges: bytes
38b0: 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65  \r\nContent-Type
38c0: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69  : %s\r\nConnecti
38d0: 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 22 2c 0a  on: close\r\n",.
38e0: 09 09 09 09 68 74 74 70 5f 63 6f 64 65 2c 0a 09  ....http_code,..
38f0: 09 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
3900: 0a 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c  .....fileinfo->l
3910: 61 73 74 6d 6f 64 2c 0a 09 09 09 09 28 75 6e 73  astmod,.....(uns
3920: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3930: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
3940: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a  s.range.length,.
3950: 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79  ....fileinfo->ty
3960: 70 65 0a 09 09 09 29 3b 0a 09 09 09 69 66 20 28  pe....);....if (
3970: 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32 30 36  http_code == 206
3980: 29 20 7b 0a 09 09 09 09 66 70 72 69 6e 74 66 28  ) {.....fprintf(
3990: 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61 6e  fp, "Content-Ran
39a0: 67 65 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d 25  ge: bytes %llu-%
39b0: 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a 09  llu/%llu\r\n",..
39c0: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
39d0: 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74  ng long) request
39e0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
39f0: 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 28 75 6e  offset,......(un
3a00: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
3a10: 29 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  ) (request->head
3a20: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3a30: 20 2b 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64   + request->head
3a40: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
3a50: 20 2d 20 31 29 2c 0a 09 09 09 09 09 28 75 6e 73   - 1),......(uns
3a60: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3a70: 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 0a 09   fileinfo->len..
3a80: 09 09 09 29 3b 0a 09 09 09 7d 0a 09 09 09 66 70  ...);....}....fp
3a90: 72 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c 6e 22  rintf(fp, "\r\n"
3aa0: 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70 29  );....fflush(fp)
3ab0: 3b 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ;.....filed_log_
3ac0: 6d 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50  msg("PROCESS_REP
3ad0: 4c 59 5f 43 4f 4d 50 4c 45 54 45 20 46 44 3d 25  LY_COMPLETE FD=%
3ae0: 69 20 53 54 41 54 55 53 3d 25 69 22 2c 20 66 64  i STATUS=%i", fd
3af0: 2c 20 68 74 74 70 5f 63 6f 64 65 29 3b 0a 0a 23  , http_code);..#
3b00: 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42  ifdef FILED_NONB
3b10: 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69 6e 74  LOCK_HTTP....int
3b20: 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73 3b 0a 09   socket_flags;..
3b30: 09 09 66 64 5f 73 65 74 20 72 66 64 2c 20 77 66  ..fd_set rfd, wf
3b40: 64 3b 0a 09 09 09 63 68 61 72 20 73 69 6e 6b 62  d;....char sinkb
3b50: 75 66 5b 38 31 39 32 5d 3b 0a 09 09 09 73 73 69  uf[8192];....ssi
3b60: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a  ze_t read_ret;..
3b70: 09 09 09 46 44 5f 5a 45 52 4f 28 26 72 66 64 29  ...FD_ZERO(&rfd)
3b80: 3b 0a 09 09 09 46 44 5f 5a 45 52 4f 28 26 77 66  ;....FD_ZERO(&wf
3b90: 64 29 3b 0a 09 09 09 46 44 5f 53 45 54 28 66 64  d);....FD_SET(fd
3ba0: 2c 20 26 72 66 64 29 3b 0a 09 09 09 46 44 5f 53  , &rfd);....FD_S
3bb0: 45 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a 09  ET(fd, &wfd);...
3bc0: 09 09 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 3d  ..socket_flags =
3bd0: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
3be0: 46 4c 29 3b 0a 09 09 09 66 63 6e 74 6c 28 66 64  FL);....fcntl(fd
3bf0: 2c 20 46 5f 53 45 54 46 4c 2c 20 73 6f 63 6b 65  , F_SETFL, socke
3c00: 74 5f 66 6c 61 67 73 20 7c 20 4f 5f 4e 4f 4e 42  t_flags | O_NONB
3c10: 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  LOCK);.#endif...
3c20: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
3c30: 22 53 45 4e 44 5f 53 54 41 52 54 20 46 49 4c 45  "SEND_START FILE
3c40: 5f 46 44 3d 25 69 20 46 44 3d 25 69 20 42 59 54  _FD=%i FD=%i BYT
3c50: 45 53 3d 25 6c 6c 75 20 4f 46 46 53 45 54 3d 25  ES=%llu OFFSET=%
3c60: 6c 6c 75 22 2c 0a 09 09 09 09 66 69 6c 65 69 6e  llu",.....filein
3c70: 66 6f 2d 3e 66 64 2c 0a 09 09 09 09 66 64 2c 0a  fo->fd,.....fd,.
3c80: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
3c90: 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74  ng long) request
3ca0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3cb0: 6c 65 6e 67 74 68 2c 0a 09 09 09 09 28 75 6e 73  length,.....(uns
3cc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3cd0: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
3ce0: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09  s.range.offset..
3cf0: 09 09 29 3b 0a 0a 09 09 09 73 65 6e 64 66 69 6c  ..);.....sendfil
3d00: 65 5f 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65  e_offset = reque
3d10: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3d20: 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09 73 65 6e  e.offset;....sen
3d30: 64 66 69 6c 65 5f 6c 65 6e 20 3d 20 72 65 71 75  dfile_len = requ
3d40: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
3d50: 67 65 2e 6c 65 6e 67 74 68 3b 0a 09 09 09 73 65  ge.length;....se
3d60: 6e 64 66 69 6c 65 5f 73 65 6e 74 20 3d 20 30 3b  ndfile_sent = 0;
3d70: 0a 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ....while (1) {.
3d80: 09 09 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65  ....if (sendfile
3d90: 5f 6c 65 6e 20 3e 20 46 49 4c 45 44 5f 53 45 4e  _len > FILED_SEN
3da0: 44 46 49 4c 45 5f 4d 41 58 29 20 7b 0a 09 09 09  DFILE_MAX) {....
3db0: 09 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20  ..sendfile_size 
3dc0: 3d 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45  = FILED_SENDFILE
3dd0: 5f 4d 41 58 3b 0a 09 09 09 09 7d 20 65 6c 73 65  _MAX;.....} else
3de0: 20 7b 0a 09 09 09 09 09 73 65 6e 64 66 69 6c 65   {......sendfile
3df0: 5f 73 69 7a 65 20 3d 20 73 65 6e 64 66 69 6c 65  _size = sendfile
3e00: 5f 6c 65 6e 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  _len;.....}.....
3e10: 09 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3d 20  .sendfile_ret = 
3e20: 73 65 6e 64 66 69 6c 65 28 66 64 2c 20 66 69 6c  sendfile(fd, fil
3e30: 65 69 6e 66 6f 2d 3e 66 64 2c 20 26 73 65 6e 64  einfo->fd, &send
3e40: 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e  file_offset, sen
3e50: 64 66 69 6c 65 5f 73 69 7a 65 29 3b 0a 09 09 09  dfile_size);....
3e60: 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 72 65  .if (sendfile_re
3e70: 74 20 3c 3d 20 30 29 20 7b 0a 23 69 66 64 65 66  t <= 0) {.#ifdef
3e80: 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f   FILED_NONBLOCK_
3e90: 48 54 54 50 0a 09 09 09 09 09 69 66 20 28 65 72  HTTP......if (er
3ea0: 72 6e 6f 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b  rno == EAGAIN) {
3eb0: 0a 09 09 09 09 09 09 73 65 6e 64 66 69 6c 65 5f  .......sendfile_
3ec0: 72 65 74 20 3d 20 30 3b 0a 0a 09 09 09 09 09 09  ret = 0;........
3ed0: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 09 09  while (1) {.....
3ee0: 09 09 09 73 65 6c 65 63 74 28 66 64 20 2b 20 31  ...select(fd + 1
3ef0: 2c 20 26 72 66 64 2c 20 26 77 66 64 2c 20 4e 55  , &rfd, &wfd, NU
3f00: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 09  LL, NULL);......
3f10: 09 09 69 66 20 28 46 44 5f 49 53 53 45 54 28 66  ..if (FD_ISSET(f
3f20: 64 2c 20 26 72 66 64 29 29 20 7b 0a 09 09 09 09  d, &rfd)) {.....
3f30: 09 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 72  ....read_ret = r
3f40: 65 61 64 28 66 64 2c 20 73 69 6e 6b 62 75 66 2c  ead(fd, sinkbuf,
3f50: 20 73 69 7a 65 6f 66 28 73 69 6e 6b 62 75 66 29   sizeof(sinkbuf)
3f60: 29 3b 0a 0a 09 09 09 09 09 09 09 09 69 66 20 28  );..........if (
3f70: 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
3f80: 0a 09 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b  ..........break;
3f90: 0a 09 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09  .........}......
3fa0: 09 09 7d 0a 0a 09 09 09 09 09 09 09 69 66 20 28  ..}.........if (
3fb0: 46 44 5f 49 53 53 45 54 28 66 64 2c 20 26 77 66  FD_ISSET(fd, &wf
3fc0: 64 29 29 20 7b 0a 09 09 09 09 09 09 09 09 72 65  d)) {.........re
3fd0: 61 64 5f 72 65 74 20 3d 20 31 3b 0a 0a 09 09 09  ad_ret = 1;.....
3fe0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
3ff0: 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09  ...}.......}....
4000: 09 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74  ....if (read_ret
4010: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09   <= 0) {........
4020: 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09  break;.......}..
4030: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
4040: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
4050: 0a 23 65 6c 73 65 0a 09 09 09 09 09 62 72 65 61  .#else......brea
4060: 6b 3b 0a 23 65 6e 64 69 66 0a 09 09 09 09 7d 0a  k;.#endif.....}.
4070: 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 6c 65  .....sendfile_le
4080: 6e 20 2d 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65  n -= sendfile_re
4090: 74 3b 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f  t;.....sendfile_
40a0: 73 65 6e 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65  sent += sendfile
40b0: 5f 72 65 74 3b 0a 09 09 09 09 69 66 20 28 73 65  _ret;.....if (se
40c0: 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29  ndfile_len == 0)
40d0: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
40e0: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 66 69  ...}....}.....fi
40f0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 53 45 4e  led_log_msg("SEN
4100: 44 5f 43 4f 4d 50 4c 45 54 45 20 53 54 41 54 55  D_COMPLETE STATU
4110: 53 3d 25 73 20 46 49 4c 45 5f 46 44 3d 25 69 20  S=%s FILE_FD=%i 
4120: 46 44 3d 25 69 20 42 59 54 45 53 3d 25 6c 6c 75  FD=%i BYTES=%llu
4130: 20 42 59 54 45 53 5f 53 45 4e 54 3d 25 6c 6c 75   BYTES_SENT=%llu
4140: 22 2c 0a 09 09 09 09 22 3c 75 6e 6b 6e 6f 77 6e  ",....."<unknown
4150: 3e 22 2c 0a 09 09 09 09 66 69 6c 65 69 6e 66 6f  >",.....fileinfo
4160: 2d 3e 66 64 2c 0a 09 09 09 09 66 64 2c 0a 09 09  ->fd,.....fd,...
4170: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
4180: 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e   long) request->
4190: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
41a0: 6e 67 74 68 2c 0a 09 09 09 09 28 75 6e 73 69 67  ngth,.....(unsig
41b0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73  ned long long) s
41c0: 65 6e 64 66 69 6c 65 5f 73 65 6e 74 0a 09 09 09  endfile_sent....
41d0: 29 3b 0a 09 09 7d 0a 0a 09 09 63 6c 6f 73 65 28  );...}....close(
41e0: 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a 0a  fileinfo->fd);..
41f0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
4200: 22 43 4c 4f 53 45 5f 46 49 4c 45 20 46 44 3d 25  "CLOSE_FILE FD=%
4210: 69 22 2c 20 66 64 29 3b 0a 09 7d 0a 0a 09 66 69  i", fd);..}...fi
4220: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 43 4c 4f  led_log_msg("CLO
4230: 53 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 46 44  SE_CONNECTION FD
4240: 3d 25 69 22 2c 20 66 64 29 3b 0a 0a 09 66 63 6c  =%i", fd);...fcl
4250: 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65 74 75 72  ose(fp);...retur
4260: 6e 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20  n;.}../* Handle 
4270: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74  incoming connect
4280: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
4290: 6f 69 64 20 2a 66 69 6c 65 64 5f 77 6f 72 6b 65  oid *filed_worke
42a0: 72 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a 61  r_thread(void *a
42b0: 72 67 5f 76 29 20 7b 0a 09 73 74 72 75 63 74 20  rg_v) {..struct 
42c0: 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72  filed_worker_thr
42d0: 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09  ead_args *arg;..
42e0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74  struct filed_htt
42f0: 70 5f 72 65 71 75 65 73 74 20 72 65 71 75 65 73  p_request reques
4300: 74 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61  t;..struct socka
4310: 64 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a 09 63  ddr_in6 addr;..c
4320: 68 61 72 20 6c 6f 67 62 75 66 5f 69 70 5b 31 32  har logbuf_ip[12
4330: 38 5d 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 61  8];..socklen_t a
4340: 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66 61 69  ddrlen;..int fai
4350: 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 2c 20  lure_count = 0, 
4360: 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e  max_failure_coun
4370: 74 20 3d 20 4d 41 58 5f 46 41 49 4c 55 52 45 5f  t = MAX_FAILURE_
4380: 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 6d 61 73 74  COUNT;..int mast
4390: 65 72 5f 66 64 2c 20 66 64 3b 0a 0a 09 2f 2a 20  er_fd, fd;.../* 
43a0: 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  Read arguments *
43b0: 2f 0a 09 61 72 67 20 3d 20 61 72 67 5f 76 3b 0a  /..arg = arg_v;.
43c0: 0a 09 6d 61 73 74 65 72 5f 66 64 20 3d 20 61 72  ..master_fd = ar
43d0: 67 2d 3e 66 64 3b 0a 0a 09 77 68 69 6c 65 20 28  g->fd;...while (
43e0: 31 29 20 7b 0a 09 09 2f 2a 20 46 61 69 6c 75 72  1) {.../* Failur
43f0: 65 20 6c 6f 6f 70 20 70 72 65 76 65 6e 74 69 6f  e loop preventio
4400: 6e 20 2a 2f 0a 09 09 69 66 20 28 66 61 69 6c 75  n */...if (failu
4410: 72 65 5f 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 66  re_count > max_f
4420: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 29 20 7b 0a  ailure_count) {.
4430: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
4440: 09 2f 2a 20 41 63 63 65 70 74 20 61 20 6e 65 77  ./* Accept a new
4450: 20 63 6c 69 65 6e 74 20 2a 2f 0a 09 09 61 64 64   client */...add
4460: 72 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64  rlen = sizeof(ad
4470: 64 72 29 3b 0a 09 09 66 64 20 3d 20 61 63 63 65  dr);...fd = acce
4480: 70 74 28 6d 61 73 74 65 72 5f 66 64 2c 20 28 73  pt(master_fd, (s
4490: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
44a0: 29 20 26 61 64 64 72 2c 20 26 61 64 64 72 6c 65  ) &addr, &addrle
44b0: 6e 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 49  n);..../*... * I
44c0: 66 20 77 65 20 66 61 69 6c 2c 20 6d 61 6b 65 20  f we fail, make 
44d0: 61 20 6e 6f 74 65 20 6f 66 20 69 74 20 73 6f 20  a note of it so 
44e0: 77 65 20 64 6f 6e 27 74 20 67 6f 20 69 6e 74 6f  we don't go into
44f0: 20 61 20 6c 6f 6f 70 20 6f 66 0a 09 09 20 2a 20   a loop of... * 
4500: 61 63 63 65 70 74 28 29 20 66 61 69 6c 69 6e 67  accept() failing
4510: 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 66 64 20  ... */...if (fd 
4520: 3c 20 30 29 20 7b 0a 09 09 09 2f 2a 20 4c 6f 67  < 0) {..../* Log
4530: 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
4540: 69 6f 6e 20 2a 2f 0a 09 09 09 66 69 6c 65 64 5f  ion */....filed_
4550: 6c 6f 67 5f 6d 73 67 28 22 41 43 43 45 50 54 5f  log_msg("ACCEPT_
4560: 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09 66 61  FAILED");.....fa
4570: 69 6c 75 72 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  ilure_count++;..
4580: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
4590: 0a 0a 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e  ..../* Log the n
45a0: 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  ew connection */
45b0: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
45c0: 28 22 4e 45 57 5f 43 4f 4e 4e 45 43 54 49 4f 4e  ("NEW_CONNECTION
45d0: 20 53 52 43 5f 41 44 44 52 3d 25 73 20 53 52 43   SRC_ADDR=%s SRC
45e0: 5f 50 4f 52 54 3d 25 6c 75 20 46 44 3d 25 69 22  _PORT=%lu FD=%i"
45f0: 2c 0a 09 09 09 69 6e 65 74 5f 6e 74 6f 70 28 41  ,....inet_ntop(A
4600: 46 5f 49 4e 45 54 36 2c 20 26 61 64 64 72 2e 73  F_INET6, &addr.s
4610: 69 6e 36 5f 61 64 64 72 2c 20 6c 6f 67 62 75 66  in6_addr, logbuf
4620: 5f 69 70 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 62  _ip, sizeof(logb
4630: 75 66 5f 69 70 29 29 20 3f 20 6c 6f 67 62 75 66  uf_ip)) ? logbuf
4640: 5f 69 70 20 3a 20 22 3c 75 6e 6b 6e 6f 77 6e 3e  _ip : "<unknown>
4650: 22 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ",....(unsigned 
4660: 6c 6f 6e 67 29 20 61 64 64 72 2e 73 69 6e 36 5f  long) addr.sin6_
4670: 70 6f 72 74 2c 0a 09 09 09 66 64 0a 09 09 29 3b  port,....fd...);
4680: 0a 0a 09 09 2f 2a 20 52 65 73 65 74 20 66 61 69  ..../* Reset fai
4690: 6c 75 72 65 20 63 6f 75 6e 74 2a 2f 0a 09 09 66  lure count*/...f
46a0: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30  ailure_count = 0
46b0: 3b 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20 73  ;..../* Handle s
46c0: 6f 63 6b 65 74 20 2a 2f 0a 09 09 66 69 6c 65 64  ocket */...filed
46d0: 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28 66  _handle_client(f
46e0: 64 2c 20 26 72 65 71 75 65 73 74 29 3b 0a 09 7d  d, &request);..}
46f0: 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 65 72 72  .../* Report err
4700: 6f 72 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67  or */..filed_log
4710: 5f 6d 73 67 28 22 54 48 52 45 41 44 5f 44 49 45  _msg("THREAD_DIE
4720: 44 20 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09  D ABNORMAL");...
4730: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09  return(NULL);...
4740: 2f 2a 20 4d 61 6b 65 20 63 6f 6d 70 69 6c 65 72  /* Make compiler
4750: 20 68 61 70 70 79 20 2a 2f 0a 09 6c 6f 67 62 75   happy */..logbu
4760: 66 5f 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  f_ip[0] = '\0';.
4770: 09 6c 6f 67 62 75 66 5f 69 70 5b 30 5d 20 3d 20  .logbuf_ip[0] = 
4780: 6c 6f 67 62 75 66 5f 69 70 5b 30 5d 3b 0a 0a 7d  logbuf_ip[0];..}
4790: 0a 0a 2f 2a 20 43 72 65 61 74 65 20 77 6f 72 6b  ../* Create work
47a0: 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74  er threads */.st
47b0: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 77  atic int filed_w
47c0: 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e  orker_threads_in
47d0: 69 74 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 74  it(int fd, int t
47e0: 68 72 65 61 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  hread_count) {..
47f0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77 6f 72  struct filed_wor
4800: 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ker_thread_args 
4810: 2a 61 72 67 3b 0a 09 70 74 68 72 65 61 64 5f 74  *arg;..pthread_t
4820: 20 74 68 72 65 61 64 69 64 3b 0a 09 69 6e 74 20   threadid;..int 
4830: 70 74 68 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  pthread_ret;..in
4840: 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20  t i;...for (i = 
4850: 30 3b 20 69 20 3c 20 74 68 72 65 61 64 5f 63 6f  0; i < thread_co
4860: 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 09 61 72  unt; i++) {...ar
4870: 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  g = malloc(sizeo
4880: 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09 61 72 67  f(*arg));....arg
4890: 2d 3e 66 64 20 3d 20 66 64 3b 0a 0a 09 09 70 74  ->fd = fd;....pt
48a0: 68 72 65 61 64 5f 72 65 74 20 3d 20 70 74 68 72  hread_ret = pthr
48b0: 65 61 64 5f 63 72 65 61 74 65 28 26 74 68 72 65  ead_create(&thre
48c0: 61 64 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65  adid, NULL, file
48d0: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 2c  d_worker_thread,
48e0: 20 61 72 67 29 3b 0a 09 09 69 66 20 28 70 74 68   arg);...if (pth
48f0: 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b  read_ret != 0) {
4900: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
4910: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
4920: 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 69 73 70 6c 61  0);.}../* Displa
4930: 79 20 68 65 6c 70 20 2a 2f 0a 73 74 61 74 69 63  y help */.static
4940: 20 76 6f 69 64 20 66 69 6c 65 64 5f 70 72 69 6e   void filed_prin
4950: 74 5f 68 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74  t_help(FILE *out
4960: 70 75 74 2c 20 69 6e 74 20 6c 6f 6e 67 5f 68 65  put, int long_he
4970: 6c 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  lp, const char *
4980: 65 78 74 72 61 29 20 7b 0a 09 69 66 20 28 65 78  extra) {..if (ex
4990: 74 72 61 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  tra) {...fprintf
49a0: 28 6f 75 74 70 75 74 2c 20 22 25 73 5c 6e 22 2c  (output, "%s\n",
49b0: 20 65 78 74 72 61 29 3b 0a 09 7d 0a 0a 09 66 70   extra);..}...fp
49c0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 55  rintf(output, "U
49d0: 73 61 67 65 3a 20 66 69 6c 65 64 20 5b 3c 6f 70  sage: filed [<op
49e0: 74 69 6f 6e 73 3e 5d 5c 6e 22 29 3b 0a 09 66 70  tions>]\n");..fp
49f0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
4a00: 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b 0a 09   Options:\n");..
4a10: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
4a20: 22 20 20 20 20 20 20 2d 68 2c 20 2d 2d 68 65 6c  "      -h, --hel
4a30: 70 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  p\n");..fprintf(
4a40: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
4a50: 64 2c 20 2d 2d 64 61 65 6d 6f 6e 5c 6e 22 29 3b  d, --daemon\n");
4a60: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
4a70: 2c 20 22 20 20 20 20 20 20 2d 62 20 3c 61 64 64  , "      -b <add
4a80: 72 65 73 73 3e 2c 20 2d 2d 62 69 6e 64 20 3c 61  ress>, --bind <a
4a90: 64 64 72 65 73 73 3e 5c 6e 22 29 3b 0a 09 66 70  ddress>\n");..fp
4aa0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
4ab0: 20 20 20 20 20 2d 70 20 3c 70 6f 72 74 3e 2c 20       -p <port>, 
4ac0: 2d 2d 70 6f 72 74 20 3c 70 6f 72 74 3e 5c 6e 22  --port <port>\n"
4ad0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
4ae0: 75 74 2c 20 22 20 20 20 20 20 20 2d 74 20 3c 63  ut, "      -t <c
4af0: 6f 75 6e 74 3e 2c 20 2d 2d 74 68 72 65 61 64 73  ount>, --threads
4b00: 20 3c 63 6f 75 6e 74 3e 5c 6e 22 29 3b 0a 09 66   <count>\n");..f
4b10: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4b20: 20 20 20 20 20 20 2d 63 20 3c 65 6e 74 72 69 65        -c <entrie
4b30: 73 3e 2c 20 2d 2d 63 61 63 68 65 20 3c 65 6e 74  s>, --cache <ent
4b40: 72 69 65 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  ries>\n");..fpri
4b50: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
4b60: 20 20 20 2d 6c 20 3c 66 69 6c 65 3e 2c 20 2d 2d     -l <file>, --
4b70: 6c 6f 67 20 3c 66 69 6c 65 3e 5c 6e 22 29 3b 0a  log <file>\n");.
4b80: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4b90: 20 22 20 20 20 20 20 20 2d 75 20 3c 75 73 65 72   "      -u <user
4ba0: 3e 2c 20 2d 2d 75 73 65 72 20 3c 75 73 65 72 3e  >, --user <user>
4bb0: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
4bc0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 72  utput, "      -r
4bd0: 20 3c 64 69 72 65 63 74 6f 72 79 3e 2c 20 2d 2d   <directory>, --
4be0: 72 6f 6f 74 20 3c 64 69 72 65 63 74 6f 72 79 3e  root <directory>
4bf0: 5c 6e 22 29 3b 0a 0a 09 69 66 20 28 6c 6f 6e 67  \n");...if (long
4c00: 5f 68 65 6c 70 29 20 7b 0a 09 09 66 70 72 69 6e  _help) {...fprin
4c10: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
4c20: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
4c30: 75 74 2c 20 22 20 20 55 73 61 67 65 3a 5c 6e 22  ut, "  Usage:\n"
4c40: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
4c50: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68 20 28  put, "      -h (
4c60: 6f 72 20 2d 2d 68 65 6c 70 29 20 70 72 69 6e 74  or --help) print
4c70: 73 20 74 68 69 73 20 75 73 61 67 65 20 69 6e 66  s this usage inf
4c80: 6f 72 6d 61 74 69 6f 6e 2e 5c 6e 22 29 3b 0a 09  ormation.\n");..
4c90: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4ca0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
4cb0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
4cc0: 20 2d 64 20 28 6f 72 20 2d 2d 64 61 65 6d 6f 6e   -d (or --daemon
4cd0: 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65  ) instructs file
4ce0: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 64 61  d to become a da
4cf0: 65 6d 6f 6e 20 61 66 74 65 72 20 69 6e 69 74 69  emon after initi
4d00: 61 6c 69 7a 69 6e 67 5c 6e 22 29 3b 0a 09 09 66  alizing\n");...f
4d10: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 20 74 68 65 20 6c 69 73 74 65         the liste
4d40: 6e 69 6e 67 20 54 43 50 20 73 6f 63 6b 65 74 20  ning TCP socket 
4d50: 61 6e 64 20 6c 6f 67 20 66 69 6c 65 73 2e 5c 6e  and log files.\n
4d60: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
4d70: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
4d80: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4d90: 20 20 20 20 20 20 2d 62 20 28 6f 72 20 2d 2d 62        -b (or --b
4da0: 69 6e 64 29 20 73 70 65 63 69 66 69 65 73 20 74  ind) specifies t
4db0: 68 65 20 61 64 64 72 65 73 73 20 74 6f 20 6c 69  he address to li
4dc0: 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e  sten for incomin
4dd0: 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70  g HTTP\n");...fp
4de0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 72 65 71 75 65 73 74 73 20 6f 6e 2e      requests on.
4e10: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61    The default va
4e20: 6c 75 65 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e  lue is \"%s\".\n
4e30: 22 2c 20 42 49 4e 44 5f 41 44 44 52 29 3b 0a 09  ", BIND_ADDR);..
4e40: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4e50: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
4e60: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
4e70: 20 2d 70 20 28 6f 72 20 2d 2d 70 6f 72 74 29 20   -p (or --port) 
4e80: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 54 43  specifies the TC
4e90: 50 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f  P port number to
4ea0: 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f   listen for inco
4eb0: 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09  ming HTTP\n");..
4ec0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4ed0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
4ee0: 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73 20         requests 
4ef0: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
4f00: 20 69 73 20 25 75 2e 5c 6e 22 2c 20 28 75 6e 73   is %u.\n", (uns
4f10: 69 67 6e 65 64 20 69 6e 74 29 20 50 4f 52 54 29  igned int) PORT)
4f20: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
4f30: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
4f40: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
4f50: 20 20 20 20 2d 74 20 28 6f 72 20 2d 2d 74 68 72      -t (or --thr
4f60: 65 61 64 73 29 20 73 70 65 63 69 66 69 65 73 20  eads) specifies 
4f70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f  the number of wo
4f80: 72 6b 65 72 20 74 68 72 65 61 64 73 20 74 6f 20  rker threads to 
4f90: 63 72 65 61 74 65 2e 20 45 61 63 68 5c 6e 22 29  create. Each\n")
4fa0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
4fb0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 6f 72               wor
4fd0: 6b 65 72 20 74 68 72 65 61 64 20 63 61 6e 20 73  ker thread can s
4fe0: 65 72 76 69 63 65 20 6f 6e 65 20 63 6f 6e 63 75  ervice one concu
4ff0: 72 72 65 6e 74 20 48 54 54 50 20 73 65 73 73 69  rrent HTTP sessi
5000: 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  on.\n");...fprin
5010: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 54 68 75 73 20 74 68 65 20 6e 75 6d      Thus the num
5040: 62 65 72 20 6f 66 20 74 68 72 65 61 64 73 20 63  ber of threads c
5050: 72 65 61 74 65 64 20 77 69 6c 6c 20 64 65 74 65  reated will dete
5060: 72 6d 69 6e 65 20 68 6f 77 5c 6e 22 29 3b 0a 09  rmine how\n");..
5070: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5080: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5090: 20 20 20 20 20 20 20 20 20 20 6d 61 6e 79 20 73            many s
50a0: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 74 72 61 6e  imultaneous tran
50b0: 73 66 65 72 73 20 77 69 6c 6c 20 62 65 20 70 6f  sfers will be po
50c0: 73 73 69 62 6c 65 2e 20 54 68 65 5c 6e 22 29 3b  ssible. The\n");
50d0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
50e0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
5100: 75 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20  ult is %lu.\n", 
5110: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
5120: 54 48 52 45 41 44 5f 43 4f 55 4e 54 29 3b 0a 09  THREAD_COUNT);..
5130: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5140: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
5150: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5160: 20 2d 63 20 28 6f 72 20 2d 2d 63 61 63 68 65 29   -c (or --cache)
5170: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
5180: 75 6d 62 65 72 20 6f 66 20 66 69 6c 65 20 69 6e  umber of file in
5190: 66 6f 72 6d 61 74 69 6f 6e 20 63 61 63 68 65 20  formation cache 
51a0: 65 6e 74 72 69 65 73 5c 6e 22 29 3b 0a 09 09 66  entries\n");...f
51b0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74        to allocat
51e0: 65 2e 20 20 45 61 63 68 20 63 61 63 68 65 20 65  e.  Each cache e
51f0: 6e 74 72 79 20 68 6f 6c 64 73 20 66 69 6c 65 20  ntry holds file 
5200: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 5c 6e  information as\n
5210: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
5220: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 65 6c               wel
5240: 6c 20 61 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l as an open fil
5250: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5260: 74 68 65 20 66 69 6c 65 2c 20 73 6f 20 72 65 73  the file, so res
5270: 6f 75 72 63 65 5c 6e 22 29 3b 0a 09 09 66 70 72  ource\n");...fpr
5280: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 6c 69 6d 69 74 73 20 28 69 2e 65 2e      limits (i.e.
52b0: 2c 20 75 6c 69 6d 69 74 29 20 73 68 6f 75 6c 64  , ulimit) should
52c0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
52d0: 20 54 68 69 73 20 73 68 6f 75 6c 64 5c 6e 22 29   This should\n")
52e0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
52f0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
5300: 20 20 20 20 20 20 20 20 20 20 20 62 65 20 61 20             be a 
5310: 70 72 69 6d 65 20 6e 75 6d 62 65 72 20 66 6f 72  prime number for
5320: 20 69 64 65 61 6c 20 75 73 65 20 77 69 74 68 20   ideal use with 
5330: 74 68 65 20 6c 6f 6f 6b 75 70 20 6d 65 74 68 6f  the lookup metho
5340: 64 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  d.\n");...fprint
5350: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
5380: 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  %lu.\n", (unsign
5390: 65 64 20 6c 6f 6e 67 29 20 43 41 43 48 45 5f 53  ed long) CACHE_S
53a0: 49 5a 45 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  IZE);...fprintf(
53b0: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
53c0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
53d0: 20 22 20 20 20 20 20 20 2d 6c 20 28 6f 72 20 2d   "      -l (or -
53e0: 2d 6c 6f 67 29 20 73 70 65 63 69 66 69 65 73 20  -log) specifies 
53f0: 61 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 6f 70  a filename to op
5400: 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6c  en for writing l
5410: 6f 67 20 65 6e 74 72 69 65 73 2e 20 20 4c 6f 67  og entries.  Log
5420: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
5430: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74               ent
5450: 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 66 6f  ries are made fo
5460: 72 20 76 61 72 69 6f 75 73 20 73 74 61 67 65 73  r various stages
5470: 20 69 6e 20 74 72 61 6e 73 66 65 72 69 6e 67 20   in transfering 
5480: 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70  files.\n");...fp
5490: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20     The log file 
54c0: 69 73 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  is opened before
54d0: 20 73 77 69 74 63 68 69 6e 67 20 75 73 65 72 73   switching users
54e0: 20 28 73 65 65 20 5c 22 2d 75 5c 22 29 5c 6e 22   (see \"-u\")\n"
54f0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5500: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
5510: 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 72 6f            and ro
5520: 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 28  ot directories (
5530: 73 65 65 20 5c 22 2d 72 5c 22 29 2e 20 20 54 68  see \"-r\").  Th
5540: 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 65  e log file is ne
5550: 76 65 72 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ver\n");...fprin
5560: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 63 6c 6f 73 65 64 20 73 6f 20 6c 6f 67 20 72 6f  closed so log ro
5590: 74 61 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 73  tation without s
55a0: 74 6f 70 70 69 6e 67 20 74 68 65 20 64 61 65 6d  topping the daem
55b0: 6f 6e 20 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a  on is will\n");.
55c0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
55d0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
55e0: 20 20 20 20 20 20 20 6e 6f 74 20 77 6f 72 6b 2e         not work.
55f0: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 5c    The value of \
5600: 22 2d 5c 22 20 69 6e 64 69 63 61 74 65 73 20 74  "-\" indicates t
5610: 68 61 74 20 73 74 61 6e 64 61 72 64 20 6f 75 74  hat standard out
5620: 70 75 74 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  put\n");...fprin
5630: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
5660: 6f 72 20 6c 6f 67 67 69 6e 67 2e 20 20 54 68 65  or logging.  The
5670: 20 64 65 66 61 75 6c 74 20 69 73 20 5c 22 25 73   default is \"%s
5680: 5c 22 2e 5c 6e 22 2c 20 4c 4f 47 5f 46 49 4c 45  \".\n", LOG_FILE
5690: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
56a0: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
56b0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
56c0: 20 20 20 20 20 2d 75 20 28 6f 72 20 2d 2d 75 73       -u (or --us
56d0: 65 72 29 20 73 70 65 63 69 66 69 65 73 20 74 68  er) specifies th
56e0: 65 20 75 73 65 72 20 74 6f 20 73 77 69 74 63 68  e user to switch
56f0: 20 75 73 65 72 20 49 44 73 20 74 6f 20 62 65 66   user IDs to bef
5700: 6f 72 65 20 73 65 72 76 69 63 69 6e 67 5c 6e 22  ore servicing\n"
5710: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5720: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
5730: 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65             reque
5740: 73 74 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c  sts.  The defaul
5750: 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  t is not change 
5760: 75 73 65 72 20 49 44 73 2e 5c 6e 22 29 3b 0a 09  user IDs.\n");..
5770: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5780: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
5790: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
57a0: 20 2d 72 20 28 6f 72 20 2d 2d 72 6f 6f 74 29 20   -r (or --root) 
57b0: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 64 69  specifies the di
57c0: 72 65 63 74 6f 72 79 20 74 6f 20 61 63 74 20 61  rectory to act a
57d0: 73 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63  s the root direc
57e0: 74 6f 72 79 20 66 6f 72 5c 6e 22 29 3b 0a 09 09  tory for\n");...
57f0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
5800: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5810: 20 20 20 20 20 20 74 68 65 20 66 69 6c 65 20 73        the file s
5820: 65 72 76 65 72 2e 20 20 49 66 20 74 68 69 73 20  erver.  If this 
5830: 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66  option is specif
5840: 69 65 64 2c 20 63 68 72 6f 6f 74 28 32 29 5c 6e  ied, chroot(2)\n
5850: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
5860: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
5870: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 63              is c
5880: 61 6c 6c 65 64 2e 20 20 54 68 65 20 64 65 66 61  alled.  The defa
5890: 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ult is not chang
58a0: 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69  e root directori
58b0: 65 73 2c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  es,\n");...fprin
58c0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 74 68 61 74 20 69 73 2c 20 74 68 65 20 5c 22   that is, the \"
58f0: 2f 5c 22 20 64 69 72 65 63 74 6f 72 79 20 69 73  /\" directory is
5900: 20 73 68 61 72 65 64 20 6f 75 74 2e 20 20 54 68   shared out.  Th
5910: 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66  is will\n");...f
5920: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 20 6c 69 6b 65 6c 79 20 62 65 20 61       likely be a
5950: 20 73 65 63 75 72 69 74 79 20 69 73 73 75 65 2c   security issue,
5960: 20 73 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   so this option 
5970: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 5c 6e 22  should always\n"
5980: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5990: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
59a0: 20 20 20 20 20 20 20 20 20 20 20 62 65 20 75 73             be us
59b0: 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65  ed.\n");..}...re
59c0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  turn;.}../* Add 
59d0: 61 20 67 65 74 6f 70 74 20 6f 70 74 69 6f 6e 20  a getopt option 
59e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
59f0: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
5a00: 5f 73 65 74 6f 70 74 28 73 74 72 75 63 74 20 6f  _setopt(struct o
5a10: 70 74 69 6f 6e 20 2a 6f 70 74 2c 20 63 6f 6e 73  ption *opt, cons
5a20: 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e  t char *name, in
5a30: 74 20 68 61 73 5f 61 72 67 2c 20 69 6e 74 20 76  t has_arg, int v
5a40: 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e 6e 61 6d 65  al) {..opt->name
5a50: 20 20 20 20 20 3d 20 6e 61 6d 65 3b 0a 09 6f 70       = name;..op
5a60: 74 2d 3e 68 61 73 5f 61 72 67 20 20 3d 20 68 61  t->has_arg  = ha
5a70: 73 5f 61 72 67 3b 0a 09 6f 70 74 2d 3e 66 6c 61  s_arg;..opt->fla
5a80: 67 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 09 6f  g     = NULL;..o
5a90: 70 74 2d 3e 76 61 6c 20 20 20 20 20 20 3d 20 76  pt->val      = v
5aa0: 61 6c 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  al;...return;.}.
5ab0: 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 75 73  ./* Resolve a us
5ac0: 65 72 6e 61 6d 65 20 74 6f 20 61 20 55 49 44 20  ername to a UID 
5ad0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
5ae0: 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28  led_user_lookup(
5af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 73 65 72  const char *user
5b00: 2c 20 75 69 64 5f 74 20 2a 75 73 65 72 5f 69 64  , uid_t *user_id
5b10: 29 20 7b 0a 09 63 68 61 72 20 2a 6e 65 78 74 3b  ) {..char *next;
5b20: 0a 09 75 69 64 5f 74 20 75 73 65 72 5f 69 64 5f  ..uid_t user_id_
5b30: 63 68 65 63 6b 3b 0a 23 69 66 6e 64 65 66 20 46  check;.#ifndef F
5b40: 49 4c 45 44 5f 4e 4f 5f 47 45 54 50 57 4e 41 4d  ILED_NO_GETPWNAM
5b50: 0a 09 73 74 72 75 63 74 20 70 61 73 73 77 64 20  ..struct passwd 
5b60: 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20 3d 20 67 65  *ent;...ent = ge
5b70: 74 70 77 6e 61 6d 28 75 73 65 72 29 3b 0a 09 69  tpwnam(user);..i
5b80: 66 20 28 65 6e 74 20 21 3d 20 4e 55 4c 4c 29 20  f (ent != NULL) 
5b90: 7b 0a 09 09 2a 75 73 65 72 5f 69 64 20 3d 20 65  {...*user_id = e
5ba0: 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a 0a 09 09 72  nt->pw_uid;....r
5bb0: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 23 65 6e  eturn(0);..}.#en
5bc0: 64 69 66 0a 0a 09 75 73 65 72 5f 69 64 5f 63 68  dif...user_id_ch
5bd0: 65 63 6b 20 3d 20 73 74 72 74 6f 75 6c 6c 28 75  eck = strtoull(u
5be0: 73 65 72 2c 20 26 6e 65 78 74 2c 20 31 30 29 3b  ser, &next, 10);
5bf0: 0a 09 69 66 20 28 6e 65 78 74 20 3d 3d 20 4e 55  ..if (next == NU
5c00: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  LL) {...return(1
5c10: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e 65 78 74  );..}...if (next
5c20: 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] != '\0') {..
5c30: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
5c40: 09 2a 75 73 65 72 5f 69 64 20 3d 20 75 73 65 72  .*user_id = user
5c50: 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a 09 72 65 74  _id_check;...ret
5c60: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 61  urn(0);.}../* Da
5c70: 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73 74 61 74 69  emonize */.stati
5c80: 63 20 69 6e 74 20 66 69 6c 65 64 5f 64 61 65 6d  c int filed_daem
5c90: 6f 6e 69 7a 65 28 76 6f 69 64 29 20 7b 0a 09 70  onize(void) {..p
5ca0: 69 64 5f 74 20 73 65 74 73 69 64 5f 72 65 74 2c  id_t setsid_ret,
5cb0: 20 66 6f 72 6b 5f 72 65 74 3b 0a 09 69 6e 74 20   fork_ret;..int 
5cc0: 63 68 64 69 72 5f 72 65 74 2c 20 64 75 70 32 5f  chdir_ret, dup2_
5cd0: 72 65 74 3b 0a 09 69 6e 74 20 66 64 5f 69 6e 2c  ret;..int fd_in,
5ce0: 20 66 64 5f 6f 75 74 3b 0a 0a 09 63 68 64 69 72   fd_out;...chdir
5cf0: 5f 72 65 74 20 3d 20 63 68 64 69 72 28 22 2f 22  _ret = chdir("/"
5d00: 29 3b 0a 09 69 66 20 28 63 68 64 69 72 5f 72 65  );..if (chdir_re
5d10: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t != 0) {...retu
5d20: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 6b  rn(1);..}...fork
5d30: 5f 72 65 74 20 3d 20 66 6f 72 6b 28 29 3b 0a 09  _ret = fork();..
5d40: 69 66 20 28 66 6f 72 6b 5f 72 65 74 20 3c 20 30  if (fork_ret < 0
5d50: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
5d60: 0a 09 7d 0a 0a 09 69 66 20 28 66 6f 72 6b 5f 72  ..}...if (fork_r
5d70: 65 74 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 20 50  et > 0) {.../* P
5d80: 61 72 65 6e 74 20 2a 2f 0a 09 09 77 61 69 74 70  arent */...waitp
5d90: 69 64 28 66 6f 72 6b 5f 72 65 74 2c 20 4e 55 4c  id(fork_ret, NUL
5da0: 4c 2c 20 30 29 3b 0a 0a 09 09 65 78 69 74 28 45  L, 0);....exit(E
5db0: 58 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d  XIT_SUCCESS);..}
5dc0: 0a 0a 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09  .../* Child */..
5dd0: 69 66 20 28 66 6f 72 6b 28 29 20 21 3d 20 30 29  if (fork() != 0)
5de0: 20 7b 0a 09 09 2f 2a 20 43 68 69 6c 64 20 2a 2f   {.../* Child */
5df0: 0a 09 09 65 78 69 74 28 45 58 49 54 5f 53 55 43  ...exit(EXIT_SUC
5e00: 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47  CESS);..}.../* G
5e10: 72 61 6e 64 20 63 68 69 6c 64 20 2a 2f 0a 09 73  rand child */..s
5e20: 65 74 73 69 64 5f 72 65 74 20 3d 20 73 65 74 73  etsid_ret = sets
5e30: 69 64 28 29 3b 0a 09 69 66 20 28 73 65 74 73 69  id();..if (setsi
5e40: 64 5f 72 65 74 20 3d 3d 20 28 28 70 69 64 5f 74  d_ret == ((pid_t
5e50: 29 20 2d 31 29 29 20 7b 0a 09 09 72 65 74 75 72  ) -1)) {...retur
5e60: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 64 5f 69 6e  n(1);..}...fd_in
5e70: 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75   = open("/dev/nu
5e80: 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  ll", O_RDONLY);.
5e90: 09 66 64 5f 6f 75 74 20 3d 20 6f 70 65 6e 28 22  .fd_out = open("
5ea0: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 57 52  /dev/null", O_WR
5eb0: 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 66 64 5f 69  ONLY);..if (fd_i
5ec0: 6e 20 3c 20 30 20 7c 7c 20 66 64 5f 6f 75 74 20  n < 0 || fd_out 
5ed0: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
5ee0: 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65  1);..}...dup2_re
5ef0: 74 20 3d 20 64 75 70 32 28 66 64 5f 69 6e 2c 20  t = dup2(fd_in, 
5f00: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09  STDIN_FILENO);..
5f10: 69 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20  if (dup2_ret != 
5f20: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 20 7b 0a  STDIN_FILENO) {.
5f30: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
5f40: 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70  ..dup2_ret = dup
5f50: 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 4f 55 54  2(fd_out, STDOUT
5f60: 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64  _FILENO);..if (d
5f70: 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 4f 55  up2_ret != STDOU
5f80: 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65  T_FILENO) {...re
5f90: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75  turn(1);..}...du
5fa0: 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64  p2_ret = dup2(fd
5fb0: 5f 6f 75 74 2c 20 53 54 44 45 52 52 5f 46 49 4c  _out, STDERR_FIL
5fc0: 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f  ENO);..if (dup2_
5fd0: 72 65 74 20 21 3d 20 53 54 44 45 52 52 5f 46 49  ret != STDERR_FI
5fe0: 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e  LENO) {...return
5ff0: 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c 6f 73 65 28  (1);..}...close(
6000: 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f 73 65 28 66  fd_in);..close(f
6010: 64 5f 6f 75 74 29 3b 0a 0a 09 72 65 74 75 72 6e  d_out);...return
6020: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 70  (0);.}../* Run p
6030: 72 6f 63 65 73 73 20 2a 2f 0a 69 6e 74 20 6d 61  rocess */.int ma
6040: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
6050: 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 73 74 72  r **argv) {..str
6060: 75 63 74 20 6f 70 74 69 6f 6e 20 6f 70 74 69 6f  uct option optio
6070: 6e 73 5b 31 30 5d 3b 0a 09 63 6f 6e 73 74 20 63  ns[10];..const c
6080: 68 61 72 20 2a 62 69 6e 64 5f 61 64 64 72 20 3d  har *bind_addr =
6090: 20 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e 65 77   BIND_ADDR, *new
60a0: 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f  root = NULL, *lo
60b0: 67 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46 49 4c  g_file = LOG_FIL
60c0: 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f 66 70  E;..FILE *log_fp
60d0: 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 20 3d 20  ;..uid_t user = 
60e0: 30 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d 20 50  0;..int port = P
60f0: 4f 52 54 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e  ORT, thread_coun
6100: 74 20 3d 20 54 48 52 45 41 44 5f 43 4f 55 4e 54  t = THREAD_COUNT
6110: 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 73 69 7a  ;..int cache_siz
6120: 65 20 3d 20 43 41 43 48 45 5f 53 49 5a 45 3b 0a  e = CACHE_SIZE;.
6130: 09 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c 20 63  .int init_ret, c
6140: 68 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74 75 69  hroot_ret, setui
6150: 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f 72 65  d_ret, lookup_re
6160: 74 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a 09 69  t, chdir_ret;..i
6170: 6e 74 20 73 65 74 75 69 64 5f 65 6e 61 62 6c 65  nt setuid_enable
6180: 64 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f 65 6e  d = 0, daemon_en
6190: 61 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20  abled = 0;..int 
61a0: 63 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 2f  ch;..int fd;.../
61b0: 2a 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d 65  * Process argume
61c0: 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67 65  nts */..filed_ge
61d0: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
61e0: 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22 70  (&options[0], "p
61f0: 6f 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61  ort", required_a
6200: 72 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a 09  rgument, 'p');..
6210: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
6220: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
6230: 73 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22 2c  s[1], "threads",
6240: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
6250: 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65 64  nt, 't');..filed
6260: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
6270: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d 2c  opt(&options[2],
6280: 20 22 63 61 63 68 65 22 2c 20 72 65 71 75 69 72   "cache", requir
6290: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63 27  ed_argument, 'c'
62a0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
62b0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
62c0: 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64 22  tions[3], "bind"
62d0: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
62e0: 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c 65  ent, 'b');..file
62f0: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
6300: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34 5d  topt(&options[4]
6310: 2c 20 22 75 73 65 72 22 2c 20 72 65 71 75 69 72  , "user", requir
6320: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75 27  ed_argument, 'u'
6330: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
6340: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
6350: 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74 22  tions[5], "root"
6360: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
6370: 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c 65  ent, 'r');..file
6380: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
6390: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36 5d  topt(&options[6]
63a0: 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72 67  , "help", no_arg
63b0: 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66 69  ument, 'h');..fi
63c0: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
63d0: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
63e0: 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e 6f  7], "daemon", no
63f0: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29 3b  _argument, 'd');
6400: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
6410: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
6420: 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20 72  ons[8], "log", r
6430: 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74  equired_argument
6440: 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'l');..filed_g
6450: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
6460: 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20 4e  t(&options[9], N
6470: 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 09 77 68 69  ULL, 0, 0);..whi
6480: 6c 65 20 28 28 63 68 20 3d 20 67 65 74 6f 70 74  le ((ch = getopt
6490: 5f 6c 6f 6e 67 28 61 72 67 63 2c 20 61 72 67 76  _long(argc, argv
64a0: 2c 20 22 70 3a 74 3a 63 3a 62 3a 75 3a 72 3a 6c  , "p:t:c:b:u:r:l
64b0: 3a 68 64 22 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e  :hd", options, N
64c0: 55 4c 4c 29 29 20 21 3d 20 2d 31 29 20 7b 0a 09  ULL)) != -1) {..
64d0: 09 73 77 69 74 63 68 28 63 68 29 20 7b 0a 09 09  .switch(ch) {...
64e0: 09 63 61 73 65 20 27 70 27 3a 0a 09 09 09 09 70  .case 'p':.....p
64f0: 6f 72 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72  ort = atoi(optar
6500: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
6510: 09 09 63 61 73 65 20 27 74 27 3a 0a 09 09 09 09  ..case 't':.....
6520: 74 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 61  thread_count = a
6530: 74 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09  toi(optarg);....
6540: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
6550: 27 63 27 3a 0a 09 09 09 09 63 61 63 68 65 5f 73  'c':.....cache_s
6560: 69 7a 65 20 3d 20 61 74 6f 69 28 6f 70 74 61 72  ize = atoi(optar
6570: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
6580: 09 09 63 61 73 65 20 27 62 27 3a 0a 09 09 09 09  ..case 'b':.....
6590: 62 69 6e 64 5f 61 64 64 72 20 3d 20 73 74 72 64  bind_addr = strd
65a0: 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09  up(optarg);.....
65b0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
65c0: 75 27 3a 0a 09 09 09 09 73 65 74 75 69 64 5f 65  u':.....setuid_e
65d0: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09  nabled = 1;.....
65e0: 6c 6f 6f 6b 75 70 5f 72 65 74 20 3d 20 66 69 6c  lookup_ret = fil
65f0: 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f  ed_user_lookup(o
6600: 70 74 61 72 67 2c 20 26 75 73 65 72 29 3b 0a 09  ptarg, &user);..
6610: 09 09 09 69 66 20 28 6c 6f 6f 6b 75 70 5f 72 65  ...if (lookup_re
6620: 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 66  t != 0) {......f
6630: 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28  iled_print_help(
6640: 73 74 64 65 72 72 2c 20 30 2c 20 22 49 6e 76 61  stderr, 0, "Inva
6650: 6c 69 64 20 75 73 65 72 6e 61 6d 65 20 73 70 65  lid username spe
6660: 63 69 66 69 65 64 22 29 3b 0a 0a 09 09 09 09 09  cified");.......
6670: 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 09 7d  return(1);.....}
6680: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
6690: 61 73 65 20 27 72 27 3a 0a 09 09 09 09 6e 65 77  ase 'r':.....new
66a0: 72 6f 6f 74 20 3d 20 73 74 72 64 75 70 28 6f 70  root = strdup(op
66b0: 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b  targ);.....break
66c0: 3b 0a 09 09 09 63 61 73 65 20 27 6c 27 3a 0a 09  ;....case 'l':..
66d0: 09 09 09 6c 6f 67 5f 66 69 6c 65 20 3d 20 73 74  ...log_file = st
66e0: 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09  rdup(optarg);...
66f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
6700: 20 27 64 27 3a 0a 09 09 09 09 64 61 65 6d 6f 6e   'd':.....daemon
6710: 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09  _enabled = 1;...
6720: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
6730: 20 27 3f 27 3a 0a 09 09 09 63 61 73 65 20 27 3a   '?':....case ':
6740: 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 72 69  ':.....filed_pri
6750: 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20  nt_help(stderr, 
6760: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09 72  0, NULL);......r
6770: 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 63 61 73  eturn(1);....cas
6780: 65 20 27 68 27 3a 0a 09 09 09 09 66 69 6c 65 64  e 'h':.....filed
6790: 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 6f  _print_help(stdo
67a0: 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  ut, 1, NULL);...
67b0: 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09  ...return(0);...
67c0: 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65 6e 20 6c  }..}.../* Open l
67d0: 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 69 66 20 28  og file */..if (
67e0: 73 74 72 63 6d 70 28 6c 6f 67 5f 66 69 6c 65 2c  strcmp(log_file,
67f0: 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09   "-") == 0) {...
6800: 6c 6f 67 5f 66 70 20 3d 20 73 74 64 6f 75 74 3b  log_fp = stdout;
6810: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6c 6f 67  ..} else {...log
6820: 5f 66 70 20 3d 20 66 6f 70 65 6e 28 6c 6f 67 5f  _fp = fopen(log_
6830: 66 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09 09 69  file, "a+");...i
6840: 66 20 28 6c 6f 67 5f 66 70 20 3d 3d 20 4e 55 4c  f (log_fp == NUL
6850: 4c 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  L) {....perror("
6860: 66 6f 70 65 6e 22 29 3b 0a 0a 09 09 09 72 65 74  fopen");.....ret
6870: 75 72 6e 28 34 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  urn(4);...}..}..
6880: 09 2f 2a 20 43 72 65 61 74 65 20 6c 69 73 74 65  ./* Create liste
6890: 6e 69 6e 67 20 73 6f 63 6b 65 74 20 2a 2f 0a 09  ning socket */..
68a0: 66 64 20 3d 20 66 69 6c 65 64 5f 6c 69 73 74 65  fd = filed_liste
68b0: 6e 28 62 69 6e 64 5f 61 64 64 72 2c 20 70 6f 72  n(bind_addr, por
68c0: 74 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29  t);..if (fd < 0)
68d0: 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c   {...perror("fil
68e0: 65 64 5f 6c 69 73 74 65 6e 22 29 3b 0a 0a 09 09  ed_listen");....
68f0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
6900: 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66 20 61 70  /* Chroot, if ap
6910: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66  propriate */..if
6920: 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09 63   (newroot) {...c
6930: 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72  hdir_ret = chdir
6940: 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09 69 66 20  (newroot);...if 
6950: 28 63 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29  (chdir_ret != 0)
6960: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68   {....perror("ch
6970: 64 69 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  dir");.....retur
6980: 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 63 68 72  n(1);...}....chr
6990: 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72 6f 6f 74  oot_ret = chroot
69a0: 28 22 2e 22 29 3b 0a 09 09 69 66 20 28 63 68 72  (".");...if (chr
69b0: 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  oot_ret != 0) {.
69c0: 09 09 09 70 65 72 72 6f 72 28 22 63 68 72 6f 6f  ...perror("chroo
69d0: 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
69e0: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  1);...}..}.../* 
69f0: 44 72 6f 70 20 70 72 69 76 69 6c 65 67 65 73 2c  Drop privileges,
6a00: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 20   if appropriate 
6a10: 2a 2f 0a 09 69 66 20 28 73 65 74 75 69 64 5f 65  */..if (setuid_e
6a20: 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73 65 74 75  nabled) {...setu
6a30: 69 64 5f 72 65 74 20 3d 20 73 65 74 75 69 64 28  id_ret = setuid(
6a40: 75 73 65 72 29 3b 0a 09 09 69 66 20 28 73 65 74  user);...if (set
6a50: 75 69 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  uid_ret != 0) {.
6a60: 09 09 09 70 65 72 72 6f 72 28 22 73 65 74 75 69  ...perror("setui
6a70: 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
6a80: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  1);...}..}.../* 
6a90: 42 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20  Become a daemon 
6aa0: 2a 2f 0a 09 69 66 20 28 64 61 65 6d 6f 6e 5f 65  */..if (daemon_e
6ab0: 6e 61 62 6c 65 64 29 20 7b 0a 09 09 66 69 6c 65  nabled) {...file
6ac0: 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 29 3b 0a 09  d_daemonize();..
6ad0: 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  }.../* Initializ
6ae0: 65 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d  e */..init_ret =
6af0: 20 66 69 6c 65 64 5f 69 6e 69 74 28 63 61 63 68   filed_init(cach
6b00: 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 69 6e  e_size);..if (in
6b10: 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
6b20: 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 69  .perror("filed_i
6b30: 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  nit");....return
6b40: 28 33 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65  (3);..}.../* Cre
6b50: 61 74 65 20 6c 6f 67 67 69 6e 67 20 74 68 72 65  ate logging thre
6b60: 61 64 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20  ad */..init_ret 
6b70: 3d 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  = filed_logging_
6b80: 74 68 72 65 61 64 5f 69 6e 69 74 28 6c 6f 67 5f  thread_init(log_
6b90: 66 70 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  fp);..if (init_r
6ba0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
6bb0: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 67 69  ror("filed_loggi
6bc0: 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29  ng_thread_init")
6bd0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29 3b 0a  ;....return(4);.
6be0: 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 77  .}.../* Create w
6bf0: 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f  orker threads */
6c00: 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c  ..init_ret = fil
6c10: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
6c20: 73 5f 69 6e 69 74 28 66 64 2c 20 74 68 72 65 61  s_init(fd, threa
6c30: 64 5f 63 6f 75 6e 74 29 3b 0a 09 69 66 20 28 69  d_count);..if (i
6c40: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
6c50: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
6c60: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69  worker_threads_i
6c70: 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  nit");....return
6c80: 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69  (4);..}.../* Wai
6c90: 74 20 66 6f 72 20 74 68 72 65 61 64 73 20 74 6f  t for threads to
6ca0: 20 65 78 69 74 20 2a 2f 0a 09 2f 2a 20 58 58 58   exit */../* XXX
6cb0: 3a 54 4f 44 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74  :TODO: Monitor t
6cc0: 68 72 65 61 64 20 75 73 61 67 65 20 2a 2f 0a 09  hread usage */..
6cd0: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 73 6c  while (1) {...sl
6ce0: 65 65 70 28 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a  eep(60);..}.../*
6cf0: 20 52 65 74 75 72 6e 20 69 6e 20 66 61 69 6c 75   Return in failu
6d00: 72 65 20 2a 2f 0a 09 72 65 74 75 72 6e 28 32 29  re */..return(2)
6d10: 3b 0a 7d 0a                                      ;.}.