Hex Artifact Content

Artifact c536c43e8507a25a23f14ea3c56399de7484948c:


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 2f 2f 23 64 65 66 69 6e  sage */.//#defin
0ed0: 65 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47  e FILED_DONT_LOG
0ee0: 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f  .#ifdef FILED_DO
0ef0: 4e 54 5f 4c 4f 47 0a 23 20 20 64 65 66 69 6e 65  NT_LOG.#  define
0f00: 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74   filed_logging_t
0f10: 68 72 65 61 64 5f 69 6e 69 74 28 29 20 30 0a 23  hread_init() 0.#
0f20: 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c    define filed_l
0f30: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20  og_msg_debug(x, 
0f40: 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66  ...) /**/.#  def
0f50: 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ine filed_log_ms
0f60: 67 28 78 29 20 2f 2a 2a 2f 0a 23 65 6c 73 65 0a  g(x) /**/.#else.
0f70: 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44 45 42  #ifdef FILED_DEB
0f80: 55 47 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c  UG.#  define fil
0f90: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
0fa0: 28 78 2c 20 2e 2e 2e 29 20 7b 20 66 70 72 69 6e  (x, ...) { fprin
0fb0: 74 66 28 73 74 64 65 72 72 2c 20 78 2c 20 5f 5f  tf(stderr, x, __
0fc0: 56 41 5f 41 52 47 53 5f 5f 29 3b 20 66 70 72 69  VA_ARGS__); fpri
0fd0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
0fe0: 29 3b 20 66 66 6c 75 73 68 28 73 74 64 65 72 72  ); fflush(stderr
0ff0: 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65  ); }.#else.#  de
1000: 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d  fine filed_log_m
1010: 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29  sg_debug(x, ...)
1020: 20 2f 2a 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a   /**/.#endif../*
1030: 20 49 6e 69 74 69 61 6c 69 7a 65 20 6c 6f 67 67   Initialize logg
1040: 69 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a 73 74  ing thread */.st
1050: 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64  atic void *filed
1060: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 28  _logging_thread(
1070: 76 6f 69 64 20 2a 61 72 67 5f 70 29 20 7b 0a 09  void *arg_p) {..
1080: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
1090: 67 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73  ging_thread_args
10a0: 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66   *arg;..struct f
10b0: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a  iled_log_entry *
10c0: 63 75 72 72 2c 20 2a 70 72 65 76 3b 0a 09 46 49  curr, *prev;..FI
10d0: 4c 45 20 2a 66 70 3b 0a 0a 09 61 72 67 20 3d 20  LE *fp;...arg = 
10e0: 61 72 67 5f 70 3b 0a 0a 09 66 70 20 3d 20 61 72  arg_p;...fp = ar
10f0: 67 2d 3e 66 70 3b 0a 0a 09 77 68 69 6c 65 20 28  g->fp;...while (
1100: 31 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  1) {...pthread_m
1110: 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64  utex_lock(&filed
1120: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75  _log_msg_list_mu
1130: 74 65 78 29 3b 0a 09 09 70 74 68 72 65 61 64 5f  tex);...pthread_
1140: 63 6f 6e 64 5f 77 61 69 74 28 26 66 69 6c 65 64  cond_wait(&filed
1150: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65  _log_msg_list_re
1160: 61 64 79 2c 20 26 66 69 6c 65 64 5f 6c 6f 67 5f  ady, &filed_log_
1170: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
1180: 0a 0a 09 09 63 75 72 72 20 3d 20 66 69 6c 65 64  ....curr = filed
1190: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a 09  _log_msg_list;..
11a0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  .filed_log_msg_l
11b0: 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 70  ist = NULL;....p
11c0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
11d0: 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d  ock(&filed_log_m
11e0: 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b 0a  sg_list_mutex);.
11f0: 0a 09 09 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a  ...prev = NULL;.
1200: 09 09 66 6f 72 20 28 3b 20 63 75 72 72 3b 20 63  ..for (; curr; c
1210: 75 72 72 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78  urr = curr->_nex
1220: 74 29 20 7b 0a 09 09 09 63 75 72 72 2d 3e 5f 70  t) {....curr->_p
1230: 72 65 76 20 3d 20 70 72 65 76 3b 0a 0a 09 09 09  rev = prev;.....
1240: 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 09 09 7d  prev = curr;...}
1250: 0a 0a 09 09 63 75 72 72 20 3d 20 70 72 65 76 3b  ....curr = prev;
1260: 0a 09 09 77 68 69 6c 65 20 28 63 75 72 72 29 20  ...while (curr) 
1270: 7b 0a 09 09 09 66 70 72 69 6e 74 66 28 66 70 2c  {....fprintf(fp,
1280: 20 22 25 73 20 54 48 52 45 41 44 3d 25 6c 6c 75   "%s THREAD=%llu
1290: 5c 6e 22 2c 20 63 75 72 72 2d 3e 62 75 66 66 65  \n", curr->buffe
12a0: 72 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  r, (unsigned lon
12b0: 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 74 68  g long) curr->th
12c0: 72 65 61 64 29 3b 0a 0a 09 09 09 70 72 65 76 20  read);.....prev 
12d0: 3d 20 63 75 72 72 3b 0a 09 09 09 63 75 72 72 20  = curr;....curr 
12e0: 3d 20 63 75 72 72 2d 3e 5f 70 72 65 76 3b 0a 0a  = curr->_prev;..
12f0: 09 09 09 66 72 65 65 28 70 72 65 76 29 3b 0a 09  ...free(prev);..
1300: 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 4e  .}..}...return(N
1310: 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ULL);.}..static 
1320: 69 6e 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  int filed_loggin
1330: 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 63 6f  g_thread_init(co
1340: 6e 73 74 20 63 68 61 72 20 2a 6c 6f 67 66 69 6c  nst char *logfil
1350: 65 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c  e) {..struct fil
1360: 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61  ed_logging_threa
1370: 64 5f 61 72 67 73 20 2a 61 72 67 73 3b 0a 09 70  d_args *args;..p
1380: 74 68 72 65 61 64 5f 74 20 74 68 72 65 61 64 5f  thread_t thread_
1390: 69 64 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 66 70  id;..FILE *logfp
13a0: 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 6c  ;...if (strcmp(l
13b0: 6f 67 66 69 6c 65 2c 20 22 2d 22 29 20 3d 3d 20  ogfile, "-") == 
13c0: 30 29 20 7b 0a 09 09 6c 6f 67 66 70 20 3d 20 73  0) {...logfp = s
13d0: 74 64 6f 75 74 3b 0a 09 7d 20 65 6c 73 65 20 7b  tdout;..} else {
13e0: 0a 09 09 6c 6f 67 66 70 20 3d 20 66 6f 70 65 6e  ...logfp = fopen
13f0: 28 6c 6f 67 66 69 6c 65 2c 20 22 61 2b 22 29 3b  (logfile, "a+");
1400: 0a 09 09 69 66 20 28 6c 6f 67 66 70 20 3d 3d 20  ...if (logfp == 
1410: 4e 55 4c 4c 29 20 7b 0a 09 09 09 72 65 74 75 72  NULL) {....retur
1420: 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 61  n(1);...}..}...a
1430: 72 67 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rgs = malloc(siz
1440: 65 6f 66 28 2a 61 72 67 73 29 29 3b 0a 09 61 72  eof(*args));..ar
1450: 67 73 2d 3e 66 70 20 3d 20 6c 6f 67 66 70 3b 0a  gs->fp = logfp;.
1460: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
1470: 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 70  list = NULL;...p
1480: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
1490: 74 28 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  t(&filed_log_msg
14a0: 5f 6c 69 73 74 5f 6d 75 74 65 78 2c 20 4e 55 4c  _list_mutex, NUL
14b0: 4c 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 72  L);...pthread_cr
14c0: 65 61 74 65 28 26 74 68 72 65 61 64 5f 69 64 2c  eate(&thread_id,
14d0: 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f 67   NULL, filed_log
14e0: 67 69 6e 67 5f 74 68 72 65 61 64 2c 20 61 72 67  ging_thread, arg
14f0: 73 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  s);...return(0);
1500: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1510: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 63 6f  filed_log_msg(co
1520: 6e 73 74 20 63 68 61 72 20 2a 66 6d 74 2c 20 2e  nst char *fmt, .
1530: 2e 2e 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69  ..) {..struct fi
1540: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 65  led_log_entry *e
1550: 6e 74 72 79 3b 0a 09 76 61 5f 6c 69 73 74 20 61  ntry;..va_list a
1560: 72 67 73 3b 0a 0a 09 65 6e 74 72 79 20 3d 20 6d  rgs;...entry = m
1570: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 65 6e  alloc(sizeof(*en
1580: 74 72 79 29 29 3b 0a 0a 09 76 61 5f 73 74 61 72  try));...va_star
1590: 74 28 61 72 67 73 2c 20 66 6d 74 29 3b 0a 0a 09  t(args, fmt);...
15a0: 76 73 6e 70 72 69 6e 74 66 28 65 6e 74 72 79 2d  vsnprintf(entry-
15b0: 3e 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28  >buffer, sizeof(
15c0: 65 6e 74 72 79 2d 3e 62 75 66 66 65 72 29 2c 20  entry->buffer), 
15d0: 66 6d 74 2c 20 61 72 67 73 29 3b 0a 0a 09 76 61  fmt, args);...va
15e0: 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a 09 65 6e  _end(args);...en
15f0: 74 72 79 2d 3e 74 68 72 65 61 64 20 3d 20 70 74  try->thread = pt
1600: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 09 65  hread_self();..e
1610: 6e 74 72 79 2d 3e 6c 65 76 65 6c 20 3d 20 30 3b  ntry->level = 0;
1620: 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
1630: 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67  _lock(&filed_log
1640: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
1650: 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f 6e 65 78 74  ;...entry->_next
1660: 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67   = filed_log_msg
1670: 5f 6c 69 73 74 3b 0a 09 66 69 6c 65 64 5f 6c 6f  _list;..filed_lo
1680: 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 65 6e 74  g_msg_list = ent
1690: 72 79 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75  ry;...pthread_mu
16a0: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c 65  tex_unlock(&file
16b0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
16c0: 75 74 65 78 29 3b 0a 0a 09 70 74 68 72 65 61 64  utex);...pthread
16d0: 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26 66 69  _cond_signal(&fi
16e0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
16f0: 5f 72 65 61 64 79 29 3b 0a 0a 09 72 65 74 75 72  _ready);...retur
1700: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  n;.}.#endif../* 
1710: 46 6f 72 6d 61 74 20 74 69 6d 65 20 70 65 72 20  Format time per 
1720: 52 46 43 32 36 31 36 20 2a 2f 0a 73 74 61 74 69  RFC2616 */.stati
1730: 63 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 66 6f  c char *filed_fo
1740: 72 6d 61 74 5f 74 69 6d 65 28 63 68 61 72 20 2a  rmat_time(char *
1750: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62  buffer, size_t b
1760: 75 66 66 65 72 5f 6c 65 6e 2c 20 63 6f 6e 73 74  uffer_len, const
1770: 20 74 69 6d 65 5f 74 20 74 69 6d 65 69 6e 66 6f   time_t timeinfo
1780: 29 20 7b 0a 09 73 74 72 75 63 74 20 74 6d 20 74  ) {..struct tm t
1790: 69 6d 65 69 6e 66 6f 5f 74 6d 2c 20 2a 74 69 6d  imeinfo_tm, *tim
17a0: 65 69 6e 66 6f 5f 74 6d 5f 70 3b 0a 0a 09 74 69  einfo_tm_p;...ti
17b0: 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 20 67 6d  meinfo_tm_p = gm
17c0: 74 69 6d 65 5f 72 28 26 74 69 6d 65 69 6e 66 6f  time_r(&timeinfo
17d0: 2c 20 26 74 69 6d 65 69 6e 66 6f 5f 74 6d 29 3b  , &timeinfo_tm);
17e0: 0a 09 69 66 20 28 74 69 6d 65 69 6e 66 6f 5f 74  ..if (timeinfo_t
17f0: 6d 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  m_p == NULL) {..
1800: 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f 77 6e  .return("unknown
1810: 22 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5b  ");..}...buffer[
1820: 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31 5d 20  buffer_len - 1] 
1830: 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72 5f  = '\0';..buffer_
1840: 6c 65 6e 20 3d 20 73 74 72 66 74 69 6d 65 28 62  len = strftime(b
1850: 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c 65  uffer, buffer_le
1860: 6e 20 2d 20 31 2c 20 22 25 61 2c 20 25 64 20 25  n - 1, "%a, %d %
1870: 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 47 4d  b %Y %H:%M:%S GM
1880: 54 22 2c 20 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f  T", timeinfo_tm_
1890: 70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66  p);...return(buf
18a0: 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 68 61 73 68  fer);.}../* hash
18b0: 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67   */.static unsig
18c0: 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f 68 61  ned int filed_ha
18d0: 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  sh(const unsigne
18e0: 64 20 63 68 61 72 20 2a 76 61 6c 75 65 2c 20 75  d char *value, u
18f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 6f 64 75  nsigned int modu
1900: 6c 75 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  lus) {..unsigned
1910: 20 63 68 61 72 20 63 75 72 72 2c 20 70 72 65 76   char curr, prev
1920: 3b 0a 09 69 6e 74 20 64 69 66 66 3b 0a 09 75 6e  ;..int diff;..un
1930: 73 69 67 6e 65 64 20 69 6e 74 20 72 65 74 76 61  signed int retva
1940: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 6f  l;...retval = mo
1950: 64 75 6c 75 73 20 2d 20 31 3b 0a 09 70 72 65 76  dulus - 1;..prev
1960: 20 3d 20 6d 6f 64 75 6c 75 73 20 25 20 32 35 35   = modulus % 255
1970: 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 75 72 72  ;...while ((curr
1980: 20 3d 20 2a 76 61 6c 75 65 29 29 20 7b 0a 09 09   = *value)) {...
1990: 69 66 20 28 63 75 72 72 20 3c 20 33 32 29 20 7b  if (curr < 32) {
19a0: 0a 09 09 09 63 75 72 72 20 3d 20 32 35 35 20 2d  ....curr = 255 -
19b0: 20 63 75 72 72 3b 0a 09 09 7d 20 65 6c 73 65 20   curr;...} else 
19c0: 7b 0a 09 09 09 63 75 72 72 20 2d 3d 20 33 32 3b  {....curr -= 32;
19d0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 72 65 76  ...}....if (prev
19e0: 20 3c 20 63 75 72 72 29 20 7b 0a 09 09 09 64 69   < curr) {....di
19f0: 66 66 20 3d 20 63 75 72 72 20 2d 20 70 72 65 76  ff = curr - prev
1a00: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1a10: 64 69 66 66 20 3d 20 70 72 65 76 20 2d 20 63 75  diff = prev - cu
1a20: 72 72 3b 0a 09 09 7d 0a 0a 09 09 70 72 65 76 20  rr;...}....prev 
1a30: 3d 20 63 75 72 72 3b 0a 0a 09 09 72 65 74 76 61  = curr;....retva
1a40: 6c 20 3c 3c 3d 20 33 3b 0a 09 09 72 65 74 76 61  l <<= 3;...retva
1a50: 6c 20 26 3d 20 30 78 46 46 46 46 46 46 46 46 4c  l &= 0xFFFFFFFFL
1a60: 55 3b 0a 09 09 72 65 74 76 61 6c 20 5e 3d 20 64  U;...retval ^= d
1a70: 69 66 66 3b 0a 0a 09 09 76 61 6c 75 65 2b 2b 3b  iff;....value++;
1a80: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72  ..}...retval = r
1a90: 65 74 76 61 6c 20 25 20 6d 6f 64 75 6c 75 73 3b  etval % modulus;
1aa0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
1ab0: 29 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 20  );.}../* Find a 
1ac0: 6d 69 6d 65 2d 74 79 70 65 20 62 61 73 65 64 20  mime-type based 
1ad0: 6f 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  on the filename 
1ae0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1af0: 63 68 61 72 20 2a 66 69 6c 65 64 5f 64 65 74 65  char *filed_dete
1b00: 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28 63  rmine_mimetype(c
1b10: 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
1b20: 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a   {..const char *
1b30: 70 3b 0a 0a 09 70 20 3d 20 73 74 72 72 63 68 72  p;...p = strrchr
1b40: 28 70 61 74 68 2c 20 27 2e 27 29 3b 0a 09 69 66  (path, '.');..if
1b50: 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09   (p == NULL) {..
1b60: 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44 45  .return(FILED_DE
1b70: 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d 0a  FAULT_TYPE);..}.
1b80: 0a 09 70 2b 2b 3b 0a 09 69 66 20 28 2a 70 20 3d  ..p++;..if (*p =
1b90: 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74 75  = '\0') {...retu
1ba0: 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54  rn(FILED_DEFAULT
1bb0: 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 66 69 6c  _TYPE);..}...fil
1bc0: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
1bd0: 28 22 4c 6f 6f 6b 69 6e 67 20 75 70 20 4d 49 4d  ("Looking up MIM
1be0: 45 20 74 79 70 65 20 66 6f 72 20 25 73 20 28 68  E type for %s (h
1bf0: 61 73 68 20 3d 20 25 6c 6c 75 29 22 2c 20 70 2c  ash = %llu)", p,
1c00: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
1c10: 6c 6f 6e 67 29 20 66 69 6c 65 64 5f 68 61 73 68  long) filed_hash
1c20: 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ((const unsigned
1c30: 20 63 68 61 72 20 2a 29 20 70 2c 20 31 36 37 37   char *) p, 1677
1c40: 37 32 35 39 29 29 3b 0a 0a 23 69 6e 63 6c 75 64  7259));..#includ
1c50: 65 20 22 66 69 6c 65 64 2d 6d 69 6d 65 2d 74 79  e "filed-mime-ty
1c60: 70 65 73 2e 68 22 0a 0a 09 72 65 74 75 72 6e 28  pes.h"...return(
1c70: 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59  FILED_DEFAULT_TY
1c80: 50 45 29 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20  PE);.}../* Open 
1c90: 61 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72  a file and retur
1ca0: 6e 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  n file informati
1cb0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  on */.static str
1cc0: 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  uct filed_filein
1cd0: 66 6f 20 2a 66 69 6c 65 64 5f 6f 70 65 6e 5f 66  fo *filed_open_f
1ce0: 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
1cf0: 70 61 74 68 2c 20 73 74 72 75 63 74 20 66 69 6c  path, struct fil
1d00: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 62 75 66  ed_fileinfo *buf
1d10: 66 65 72 29 20 7b 0a 09 73 74 72 75 63 74 20 66  fer) {..struct f
1d20: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 63  iled_fileinfo *c
1d30: 61 63 68 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ache;..unsigned 
1d40: 69 6e 74 20 63 61 63 68 65 5f 69 64 78 3b 0a 09  int cache_idx;..
1d50: 6f 66 66 5f 74 20 6c 65 6e 3b 0a 09 69 6e 74 20  off_t len;..int 
1d60: 66 64 3b 0a 0a 09 63 61 63 68 65 5f 69 64 78 20  fd;...cache_idx 
1d70: 3d 20 66 69 6c 65 64 5f 68 61 73 68 28 28 63 6f  = filed_hash((co
1d80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1d90: 72 20 2a 29 20 70 61 74 68 2c 20 66 69 6c 65 64  r *) path, filed
1da0: 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68  _fileinfo_fdcach
1db0: 65 5f 73 69 7a 65 29 3b 0a 0a 09 63 61 63 68 65  e_size);...cache
1dc0: 20 3d 20 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e   = &filed_filein
1dd0: 66 6f 5f 66 64 63 61 63 68 65 5b 63 61 63 68 65  fo_fdcache[cache
1de0: 5f 69 64 78 5d 3b 0a 0a 09 66 69 6c 65 64 5f 6c  _idx];...filed_l
1df0: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 4c 6f  og_msg_debug("Lo
1e00: 63 6b 69 6e 67 20 6d 75 74 65 78 20 66 6f 72 20  cking mutex for 
1e10: 69 64 78 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69  idx: %lu", (unsi
1e20: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65  gned long) cache
1e30: 5f 69 64 78 29 3b 0a 0a 09 70 74 68 72 65 61 64  _idx);...pthread
1e40: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 63 61 63  _mutex_lock(&cac
1e50: 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 66 69  he->mutex);...fi
1e60: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
1e70: 67 28 22 43 6f 6d 70 6c 65 74 65 64 20 6c 6f 63  g("Completed loc
1e80: 6b 69 6e 67 20 6d 75 74 65 78 20 66 6f 72 20 69  king mutex for i
1e90: 64 78 3a 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  dx: %lu", (unsig
1ea0: 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f  ned long) cache_
1eb0: 69 64 78 29 3b 0a 0a 09 69 66 20 28 73 74 72 63  idx);...if (strc
1ec0: 6d 70 28 70 61 74 68 2c 20 63 61 63 68 65 2d 3e  mp(path, cache->
1ed0: 70 61 74 68 29 20 21 3d 20 30 29 20 7b 0a 09 09  path) != 0) {...
1ee0: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65  filed_log_msg_de
1ef0: 62 75 67 28 22 43 61 63 68 65 20 6d 69 73 73 20  bug("Cache miss 
1f00: 66 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20 4f 4c  for idx: %lu: OL
1f10: 44 20 5c 22 25 73 5c 22 2c 20 4e 45 57 20 5c 22  D \"%s\", NEW \"
1f20: 25 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64  %s\"", (unsigned
1f30: 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78   long) cache_idx
1f40: 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 2c 20 70  , cache->path, p
1f50: 61 74 68 29 3b 0a 0a 09 09 66 64 20 3d 20 6f 70  ath);....fd = op
1f60: 65 6e 28 70 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c  en(path, O_RDONL
1f70: 59 20 7c 20 4f 5f 4c 41 52 47 45 46 49 4c 45 29  Y | O_LARGEFILE)
1f80: 3b 0a 09 09 69 66 20 28 66 64 20 3c 20 30 29 20  ;...if (fd < 0) 
1f90: 7b 0a 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74  {....pthread_mut
1fa0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65  ex_unlock(&cache
1fb0: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 09 72 65  ->mutex);.....re
1fc0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a  turn(NULL);...}.
1fd0: 0a 09 09 66 72 65 65 28 63 61 63 68 65 2d 3e 70  ...free(cache->p
1fe0: 61 74 68 29 3b 0a 09 09 69 66 20 28 63 61 63 68  ath);...if (cach
1ff0: 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a 09 09  e->fd >= 0) {...
2000: 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66 64  .close(cache->fd
2010: 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20 3d 20  );...}....len = 
2020: 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53 45 45  lseek(fd, 0, SEE
2030: 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65 6b 28  K_END);...lseek(
2040: 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  fd, 0, SEEK_SET)
2050: 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64 20 3d  ;....cache->fd =
2060: 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e 6c 65   fd;...cache->le
2070: 6e 20 3d 20 6c 65 6e 3b 0a 09 09 63 61 63 68 65  n = len;...cache
2080: 2d 3e 70 61 74 68 20 3d 20 73 74 72 64 75 70 28  ->path = strdup(
2090: 70 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d 3e  path);...cache->
20a0: 74 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65 74  type = filed_det
20b0: 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28  ermine_mimetype(
20c0: 70 61 74 68 29 3b 0a 0a 09 09 2f 2a 20 58 58 58  path);..../* XXX
20d0: 3a 54 4f 44 4f 3a 20 44 65 74 65 72 6d 69 6e 65  :TODO: Determine
20e0: 20 2a 2f 0a 09 09 63 61 63 68 65 2d 3e 6c 61 73   */...cache->las
20f0: 74 6d 6f 64 20 3d 20 66 69 6c 65 64 5f 66 6f 72  tmod = filed_for
2100: 6d 61 74 5f 74 69 6d 65 28 63 61 63 68 65 2d 3e  mat_time(cache->
2110: 6c 61 73 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f  lastmod_b, sizeo
2120: 66 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64  f(cache->lastmod
2130: 5f 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 20  _b), time(NULL) 
2140: 2d 20 33 30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  - 30);..} else {
2150: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
2160: 5f 64 65 62 75 67 28 22 43 61 63 68 65 20 68 69  _debug("Cache hi
2170: 74 20 66 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20  t for idx: %lu: 
2180: 50 41 54 48 20 5c 22 25 73 5c 22 22 2c 20 28 75  PATH \"%s\"", (u
2190: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
21a0: 63 68 65 5f 69 64 78 2c 20 70 61 74 68 29 3b 0a  che_idx, path);.
21b0: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 68  .}.../*.. * We h
21c0: 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 20 64 75  ave to make a du
21d0: 70 6c 69 63 61 74 65 20 46 44 2c 20 62 65 63 61  plicate FD, beca
21e0: 75 73 65 20 6f 6e 63 65 20 77 65 20 72 65 6c 65  use once we rele
21f0: 61 73 65 20 74 68 65 20 63 61 63 68 65 0a 09 20  ase the cache.. 
2200: 2a 20 6d 75 74 65 78 2c 20 74 68 65 20 66 69 6c  * mutex, the fil
2210: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79  e descriptor may
2220: 20 62 65 20 63 6c 6f 73 65 64 0a 09 20 2a 2f 0a   be closed.. */.
2230: 09 66 64 20 3d 20 64 75 70 28 63 61 63 68 65 2d  .fd = dup(cache-
2240: 3e 66 64 29 3b 0a 09 69 66 20 28 66 64 20 3c 20  >fd);..if (fd < 
2250: 30 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  0) {...pthread_m
2260: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63  utex_unlock(&cac
2270: 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 72  he->mutex);....r
2280: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
2290: 0a 09 62 75 66 66 65 72 2d 3e 66 64 20 3d 20 66  ..buffer->fd = f
22a0: 64 3b 0a 09 62 75 66 66 65 72 2d 3e 6c 65 6e 20  d;..buffer->len 
22b0: 3d 20 63 61 63 68 65 2d 3e 6c 65 6e 3b 0a 09 62  = cache->len;..b
22c0: 75 66 66 65 72 2d 3e 74 79 70 65 20 3d 20 63 61  uffer->type = ca
22d0: 63 68 65 2d 3e 74 79 70 65 3b 0a 09 6d 65 6d 63  che->type;..memc
22e0: 70 79 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d  py(buffer->lastm
22f0: 6f 64 5f 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73  od_b, cache->las
2300: 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62  tmod_b, sizeof(b
2310: 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62  uffer->lastmod_b
2320: 29 29 3b 0a 09 62 75 66 66 65 72 2d 3e 6c 61 73  ));..buffer->las
2330: 74 6d 6f 64 20 3d 20 62 75 66 66 65 72 2d 3e 6c  tmod = buffer->l
2340: 61 73 74 6d 6f 64 5f 62 20 2b 20 28 63 61 63 68  astmod_b + (cach
2350: 65 2d 3e 6c 61 73 74 6d 6f 64 20 2d 20 63 61 63  e->lastmod - cac
2360: 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 3b 0a  he->lastmod_b);.
2370: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
2380: 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  unlock(&cache->m
2390: 75 74 65 78 29 3b 0a 0a 09 72 65 74 75 72 6e 28  utex);...return(
23a0: 62 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 50  buffer);.}../* P
23b0: 72 6f 63 65 73 73 20 61 6e 20 48 54 54 50 20 72  rocess an HTTP r
23c0: 65 71 75 65 73 74 20 61 6e 64 20 72 65 74 75 72  equest and retur
23d0: 6e 20 74 68 65 20 70 61 74 68 20 72 65 71 75 65  n the path reque
23e0: 73 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 73  sted */.static s
23f0: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
2400: 5f 72 65 71 75 65 73 74 20 2a 66 69 6c 65 64 5f  _request *filed_
2410: 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74  get_http_request
2420: 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63  (FILE *fp, struc
2430: 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71  t filed_http_req
2440: 75 65 73 74 20 2a 62 75 66 66 65 72 5f 73 74 29  uest *buffer_st)
2450: 20 7b 0a 09 63 68 61 72 20 2a 6d 65 74 68 6f 64   {..char *method
2460: 2c 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a  , *path;..char *
2470: 62 75 66 66 65 72 2c 20 2a 74 6d 70 62 75 66 66  buffer, *tmpbuff
2480: 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72 2c  er, *workbuffer,
2490: 20 2a 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78   *workbuffer_nex
24a0: 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65  t;..size_t buffe
24b0: 72 5f 6c 65 6e 2c 20 74 6d 70 62 75 66 66 65 72  r_len, tmpbuffer
24c0: 5f 6c 65 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e  _len;..off_t ran
24d0: 67 65 5f 73 74 61 72 74 2c 20 72 61 6e 67 65 5f  ge_start, range_
24e0: 65 6e 64 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74  end, range_lengt
24f0: 68 3b 0a 09 69 6e 74 20 72 61 6e 67 65 5f 72 65  h;..int range_re
2500: 71 75 65 73 74 3b 0a 09 69 6e 74 20 66 64 3b 0a  quest;..int fd;.
2510: 09 69 6e 74 20 69 3b 0a 0a 09 66 64 20 3d 20 66  .int i;...fd = f
2520: 69 6c 65 6e 6f 28 66 70 29 3b 0a 0a 09 72 61 6e  ileno(fp);...ran
2530: 67 65 5f 73 74 61 72 74 20 3d 20 30 3b 0a 09 72  ge_start = 0;..r
2540: 61 6e 67 65 5f 65 6e 64 20 20 20 3d 20 30 3b 0a  ange_end   = 0;.
2550: 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d  .range_request =
2560: 20 30 3b 0a 09 72 61 6e 67 65 5f 6c 65 6e 67 74   0;..range_lengt
2570: 68 20 3d 20 2d 31 3b 0a 0a 09 62 75 66 66 65 72  h = -1;...buffer
2580: 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e 70 61   = buffer_st->pa
2590: 74 68 5f 62 3b 0a 09 62 75 66 66 65 72 5f 6c 65  th_b;..buffer_le
25a0: 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66 65  n = sizeof(buffe
25b0: 72 5f 73 74 2d 3e 70 61 74 68 5f 62 29 3b 0a 0a  r_st->path_b);..
25c0: 09 74 6d 70 62 75 66 66 65 72 20 3d 20 62 75 66  .tmpbuffer = buf
25d0: 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b 0a  fer_st->tmpbuf;.
25e0: 09 74 6d 70 62 75 66 66 65 72 5f 6c 65 6e 20 3d  .tmpbuffer_len =
25f0: 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 5f 73   sizeof(buffer_s
2600: 74 2d 3e 74 6d 70 62 75 66 29 3b 0a 0a 09 66 69  t->tmpbuf);...fi
2610: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 57 41 49  led_log_msg("WAI
2620: 54 5f 46 4f 52 5f 52 45 51 55 45 53 54 20 46 44  T_FOR_REQUEST FD
2630: 3d 25 69 22 2c 20 66 64 29 3b 0a 0a 09 66 67 65  =%i", fd);...fge
2640: 74 73 28 62 75 66 66 65 72 2c 20 62 75 66 66 65  ts(buffer, buffe
2650: 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 0a 09 6d 65  r_len, fp);...me
2660: 74 68 6f 64 20 3d 20 62 75 66 66 65 72 3b 0a 0a  thod = buffer;..
2670: 09 62 75 66 66 65 72 20 3d 20 73 74 72 63 68 72  .buffer = strchr
2680: 28 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a 09  (buffer, ' ');..
2690: 69 66 20 28 62 75 66 66 65 72 20 3d 3d 20 4e 55  if (buffer == NU
26a0: 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f  LL) {...filed_lo
26b0: 67 5f 6d 73 67 28 22 47 4f 54 5f 52 45 51 55 45  g_msg("GOT_REQUE
26c0: 53 54 20 46 44 3d 25 69 20 45 52 52 4f 52 3d 66  ST FD=%i ERROR=f
26d0: 6f 72 6d 61 74 22 2c 20 66 64 29 3b 0a 0a 09 09  ormat", fd);....
26e0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
26f0: 0a 0a 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30  ...*buffer = '\0
2700: 27 3b 0a 09 62 75 66 66 65 72 2b 2b 3b 0a 0a 09  ';..buffer++;...
2710: 70 61 74 68 20 3d 20 62 75 66 66 65 72 3b 0a 0a  path = buffer;..
2720: 09 62 75 66 66 65 72 20 3d 20 73 74 72 63 68 72  .buffer = strchr
2730: 28 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a 09  (buffer, ' ');..
2740: 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55  if (buffer != NU
2750: 4c 4c 29 20 7b 0a 09 09 2a 62 75 66 66 65 72 20  LL) {...*buffer 
2760: 3d 20 27 5c 30 27 3b 0a 09 09 62 75 66 66 65 72  = '\0';...buffer
2770: 2b 2b 3b 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c  ++;..}...filed_l
2780: 6f 67 5f 6d 73 67 28 22 47 4f 54 5f 52 45 51 55  og_msg("GOT_REQU
2790: 45 53 54 20 46 44 3d 25 69 20 50 41 54 48 3d 25  EST FD=%i PATH=%
27a0: 73 22 2c 20 66 64 2c 20 70 61 74 68 29 3b 0a 0a  s", fd, path);..
27b0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22  .filed_log_msg("
27c0: 57 41 49 54 5f 46 4f 52 5f 48 45 41 44 45 52 53  WAIT_FOR_HEADERS
27d0: 20 46 44 3d 25 69 22 2c 20 66 64 29 3b 0a 0a 09   FD=%i", fd);...
27e0: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
27f0: 31 30 30 3b 20 69 2b 2b 29 20 7b 0a 09 09 66 67  100; i++) {...fg
2800: 65 74 73 28 74 6d 70 62 75 66 66 65 72 2c 20 74  ets(tmpbuffer, t
2810: 6d 70 62 75 66 66 65 72 5f 6c 65 6e 2c 20 66 70  mpbuffer_len, fp
2820: 29 3b 0a 0a 09 09 69 66 20 28 73 74 72 6e 63 61  );....if (strnca
2830: 73 65 63 6d 70 28 74 6d 70 62 75 66 66 65 72 2c  secmp(tmpbuffer,
2840: 20 22 52 61 6e 67 65 3a 20 22 2c 20 37 29 20 3d   "Range: ", 7) =
2850: 3d 20 30 29 20 7b 0a 09 09 09 77 6f 72 6b 62 75  = 0) {....workbu
2860: 66 66 65 72 20 3d 20 74 6d 70 62 75 66 66 65 72  ffer = tmpbuffer
2870: 20 2b 20 37 3b 0a 0a 09 09 09 69 66 20 28 73 74   + 7;.....if (st
2880: 72 6e 63 61 73 65 63 6d 70 28 77 6f 72 6b 62 75  rncasecmp(workbu
2890: 66 66 65 72 2c 20 22 62 79 74 65 73 3d 22 2c 20  ffer, "bytes=", 
28a0: 36 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 77  6) == 0) {.....w
28b0: 6f 72 6b 62 75 66 66 65 72 20 2b 3d 20 36 3b 0a  orkbuffer += 6;.
28c0: 0a 09 09 09 09 72 61 6e 67 65 5f 72 65 71 75 65  .....range_reque
28d0: 73 74 20 3d 20 31 3b 0a 0a 09 09 09 09 72 61 6e  st = 1;......ran
28e0: 67 65 5f 73 74 61 72 74 20 3d 20 73 74 72 74 6f  ge_start = strto
28f0: 75 6c 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c 20  ull(workbuffer, 
2900: 26 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74  &workbuffer_next
2910: 2c 20 31 30 29 3b 0a 0a 09 09 09 09 77 6f 72 6b  , 10);......work
2920: 62 75 66 66 65 72 20 3d 20 77 6f 72 6b 62 75 66  buffer = workbuf
2930: 66 65 72 5f 6e 65 78 74 3b 0a 0a 09 09 09 09 69  fer_next;......i
2940: 66 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d  f (*workbuffer =
2950: 3d 20 27 2d 27 29 20 7b 0a 09 09 09 09 09 77 6f  = '-') {......wo
2960: 72 6b 62 75 66 66 65 72 2b 2b 3b 0a 0a 09 09 09  rkbuffer++;.....
2970: 09 09 69 66 20 28 2a 77 6f 72 6b 62 75 66 66 65  ..if (*workbuffe
2980: 72 20 21 3d 20 27 5c 72 27 20 26 26 20 2a 77 6f  r != '\r' && *wo
2990: 72 6b 62 75 66 66 65 72 20 21 3d 20 27 5c 6e 27  rkbuffer != '\n'
29a0: 29 20 7b 0a 09 09 09 09 09 09 72 61 6e 67 65 5f  ) {.......range_
29b0: 65 6e 64 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77  end = strtoull(w
29c0: 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72 6b  orkbuffer, &work
29d0: 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30 29  buffer_next, 10)
29e0: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
29f0: 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d  ..}...}....if (m
2a00: 65 6d 63 6d 70 28 74 6d 70 62 75 66 66 65 72 2c  emcmp(tmpbuffer,
2a10: 20 22 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d 20 30   "\r\n", 2) == 0
2a20: 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ) {....break;...
2a30: 7d 0a 09 7d 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  }..}...filed_log
2a40: 5f 6d 73 67 28 22 47 4f 54 5f 48 45 41 44 45 52  _msg("GOT_HEADER
2a50: 53 20 46 44 3d 25 69 22 2c 20 66 64 29 3b 0a 0a  S FD=%i", fd);..
2a60: 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 68 61 6e 64  ./* We only hand
2a70: 6c 65 20 74 68 65 20 22 47 45 54 22 20 6d 65 74  le the "GET" met
2a80: 68 6f 64 20 2a 2f 0a 09 69 66 20 28 73 74 72 63  hod */..if (strc
2a90: 61 73 65 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22  asecmp(method, "
2aa0: 67 65 74 22 29 20 21 3d 20 30 29 20 7b 0a 09 09  get") != 0) {...
2ab0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
2ac0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
2ad0: 72 61 6e 67 65 20 2a 2f 0a 09 69 66 20 28 72 61  range */..if (ra
2ae0: 6e 67 65 5f 65 6e 64 20 21 3d 20 30 29 20 7b 0a  nge_end != 0) {.
2af0: 09 09 69 66 20 28 72 61 6e 67 65 5f 65 6e 64 20  ..if (range_end 
2b00: 3c 3d 20 72 61 6e 67 65 5f 73 74 61 72 74 29 20  <= range_start) 
2b10: 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  {....return(NULL
2b20: 29 3b 0a 09 09 7d 0a 0a 09 09 72 61 6e 67 65 5f  );...}....range_
2b30: 6c 65 6e 67 74 68 20 3d 20 72 61 6e 67 65 5f 65  length = range_e
2b40: 6e 64 20 2d 20 72 61 6e 67 65 5f 73 74 61 72 74  nd - range_start
2b50: 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  ;....filed_log_m
2b60: 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75 74  sg_debug("Comput
2b70: 69 6e 67 20 6c 65 6e 67 74 68 20 70 61 72 61 6d  ing length param
2b80: 65 74 65 72 3a 20 25 6c 6c 75 20 3d 20 25 6c 6c  eter: %llu = %ll
2b90: 75 20 2d 20 25 6c 6c 75 22 2c 0a 09 09 09 28 75  u - %llu",....(u
2ba0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
2bb0: 67 29 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 2c  g) range_length,
2bc0: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
2bd0: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 65  ng long) range_e
2be0: 6e 64 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64  nd,....(unsigned
2bf0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67   long long) rang
2c00: 65 5f 73 74 61 72 74 0a 09 09 29 3b 0a 09 7d 0a  e_start...);..}.
2c10: 0a 09 2f 2a 20 46 69 6c 6c 20 75 70 20 73 74 72  ../* Fill up str
2c20: 75 63 74 75 72 65 20 74 6f 20 72 65 74 75 72 6e  ucture to return
2c30: 20 2a 2f 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e   */..buffer_st->
2c40: 70 61 74 68 20 20 20 3d 20 70 61 74 68 3b 0a 09  path   = path;..
2c50: 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65  buffer_st->heade
2c60: 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e 74  rs.range.present
2c70: 20 3d 20 72 61 6e 67 65 5f 72 65 71 75 65 73 74   = range_request
2c80: 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  ;..buffer_st->he
2c90: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
2ca0: 65 74 20 20 3d 20 72 61 6e 67 65 5f 73 74 61 72  et  = range_star
2cb0: 74 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68  t;..buffer_st->h
2cc0: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e  eaders.range.len
2cd0: 67 74 68 20 20 3d 20 72 61 6e 67 65 5f 6c 65 6e  gth  = range_len
2ce0: 67 74 68 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75  gth;...return(bu
2cf0: 66 66 65 72 5f 73 74 29 3b 0a 7d 0a 0a 2f 2a 20  ffer_st);.}../* 
2d00: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
2d10: 70 61 67 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  page */.static v
2d20: 6f 69 64 20 66 69 6c 65 64 5f 65 72 72 6f 72 5f  oid filed_error_
2d30: 70 61 67 65 28 46 49 4c 45 20 2a 66 70 2c 20 63  page(FILE *fp, c
2d40: 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 65 5f  onst char *date_
2d50: 63 75 72 72 65 6e 74 2c 20 69 6e 74 20 65 72 72  current, int err
2d60: 6f 72 5f 6e 75 6d 62 65 72 29 20 7b 0a 09 63 68  or_number) {..ch
2d70: 61 72 20 2a 65 72 72 6f 72 5f 73 74 72 69 6e 67  ar *error_string
2d80: 20 3d 20 22 3c 68 74 6d 6c 3e 3c 68 65 61 64 3e   = "<html><head>
2d90: 3c 74 69 74 6c 65 3e 45 52 52 4f 52 3c 2f 74 69  <title>ERROR</ti
2da0: 74 6c 65 3e 3c 2f 68 65 61 64 3e 3c 62 6f 64 79  tle></head><body
2db0: 3e 55 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65  >Unable to proce
2dc0: 73 73 20 72 65 71 75 65 73 74 3c 2f 62 6f 64 79  ss request</body
2dd0: 3e 3c 2f 68 74 6d 6c 3e 22 3b 0a 0a 09 66 70 72  ></html>";...fpr
2de0: 69 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f 31  intf(fp, "HTTP/1
2df0: 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74 65  .1 %i OK\r\nDate
2e00: 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20  : %s\r\nServer: 
2e10: 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f  filed\r\nLast-Mo
2e20: 64 69 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f  dified: %s\r\nCo
2e30: 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c  ntent-Length: %l
2e40: 6c 75 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79  lu\r\nContent-Ty
2e50: 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63  pe: %s\r\nConnec
2e60: 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 5c  tion: close\r\n\
2e70: 72 5c 6e 25 73 22 2c 0a 09 09 65 72 72 6f 72 5f  r\n%s",...error_
2e80: 6e 75 6d 62 65 72 2c 0a 09 09 64 61 74 65 5f 63  number,...date_c
2e90: 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f 63  urrent,...date_c
2ea0: 75 72 72 65 6e 74 2c 0a 09 09 28 75 6e 73 69 67  urrent,...(unsig
2eb0: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73  ned long long) s
2ec0: 74 72 6c 65 6e 28 65 72 72 6f 72 5f 73 74 72 69  trlen(error_stri
2ed0: 6e 67 29 2c 0a 09 09 22 74 65 78 74 2f 68 74 6d  ng),..."text/htm
2ee0: 6c 22 2c 0a 09 09 65 72 72 6f 72 5f 73 74 72 69  l",...error_stri
2ef0: 6e 67 0a 09 29 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e  ng..);.}../* Han
2f00: 64 6c 65 20 61 20 73 69 6e 67 6c 65 20 72 65 71  dle a single req
2f10: 75 65 73 74 20 66 72 6f 6d 20 61 20 63 6c 69 65  uest from a clie
2f20: 6e 74 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt */.static voi
2f30: 64 20 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f 63  d filed_handle_c
2f40: 6c 69 65 6e 74 28 69 6e 74 20 66 64 2c 20 73 74  lient(int fd, st
2f50: 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70 5f  ruct filed_http_
2f60: 72 65 71 75 65 73 74 20 2a 72 65 71 75 65 73 74  request *request
2f70: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
2f80: 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c 65  d_fileinfo *file
2f90: 69 6e 66 6f 3b 0a 09 73 73 69 7a 65 5f 74 20 73  info;..ssize_t s
2fa0: 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 73 69  endfile_ret;..si
2fb0: 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 6c 65  ze_t sendfile_le
2fc0: 6e 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74  n, sendfile_sent
2fd0: 2c 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 3b  , sendfile_size;
2fe0: 0a 09 6f 66 66 5f 74 20 73 65 6e 64 66 69 6c 65  ..off_t sendfile
2ff0: 5f 6f 66 66 73 65 74 3b 0a 09 63 68 61 72 20 2a  _offset;..char *
3000: 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 64 61 74  path;..char *dat
3010: 65 5f 63 75 72 72 65 6e 74 2c 20 64 61 74 65 5f  e_current, date_
3020: 63 75 72 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a 09  current_b[64];..
3030: 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a 09  int http_code;..
3040: 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20 44  FILE *fp;.../* D
3050: 65 74 65 72 6d 69 6e 65 20 63 75 72 72 65 6e 74  etermine current
3060: 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f 63   time */..date_c
3070: 75 72 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f 66  urrent = filed_f
3080: 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61 74 65 5f  ormat_time(date_
3090: 63 75 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65 6f  current_b, sizeo
30a0: 66 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62  f(date_current_b
30b0: 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b 0a  ), time(NULL));.
30c0: 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65 74  ../* Open socket
30d0: 20 61 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f 72   as ANSI I/O for
30e0: 20 65 61 73 65 20 6f 66 20 75 73 65 20 2a 2f 0a   ease of use */.
30f0: 09 66 70 20 3d 20 66 64 6f 70 65 6e 28 66 64 2c  .fp = fdopen(fd,
3100: 20 22 77 2b 62 22 29 3b 0a 09 69 66 20 28 66 70   "w+b");..if (fp
3110: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 6c   == NULL) {...cl
3120: 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74 75  ose(fd);....retu
3130: 72 6e 3b 0a 09 7d 0a 0a 09 72 65 71 75 65 73 74  rn;..}...request
3140: 20 3d 20 66 69 6c 65 64 5f 67 65 74 5f 68 74 74   = filed_get_htt
3150: 70 5f 72 65 71 75 65 73 74 28 66 70 2c 20 72 65  p_request(fp, re
3160: 71 75 65 73 74 29 3b 0a 0a 09 69 66 20 28 72 65  quest);...if (re
3170: 71 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  quest == NULL ||
3180: 20 72 65 71 75 65 73 74 2d 3e 70 61 74 68 20 3d   request->path =
3190: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65  = NULL) {...file
31a0: 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c  d_error_page(fp,
31b0: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 35   date_current, 5
31c0: 30 30 29 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f  00);....filed_lo
31d0: 67 5f 6d 73 67 28 22 49 4e 56 41 4c 49 44 5f 52  g_msg("INVALID_R
31e0: 45 51 55 45 53 54 20 46 44 3d 25 69 20 45 52 52  EQUEST FD=%i ERR
31f0: 4f 52 3d 35 30 30 22 2c 20 66 64 29 3b 0a 0a 09  OR=500", fd);...
3200: 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 09  .fclose(fp);....
3210: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 69 66 20  return;..}...if 
3220: 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72  (request->header
3230: 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e 74 29  s.range.present)
3240: 20 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d   {...filed_log_m
3250: 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50 4c  sg("PROCESS_REPL
3260: 59 5f 53 54 41 52 54 20 46 44 3d 25 69 20 50 41  Y_START FD=%i PA
3270: 54 48 3d 25 73 20 52 41 4e 47 45 5f 53 54 41 52  TH=%s RANGE_STAR
3280: 54 3d 25 6c 6c 75 20 52 41 4e 47 45 5f 4c 45 4e  T=%llu RANGE_LEN
3290: 47 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09 66 64  GTH=%llu",....fd
32a0: 2c 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 70 61  ,....request->pa
32b0: 74 68 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64  th,....(unsigned
32c0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75   long long) requ
32d0: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
32e0: 67 65 2e 6f 66 66 73 65 74 2c 0a 09 09 09 28 75  ge.offset,....(u
32f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
3300: 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  g) request->head
3310: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
3320: 0a 09 09 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ...);..} else {.
3330: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
3340: 22 50 52 4f 43 45 53 53 5f 52 45 50 4c 59 5f 53  "PROCESS_REPLY_S
3350: 54 41 52 54 20 46 44 3d 25 69 20 50 41 54 48 3d  TART FD=%i PATH=
3360: 25 73 22 2c 20 66 64 2c 20 72 65 71 75 65 73 74  %s", fd, request
3370: 2d 3e 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 70 61  ->path);..}...pa
3380: 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e 70 61  th = request->pa
3390: 74 68 3b 0a 0a 09 68 74 74 70 5f 63 6f 64 65 20  th;...http_code 
33a0: 3d 20 2d 31 3b 0a 0a 09 66 69 6c 65 69 6e 66 6f  = -1;...fileinfo
33b0: 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69   = filed_open_fi
33c0: 6c 65 28 70 61 74 68 2c 20 26 72 65 71 75 65 73  le(path, &reques
33d0: 74 2d 3e 66 69 6c 65 69 6e 66 6f 29 3b 0a 09 69  t->fileinfo);..i
33e0: 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d 3d 20 4e  f (fileinfo == N
33f0: 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64 5f 65  ULL) {...filed_e
3400: 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64 61  rror_page(fp, da
3410: 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 30 34 29  te_current, 404)
3420: 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  ;....filed_log_m
3430: 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50 4c  sg("PROCESS_REPL
3440: 59 5f 43 4f 4d 50 4c 45 54 45 20 46 44 3d 25 69  Y_COMPLETE FD=%i
3450: 20 45 52 52 4f 52 3d 34 30 34 22 2c 20 66 64 29   ERROR=404", fd)
3460: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
3470: 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65   (request->heade
3480: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20  rs.range.offset 
3490: 21 3d 20 30 20 7c 7c 20 72 65 71 75 65 73 74 2d  != 0 || request-
34a0: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
34b0: 65 6e 67 74 68 20 3e 3d 20 30 29 20 7b 0a 09 09  ength >= 0) {...
34c0: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
34d0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
34e0: 65 74 20 3e 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e  et >= fileinfo->
34f0: 6c 65 6e 29 20 7b 0a 09 09 09 09 66 69 6c 65 64  len) {.....filed
3500: 5f 6c 6f 67 5f 6d 73 67 28 22 50 52 4f 43 45 53  _log_msg("PROCES
3510: 53 5f 52 45 50 4c 59 5f 43 4f 4d 50 4c 45 54 45  S_REPLY_COMPLETE
3520: 20 46 44 3d 25 69 20 45 52 52 4f 52 3d 34 31 36   FD=%i ERROR=416
3530: 22 2c 20 66 64 29 3b 0a 0a 09 09 09 09 66 69 6c  ", fd);......fil
3540: 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70  ed_error_page(fp
3550: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20  , date_current, 
3560: 34 31 36 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20  416);....} else 
3570: 7b 0a 09 09 09 09 69 66 20 28 72 65 71 75 65 73  {.....if (reques
3580: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
3590: 2e 6c 65 6e 67 74 68 20 3c 20 30 29 20 7b 0a 09  .length < 0) {..
35a0: 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ....filed_log_ms
35b0: 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75 74 69  g_debug("Computi
35c0: 6e 67 20 6c 65 6e 67 74 68 20 74 6f 20 66 69 74  ng length to fit
35d0: 20 69 6e 20 62 6f 75 6e 64 73 3a 20 66 69 6c 65   in bounds: file
35e0: 69 6e 66 6f 2d 3e 6c 65 6e 20 3d 20 25 6c 6c 75  info->len = %llu
35f0: 2c 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  , request->heade
3600: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20  rs.range.offset 
3610: 3d 20 25 6c 6c 75 22 2c 0a 09 09 09 09 09 09 28  = %llu",.......(
3620: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
3630: 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65  ng) fileinfo->le
3640: 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e  n,.......(unsign
3650: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65  ed long long) re
3660: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
3670: 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09 09 09  ange.offset.....
3680: 09 29 3b 0a 0a 09 09 09 09 09 72 65 71 75 65 73  .);.......reques
3690: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
36a0: 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e  .length = filein
36b0: 66 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75 65 73  fo->len - reques
36c0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
36d0: 2e 6f 66 66 73 65 74 3b 0a 09 09 09 09 7d 0a 0a  .offset;.....}..
36e0: 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ....filed_log_ms
36f0: 67 5f 64 65 62 75 67 28 22 50 61 72 74 69 61 6c  g_debug("Partial
3700: 20 72 65 71 75 65 73 74 2c 20 73 74 61 72 74 69   request, starti
3710: 6e 67 20 61 74 3a 20 25 6c 6c 75 20 61 6e 64 20  ng at: %llu and 
3720: 72 75 6e 6e 69 6e 67 20 66 6f 72 20 25 6c 6c 75  running for %llu
3730: 20 62 79 74 65 73 22 2c 0a 09 09 09 09 09 28 75   bytes",......(u
3740: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
3750: 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  g) request->head
3760: 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74  ers.range.offset
3770: 2c 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64  ,......(unsigned
3780: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75   long long) requ
3790: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
37a0: 67 65 2e 6c 65 6e 67 74 68 0a 09 09 09 09 29 3b  ge.length.....);
37b0: 0a 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20  ......http_code 
37c0: 3d 20 32 30 36 3b 0a 09 09 09 7d 0a 09 09 7d 20  = 206;....}...} 
37d0: 65 6c 73 65 20 7b 0a 09 09 09 69 66 20 28 72 65  else {....if (re
37e0: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
37f0: 61 6e 67 65 2e 70 72 65 73 65 6e 74 29 20 7b 0a  ange.present) {.
3800: 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d 20  ....http_code = 
3810: 32 30 36 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  206;....} else {
3820: 0a 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d  .....http_code =
3830: 20 32 30 30 3b 0a 09 09 09 7d 0a 09 09 09 72 65   200;....}....re
3840: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
3850: 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d 20 30 3b  ange.offset = 0;
3860: 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61  ....request->hea
3870: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
3880: 68 20 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65  h = fileinfo->le
3890: 6e 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 68 74  n;...}....if (ht
38a0: 74 70 5f 63 6f 64 65 20 3e 20 30 29 20 7b 0a 09  tp_code > 0) {..
38b0: 09 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 48  ..fprintf(fp, "H
38c0: 54 54 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c  TTP/1.1 %i OK\r\
38d0: 6e 44 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72  nDate: %s\r\nSer
38e0: 76 65 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61  ver: filed\r\nLa
38f0: 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c  st-Modified: %s\
3900: 72 5c 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74  r\nContent-Lengt
3910: 68 3a 20 25 6c 6c 75 5c 72 5c 6e 41 63 63 65 70  h: %llu\r\nAccep
3920: 74 2d 52 61 6e 67 65 73 3a 20 62 79 74 65 73 5c  t-Ranges: bytes\
3930: 72 5c 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a  r\nContent-Type:
3940: 20 25 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f   %s\r\nConnectio
3950: 6e 3a 20 63 6c 6f 73 65 5c 72 5c 6e 22 2c 0a 09  n: close\r\n",..
3960: 09 09 09 68 74 74 70 5f 63 6f 64 65 2c 0a 09 09  ...http_code,...
3970: 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a  ..date_current,.
3980: 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c 61  ....fileinfo->la
3990: 73 74 6d 6f 64 2c 0a 09 09 09 09 28 75 6e 73 69  stmod,.....(unsi
39a0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
39b0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
39c0: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09  .range.length,..
39d0: 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79 70  ...fileinfo->typ
39e0: 65 0a 09 09 09 29 3b 0a 09 09 09 69 66 20 28 68  e....);....if (h
39f0: 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32 30 36 29  ttp_code == 206)
3a00: 20 7b 0a 09 09 09 09 66 70 72 69 6e 74 66 28 66   {.....fprintf(f
3a10: 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61 6e 67  p, "Content-Rang
3a20: 65 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d 25 6c  e: bytes %llu-%l
3a30: 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a 09 09  lu/%llu\r\n",...
3a40: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
3a50: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
3a60: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
3a70: 66 66 73 65 74 2c 0a 09 09 09 09 09 28 75 6e 73  ffset,......(uns
3a80: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3a90: 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65   (request->heade
3aa0: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20  rs.range.offset 
3ab0: 2b 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  + request->heade
3ac0: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
3ad0: 2d 20 31 29 2c 0a 09 09 09 09 09 28 75 6e 73 69  - 1),......(unsi
3ae0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
3af0: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 0a 09 09  fileinfo->len...
3b00: 09 09 29 3b 0a 09 09 09 7d 0a 09 09 09 66 70 72  ..);....}....fpr
3b10: 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c 6e 22 29  intf(fp, "\r\n")
3b20: 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70 29 3b  ;....fflush(fp);
3b30: 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  .....filed_log_m
3b40: 73 67 28 22 50 52 4f 43 45 53 53 5f 52 45 50 4c  sg("PROCESS_REPL
3b50: 59 5f 43 4f 4d 50 4c 45 54 45 20 46 44 3d 25 69  Y_COMPLETE FD=%i
3b60: 20 53 54 41 54 55 53 3d 25 69 22 2c 20 66 64 2c   STATUS=%i", fd,
3b70: 20 68 74 74 70 5f 63 6f 64 65 29 3b 0a 0a 23 69   http_code);..#i
3b80: 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c  fdef FILED_NONBL
3b90: 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69 6e 74 20  OCK_HTTP....int 
3ba0: 73 6f 63 6b 65 74 5f 66 6c 61 67 73 3b 0a 09 09  socket_flags;...
3bb0: 09 66 64 5f 73 65 74 20 72 66 64 2c 20 77 66 64  .fd_set rfd, wfd
3bc0: 3b 0a 09 09 09 63 68 61 72 20 73 69 6e 6b 62 75  ;....char sinkbu
3bd0: 66 5b 38 31 39 32 5d 3b 0a 09 09 09 73 73 69 7a  f[8192];....ssiz
3be0: 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a 09  e_t read_ret;...
3bf0: 09 09 46 44 5f 5a 45 52 4f 28 26 72 66 64 29 3b  ..FD_ZERO(&rfd);
3c00: 0a 09 09 09 46 44 5f 5a 45 52 4f 28 26 77 66 64  ....FD_ZERO(&wfd
3c10: 29 3b 0a 09 09 09 46 44 5f 53 45 54 28 66 64 2c  );....FD_SET(fd,
3c20: 20 26 72 66 64 29 3b 0a 09 09 09 46 44 5f 53 45   &rfd);....FD_SE
3c30: 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a 09 09  T(fd, &wfd);....
3c40: 09 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 3d 20  .socket_flags = 
3c50: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  fcntl(fd, F_GETF
3c60: 4c 29 3b 0a 09 09 09 66 63 6e 74 6c 28 66 64 2c  L);....fcntl(fd,
3c70: 20 46 5f 53 45 54 46 4c 2c 20 73 6f 63 6b 65 74   F_SETFL, socket
3c80: 5f 66 6c 61 67 73 20 7c 20 4f 5f 4e 4f 4e 42 4c  _flags | O_NONBL
3c90: 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09  OCK);.#endif....
3ca0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22  .filed_log_msg("
3cb0: 53 45 4e 44 5f 53 54 41 52 54 20 46 49 4c 45 5f  SEND_START FILE_
3cc0: 46 44 3d 25 69 20 46 44 3d 25 69 20 42 59 54 45  FD=%i FD=%i BYTE
3cd0: 53 3d 25 6c 6c 75 20 4f 46 46 53 45 54 3d 25 6c  S=%llu OFFSET=%l
3ce0: 6c 75 22 2c 0a 09 09 09 09 66 69 6c 65 69 6e 66  lu",.....fileinf
3cf0: 6f 2d 3e 66 64 2c 0a 09 09 09 09 66 64 2c 0a 09  o->fd,.....fd,..
3d00: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
3d10: 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d  g long) request-
3d20: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c  >headers.range.l
3d30: 65 6e 67 74 68 2c 0a 09 09 09 09 28 75 6e 73 69  ength,.....(unsi
3d40: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
3d50: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
3d60: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09  .range.offset...
3d70: 09 29 3b 0a 0a 09 09 09 73 65 6e 64 66 69 6c 65  .);.....sendfile
3d80: 5f 6f 66 66 73 65 74 20 3d 20 72 65 71 75 65 73  _offset = reques
3d90: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
3da0: 2e 6f 66 66 73 65 74 3b 0a 09 09 09 73 65 6e 64  .offset;....send
3db0: 66 69 6c 65 5f 6c 65 6e 20 3d 20 72 65 71 75 65  file_len = reque
3dc0: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
3dd0: 65 2e 6c 65 6e 67 74 68 3b 0a 09 09 09 73 65 6e  e.length;....sen
3de0: 64 66 69 6c 65 5f 73 65 6e 74 20 3d 20 30 3b 0a  dfile_sent = 0;.
3df0: 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
3e00: 09 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f  ...if (sendfile_
3e10: 6c 65 6e 20 3e 20 46 49 4c 45 44 5f 53 45 4e 44  len > FILED_SEND
3e20: 46 49 4c 45 5f 4d 41 58 29 20 7b 0a 09 09 09 09  FILE_MAX) {.....
3e30: 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d  .sendfile_size =
3e40: 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45 5f   FILED_SENDFILE_
3e50: 4d 41 58 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  MAX;.....} else 
3e60: 7b 0a 09 09 09 09 09 73 65 6e 64 66 69 6c 65 5f  {......sendfile_
3e70: 73 69 7a 65 20 3d 20 73 65 6e 64 66 69 6c 65 5f  size = sendfile_
3e80: 6c 65 6e 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  len;.....}......
3e90: 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3d 20 73  sendfile_ret = s
3ea0: 65 6e 64 66 69 6c 65 28 66 64 2c 20 66 69 6c 65  endfile(fd, file
3eb0: 69 6e 66 6f 2d 3e 66 64 2c 20 26 73 65 6e 64 66  info->fd, &sendf
3ec0: 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e 64  ile_offset, send
3ed0: 66 69 6c 65 5f 73 69 7a 65 29 3b 0a 09 09 09 09  file_size);.....
3ee0: 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 72 65 74  if (sendfile_ret
3ef0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 64 65 66 20   <= 0) {.#ifdef 
3f00: 46 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48  FILED_NONBLOCK_H
3f10: 54 54 50 0a 09 09 09 09 09 69 66 20 28 65 72 72  TTP......if (err
3f20: 6e 6f 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a  no == EAGAIN) {.
3f30: 09 09 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 72  ......sendfile_r
3f40: 65 74 20 3d 20 30 3b 0a 0a 09 09 09 09 09 09 77  et = 0;........w
3f50: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 09 09 09  hile (1) {......
3f60: 09 09 73 65 6c 65 63 74 28 66 64 20 2b 20 31 2c  ..select(fd + 1,
3f70: 20 26 72 66 64 2c 20 26 77 66 64 2c 20 4e 55 4c   &rfd, &wfd, NUL
3f80: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 09 09  L, NULL);.......
3f90: 09 69 66 20 28 46 44 5f 49 53 53 45 54 28 66 64  .if (FD_ISSET(fd
3fa0: 2c 20 26 72 66 64 29 29 20 7b 0a 09 09 09 09 09  , &rfd)) {......
3fb0: 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 72 65  ...read_ret = re
3fc0: 61 64 28 66 64 2c 20 73 69 6e 6b 62 75 66 2c 20  ad(fd, sinkbuf, 
3fd0: 73 69 7a 65 6f 66 28 73 69 6e 6b 62 75 66 29 29  sizeof(sinkbuf))
3fe0: 3b 0a 0a 09 09 09 09 09 09 09 09 69 66 20 28 72  ;..........if (r
3ff0: 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
4000: 09 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  .........break;.
4010: 09 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09  ........}.......
4020: 09 7d 0a 0a 09 09 09 09 09 09 09 69 66 20 28 46  .}.........if (F
4030: 44 5f 49 53 53 45 54 28 66 64 2c 20 26 77 66 64  D_ISSET(fd, &wfd
4040: 29 29 20 7b 0a 09 09 09 09 09 09 09 09 72 65 61  )) {.........rea
4050: 64 5f 72 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09  d_ret = 1;......
4060: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
4070: 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09  ..}.......}.....
4080: 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ...if (read_ret 
4090: 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 62  <= 0) {........b
40a0: 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09  reak;.......}...
40b0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
40c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
40d0: 23 65 6c 73 65 0a 09 09 09 09 09 62 72 65 61 6b  #else......break
40e0: 3b 0a 23 65 6e 64 69 66 0a 09 09 09 09 7d 0a 0a  ;.#endif.....}..
40f0: 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  ....sendfile_len
4100: 20 2d 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65 74   -= sendfile_ret
4110: 3b 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 73  ;.....sendfile_s
4120: 65 6e 74 20 2b 3d 20 73 65 6e 64 66 69 6c 65 5f  ent += sendfile_
4130: 72 65 74 3b 0a 09 09 09 09 69 66 20 28 73 65 6e  ret;.....if (sen
4140: 64 66 69 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29 20  dfile_len == 0) 
4150: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
4160: 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 66 69 6c  ..}....}.....fil
4170: 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 53 45 4e 44  ed_log_msg("SEND
4180: 5f 43 4f 4d 50 4c 45 54 45 20 53 54 41 54 55 53  _COMPLETE STATUS
4190: 3d 25 73 20 46 49 4c 45 5f 46 44 3d 25 69 20 46  =%s FILE_FD=%i F
41a0: 44 3d 25 69 20 42 59 54 45 53 3d 25 6c 6c 75 20  D=%i BYTES=%llu 
41b0: 42 59 54 45 53 5f 53 45 4e 54 3d 25 6c 6c 75 22  BYTES_SENT=%llu"
41c0: 2c 0a 09 09 09 09 22 3c 75 6e 6b 6e 6f 77 6e 3e  ,....."<unknown>
41d0: 22 2c 0a 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d  ",.....fileinfo-
41e0: 3e 66 64 2c 0a 09 09 09 09 66 64 2c 0a 09 09 09  >fd,.....fd,....
41f0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
4200: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
4210: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e  eaders.range.len
4220: 67 74 68 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e  gth,.....(unsign
4230: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 73 65  ed long long) se
4240: 6e 64 66 69 6c 65 5f 73 65 6e 74 0a 09 09 09 29  ndfile_sent....)
4250: 3b 0a 09 09 7d 0a 0a 09 09 63 6c 6f 73 65 28 66  ;...}....close(f
4260: 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a 0a 09  ileinfo->fd);...
4270: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22  .filed_log_msg("
4280: 43 4c 4f 53 45 5f 46 49 4c 45 20 46 44 3d 25 69  CLOSE_FILE FD=%i
4290: 22 2c 20 66 64 29 3b 0a 09 7d 0a 0a 09 66 69 6c  ", fd);..}...fil
42a0: 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 43 4c 4f 53  ed_log_msg("CLOS
42b0: 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 46 44 3d  E_CONNECTION FD=
42c0: 25 69 22 2c 20 66 64 29 3b 0a 0a 09 66 63 6c 6f  %i", fd);...fclo
42d0: 73 65 28 66 70 29 3b 0a 0a 09 72 65 74 75 72 6e  se(fp);...return
42e0: 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20 69  ;.}../* Handle i
42f0: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
4300: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
4310: 69 64 20 2a 66 69 6c 65 64 5f 77 6f 72 6b 65 72  id *filed_worker
4320: 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a 61 72  _thread(void *ar
4330: 67 5f 76 29 20 7b 0a 09 73 74 72 75 63 74 20 66  g_v) {..struct f
4340: 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65  iled_worker_thre
4350: 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a 09 73  ad_args *arg;..s
4360: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
4370: 5f 72 65 71 75 65 73 74 20 72 65 71 75 65 73 74  _request request
4380: 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ;..struct sockad
4390: 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a 09 63 68  dr_in6 addr;..ch
43a0: 61 72 20 6c 6f 67 62 75 66 5b 31 32 38 5d 3b 0a  ar logbuf[128];.
43b0: 09 73 6f 63 6b 6c 65 6e 5f 74 20 61 64 64 72 6c  .socklen_t addrl
43c0: 65 6e 3b 0a 09 69 6e 74 20 66 61 69 6c 75 72 65  en;..int failure
43d0: 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 6d 61 78 5f  _count = 0, max_
43e0: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20  failure_count = 
43f0: 4d 41 58 5f 46 41 49 4c 55 52 45 5f 43 4f 55 4e  MAX_FAILURE_COUN
4400: 54 3b 0a 09 69 6e 74 20 6d 61 73 74 65 72 5f 66  T;..int master_f
4410: 64 2c 20 66 64 3b 0a 0a 09 2f 2a 20 52 65 61 64  d, fd;.../* Read
4420: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 61   arguments */..a
4430: 72 67 20 3d 20 61 72 67 5f 76 3b 0a 0a 09 6d 61  rg = arg_v;...ma
4440: 73 74 65 72 5f 66 64 20 3d 20 61 72 67 2d 3e 66  ster_fd = arg->f
4450: 64 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b  d;...while (1) {
4460: 0a 09 09 2f 2a 20 46 61 69 6c 75 72 65 20 6c 6f  .../* Failure lo
4470: 6f 70 20 70 72 65 76 65 6e 74 69 6f 6e 20 2a 2f  op prevention */
4480: 0a 09 09 69 66 20 28 66 61 69 6c 75 72 65 5f 63  ...if (failure_c
4490: 6f 75 6e 74 20 3e 20 6d 61 78 5f 66 61 69 6c 75  ount > max_failu
44a0: 72 65 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 62  re_count) {....b
44b0: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  reak;...}..../* 
44c0: 41 63 63 65 70 74 20 61 20 6e 65 77 20 63 6c 69  Accept a new cli
44d0: 65 6e 74 20 2a 2f 0a 09 09 61 64 64 72 6c 65 6e  ent */...addrlen
44e0: 20 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 29 3b   = sizeof(addr);
44f0: 0a 09 09 66 64 20 3d 20 61 63 63 65 70 74 28 6d  ...fd = accept(m
4500: 61 73 74 65 72 5f 66 64 2c 20 28 73 74 72 75 63  aster_fd, (struc
4510: 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26 61  t sockaddr *) &a
4520: 64 64 72 2c 20 26 61 64 64 72 6c 65 6e 29 3b 0a  ddr, &addrlen);.
4530: 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 66 20 77 65  .../*... * If we
4540: 20 66 61 69 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f   fail, make a no
4550: 74 65 20 6f 66 20 69 74 20 73 6f 20 77 65 20 64  te of it so we d
4560: 6f 6e 27 74 20 67 6f 20 69 6e 74 6f 20 61 20 6c  on't go into a l
4570: 6f 6f 70 20 6f 66 0a 09 09 20 2a 20 61 63 63 65  oop of... * acce
4580: 70 74 28 29 20 66 61 69 6c 69 6e 67 0a 09 09 20  pt() failing... 
4590: 2a 2f 0a 09 09 69 66 20 28 66 64 20 3c 20 30 29  */...if (fd < 0)
45a0: 20 7b 0a 09 09 09 2f 2a 20 4c 6f 67 20 74 68 65   {..../* Log the
45b0: 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
45c0: 2a 2f 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  */....filed_log_
45d0: 6d 73 67 28 22 41 43 43 45 50 54 5f 46 41 49 4c  msg("ACCEPT_FAIL
45e0: 45 44 22 29 3b 0a 0a 09 09 09 66 61 69 6c 75 72  ED");.....failur
45f0: 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 63  e_count++;.....c
4600: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
4610: 2f 2a 20 4c 6f 67 20 74 68 65 20 6e 65 77 20 63  /* Log the new c
4620: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09 09 6c  onnection */...l
4630: 6f 67 62 75 66 5b 30 5d 3d 27 5c 30 27 3b 0a 09  ogbuf[0]='\0';..
4640: 09 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e  .inet_ntop(AF_IN
4650: 45 54 36 2c 20 26 61 64 64 72 2e 73 69 6e 36 5f  ET6, &addr.sin6_
4660: 61 64 64 72 2c 20 6c 6f 67 62 75 66 2c 20 73 69  addr, logbuf, si
4670: 7a 65 6f 66 28 6c 6f 67 62 75 66 29 29 3b 0a 09  zeof(logbuf));..
4680: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22  .filed_log_msg("
4690: 4e 45 57 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 53  NEW_CONNECTION S
46a0: 52 43 5f 41 44 44 52 3d 25 73 20 53 52 43 5f 50  RC_ADDR=%s SRC_P
46b0: 4f 52 54 3d 25 6c 75 20 46 44 3d 25 69 22 2c 20  ORT=%lu FD=%i", 
46c0: 6c 6f 67 62 75 66 2c 20 28 75 6e 73 69 67 6e 65  logbuf, (unsigne
46d0: 64 20 6c 6f 6e 67 29 20 61 64 64 72 2e 73 69 6e  d long) addr.sin
46e0: 36 5f 70 6f 72 74 2c 20 66 64 29 3b 0a 0a 09 09  6_port, fd);....
46f0: 2f 2a 20 52 65 73 65 74 20 66 61 69 6c 75 72 65  /* Reset failure
4700: 20 63 6f 75 6e 74 2a 2f 0a 09 09 66 61 69 6c 75   count*/...failu
4710: 72 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  re_count = 0;...
4720: 09 2f 2a 20 48 61 6e 64 6c 65 20 73 6f 63 6b 65  ./* Handle socke
4730: 74 20 2a 2f 0a 09 09 66 69 6c 65 64 5f 68 61 6e  t */...filed_han
4740: 64 6c 65 5f 63 6c 69 65 6e 74 28 66 64 2c 20 26  dle_client(fd, &
4750: 72 65 71 75 65 73 74 29 3b 0a 09 7d 0a 0a 09 2f  request);..}.../
4760: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 20 2a  * Report error *
4770: 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  /..filed_log_msg
4780: 28 22 54 48 52 45 41 44 5f 44 49 45 44 20 41 42  ("THREAD_DIED AB
4790: 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72 65 74 75  NORMAL");...retu
47a0: 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 20  rn(NULL);.}../* 
47b0: 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20 74 68  Create worker th
47c0: 72 65 61 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  reads */.static 
47d0: 69 6e 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  int filed_worker
47e0: 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28 69 6e  _threads_init(in
47f0: 74 20 66 64 2c 20 69 6e 74 20 74 68 72 65 61 64  t fd, int thread
4800: 5f 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  _count) {..struc
4810: 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74  t filed_worker_t
4820: 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b  hread_args *arg;
4830: 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68 72 65  ..pthread_t thre
4840: 61 64 69 64 3b 0a 09 69 6e 74 20 70 74 68 72 65  adid;..int pthre
4850: 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69 3b 0a  ad_ret;..int i;.
4860: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
4870: 3c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 3b 20  < thread_count; 
4880: 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d 20 6d  i++) {...arg = m
4890: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 61 72  alloc(sizeof(*ar
48a0: 67 29 29 3b 0a 0a 09 09 61 72 67 2d 3e 66 64 20  g));....arg->fd 
48b0: 3d 20 66 64 3b 0a 0a 09 09 70 74 68 72 65 61 64  = fd;....pthread
48c0: 5f 72 65 74 20 3d 20 70 74 68 72 65 61 64 5f 63  _ret = pthread_c
48d0: 72 65 61 74 65 28 26 74 68 72 65 61 64 69 64 2c  reate(&threadid,
48e0: 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 77 6f 72   NULL, filed_wor
48f0: 6b 65 72 5f 74 68 72 65 61 64 2c 20 61 72 67 29  ker_thread, arg)
4900: 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
4910: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72  ret != 0) {....r
4920: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
4930: 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  }...return(0);.}
4940: 0a 0a 2f 2a 20 44 69 73 70 6c 61 79 20 68 65 6c  ../* Display hel
4950: 70 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  p */.static void
4960: 20 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c   filed_print_hel
4970: 70 28 46 49 4c 45 20 2a 6f 75 74 70 75 74 2c 20  p(FILE *output, 
4980: 69 6e 74 20 6c 6f 6e 67 5f 68 65 6c 70 2c 20 63  int long_help, c
4990: 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 74 72 61  onst char *extra
49a0: 29 20 7b 0a 09 69 66 20 28 65 78 74 72 61 29 20  ) {..if (extra) 
49b0: 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  {...fprintf(outp
49c0: 75 74 2c 20 22 25 73 5c 6e 22 2c 20 65 78 74 72  ut, "%s\n", extr
49d0: 61 29 3b 0a 09 7d 0a 0a 09 66 70 72 69 6e 74 66  a);..}...fprintf
49e0: 28 6f 75 74 70 75 74 2c 20 22 55 73 61 67 65 3a  (output, "Usage:
49f0: 20 66 69 6c 65 64 20 5b 3c 6f 70 74 69 6f 6e 73   filed [<options
4a00: 3e 5d 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  >]\n");..fprintf
4a10: 28 6f 75 74 70 75 74 2c 20 22 20 20 4f 70 74 69  (output, "  Opti
4a20: 6f 6e 73 3a 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  ons:\n");..fprin
4a30: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
4a40: 20 20 2d 68 2c 20 2d 2d 68 65 6c 70 5c 6e 22 29    -h, --help\n")
4a50: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
4a60: 74 2c 20 22 20 20 20 20 20 20 2d 64 2c 20 2d 2d  t, "      -d, --
4a70: 64 61 65 6d 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72  daemon\n");..fpr
4a80: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
4a90: 20 20 20 20 2d 62 20 3c 61 64 64 72 65 73 73 3e      -b <address>
4aa0: 2c 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72 65 73  , --bind <addres
4ab0: 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  s>\n");..fprintf
4ac0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
4ad0: 2d 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f 72  -p <port>, --por
4ae0: 74 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09 66  t <port>\n");..f
4af0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4b00: 20 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e 74 3e        -t <count>
4b10: 2c 20 2d 2d 74 68 72 65 61 64 73 20 3c 63 6f 75  , --threads <cou
4b20: 6e 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  nt>\n");..fprint
4b30: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
4b40: 20 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c 20 2d   -c <entries>, -
4b50: 2d 63 61 63 68 65 20 3c 65 6e 74 72 69 65 73 3e  -cache <entries>
4b60: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
4b70: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 75  utput, "      -u
4b80: 20 3c 75 73 65 72 3e 2c 20 2d 2d 75 73 65 72 20   <user>, --user 
4b90: 3c 75 73 65 72 3e 5c 6e 22 29 3b 0a 09 66 70 72  <user>\n");..fpr
4ba0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
4bb0: 20 20 20 20 2d 72 20 3c 64 69 72 65 63 74 6f 72      -r <director
4bc0: 79 3e 2c 20 2d 2d 72 6f 6f 74 20 3c 64 69 72 65  y>, --root <dire
4bd0: 63 74 6f 72 79 3e 5c 6e 22 29 3b 0a 0a 09 69 66  ctory>\n");...if
4be0: 20 28 6c 6f 6e 67 5f 68 65 6c 70 29 20 7b 0a 09   (long_help) {..
4bf0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
4c00: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
4c10: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 55 73 61  f(output, "  Usa
4c20: 67 65 3a 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ge:\n");...fprin
4c30: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
4c40: 20 20 2d 68 20 28 6f 72 20 2d 2d 68 65 6c 70 29    -h (or --help)
4c50: 20 70 72 69 6e 74 73 20 74 68 69 73 20 75 73 61   prints this usa
4c60: 67 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  ge information\n
4c70: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
4c80: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
4c90: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4ca0: 20 20 20 20 20 20 2d 64 20 28 6f 72 20 2d 2d 64        -d (or --d
4cb0: 61 65 6d 6f 6e 29 20 69 6e 73 74 72 75 63 74 73  aemon) instructs
4cc0: 20 66 69 6c 65 64 20 74 6f 20 62 65 63 6f 6d 65   filed to become
4cd0: 20 61 20 64 61 65 6d 6f 6e 20 61 66 74 65 72 20   a daemon after 
4ce0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 5c 6e 22 29  initializing\n")
4cf0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
4d00: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
4d20: 6c 69 73 74 65 6e 69 6e 67 20 54 43 50 20 73 6f  listening TCP so
4d30: 63 6b 65 74 20 61 6e 64 20 6c 6f 67 20 66 69 6c  cket and log fil
4d40: 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  es.\n");...fprin
4d50: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
4d60: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
4d70: 75 74 2c 20 22 20 20 20 20 20 20 2d 62 20 28 6f  ut, "      -b (o
4d80: 72 20 2d 2d 62 69 6e 64 29 20 73 70 65 63 69 66  r --bind) specif
4d90: 69 65 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ies the address 
4da0: 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e  to listen for in
4db0: 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b  coming HTTP\n");
4dc0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
4dd0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
4de0: 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73 74           request
4df0: 73 20 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75  s on.  The defau
4e00: 6c 74 20 76 61 6c 75 65 20 69 73 20 5c 22 25 73  lt value is \"%s
4e10: 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f 41 44 44  \".\n", BIND_ADD
4e20: 52 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  R);...fprintf(ou
4e30: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
4e40: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
4e50: 20 20 20 20 20 20 2d 70 20 28 6f 72 20 2d 2d 70        -p (or --p
4e60: 6f 72 74 29 20 73 70 65 63 69 66 69 65 73 20 74  ort) specifies t
4e70: 68 65 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62  he TCP port numb
4e80: 65 72 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72  er to listen for
4e90: 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e   incoming HTTP\n
4ea0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
4eb0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75              requ
4ed0: 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65  ests on.  The de
4ee0: 66 61 75 6c 74 20 69 73 20 25 75 2e 5c 6e 22 2c  fault is %u.\n",
4ef0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
4f00: 50 4f 52 54 29 3b 0a 09 09 66 70 72 69 6e 74 66  PORT);...fprintf
4f10: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
4f20: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
4f30: 2c 20 22 20 20 20 20 20 20 2d 74 20 28 6f 72 20  , "      -t (or 
4f40: 2d 2d 74 68 72 65 61 64 73 29 20 73 70 65 63 69  --threads) speci
4f50: 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
4f60: 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  of worker thread
4f70: 73 20 74 6f 20 63 72 65 61 74 65 2e 20 45 61 63  s to create. Eac
4f80: 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  h\n");...fprintf
4f90: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 20    worker thread 
4fc0: 63 61 6e 20 73 65 72 76 69 63 65 20 6f 6e 65 20  can service one 
4fd0: 63 6f 6e 63 75 72 72 65 6e 74 20 48 54 54 50 20  concurrent HTTP 
4fe0: 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09  session.\n");...
4ff0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
5000: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5010: 20 20 20 20 20 20 20 20 20 54 68 75 73 20 74 68           Thus th
5020: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65  e number of thre
5030: 61 64 73 20 63 72 65 61 74 65 64 20 77 69 6c 6c  ads created will
5040: 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 5c 6e   determine how\n
5050: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
5060: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
5080: 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  any simultaneous
5090: 20 74 72 61 6e 73 66 65 72 73 20 77 69 6c 6c 20   transfers will 
50a0: 62 65 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65  be possible. The
50b0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
50c0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75 2e   default is %lu.
50f0: 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \n", (unsigned l
5100: 6f 6e 67 29 20 54 48 52 45 41 44 5f 43 4f 55 4e  ong) THREAD_COUN
5110: 54 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  T);...fprintf(ou
5120: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
5130: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5140: 20 20 20 20 20 20 2d 63 20 28 6f 72 20 2d 2d 63        -c (or --c
5150: 61 63 68 65 29 20 73 70 65 63 69 66 69 65 73 20  ache) specifies 
5160: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
5170: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  le information c
5180: 61 63 68 65 20 65 6e 74 72 69 65 73 5c 6e 22 29  ache entries\n")
5190: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
51a0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
51b0: 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 6c             to al
51c0: 6c 6f 63 61 74 65 2e 20 20 45 61 63 68 20 63 61  locate.  Each ca
51d0: 63 68 65 20 65 6e 74 72 79 20 68 6f 6c 64 73 20  che entry holds 
51e0: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
51f0: 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e   as\n");...fprin
5200: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5220: 20 20 77 65 6c 6c 20 61 73 20 61 6e 20 6f 70 65    well as an ope
5230: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
5240: 72 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 73  r to the file, s
5250: 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22 29 3b 0a  o resource\n");.
5260: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5270: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
5280: 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 73 20           limits 
5290: 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74 29 20 73  (i.e., ulimit) s
52a0: 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73 69 64 65  hould be conside
52b0: 72 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  red.  This shoul
52c0: 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  d\n");...fprintf
52d0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 62 65 20 61 20 70 72 69 6d 65 20 6e 75 6d 62 65  be a prime numbe
5300: 72 20 66 6f 72 20 69 64 65 61 6c 20 75 73 65 20  r for ideal use 
5310: 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b 75 70 20  with the lookup 
5320: 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a 09 09 66  method.\n");...f
5330: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75 6c        The defaul
5360: 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75  t is %lu.\n", (u
5370: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
5380: 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09 66 70 72  CHE_SIZE);...fpr
5390: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e  intf(output, "\n
53a0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
53b0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 75 20  tput, "      -u 
53c0: 28 6f 72 20 2d 2d 75 73 65 72 29 20 73 70 65 63  (or --user) spec
53d0: 69 66 69 65 73 20 74 68 65 20 75 73 65 72 20 74  ifies the user t
53e0: 6f 20 73 77 69 74 63 68 20 75 73 65 72 20 49 44  o switch user ID
53f0: 73 20 74 6f 20 62 65 66 6f 72 65 20 73 65 72 76  s to before serv
5400: 69 63 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72  icing\n");...fpr
5410: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 72 65 71 75 65 73 74 73 2e 20 20 54 68     requests.  Th
5440: 65 20 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74  e default is not
5450: 20 63 68 61 6e 67 65 20 75 73 65 72 20 49 44 73   change user IDs
5460: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
5470: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
5480: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5490: 2c 20 22 20 20 20 20 20 20 2d 72 20 28 6f 72 20  , "      -r (or 
54a0: 2d 2d 72 6f 6f 74 29 20 73 70 65 63 69 66 69 65  --root) specifie
54b0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
54c0: 74 6f 20 61 63 74 20 61 73 20 74 68 65 20 72 6f  to act as the ro
54d0: 6f 74 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  ot directory for
54e0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
54f0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
5510: 65 20 66 69 6c 65 20 73 65 72 76 65 72 2e 20 20  e file server.  
5520: 49 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69  If this option i
5530: 73 20 73 70 65 63 69 66 69 65 64 2c 20 63 68 72  s specified, chr
5540: 6f 6f 74 28 32 29 5c 6e 22 29 3b 0a 09 09 66 70  oot(2)\n");...fp
5550: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 20 20 20 69 73 20 63 61 6c 6c 65 64 2e 20 20      is called.  
5580: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 6e  The default is n
5590: 6f 74 20 63 68 61 6e 67 65 20 72 6f 6f 74 20 64  ot change root d
55a0: 69 72 65 63 74 6f 72 69 65 73 2c 5c 6e 22 29 3b  irectories,\n");
55b0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
55c0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
55d0: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 73           that is
55e0: 2c 20 74 68 65 20 5c 22 2f 5c 22 20 64 69 72 65  , the \"/\" dire
55f0: 63 74 6f 72 79 20 69 73 20 73 68 61 72 65 64 20  ctory is shared 
5600: 6f 75 74 2e 20 20 54 68 69 73 20 77 69 6c 6c 5c  out.  This will\
5610: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5620: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6b               lik
5640: 65 6c 79 20 62 65 20 61 20 73 65 63 75 72 69 74  ely be a securit
5650: 79 20 69 73 73 75 65 2c 20 73 6f 20 74 68 69 73  y issue, so this
5660: 20 6f 70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61   option should a
5670: 6c 77 61 79 73 5c 6e 22 29 3b 0a 09 09 66 70 72  lways\n");...fpr
5680: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 20 62 65 20 75 73 65 64 2e 5c 6e 22 29 3b     be used.\n");
56b0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ..}...return;.}.
56c0: 0a 2f 2a 20 41 64 64 20 61 20 67 65 74 6f 70 74  ./* Add a getopt
56d0: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69   option */.stati
56e0: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 67 65 74  c void filed_get
56f0: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
5700: 73 74 72 75 63 74 20 6f 70 74 69 6f 6e 20 2a 6f  struct option *o
5710: 70 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pt, const char *
5720: 6e 61 6d 65 2c 20 69 6e 74 20 68 61 73 5f 61 72  name, int has_ar
5730: 67 2c 20 69 6e 74 20 76 61 6c 29 20 7b 0a 09 6f  g, int val) {..o
5740: 70 74 2d 3e 6e 61 6d 65 20 20 20 20 20 3d 20 6e  pt->name     = n
5750: 61 6d 65 3b 0a 09 6f 70 74 2d 3e 68 61 73 5f 61  ame;..opt->has_a
5760: 72 67 20 20 3d 20 68 61 73 5f 61 72 67 3b 0a 09  rg  = has_arg;..
5770: 6f 70 74 2d 3e 66 6c 61 67 20 20 20 20 20 3d 20  opt->flag     = 
5780: 4e 55 4c 4c 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20  NULL;..opt->val 
5790: 20 20 20 20 20 3d 20 76 61 6c 3b 0a 0a 09 72 65       = val;...re
57a0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f  turn;.}../* Reso
57b0: 6c 76 65 20 61 20 75 73 65 72 6e 61 6d 65 20 74  lve a username t
57c0: 6f 20 61 20 55 49 44 20 2a 2f 0a 73 74 61 74 69  o a UID */.stati
57d0: 63 20 69 6e 74 20 66 69 6c 65 64 5f 75 73 65 72  c int filed_user
57e0: 5f 6c 6f 6f 6b 75 70 28 63 6f 6e 73 74 20 63 68  _lookup(const ch
57f0: 61 72 20 2a 75 73 65 72 2c 20 75 69 64 5f 74 20  ar *user, uid_t 
5800: 2a 75 73 65 72 5f 69 64 29 20 7b 0a 09 63 68 61  *user_id) {..cha
5810: 72 20 2a 6e 65 78 74 3b 0a 09 75 69 64 5f 74 20  r *next;..uid_t 
5820: 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 23  user_id_check;.#
5830: 69 66 6e 64 65 66 20 46 49 4c 45 44 5f 4e 4f 5f  ifndef FILED_NO_
5840: 47 45 54 50 57 4e 41 4d 0a 09 73 74 72 75 63 74  GETPWNAM..struct
5850: 20 70 61 73 73 77 64 20 2a 65 6e 74 3b 0a 0a 09   passwd *ent;...
5860: 65 6e 74 20 3d 20 67 65 74 70 77 6e 61 6d 28 75  ent = getpwnam(u
5870: 73 65 72 29 3b 0a 09 69 66 20 28 65 6e 74 20 21  ser);..if (ent !
5880: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 75 73 65  = NULL) {...*use
5890: 72 5f 69 64 20 3d 20 65 6e 74 2d 3e 70 77 5f 75  r_id = ent->pw_u
58a0: 69 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30 29  id;....return(0)
58b0: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 75 73  ;..}.#endif...us
58c0: 65 72 5f 69 64 5f 63 68 65 63 6b 20 3d 20 73 74  er_id_check = st
58d0: 72 74 6f 75 6c 6c 28 75 73 65 72 2c 20 26 6e 65  rtoull(user, &ne
58e0: 78 74 2c 20 31 30 29 3b 0a 09 69 66 20 28 6e 65  xt, 10);..if (ne
58f0: 78 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  xt == NULL) {...
5900: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
5910: 69 66 20 28 6e 65 78 74 5b 30 5d 20 21 3d 20 27  if (next[0] != '
5920: 5c 30 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  \0') {...return(
5930: 31 29 3b 0a 09 7d 0a 0a 09 2a 75 73 65 72 5f 69  1);..}...*user_i
5940: 64 20 3d 20 75 73 65 72 5f 69 64 5f 63 68 65 63  d = user_id_chec
5950: 6b 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  k;...return(0);.
5960: 7d 0a 0a 2f 2a 20 44 61 65 6d 6f 6e 69 7a 65 20  }../* Daemonize 
5970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
5980: 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 76 6f  led_daemonize(vo
5990: 69 64 29 20 7b 0a 09 70 69 64 5f 74 20 73 65 74  id) {..pid_t set
59a0: 73 69 64 5f 72 65 74 2c 20 66 6f 72 6b 5f 72 65  sid_ret, fork_re
59b0: 74 3b 0a 09 69 6e 74 20 63 68 64 69 72 5f 72 65  t;..int chdir_re
59c0: 74 2c 20 64 75 70 32 5f 72 65 74 3b 0a 09 69 6e  t, dup2_ret;..in
59d0: 74 20 66 64 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b  t fd_in, fd_out;
59e0: 0a 0a 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63  ...chdir_ret = c
59f0: 68 64 69 72 28 22 2f 22 29 3b 0a 09 69 66 20 28  hdir("/");..if (
5a00: 63 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29 20  chdir_ret != 0) 
5a10: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
5a20: 7d 0a 0a 09 66 6f 72 6b 5f 72 65 74 20 3d 20 66  }...fork_ret = f
5a30: 6f 72 6b 28 29 3b 0a 09 69 66 20 28 66 6f 72 6b  ork();..if (fork
5a40: 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65  _ret < 0) {...re
5a50: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
5a60: 20 28 66 6f 72 6b 5f 72 65 74 20 3e 20 30 29 20   (fork_ret > 0) 
5a70: 7b 0a 09 09 2f 2a 20 50 61 72 65 6e 74 20 2a 2f  {.../* Parent */
5a80: 0a 09 09 77 61 69 74 70 69 64 28 66 6f 72 6b 5f  ...waitpid(fork_
5a90: 72 65 74 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  ret, NULL, 0);..
5aa0: 09 09 65 78 69 74 28 45 58 49 54 5f 53 55 43 43  ..exit(EXIT_SUCC
5ab0: 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68  ESS);..}.../* Ch
5ac0: 69 6c 64 20 2a 2f 0a 09 69 66 20 28 66 6f 72 6b  ild */..if (fork
5ad0: 28 29 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  () != 0) {.../* 
5ae0: 43 68 69 6c 64 20 2a 2f 0a 09 09 65 78 69 74 28  Child */...exit(
5af0: 45 58 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09  EXIT_SUCCESS);..
5b00: 7d 0a 0a 09 2f 2a 20 47 72 61 6e 64 20 63 68 69  }.../* Grand chi
5b10: 6c 64 20 2a 2f 0a 09 73 65 74 73 69 64 5f 72 65  ld */..setsid_re
5b20: 74 20 3d 20 73 65 74 73 69 64 28 29 3b 0a 09 69  t = setsid();..i
5b30: 66 20 28 73 65 74 73 69 64 5f 72 65 74 20 3d 3d  f (setsid_ret ==
5b40: 20 28 28 70 69 64 5f 74 29 20 2d 31 29 29 20 7b   ((pid_t) -1)) {
5b50: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
5b60: 0a 0a 09 66 64 5f 69 6e 20 3d 20 6f 70 65 6e 28  ...fd_in = open(
5b70: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52  "/dev/null", O_R
5b80: 44 4f 4e 4c 59 29 3b 0a 09 66 64 5f 6f 75 74 20  DONLY);..fd_out 
5b90: 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c  = open("/dev/nul
5ba0: 6c 22 2c 20 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09  l", O_WRONLY);..
5bb0: 69 66 20 28 66 64 5f 69 6e 20 3c 20 30 20 7c 7c  if (fd_in < 0 ||
5bc0: 20 66 64 5f 6f 75 74 20 3c 20 30 29 20 7b 0a 09   fd_out < 0) {..
5bd0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
5be0: 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32  .dup2_ret = dup2
5bf0: 28 66 64 5f 69 6e 2c 20 53 54 44 49 4e 5f 46 49  (fd_in, STDIN_FI
5c00: 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32  LENO);..if (dup2
5c10: 5f 72 65 74 20 21 3d 20 53 54 44 49 4e 5f 46 49  _ret != STDIN_FI
5c20: 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e  LENO) {...return
5c30: 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72  (1);..}...dup2_r
5c40: 65 74 20 3d 20 64 75 70 32 28 66 64 5f 6f 75 74  et = dup2(fd_out
5c50: 2c 20 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29  , STDOUT_FILENO)
5c60: 3b 0a 09 69 66 20 28 64 75 70 32 5f 72 65 74 20  ;..if (dup2_ret 
5c70: 21 3d 20 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f  != STDOUT_FILENO
5c80: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
5c90: 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d  ..}...dup2_ret =
5ca0: 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54   dup2(fd_out, ST
5cb0: 44 45 52 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69  DERR_FILENO);..i
5cc0: 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53  f (dup2_ret != S
5cd0: 54 44 45 52 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a  TDERR_FILENO) {.
5ce0: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
5cf0: 0a 09 63 6c 6f 73 65 28 66 64 5f 69 6e 29 3b 0a  ..close(fd_in);.
5d00: 09 63 6c 6f 73 65 28 66 64 5f 6f 75 74 29 3b 0a  .close(fd_out);.
5d10: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
5d20: 2f 2a 20 52 75 6e 20 70 72 6f 63 65 73 73 20 2a  /* Run process *
5d30: 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  /.int main(int a
5d40: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
5d50: 29 20 7b 0a 09 73 74 72 75 63 74 20 6f 70 74 69  ) {..struct opti
5d60: 6f 6e 20 6f 70 74 69 6f 6e 73 5b 39 5d 3b 0a 09  on options[9];..
5d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 69 6e 64  const char *bind
5d80: 5f 61 64 64 72 20 3d 20 42 49 4e 44 5f 41 44 44  _addr = BIND_ADD
5d90: 52 2c 20 2a 6e 65 77 72 6f 6f 74 20 3d 20 4e 55  R, *newroot = NU
5da0: 4c 4c 2c 20 2a 6c 6f 67 5f 66 69 6c 65 20 3d 20  LL, *log_file = 
5db0: 4c 4f 47 5f 46 49 4c 45 3b 0a 09 75 69 64 5f 74  LOG_FILE;..uid_t
5dc0: 20 75 73 65 72 20 3d 20 30 3b 0a 09 69 6e 74 20   user = 0;..int 
5dd0: 70 6f 72 74 20 3d 20 50 4f 52 54 2c 20 74 68 72  port = PORT, thr
5de0: 65 61 64 5f 63 6f 75 6e 74 20 3d 20 54 48 52 45  ead_count = THRE
5df0: 41 44 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 63  AD_COUNT;..int c
5e00: 61 63 68 65 5f 73 69 7a 65 20 3d 20 43 41 43 48  ache_size = CACH
5e10: 45 5f 53 49 5a 45 3b 0a 09 69 6e 74 20 69 6e 69  E_SIZE;..int ini
5e20: 74 5f 72 65 74 2c 20 63 68 72 6f 6f 74 5f 72 65  t_ret, chroot_re
5e30: 74 2c 20 73 65 74 75 69 64 5f 72 65 74 2c 20 6c  t, setuid_ret, l
5e40: 6f 6f 6b 75 70 5f 72 65 74 2c 20 63 68 64 69 72  ookup_ret, chdir
5e50: 5f 72 65 74 3b 0a 09 69 6e 74 20 73 65 74 75 69  _ret;..int setui
5e60: 64 5f 65 6e 61 62 6c 65 64 20 3d 20 30 2c 20 64  d_enabled = 0, d
5e70: 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20  aemon_enabled = 
5e80: 30 3b 0a 09 69 6e 74 20 63 68 3b 0a 09 69 6e 74  0;..int ch;..int
5e90: 20 66 64 3b 0a 0a 09 2f 2a 20 50 72 6f 63 65 73   fd;.../* Proces
5ea0: 73 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09  s arguments */..
5eb0: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
5ec0: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
5ed0: 73 5b 30 5d 2c 20 22 70 6f 72 74 22 2c 20 72 65  s[0], "port", re
5ee0: 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c  quired_argument,
5ef0: 20 27 70 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'p');..filed_ge
5f00: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
5f10: 28 26 6f 70 74 69 6f 6e 73 5b 31 5d 2c 20 22 74  (&options[1], "t
5f20: 68 72 65 61 64 73 22 2c 20 72 65 71 75 69 72 65  hreads", require
5f30: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 74 27 29  d_argument, 't')
5f40: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
5f50: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
5f60: 69 6f 6e 73 5b 32 5d 2c 20 22 63 61 63 68 65 22  ions[2], "cache"
5f70: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
5f80: 65 6e 74 2c 20 27 63 27 29 3b 0a 09 66 69 6c 65  ent, 'c');..file
5f90: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
5fa0: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 33 5d  topt(&options[3]
5fb0: 2c 20 22 62 69 6e 64 22 2c 20 72 65 71 75 69 72  , "bind", requir
5fc0: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 62 27  ed_argument, 'b'
5fd0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
5fe0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
5ff0: 74 69 6f 6e 73 5b 34 5d 2c 20 22 75 73 65 72 22  tions[4], "user"
6000: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
6010: 65 6e 74 2c 20 27 75 27 29 3b 0a 09 66 69 6c 65  ent, 'u');..file
6020: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
6030: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 35 5d  topt(&options[5]
6040: 2c 20 22 72 6f 6f 74 22 2c 20 72 65 71 75 69 72  , "root", requir
6050: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 72 27  ed_argument, 'r'
6060: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
6070: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
6080: 74 69 6f 6e 73 5b 36 5d 2c 20 22 68 65 6c 70 22  tions[6], "help"
6090: 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27  , no_argument, '
60a0: 68 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  h');..filed_geto
60b0: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
60c0: 6f 70 74 69 6f 6e 73 5b 37 5d 2c 20 22 64 61 65  options[7], "dae
60d0: 6d 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e  mon", no_argumen
60e0: 74 2c 20 27 64 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'd');..filed_
60f0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
6100: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 38 5d 2c 20  pt(&options[8], 
6110: 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 09 77 68  NULL, 0, 0);..wh
6120: 69 6c 65 20 28 28 63 68 20 3d 20 67 65 74 6f 70  ile ((ch = getop
6130: 74 5f 6c 6f 6e 67 28 61 72 67 63 2c 20 61 72 67  t_long(argc, arg
6140: 76 2c 20 22 70 3a 74 3a 63 3a 62 3a 75 3a 72 3a  v, "p:t:c:b:u:r:
6150: 68 64 22 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e 55  hd", options, NU
6160: 4c 4c 29 29 20 21 3d 20 2d 31 29 20 7b 0a 09 09  LL)) != -1) {...
6170: 73 77 69 74 63 68 28 63 68 29 20 7b 0a 09 09 09  switch(ch) {....
6180: 63 61 73 65 20 27 70 27 3a 0a 09 09 09 09 70 6f  case 'p':.....po
6190: 72 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67  rt = atoi(optarg
61a0: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
61b0: 09 63 61 73 65 20 27 74 27 3a 0a 09 09 09 09 74  .case 't':.....t
61c0: 68 72 65 61 64 5f 63 6f 75 6e 74 20 3d 20 61 74  hread_count = at
61d0: 6f 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09  oi(optarg);.....
61e0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27  break;....case '
61f0: 63 27 3a 0a 09 09 09 09 63 61 63 68 65 5f 73 69  c':.....cache_si
6200: 7a 65 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67  ze = atoi(optarg
6210: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
6220: 09 63 61 73 65 20 27 62 27 3a 0a 09 09 09 09 62  .case 'b':.....b
6230: 69 6e 64 5f 61 64 64 72 20 3d 20 73 74 72 64 75  ind_addr = strdu
6240: 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  p(optarg);.....b
6250: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 75  reak;....case 'u
6260: 27 3a 0a 09 09 09 09 73 65 74 75 69 64 5f 65 6e  ':.....setuid_en
6270: 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 6c  abled = 1;.....l
6280: 6f 6f 6b 75 70 5f 72 65 74 20 3d 20 66 69 6c 65  ookup_ret = file
6290: 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f 70  d_user_lookup(op
62a0: 74 61 72 67 2c 20 26 75 73 65 72 29 3b 0a 09 09  targ, &user);...
62b0: 09 09 69 66 20 28 6c 6f 6f 6b 75 70 5f 72 65 74  ..if (lookup_ret
62c0: 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 66 69   != 0) {......fi
62d0: 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73  led_print_help(s
62e0: 74 64 65 72 72 2c 20 30 2c 20 22 49 6e 76 61 6c  tderr, 0, "Inval
62f0: 69 64 20 75 73 65 72 6e 61 6d 65 20 73 70 65 63  id username spec
6300: 69 66 69 65 64 22 29 3b 0a 0a 09 09 09 09 09 72  ified");.......r
6310: 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 09 7d 0a  eturn(1);.....}.
6320: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
6330: 73 65 20 27 72 27 3a 0a 09 09 09 09 6e 65 77 72  se 'r':.....newr
6340: 6f 6f 74 20 3d 20 73 74 72 64 75 70 28 6f 70 74  oot = strdup(opt
6350: 61 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  arg);.....break;
6360: 0a 09 09 09 63 61 73 65 20 27 64 27 3a 0a 09 09  ....case 'd':...
6370: 09 09 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64  ..daemon_enabled
6380: 20 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b   = 1;.....break;
6390: 0a 09 09 09 63 61 73 65 20 27 3f 27 3a 0a 09 09  ....case '?':...
63a0: 09 63 61 73 65 20 27 3a 27 3a 0a 09 09 09 09 66  .case ':':.....f
63b0: 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28  iled_print_help(
63c0: 73 74 64 65 72 72 2c 20 30 2c 20 4e 55 4c 4c 29  stderr, 0, NULL)
63d0: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29  ;......return(1)
63e0: 3b 0a 09 09 09 63 61 73 65 20 27 68 27 3a 0a 09  ;....case 'h':..
63f0: 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68  ...filed_print_h
6400: 65 6c 70 28 73 74 64 6f 75 74 2c 20 31 2c 20 4e  elp(stdout, 1, N
6410: 55 4c 4c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  ULL);......retur
6420: 6e 28 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(0);...}..}.../
6430: 2a 20 43 72 65 61 74 65 20 6c 69 73 74 65 6e 69  * Create listeni
6440: 6e 67 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 66 64  ng socket */..fd
6450: 20 3d 20 66 69 6c 65 64 5f 6c 69 73 74 65 6e 28   = filed_listen(
6460: 62 69 6e 64 5f 61 64 64 72 2c 20 70 6f 72 74 29  bind_addr, port)
6470: 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b  ;..if (fd < 0) {
6480: 0a 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64  ...perror("filed
6490: 5f 6c 69 73 74 65 6e 22 29 3b 0a 0a 09 09 72 65  _listen");....re
64a0: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  turn(1);..}.../*
64b0: 20 43 68 72 6f 6f 74 2c 20 69 66 20 61 70 70 72   Chroot, if appr
64c0: 6f 70 72 69 61 74 65 20 2a 2f 0a 09 69 66 20 28  opriate */..if (
64d0: 6e 65 77 72 6f 6f 74 29 20 7b 0a 09 09 63 68 64  newroot) {...chd
64e0: 69 72 5f 72 65 74 20 3d 20 63 68 64 69 72 28 6e  ir_ret = chdir(n
64f0: 65 77 72 6f 6f 74 29 3b 0a 09 09 69 66 20 28 63  ewroot);...if (c
6500: 68 64 69 72 5f 72 65 74 20 21 3d 20 30 29 20 7b  hdir_ret != 0) {
6510: 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68 64 69  ....perror("chdi
6520: 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  r");.....return(
6530: 31 29 3b 0a 09 09 7d 0a 0a 09 09 63 68 72 6f 6f  1);...}....chroo
6540: 74 5f 72 65 74 20 3d 20 63 68 72 6f 6f 74 28 22  t_ret = chroot("
6550: 2e 22 29 3b 0a 09 09 69 66 20 28 63 68 72 6f 6f  .");...if (chroo
6560: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
6570: 09 70 65 72 72 6f 72 28 22 63 68 72 6f 6f 74 22  .perror("chroot"
6580: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 31 29  );.....return(1)
6590: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 72  ;...}..}.../* Dr
65a0: 6f 70 20 70 72 69 76 69 6c 65 67 65 73 2c 20 69  op privileges, i
65b0: 66 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  f appropriate */
65c0: 0a 09 69 66 20 28 73 65 74 75 69 64 5f 65 6e 61  ..if (setuid_ena
65d0: 62 6c 65 64 29 20 7b 0a 09 09 73 65 74 75 69 64  bled) {...setuid
65e0: 5f 72 65 74 20 3d 20 73 65 74 75 69 64 28 75 73  _ret = setuid(us
65f0: 65 72 29 3b 0a 09 09 69 66 20 28 73 65 74 75 69  er);...if (setui
6600: 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  d_ret != 0) {...
6610: 09 70 65 72 72 6f 72 28 22 73 65 74 75 69 64 22  .perror("setuid"
6620: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 31 29  );.....return(1)
6630: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65  ;...}..}.../* Be
6640: 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 2a 2f  come a daemon */
6650: 0a 09 69 66 20 28 64 61 65 6d 6f 6e 5f 65 6e 61  ..if (daemon_ena
6660: 62 6c 65 64 29 20 7b 0a 09 09 66 69 6c 65 64 5f  bled) {...filed_
6670: 64 61 65 6d 6f 6e 69 7a 65 28 29 3b 0a 09 7d 0a  daemonize();..}.
6680: 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
6690: 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66  */..init_ret = f
66a0: 69 6c 65 64 5f 69 6e 69 74 28 63 61 63 68 65 5f  iled_init(cache_
66b0: 73 69 7a 65 29 3b 0a 09 69 66 20 28 69 6e 69 74  size);..if (init
66c0: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70  _ret != 0) {...p
66d0: 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 69 6e 69  error("filed_ini
66e0: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 33  t");....return(3
66f0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74  );..}.../* Creat
6700: 65 20 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64  e logging thread
6710: 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20   */..init_ret = 
6720: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
6730: 72 65 61 64 5f 69 6e 69 74 28 6c 6f 67 5f 66 69  read_init(log_fi
6740: 6c 65 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  le);..if (init_r
6750: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
6760: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 67 69  ror("filed_loggi
6770: 6e 67 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29  ng_thread_init")
6780: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 34 29 3b 0a  ;....return(4);.
6790: 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 77  .}.../* Create w
67a0: 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f  orker threads */
67b0: 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c  ..init_ret = fil
67c0: 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  ed_worker_thread
67d0: 73 5f 69 6e 69 74 28 66 64 2c 20 74 68 72 65 61  s_init(fd, threa
67e0: 64 5f 63 6f 75 6e 74 29 3b 0a 09 69 66 20 28 69  d_count);..if (i
67f0: 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
6800: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
6810: 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69  worker_threads_i
6820: 6e 69 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  nit");....return
6830: 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69  (4);..}.../* Wai
6840: 74 20 66 6f 72 20 74 68 72 65 61 64 73 20 74 6f  t for threads to
6850: 20 65 78 69 74 20 2a 2f 0a 09 2f 2a 20 58 58 58   exit */../* XXX
6860: 3a 54 4f 44 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74  :TODO: Monitor t
6870: 68 72 65 61 64 20 75 73 61 67 65 20 2a 2f 0a 09  hread usage */..
6880: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 73 6c  while (1) {...sl
6890: 65 65 70 28 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a  eep(60);..}.../*
68a0: 20 52 65 74 75 72 6e 20 69 6e 20 66 61 69 6c 75   Return in failu
68b0: 72 65 20 2a 2f 0a 09 72 65 74 75 72 6e 28 32 29  re */..return(2)
68c0: 3b 0a 7d 0a                                      ;.}.