Hex Artifact Content

Artifact 6f13628165f5fcc4407b6257b4ded26188c08ef0:


0000: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 65  #include <sys/se
0010: 6e 64 66 69 6c 65 2e 68 3e 0a 23 69 6e 63 6c 75  ndfile.h>.#inclu
0020: 64 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68  de <sys/socket.h
0030: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0040: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  types.h>.#includ
0050: 65 20 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e 0a  e <arpa/inet.h>.
0060: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d  #include <sys/mm
0070: 61 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  an.h>.#include <
0080: 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63  sys/stat.h>.#inc
0090: 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e 68  lude <sys/wait.h
00a0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 74 68 72  >.#include <pthr
00b0: 65 61 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ead.h>.#include 
00c0: 3c 73 74 72 69 6e 67 73 2e 68 3e 0a 23 69 6e 63  <strings.h>.#inc
00d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
00e0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
00f0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0100: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0110: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0120: 6c 75 64 65 20 3c 67 65 74 6f 70 74 2e 68 3e 0a  lude <getopt.h>.
0130: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67  #include <stdarg
0140: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
0150: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
0160: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0170: 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e  de <errno.h>.#in
0180: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23  clude <time.h>.#
0190: 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a  include <pwd.h>.
01a0: 0a 2f 2a 20 43 6f 6d 70 69 6c 65 20 74 69 6d 65  ./* Compile time
01b0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 23 64   constants */.#d
01c0: 65 66 69 6e 65 20 46 49 4c 45 44 5f 53 45 4e 44  efine FILED_SEND
01d0: 46 49 4c 45 5f 4d 41 58 20 31 36 37 37 37 32 31  FILE_MAX 1677721
01e0: 35 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 46 41  5.#define MAX_FA
01f0: 49 4c 55 52 45 5f 43 4f 55 4e 54 20 33 30 0a 23  ILURE_COUNT 30.#
0200: 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44 45 46  define FILED_DEF
0210: 41 55 4c 54 5f 54 59 50 45 20 22 61 70 70 6c 69  AULT_TYPE "appli
0220: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
0230: 65 61 6d 22 0a 0a 2f 2a 20 44 65 66 61 75 6c 74  eam"../* Default
0240: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
0250: 6e 65 20 50 4f 52 54 20 38 30 0a 23 64 65 66 69  ne PORT 80.#defi
0260: 6e 65 20 54 48 52 45 41 44 5f 43 4f 55 4e 54 20  ne THREAD_COUNT 
0270: 35 0a 23 64 65 66 69 6e 65 20 42 49 4e 44 5f 41  5.#define BIND_A
0280: 44 44 52 20 22 3a 3a 22 0a 23 64 65 66 69 6e 65  DDR "::".#define
0290: 20 43 41 43 48 45 5f 53 49 5a 45 20 38 32 30 39   CACHE_SIZE 8209
02a0: 0a 23 64 65 66 69 6e 65 20 4c 4f 47 5f 46 49 4c  .#define LOG_FIL
02b0: 45 20 22 2d 22 0a 0a 2f 2a 20 41 72 67 75 6d 65  E "-"../* Argume
02c0: 6e 74 73 20 66 6f 72 20 77 6f 72 6b 65 72 20 74  nts for worker t
02d0: 68 72 65 61 64 73 20 2a 2f 0a 73 74 72 75 63 74  hreads */.struct
02e0: 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68   filed_worker_th
02f0: 72 65 61 64 5f 61 72 67 73 20 7b 0a 09 69 6e 74  read_args {..int
0300: 20 66 64 3b 0a 7d 3b 0a 0a 2f 2a 20 41 72 67 75   fd;.};../* Argu
0310: 6d 65 6e 74 73 20 66 6f 72 20 6c 6f 67 67 69 6e  ments for loggin
0320: 67 20 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 72  g threads */.str
0330: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  uct filed_loggin
0340: 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 7b 0a  g_thread_args {.
0350: 09 46 49 4c 45 20 2a 66 70 3b 0a 7d 3b 0a 0a 2f  .FILE *fp;.};../
0360: 2a 20 46 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  * File informati
0370: 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  on */.struct fil
0380: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 7b 0a 09 70  ed_fileinfo {..p
0390: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
03a0: 75 74 65 78 3b 0a 09 63 68 61 72 20 2a 70 61 74  utex;..char *pat
03b0: 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 6f 66 66  h;..int fd;..off
03c0: 5f 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c  _t len;..char *l
03d0: 61 73 74 6d 6f 64 3b 0a 09 63 68 61 72 20 6c 61  astmod;..char la
03e0: 73 74 6d 6f 64 5f 62 5b 36 34 5d 3b 0a 09 63 6f  stmod_b[64];..co
03f0: 6e 73 74 20 63 68 61 72 20 2a 74 79 70 65 3b 0a  nst char *type;.
0400: 7d 3b 0a 0a 2f 2a 20 52 65 71 75 65 73 74 20 76  };../* Request v
0410: 61 72 69 61 62 6c 65 73 20 2a 2f 0a 73 74 72 75  ariables */.stru
0420: 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65  ct filed_http_re
0430: 71 75 65 73 74 20 7b 0a 09 2f 2a 2a 20 42 75 66  quest {../** Buf
0440: 66 65 72 73 20 2a 2a 2f 0a 09 73 74 72 75 63 74  fers **/..struct
0450: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20   filed_fileinfo 
0460: 66 69 6c 65 69 6e 66 6f 3b 0a 09 63 68 61 72 20  fileinfo;..char 
0470: 70 61 74 68 5f 62 5b 31 30 31 30 5d 3b 0a 09 63  path_b[1010];..c
0480: 68 61 72 20 74 6d 70 62 75 66 5b 31 30 31 30 5d  har tmpbuf[1010]
0490: 3b 0a 0a 09 2f 2a 2a 20 48 54 54 50 20 52 65 71  ;.../** HTTP Req
04a0: 75 65 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  uest information
04b0: 20 2a 2a 2f 0a 09 63 68 61 72 20 2a 70 61 74 68   **/..char *path
04c0: 3b 20 20 20 20 20 2f 2a 2a 2a 20 50 61 74 68 20  ;     /*** Path 
04d0: 62 65 69 6e 67 20 72 65 71 75 65 73 74 65 64 20  being requested 
04e0: 2a 2a 2a 2f 0a 0a 09 73 74 72 75 63 74 20 7b 0a  ***/...struct {.
04f0: 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 69 6e  ..struct {....in
0500: 74 20 70 72 65 73 65 6e 74 3b 0a 09 09 09 6f 66  t present;....of
0510: 66 5f 74 20 6f 66 66 73 65 74 3b 20 20 20 2f 2a  f_t offset;   /*
0520: 2a 2a 20 52 61 6e 67 65 20 73 74 61 72 74 20 2a  ** Range start *
0530: 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20 6c 65 6e  **/....off_t len
0540: 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e 67  gth;   /*** Rang
0550: 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f 0a 09 09  e length ***/...
0560: 7d 20 72 61 6e 67 65 3b 0a 09 7d 20 68 65 61 64  } range;..} head
0570: 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c 6f 67 20  ers;.};../* Log 
0580: 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72 75 63 74  record */.struct
0590: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
05a0: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
05b0: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78  _log_entry *_nex
05c0: 74 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64  t;..struct filed
05d0: 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65  _log_entry *_pre
05e0: 76 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68  v;..pthread_t th
05f0: 72 65 61 64 3b 0a 09 63 68 61 72 20 62 75 66 66  read;..char buff
0600: 65 72 5b 31 30 31 30 5d 3b 0a 09 69 6e 74 20 6c  er[1010];..int l
0610: 65 76 65 6c 3b 0a 7d 3b 0a 0a 2f 2a 20 47 6c 6f  evel;.};../* Glo
0620: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  bal variables */
0630: 0a 2f 2a 2a 20 4f 70 65 6e 20 46 69 6c 65 20 63  ./** Open File c
0640: 61 63 68 65 20 2a 2a 2f 0a 73 74 72 75 63 74 20  ache **/.struct 
0650: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a  filed_fileinfo *
0660: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
0670: 64 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 75  dcache = NULL;.u
0680: 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65  nsigned int file
0690: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
06a0: 68 65 5f 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a  he_size = 0;../*
06b0: 2a 20 4c 6f 67 67 69 6e 67 20 2a 2a 2f 0a 73 74  * Logging **/.st
06c0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
06d0: 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f  ntry *filed_log_
06e0: 6d 73 67 5f 6c 69 73 74 3b 0a 70 74 68 72 65 61  msg_list;.pthrea
06f0: 64 5f 6d 75 74 65 78 5f 74 20 66 69 6c 65 64 5f  d_mutex_t filed_
0700: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74  log_msg_list_mut
0710: 65 78 3b 0a 70 74 68 72 65 61 64 5f 63 6f 6e 64  ex;.pthread_cond
0720: 5f 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  _t filed_log_msg
0730: 5f 6c 69 73 74 5f 72 65 61 64 79 3b 0a 0a 2f 2a  _list_ready;../*
0740: 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68   Initialize cach
0750: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
0760: 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65  filed_init_cache
0770: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  (unsigned int ca
0780: 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e 73  che_size) {..uns
0790: 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 09  igned int idx;..
07a0: 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
07b0: 65 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20 6d  et;.../* Cache m
07c0: 61 79 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e 69  ay not be re-ini
07d0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66 20  tialized */..if 
07e0: 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  (filed_fileinfo_
07f0: 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20  fdcache_size != 
0800: 30 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65 69  0 || filed_filei
0810: 6e 66 6f 5f 66 64 63 61 63 68 65 20 21 3d 20 4e  nfo_fdcache != N
0820: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
0830: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f  1);..}.../* Allo
0840: 63 61 74 65 20 63 61 63 68 65 20 2a 2f 0a 09 66  cate cache */..f
0850: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
0860: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 63 61 63  cache_size = cac
0870: 68 65 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64 5f  he_size;..filed_
0880: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
0890: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
08a0: 28 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  (*filed_fileinfo
08b0: 5f 66 64 63 61 63 68 65 29 20 2a 20 66 69 6c 65  _fdcache) * file
08c0: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
08d0: 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 66  he_size);..if (f
08e0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
08f0: 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  cache == NULL) {
0900: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
0910: 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .../* Initialize
0920: 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 20 2a   cache entries *
0930: 2f 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  /..for (idx = 0;
0940: 20 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c   idx < filed_fil
0950: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69  einfo_fdcache_si
0960: 7a 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d  ze; idx++) {...m
0970: 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20  utex_init_ret = 
0980: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
0990: 69 74 28 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e  it(&filed_filein
09a0: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
09b0: 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09  mutex, NULL);...
09c0: 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72  if (mutex_init_r
09d0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65  et != 0) {....re
09e0: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09  turn(1);...}....
09f0: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
0a00: 64 63 61 63 68 65 5b 69 64 78 5d 2e 70 61 74 68  dcache[idx].path
0a10: 20 3d 20 73 74 72 64 75 70 28 22 22 29 3b 0a 09   = strdup("");..
0a20: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
0a30: 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 66 64 20  fdcache[idx].fd 
0a40: 3d 20 2d 31 3b 0a 09 09 66 69 6c 65 64 5f 66 69  = -1;...filed_fi
0a50: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69  leinfo_fdcache[i
0a60: 64 78 5d 2e 6c 61 73 74 6d 6f 64 20 3d 20 22 22  dx].lastmod = ""
0a70: 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e  ;...filed_filein
0a80: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
0a90: 74 79 70 65 20 3d 20 22 22 3b 0a 09 7d 0a 0a 09  type = "";..}...
0aa0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
0ab0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 70 72 6f 63   Initialize proc
0ac0: 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
0ad0: 74 20 66 69 6c 65 64 5f 69 6e 69 74 28 75 6e 73  t filed_init(uns
0ae0: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 5f  igned int cache_
0af0: 73 69 7a 65 29 20 7b 0a 09 73 74 61 74 69 63 20  size) {..static 
0b00: 69 6e 74 20 63 61 6c 6c 65 64 20 3d 20 30 3b 0a  int called = 0;.
0b10: 09 69 6e 74 20 63 61 63 68 65 5f 72 65 74 3b 0a  .int cache_ret;.
0b20: 0a 09 69 66 20 28 63 61 6c 6c 65 64 29 20 7b 0a  ..if (called) {.
0b30: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
0b40: 0a 09 63 61 6c 6c 65 64 20 3d 20 31 3b 0a 0a 09  ..called = 1;...
0b50: 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f 43 55 52  mlockall(MCL_CUR
0b60: 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55 54 55 52  RENT | MCL_FUTUR
0b70: 45 29 3b 0a 0a 09 73 69 67 6e 61 6c 28 53 49 47  E);...signal(SIG
0b80: 50 49 50 45 2c 20 53 49 47 5f 49 47 4e 29 3b 0a  PIPE, SIG_IGN);.
0b90: 0a 09 63 61 63 68 65 5f 72 65 74 20 3d 20 66 69  ..cache_ret = fi
0ba0: 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65 28 63  led_init_cache(c
0bb0: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20  ache_size);..if 
0bc0: 28 63 61 63 68 65 5f 72 65 74 20 21 3d 20 30 29  (cache_ret != 0)
0bd0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 63 61 63 68   {...return(cach
0be0: 65 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 72 65 74  e_ret);..}...ret
0bf0: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 4c 69  urn(0);.}../* Li
0c00: 73 74 65 6e 20 6f 6e 20 61 20 70 61 72 74 69 63  sten on a partic
0c10: 75 6c 61 72 20 61 64 64 72 65 73 73 2f 70 6f 72  ular address/por
0c20: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
0c30: 66 69 6c 65 64 5f 6c 69 73 74 65 6e 28 63 6f 6e  filed_listen(con
0c40: 73 74 20 63 68 61 72 20 2a 61 64 64 72 65 73 73  st char *address
0c50: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70  , unsigned int p
0c60: 6f 72 74 29 20 7b 0a 09 73 74 72 75 63 74 20 73  ort) {..struct s
0c70: 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72  ockaddr_in6 addr
0c80: 3b 0a 09 69 6e 74 20 70 74 6f 6e 5f 72 65 74 2c  ;..int pton_ret,
0c90: 20 62 69 6e 64 5f 72 65 74 2c 20 6c 69 73 74 65   bind_ret, liste
0ca0: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 66 64 3b 0a  n_ret;..int fd;.
0cb0: 0a 09 61 64 64 72 2e 73 69 6e 36 5f 66 61 6d 69  ..addr.sin6_fami
0cc0: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09  ly = AF_INET6;..
0cd0: 61 64 64 72 2e 73 69 6e 36 5f 66 6c 6f 77 69 6e  addr.sin6_flowin
0ce0: 66 6f 20 3d 20 30 3b 0a 09 61 64 64 72 2e 73 69  fo = 0;..addr.si
0cf0: 6e 36 5f 73 63 6f 70 65 5f 69 64 20 3d 20 30 3b  n6_scope_id = 0;
0d00: 0a 09 61 64 64 72 2e 73 69 6e 36 5f 70 6f 72 74  ..addr.sin6_port
0d10: 20 3d 20 68 74 6f 6e 73 28 70 6f 72 74 29 3b 0a   = htons(port);.
0d20: 09 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74  .pton_ret = inet
0d30: 5f 70 74 6f 6e 28 41 46 5f 49 4e 45 54 36 2c 20  _pton(AF_INET6, 
0d40: 61 64 64 72 65 73 73 2c 20 61 64 64 72 2e 73 69  address, addr.si
0d50: 6e 36 5f 61 64 64 72 2e 73 36 5f 61 64 64 72 29  n6_addr.s6_addr)
0d60: 3b 0a 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20  ;..if (pton_ret 
0d70: 21 3d 20 31 29 20 7b 0a 09 09 72 65 74 75 72 6e  != 1) {...return
0d80: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 66 64 20 3d 20  (-1);..}...fd = 
0d90: 73 6f 63 6b 65 74 28 41 46 5f 49 4e 45 54 36 2c  socket(AF_INET6,
0da0: 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29   SOCK_STREAM, 0)
0db0: 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b  ;..if (fd < 0) {
0dc0: 0a 09 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09  ...return(fd);..
0dd0: 7d 0a 0a 09 62 69 6e 64 5f 72 65 74 20 3d 20 62  }...bind_ret = b
0de0: 69 6e 64 28 66 64 2c 20 28 63 6f 6e 73 74 20 73  ind(fd, (const s
0df0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
0e00: 29 20 26 61 64 64 72 2c 20 73 69 7a 65 6f 66 28  ) &addr, sizeof(
0e10: 61 64 64 72 29 29 3b 0a 09 69 66 20 28 62 69 6e  addr));..if (bin
0e20: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 63  d_ret < 0) {...c
0e30: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74  lose(fd);....ret
0e40: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6c 69  urn(-1);..}...li
0e50: 73 74 65 6e 5f 72 65 74 20 3d 20 6c 69 73 74 65  sten_ret = liste
0e60: 6e 28 66 64 2c 20 31 32 38 29 3b 0a 09 69 66 20  n(fd, 128);..if 
0e70: 28 6c 69 73 74 65 6e 5f 72 65 74 20 21 3d 20 30  (listen_ret != 0
0e80: 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b  ) {...close(fd);
0e90: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
0ea0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b  .}...return(fd);
0eb0: 0a 7d 0a 0a 2f 2a 20 4c 6f 67 20 61 20 6d 65 73  .}../* Log a mes
0ec0: 73 61 67 65 20 2a 2f 0a 23 69 66 64 65 66 20 46  sage */.#ifdef F
0ed0: 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 23 20  ILED_DONT_LOG.# 
0ee0: 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f   define filed_lo
0ef0: 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69  gging_thread_ini
0f00: 74 28 78 29 20 30 0a 23 20 20 64 65 66 69 6e 65  t(x) 0.#  define
0f10: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64   filed_log_msg_d
0f20: 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a  ebug(x, ...) /**
0f30: 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  /.#  define file
0f40: 64 5f 6c 6f 67 5f 6d 73 67 28 78 2c 20 2e 2e 2e  d_log_msg(x, ...
0f50: 29 20 2f 2a 2a 2f 0a 23 65 6c 73 65 0a 23 69 66  ) /**/.#else.#if
0f60: 64 65 66 20 46 49 4c 45 44 5f 44 45 42 55 47 0a  def FILED_DEBUG.
0f70: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
0f80: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c  log_msg_debug(x,
0f90: 20 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28   ...) { fprintf(
0fa0: 73 74 64 65 72 72 2c 20 78 2c 20 5f 5f 56 41 5f  stderr, x, __VA_
0fb0: 41 52 47 53 5f 5f 29 3b 20 66 70 72 69 6e 74 66  ARGS__); fprintf
0fc0: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 20  (stderr, "\n"); 
0fd0: 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20  fflush(stderr); 
0fe0: 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
0ff0: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  e filed_log_msg_
1000: 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a  debug(x, ...) /*
1010: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e  */.#endif../* In
1020: 69 74 69 61 6c 69 7a 65 20 6c 6f 67 67 69 6e 67  itialize logging
1030: 20 74 68 72 65 61 64 20 2a 2f 0a 73 74 61 74 69   thread */.stati
1040: 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 6c 6f  c void *filed_lo
1050: 67 67 69 6e 67 5f 74 68 72 65 61 64 28 76 6f 69  gging_thread(voi
1060: 64 20 2a 61 72 67 5f 70 29 20 7b 0a 09 73 74 72  d *arg_p) {..str
1070: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  uct filed_loggin
1080: 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61  g_thread_args *a
1090: 72 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  rg;..struct file
10a0: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 63 75 72  d_log_entry *cur
10b0: 72 2c 20 2a 70 72 65 76 3b 0a 09 46 49 4c 45 20  r, *prev;..FILE 
10c0: 2a 66 70 3b 0a 0a 09 61 72 67 20 3d 20 61 72 67  *fp;...arg = arg
10d0: 5f 70 3b 0a 0a 09 66 70 20 3d 20 61 72 67 2d 3e  _p;...fp = arg->
10e0: 66 70 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20  fp;...while (1) 
10f0: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
1100: 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f  x_lock(&filed_lo
1110: 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78  g_msg_list_mutex
1120: 29 3b 0a 09 09 70 74 68 72 65 61 64 5f 63 6f 6e  );...pthread_con
1130: 64 5f 77 61 69 74 28 26 66 69 6c 65 64 5f 6c 6f  d_wait(&filed_lo
1140: 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64 79  g_msg_list_ready
1150: 2c 20 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  , &filed_log_msg
1160: 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09  _list_mutex);...
1170: 09 63 75 72 72 20 3d 20 66 69 6c 65 64 5f 6c 6f  .curr = filed_lo
1180: 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09 09 66 69  g_msg_list;...fi
1190: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
11a0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 70 74 68 72   = NULL;....pthr
11b0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
11c0: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
11d0: 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 09  list_mutex);....
11e0: 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 09 66  prev = NULL;...f
11f0: 6f 72 20 28 3b 20 63 75 72 72 3b 20 63 75 72 72  or (; curr; curr
1200: 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20   = curr->_next) 
1210: 7b 0a 09 09 09 63 75 72 72 2d 3e 5f 70 72 65 76  {....curr->_prev
1220: 20 3d 20 70 72 65 76 3b 0a 0a 09 09 09 70 72 65   = prev;.....pre
1230: 76 20 3d 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09  v = curr;...}...
1240: 09 63 75 72 72 20 3d 20 70 72 65 76 3b 0a 09 09  .curr = prev;...
1250: 77 68 69 6c 65 20 28 63 75 72 72 29 20 7b 0a 09  while (curr) {..
1260: 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 25  ..fprintf(fp, "%
1270: 73 20 54 48 52 45 41 44 3d 25 6c 6c 75 5c 6e 22  s THREAD=%llu\n"
1280: 2c 20 63 75 72 72 2d 3e 62 75 66 66 65 72 2c 20  , curr->buffer, 
1290: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
12a0: 6f 6e 67 29 20 63 75 72 72 2d 3e 74 68 72 65 61  ong) curr->threa
12b0: 64 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70  d);....fflush(fp
12c0: 29 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75  );.....prev = cu
12d0: 72 72 3b 0a 09 09 09 63 75 72 72 20 3d 20 63 75  rr;....curr = cu
12e0: 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09 09 66  rr->_prev;.....f
12f0: 72 65 65 28 70 72 65 76 29 3b 0a 09 09 7d 0a 09  ree(prev);...}..
1300: 7d 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  }...return(NULL)
1310: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1320: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
1330: 72 65 61 64 5f 69 6e 69 74 28 46 49 4c 45 20 2a  read_init(FILE *
1340: 6c 6f 67 66 70 29 20 7b 0a 09 73 74 72 75 63 74  logfp) {..struct
1350: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
1360: 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 73  hread_args *args
1370: 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72  ;..pthread_t thr
1380: 65 61 64 5f 69 64 3b 0a 0a 09 61 72 67 73 20 3d  ead_id;...args =
1390: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
13a0: 61 72 67 73 29 29 3b 0a 09 61 72 67 73 2d 3e 66  args));..args->f
13b0: 70 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66 69 6c  p = logfp;...fil
13c0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20  ed_log_msg_list 
13d0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72 65 61  = NULL;...pthrea
13e0: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 26 66 69  d_mutex_init(&fi
13f0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
1400: 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 0a  _mutex, NULL);..
1410: 09 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28  .pthread_create(
1420: 26 74 68 72 65 61 64 5f 69 64 2c 20 4e 55 4c 4c  &thread_id, NULL
1430: 2c 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f  , filed_logging_
1440: 74 68 72 65 61 64 2c 20 61 72 67 73 29 3b 0a 0a  thread, args);..
1450: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
1460: 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64  tatic void filed
1470: 5f 6c 6f 67 5f 6d 73 67 28 63 6f 6e 73 74 20 63  _log_msg(const c
1480: 68 61 72 20 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b  har *fmt, ...) {
1490: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  ..struct filed_l
14a0: 6f 67 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b  og_entry *entry;
14b0: 0a 09 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a  ..va_list args;.
14c0: 0a 09 65 6e 74 72 79 20 3d 20 6d 61 6c 6c 6f 63  ..entry = malloc
14d0: 28 73 69 7a 65 6f 66 28 2a 65 6e 74 72 79 29 29  (sizeof(*entry))
14e0: 3b 0a 0a 09 76 61 5f 73 74 61 72 74 28 61 72 67  ;...va_start(arg
14f0: 73 2c 20 66 6d 74 29 3b 0a 0a 09 76 73 6e 70 72  s, fmt);...vsnpr
1500: 69 6e 74 66 28 65 6e 74 72 79 2d 3e 62 75 66 66  intf(entry->buff
1510: 65 72 2c 20 73 69 7a 65 6f 66 28 65 6e 74 72 79  er, sizeof(entry
1520: 2d 3e 62 75 66 66 65 72 29 2c 20 66 6d 74 2c 20  ->buffer), fmt, 
1530: 61 72 67 73 29 3b 0a 0a 09 76 61 5f 65 6e 64 28  args);...va_end(
1540: 61 72 67 73 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e  args);...entry->
1550: 74 68 72 65 61 64 20 3d 20 70 74 68 72 65 61 64  thread = pthread
1560: 5f 73 65 6c 66 28 29 3b 0a 09 65 6e 74 72 79 2d  _self();..entry-
1570: 3e 6c 65 76 65 6c 20 3d 20 30 3b 0a 0a 09 70 74  >level = 0;...pt
1580: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
1590: 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  (&filed_log_msg_
15a0: 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 65  list_mutex);...e
15b0: 6e 74 72 79 2d 3e 5f 6e 65 78 74 20 3d 20 66 69  ntry->_next = fi
15c0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
15d0: 3b 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ;..filed_log_msg
15e0: 5f 6c 69 73 74 20 3d 20 65 6e 74 72 79 3b 0a 0a  _list = entry;..
15f0: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  .pthread_mutex_u
1600: 6e 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67  nlock(&filed_log
1610: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
1620: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 6f 6e 64  ;...pthread_cond
1630: 5f 73 69 67 6e 61 6c 28 26 66 69 6c 65 64 5f 6c  _signal(&filed_l
1640: 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64  og_msg_list_read
1650: 79 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  y);...return;.}.
1660: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 6d 61  #endif../* Forma
1670: 74 20 74 69 6d 65 20 70 65 72 20 52 46 43 32 36  t time per RFC26
1680: 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  16 */.static cha
1690: 72 20 2a 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f  r *filed_format_
16a0: 74 69 6d 65 28 63 68 61 72 20 2a 62 75 66 66 65  time(char *buffe
16b0: 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72  r, size_t buffer
16c0: 5f 6c 65 6e 2c 20 63 6f 6e 73 74 20 74 69 6d 65  _len, const time
16d0: 5f 74 20 74 69 6d 65 69 6e 66 6f 29 20 7b 0a 09  _t timeinfo) {..
16e0: 73 74 72 75 63 74 20 74 6d 20 74 69 6d 65 69 6e  struct tm timein
16f0: 66 6f 5f 74 6d 2c 20 2a 74 69 6d 65 69 6e 66 6f  fo_tm, *timeinfo
1700: 5f 74 6d 5f 70 3b 0a 0a 09 74 69 6d 65 69 6e 66  _tm_p;...timeinf
1710: 6f 5f 74 6d 5f 70 20 3d 20 67 6d 74 69 6d 65 5f  o_tm_p = gmtime_
1720: 72 28 26 74 69 6d 65 69 6e 66 6f 2c 20 26 74 69  r(&timeinfo, &ti
1730: 6d 65 69 6e 66 6f 5f 74 6d 29 3b 0a 09 69 66 20  meinfo_tm);..if 
1740: 28 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d  (timeinfo_tm_p =
1750: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1760: 72 6e 28 22 75 6e 6b 6e 6f 77 6e 22 29 3b 0a 09  rn("unknown");..
1770: 7d 0a 0a 09 62 75 66 66 65 72 5b 62 75 66 66 65  }...buffer[buffe
1780: 72 5f 6c 65 6e 20 2d 20 31 5d 20 3d 20 27 5c 30  r_len - 1] = '\0
1790: 27 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d  ';..buffer_len =
17a0: 20 73 74 72 66 74 69 6d 65 28 62 75 66 66 65 72   strftime(buffer
17b0: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31  , buffer_len - 1
17c0: 2c 20 22 25 61 2c 20 25 64 20 25 62 20 25 59 20  , "%a, %d %b %Y 
17d0: 25 48 3a 25 4d 3a 25 53 20 47 4d 54 22 2c 20 74  %H:%M:%S GMT", t
17e0: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 29 3b 0a 0a  imeinfo_tm_p);..
17f0: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b  .return(buffer);
1800: 0a 7d 0a 0a 2f 2a 20 68 61 73 68 20 2a 2f 0a 73  .}../* hash */.s
1810: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
1820: 6e 74 20 66 69 6c 65 64 5f 68 61 73 68 28 63 6f  nt filed_hash(co
1830: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1840: 72 20 2a 76 61 6c 75 65 2c 20 75 6e 73 69 67 6e  r *value, unsign
1850: 65 64 20 69 6e 74 20 6d 6f 64 75 6c 75 73 29 20  ed int modulus) 
1860: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
1870: 20 63 75 72 72 2c 20 70 72 65 76 3b 0a 09 69 6e   curr, prev;..in
1880: 74 20 64 69 66 66 3b 0a 09 75 6e 73 69 67 6e 65  t diff;..unsigne
1890: 64 20 69 6e 74 20 72 65 74 76 61 6c 3b 0a 0a 09  d int retval;...
18a0: 72 65 74 76 61 6c 20 3d 20 6d 6f 64 75 6c 75 73  retval = modulus
18b0: 20 2d 20 31 3b 0a 09 70 72 65 76 20 3d 20 6d 6f   - 1;..prev = mo
18c0: 64 75 6c 75 73 20 25 20 32 35 35 3b 0a 0a 09 77  dulus % 255;...w
18d0: 68 69 6c 65 20 28 28 63 75 72 72 20 3d 20 2a 76  hile ((curr = *v
18e0: 61 6c 75 65 29 29 20 7b 0a 09 09 69 66 20 28 63  alue)) {...if (c
18f0: 75 72 72 20 3c 20 33 32 29 20 7b 0a 09 09 09 63  urr < 32) {....c
1900: 75 72 72 20 3d 20 32 35 35 20 2d 20 63 75 72 72  urr = 255 - curr
1910: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1920: 63 75 72 72 20 2d 3d 20 33 32 3b 0a 09 09 7d 0a  curr -= 32;...}.
1930: 0a 09 09 69 66 20 28 70 72 65 76 20 3c 20 63 75  ...if (prev < cu
1940: 72 72 29 20 7b 0a 09 09 09 64 69 66 66 20 3d 20  rr) {....diff = 
1950: 63 75 72 72 20 2d 20 70 72 65 76 3b 0a 09 09 7d  curr - prev;...}
1960: 20 65 6c 73 65 20 7b 0a 09 09 09 64 69 66 66 20   else {....diff 
1970: 3d 20 70 72 65 76 20 2d 20 63 75 72 72 3b 0a 09  = prev - curr;..
1980: 09 7d 0a 0a 09 09 70 72 65 76 20 3d 20 63 75 72  .}....prev = cur
1990: 72 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3c 3c 3d  r;....retval <<=
19a0: 20 33 3b 0a 09 09 72 65 74 76 61 6c 20 26 3d 20   3;...retval &= 
19b0: 30 78 46 46 46 46 46 46 46 46 4c 55 3b 0a 09 09  0xFFFFFFFFLU;...
19c0: 72 65 74 76 61 6c 20 5e 3d 20 64 69 66 66 3b 0a  retval ^= diff;.
19d0: 0a 09 09 76 61 6c 75 65 2b 2b 3b 0a 09 7d 0a 0a  ...value++;..}..
19e0: 09 72 65 74 76 61 6c 20 3d 20 72 65 74 76 61 6c  .retval = retval
19f0: 20 25 20 6d 6f 64 75 6c 75 73 3b 0a 0a 09 72 65   % modulus;...re
1a00: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
1a10: 0a 2f 2a 20 46 69 6e 64 20 61 20 6d 69 6d 65 2d  ./* Find a mime-
1a20: 74 79 70 65 20 62 61 73 65 64 20 6f 6e 20 74 68  type based on th
1a30: 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 73 74  e filename */.st
1a40: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1a50: 2a 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65  *filed_determine
1a60: 5f 6d 69 6d 65 74 79 70 65 28 63 6f 6e 73 74 20  _mimetype(const 
1a70: 63 68 61 72 20 2a 70 61 74 68 29 20 7b 0a 09 63  char *path) {..c
1a80: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 0a 09  onst char *p;...
1a90: 70 20 3d 20 73 74 72 72 63 68 72 28 70 61 74 68  p = strrchr(path
1aa0: 2c 20 27 2e 27 29 3b 0a 09 69 66 20 28 70 20 3d  , '.');..if (p =
1ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1ac0: 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54  rn(FILED_DEFAULT
1ad0: 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 70 2b 2b  _TYPE);..}...p++
1ae0: 3b 0a 09 69 66 20 28 2a 70 20 3d 3d 20 27 5c 30  ;..if (*p == '\0
1af0: 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 46 49  ') {...return(FI
1b00: 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45  LED_DEFAULT_TYPE
1b10: 29 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f  );..}...filed_lo
1b20: 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f 6f  g_msg_debug("Loo
1b30: 6b 69 6e 67 20 75 70 20 4d 49 4d 45 20 74 79 70  king up MIME typ
1b40: 65 20 66 6f 72 20 25 73 20 28 68 61 73 68 20 3d  e for %s (hash =
1b50: 20 25 6c 6c 75 29 22 2c 20 70 2c 20 28 75 6e 73   %llu)", p, (uns
1b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
1b70: 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f 6e   filed_hash((con
1b80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b90: 20 2a 29 20 70 2c 20 31 36 37 37 37 32 35 39 29   *) p, 16777259)
1ba0: 29 3b 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 69  );..#include "fi
1bb0: 6c 65 64 2d 6d 69 6d 65 2d 74 79 70 65 73 2e 68  led-mime-types.h
1bc0: 22 0a 0a 09 72 65 74 75 72 6e 28 46 49 4c 45 44  "...return(FILED
1bd0: 5f 44 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a  _DEFAULT_TYPE);.
1be0: 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c  }../* Open a fil
1bf0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 66 69 6c  e and return fil
1c00: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
1c10: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 66  .static struct f
1c20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66  iled_fileinfo *f
1c30: 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 63  iled_open_file(c
1c40: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
1c50: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69   struct filed_fi
1c60: 6c 65 69 6e 66 6f 20 2a 62 75 66 66 65 72 29 20  leinfo *buffer) 
1c70: 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  {..struct filed_
1c80: 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65 3b  fileinfo *cache;
1c90: 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63  ..unsigned int c
1ca0: 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f 74  ache_idx;..off_t
1cb0: 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a   len;..int fd;..
1cc0: 09 63 61 63 68 65 5f 69 64 78 20 3d 20 66 69 6c  .cache_idx = fil
1cd0: 65 64 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75  ed_hash((const u
1ce0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1cf0: 70 61 74 68 2c 20 66 69 6c 65 64 5f 66 69 6c 65  path, filed_file
1d00: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a  info_fdcache_siz
1d10: 65 29 3b 0a 0a 09 63 61 63 68 65 20 3d 20 26 66  e);...cache = &f
1d20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
1d30: 63 61 63 68 65 5b 63 61 63 68 65 5f 69 64 78 5d  cache[cache_idx]
1d40: 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ;...filed_log_ms
1d50: 67 5f 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67  g_debug("Locking
1d60: 20 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20   mutex for idx: 
1d70: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
1d80: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29  long) cache_idx)
1d90: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ;...pthread_mute
1da0: 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  x_lock(&cache->m
1db0: 75 74 65 78 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c  utex);...filed_l
1dc0: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f  og_msg_debug("Co
1dd0: 6d 70 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20  mpleted locking 
1de0: 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25  mutex for idx: %
1df0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
1e00: 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b  ong) cache_idx);
1e10: 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 70 61  ...if (strcmp(pa
1e20: 74 68 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 29  th, cache->path)
1e30: 20 21 3d 20 30 29 20 7b 0a 09 09 66 69 6c 65 64   != 0) {...filed
1e40: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
1e50: 43 61 63 68 65 20 6d 69 73 73 20 66 6f 72 20 69  Cache miss for i
1e60: 64 78 3a 20 25 6c 75 3a 20 4f 4c 44 20 5c 22 25  dx: %lu: OLD \"%
1e70: 73 5c 22 2c 20 4e 45 57 20 5c 22 25 73 5c 22 22  s\", NEW \"%s\""
1e80: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1e90: 29 20 63 61 63 68 65 5f 69 64 78 2c 20 63 61 63  ) cache_idx, cac
1ea0: 68 65 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b  he->path, path);
1eb0: 0a 0a 09 09 66 64 20 3d 20 6f 70 65 6e 28 70 61  ....fd = open(pa
1ec0: 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 20 7c 20 4f  th, O_RDONLY | O
1ed0: 5f 4c 41 52 47 45 46 49 4c 45 29 3b 0a 09 09 69  _LARGEFILE);...i
1ee0: 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 09  f (fd < 0) {....
1ef0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
1f00: 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74  lock(&cache->mut
1f10: 65 78 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ex);.....return(
1f20: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66 72  NULL);...}....fr
1f30: 65 65 28 63 61 63 68 65 2d 3e 70 61 74 68 29 3b  ee(cache->path);
1f40: 0a 09 09 69 66 20 28 63 61 63 68 65 2d 3e 66 64  ...if (cache->fd
1f50: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 63 6c 6f 73   >= 0) {....clos
1f60: 65 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09  e(cache->fd);...
1f70: 7d 0a 0a 09 09 6c 65 6e 20 3d 20 6c 73 65 65 6b  }....len = lseek
1f80: 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (fd, 0, SEEK_END
1f90: 29 3b 0a 09 09 6c 73 65 65 6b 28 66 64 2c 20 30  );...lseek(fd, 0
1fa0: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 09 09  , SEEK_SET);....
1fb0: 63 61 63 68 65 2d 3e 66 64 20 3d 20 66 64 3b 0a  cache->fd = fd;.
1fc0: 09 09 63 61 63 68 65 2d 3e 6c 65 6e 20 3d 20 6c  ..cache->len = l
1fd0: 65 6e 3b 0a 09 09 63 61 63 68 65 2d 3e 70 61 74  en;...cache->pat
1fe0: 68 20 3d 20 73 74 72 64 75 70 28 70 61 74 68 29  h = strdup(path)
1ff0: 3b 0a 09 09 63 61 63 68 65 2d 3e 74 79 70 65 20  ;...cache->type 
2000: 3d 20 66 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e  = filed_determin
2010: 65 5f 6d 69 6d 65 74 79 70 65 28 70 61 74 68 29  e_mimetype(path)
2020: 3b 0a 0a 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f  ;..../* XXX:TODO
2030: 3a 20 44 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09  : Determine */..
2040: 09 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20  .cache->lastmod 
2050: 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74  = filed_format_t
2060: 69 6d 65 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d  ime(cache->lastm
2070: 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 63 61 63  od_b, sizeof(cac
2080: 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20  he->lastmod_b), 
2090: 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29  time(NULL) - 30)
20a0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69  ;..} else {...fi
20b0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
20c0: 67 28 22 43 61 63 68 65 20 68 69 74 20 66 6f 72  g("Cache hit for
20d0: 20 69 64 78 3a 20 25 6c 75 3a 20 50 41 54 48 20   idx: %lu: PATH 
20e0: 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e  \"%s\"", (unsign
20f0: 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69  ed long) cache_i
2100: 64 78 2c 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09  dx, path);..}...
2110: 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76 65 20 74  /*.. * We have t
2120: 6f 20 6d 61 6b 65 20 61 20 64 75 70 6c 69 63 61  o make a duplica
2130: 74 65 20 46 44 2c 20 62 65 63 61 75 73 65 20 6f  te FD, because o
2140: 6e 63 65 20 77 65 20 72 65 6c 65 61 73 65 20 74  nce we release t
2150: 68 65 20 63 61 63 68 65 0a 09 20 2a 20 6d 75 74  he cache.. * mut
2160: 65 78 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  ex, the file des
2170: 63 72 69 70 74 6f 72 20 6d 61 79 20 62 65 20 63  criptor may be c
2180: 6c 6f 73 65 64 0a 09 20 2a 2f 0a 09 66 64 20 3d  losed.. */..fd =
2190: 20 64 75 70 28 63 61 63 68 65 2d 3e 66 64 29 3b   dup(cache->fd);
21a0: 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a  ..if (fd < 0) {.
21b0: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
21c0: 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  unlock(&cache->m
21d0: 75 74 65 78 29 3b 0a 0a 09 09 72 65 74 75 72 6e  utex);....return
21e0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
21f0: 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 62  fer->fd = fd;..b
2200: 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20 63 61 63  uffer->len = cac
2210: 68 65 2d 3e 6c 65 6e 3b 0a 09 62 75 66 66 65 72  he->len;..buffer
2220: 2d 3e 74 79 70 65 20 3d 20 63 61 63 68 65 2d 3e  ->type = cache->
2230: 74 79 70 65 3b 0a 09 6d 65 6d 63 70 79 28 62 75  type;..memcpy(bu
2240: 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c  ffer->lastmod_b,
2250: 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f   cache->lastmod_
2260: 62 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  b, sizeof(buffer
2270: 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29 3b 0a 09  ->lastmod_b));..
2280: 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 20  buffer->lastmod 
2290: 3d 20 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f  = buffer->lastmo
22a0: 64 5f 62 20 2b 20 28 63 61 63 68 65 2d 3e 6c 61  d_b + (cache->la
22b0: 73 74 6d 6f 64 20 2d 20 63 61 63 68 65 2d 3e 6c  stmod - cache->l
22c0: 61 73 74 6d 6f 64 5f 62 29 3b 0a 0a 09 70 74 68  astmod_b);...pth
22d0: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
22e0: 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29  k(&cache->mutex)
22f0: 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65  ;...return(buffe
2300: 72 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f 63 65 73  r);.}../* Proces
2310: 73 20 61 6e 20 48 54 54 50 20 72 65 71 75 65 73  s an HTTP reques
2320: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
2330: 20 70 61 74 68 20 72 65 71 75 65 73 74 65 64 20   path requested 
2340: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2350: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
2360: 65 73 74 20 2a 66 69 6c 65 64 5f 67 65 74 5f 68  est *filed_get_h
2370: 74 74 70 5f 72 65 71 75 65 73 74 28 46 49 4c 45  ttp_request(FILE
2380: 20 2a 66 70 2c 20 73 74 72 75 63 74 20 66 69 6c   *fp, struct fil
2390: 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20  ed_http_request 
23a0: 2a 62 75 66 66 65 72 5f 73 74 29 20 7b 0a 09 63  *buffer_st) {..c
23b0: 68 61 72 20 2a 6d 65 74 68 6f 64 2c 20 2a 70 61  har *method, *pa
23c0: 74 68 3b 0a 09 63 68 61 72 20 2a 62 75 66 66 65  th;..char *buffe
23d0: 72 2c 20 2a 74 6d 70 62 75 66 66 65 72 2c 20 2a  r, *tmpbuffer, *
23e0: 77 6f 72 6b 62 75 66 66 65 72 2c 20 2a 77 6f 72  workbuffer, *wor
23f0: 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 09 73  kbuffer_next;..s
2400: 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
2410: 2c 20 74 6d 70 62 75 66 66 65 72 5f 6c 65 6e 3b  , tmpbuffer_len;
2420: 0a 09 6f 66 66 5f 74 20 72 61 6e 67 65 5f 73 74  ..off_t range_st
2430: 61 72 74 2c 20 72 61 6e 67 65 5f 65 6e 64 2c 20  art, range_end, 
2440: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a 09 69  range_length;..i
2450: 6e 74 20 72 61 6e 67 65 5f 72 65 71 75 65 73 74  nt range_request
2460: 3b 0a 09 69 6e 74 20 66 64 3b 0a 09 69 6e 74 20  ;..int fd;..int 
2470: 69 3b 0a 0a 09 66 64 20 3d 20 66 69 6c 65 6e 6f  i;...fd = fileno
2480: 28 66 70 29 3b 0a 0a 09 72 61 6e 67 65 5f 73 74  (fp);...range_st
2490: 61 72 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f  art = 0;..range_
24a0: 65 6e 64 20 20 20 3d 20 30 3b 0a 09 72 61 6e 67  end   = 0;..rang
24b0: 65 5f 72 65 71 75 65 73 74 20 3d 20 30 3b 0a 09  e_request = 0;..
24c0: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 2d  range_length = -
24d0: 31 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 62 75  1;...buffer = bu
24e0: 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 5f 62 3b  ffer_st->path_b;
24f0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73  ..buffer_len = s
2500: 69 7a 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d  izeof(buffer_st-
2510: 3e 70 61 74 68 5f 62 29 3b 0a 0a 09 74 6d 70 62  >path_b);...tmpb
2520: 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73  uffer = buffer_s
2530: 74 2d 3e 74 6d 70 62 75 66 3b 0a 09 74 6d 70 62  t->tmpbuf;..tmpb
2540: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
2550: 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d  of(buffer_st->tm
2560: 70 62 75 66 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c  pbuf);...filed_l
2570: 6f 67 5f 6d 73 67 28 22 57 41 49 54 5f 46 4f 52  og_msg("WAIT_FOR
2580: 5f 52 45 51 55 45 53 54 20 46 44 3d 25 69 22 2c  _REQUEST FD=%i",
2590: 20 66 64 29 3b 0a 0a 09 66 67 65 74 73 28 62 75   fd);...fgets(bu
25a0: 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e  ffer, buffer_len
25b0: 2c 20 66 70 29 3b 0a 0a 09 6d 65 74 68 6f 64 20  , fp);...method 
25c0: 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75 66 66  = buffer;...buff
25d0: 65 72 20 3d 20 73 74 72 63 68 72 28 62 75 66 66  er = strchr(buff
25e0: 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20 28 62  er, ' ');..if (b
25f0: 75 66 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  uffer == NULL) {
2600: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
2610: 28 22 47 4f 54 5f 52 45 51 55 45 53 54 20 46 44  ("GOT_REQUEST FD
2620: 3d 25 69 20 45 52 52 4f 52 3d 66 6f 72 6d 61 74  =%i ERROR=format
2630: 22 2c 20 66 64 29 3b 0a 0a 09 09 72 65 74 75 72  ", fd);....retur
2640: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 62  n(NULL);..}...*b
2650: 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a 09 62  uffer = '\0';..b
2660: 75 66 66 65 72 2b 2b 3b 0a 0a 09 70 61 74 68 20  uffer++;...path 
2670: 3d 20 62 75 66 66 65 72 3b 0a 0a 09 62 75 66 66  = buffer;...buff
2680: 65 72 20 3d 20 73 74 72 63 68 72 28 62 75 66 66  er = strchr(buff
2690: 65 72 2c 20 27 20 27 29 3b 0a 09 69 66 20 28 62  er, ' ');..if (b
26a0: 75 66 66 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  uffer != NULL) {
26b0: 0a 09 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30  ...*buffer = '\0
26c0: 27 3b 0a 09 09 62 75 66 66 65 72 2b 2b 3b 0a 09  ';...buffer++;..
26d0: 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  }...filed_log_ms
26e0: 67 28 22 47 4f 54 5f 52 45 51 55 45 53 54 20 46  g("GOT_REQUEST F
26f0: 44 3d 25 69 20 50 41 54 48 3d 25 73 22 2c 20 66  D=%i PATH=%s", f
2700: 64 2c 20 70 61 74 68 29 3b 0a 0a 09 66 69 6c 65  d, path);...file
2710: 64 5f 6c 6f 67 5f 6d 73 67 28 22 57 41 49 54 5f  d_log_msg("WAIT_
2720: 46 4f 52 5f 48 45 41 44 45 52 53 20 46 44 3d 25  FOR_HEADERS FD=%
2730: 69 22 2c 20 66 64 29 3b 0a 0a 09 66 6f 72 20 28  i", fd);...for (
2740: 69 20 3d 20 30 3b 20 69 20 3c 20 31 30 30 3b 20  i = 0; i < 100; 
2750: 69 2b 2b 29 20 7b 0a 09 09 66 67 65 74 73 28 74  i++) {...fgets(t
2760: 6d 70 62 75 66 66 65 72 2c 20 74 6d 70 62 75 66  mpbuffer, tmpbuf
2770: 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 0a 09  fer_len, fp);...
2780: 09 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70  .if (strncasecmp
2790: 28 74 6d 70 62 75 66 66 65 72 2c 20 22 52 61 6e  (tmpbuffer, "Ran
27a0: 67 65 3a 20 22 2c 20 37 29 20 3d 3d 20 30 29 20  ge: ", 7) == 0) 
27b0: 7b 0a 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20  {....workbuffer 
27c0: 3d 20 74 6d 70 62 75 66 66 65 72 20 2b 20 37 3b  = tmpbuffer + 7;
27d0: 0a 0a 09 09 09 69 66 20 28 73 74 72 6e 63 61 73  .....if (strncas
27e0: 65 63 6d 70 28 77 6f 72 6b 62 75 66 66 65 72 2c  ecmp(workbuffer,
27f0: 20 22 62 79 74 65 73 3d 22 2c 20 36 29 20 3d 3d   "bytes=", 6) ==
2800: 20 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75   0) {.....workbu
2810: 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09 09 09  ffer += 6;......
2820: 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d 20  range_request = 
2830: 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f 73 74  1;......range_st
2840: 61 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77  art = strtoull(w
2850: 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72 6b  orkbuffer, &work
2860: 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30 29  buffer_next, 10)
2870: 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65  ;......workbuffe
2880: 72 20 3d 20 77 6f 72 6b 62 75 66 66 65 72 5f 6e  r = workbuffer_n
2890: 65 78 74 3b 0a 0a 09 09 09 09 69 66 20 28 2a 77  ext;......if (*w
28a0: 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 2d 27  orkbuffer == '-'
28b0: 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62 75 66  ) {......workbuf
28c0: 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69 66 20  fer++;.......if 
28d0: 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20  (*workbuffer != 
28e0: 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62 75 66  '\r' && *workbuf
28f0: 66 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b 0a 09  fer != '\n') {..
2900: 09 09 09 09 09 72 61 6e 67 65 5f 65 6e 64 20 3d  .....range_end =
2910: 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75   strtoull(workbu
2920: 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65  ffer, &workbuffe
2930: 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09 09 09  r_next, 10);....
2940: 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09  ..}.....}....}..
2950: 09 7d 0a 0a 09 09 69 66 20 28 6d 65 6d 63 6d 70  .}....if (memcmp
2960: 28 74 6d 70 62 75 66 66 65 72 2c 20 22 5c 72 5c  (tmpbuffer, "\r\
2970: 6e 22 2c 20 32 29 20 3d 3d 20 30 29 20 7b 0a 09  n", 2) == 0) {..
2980: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a  ..break;...}..}.
2990: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
29a0: 22 47 4f 54 5f 48 45 41 44 45 52 53 20 46 44 3d  "GOT_HEADERS FD=
29b0: 25 69 22 2c 20 66 64 29 3b 0a 0a 09 2f 2a 20 57  %i", fd);.../* W
29c0: 65 20 6f 6e 6c 79 20 68 61 6e 64 6c 65 20 74 68  e only handle th
29d0: 65 20 22 47 45 54 22 20 6d 65 74 68 6f 64 20 2a  e "GET" method *
29e0: 2f 0a 09 69 66 20 28 73 74 72 63 61 73 65 63 6d  /..if (strcasecm
29f0: 70 28 6d 65 74 68 6f 64 2c 20 22 67 65 74 22 29  p(method, "get")
2a00: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   != 0) {...retur
2a10: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
2a20: 20 44 65 74 65 72 6d 69 6e 65 20 72 61 6e 67 65   Determine range
2a30: 20 2a 2f 0a 09 69 66 20 28 72 61 6e 67 65 5f 65   */..if (range_e
2a40: 6e 64 20 21 3d 20 30 29 20 7b 0a 09 09 69 66 20  nd != 0) {...if 
2a50: 28 72 61 6e 67 65 5f 65 6e 64 20 3c 3d 20 72 61  (range_end <= ra
2a60: 6e 67 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 09  nge_start) {....
2a70: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09  return(NULL);...
2a80: 7d 0a 0a 09 09 72 61 6e 67 65 5f 6c 65 6e 67 74  }....range_lengt
2a90: 68 20 3d 20 72 61 6e 67 65 5f 65 6e 64 20 2d 20  h = range_end - 
2aa0: 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 0a 09 09  range_start;....
2ab0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
2ac0: 62 75 67 28 22 43 6f 6d 70 75 74 69 6e 67 20 6c  bug("Computing l
2ad0: 65 6e 67 74 68 20 70 61 72 61 6d 65 74 65 72 3a  ength parameter:
2ae0: 20 25 6c 6c 75 20 3d 20 25 6c 6c 75 20 2d 20 25   %llu = %llu - %
2af0: 6c 6c 75 22 2c 0a 09 09 09 28 75 6e 73 69 67 6e  llu",....(unsign
2b00: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61  ed long long) ra
2b10: 6e 67 65 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 28  nge_length,....(
2b20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
2b30: 6e 67 29 20 72 61 6e 67 65 5f 65 6e 64 2c 0a 09  ng) range_end,..
2b40: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
2b50: 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 73 74 61   long) range_sta
2b60: 72 74 0a 09 09 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  rt...);..}.../* 
2b70: 46 69 6c 6c 20 75 70 20 73 74 72 75 63 74 75 72  Fill up structur
2b80: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 09  e to return */..
2b90: 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74 68 20  buffer_st->path 
2ba0: 20 20 3d 20 70 61 74 68 3b 0a 09 62 75 66 66 65    = path;..buffe
2bb0: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  r_st->headers.ra
2bc0: 6e 67 65 2e 70 72 65 73 65 6e 74 20 3d 20 72 61  nge.present = ra
2bd0: 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 62 75  nge_request;..bu
2be0: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
2bf0: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d  .range.offset  =
2c00: 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62   range_start;..b
2c10: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
2c20: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20  s.range.length  
2c30: 3d 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  = range_length;.
2c40: 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f  ..return(buffer_
2c50: 73 74 29 3b 0a 0a 09 2f 2a 20 4d 61 6b 65 20 63  st);.../* Make c
2c60: 6f 6d 70 69 6c 65 72 20 68 61 70 70 79 20 2a 2f  ompiler happy */
2c70: 0a 09 66 64 20 3d 20 66 64 3b 0a 7d 0a 0a 2f 2a  ..fd = fd;.}../*
2c80: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
2c90: 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69 63 20   page */.static 
2ca0: 76 6f 69 64 20 66 69 6c 65 64 5f 65 72 72 6f 72  void filed_error
2cb0: 5f 70 61 67 65 28 46 49 4c 45 20 2a 66 70 2c 20  _page(FILE *fp, 
2cc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 65  const char *date
2cd0: 5f 63 75 72 72 65 6e 74 2c 20 69 6e 74 20 65 72  _current, int er
2ce0: 72 6f 72 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 63  ror_number) {..c
2cf0: 68 61 72 20 2a 65 72 72 6f 72 5f 73 74 72 69 6e  har *error_strin
2d00: 67 20 3d 20 22 3c 68 74 6d 6c 3e 3c 68 65 61 64  g = "<html><head
2d10: 3e 3c 74 69 74 6c 65 3e 45 52 52 4f 52 3c 2f 74  ><title>ERROR</t
2d20: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 3c 62 6f 64  itle></head><bod
2d30: 79 3e 55 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63  y>Unable to proc
2d40: 65 73 73 20 72 65 71 75 65 73 74 3c 2f 62 6f 64  ess request</bod
2d50: 79 3e 3c 2f 68 74 6d 6c 3e 22 3b 0a 0a 09 66 70  y></html>";...fp
2d60: 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f  rintf(fp, "HTTP/
2d70: 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74  1.1 %i OK\r\nDat
2d80: 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a  e: %s\r\nServer:
2d90: 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d   filed\r\nLast-M
2da0: 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43  odified: %s\r\nC
2db0: 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25  ontent-Length: %
2dc0: 6c 6c 75 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54  llu\r\nContent-T
2dd0: 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65  ype: %s\r\nConne
2de0: 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e  ction: close\r\n
2df0: 5c 72 5c 6e 25 73 22 2c 0a 09 09 65 72 72 6f 72  \r\n%s",...error
2e00: 5f 6e 75 6d 62 65 72 2c 0a 09 09 64 61 74 65 5f  _number,...date_
2e10: 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f  current,...date_
2e20: 63 75 72 72 65 6e 74 2c 0a 09 09 28 75 6e 73 69  current,...(unsi
2e30: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
2e40: 73 74 72 6c 65 6e 28 65 72 72 6f 72 5f 73 74 72  strlen(error_str
2e50: 69 6e 67 29 2c 0a 09 09 22 74 65 78 74 2f 68 74  ing),..."text/ht
2e60: 6d 6c 22 2c 0a 09 09 65 72 72 6f 72 5f 73 74 72  ml",...error_str
2e70: 69 6e 67 0a 09 29 3b 0a 7d 0a 0a 2f 2a 20 48 61  ing..);.}../* Ha
2e80: 6e 64 6c 65 20 61 20 73 69 6e 67 6c 65 20 72 65  ndle a single re
2e90: 71 75 65 73 74 20 66 72 6f 6d 20 61 20 63 6c 69  quest from a cli
2ea0: 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent */.static vo
2eb0: 69 64 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f  id filed_handle_
2ec0: 63 6c 69 65 6e 74 28 69 6e 74 20 66 64 2c 20 73  client(int fd, s
2ed0: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
2ee0: 5f 72 65 71 75 65 73 74 20 2a 72 65 71 75 65 73  _request *reques
2ef0: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c  t) {..struct fil
2f00: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c  ed_fileinfo *fil
2f10: 65 69 6e 66 6f 3b 0a 09 73 73 69 7a 65 5f 74 20  einfo;..ssize_t 
2f20: 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 73  sendfile_ret;..s
2f30: 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 6c  ize_t sendfile_l
2f40: 65 6e 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e  en, sendfile_sen
2f50: 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65  t, sendfile_size
2f60: 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 64 66 69 6c  ;..off_t sendfil
2f70: 65 5f 6f 66 66 73 65 74 3b 0a 09 63 68 61 72 20  e_offset;..char 
2f80: 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 64 61  *path;..char *da
2f90: 74 65 5f 63 75 72 72 65 6e 74 2c 20 64 61 74 65  te_current, date
2fa0: 5f 63 75 72 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a  _current_b[64];.
2fb0: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
2fc0: 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20  .FILE *fp;.../* 
2fd0: 44 65 74 65 72 6d 69 6e 65 20 63 75 72 72 65 6e  Determine curren
2fe0: 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f  t time */..date_
2ff0: 63 75 72 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f  current = filed_
3000: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61 74 65  format_time(date
3010: 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65  _current_b, size
3020: 6f 66 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  of(date_current_
3030: 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b  b), time(NULL));
3040: 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65  .../* Open socke
3050: 74 20 61 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f  t as ANSI I/O fo
3060: 72 20 65 61 73 65 20 6f 66 20 75 73 65 20 2a 2f  r ease of use */
3070: 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e 28 66 64  ..fp = fdopen(fd
3080: 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66 20 28 66  , "w+b");..if (f
3090: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  p == NULL) {...c
30a0: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74  lose(fd);....ret
30b0: 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65 71 75 65 73  urn;..}...reques
30c0: 74 20 3d 20 66 69 6c 65 64 5f 67 65 74 5f 68 74  t = filed_get_ht
30d0: 74 70 5f 72 65 71 75 65 73 74 28 66 70 2c 20 72  tp_request(fp, r
30e0: 65 71 75 65 73 74 29 3b 0a 0a 09 69 66 20 28 72  equest);...if (r
30f0: 65 71 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 20 7c  equest == NULL |
3100: 7c 20 72 65 71 75 65 73 74 2d 3e 70 61 74 68 20  | request->path 
3110: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c  == NULL) {...fil
3120: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70  ed_error_page(fp
3130: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20  , date_current, 
3140: 35 30 30 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c  500);....filed_l
3150: 6f 67 5f 6d 73 67 28 22 49 4e 56 41 4c 49 44 5f  og_msg("INVALID_
3160: 52 45 51 55 45 53 54 20 46 44 3d 25 69 20 45 52  REQUEST FD=%i ER
3170: 52 4f 52 3d 35 30 30 22 2c 20 66 64 29 3b 0a 0a  ROR=500", fd);..
3180: 09 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09  ..fclose(fp);...
3190: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 69 66  .return;..}...if
31a0: 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65   (request->heade
31b0: 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e 74  rs.range.present
31c0: 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ) {...filed_log_
31d0: 6d 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50  msg("PROCESS_REP
31e0: 4c 59 5f 53 54 41 52 54 20 46 44 3d 25 69 20 50  LY_START FD=%i P
31f0: 41 54 48 3d 25 73 20 52 41 4e 47 45 5f 53 54 41  ATH=%s RANGE_STA
3200: 52 54 3d 25 6c 6c 75 20 52 41 4e 47 45 5f 4c 45  RT=%llu RANGE_LE
3210: 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 66  NGTH=%llu",....f
3220: 64 2c 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 70  d,....request->p
3230: 61 74 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65  ath,....(unsigne
3240: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  d long long) req
3250: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
3260: 6e 67 65 2e 6f 66 66 73 65 74 2c 0a 09 09 09 28  nge.offset,....(
3270: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
3280: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
3290: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
32a0: 68 0a 09 09 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  h...);..} else {
32b0: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
32c0: 28 22 50 52 4f 43 45 53 53 5f 52 45 50 4c 59 5f  ("PROCESS_REPLY_
32d0: 53 54 41 52 54 20 46 44 3d 25 69 20 50 41 54 48  START FD=%i PATH
32e0: 3d 25 73 22 2c 20 66 64 2c 20 72 65 71 75 65 73  =%s", fd, reques
32f0: 74 2d 3e 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 70  t->path);..}...p
3300: 61 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 70  ath = request->p
3310: 61 74 68 3b 0a 0a 09 68 74 74 70 5f 63 6f 64 65  ath;...http_code
3320: 20 3d 20 2d 31 3b 0a 0a 09 66 69 6c 65 69 6e 66   = -1;...fileinf
3330: 6f 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66  o = filed_open_f
3340: 69 6c 65 28 70 61 74 68 2c 20 26 72 65 71 75 65  ile(path, &reque
3350: 73 74 2d 3e 66 69 6c 65 69 6e 66 6f 29 3b 0a 09  st->fileinfo);..
3360: 69 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d 3d 20  if (fileinfo == 
3370: 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64 5f  NULL) {...filed_
3380: 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64  error_page(fp, d
3390: 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 30 34  ate_current, 404
33a0: 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  );....filed_log_
33b0: 6d 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50  msg("PROCESS_REP
33c0: 4c 59 5f 43 4f 4d 50 4c 45 54 45 20 46 44 3d 25  LY_COMPLETE FD=%
33d0: 69 20 45 52 52 4f 52 3d 34 30 34 22 2c 20 66 64  i ERROR=404", fd
33e0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  );..} else {...i
33f0: 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  f (request->head
3400: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3410: 20 21 3d 20 30 20 7c 7c 20 72 65 71 75 65 73 74   != 0 || request
3420: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3430: 6c 65 6e 67 74 68 20 3e 3d 20 30 29 20 7b 0a 09  length >= 0) {..
3440: 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68  ..if (request->h
3450: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
3460: 73 65 74 20 3e 3d 20 66 69 6c 65 69 6e 66 6f 2d  set >= fileinfo-
3470: 3e 6c 65 6e 29 20 7b 0a 09 09 09 09 66 69 6c 65  >len) {.....file
3480: 64 5f 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45  d_log_msg("PROCE
3490: 53 53 5f 52 45 50 4c 59 5f 43 4f 4d 50 4c 45 54  SS_REPLY_COMPLET
34a0: 45 20 46 44 3d 25 69 20 45 52 52 4f 52 3d 34 31  E FD=%i ERROR=41
34b0: 36 22 2c 20 66 64 29 3b 0a 0a 09 09 09 09 66 69  6", fd);......fi
34c0: 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66  led_error_page(f
34d0: 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  p, date_current,
34e0: 20 34 31 36 29 3b 0a 09 09 09 7d 20 65 6c 73 65   416);....} else
34f0: 20 7b 0a 09 09 09 09 69 66 20 28 72 65 71 75 65   {.....if (reque
3500: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3510: 65 2e 6c 65 6e 67 74 68 20 3c 20 30 29 20 7b 0a  e.length < 0) {.
3520: 09 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  .....filed_log_m
3530: 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75 74  sg_debug("Comput
3540: 69 6e 67 20 6c 65 6e 67 74 68 20 74 6f 20 66 69  ing length to fi
3550: 74 20 69 6e 20 62 6f 75 6e 64 73 3a 20 66 69 6c  t in bounds: fil
3560: 65 69 6e 66 6f 2d 3e 6c 65 6e 20 3d 20 25 6c 6c  einfo->len = %ll
3570: 75 2c 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  u, request->head
3580: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3590: 20 3d 20 25 6c 6c 75 22 2c 0a 09 09 09 09 09 09   = %llu",.......
35a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
35b0: 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  ong) fileinfo->l
35c0: 65 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67  en,.......(unsig
35d0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
35e0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
35f0: 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09 09  range.offset....
3600: 09 09 29 3b 0a 0a 09 09 09 09 09 72 65 71 75 65  ..);.......reque
3610: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3620: 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69  e.length = filei
3630: 6e 66 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75 65  nfo->len - reque
3640: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3650: 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09 09 7d 0a  e.offset;.....}.
3660: 0a 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  .....filed_log_m
3670: 73 67 5f 64 65 62 75 67 28 22 50 61 72 74 69 61  sg_debug("Partia
3680: 6c 20 72 65 71 75 65 73 74 2c 20 73 74 61 72 74  l request, start
3690: 69 6e 67 20 61 74 3a 20 25 6c 6c 75 20 61 6e 64  ing at: %llu and
36a0: 20 72 75 6e 6e 69 6e 67 20 66 6f 72 20 25 6c 6c   running for %ll
36b0: 75 20 62 79 74 65 73 22 2c 0a 09 09 09 09 09 28  u bytes",......(
36c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
36d0: 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61  ng) request->hea
36e0: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
36f0: 74 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65  t,......(unsigne
3700: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  d long long) req
3710: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
3720: 6e 67 65 2e 6c 65 6e 67 74 68 0a 09 09 09 09 29  nge.length.....)
3730: 3b 0a 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65  ;......http_code
3740: 20 3d 20 32 30 36 3b 0a 09 09 09 7d 0a 09 09 7d   = 206;....}...}
3750: 20 65 6c 73 65 20 7b 0a 09 09 09 69 66 20 28 72   else {....if (r
3760: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
3770: 72 61 6e 67 65 2e 70 72 65 73 65 6e 74 29 20 7b  range.present) {
3780: 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d  .....http_code =
3790: 20 32 30 36 3b 0a 09 09 09 7d 20 65 6c 73 65 20   206;....} else 
37a0: 7b 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20  {.....http_code 
37b0: 3d 20 32 30 30 3b 0a 09 09 09 7d 0a 09 09 09 72  = 200;....}....r
37c0: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
37d0: 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20 30  range.offset = 0
37e0: 3b 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 68 65  ;....request->he
37f0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
3800: 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  th = fileinfo->l
3810: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 68  en;...}....if (h
3820: 74 74 70 5f 63 6f 64 65 20 3e 20 30 29 20 7b 0a  ttp_code > 0) {.
3830: 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  ...fprintf(fp, "
3840: 48 54 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72  HTTP/1.1 %i OK\r
3850: 5c 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65  \nDate: %s\r\nSe
3860: 72 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c  rver: filed\r\nL
3870: 61 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73  ast-Modified: %s
3880: 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67  \r\nContent-Leng
3890: 74 68 3a 20 25 6c 6c 75 5c 72 5c 6e 41 63 63 65  th: %llu\r\nAcce
38a0: 70 74 2d 52 61 6e 67 65 73 3a 20 62 79 74 65 73  pt-Ranges: bytes
38b0: 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65  \r\nContent-Type
38c0: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69  : %s\r\nConnecti
38d0: 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 22 2c 0a  on: close\r\n",.
38e0: 09 09 09 09 68 74 74 70 5f 63 6f 64 65 2c 0a 09  ....http_code,..
38f0: 09 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
3900: 0a 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c  .....fileinfo->l
3910: 61 73 74 6d 6f 64 2c 0a 09 09 09 09 28 75 6e 73  astmod,.....(uns
3920: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3930: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
3940: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a  s.range.length,.
3950: 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79  ....fileinfo->ty
3960: 70 65 0a 09 09 09 29 3b 0a 09 09 09 69 66 20 28  pe....);....if (
3970: 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32 30 36  http_code == 206
3980: 29 20 7b 0a 09 09 09 09 66 70 72 69 6e 74 66 28  ) {.....fprintf(
3990: 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61 6e  fp, "Content-Ran
39a0: 67 65 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d 25  ge: bytes %llu-%
39b0: 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a 09  llu/%llu\r\n",..
39c0: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
39d0: 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74  ng long) request
39e0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
39f0: 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 28 75 6e  offset,......(un
3a00: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
3a10: 29 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64  ) (request->head
3a20: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3a30: 20 2b 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64   + request->head
3a40: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
3a50: 20 2d 20 31 29 2c 0a 09 09 09 09 09 28 75 6e 73   - 1),......(uns
3a60: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3a70: 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 0a 09   fileinfo->len..
3a80: 09 09 09 29 3b 0a 09 09 09 7d 0a 09 09 09 66 70  ...);....}....fp
3a90: 72 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c 6e 22  rintf(fp, "\r\n"
3aa0: 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70 29  );....fflush(fp)
3ab0: 3b 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ;.....filed_log_
3ac0: 6d 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50  msg("PROCESS_REP
3ad0: 4c 59 5f 43 4f 4d 50 4c 45 54 45 20 46 44 3d 25  LY_COMPLETE FD=%
3ae0: 69 20 53 54 41 54 55 53 3d 25 69 22 2c 20 66 64  i STATUS=%i", fd
3af0: 2c 20 68 74 74 70 5f 63 6f 64 65 29 3b 0a 0a 23  , http_code);..#
3b00: 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42  ifdef FILED_NONB
3b10: 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69 6e 74  LOCK_HTTP....int
3b20: 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73 3b 0a 09   socket_flags;..
3b30: 09 09 66 64 5f 73 65 74 20 72 66 64 2c 20 77 66  ..fd_set rfd, wf
3b40: 64 3b 0a 09 09 09 63 68 61 72 20 73 69 6e 6b 62  d;....char sinkb
3b50: 75 66 5b 38 31 39 32 5d 3b 0a 09 09 09 73 73 69  uf[8192];....ssi
3b60: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a  ze_t read_ret;..
3b70: 09 09 09 46 44 5f 5a 45 52 4f 28 26 72 66 64 29  ...FD_ZERO(&rfd)
3b80: 3b 0a 09 09 09 46 44 5f 5a 45 52 4f 28 26 77 66  ;....FD_ZERO(&wf
3b90: 64 29 3b 0a 09 09 09 46 44 5f 53 45 54 28 66 64  d);....FD_SET(fd
3ba0: 2c 20 26 72 66 64 29 3b 0a 09 09 09 46 44 5f 53  , &rfd);....FD_S
3bb0: 45 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a 09  ET(fd, &wfd);...
3bc0: 09 09 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 3d  ..socket_flags =
3bd0: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
3be0: 46 4c 29 3b 0a 09 09 09 66 63 6e 74 6c 28 66 64  FL);....fcntl(fd
3bf0: 2c 20 46 5f 53 45 54 46 4c 2c 20 73 6f 63 6b 65  , F_SETFL, socke
3c00: 74 5f 66 6c 61 67 73 20 7c 20 4f 5f 4e 4f 4e 42  t_flags | O_NONB
3c10: 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  LOCK);.#endif...
3c20: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
3c30: 22 53 45 4e 44 5f 53 54 41 52 54 20 46 49 4c 45  "SEND_START FILE
3c40: 5f 46 44 3d 25 69 20 46 44 3d 25 69 20 42 59 54  _FD=%i FD=%i BYT
3c50: 45 53 3d 25 6c 6c 75 20 4f 46 46 53 45 54 3d 25  ES=%llu OFFSET=%
3c60: 6c 6c 75 22 2c 0a 09 09 09 09 66 69 6c 65 69 6e  llu",.....filein
3c70: 66 6f 2d 3e 66 64 2c 0a 09 09 09 09 66 64 2c 0a  fo->fd,.....fd,.
3c80: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
3c90: 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74  ng long) request
3ca0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3cb0: 6c 65 6e 67 74 68 2c 0a 09 09 09 09 28 75 6e 73  length,.....(uns
3cc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3cd0: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
3ce0: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09  s.range.offset..
3cf0: 09 09 29 3b 0a 0a 09 09 09 73 65 6e 64 66 69 6c  ..);.....sendfil
3d00: 65 5f 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65  e_offset = reque
3d10: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3d20: 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09 73 65 6e  e.offset;....sen
3d30: 64 66 69 6c 65 5f 6c 65 6e 20 3d 20 72 65 71 75  dfile_len = requ
3d40: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
3d50: 67 65 2e 6c 65 6e 67 74 68 3b 0a 09 09 09 73 65  ge.length;....se
3d60: 6e 64 66 69 6c 65 5f 73 65 6e 74 20 3d 20 30 3b  ndfile_sent = 0;
3d70: 0a 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ....while (1) {.
3d80: 09 09 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65  ....if (sendfile
3d90: 5f 6c 65 6e 20 3e 20 46 49 4c 45 44 5f 53 45 4e  _len > FILED_SEN
3da0: 44 46 49 4c 45 5f 4d 41 58 29 20 7b 0a 09 09 09  DFILE_MAX) {....
3db0: 09 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20  ..sendfile_size 
3dc0: 3d 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45  = FILED_SENDFILE
3dd0: 5f 4d 41 58 3b 0a 09 09 09 09 7d 20 65 6c 73 65  _MAX;.....} else
3de0: 20 7b 0a 09 09 09 09 09 73 65 6e 64 66 69 6c 65   {......sendfile
3df0: 5f 73 69 7a 65 20 3d 20 73 65 6e 64 66 69 6c 65  _size = sendfile
3e00: 5f 6c 65 6e 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  _len;.....}.....
3e10: 09 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3d 20  .sendfile_ret = 
3e20: 73 65 6e 64 66 69 6c 65 28 66 64 2c 20 66 69 6c  sendfile(fd, fil
3e30: 65 69 6e 66 6f 2d 3e 66 64 2c 20 26 73 65 6e 64  einfo->fd, &send
3e40: 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e  file_offset, sen
3e50: 64 66 69 6c 65 5f 73 69 7a 65 29 3b 0a 09 09 09  dfile_size);....
3e60: 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 72 65  .if (sendfile_re
3e70: 74 20 3c 3d 20 30 29 20 7b 0a 23 69 66 64 65 66  t <= 0) {.#ifdef
3e80: 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f   FILED_NONBLOCK_
3e90: 48 54 54 50 0a 09 09 09 09 09 69 66 20 28 65 72  HTTP......if (er
3ea0: 72 6e 6f 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b  rno == EAGAIN) {
3eb0: 0a 09 09 09 09 09 09 73 65 6e 64 66 69 6c 65 5f  .......sendfile_
3ec0: 72 65 74 20 3d 20 30 3b 0a 0a 09 09 09 09 09 09  ret = 0;........
3ed0: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 09 09  while (1) {.....
3ee0: 09 09 09 73 65 6c 65 63 74 28 66 64 20 2b 20 31  ...select(fd + 1
3ef0: 2c 20 26 72 66 64 2c 20 26 77 66 64 2c 20 4e 55  , &rfd, &wfd, NU
3f00: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 09  LL, NULL);......
3f10: 09 09 69 66 20 28 46 44 5f 49 53 53 45 54 28 66  ..if (FD_ISSET(f
3f20: 64 2c 20 26 72 66 64 29 29 20 7b 0a 09 09 09 09  d, &rfd)) {.....
3f30: 09 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 72  ....read_ret = r
3f40: 65 61 64 28 66 64 2c 20 73 69 6e 6b 62 75 66 2c  ead(fd, sinkbuf,
3f50: 20 73 69 7a 65 6f 66 28 73 69 6e 6b 62 75 66 29   sizeof(sinkbuf)
3f60: 29 3b 0a 0a 09 09 09 09 09 09 09 09 69 66 20 28  );..........if (
3f70: 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
3f80: 0a 09 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b  ..........break;
3f90: 0a 09 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09  .........}......
3fa0: 09 09 7d 0a 0a 09 09 09 09 09 09 09 69 66 20 28  ..}.........if (
3fb0: 46 44 5f 49 53 53 45 54 28 66 64 2c 20 26 77 66  FD_ISSET(fd, &wf
3fc0: 64 29 29 20 7b 0a 09 09 09 09 09 09 09 09 72 65  d)) {.........re
3fd0: 61 64 5f 72 65 74 20 3d 20 31 3b 0a 0a 09 09 09  ad_ret = 1;.....
3fe0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
3ff0: 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09  ...}.......}....
4000: 09 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74  ....if (read_ret
4010: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09   <= 0) {........
4020: 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09  break;.......}..
4030: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
4040: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
4050: 0a 23 65 6c 73 65 0a 09 09 09 09 09 62 72 65 61  .#else......brea
4060: 6b 3b 0a 23 65 6e 64 69 66 0a 09 09 09 09 7d 0a  k;.#endif.....}.
4070: 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 6c 65  .....sendfile_le
4080: 6e 20 2d 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65  n -= sendfile_re
4090: 74 3b 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f  t;.....sendfile_
40a0: 73 65 6e 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65  sent += sendfile
40b0: 5f 72 65 74 3b 0a 09 09 09 09 69 66 20 28 73 65  _ret;.....if (se
40c0: 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29  ndfile_len == 0)
40d0: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
40e0: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
40f0: 20 58 58 58 3a 20 54 4f 44 4f 3a 20 52 65 70 6f   XXX: TODO: Repo
4100: 72 74 20 73 74 61 74 75 73 20 2a 2f 0a 09 09 09  rt status */....
4110: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 53  filed_log_msg("S
4120: 45 4e 44 5f 43 4f 4d 50 4c 45 54 45 20 53 54 41  END_COMPLETE STA
4130: 54 55 53 3d 25 73 20 46 49 4c 45 5f 46 44 3d 25  TUS=%s FILE_FD=%
4140: 69 20 46 44 3d 25 69 20 42 59 54 45 53 3d 25 6c  i FD=%i BYTES=%l
4150: 6c 75 20 42 59 54 45 53 5f 53 45 4e 54 3d 25 6c  lu BYTES_SENT=%l
4160: 6c 75 22 2c 0a 09 09 09 09 22 3c 75 6e 6b 6e 6f  lu",....."<unkno
4170: 77 6e 3e 22 2c 0a 09 09 09 09 66 69 6c 65 69 6e  wn>",.....filein
4180: 66 6f 2d 3e 66 64 2c 0a 09 09 09 09 66 64 2c 0a  fo->fd,.....fd,.
4190: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
41a0: 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74  ng long) request
41b0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
41c0: 6c 65 6e 67 74 68 2c 0a 09 09 09 09 28 75 6e 73  length,.....(uns
41d0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
41e0: 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 0a 09   sendfile_sent..
41f0: 09 09 29 3b 0a 09 09 7d 0a 0a 09 09 63 6c 6f 73  ..);...}....clos
4200: 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b  e(fileinfo->fd);
4210: 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ....filed_log_ms
4220: 67 28 22 43 4c 4f 53 45 5f 46 49 4c 45 20 46 44  g("CLOSE_FILE FD
4230: 3d 25 69 22 2c 20 66 64 29 3b 0a 09 7d 0a 0a 09  =%i", fd);..}...
4240: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 43  filed_log_msg("C
4250: 4c 4f 53 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20  LOSE_CONNECTION 
4260: 46 44 3d 25 69 22 2c 20 66 64 29 3b 0a 0a 09 66  FD=%i", fd);...f
4270: 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65 74  close(fp);...ret
4280: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c  urn;.}../* Handl
4290: 65 20 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65  e incoming conne
42a0: 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ctions */.static
42b0: 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f 77 6f 72   void *filed_wor
42c0: 6b 65 72 5f 74 68 72 65 61 64 28 76 6f 69 64 20  ker_thread(void 
42d0: 2a 61 72 67 5f 76 29 20 7b 0a 09 73 74 72 75 63  *arg_v) {..struc
42e0: 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74  t filed_worker_t
42f0: 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b  hread_args *arg;
4300: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68  ..struct filed_h
4310: 74 74 70 5f 72 65 71 75 65 73 74 20 72 65 71 75  ttp_request requ
4320: 65 73 74 3b 0a 09 73 74 72 75 63 74 20 73 6f 63  est;..struct soc
4330: 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a  kaddr_in6 addr;.
4340: 09 63 68 61 72 20 6c 6f 67 62 75 66 5f 69 70 5b  .char logbuf_ip[
4350: 31 32 38 5d 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74  128];..socklen_t
4360: 20 61 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66   addrlen;..int f
4370: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30  ailure_count = 0
4380: 2c 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f  , max_failure_co
4390: 75 6e 74 20 3d 20 4d 41 58 5f 46 41 49 4c 55 52  unt = MAX_FAILUR
43a0: 45 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 6d 61  E_COUNT;..int ma
43b0: 73 74 65 72 5f 66 64 2c 20 66 64 3b 0a 0a 09 2f  ster_fd, fd;.../
43c0: 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73  * Read arguments
43d0: 20 2a 2f 0a 09 61 72 67 20 3d 20 61 72 67 5f 76   */..arg = arg_v
43e0: 3b 0a 0a 09 6d 61 73 74 65 72 5f 66 64 20 3d 20  ;...master_fd = 
43f0: 61 72 67 2d 3e 66 64 3b 0a 0a 09 77 68 69 6c 65  arg->fd;...while
4400: 20 28 31 29 20 7b 0a 09 09 2f 2a 20 46 61 69 6c   (1) {.../* Fail
4410: 75 72 65 20 6c 6f 6f 70 20 70 72 65 76 65 6e 74  ure loop prevent
4420: 69 6f 6e 20 2a 2f 0a 09 09 69 66 20 28 66 61 69  ion */...if (fai
4430: 6c 75 72 65 5f 63 6f 75 6e 74 20 3e 20 6d 61 78  lure_count > max
4440: 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 29 20  _failure_count) 
4450: 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  {....break;...}.
4460: 0a 09 09 2f 2a 20 41 63 63 65 70 74 20 61 20 6e  .../* Accept a n
4470: 65 77 20 63 6c 69 65 6e 74 20 2a 2f 0a 09 09 61  ew client */...a
4480: 64 64 72 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  ddrlen = sizeof(
4490: 61 64 64 72 29 3b 0a 09 09 66 64 20 3d 20 61 63  addr);...fd = ac
44a0: 63 65 70 74 28 6d 61 73 74 65 72 5f 66 64 2c 20  cept(master_fd, 
44b0: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
44c0: 20 2a 29 20 26 61 64 64 72 2c 20 26 61 64 64 72   *) &addr, &addr
44d0: 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a  len);..../*... *
44e0: 20 49 66 20 77 65 20 66 61 69 6c 2c 20 6d 61 6b   If we fail, mak
44f0: 65 20 61 20 6e 6f 74 65 20 6f 66 20 69 74 20 73  e a note of it s
4500: 6f 20 77 65 20 64 6f 6e 27 74 20 67 6f 20 69 6e  o we don't go in
4510: 74 6f 20 61 20 6c 6f 6f 70 20 6f 66 0a 09 09 20  to a loop of... 
4520: 2a 20 61 63 63 65 70 74 28 29 20 66 61 69 6c 69  * accept() faili
4530: 6e 67 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 66  ng... */...if (f
4540: 64 20 3c 20 30 29 20 7b 0a 09 09 09 2f 2a 20 4c  d < 0) {..../* L
4550: 6f 67 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  og the new conne
4560: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 66 69 6c 65  ction */....file
4570: 64 5f 6c 6f 67 5f 6d 73 67 28 22 41 43 43 45 50  d_log_msg("ACCEP
4580: 54 5f 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09  T_FAILED");.....
4590: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 2b 2b 3b  failure_count++;
45a0: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
45b0: 09 7d 0a 0a 09 09 2f 2a 20 4c 6f 67 20 74 68 65  .}..../* Log the
45c0: 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
45d0: 2a 2f 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  */...filed_log_m
45e0: 73 67 28 22 4e 45 57 5f 43 4f 4e 4e 45 43 54 49  sg("NEW_CONNECTI
45f0: 4f 4e 20 53 52 43 5f 41 44 44 52 3d 25 73 20 53  ON SRC_ADDR=%s S
4600: 52 43 5f 50 4f 52 54 3d 25 6c 75 20 46 44 3d 25  RC_PORT=%lu FD=%
4610: 69 22 2c 0a 09 09 09 69 6e 65 74 5f 6e 74 6f 70  i",....inet_ntop
4620: 28 41 46 5f 49 4e 45 54 36 2c 20 26 61 64 64 72  (AF_INET6, &addr
4630: 2e 73 69 6e 36 5f 61 64 64 72 2c 20 6c 6f 67 62  .sin6_addr, logb
4640: 75 66 5f 69 70 2c 20 73 69 7a 65 6f 66 28 6c 6f  uf_ip, sizeof(lo
4650: 67 62 75 66 5f 69 70 29 29 20 3f 20 6c 6f 67 62  gbuf_ip)) ? logb
4660: 75 66 5f 69 70 20 3a 20 22 3c 75 6e 6b 6e 6f 77  uf_ip : "<unknow
4670: 6e 3e 22 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65  n>",....(unsigne
4680: 64 20 6c 6f 6e 67 29 20 61 64 64 72 2e 73 69 6e  d long) addr.sin
4690: 36 5f 70 6f 72 74 2c 0a 09 09 09 66 64 0a 09 09  6_port,....fd...
46a0: 29 3b 0a 0a 09 09 2f 2a 20 52 65 73 65 74 20 66  );..../* Reset f
46b0: 61 69 6c 75 72 65 20 63 6f 75 6e 74 2a 2f 0a 09  ailure count*/..
46c0: 09 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d  .failure_count =
46d0: 20 30 3b 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65   0;..../* Handle
46e0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 09 66 69 6c   socket */...fil
46f0: 65 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74  ed_handle_client
4700: 28 66 64 2c 20 26 72 65 71 75 65 73 74 29 3b 0a  (fd, &request);.
4710: 09 7d 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 65  .}.../* Report e
4720: 72 72 6f 72 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c  rror */..filed_l
4730: 6f 67 5f 6d 73 67 28 22 54 48 52 45 41 44 5f 44  og_msg("THREAD_D
4740: 49 45 44 20 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a  IED ABNORMAL");.
4750: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
4760: 0a 09 2f 2a 20 4d 61 6b 65 20 63 6f 6d 70 69 6c  ../* Make compil
4770: 65 72 20 68 61 70 70 79 20 2a 2f 0a 09 6c 6f 67  er happy */..log
4780: 62 75 66 5f 69 70 5b 30 5d 20 3d 20 27 5c 30 27  buf_ip[0] = '\0'
4790: 3b 0a 09 6c 6f 67 62 75 66 5f 69 70 5b 30 5d 20  ;..logbuf_ip[0] 
47a0: 3d 20 6c 6f 67 62 75 66 5f 69 70 5b 30 5d 3b 0a  = logbuf_ip[0];.
47b0: 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 77 6f  .}../* Create wo
47c0: 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a  rker threads */.
47d0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
47e0: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f  _worker_threads_
47f0: 69 6e 69 74 28 69 6e 74 20 66 64 2c 20 69 6e 74  init(int fd, int
4800: 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 29 20 7b   thread_count) {
4810: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  ..struct filed_w
4820: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
4830: 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65 61 64  s *arg;..pthread
4840: 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09 69 6e  _t threadid;..in
4850: 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b 0a 09  t pthread_ret;..
4860: 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69 20  int i;...for (i 
4870: 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61 64 5f  = 0; i < thread_
4880: 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 09  count; i++) {...
4890: 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  arg = malloc(siz
48a0: 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09 61  eof(*arg));....a
48b0: 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 0a 09 09  rg->fd = fd;....
48c0: 70 74 68 72 65 61 64 5f 72 65 74 20 3d 20 70 74  pthread_ret = pt
48d0: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 68  hread_create(&th
48e0: 72 65 61 64 69 64 2c 20 4e 55 4c 4c 2c 20 66 69  readid, NULL, fi
48f0: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
4900: 64 2c 20 61 72 67 29 3b 0a 09 09 69 66 20 28 70  d, arg);...if (p
4910: 74 68 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29  thread_ret != 0)
4920: 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29   {....return(-1)
4930: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
4940: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 69 73 70  n(0);.}../* Disp
4950: 6c 61 79 20 68 65 6c 70 20 2a 2f 0a 73 74 61 74  lay help */.stat
4960: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 70 72  ic void filed_pr
4970: 69 6e 74 5f 68 65 6c 70 28 46 49 4c 45 20 2a 6f  int_help(FILE *o
4980: 75 74 70 75 74 2c 20 69 6e 74 20 6c 6f 6e 67 5f  utput, int long_
4990: 68 65 6c 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  help, const char
49a0: 20 2a 65 78 74 72 61 29 20 7b 0a 09 69 66 20 28   *extra) {..if (
49b0: 65 78 74 72 61 29 20 7b 0a 09 09 66 70 72 69 6e  extra) {...fprin
49c0: 74 66 28 6f 75 74 70 75 74 2c 20 22 25 73 5c 6e  tf(output, "%s\n
49d0: 22 2c 20 65 78 74 72 61 29 3b 0a 09 7d 0a 0a 09  ", extra);..}...
49e0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
49f0: 22 55 73 61 67 65 3a 20 66 69 6c 65 64 20 5b 3c  "Usage: filed [<
4a00: 6f 70 74 69 6f 6e 73 3e 5d 5c 6e 22 29 3b 0a 09  options>]\n");..
4a10: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
4a20: 22 20 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b  "  Options:\n");
4a30: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
4a40: 2c 20 22 20 20 20 20 20 20 2d 68 2c 20 2d 2d 68  , "      -h, --h
4a50: 65 6c 70 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  elp\n");..fprint
4a60: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
4a70: 20 2d 64 2c 20 2d 2d 64 61 65 6d 6f 6e 5c 6e 22   -d, --daemon\n"
4a80: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
4a90: 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20 3c 61  ut, "      -b <a
4aa0: 64 64 72 65 73 73 3e 2c 20 2d 2d 62 69 6e 64 20  ddress>, --bind 
4ab0: 3c 61 64 64 72 65 73 73 3e 5c 6e 22 29 3b 0a 09  <address>\n");..
4ac0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
4ad0: 22 20 20 20 20 20 20 2d 70 20 3c 70 6f 72 74 3e  "      -p <port>
4ae0: 2c 20 2d 2d 70 6f 72 74 20 3c 70 6f 72 74 3e 5c  , --port <port>\
4af0: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
4b00: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 74 20  tput, "      -t 
4b10: 3c 63 6f 75 6e 74 3e 2c 20 2d 2d 74 68 72 65 61  <count>, --threa
4b20: 64 73 20 3c 63 6f 75 6e 74 3e 5c 6e 22 29 3b 0a  ds <count>\n");.
4b30: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4b40: 20 22 20 20 20 20 20 20 2d 63 20 3c 65 6e 74 72   "      -c <entr
4b50: 69 65 73 3e 2c 20 2d 2d 63 61 63 68 65 20 3c 65  ies>, --cache <e
4b60: 6e 74 72 69 65 73 3e 5c 6e 22 29 3b 0a 09 66 70  ntries>\n");..fp
4b70: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
4b80: 20 20 20 20 20 2d 6c 20 3c 66 69 6c 65 3e 2c 20       -l <file>, 
4b90: 2d 2d 6c 6f 67 20 3c 66 69 6c 65 3e 5c 6e 22 29  --log <file>\n")
4ba0: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
4bb0: 74 2c 20 22 20 20 20 20 20 20 2d 75 20 3c 75 73  t, "      -u <us
4bc0: 65 72 3e 2c 20 2d 2d 75 73 65 72 20 3c 75 73 65  er>, --user <use
4bd0: 72 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  r>\n");..fprintf
4be0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
4bf0: 2d 72 20 3c 64 69 72 65 63 74 6f 72 79 3e 2c 20  -r <directory>, 
4c00: 2d 2d 72 6f 6f 74 20 3c 64 69 72 65 63 74 6f 72  --root <director
4c10: 79 3e 5c 6e 22 29 3b 0a 0a 09 69 66 20 28 6c 6f  y>\n");...if (lo
4c20: 6e 67 5f 68 65 6c 70 29 20 7b 0a 09 09 66 70 72  ng_help) {...fpr
4c30: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
4c40: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
4c50: 74 70 75 74 2c 20 22 20 20 55 73 61 67 65 3a 5c  tput, "  Usage:\
4c60: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
4c70: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68  utput, "      -h
4c80: 20 28 6f 72 20 2d 2d 68 65 6c 70 29 20 70 72 69   (or --help) pri
4c90: 6e 74 73 20 74 68 69 73 20 75 73 61 67 65 20 69  nts this usage i
4ca0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 5c 6e 22 29 3b  nformation.\n");
4cb0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
4cc0: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
4cd0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
4ce0: 20 20 20 2d 64 20 28 6f 72 20 2d 2d 64 61 65 6d     -d (or --daem
4cf0: 6f 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66 69  on) instructs fi
4d00: 6c 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  led to become a 
4d10: 64 61 65 6d 6f 6e 20 61 66 74 65 72 20 69 6e 69  daemon after ini
4d20: 74 69 61 6c 69 7a 69 6e 67 5c 6e 22 29 3b 0a 09  tializing\n");..
4d30: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4d40: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
4d50: 20 20 20 20 20 20 20 20 20 74 68 65 20 6c 69 73           the lis
4d60: 74 65 6e 69 6e 67 20 54 43 50 20 73 6f 63 6b 65  tening TCP socke
4d70: 74 20 61 6e 64 20 6c 6f 67 20 66 69 6c 65 73 2e  t and log files.
4d80: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
4d90: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
4da0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4db0: 20 22 20 20 20 20 20 20 2d 62 20 28 6f 72 20 2d   "      -b (or -
4dc0: 2d 62 69 6e 64 29 20 73 70 65 63 69 66 69 65 73  -bind) specifies
4dd0: 20 74 68 65 20 61 64 64 72 65 73 73 20 74 6f 20   the address to 
4de0: 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d  listen for incom
4df0: 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09  ing HTTP\n");...
4e00: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
4e10: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
4e20: 20 20 20 20 20 20 72 65 71 75 65 73 74 73 20 6f        requests o
4e30: 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  n.  The default 
4e40: 76 61 6c 75 65 20 69 73 20 5c 22 25 73 5c 22 2e  value is \"%s\".
4e50: 5c 6e 22 2c 20 42 49 4e 44 5f 41 44 44 52 29 3b  \n", BIND_ADDR);
4e60: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
4e70: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
4e80: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
4e90: 20 20 20 2d 70 20 28 6f 72 20 2d 2d 70 6f 72 74     -p (or --port
4ea0: 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  ) specifies the 
4eb0: 54 43 50 20 70 6f 72 74 20 6e 75 6d 62 65 72 20  TCP port number 
4ec0: 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e  to listen for in
4ed0: 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b  coming HTTP\n");
4ee0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
4ef0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
4f00: 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74           request
4f10: 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75  s on.  The defau
4f20: 6c 74 20 69 73 20 25 75 2e 5c 6e 22 2c 20 28 75  lt is %u.\n", (u
4f30: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 50 4f 52  nsigned int) POR
4f40: 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  T);...fprintf(ou
4f50: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
4f60: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4f70: 20 20 20 20 20 20 2d 74 20 28 6f 72 20 2d 2d 74        -t (or --t
4f80: 68 72 65 61 64 73 29 20 73 70 65 63 69 66 69 65  hreads) specifie
4f90: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
4fa0: 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 74  worker threads t
4fb0: 6f 20 63 72 65 61 74 65 2e 20 45 61 63 68 5c 6e  o create. Each\n
4fc0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
4fd0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
4ff0: 6f 72 6b 65 72 20 74 68 72 65 61 64 20 63 61 6e  orker thread can
5000: 20 73 65 72 76 69 63 65 20 6f 6e 65 20 63 6f 6e   service one con
5010: 63 75 72 72 65 6e 74 20 48 54 54 50 20 73 65 73  current HTTP ses
5020: 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72  sion.\n");...fpr
5030: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 20 20 20 20 20 54 68 75 73 20 74 68 65 20 6e        Thus the n
5060: 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61 64 73  umber of threads
5070: 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 64 65   created will de
5080: 74 65 72 6d 69 6e 65 20 68 6f 77 5c 6e 22 29 3b  termine how\n");
5090: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
50a0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 6e 79              many
50c0: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 74 72   simultaneous tr
50d0: 61 6e 73 66 65 72 73 20 77 69 6c 6c 20 62 65 20  ansfers will be 
50e0: 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 5c 6e 22  possible. The\n"
50f0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5100: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
5120: 66 61 75 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22  fault is %lu.\n"
5130: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
5140: 29 20 54 48 52 45 41 44 5f 43 4f 55 4e 54 29 3b  ) THREAD_COUNT);
5150: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5160: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
5170: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5180: 20 20 20 2d 63 20 28 6f 72 20 2d 2d 63 61 63 68     -c (or --cach
5190: 65 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65  e) specifies the
51a0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 6c 65 20   number of file 
51b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 63 68  information cach
51c0: 65 20 65 6e 74 72 69 65 73 5c 6e 22 29 3b 0a 09  e entries\n");..
51d0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
51e0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
51f0: 20 20 20 20 20 20 20 20 74 6f 20 61 6c 6c 6f 63          to alloc
5200: 61 74 65 2e 20 20 45 61 63 68 20 63 61 63 68 65  ate.  Each cache
5210: 20 65 6e 74 72 79 20 68 6f 6c 64 73 20 66 69 6c   entry holds fil
5220: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73  e information as
5230: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
5240: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
5260: 65 6c 6c 20 61 73 20 61 6e 20 6f 70 65 6e 20 66  ell as an open f
5270: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
5280: 6f 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 20 72  o the file, so r
5290: 65 73 6f 75 72 63 65 5c 6e 22 29 3b 0a 09 09 66  esource\n");...f
52a0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 6c 69 6d 69 74 73 20 28 69 2e        limits (i.
52d0: 65 2e 2c 20 75 6c 69 6d 69 74 29 20 73 68 6f 75  e., ulimit) shou
52e0: 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ld be considered
52f0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 5c 6e  .  This should\n
5300: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
5310: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 20               be 
5330: 61 20 70 72 69 6d 65 20 6e 75 6d 62 65 72 20 66  a prime number f
5340: 6f 72 20 69 64 65 61 6c 20 75 73 65 20 77 69 74  or ideal use wit
5350: 68 20 74 68 65 20 6c 6f 6f 6b 75 70 20 6d 65 74  h the lookup met
5360: 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69  hod.\n");...fpri
5370: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69     The default i
53a0: 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e 73 69  s %lu.\n", (unsi
53b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 48 45  gned long) CACHE
53c0: 5f 53 49 5a 45 29 3b 0a 09 09 66 70 72 69 6e 74  _SIZE);...fprint
53d0: 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b  f(output, "\n");
53e0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
53f0: 74 2c 20 22 20 20 20 20 20 20 2d 6c 20 28 6f 72  t, "      -l (or
5400: 20 2d 2d 6c 6f 67 29 20 73 70 65 63 69 66 69 65   --log) specifie
5410: 73 20 61 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20  s a filename to 
5420: 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
5430: 20 6c 6f 67 20 65 6e 74 72 69 65 73 2e 20 20 4c   log entries.  L
5440: 6f 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  og\n");...fprint
5450: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
5470: 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
5480: 66 6f 72 20 76 61 72 69 6f 75 73 20 73 74 61 67  for various stag
5490: 65 73 20 69 6e 20 74 72 61 6e 73 66 65 72 69 6e  es in transferin
54a0: 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09  g files.\n");...
54b0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
54c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
54d0: 20 20 20 20 20 54 68 65 20 6c 6f 67 20 66 69 6c       The log fil
54e0: 65 20 69 73 20 6f 70 65 6e 65 64 20 62 65 66 6f  e is opened befo
54f0: 72 65 20 73 77 69 74 63 68 69 6e 67 20 75 73 65  re switching use
5500: 72 73 20 28 73 65 65 20 5c 22 2d 75 5c 22 29 5c  rs (see \"-u\")\
5510: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5520: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
5530: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
5540: 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73  root directories
5550: 20 28 73 65 65 20 5c 22 2d 72 5c 22 29 2e 20 20   (see \"-r\").  
5560: 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  The log file is 
5570: 6e 65 76 65 72 5c 6e 22 29 3b 0a 09 09 66 70 72  never\n");...fpr
5580: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 63 6c 6f 73 65 64 20 73 6f 20 6c 6f 67 20    closed so log 
55b0: 72 6f 74 61 74 69 6f 6e 20 77 69 74 68 6f 75 74  rotation without
55c0: 20 73 74 6f 70 70 69 6e 67 20 74 68 65 20 64 61   stopping the da
55d0: 65 6d 6f 6e 20 69 73 20 77 69 6c 6c 5c 6e 22 29  emon is will\n")
55e0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
55f0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
5600: 20 20 20 20 20 20 20 20 20 6e 6f 74 20 77 6f 72           not wor
5610: 6b 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66  k.  The value of
5620: 20 5c 22 2d 5c 22 20 69 6e 64 69 63 61 74 65 73   \"-\" indicates
5630: 20 74 68 61 74 20 73 74 61 6e 64 61 72 64 20 6f   that standard o
5640: 75 74 70 75 74 5c 6e 22 29 3b 0a 09 09 66 70 72  utput\n");...fpr
5650: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64    should be used
5680: 20 66 6f 72 20 6c 6f 67 67 69 6e 67 2e 20 20 54   for logging.  T
5690: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 5c 22  he default is \"
56a0: 25 73 5c 22 2e 5c 6e 22 2c 20 4c 4f 47 5f 46 49  %s\".\n", LOG_FI
56b0: 4c 45 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  LE);...fprintf(o
56c0: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
56d0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
56e0: 22 20 20 20 20 20 20 2d 75 20 28 6f 72 20 2d 2d  "      -u (or --
56f0: 75 73 65 72 29 20 73 70 65 63 69 66 69 65 73 20  user) specifies 
5700: 74 68 65 20 75 73 65 72 20 74 6f 20 73 77 69 74  the user to swit
5710: 63 68 20 75 73 65 72 20 49 44 73 20 74 6f 20 62  ch user IDs to b
5720: 65 66 6f 72 65 20 73 65 72 76 69 63 69 6e 67 5c  efore servicing\
5730: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5740: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71               req
5760: 75 65 73 74 73 2e 20 20 54 68 65 20 64 65 66 61  uests.  The defa
5770: 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ult is not chang
5780: 65 20 75 73 65 72 20 49 44 73 2e 5c 6e 22 29 3b  e user IDs.\n");
5790: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
57a0: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
57b0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
57c0: 20 20 20 2d 72 20 28 6f 72 20 2d 2d 72 6f 6f 74     -r (or --root
57d0: 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  ) specifies the 
57e0: 64 69 72 65 63 74 6f 72 79 20 74 6f 20 61 63 74  directory to act
57f0: 20 61 73 20 74 68 65 20 72 6f 6f 74 20 64 69 72   as the root dir
5800: 65 63 74 6f 72 79 20 66 6f 72 5c 6e 22 29 3b 0a  ectory for\n");.
5810: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5820: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
5830: 20 20 20 20 20 20 20 20 74 68 65 20 66 69 6c 65          the file
5840: 20 73 65 72 76 65 72 2e 20 20 49 66 20 74 68 69   server.  If thi
5850: 73 20 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63  s option is spec
5860: 69 66 69 65 64 2c 20 63 68 72 6f 6f 74 28 32 29  ified, chroot(2)
5870: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
5880: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
58a0: 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 20 64 65   called.  The de
58b0: 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61  fault is not cha
58c0: 6e 67 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f  nge root directo
58d0: 72 69 65 73 2c 5c 6e 22 29 3b 0a 09 09 66 70 72  ries,\n");...fpr
58e0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 74 68 61 74 20 69 73 2c 20 74 68 65 20     that is, the 
5910: 5c 22 2f 5c 22 20 64 69 72 65 63 74 6f 72 79 20  \"/\" directory 
5920: 69 73 20 73 68 61 72 65 64 20 6f 75 74 2e 20 20  is shared out.  
5930: 54 68 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09  This will\n");..
5940: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5950: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5960: 20 20 20 20 20 20 20 6c 69 6b 65 6c 79 20 62 65         likely be
5970: 20 61 20 73 65 63 75 72 69 74 79 20 69 73 73 75   a security issu
5980: 65 2c 20 73 6f 20 74 68 69 73 20 6f 70 74 69 6f  e, so this optio
5990: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 5c  n should always\
59a0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
59b0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 20               be 
59d0: 75 73 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09  used.\n");..}...
59e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64  return;.}../* Ad
59f0: 64 20 61 20 67 65 74 6f 70 74 20 6f 70 74 69 6f  d a getopt optio
5a00: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
5a10: 20 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f   filed_getopt_lo
5a20: 6e 67 5f 73 65 74 6f 70 74 28 73 74 72 75 63 74  ng_setopt(struct
5a30: 20 6f 70 74 69 6f 6e 20 2a 6f 70 74 2c 20 63 6f   option *opt, co
5a40: 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20  nst char *name, 
5a50: 69 6e 74 20 68 61 73 5f 61 72 67 2c 20 69 6e 74  int has_arg, int
5a60: 20 76 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e 6e 61   val) {..opt->na
5a70: 6d 65 20 20 20 20 20 3d 20 6e 61 6d 65 3b 0a 09  me     = name;..
5a80: 6f 70 74 2d 3e 68 61 73 5f 61 72 67 20 20 3d 20  opt->has_arg  = 
5a90: 68 61 73 5f 61 72 67 3b 0a 09 6f 70 74 2d 3e 66  has_arg;..opt->f
5aa0: 6c 61 67 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a  lag     = NULL;.
5ab0: 09 6f 70 74 2d 3e 76 61 6c 20 20 20 20 20 20 3d  .opt->val      =
5ac0: 20 76 61 6c 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a   val;...return;.
5ad0: 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20  }../* Resolve a 
5ae0: 75 73 65 72 6e 61 6d 65 20 74 6f 20 61 20 55 49  username to a UI
5af0: 44 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  D */.static int 
5b00: 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75  filed_user_looku
5b10: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 73  p(const char *us
5b20: 65 72 2c 20 75 69 64 5f 74 20 2a 75 73 65 72 5f  er, uid_t *user_
5b30: 69 64 29 20 7b 0a 09 63 68 61 72 20 2a 6e 65 78  id) {..char *nex
5b40: 74 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 5f 69  t;..uid_t user_i
5b50: 64 5f 63 68 65 63 6b 3b 0a 23 69 66 6e 64 65 66  d_check;.#ifndef
5b60: 20 46 49 4c 45 44 5f 4e 4f 5f 47 45 54 50 57 4e   FILED_NO_GETPWN
5b70: 41 4d 0a 09 73 74 72 75 63 74 20 70 61 73 73 77  AM..struct passw
5b80: 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20 3d 20  d *ent;...ent = 
5b90: 67 65 74 70 77 6e 61 6d 28 75 73 65 72 29 3b 0a  getpwnam(user);.
5ba0: 09 69 66 20 28 65 6e 74 20 21 3d 20 4e 55 4c 4c  .if (ent != NULL
5bb0: 29 20 7b 0a 09 09 2a 75 73 65 72 5f 69 64 20 3d  ) {...*user_id =
5bc0: 20 65 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a 0a 09   ent->pw_uid;...
5bd0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 23  .return(0);..}.#
5be0: 65 6e 64 69 66 0a 0a 09 75 73 65 72 5f 69 64 5f  endif...user_id_
5bf0: 63 68 65 63 6b 20 3d 20 73 74 72 74 6f 75 6c 6c  check = strtoull
5c00: 28 75 73 65 72 2c 20 26 6e 65 78 74 2c 20 31 30  (user, &next, 10
5c10: 29 3b 0a 09 69 66 20 28 6e 65 78 74 20 3d 3d 20  );..if (next == 
5c20: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
5c30: 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e 65  (1);..}...if (ne
5c40: 78 74 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b  xt[0] != '\0') {
5c50: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
5c60: 0a 0a 09 2a 75 73 65 72 5f 69 64 20 3d 20 75 73  ...*user_id = us
5c70: 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a 09 72  er_id_check;...r
5c80: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
5c90: 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73 74 61  Daemonize */.sta
5ca0: 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 64 61  tic int filed_da
5cb0: 65 6d 6f 6e 69 7a 65 28 76 6f 69 64 29 20 7b 0a  emonize(void) {.
5cc0: 09 70 69 64 5f 74 20 73 65 74 73 69 64 5f 72 65  .pid_t setsid_re
5cd0: 74 2c 20 66 6f 72 6b 5f 72 65 74 3b 0a 09 69 6e  t, fork_ret;..in
5ce0: 74 20 63 68 64 69 72 5f 72 65 74 2c 20 64 75 70  t chdir_ret, dup
5cf0: 32 5f 72 65 74 3b 0a 09 69 6e 74 20 66 64 5f 69  2_ret;..int fd_i
5d00: 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a 09 63 68 64  n, fd_out;...chd
5d10: 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72 28 22  ir_ret = chdir("
5d20: 2f 22 29 3b 0a 09 69 66 20 28 63 68 64 69 72 5f  /");..if (chdir_
5d30: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  ret != 0) {...re
5d40: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f  turn(1);..}...fo
5d50: 72 6b 5f 72 65 74 20 3d 20 66 6f 72 6b 28 29 3b  rk_ret = fork();
5d60: 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65 74 20 3c  ..if (fork_ret <
5d70: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31   0) {...return(1
5d80: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 6f 72 6b  );..}...if (fork
5d90: 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 2f 2a  _ret > 0) {.../*
5da0: 20 50 61 72 65 6e 74 20 2a 2f 0a 09 09 77 61 69   Parent */...wai
5db0: 74 70 69 64 28 66 6f 72 6b 5f 72 65 74 2c 20 4e  tpid(fork_ret, N
5dc0: 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09 65 78 69 74  ULL, 0);....exit
5dd0: 28 45 58 49 54 5f 53 55 43 43 45 53 53 29 3b 0a  (EXIT_SUCCESS);.
5de0: 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c 64 20 2a 2f  .}.../* Child */
5df0: 0a 09 69 66 20 28 66 6f 72 6b 28 29 20 21 3d 20  ..if (fork() != 
5e00: 30 29 20 7b 0a 09 09 2f 2a 20 43 68 69 6c 64 20  0) {.../* Child 
5e10: 2a 2f 0a 09 09 65 78 69 74 28 45 58 49 54 5f 53  */...exit(EXIT_S
5e20: 55 43 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a  UCCESS);..}.../*
5e30: 20 47 72 61 6e 64 20 63 68 69 6c 64 20 2a 2f 0a   Grand child */.
5e40: 09 73 65 74 73 69 64 5f 72 65 74 20 3d 20 73 65  .setsid_ret = se
5e50: 74 73 69 64 28 29 3b 0a 09 69 66 20 28 73 65 74  tsid();..if (set
5e60: 73 69 64 5f 72 65 74 20 3d 3d 20 28 28 70 69 64  sid_ret == ((pid
5e70: 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09 72 65 74  _t) -1)) {...ret
5e80: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 64 5f  urn(1);..}...fd_
5e90: 69 6e 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f  in = open("/dev/
5ea0: 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29  null", O_RDONLY)
5eb0: 3b 0a 09 66 64 5f 6f 75 74 20 3d 20 6f 70 65 6e  ;..fd_out = open
5ec0: 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f  ("/dev/null", O_
5ed0: 57 52 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 66 64  WRONLY);..if (fd
5ee0: 5f 69 6e 20 3c 20 30 20 7c 7c 20 66 64 5f 6f 75  _in < 0 || fd_ou
5ef0: 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72  t < 0) {...retur
5f00: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f  n(1);..}...dup2_
5f10: 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f 69 6e  ret = dup2(fd_in
5f20: 2c 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 3b  , STDIN_FILENO);
5f30: 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74 20 21  ..if (dup2_ret !
5f40: 3d 20 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 20  = STDIN_FILENO) 
5f50: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
5f60: 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64  }...dup2_ret = d
5f70: 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 4f  up2(fd_out, STDO
5f80: 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20  UT_FILENO);..if 
5f90: 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44  (dup2_ret != STD
5fa0: 4f 55 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09  OUT_FILENO) {...
5fb0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
5fc0: 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28  dup2_ret = dup2(
5fd0: 66 64 5f 6f 75 74 2c 20 53 54 44 45 52 52 5f 46  fd_out, STDERR_F
5fe0: 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70  ILENO);..if (dup
5ff0: 32 5f 72 65 74 20 21 3d 20 53 54 44 45 52 52 5f  2_ret != STDERR_
6000: 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75  FILENO) {...retu
6010: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c 6f 73  rn(1);..}...clos
6020: 65 28 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f 73 65  e(fd_in);..close
6030: 28 66 64 5f 6f 75 74 29 3b 0a 0a 09 72 65 74 75  (fd_out);...retu
6040: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e  rn(0);.}../* Run
6050: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 69 6e 74 20   process */.int 
6060: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
6070: 68 61 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 73  har **argv) {..s
6080: 74 72 75 63 74 20 6f 70 74 69 6f 6e 20 6f 70 74  truct option opt
6090: 69 6f 6e 73 5b 31 30 5d 3b 0a 09 63 6f 6e 73 74  ions[10];..const
60a0: 20 63 68 61 72 20 2a 62 69 6e 64 5f 61 64 64 72   char *bind_addr
60b0: 20 3d 20 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e   = BIND_ADDR, *n
60c0: 65 77 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a  ewroot = NULL, *
60d0: 6c 6f 67 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46  log_file = LOG_F
60e0: 49 4c 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f  ILE;..FILE *log_
60f0: 66 70 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 20  fp;..uid_t user 
6100: 3d 20 30 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d  = 0;..int port =
6110: 20 50 4f 52 54 2c 20 74 68 72 65 61 64 5f 63 6f   PORT, thread_co
6120: 75 6e 74 20 3d 20 54 48 52 45 41 44 5f 43 4f 55  unt = THREAD_COU
6130: 4e 54 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 73  NT;..int cache_s
6140: 69 7a 65 20 3d 20 43 41 43 48 45 5f 53 49 5a 45  ize = CACHE_SIZE
6150: 3b 0a 09 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c  ;..int init_ret,
6160: 20 63 68 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74   chroot_ret, set
6170: 75 69 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f  uid_ret, lookup_
6180: 72 65 74 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a  ret, chdir_ret;.
6190: 09 69 6e 74 20 73 65 74 75 69 64 5f 65 6e 61 62  .int setuid_enab
61a0: 6c 65 64 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f  led = 0, daemon_
61b0: 65 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e  enabled = 0;..in
61c0: 74 20 63 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a  t ch;..int fd;..
61d0: 09 2f 2a 20 50 72 6f 63 65 73 73 20 61 72 67 75  ./* Process argu
61e0: 6d 65 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f  ments */..filed_
61f0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
6200: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20  pt(&options[0], 
6210: 22 70 6f 72 74 22 2c 20 72 65 71 75 69 72 65 64  "port", required
6220: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b  _argument, 'p');
6230: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
6240: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
6250: 6f 6e 73 5b 31 5d 2c 20 22 74 68 72 65 61 64 73  ons[1], "threads
6260: 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75  ", required_argu
6270: 6d 65 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c  ment, 't');..fil
6280: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
6290: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32  etopt(&options[2
62a0: 5d 2c 20 22 63 61 63 68 65 22 2c 20 72 65 71 75  ], "cache", requ
62b0: 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27  ired_argument, '
62c0: 63 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  c');..filed_geto
62d0: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
62e0: 6f 70 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e  options[3], "bin
62f0: 64 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67  d", required_arg
6300: 75 6d 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69  ument, 'b');..fi
6310: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
6320: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
6330: 34 5d 2c 20 22 75 73 65 72 22 2c 20 72 65 71 75  4], "user", requ
6340: 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27  ired_argument, '
6350: 75 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  u');..filed_geto
6360: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
6370: 6f 70 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f  options[5], "roo
6380: 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67  t", required_arg
6390: 75 6d 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69  ument, 'r');..fi
63a0: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
63b0: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
63c0: 36 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61  6], "help", no_a
63d0: 72 67 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09  rgument, 'h');..
63e0: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
63f0: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
6400: 73 5b 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20  s[7], "daemon", 
6410: 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64 27  no_argument, 'd'
6420: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
6430: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
6440: 74 69 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c  tions[8], "log",
6450: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
6460: 6e 74 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64  nt, 'l');..filed
6470: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
6480: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c  opt(&options[9],
6490: 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 09 77   NULL, 0, 0);..w
64a0: 68 69 6c 65 20 28 28 63 68 20 3d 20 67 65 74 6f  hile ((ch = geto
64b0: 70 74 5f 6c 6f 6e 67 28 61 72 67 63 2c 20 61 72  pt_long(argc, ar
64c0: 67 76 2c 20 22 70 3a 74 3a 63 3a 62 3a 75 3a 72  gv, "p:t:c:b:u:r
64d0: 3a 6c 3a 68 64 22 2c 20 6f 70 74 69 6f 6e 73 2c  :l:hd", options,
64e0: 20 4e 55 4c 4c 29 29 20 21 3d 20 2d 31 29 20 7b   NULL)) != -1) {
64f0: 0a 09 09 73 77 69 74 63 68 28 63 68 29 20 7b 0a  ...switch(ch) {.
6500: 09 09 09 63 61 73 65 20 27 70 27 3a 0a 09 09 09  ...case 'p':....
6510: 09 70 6f 72 74 20 3d 20 61 74 6f 69 28 6f 70 74  .port = atoi(opt
6520: 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  arg);.....break;
6530: 0a 09 09 09 63 61 73 65 20 27 74 27 3a 0a 09 09  ....case 't':...
6540: 09 09 74 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d  ..thread_count =
6550: 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09   atoi(optarg);..
6560: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
6570: 65 20 27 63 27 3a 0a 09 09 09 09 63 61 63 68 65  e 'c':.....cache
6580: 5f 73 69 7a 65 20 3d 20 61 74 6f 69 28 6f 70 74  _size = atoi(opt
6590: 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  arg);.....break;
65a0: 0a 09 09 09 63 61 73 65 20 27 62 27 3a 0a 09 09  ....case 'b':...
65b0: 09 09 62 69 6e 64 5f 61 64 64 72 20 3d 20 73 74  ..bind_addr = st
65c0: 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09  rdup(optarg);...
65d0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
65e0: 20 27 75 27 3a 0a 09 09 09 09 73 65 74 75 69 64   'u':.....setuid
65f0: 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09  _enabled = 1;...
6600: 09 09 6c 6f 6f 6b 75 70 5f 72 65 74 20 3d 20 66  ..lookup_ret = f
6610: 69 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70  iled_user_lookup
6620: 28 6f 70 74 61 72 67 2c 20 26 75 73 65 72 29 3b  (optarg, &user);
6630: 0a 09 09 09 09 69 66 20 28 6c 6f 6f 6b 75 70 5f  .....if (lookup_
6640: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  ret != 0) {.....
6650: 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c  .filed_print_hel
6660: 70 28 73 74 64 65 72 72 2c 20 30 2c 20 22 49 6e  p(stderr, 0, "In
6670: 76 61 6c 69 64 20 75 73 65 72 6e 61 6d 65 20 73  valid username s
6680: 70 65 63 69 66 69 65 64 22 29 3b 0a 0a 09 09 09  pecified");.....
6690: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09  ..return(1);....
66a0: 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
66b0: 09 63 61 73 65 20 27 72 27 3a 0a 09 09 09 09 6e  .case 'r':.....n
66c0: 65 77 72 6f 6f 74 20 3d 20 73 74 72 64 75 70 28  ewroot = strdup(
66d0: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
66e0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 6c 27 3a  ak;....case 'l':
66f0: 0a 09 09 09 09 6c 6f 67 5f 66 69 6c 65 20 3d 20  .....log_file = 
6700: 73 74 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a  strdup(optarg);.
6710: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
6720: 73 65 20 27 64 27 3a 0a 09 09 09 09 64 61 65 6d  se 'd':.....daem
6730: 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  on_enabled = 1;.
6740: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
6750: 73 65 20 27 3f 27 3a 0a 09 09 09 63 61 73 65 20  se '?':....case 
6760: 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70  ':':.....filed_p
6770: 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65 72 72  rint_help(stderr
6780: 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09  , 0, NULL);.....
6790: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 63  .return(1);....c
67a0: 61 73 65 20 27 68 27 3a 0a 09 09 09 09 66 69 6c  ase 'h':.....fil
67b0: 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74  ed_print_help(st
67c0: 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c 29 3b 0a  dout, 1, NULL);.
67d0: 0a 09 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  .....return(0);.
67e0: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70 65 6e  ..}..}.../* Open
67f0: 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09 69 66   log file */..if
6800: 20 28 73 74 72 63 6d 70 28 6c 6f 67 5f 66 69 6c   (strcmp(log_fil
6810: 65 2c 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b 0a  e, "-") == 0) {.
6820: 09 09 6c 6f 67 5f 66 70 20 3d 20 73 74 64 6f 75  ..log_fp = stdou
6830: 74 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6c  t;..} else {...l
6840: 6f 67 5f 66 70 20 3d 20 66 6f 70 65 6e 28 6c 6f  og_fp = fopen(lo
6850: 67 5f 66 69 6c 65 2c 20 22 61 2b 22 29 3b 0a 09  g_file, "a+");..
6860: 09 69 66 20 28 6c 6f 67 5f 66 70 20 3d 3d 20 4e  .if (log_fp == N
6870: 55 4c 4c 29 20 7b 0a 09 09 09 70 65 72 72 6f 72  ULL) {....perror
6880: 28 22 66 6f 70 65 6e 22 29 3b 0a 0a 09 09 09 72  ("fopen");.....r
6890: 65 74 75 72 6e 28 34 29 3b 0a 09 09 7d 0a 09 7d  eturn(4);...}..}
68a0: 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c 69 73  .../* Create lis
68b0: 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 20 2a 2f  tening socket */
68c0: 0a 09 66 64 20 3d 20 66 69 6c 65 64 5f 6c 69 73  ..fd = filed_lis
68d0: 74 65 6e 28 62 69 6e 64 5f 61 64 64 72 2c 20 70  ten(bind_addr, p
68e0: 6f 72 74 29 3b 0a 09 69 66 20 28 66 64 20 3c 20  ort);..if (fd < 
68f0: 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22 66  0) {...perror("f
6900: 69 6c 65 64 5f 6c 69 73 74 65 6e 22 29 3b 0a 0a  iled_listen");..
6910: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
6920: 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66 20  ../* Chroot, if 
6930: 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09  appropriate */..
6940: 69 66 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a 09  if (newroot) {..
6950: 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64  .chdir_ret = chd
6960: 69 72 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09 69  ir(newroot);...i
6970: 66 20 28 63 68 64 69 72 5f 72 65 74 20 21 3d 20  f (chdir_ret != 
6980: 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  0) {....perror("
6990: 63 68 64 69 72 22 29 3b 0a 0a 09 09 09 72 65 74  chdir");.....ret
69a0: 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 63  urn(1);...}....c
69b0: 68 72 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72 6f  hroot_ret = chro
69c0: 6f 74 28 22 2e 22 29 3b 0a 09 09 69 66 20 28 63  ot(".");...if (c
69d0: 68 72 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29 20  hroot_ret != 0) 
69e0: 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68 72  {....perror("chr
69f0: 6f 6f 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  oot");.....retur
6a00: 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(1);...}..}.../
6a10: 2a 20 44 72 6f 70 20 70 72 69 76 69 6c 65 67 65  * Drop privilege
6a20: 73 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  s, if appropriat
6a30: 65 20 2a 2f 0a 09 69 66 20 28 73 65 74 75 69 64  e */..if (setuid
6a40: 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73 65  _enabled) {...se
6a50: 74 75 69 64 5f 72 65 74 20 3d 20 73 65 74 75 69  tuid_ret = setui
6a60: 64 28 75 73 65 72 29 3b 0a 09 09 69 66 20 28 73  d(user);...if (s
6a70: 65 74 75 69 64 5f 72 65 74 20 21 3d 20 30 29 20  etuid_ret != 0) 
6a80: 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 73 65 74  {....perror("set
6a90: 75 69 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uid");.....retur
6aa0: 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(1);...}..}.../
6ab0: 2a 20 42 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f  * Become a daemo
6ac0: 6e 20 2a 2f 0a 09 69 66 20 28 64 61 65 6d 6f 6e  n */..if (daemon
6ad0: 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 66 69  _enabled) {...fi
6ae0: 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 29 3b  led_daemonize();
6af0: 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c  ..}.../* Initial
6b00: 69 7a 65 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74  ize */..init_ret
6b10: 20 3d 20 66 69 6c 65 64 5f 69 6e 69 74 28 63 61   = filed_init(ca
6b20: 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28  che_size);..if (
6b30: 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b  init_ret != 0) {
6b40: 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64  ...perror("filed
6b50: 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75  _init");....retu
6b60: 72 6e 28 33 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  rn(3);..}.../* C
6b70: 72 65 61 74 65 20 6c 6f 67 67 69 6e 67 20 74 68  reate logging th
6b80: 72 65 61 64 20 2a 2f 0a 09 69 6e 69 74 5f 72 65  read */..init_re
6b90: 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  t = filed_loggin
6ba0: 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 6c 6f  g_thread_init(lo
6bb0: 67 5f 66 70 29 3b 0a 09 69 66 20 28 69 6e 69 74  g_fp);..if (init
6bc0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70  _ret != 0) {...p
6bd0: 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67  error("filed_log
6be0: 67 69 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74  ging_thread_init
6bf0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29  ");....return(4)
6c00: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65  ;..}.../* Create
6c10: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20   worker threads 
6c20: 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66  */..init_ret = f
6c30: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
6c40: 61 64 73 5f 69 6e 69 74 28 66 64 2c 20 74 68 72  ads_init(fd, thr
6c50: 65 61 64 5f 63 6f 75 6e 74 29 3b 0a 09 69 66 20  ead_count);..if 
6c60: 28 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  (init_ret != 0) 
6c70: 7b 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65  {...perror("file
6c80: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73  d_worker_threads
6c90: 5f 69 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75  _init");....retu
6ca0: 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 57  rn(4);..}.../* W
6cb0: 61 69 74 20 66 6f 72 20 74 68 72 65 61 64 73 20  ait for threads 
6cc0: 74 6f 20 65 78 69 74 20 2a 2f 0a 09 2f 2a 20 58  to exit */../* X
6cd0: 58 58 3a 54 4f 44 4f 3a 20 4d 6f 6e 69 74 6f 72  XX:TODO: Monitor
6ce0: 20 74 68 72 65 61 64 20 75 73 61 67 65 20 2a 2f   thread usage */
6cf0: 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09  ..while (1) {...
6d00: 73 6c 65 65 70 28 36 30 29 3b 0a 09 7d 0a 0a 09  sleep(60);..}...
6d10: 2f 2a 20 52 65 74 75 72 6e 20 69 6e 20 66 61 69  /* Return in fai
6d20: 6c 75 72 65 20 2a 2f 0a 09 72 65 74 75 72 6e 28  lure */..return(
6d30: 32 29 3b 0a 7d 0a                                2);.}.