Hex Artifact Content

Artifact 1884ac057788a3a82279c6f17cd6cebc01da6e09:


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 09 66 64 20 3d 20 66 64 3b 0a  (fp);..fd = fd;.
2490: 0a 09 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20  ..range_start = 
24a0: 30 3b 0a 09 72 61 6e 67 65 5f 65 6e 64 20 20 20  0;..range_end   
24b0: 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 72 65 71 75  = 0;..range_requ
24c0: 65 73 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f  est = 0;..range_
24d0: 6c 65 6e 67 74 68 20 3d 20 2d 31 3b 0a 0a 09 62  length = -1;...b
24e0: 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73  uffer = buffer_s
24f0: 74 2d 3e 70 61 74 68 5f 62 3b 0a 09 62 75 66 66  t->path_b;..buff
2500: 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  er_len = sizeof(
2510: 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 5f  buffer_st->path_
2520: 62 29 3b 0a 0a 09 74 6d 70 62 75 66 66 65 72 20  b);...tmpbuffer 
2530: 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70  = buffer_st->tmp
2540: 62 75 66 3b 0a 09 74 6d 70 62 75 66 66 65 72 5f  buf;..tmpbuffer_
2550: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66  len = sizeof(buf
2560: 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 29 3b  fer_st->tmpbuf);
2570: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
2580: 28 22 57 41 49 54 5f 46 4f 52 5f 52 45 51 55 45  ("WAIT_FOR_REQUE
2590: 53 54 20 46 44 3d 25 69 22 2c 20 66 64 29 3b 0a  ST FD=%i", fd);.
25a0: 0a 09 66 67 65 74 73 28 62 75 66 66 65 72 2c 20  ..fgets(buffer, 
25b0: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b  buffer_len, fp);
25c0: 0a 0a 09 6d 65 74 68 6f 64 20 3d 20 62 75 66 66  ...method = buff
25d0: 65 72 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 73  er;...buffer = s
25e0: 74 72 63 68 72 28 62 75 66 66 65 72 2c 20 27 20  trchr(buffer, ' 
25f0: 27 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20  ');..if (buffer 
2600: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c  == NULL) {...fil
2610: 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 47 4f 54 5f  ed_log_msg("GOT_
2620: 52 45 51 55 45 53 54 20 46 44 3d 25 69 20 45 52  REQUEST FD=%i ER
2630: 52 4f 52 3d 66 6f 72 6d 61 74 22 2c 20 66 64 29  ROR=format", fd)
2640: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
2650: 29 3b 0a 09 7d 0a 0a 09 2a 62 75 66 66 65 72 20  );..}...*buffer 
2660: 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72 2b  = '\0';..buffer+
2670: 2b 3b 0a 0a 09 70 61 74 68 20 3d 20 62 75 66 66  +;...path = buff
2680: 65 72 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 73  er;...buffer = s
2690: 74 72 63 68 72 28 62 75 66 66 65 72 2c 20 27 20  trchr(buffer, ' 
26a0: 27 29 3b 0a 09 69 66 20 28 62 75 66 66 65 72 20  ');..if (buffer 
26b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 62 75  != NULL) {...*bu
26c0: 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09 09 62  ffer = '\0';...b
26d0: 75 66 66 65 72 2b 2b 3b 0a 09 7d 0a 0a 09 66 69  uffer++;..}...fi
26e0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 47 4f 54  led_log_msg("GOT
26f0: 5f 52 45 51 55 45 53 54 20 46 44 3d 25 69 20 50  _REQUEST FD=%i P
2700: 41 54 48 3d 25 73 22 2c 20 66 64 2c 20 70 61 74  ATH=%s", fd, pat
2710: 68 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  h);...filed_log_
2720: 6d 73 67 28 22 57 41 49 54 5f 46 4f 52 5f 48 45  msg("WAIT_FOR_HE
2730: 41 44 45 52 53 20 46 44 3d 25 69 22 2c 20 66 64  ADERS FD=%i", fd
2740: 29 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b  );...for (i = 0;
2750: 20 69 20 3c 20 31 30 30 3b 20 69 2b 2b 29 20 7b   i < 100; i++) {
2760: 0a 09 09 66 67 65 74 73 28 74 6d 70 62 75 66 66  ...fgets(tmpbuff
2770: 65 72 2c 20 74 6d 70 62 75 66 66 65 72 5f 6c 65  er, tmpbuffer_le
2780: 6e 2c 20 66 70 29 3b 0a 0a 09 09 69 66 20 28 73  n, fp);....if (s
2790: 74 72 6e 63 61 73 65 63 6d 70 28 74 6d 70 62 75  trncasecmp(tmpbu
27a0: 66 66 65 72 2c 20 22 52 61 6e 67 65 3a 20 22 2c  ffer, "Range: ",
27b0: 20 37 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 77   7) == 0) {....w
27c0: 6f 72 6b 62 75 66 66 65 72 20 3d 20 74 6d 70 62  orkbuffer = tmpb
27d0: 75 66 66 65 72 20 2b 20 37 3b 0a 0a 09 09 09 69  uffer + 7;.....i
27e0: 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28 77  f (strncasecmp(w
27f0: 6f 72 6b 62 75 66 66 65 72 2c 20 22 62 79 74 65  orkbuffer, "byte
2800: 73 3d 22 2c 20 36 29 20 3d 3d 20 30 29 20 7b 0a  s=", 6) == 0) {.
2810: 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 2b  ....workbuffer +
2820: 3d 20 36 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f  = 6;......range_
2830: 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 09 09  request = 1;....
2840: 09 09 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20  ..range_start = 
2850: 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75 66  strtoull(workbuf
2860: 66 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65 72  fer, &workbuffer
2870: 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 0a 09 09 09  _next, 10);.....
2880: 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 77 6f  .workbuffer = wo
2890: 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 0a  rkbuffer_next;..
28a0: 09 09 09 09 69 66 20 28 2a 77 6f 72 6b 62 75 66  ....if (*workbuf
28b0: 66 65 72 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09  fer == '-') {...
28c0: 09 09 09 77 6f 72 6b 62 75 66 66 65 72 2b 2b 3b  ...workbuffer++;
28d0: 0a 0a 09 09 09 09 09 69 66 20 28 2a 77 6f 72 6b  .......if (*work
28e0: 62 75 66 66 65 72 20 21 3d 20 27 5c 72 27 20 26  buffer != '\r' &
28f0: 26 20 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d  & *workbuffer !=
2900: 20 27 5c 6e 27 29 20 7b 0a 09 09 09 09 09 09 72   '\n') {.......r
2910: 61 6e 67 65 5f 65 6e 64 20 3d 20 73 74 72 74 6f  ange_end = strto
2920: 75 6c 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c 20  ull(workbuffer, 
2930: 26 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74  &workbuffer_next
2940: 2c 20 31 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09  , 10);......}...
2950: 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ..}....}...}....
2960: 69 66 20 28 6d 65 6d 63 6d 70 28 74 6d 70 62 75  if (memcmp(tmpbu
2970: 66 66 65 72 2c 20 22 5c 72 5c 6e 22 2c 20 32 29  ffer, "\r\n", 2)
2980: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 62 72 65 61   == 0) {....brea
2990: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 69 6c 65  k;...}..}...file
29a0: 64 5f 6c 6f 67 5f 6d 73 67 28 22 47 4f 54 5f 48  d_log_msg("GOT_H
29b0: 45 41 44 45 52 53 20 46 44 3d 25 69 22 2c 20 66  EADERS FD=%i", f
29c0: 64 29 3b 0a 0a 09 2f 2a 20 57 65 20 6f 6e 6c 79  d);.../* We only
29d0: 20 68 61 6e 64 6c 65 20 74 68 65 20 22 47 45 54   handle the "GET
29e0: 22 20 6d 65 74 68 6f 64 20 2a 2f 0a 09 69 66 20  " method */..if 
29f0: 28 73 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68  (strcasecmp(meth
2a00: 6f 64 2c 20 22 67 65 74 22 29 20 21 3d 20 30 29  od, "get") != 0)
2a10: 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c   {...return(NULL
2a20: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
2a30: 6d 69 6e 65 20 72 61 6e 67 65 20 2a 2f 0a 09 69  mine range */..i
2a40: 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 21 3d 20  f (range_end != 
2a50: 30 29 20 7b 0a 09 09 69 66 20 28 72 61 6e 67 65  0) {...if (range
2a60: 5f 65 6e 64 20 3c 3d 20 72 61 6e 67 65 5f 73 74  _end <= range_st
2a70: 61 72 74 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  art) {....return
2a80: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 72  (NULL);...}....r
2a90: 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 72 61  ange_length = ra
2aa0: 6e 67 65 5f 65 6e 64 20 2d 20 72 61 6e 67 65 5f  nge_end - range_
2ab0: 73 74 61 72 74 3b 0a 0a 09 09 66 69 6c 65 64 5f  start;....filed_
2ac0: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43  log_msg_debug("C
2ad0: 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68 20  omputing length 
2ae0: 70 61 72 61 6d 65 74 65 72 3a 20 25 6c 6c 75 20  parameter: %llu 
2af0: 3d 20 25 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c 0a  = %llu - %llu",.
2b00: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
2b10: 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 6c 65  g long) range_le
2b20: 6e 67 74 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e  ngth,....(unsign
2b30: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61  ed long long) ra
2b40: 6e 67 65 5f 65 6e 64 2c 0a 09 09 09 28 75 6e 73  nge_end,....(uns
2b50: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
2b60: 20 72 61 6e 67 65 5f 73 74 61 72 74 0a 09 09 29   range_start...)
2b70: 3b 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20 75  ;..}.../* Fill u
2b80: 70 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 72  p structure to r
2b90: 65 74 75 72 6e 20 2a 2f 0a 09 62 75 66 66 65 72  eturn */..buffer
2ba0: 5f 73 74 2d 3e 70 61 74 68 20 20 20 3d 20 70 61  _st->path   = pa
2bb0: 74 68 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e  th;..buffer_st->
2bc0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 70 72  headers.range.pr
2bd0: 65 73 65 6e 74 20 3d 20 72 61 6e 67 65 5f 72 65  esent = range_re
2be0: 71 75 65 73 74 3b 0a 09 62 75 66 66 65 72 5f 73  quest;..buffer_s
2bf0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
2c00: 2e 6f 66 66 73 65 74 20 20 3d 20 72 61 6e 67 65  .offset  = range
2c10: 5f 73 74 61 72 74 3b 0a 09 62 75 66 66 65 72 5f  _start;..buffer_
2c20: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
2c30: 65 2e 6c 65 6e 67 74 68 20 20 3d 20 72 61 6e 67  e.length  = rang
2c40: 65 5f 6c 65 6e 67 74 68 3b 0a 0a 09 72 65 74 75  e_length;...retu
2c50: 72 6e 28 62 75 66 66 65 72 5f 73 74 29 3b 0a 7d  rn(buffer_st);.}
2c60: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  ../* Return an e
2c70: 72 72 6f 72 20 70 61 67 65 20 2a 2f 0a 73 74 61  rror page */.sta
2c80: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 65  tic void filed_e
2c90: 72 72 6f 72 5f 70 61 67 65 28 46 49 4c 45 20 2a  rror_page(FILE *
2ca0: 66 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fp, const char *
2cb0: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 69 6e  date_current, in
2cc0: 74 20 65 72 72 6f 72 5f 6e 75 6d 62 65 72 29 20  t error_number) 
2cd0: 7b 0a 09 63 68 61 72 20 2a 65 72 72 6f 72 5f 73  {..char *error_s
2ce0: 74 72 69 6e 67 20 3d 20 22 3c 68 74 6d 6c 3e 3c  tring = "<html><
2cf0: 68 65 61 64 3e 3c 74 69 74 6c 65 3e 45 52 52 4f  head><title>ERRO
2d00: 52 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e  R</title></head>
2d10: 3c 62 6f 64 79 3e 55 6e 61 62 6c 65 20 74 6f 20  <body>Unable to 
2d20: 70 72 6f 63 65 73 73 20 72 65 71 75 65 73 74 3c  process request<
2d30: 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c 3e 22 3b 0a  /body></html>";.
2d40: 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 48  ..fprintf(fp, "H
2d50: 54 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c  TTP/1.1 %i OK\r\
2d60: 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72  nDate: %s\r\nSer
2d70: 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61  ver: filed\r\nLa
2d80: 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c  st-Modified: %s\
2d90: 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74  r\nContent-Lengt
2da0: 68 3a 20 25 6c 6c 75 5c 72 5c 6e 43 6f 6e 74 65  h: %llu\r\nConte
2db0: 6e 74 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43  nt-Type: %s\r\nC
2dc0: 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65  onnection: close
2dd0: 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c 0a 09 09 65  \r\n\r\n%s",...e
2de0: 72 72 6f 72 5f 6e 75 6d 62 65 72 2c 0a 09 09 64  rror_number,...d
2df0: 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09 64  ate_current,...d
2e00: 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09 28  ate_current,...(
2e10: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
2e20: 6e 67 29 20 73 74 72 6c 65 6e 28 65 72 72 6f 72  ng) strlen(error
2e30: 5f 73 74 72 69 6e 67 29 2c 0a 09 09 22 74 65 78  _string),..."tex
2e40: 74 2f 68 74 6d 6c 22 2c 0a 09 09 65 72 72 6f 72  t/html",...error
2e50: 5f 73 74 72 69 6e 67 0a 09 29 3b 0a 7d 0a 0a 2f  _string..);.}../
2e60: 2a 20 48 61 6e 64 6c 65 20 61 20 73 69 6e 67 6c  * Handle a singl
2e70: 65 20 72 65 71 75 65 73 74 20 66 72 6f 6d 20 61  e request from a
2e80: 20 63 6c 69 65 6e 74 20 2a 2f 0a 73 74 61 74 69   client */.stati
2e90: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 68 61 6e  c void filed_han
2ea0: 64 6c 65 5f 63 6c 69 65 6e 74 28 69 6e 74 20 66  dle_client(int f
2eb0: 64 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  d, struct filed_
2ec0: 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a 72 65  http_request *re
2ed0: 71 75 65 73 74 29 20 7b 0a 09 73 74 72 75 63 74  quest) {..struct
2ee0: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20   filed_fileinfo 
2ef0: 2a 66 69 6c 65 69 6e 66 6f 3b 0a 09 73 73 69 7a  *fileinfo;..ssiz
2f00: 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 72 65 74  e_t sendfile_ret
2f10: 3b 0a 09 73 69 7a 65 5f 74 20 73 65 6e 64 66 69  ;..size_t sendfi
2f20: 6c 65 5f 6c 65 6e 2c 20 73 65 6e 64 66 69 6c 65  le_len, sendfile
2f30: 5f 73 65 6e 74 2c 20 73 65 6e 64 66 69 6c 65 5f  _sent, sendfile_
2f40: 73 69 7a 65 3b 0a 09 6f 66 66 5f 74 20 73 65 6e  size;..off_t sen
2f50: 64 66 69 6c 65 5f 6f 66 66 73 65 74 3b 0a 09 63  dfile_offset;..c
2f60: 68 61 72 20 2a 70 61 74 68 3b 0a 09 63 68 61 72  har *path;..char
2f70: 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20   *date_current, 
2f80: 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62 5b 36  date_current_b[6
2f90: 34 5d 3b 0a 09 69 6e 74 20 68 74 74 70 5f 63 6f  4];..int http_co
2fa0: 64 65 3b 0a 09 46 49 4c 45 20 2a 66 70 3b 0a 0a  de;..FILE *fp;..
2fb0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 63 75  ./* Determine cu
2fc0: 72 72 65 6e 74 20 74 69 6d 65 20 2a 2f 0a 09 64  rrent time */..d
2fd0: 61 74 65 5f 63 75 72 72 65 6e 74 20 3d 20 66 69  ate_current = fi
2fe0: 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28  led_format_time(
2ff0: 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62 2c 20  date_current_b, 
3000: 73 69 7a 65 6f 66 28 64 61 74 65 5f 63 75 72 72  sizeof(date_curr
3010: 65 6e 74 5f 62 29 2c 20 74 69 6d 65 28 4e 55 4c  ent_b), time(NUL
3020: 4c 29 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73  L));.../* Open s
3030: 6f 63 6b 65 74 20 61 73 20 41 4e 53 49 20 49 2f  ocket as ANSI I/
3040: 4f 20 66 6f 72 20 65 61 73 65 20 6f 66 20 75 73  O for ease of us
3050: 65 20 2a 2f 0a 09 66 70 20 3d 20 66 64 6f 70 65  e */..fp = fdope
3060: 6e 28 66 64 2c 20 22 77 2b 62 22 29 3b 0a 09 69  n(fd, "w+b");..i
3070: 66 20 28 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  f (fp == NULL) {
3080: 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09  ...close(fd);...
3090: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65  .return;..}...re
30a0: 71 75 65 73 74 20 3d 20 66 69 6c 65 64 5f 67 65  quest = filed_ge
30b0: 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74 28 66  t_http_request(f
30c0: 70 2c 20 72 65 71 75 65 73 74 29 3b 0a 0a 09 69  p, request);...i
30d0: 66 20 28 72 65 71 75 65 73 74 20 3d 3d 20 4e 55  f (request == NU
30e0: 4c 4c 20 7c 7c 20 72 65 71 75 65 73 74 2d 3e 70  LL || request->p
30f0: 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ath == NULL) {..
3100: 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67  .filed_error_pag
3110: 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72 65  e(fp, date_curre
3120: 6e 74 2c 20 35 30 30 29 3b 0a 0a 09 09 66 69 6c  nt, 500);....fil
3130: 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 49 4e 56 41  ed_log_msg("INVA
3140: 4c 49 44 5f 52 45 51 55 45 53 54 20 46 44 3d 25  LID_REQUEST FD=%
3150: 69 20 45 52 52 4f 52 3d 35 30 30 22 2c 20 66 64  i ERROR=500", fd
3160: 29 3b 0a 0a 09 09 66 63 6c 6f 73 65 28 66 70 29  );....fclose(fp)
3170: 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a  ;....return;..}.
3180: 0a 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
3190: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 70 72 65  eaders.range.pre
31a0: 73 65 6e 74 29 20 7b 0a 09 09 66 69 6c 65 64 5f  sent) {...filed_
31b0: 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45 53 53  log_msg("PROCESS
31c0: 5f 52 45 50 4c 59 5f 53 54 41 52 54 20 46 44 3d  _REPLY_START FD=
31d0: 25 69 20 50 41 54 48 3d 25 73 20 52 41 4e 47 45  %i PATH=%s RANGE
31e0: 5f 53 54 41 52 54 3d 25 6c 6c 75 20 52 41 4e 47  _START=%llu RANG
31f0: 45 5f 4c 45 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a  E_LENGTH=%llu",.
3200: 09 09 09 66 64 2c 0a 09 09 09 72 65 71 75 65 73  ...fd,....reques
3210: 74 2d 3e 70 61 74 68 2c 0a 09 09 09 28 75 6e 73  t->path,....(uns
3220: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3230: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
3240: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a  s.range.offset,.
3250: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
3260: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
3270: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
3280: 65 6e 67 74 68 0a 09 09 29 3b 0a 09 7d 20 65 6c  ength...);..} el
3290: 73 65 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  se {...filed_log
32a0: 5f 6d 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45  _msg("PROCESS_RE
32b0: 50 4c 59 5f 53 54 41 52 54 20 46 44 3d 25 69 20  PLY_START FD=%i 
32c0: 50 41 54 48 3d 25 73 22 2c 20 66 64 2c 20 72 65  PATH=%s", fd, re
32d0: 71 75 65 73 74 2d 3e 70 61 74 68 29 3b 0a 09 7d  quest->path);..}
32e0: 0a 0a 09 70 61 74 68 20 3d 20 72 65 71 75 65 73  ...path = reques
32f0: 74 2d 3e 70 61 74 68 3b 0a 0a 09 68 74 74 70 5f  t->path;...http_
3300: 63 6f 64 65 20 3d 20 2d 31 3b 0a 0a 09 66 69 6c  code = -1;...fil
3310: 65 69 6e 66 6f 20 3d 20 66 69 6c 65 64 5f 6f 70  einfo = filed_op
3320: 65 6e 5f 66 69 6c 65 28 70 61 74 68 2c 20 26 72  en_file(path, &r
3330: 65 71 75 65 73 74 2d 3e 66 69 6c 65 69 6e 66 6f  equest->fileinfo
3340: 29 3b 0a 09 69 66 20 28 66 69 6c 65 69 6e 66 6f  );..if (fileinfo
3350: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69   == NULL) {...fi
3360: 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66  led_error_page(f
3370: 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  p, date_current,
3380: 20 34 30 34 29 3b 0a 0a 09 09 66 69 6c 65 64 5f   404);....filed_
3390: 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45 53 53  log_msg("PROCESS
33a0: 5f 52 45 50 4c 59 5f 43 4f 4d 50 4c 45 54 45 20  _REPLY_COMPLETE 
33b0: 46 44 3d 25 69 20 45 52 52 4f 52 3d 34 30 34 22  FD=%i ERROR=404"
33c0: 2c 20 66 64 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  , fd);..} else {
33d0: 0a 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e  ...if (request->
33e0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
33f0: 66 73 65 74 20 21 3d 20 30 20 7c 7c 20 72 65 71  fset != 0 || req
3400: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
3410: 6e 67 65 2e 6c 65 6e 67 74 68 20 3e 3d 20 30 29  nge.length >= 0)
3420: 20 7b 0a 09 09 09 69 66 20 28 72 65 71 75 65 73   {....if (reques
3430: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
3440: 2e 6f 66 66 73 65 74 20 3e 3d 20 66 69 6c 65 69  .offset >= filei
3450: 6e 66 6f 2d 3e 6c 65 6e 29 20 7b 0a 09 09 09 09  nfo->len) {.....
3460: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 50  filed_log_msg("P
3470: 52 4f 43 45 53 53 5f 52 45 50 4c 59 5f 43 4f 4d  ROCESS_REPLY_COM
3480: 50 4c 45 54 45 20 46 44 3d 25 69 20 45 52 52 4f  PLETE FD=%i ERRO
3490: 52 3d 34 31 36 22 2c 20 66 64 29 3b 0a 0a 09 09  R=416", fd);....
34a0: 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61  ..filed_error_pa
34b0: 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72  ge(fp, date_curr
34c0: 65 6e 74 2c 20 34 31 36 29 3b 0a 09 09 09 7d 20  ent, 416);....} 
34d0: 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 72  else {.....if (r
34e0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
34f0: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3c 20 30  range.length < 0
3500: 29 20 7b 0a 09 09 09 09 09 66 69 6c 65 64 5f 6c  ) {......filed_l
3510: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f  og_msg_debug("Co
3520: 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68 20 74  mputing length t
3530: 6f 20 66 69 74 20 69 6e 20 62 6f 75 6e 64 73 3a  o fit in bounds:
3540: 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 3d   fileinfo->len =
3550: 20 25 6c 6c 75 2c 20 72 65 71 75 65 73 74 2d 3e   %llu, request->
3560: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
3570: 66 73 65 74 20 3d 20 25 6c 6c 75 22 2c 0a 09 09  fset = %llu",...
3580: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
3590: 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66  ng long) fileinf
35a0: 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09 09 09 28 75  o->len,.......(u
35b0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
35c0: 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  g) request->head
35d0: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
35e0: 0a 09 09 09 09 09 29 3b 0a 0a 09 09 09 09 09 72  ......);.......r
35f0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
3600: 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 20 66  range.length = f
3610: 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 2d 20 72  ileinfo->len - r
3620: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
3630: 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09  range.offset;...
3640: 09 09 7d 0a 0a 09 09 09 09 66 69 6c 65 64 5f 6c  ..}......filed_l
3650: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 50 61  og_msg_debug("Pa
3660: 72 74 69 61 6c 20 72 65 71 75 65 73 74 2c 20 73  rtial request, s
3670: 74 61 72 74 69 6e 67 20 61 74 3a 20 25 6c 6c 75  tarting at: %llu
3680: 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20 66 6f 72   and running for
3690: 20 25 6c 6c 75 20 62 79 74 65 73 22 2c 0a 09 09   %llu bytes",...
36a0: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
36b0: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
36c0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
36d0: 66 66 73 65 74 2c 0a 09 09 09 09 09 28 75 6e 73  ffset,......(uns
36e0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
36f0: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
3700: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 0a 09  s.range.length..
3710: 09 09 09 29 3b 0a 0a 09 09 09 09 68 74 74 70 5f  ...);......http_
3720: 63 6f 64 65 20 3d 20 32 30 36 3b 0a 09 09 09 7d  code = 206;....}
3730: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69  ...} else {....i
3740: 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  f (request->head
3750: 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e  ers.range.presen
3760: 74 29 20 7b 0a 09 09 09 09 68 74 74 70 5f 63 6f  t) {.....http_co
3770: 64 65 20 3d 20 32 30 36 3b 0a 09 09 09 7d 20 65  de = 206;....} e
3780: 6c 73 65 20 7b 0a 09 09 09 09 68 74 74 70 5f 63  lse {.....http_c
3790: 6f 64 65 20 3d 20 32 30 30 3b 0a 09 09 09 7d 0a  ode = 200;....}.
37a0: 09 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64  ...request->head
37b0: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
37c0: 20 3d 20 30 3b 0a 09 09 09 72 65 71 75 65 73 74   = 0;....request
37d0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
37e0: 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66  length = fileinf
37f0: 6f 2d 3e 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 69  o->len;...}....i
3800: 66 20 28 68 74 74 70 5f 63 6f 64 65 20 3e 20 30  f (http_code > 0
3810: 29 20 7b 0a 09 09 09 66 70 72 69 6e 74 66 28 66  ) {....fprintf(f
3820: 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69 20  p, "HTTP/1.1 %i 
3830: 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c 72  OK\r\nDate: %s\r
3840: 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64 5c  \nServer: filed\
3850: 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64  r\nLast-Modified
3860: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d  : %s\r\nContent-
3870: 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c 6e  Length: %llu\r\n
3880: 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a 20 62  Accept-Ranges: b
3890: 79 74 65 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d  ytes\r\nContent-
38a0: 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e  Type: %s\r\nConn
38b0: 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c  ection: close\r\
38c0: 6e 22 2c 0a 09 09 09 09 68 74 74 70 5f 63 6f 64  n",.....http_cod
38d0: 65 2c 0a 09 09 09 09 64 61 74 65 5f 63 75 72 72  e,.....date_curr
38e0: 65 6e 74 2c 0a 09 09 09 09 66 69 6c 65 69 6e 66  ent,.....fileinf
38f0: 6f 2d 3e 6c 61 73 74 6d 6f 64 2c 0a 09 09 09 09  o->lastmod,.....
3900: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
3910: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
3920: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
3930: 74 68 2c 0a 09 09 09 09 66 69 6c 65 69 6e 66 6f  th,.....fileinfo
3940: 2d 3e 74 79 70 65 0a 09 09 09 29 3b 0a 09 09 09  ->type....);....
3950: 69 66 20 28 68 74 74 70 5f 63 6f 64 65 20 3d 3d  if (http_code ==
3960: 20 32 30 36 29 20 7b 0a 09 09 09 09 66 70 72 69   206) {.....fpri
3970: 6e 74 66 28 66 70 2c 20 22 43 6f 6e 74 65 6e 74  ntf(fp, "Content
3980: 2d 52 61 6e 67 65 3a 20 62 79 74 65 73 20 25 6c  -Range: bytes %l
3990: 6c 75 2d 25 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e  lu-%llu/%llu\r\n
39a0: 22 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65  ",......(unsigne
39b0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  d long long) req
39c0: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
39d0: 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09 09 09 09  nge.offset,.....
39e0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
39f0: 6c 6f 6e 67 29 20 28 72 65 71 75 65 73 74 2d 3e  long) (request->
3a00: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
3a10: 66 73 65 74 20 2b 20 72 65 71 75 65 73 74 2d 3e  fset + request->
3a20: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
3a30: 6e 67 74 68 20 2d 20 31 29 2c 0a 09 09 09 09 09  ngth - 1),......
3a40: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
3a50: 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  ong) fileinfo->l
3a60: 65 6e 0a 09 09 09 09 29 3b 0a 09 09 09 7d 0a 09  en.....);....}..
3a70: 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c  ..fprintf(fp, "\
3a80: 72 5c 6e 22 29 3b 0a 09 09 09 66 66 6c 75 73 68  r\n");....fflush
3a90: 28 66 70 29 3b 0a 0a 09 09 09 66 69 6c 65 64 5f  (fp);.....filed_
3aa0: 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45 53 53  log_msg("PROCESS
3ab0: 5f 52 45 50 4c 59 5f 43 4f 4d 50 4c 45 54 45 20  _REPLY_COMPLETE 
3ac0: 46 44 3d 25 69 20 53 54 41 54 55 53 3d 25 69 22  FD=%i STATUS=%i"
3ad0: 2c 20 66 64 2c 20 68 74 74 70 5f 63 6f 64 65 29  , fd, http_code)
3ae0: 3b 0a 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f  ;..#ifdef FILED_
3af0: 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 09  NONBLOCK_HTTP...
3b00: 09 69 6e 74 20 73 6f 63 6b 65 74 5f 66 6c 61 67  .int socket_flag
3b10: 73 3b 0a 09 09 09 66 64 5f 73 65 74 20 72 66 64  s;....fd_set rfd
3b20: 2c 20 77 66 64 3b 0a 09 09 09 63 68 61 72 20 73  , wfd;....char s
3b30: 69 6e 6b 62 75 66 5b 38 31 39 32 5d 3b 0a 09 09  inkbuf[8192];...
3b40: 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65  .ssize_t read_re
3b50: 74 3b 0a 0a 09 09 09 46 44 5f 5a 45 52 4f 28 26  t;.....FD_ZERO(&
3b60: 72 66 64 29 3b 0a 09 09 09 46 44 5f 5a 45 52 4f  rfd);....FD_ZERO
3b70: 28 26 77 66 64 29 3b 0a 09 09 09 46 44 5f 53 45  (&wfd);....FD_SE
3b80: 54 28 66 64 2c 20 26 72 66 64 29 3b 0a 09 09 09  T(fd, &rfd);....
3b90: 46 44 5f 53 45 54 28 66 64 2c 20 26 77 66 64 29  FD_SET(fd, &wfd)
3ba0: 3b 0a 0a 09 09 09 73 6f 63 6b 65 74 5f 66 6c 61  ;.....socket_fla
3bb0: 67 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46  gs = fcntl(fd, F
3bc0: 5f 47 45 54 46 4c 29 3b 0a 09 09 09 66 63 6e 74  _GETFL);....fcnt
3bd0: 6c 28 66 64 2c 20 46 5f 53 45 54 46 4c 2c 20 73  l(fd, F_SETFL, s
3be0: 6f 63 6b 65 74 5f 66 6c 61 67 73 20 7c 20 4f 5f  ocket_flags | O_
3bf0: 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  NONBLOCK);.#endi
3c00: 66 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  f.....filed_log_
3c10: 6d 73 67 28 22 53 45 4e 44 5f 53 54 41 52 54 20  msg("SEND_START 
3c20: 46 49 4c 45 5f 46 44 3d 25 69 20 46 44 3d 25 69  FILE_FD=%i FD=%i
3c30: 20 42 59 54 45 53 3d 25 6c 6c 75 20 4f 46 46 53   BYTES=%llu OFFS
3c40: 45 54 3d 25 6c 6c 75 22 2c 0a 09 09 09 09 66 69  ET=%llu",.....fi
3c50: 6c 65 69 6e 66 6f 2d 3e 66 64 2c 0a 09 09 09 09  leinfo->fd,.....
3c60: 66 64 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65  fd,.....(unsigne
3c70: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  d long long) req
3c80: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
3c90: 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09 09 09 09  nge.length,.....
3ca0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
3cb0: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
3cc0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
3cd0: 65 74 0a 09 09 09 29 3b 0a 0a 09 09 09 73 65 6e  et....);.....sen
3ce0: 64 66 69 6c 65 5f 6f 66 66 73 65 74 20 3d 20 72  dfile_offset = r
3cf0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
3d00: 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09  range.offset;...
3d10: 09 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 20  .sendfile_len = 
3d20: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
3d30: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 3b 0a 09  .range.length;..
3d40: 09 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 20  ..sendfile_sent 
3d50: 3d 20 30 3b 0a 09 09 09 77 68 69 6c 65 20 28 31  = 0;....while (1
3d60: 29 20 7b 0a 09 09 09 09 69 66 20 28 73 65 6e 64  ) {.....if (send
3d70: 66 69 6c 65 5f 6c 65 6e 20 3e 20 46 49 4c 45 44  file_len > FILED
3d80: 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 29 20 7b  _SENDFILE_MAX) {
3d90: 0a 09 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 73  ......sendfile_s
3da0: 69 7a 65 20 3d 20 46 49 4c 45 44 5f 53 45 4e 44  ize = FILED_SEND
3db0: 46 49 4c 45 5f 4d 41 58 3b 0a 09 09 09 09 7d 20  FILE_MAX;.....} 
3dc0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 73 65 6e 64  else {......send
3dd0: 66 69 6c 65 5f 73 69 7a 65 20 3d 20 73 65 6e 64  file_size = send
3de0: 66 69 6c 65 5f 6c 65 6e 3b 0a 09 09 09 09 7d 0a  file_len;.....}.
3df0: 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 72 65  .....sendfile_re
3e00: 74 20 3d 20 73 65 6e 64 66 69 6c 65 28 66 64 2c  t = sendfile(fd,
3e10: 20 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c 20 26   fileinfo->fd, &
3e20: 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 2c  sendfile_offset,
3e30: 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 29 3b   sendfile_size);
3e40: 0a 09 09 09 09 69 66 20 28 73 65 6e 64 66 69 6c  .....if (sendfil
3e50: 65 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 23 69  e_ret <= 0) {.#i
3e60: 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c  fdef FILED_NONBL
3e70: 4f 43 4b 5f 48 54 54 50 0a 09 09 09 09 09 69 66  OCK_HTTP......if
3e80: 20 28 65 72 72 6e 6f 20 3d 3d 20 45 41 47 41 49   (errno == EAGAI
3e90: 4e 29 20 7b 0a 09 09 09 09 09 09 73 65 6e 64 66  N) {.......sendf
3ea0: 69 6c 65 5f 72 65 74 20 3d 20 30 3b 0a 0a 09 09  ile_ret = 0;....
3eb0: 09 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ....while (1) {.
3ec0: 09 09 09 09 09 09 09 73 65 6c 65 63 74 28 66 64  .......select(fd
3ed0: 20 2b 20 31 2c 20 26 72 66 64 2c 20 26 77 66 64   + 1, &rfd, &wfd
3ee0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
3ef0: 09 09 09 09 09 09 69 66 20 28 46 44 5f 49 53 53  ......if (FD_ISS
3f00: 45 54 28 66 64 2c 20 26 72 66 64 29 29 20 7b 0a  ET(fd, &rfd)) {.
3f10: 09 09 09 09 09 09 09 09 72 65 61 64 5f 72 65 74  ........read_ret
3f20: 20 3d 20 72 65 61 64 28 66 64 2c 20 73 69 6e 6b   = read(fd, sink
3f30: 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 6e 6b  buf, sizeof(sink
3f40: 62 75 66 29 29 3b 0a 0a 09 09 09 09 09 09 09 09  buf));..........
3f50: 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20  if (read_ret <= 
3f60: 30 29 20 7b 0a 09 09 09 09 09 09 09 09 09 62 72  0) {..........br
3f70: 65 61 6b 3b 0a 09 09 09 09 09 09 09 09 7d 0a 09  eak;.........}..
3f80: 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 09  ......}.........
3f90: 69 66 20 28 46 44 5f 49 53 53 45 54 28 66 64 2c  if (FD_ISSET(fd,
3fa0: 20 26 77 66 64 29 29 20 7b 0a 09 09 09 09 09 09   &wfd)) {.......
3fb0: 09 09 72 65 61 64 5f 72 65 74 20 3d 20 31 3b 0a  ..read_ret = 1;.
3fc0: 0a 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  .........break;.
3fd0: 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d  .......}.......}
3fe0: 0a 0a 09 09 09 09 09 09 69 66 20 28 72 65 61 64  ........if (read
3ff0: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
4000: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
4010: 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
4020: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
4030: 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09 09 09  ...}.#else......
4040: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 09  break;.#endif...
4050: 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 66 69 6c  ..}......sendfil
4060: 65 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64 66 69 6c  e_len -= sendfil
4070: 65 5f 72 65 74 3b 0a 09 09 09 09 73 65 6e 64 66  e_ret;.....sendf
4080: 69 6c 65 5f 73 65 6e 74 20 2b 3d 20 73 65 6e 64  ile_sent += send
4090: 66 69 6c 65 5f 72 65 74 3b 0a 09 09 09 09 69 66  file_ret;.....if
40a0: 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d   (sendfile_len =
40b0: 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 0) {......brea
40c0: 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
40d0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
40e0: 22 53 45 4e 44 5f 43 4f 4d 50 4c 45 54 45 20 53  "SEND_COMPLETE S
40f0: 54 41 54 55 53 3d 25 73 20 46 49 4c 45 5f 46 44  TATUS=%s FILE_FD
4100: 3d 25 69 20 46 44 3d 25 69 20 42 59 54 45 53 3d  =%i FD=%i BYTES=
4110: 25 6c 6c 75 20 42 59 54 45 53 5f 53 45 4e 54 3d  %llu BYTES_SENT=
4120: 25 6c 6c 75 22 2c 0a 09 09 09 09 22 3c 75 6e 6b  %llu",....."<unk
4130: 6e 6f 77 6e 3e 22 2c 0a 09 09 09 09 66 69 6c 65  nown>",.....file
4140: 69 6e 66 6f 2d 3e 66 64 2c 0a 09 09 09 09 66 64  info->fd,.....fd
4150: 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ,.....(unsigned 
4160: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65  long long) reque
4170: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
4180: 65 2e 6c 65 6e 67 74 68 2c 0a 09 09 09 09 28 75  e.length,.....(u
4190: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
41a0: 67 29 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74  g) sendfile_sent
41b0: 0a 09 09 09 29 3b 0a 09 09 7d 0a 0a 09 09 63 6c  ....);...}....cl
41c0: 6f 73 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64  ose(fileinfo->fd
41d0: 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  );....filed_log_
41e0: 6d 73 67 28 22 43 4c 4f 53 45 5f 46 49 4c 45 20  msg("CLOSE_FILE 
41f0: 46 44 3d 25 69 22 2c 20 66 64 29 3b 0a 09 7d 0a  FD=%i", fd);..}.
4200: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
4210: 22 43 4c 4f 53 45 5f 43 4f 4e 4e 45 43 54 49 4f  "CLOSE_CONNECTIO
4220: 4e 20 46 44 3d 25 69 22 2c 20 66 64 29 3b 0a 0a  N FD=%i", fd);..
4230: 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 72  .fclose(fp);...r
4240: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e  eturn;.}../* Han
4250: 64 6c 65 20 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e  dle incoming con
4260: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  nections */.stat
4270: 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 77  ic void *filed_w
4280: 6f 72 6b 65 72 5f 74 68 72 65 61 64 28 76 6f 69  orker_thread(voi
4290: 64 20 2a 61 72 67 5f 76 29 20 7b 0a 09 73 74 72  d *arg_v) {..str
42a0: 75 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  uct filed_worker
42b0: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72  _thread_args *ar
42c0: 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  g;..struct filed
42d0: 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20 72 65  _http_request re
42e0: 71 75 65 73 74 3b 0a 09 73 74 72 75 63 74 20 73  quest;..struct s
42f0: 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72  ockaddr_in6 addr
4300: 3b 0a 09 63 68 61 72 20 6c 6f 67 62 75 66 5b 31  ;..char logbuf[1
4310: 32 38 5d 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20  28];..socklen_t 
4320: 61 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66 61  addrlen;..int fa
4330: 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 2c  ilure_count = 0,
4340: 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75   max_failure_cou
4350: 6e 74 20 3d 20 4d 41 58 5f 46 41 49 4c 55 52 45  nt = MAX_FAILURE
4360: 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 6d 61 73  _COUNT;..int mas
4370: 74 65 72 5f 66 64 2c 20 66 64 3b 0a 0a 09 2f 2a  ter_fd, fd;.../*
4380: 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20   Read arguments 
4390: 2a 2f 0a 09 61 72 67 20 3d 20 61 72 67 5f 76 3b  */..arg = arg_v;
43a0: 0a 0a 09 6d 61 73 74 65 72 5f 66 64 20 3d 20 61  ...master_fd = a
43b0: 72 67 2d 3e 66 64 3b 0a 0a 09 77 68 69 6c 65 20  rg->fd;...while 
43c0: 28 31 29 20 7b 0a 09 09 2f 2a 20 46 61 69 6c 75  (1) {.../* Failu
43d0: 72 65 20 6c 6f 6f 70 20 70 72 65 76 65 6e 74 69  re loop preventi
43e0: 6f 6e 20 2a 2f 0a 09 09 69 66 20 28 66 61 69 6c  on */...if (fail
43f0: 75 72 65 5f 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  ure_count > max_
4400: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 29 20 7b  failure_count) {
4410: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
4420: 09 09 2f 2a 20 41 63 63 65 70 74 20 61 20 6e 65  ../* Accept a ne
4430: 77 20 63 6c 69 65 6e 74 20 2a 2f 0a 09 09 61 64  w client */...ad
4440: 64 72 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61  drlen = sizeof(a
4450: 64 64 72 29 3b 0a 09 09 66 64 20 3d 20 61 63 63  ddr);...fd = acc
4460: 65 70 74 28 6d 61 73 74 65 72 5f 66 64 2c 20 28  ept(master_fd, (
4470: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
4480: 2a 29 20 26 61 64 64 72 2c 20 26 61 64 64 72 6c  *) &addr, &addrl
4490: 65 6e 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20  en);..../*... * 
44a0: 49 66 20 77 65 20 66 61 69 6c 2c 20 6d 61 6b 65  If we fail, make
44b0: 20 61 20 6e 6f 74 65 20 6f 66 20 69 74 20 73 6f   a note of it so
44c0: 20 77 65 20 64 6f 6e 27 74 20 67 6f 20 69 6e 74   we don't go int
44d0: 6f 20 61 20 6c 6f 6f 70 20 6f 66 0a 09 09 20 2a  o a loop of... *
44e0: 20 61 63 63 65 70 74 28 29 20 66 61 69 6c 69 6e   accept() failin
44f0: 67 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 66 64  g... */...if (fd
4500: 20 3c 20 30 29 20 7b 0a 09 09 09 2f 2a 20 4c 6f   < 0) {..../* Lo
4510: 67 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  g the new connec
4520: 74 69 6f 6e 20 2a 2f 0a 09 09 09 66 69 6c 65 64  tion */....filed
4530: 5f 6c 6f 67 5f 6d 73 67 28 22 41 43 43 45 50 54  _log_msg("ACCEPT
4540: 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09 66  _FAILED");.....f
4550: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 2b 2b 3b 0a  ailure_count++;.
4560: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
4570: 7d 0a 0a 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20  }..../* Log the 
4580: 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  new connection *
4590: 2f 0a 09 09 6c 6f 67 62 75 66 5b 30 5d 3d 27 5c  /...logbuf[0]='\
45a0: 30 27 3b 0a 09 09 69 6e 65 74 5f 6e 74 6f 70 28  0';...inet_ntop(
45b0: 41 46 5f 49 4e 45 54 36 2c 20 26 61 64 64 72 2e  AF_INET6, &addr.
45c0: 73 69 6e 36 5f 61 64 64 72 2c 20 6c 6f 67 62 75  sin6_addr, logbu
45d0: 66 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 62 75 66  f, sizeof(logbuf
45e0: 29 29 3b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ));...filed_log_
45f0: 6d 73 67 28 22 4e 45 57 5f 43 4f 4e 4e 45 43 54  msg("NEW_CONNECT
4600: 49 4f 4e 20 53 52 43 5f 41 44 44 52 3d 25 73 20  ION SRC_ADDR=%s 
4610: 53 52 43 5f 50 4f 52 54 3d 25 6c 75 20 46 44 3d  SRC_PORT=%lu FD=
4620: 25 69 22 2c 20 6c 6f 67 62 75 66 2c 20 28 75 6e  %i", logbuf, (un
4630: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
4640: 72 2e 73 69 6e 36 5f 70 6f 72 74 2c 20 66 64 29  r.sin6_port, fd)
4650: 3b 0a 0a 09 09 2f 2a 20 52 65 73 65 74 20 66 61  ;..../* Reset fa
4660: 69 6c 75 72 65 20 63 6f 75 6e 74 2a 2f 0a 09 09  ilure count*/...
4670: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20  failure_count = 
4680: 30 3b 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65 20  0;..../* Handle 
4690: 73 6f 63 6b 65 74 20 2a 2f 0a 09 09 66 69 6c 65  socket */...file
46a0: 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28  d_handle_client(
46b0: 66 64 2c 20 26 72 65 71 75 65 73 74 29 3b 0a 09  fd, &request);..
46c0: 7d 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 65 72  }.../* Report er
46d0: 72 6f 72 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f  ror */..filed_lo
46e0: 67 5f 6d 73 67 28 22 54 48 52 45 41 44 5f 44 49  g_msg("THREAD_DI
46f0: 45 44 20 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a  ED ABNORMAL");..
4700: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d  .return(NULL);.}
4710: 0a 0a 2f 2a 20 43 72 65 61 74 65 20 77 6f 72 6b  ../* Create work
4720: 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74  er threads */.st
4730: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 77  atic int filed_w
4740: 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e  orker_threads_in
4750: 69 74 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 74  it(int fd, int t
4760: 68 72 65 61 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  hread_count) {..
4770: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77 6f 72  struct filed_wor
4780: 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ker_thread_args 
4790: 2a 61 72 67 3b 0a 09 70 74 68 72 65 61 64 5f 74  *arg;..pthread_t
47a0: 20 74 68 72 65 61 64 69 64 3b 0a 09 69 6e 74 20   threadid;..int 
47b0: 70 74 68 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  pthread_ret;..in
47c0: 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20  t i;...for (i = 
47d0: 30 3b 20 69 20 3c 20 74 68 72 65 61 64 5f 63 6f  0; i < thread_co
47e0: 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 09 61 72  unt; i++) {...ar
47f0: 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  g = malloc(sizeo
4800: 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09 61 72 67  f(*arg));....arg
4810: 2d 3e 66 64 20 3d 20 66 64 3b 0a 0a 09 09 70 74  ->fd = fd;....pt
4820: 68 72 65 61 64 5f 72 65 74 20 3d 20 70 74 68 72  hread_ret = pthr
4830: 65 61 64 5f 63 72 65 61 74 65 28 26 74 68 72 65  ead_create(&thre
4840: 61 64 69 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65  adid, NULL, file
4850: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 2c  d_worker_thread,
4860: 20 61 72 67 29 3b 0a 09 09 69 66 20 28 70 74 68   arg);...if (pth
4870: 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29 20 7b  read_ret != 0) {
4880: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
4890: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
48a0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 69 73 70 6c 61  0);.}../* Displa
48b0: 79 20 68 65 6c 70 20 2a 2f 0a 73 74 61 74 69 63  y help */.static
48c0: 20 76 6f 69 64 20 66 69 6c 65 64 5f 70 72 69 6e   void filed_prin
48d0: 74 5f 68 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74  t_help(FILE *out
48e0: 70 75 74 2c 20 69 6e 74 20 6c 6f 6e 67 5f 68 65  put, int long_he
48f0: 6c 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  lp, const char *
4900: 65 78 74 72 61 29 20 7b 0a 09 69 66 20 28 65 78  extra) {..if (ex
4910: 74 72 61 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  tra) {...fprintf
4920: 28 6f 75 74 70 75 74 2c 20 22 25 73 5c 6e 22 2c  (output, "%s\n",
4930: 20 65 78 74 72 61 29 3b 0a 09 7d 0a 0a 09 66 70   extra);..}...fp
4940: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 55  rintf(output, "U
4950: 73 61 67 65 3a 20 66 69 6c 65 64 20 5b 3c 6f 70  sage: filed [<op
4960: 74 69 6f 6e 73 3e 5d 5c 6e 22 29 3b 0a 09 66 70  tions>]\n");..fp
4970: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
4980: 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b 0a 09   Options:\n");..
4990: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
49a0: 22 20 20 20 20 20 20 2d 68 2c 20 2d 2d 68 65 6c  "      -h, --hel
49b0: 70 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28  p\n");..fprintf(
49c0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d  output, "      -
49d0: 64 2c 20 2d 2d 64 61 65 6d 6f 6e 5c 6e 22 29 3b  d, --daemon\n");
49e0: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
49f0: 2c 20 22 20 20 20 20 20 20 2d 62 20 3c 61 64 64  , "      -b <add
4a00: 72 65 73 73 3e 2c 20 2d 2d 62 69 6e 64 20 3c 61  ress>, --bind <a
4a10: 64 64 72 65 73 73 3e 5c 6e 22 29 3b 0a 09 66 70  ddress>\n");..fp
4a20: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
4a30: 20 20 20 20 20 2d 70 20 3c 70 6f 72 74 3e 2c 20       -p <port>, 
4a40: 2d 2d 70 6f 72 74 20 3c 70 6f 72 74 3e 5c 6e 22  --port <port>\n"
4a50: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
4a60: 75 74 2c 20 22 20 20 20 20 20 20 2d 74 20 3c 63  ut, "      -t <c
4a70: 6f 75 6e 74 3e 2c 20 2d 2d 74 68 72 65 61 64 73  ount>, --threads
4a80: 20 3c 63 6f 75 6e 74 3e 5c 6e 22 29 3b 0a 09 66   <count>\n");..f
4a90: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4aa0: 20 20 20 20 20 20 2d 63 20 3c 65 6e 74 72 69 65        -c <entrie
4ab0: 73 3e 2c 20 2d 2d 63 61 63 68 65 20 3c 65 6e 74  s>, --cache <ent
4ac0: 72 69 65 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  ries>\n");..fpri
4ad0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
4ae0: 20 20 20 2d 6c 20 3c 66 69 6c 65 3e 2c 20 2d 2d     -l <file>, --
4af0: 6c 6f 67 20 3c 66 69 6c 65 3e 5c 6e 22 29 3b 0a  log <file>\n");.
4b00: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4b10: 20 22 20 20 20 20 20 20 2d 75 20 3c 75 73 65 72   "      -u <user
4b20: 3e 2c 20 2d 2d 75 73 65 72 20 3c 75 73 65 72 3e  >, --user <user>
4b30: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
4b40: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 72  utput, "      -r
4b50: 20 3c 64 69 72 65 63 74 6f 72 79 3e 2c 20 2d 2d   <directory>, --
4b60: 72 6f 6f 74 20 3c 64 69 72 65 63 74 6f 72 79 3e  root <directory>
4b70: 5c 6e 22 29 3b 0a 0a 09 69 66 20 28 6c 6f 6e 67  \n");...if (long
4b80: 5f 68 65 6c 70 29 20 7b 0a 09 09 66 70 72 69 6e  _help) {...fprin
4b90: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
4ba0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
4bb0: 75 74 2c 20 22 20 20 55 73 61 67 65 3a 5c 6e 22  ut, "  Usage:\n"
4bc0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
4bd0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68 20 28  put, "      -h (
4be0: 6f 72 20 2d 2d 68 65 6c 70 29 20 70 72 69 6e 74  or --help) print
4bf0: 73 20 74 68 69 73 20 75 73 61 67 65 20 69 6e 66  s this usage inf
4c00: 6f 72 6d 61 74 69 6f 6e 2e 5c 6e 22 29 3b 0a 09  ormation.\n");..
4c10: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4c20: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
4c30: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
4c40: 20 2d 64 20 28 6f 72 20 2d 2d 64 61 65 6d 6f 6e   -d (or --daemon
4c50: 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65  ) instructs file
4c60: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 64 61  d to become a da
4c70: 65 6d 6f 6e 20 61 66 74 65 72 20 69 6e 69 74 69  emon after initi
4c80: 61 6c 69 7a 69 6e 67 5c 6e 22 29 3b 0a 09 09 66  alizing\n");...f
4c90: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 20 20 74 68 65 20 6c 69 73 74 65         the liste
4cc0: 6e 69 6e 67 20 54 43 50 20 73 6f 63 6b 65 74 20  ning TCP socket 
4cd0: 61 6e 64 20 6c 6f 67 20 66 69 6c 65 73 2e 5c 6e  and log files.\n
4ce0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
4cf0: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
4d00: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4d10: 20 20 20 20 20 20 2d 62 20 28 6f 72 20 2d 2d 62        -b (or --b
4d20: 69 6e 64 29 20 73 70 65 63 69 66 69 65 73 20 74  ind) specifies t
4d30: 68 65 20 61 64 64 72 65 73 73 20 74 6f 20 6c 69  he address to li
4d40: 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e  sten for incomin
4d50: 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70  g HTTP\n");...fp
4d60: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 72 65 71 75 65 73 74 73 20 6f 6e 2e      requests on.
4d90: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61    The default va
4da0: 6c 75 65 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e  lue is \"%s\".\n
4db0: 22 2c 20 42 49 4e 44 5f 41 44 44 52 29 3b 0a 09  ", BIND_ADDR);..
4dc0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4dd0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
4de0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
4df0: 20 2d 70 20 28 6f 72 20 2d 2d 70 6f 72 74 29 20   -p (or --port) 
4e00: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 54 43  specifies the TC
4e10: 50 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f  P port number to
4e20: 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f   listen for inco
4e30: 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09  ming HTTP\n");..
4e40: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4e50: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
4e60: 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73 20         requests 
4e70: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
4e80: 20 69 73 20 25 75 2e 5c 6e 22 2c 20 28 75 6e 73   is %u.\n", (uns
4e90: 69 67 6e 65 64 20 69 6e 74 29 20 50 4f 52 54 29  igned int) PORT)
4ea0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
4eb0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
4ec0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
4ed0: 20 20 20 20 2d 74 20 28 6f 72 20 2d 2d 74 68 72      -t (or --thr
4ee0: 65 61 64 73 29 20 73 70 65 63 69 66 69 65 73 20  eads) specifies 
4ef0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f  the number of wo
4f00: 72 6b 65 72 20 74 68 72 65 61 64 73 20 74 6f 20  rker threads to 
4f10: 63 72 65 61 74 65 2e 20 45 61 63 68 5c 6e 22 29  create. Each\n")
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 20 20 20 20 20 20 20 20 20 20 20  ut, "           
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 6f 72               wor
4f50: 6b 65 72 20 74 68 72 65 61 64 20 63 61 6e 20 73  ker thread can s
4f60: 65 72 76 69 63 65 20 6f 6e 65 20 63 6f 6e 63 75  ervice one concu
4f70: 72 72 65 6e 74 20 48 54 54 50 20 73 65 73 73 69  rrent HTTP sessi
4f80: 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  on.\n");...fprin
4f90: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 54 68 75 73 20 74 68 65 20 6e 75 6d      Thus the num
4fc0: 62 65 72 20 6f 66 20 74 68 72 65 61 64 73 20 63  ber of threads c
4fd0: 72 65 61 74 65 64 20 77 69 6c 6c 20 64 65 74 65  reated will dete
4fe0: 72 6d 69 6e 65 20 68 6f 77 5c 6e 22 29 3b 0a 09  rmine how\n");..
4ff0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5000: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5010: 20 20 20 20 20 20 20 20 20 20 6d 61 6e 79 20 73            many s
5020: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 74 72 61 6e  imultaneous tran
5030: 73 66 65 72 73 20 77 69 6c 6c 20 62 65 20 70 6f  sfers will be po
5040: 73 73 69 62 6c 65 2e 20 54 68 65 5c 6e 22 29 3b  ssible. The\n");
5050: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5060: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
5070: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
5080: 75 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20  ult is %lu.\n", 
5090: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
50a0: 54 48 52 45 41 44 5f 43 4f 55 4e 54 29 3b 0a 09  THREAD_COUNT);..
50b0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
50c0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
50d0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
50e0: 20 2d 63 20 28 6f 72 20 2d 2d 63 61 63 68 65 29   -c (or --cache)
50f0: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
5100: 75 6d 62 65 72 20 6f 66 20 66 69 6c 65 20 69 6e  umber of file in
5110: 66 6f 72 6d 61 74 69 6f 6e 20 63 61 63 68 65 20  formation cache 
5120: 65 6e 74 72 69 65 73 5c 6e 22 29 3b 0a 09 09 66  entries\n");...f
5130: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 20 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74        to allocat
5160: 65 2e 20 20 45 61 63 68 20 63 61 63 68 65 20 65  e.  Each cache e
5170: 6e 74 72 79 20 68 6f 6c 64 73 20 66 69 6c 65 20  ntry holds file 
5180: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 5c 6e  information as\n
5190: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
51a0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 65 6c               wel
51c0: 6c 20 61 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l as an open fil
51d0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
51e0: 74 68 65 20 66 69 6c 65 2c 20 73 6f 20 72 65 73  the file, so res
51f0: 6f 75 72 63 65 5c 6e 22 29 3b 0a 09 09 66 70 72  ource\n");...fpr
5200: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5220: 20 20 20 20 6c 69 6d 69 74 73 20 28 69 2e 65 2e      limits (i.e.
5230: 2c 20 75 6c 69 6d 69 74 29 20 73 68 6f 75 6c 64  , ulimit) should
5240: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
5250: 20 54 68 69 73 20 73 68 6f 75 6c 64 5c 6e 22 29   This should\n")
5260: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
5270: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
5280: 20 20 20 20 20 20 20 20 20 20 20 62 65 20 61 20             be a 
5290: 70 72 69 6d 65 20 6e 75 6d 62 65 72 20 66 6f 72  prime number for
52a0: 20 69 64 65 61 6c 20 75 73 65 20 77 69 74 68 20   ideal use with 
52b0: 74 68 65 20 6c 6f 6f 6b 75 70 20 6d 65 74 68 6f  the lookup metho
52c0: 64 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  d.\n");...fprint
52d0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
5300: 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  %lu.\n", (unsign
5310: 65 64 20 6c 6f 6e 67 29 20 43 41 43 48 45 5f 53  ed long) CACHE_S
5320: 49 5a 45 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  IZE);...fprintf(
5330: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
5340: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5350: 20 22 20 20 20 20 20 20 2d 6c 20 28 6f 72 20 2d   "      -l (or -
5360: 2d 6c 6f 67 29 20 73 70 65 63 69 66 69 65 73 20  -log) specifies 
5370: 61 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 6f 70  a filename to op
5380: 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6c  en for writing l
5390: 6f 67 20 65 6e 74 72 69 65 73 2e 20 20 4c 6f 67  og entries.  Log
53a0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
53b0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74               ent
53d0: 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 66 6f  ries are made fo
53e0: 72 20 76 61 72 69 6f 75 73 20 73 74 61 67 65 73  r various stages
53f0: 20 69 6e 20 74 72 61 6e 73 66 65 72 69 6e 67 20   in transfering 
5400: 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70  files.\n");...fp
5410: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20     The log file 
5440: 69 73 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  is opened before
5450: 20 73 77 69 74 63 68 69 6e 67 20 75 73 65 72 73   switching users
5460: 20 28 73 65 65 20 5c 22 2d 75 5c 22 29 5c 6e 22   (see \"-u\")\n"
5470: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5480: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
5490: 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 72 6f            and ro
54a0: 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 28  ot directories (
54b0: 73 65 65 20 5c 22 2d 72 5c 22 29 2e 20 20 54 68  see \"-r\").  Th
54c0: 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 65  e log file is ne
54d0: 76 65 72 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ver\n");...fprin
54e0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 63 6c 6f 73 65 64 20 73 6f 20 6c 6f 67 20 72 6f  closed so log ro
5510: 74 61 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 73  tation without s
5520: 74 6f 70 70 69 6e 67 20 74 68 65 20 64 61 65 6d  topping the daem
5530: 6f 6e 20 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a  on is will\n");.
5540: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5550: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
5560: 20 20 20 20 20 20 20 6e 6f 74 20 77 6f 72 6b 2e         not work.
5570: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 5c    The value of \
5580: 22 2d 5c 22 20 69 6e 64 69 63 61 74 65 73 20 74  "-\" indicates t
5590: 68 61 74 20 73 74 61 6e 64 61 72 64 20 6f 75 74  hat standard out
55a0: 70 75 74 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  put\n");...fprin
55b0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
55e0: 6f 72 20 6c 6f 67 67 69 6e 67 2e 20 20 54 68 65  or logging.  The
55f0: 20 64 65 66 61 75 6c 74 20 69 73 20 5c 22 25 73   default is \"%s
5600: 5c 22 2e 5c 6e 22 2c 20 4c 4f 47 5f 46 49 4c 45  \".\n", LOG_FILE
5610: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5620: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
5630: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5640: 20 20 20 20 20 2d 75 20 28 6f 72 20 2d 2d 75 73       -u (or --us
5650: 65 72 29 20 73 70 65 63 69 66 69 65 73 20 74 68  er) specifies th
5660: 65 20 75 73 65 72 20 74 6f 20 73 77 69 74 63 68  e user to switch
5670: 20 75 73 65 72 20 49 44 73 20 74 6f 20 62 65 66   user IDs to bef
5680: 6f 72 65 20 73 65 72 76 69 63 69 6e 67 5c 6e 22  ore servicing\n"
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 20 20 20 20 20 20 20 20 20 20  put, "          
56b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65             reque
56c0: 73 74 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c  sts.  The defaul
56d0: 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  t is not change 
56e0: 75 73 65 72 20 49 44 73 2e 5c 6e 22 29 3b 0a 09  user IDs.\n");..
56f0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5700: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
5710: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5720: 20 2d 72 20 28 6f 72 20 2d 2d 72 6f 6f 74 29 20   -r (or --root) 
5730: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 64 69  specifies the di
5740: 72 65 63 74 6f 72 79 20 74 6f 20 61 63 74 20 61  rectory to act a
5750: 73 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63  s the root direc
5760: 74 6f 72 79 20 66 6f 72 5c 6e 22 29 3b 0a 09 09  tory for\n");...
5770: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
5780: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5790: 20 20 20 20 20 20 74 68 65 20 66 69 6c 65 20 73        the file s
57a0: 65 72 76 65 72 2e 20 20 49 66 20 74 68 69 73 20  erver.  If this 
57b0: 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66  option is specif
57c0: 69 65 64 2c 20 63 68 72 6f 6f 74 28 32 29 5c 6e  ied, chroot(2)\n
57d0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
57e0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 63              is c
5800: 61 6c 6c 65 64 2e 20 20 54 68 65 20 64 65 66 61  alled.  The defa
5810: 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ult is not chang
5820: 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69  e root directori
5830: 65 73 2c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  es,\n");...fprin
5840: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 74 68 61 74 20 69 73 2c 20 74 68 65 20 5c 22   that is, the \"
5870: 2f 5c 22 20 64 69 72 65 63 74 6f 72 79 20 69 73  /\" directory is
5880: 20 73 68 61 72 65 64 20 6f 75 74 2e 20 20 54 68   shared out.  Th
5890: 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66  is will\n");...f
58a0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 20 20 20 6c 69 6b 65 6c 79 20 62 65 20 61       likely be a
58d0: 20 73 65 63 75 72 69 74 79 20 69 73 73 75 65 2c   security issue,
58e0: 20 73 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   so this option 
58f0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 5c 6e 22  should always\n"
5900: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5910: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
5920: 20 20 20 20 20 20 20 20 20 20 20 62 65 20 75 73             be us
5930: 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65  ed.\n");..}...re
5940: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  turn;.}../* Add 
5950: 61 20 67 65 74 6f 70 74 20 6f 70 74 69 6f 6e 20  a getopt option 
5960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5970: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
5980: 5f 73 65 74 6f 70 74 28 73 74 72 75 63 74 20 6f  _setopt(struct o
5990: 70 74 69 6f 6e 20 2a 6f 70 74 2c 20 63 6f 6e 73  ption *opt, cons
59a0: 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e  t char *name, in
59b0: 74 20 68 61 73 5f 61 72 67 2c 20 69 6e 74 20 76  t has_arg, int v
59c0: 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e 6e 61 6d 65  al) {..opt->name
59d0: 20 20 20 20 20 3d 20 6e 61 6d 65 3b 0a 09 6f 70       = name;..op
59e0: 74 2d 3e 68 61 73 5f 61 72 67 20 20 3d 20 68 61  t->has_arg  = ha
59f0: 73 5f 61 72 67 3b 0a 09 6f 70 74 2d 3e 66 6c 61  s_arg;..opt->fla
5a00: 67 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 09 6f  g     = NULL;..o
5a10: 70 74 2d 3e 76 61 6c 20 20 20 20 20 20 3d 20 76  pt->val      = v
5a20: 61 6c 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  al;...return;.}.
5a30: 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 75 73  ./* Resolve a us
5a40: 65 72 6e 61 6d 65 20 74 6f 20 61 20 55 49 44 20  ername to a UID 
5a50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
5a60: 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28  led_user_lookup(
5a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 73 65 72  const char *user
5a80: 2c 20 75 69 64 5f 74 20 2a 75 73 65 72 5f 69 64  , uid_t *user_id
5a90: 29 20 7b 0a 09 63 68 61 72 20 2a 6e 65 78 74 3b  ) {..char *next;
5aa0: 0a 09 75 69 64 5f 74 20 75 73 65 72 5f 69 64 5f  ..uid_t user_id_
5ab0: 63 68 65 63 6b 3b 0a 23 69 66 6e 64 65 66 20 46  check;.#ifndef F
5ac0: 49 4c 45 44 5f 4e 4f 5f 47 45 54 50 57 4e 41 4d  ILED_NO_GETPWNAM
5ad0: 0a 09 73 74 72 75 63 74 20 70 61 73 73 77 64 20  ..struct passwd 
5ae0: 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20 3d 20 67 65  *ent;...ent = ge
5af0: 74 70 77 6e 61 6d 28 75 73 65 72 29 3b 0a 09 69  tpwnam(user);..i
5b00: 66 20 28 65 6e 74 20 21 3d 20 4e 55 4c 4c 29 20  f (ent != NULL) 
5b10: 7b 0a 09 09 2a 75 73 65 72 5f 69 64 20 3d 20 65  {...*user_id = e
5b20: 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a 0a 09 09 72  nt->pw_uid;....r
5b30: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 23 65 6e  eturn(0);..}.#en
5b40: 64 69 66 0a 0a 09 75 73 65 72 5f 69 64 5f 63 68  dif...user_id_ch
5b50: 65 63 6b 20 3d 20 73 74 72 74 6f 75 6c 6c 28 75  eck = strtoull(u
5b60: 73 65 72 2c 20 26 6e 65 78 74 2c 20 31 30 29 3b  ser, &next, 10);
5b70: 0a 09 69 66 20 28 6e 65 78 74 20 3d 3d 20 4e 55  ..if (next == NU
5b80: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  LL) {...return(1
5b90: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e 65 78 74  );..}...if (next
5ba0: 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] != '\0') {..
5bb0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
5bc0: 09 2a 75 73 65 72 5f 69 64 20 3d 20 75 73 65 72  .*user_id = user
5bd0: 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a 09 72 65 74  _id_check;...ret
5be0: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 61  urn(0);.}../* Da
5bf0: 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73 74 61 74 69  emonize */.stati
5c00: 63 20 69 6e 74 20 66 69 6c 65 64 5f 64 61 65 6d  c int filed_daem
5c10: 6f 6e 69 7a 65 28 76 6f 69 64 29 20 7b 0a 09 70  onize(void) {..p
5c20: 69 64 5f 74 20 73 65 74 73 69 64 5f 72 65 74 2c  id_t setsid_ret,
5c30: 20 66 6f 72 6b 5f 72 65 74 3b 0a 09 69 6e 74 20   fork_ret;..int 
5c40: 63 68 64 69 72 5f 72 65 74 2c 20 64 75 70 32 5f  chdir_ret, dup2_
5c50: 72 65 74 3b 0a 09 69 6e 74 20 66 64 5f 69 6e 2c  ret;..int fd_in,
5c60: 20 66 64 5f 6f 75 74 3b 0a 0a 09 63 68 64 69 72   fd_out;...chdir
5c70: 5f 72 65 74 20 3d 20 63 68 64 69 72 28 22 2f 22  _ret = chdir("/"
5c80: 29 3b 0a 09 69 66 20 28 63 68 64 69 72 5f 72 65  );..if (chdir_re
5c90: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t != 0) {...retu
5ca0: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 6b  rn(1);..}...fork
5cb0: 5f 72 65 74 20 3d 20 66 6f 72 6b 28 29 3b 0a 09  _ret = fork();..
5cc0: 69 66 20 28 66 6f 72 6b 5f 72 65 74 20 3c 20 30  if (fork_ret < 0
5cd0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
5ce0: 0a 09 7d 0a 0a 09 69 66 20 28 66 6f 72 6b 5f 72  ..}...if (fork_r
5cf0: 65 74 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 20 50  et > 0) {.../* P
5d00: 61 72 65 6e 74 20 2a 2f 0a 09 09 77 61 69 74 70  arent */...waitp
5d10: 69 64 28 66 6f 72 6b 5f 72 65 74 2c 20 4e 55 4c  id(fork_ret, NUL
5d20: 4c 2c 20 30 29 3b 0a 0a 09 09 65 78 69 74 28 45  L, 0);....exit(E
5d30: 58 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d  XIT_SUCCESS);..}
5d40: 0a 0a 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09  .../* Child */..
5d50: 69 66 20 28 66 6f 72 6b 28 29 20 21 3d 20 30 29  if (fork() != 0)
5d60: 20 7b 0a 09 09 2f 2a 20 43 68 69 6c 64 20 2a 2f   {.../* Child */
5d70: 0a 09 09 65 78 69 74 28 45 58 49 54 5f 53 55 43  ...exit(EXIT_SUC
5d80: 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47  CESS);..}.../* G
5d90: 72 61 6e 64 20 63 68 69 6c 64 20 2a 2f 0a 09 73  rand child */..s
5da0: 65 74 73 69 64 5f 72 65 74 20 3d 20 73 65 74 73  etsid_ret = sets
5db0: 69 64 28 29 3b 0a 09 69 66 20 28 73 65 74 73 69  id();..if (setsi
5dc0: 64 5f 72 65 74 20 3d 3d 20 28 28 70 69 64 5f 74  d_ret == ((pid_t
5dd0: 29 20 2d 31 29 29 20 7b 0a 09 09 72 65 74 75 72  ) -1)) {...retur
5de0: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 64 5f 69 6e  n(1);..}...fd_in
5df0: 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75   = open("/dev/nu
5e00: 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  ll", O_RDONLY);.
5e10: 09 66 64 5f 6f 75 74 20 3d 20 6f 70 65 6e 28 22  .fd_out = open("
5e20: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 57 52  /dev/null", O_WR
5e30: 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 66 64 5f 69  ONLY);..if (fd_i
5e40: 6e 20 3c 20 30 20 7c 7c 20 66 64 5f 6f 75 74 20  n < 0 || fd_out 
5e50: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
5e60: 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65  1);..}...dup2_re
5e70: 74 20 3d 20 64 75 70 32 28 66 64 5f 69 6e 2c 20  t = dup2(fd_in, 
5e80: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09  STDIN_FILENO);..
5e90: 69 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20  if (dup2_ret != 
5ea0: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 20 7b 0a  STDIN_FILENO) {.
5eb0: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
5ec0: 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70  ..dup2_ret = dup
5ed0: 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 4f 55 54  2(fd_out, STDOUT
5ee0: 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64  _FILENO);..if (d
5ef0: 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 4f 55  up2_ret != STDOU
5f00: 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65  T_FILENO) {...re
5f10: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75  turn(1);..}...du
5f20: 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64  p2_ret = dup2(fd
5f30: 5f 6f 75 74 2c 20 53 54 44 45 52 52 5f 46 49 4c  _out, STDERR_FIL
5f40: 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f  ENO);..if (dup2_
5f50: 72 65 74 20 21 3d 20 53 54 44 45 52 52 5f 46 49  ret != STDERR_FI
5f60: 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e  LENO) {...return
5f70: 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c 6f 73 65 28  (1);..}...close(
5f80: 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f 73 65 28 66  fd_in);..close(f
5f90: 64 5f 6f 75 74 29 3b 0a 0a 09 72 65 74 75 72 6e  d_out);...return
5fa0: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 70  (0);.}../* Run p
5fb0: 72 6f 63 65 73 73 20 2a 2f 0a 69 6e 74 20 6d 61  rocess */.int ma
5fc0: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
5fd0: 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 73 74 72  r **argv) {..str
5fe0: 75 63 74 20 6f 70 74 69 6f 6e 20 6f 70 74 69 6f  uct option optio
5ff0: 6e 73 5b 31 30 5d 3b 0a 09 63 6f 6e 73 74 20 63  ns[10];..const c
6000: 68 61 72 20 2a 62 69 6e 64 5f 61 64 64 72 20 3d  har *bind_addr =
6010: 20 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e 65 77   BIND_ADDR, *new
6020: 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f  root = NULL, *lo
6030: 67 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46 49 4c  g_file = LOG_FIL
6040: 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f 66 70  E;..FILE *log_fp
6050: 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 20 3d 20  ;..uid_t user = 
6060: 30 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d 20 50  0;..int port = P
6070: 4f 52 54 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e  ORT, thread_coun
6080: 74 20 3d 20 54 48 52 45 41 44 5f 43 4f 55 4e 54  t = THREAD_COUNT
6090: 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 73 69 7a  ;..int cache_siz
60a0: 65 20 3d 20 43 41 43 48 45 5f 53 49 5a 45 3b 0a  e = CACHE_SIZE;.
60b0: 09 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c 20 63  .int init_ret, c
60c0: 68 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74 75 69  hroot_ret, setui
60d0: 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f 72 65  d_ret, lookup_re
60e0: 74 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a 09 69  t, chdir_ret;..i
60f0: 6e 74 20 73 65 74 75 69 64 5f 65 6e 61 62 6c 65  nt setuid_enable
6100: 64 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f 65 6e  d = 0, daemon_en
6110: 61 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20  abled = 0;..int 
6120: 63 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 2f  ch;..int fd;.../
6130: 2a 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d 65  * Process argume
6140: 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67 65  nts */..filed_ge
6150: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
6160: 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22 70  (&options[0], "p
6170: 6f 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61  ort", required_a
6180: 72 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a 09  rgument, 'p');..
6190: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
61a0: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
61b0: 73 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22 2c  s[1], "threads",
61c0: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
61d0: 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65 64  nt, 't');..filed
61e0: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
61f0: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d 2c  opt(&options[2],
6200: 20 22 63 61 63 68 65 22 2c 20 72 65 71 75 69 72   "cache", requir
6210: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63 27  ed_argument, 'c'
6220: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
6230: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
6240: 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64 22  tions[3], "bind"
6250: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
6260: 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c 65  ent, 'b');..file
6270: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
6280: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34 5d  topt(&options[4]
6290: 2c 20 22 75 73 65 72 22 2c 20 72 65 71 75 69 72  , "user", requir
62a0: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75 27  ed_argument, 'u'
62b0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
62c0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
62d0: 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74 22  tions[5], "root"
62e0: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
62f0: 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c 65  ent, 'r');..file
6300: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
6310: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36 5d  topt(&options[6]
6320: 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72 67  , "help", no_arg
6330: 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66 69  ument, 'h');..fi
6340: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
6350: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
6360: 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e 6f  7], "daemon", no
6370: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29 3b  _argument, 'd');
6380: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
6390: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
63a0: 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20 72  ons[8], "log", r
63b0: 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74  equired_argument
63c0: 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'l');..filed_g
63d0: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
63e0: 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20 4e  t(&options[9], N
63f0: 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 09 77 68 69  ULL, 0, 0);..whi
6400: 6c 65 20 28 28 63 68 20 3d 20 67 65 74 6f 70 74  le ((ch = getopt
6410: 5f 6c 6f 6e 67 28 61 72 67 63 2c 20 61 72 67 76  _long(argc, argv
6420: 2c 20 22 70 3a 74 3a 63 3a 62 3a 75 3a 72 3a 6c  , "p:t:c:b:u:r:l
6430: 3a 68 64 22 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e  :hd", options, N
6440: 55 4c 4c 29 29 20 21 3d 20 2d 31 29 20 7b 0a 09  ULL)) != -1) {..
6450: 09 73 77 69 74 63 68 28 63 68 29 20 7b 0a 09 09  .switch(ch) {...
6460: 09 63 61 73 65 20 27 70 27 3a 0a 09 09 09 09 70  .case 'p':.....p
6470: 6f 72 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72  ort = atoi(optar
6480: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
6490: 09 09 63 61 73 65 20 27 74 27 3a 0a 09 09 09 09  ..case 't':.....
64a0: 74 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 61  thread_count = a
64b0: 74 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09  toi(optarg);....
64c0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
64d0: 27 63 27 3a 0a 09 09 09 09 63 61 63 68 65 5f 73  'c':.....cache_s
64e0: 69 7a 65 20 3d 20 61 74 6f 69 28 6f 70 74 61 72  ize = atoi(optar
64f0: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
6500: 09 09 63 61 73 65 20 27 62 27 3a 0a 09 09 09 09  ..case 'b':.....
6510: 62 69 6e 64 5f 61 64 64 72 20 3d 20 73 74 72 64  bind_addr = strd
6520: 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09  up(optarg);.....
6530: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
6540: 75 27 3a 0a 09 09 09 09 73 65 74 75 69 64 5f 65  u':.....setuid_e
6550: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09  nabled = 1;.....
6560: 6c 6f 6f 6b 75 70 5f 72 65 74 20 3d 20 66 69 6c  lookup_ret = fil
6570: 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f  ed_user_lookup(o
6580: 70 74 61 72 67 2c 20 26 75 73 65 72 29 3b 0a 09  ptarg, &user);..
6590: 09 09 09 69 66 20 28 6c 6f 6f 6b 75 70 5f 72 65  ...if (lookup_re
65a0: 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 66  t != 0) {......f
65b0: 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28  iled_print_help(
65c0: 73 74 64 65 72 72 2c 20 30 2c 20 22 49 6e 76 61  stderr, 0, "Inva
65d0: 6c 69 64 20 75 73 65 72 6e 61 6d 65 20 73 70 65  lid username spe
65e0: 63 69 66 69 65 64 22 29 3b 0a 0a 09 09 09 09 09  cified");.......
65f0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 09 7d  return(1);.....}
6600: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
6610: 61 73 65 20 27 72 27 3a 0a 09 09 09 09 6e 65 77  ase 'r':.....new
6620: 72 6f 6f 74 20 3d 20 73 74 72 64 75 70 28 6f 70  root = strdup(op
6630: 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b  targ);.....break
6640: 3b 0a 09 09 09 63 61 73 65 20 27 6c 27 3a 0a 09  ;....case 'l':..
6650: 09 09 09 6c 6f 67 5f 66 69 6c 65 20 3d 20 73 74  ...log_file = st
6660: 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09  rdup(optarg);...
6670: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
6680: 20 27 64 27 3a 0a 09 09 09 09 64 61 65 6d 6f 6e   'd':.....daemon
6690: 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09  _enabled = 1;...
66a0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
66b0: 20 27 3f 27 3a 0a 09 09 09 63 61 73 65 20 27 3a   '?':....case ':
66c0: 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 72 69  ':.....filed_pri
66d0: 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20  nt_help(stderr, 
66e0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09 72  0, NULL);......r
66f0: 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 63 61 73  eturn(1);....cas
6700: 65 20 27 68 27 3a 0a 09 09 09 09 66 69 6c 65 64  e 'h':.....filed
6710: 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 6f  _print_help(stdo
6720: 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  ut, 1, NULL);...
6730: 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09  ...return(0);...
6740: 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65 6e 20 6c  }..}.../* Open l
6750: 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 69 66 20 28  og file */..if (
6760: 73 74 72 63 6d 70 28 6c 6f 67 5f 66 69 6c 65 2c  strcmp(log_file,
6770: 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09   "-") == 0) {...
6780: 6c 6f 67 5f 66 70 20 3d 20 73 74 64 6f 75 74 3b  log_fp = stdout;
6790: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6c 6f 67  ..} else {...log
67a0: 5f 66 70 20 3d 20 66 6f 70 65 6e 28 6c 6f 67 5f  _fp = fopen(log_
67b0: 66 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09 09 69  file, "a+");...i
67c0: 66 20 28 6c 6f 67 5f 66 70 20 3d 3d 20 4e 55 4c  f (log_fp == NUL
67d0: 4c 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  L) {....perror("
67e0: 66 6f 70 65 6e 22 29 3b 0a 0a 09 09 09 72 65 74  fopen");.....ret
67f0: 75 72 6e 28 34 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  urn(4);...}..}..
6800: 09 2f 2a 20 43 72 65 61 74 65 20 6c 69 73 74 65  ./* Create liste
6810: 6e 69 6e 67 20 73 6f 63 6b 65 74 20 2a 2f 0a 09  ning socket */..
6820: 66 64 20 3d 20 66 69 6c 65 64 5f 6c 69 73 74 65  fd = filed_liste
6830: 6e 28 62 69 6e 64 5f 61 64 64 72 2c 20 70 6f 72  n(bind_addr, por
6840: 74 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29  t);..if (fd < 0)
6850: 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c   {...perror("fil
6860: 65 64 5f 6c 69 73 74 65 6e 22 29 3b 0a 0a 09 09  ed_listen");....
6870: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
6880: 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66 20 61 70  /* Chroot, if ap
6890: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66  propriate */..if
68a0: 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09 63   (newroot) {...c
68b0: 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72  hdir_ret = chdir
68c0: 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09 69 66 20  (newroot);...if 
68d0: 28 63 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29  (chdir_ret != 0)
68e0: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68   {....perror("ch
68f0: 64 69 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  dir");.....retur
6900: 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 63 68 72  n(1);...}....chr
6910: 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72 6f 6f 74  oot_ret = chroot
6920: 28 22 2e 22 29 3b 0a 09 09 69 66 20 28 63 68 72  (".");...if (chr
6930: 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  oot_ret != 0) {.
6940: 09 09 09 70 65 72 72 6f 72 28 22 63 68 72 6f 6f  ...perror("chroo
6950: 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
6960: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  1);...}..}.../* 
6970: 44 72 6f 70 20 70 72 69 76 69 6c 65 67 65 73 2c  Drop privileges,
6980: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 20   if appropriate 
6990: 2a 2f 0a 09 69 66 20 28 73 65 74 75 69 64 5f 65  */..if (setuid_e
69a0: 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73 65 74 75  nabled) {...setu
69b0: 69 64 5f 72 65 74 20 3d 20 73 65 74 75 69 64 28  id_ret = setuid(
69c0: 75 73 65 72 29 3b 0a 09 09 69 66 20 28 73 65 74  user);...if (set
69d0: 75 69 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  uid_ret != 0) {.
69e0: 09 09 09 70 65 72 72 6f 72 28 22 73 65 74 75 69  ...perror("setui
69f0: 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
6a00: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  1);...}..}.../* 
6a10: 42 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20  Become a daemon 
6a20: 2a 2f 0a 09 69 66 20 28 64 61 65 6d 6f 6e 5f 65  */..if (daemon_e
6a30: 6e 61 62 6c 65 64 29 20 7b 0a 09 09 66 69 6c 65  nabled) {...file
6a40: 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 29 3b 0a 09  d_daemonize();..
6a50: 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  }.../* Initializ
6a60: 65 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d  e */..init_ret =
6a70: 20 66 69 6c 65 64 5f 69 6e 69 74 28 63 61 63 68   filed_init(cach
6a80: 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 69 6e  e_size);..if (in
6a90: 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
6aa0: 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 69  .perror("filed_i
6ab0: 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  nit");....return
6ac0: 28 33 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65  (3);..}.../* Cre
6ad0: 61 74 65 20 6c 6f 67 67 69 6e 67 20 74 68 72 65  ate logging thre
6ae0: 61 64 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20  ad */..init_ret 
6af0: 3d 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  = filed_logging_
6b00: 74 68 72 65 61 64 5f 69 6e 69 74 28 6c 6f 67 5f  thread_init(log_
6b10: 66 70 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  fp);..if (init_r
6b20: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
6b30: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 67 69  ror("filed_loggi
6b40: 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29  ng_thread_init")
6b50: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29 3b 0a  ;....return(4);.
6b60: 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 77  .}.../* Create w
6b70: 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f  orker threads */
6b80: 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c  ..init_ret = fil
6b90: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
6ba0: 73 5f 69 6e 69 74 28 66 64 2c 20 74 68 72 65 61  s_init(fd, threa
6bb0: 64 5f 63 6f 75 6e 74 29 3b 0a 09 69 66 20 28 69  d_count);..if (i
6bc0: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
6bd0: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
6be0: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69  worker_threads_i
6bf0: 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  nit");....return
6c00: 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69  (4);..}.../* Wai
6c10: 74 20 66 6f 72 20 74 68 72 65 61 64 73 20 74 6f  t for threads to
6c20: 20 65 78 69 74 20 2a 2f 0a 09 2f 2a 20 58 58 58   exit */../* XXX
6c30: 3a 54 4f 44 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74  :TODO: Monitor t
6c40: 68 72 65 61 64 20 75 73 61 67 65 20 2a 2f 0a 09  hread usage */..
6c50: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 73 6c  while (1) {...sl
6c60: 65 65 70 28 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a  eep(60);..}.../*
6c70: 20 52 65 74 75 72 6e 20 69 6e 20 66 61 69 6c 75   Return in failu
6c80: 72 65 20 2a 2f 0a 09 72 65 74 75 72 6e 28 32 29  re */..return(2)
6c90: 3b 0a 7d 0a                                      ;.}.