Hex Artifact Content

Artifact f8f87f81018463ef364da755f503478d4239eb58:


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 56 45 52 53  efine FILED_VERS
01d0: 49 4f 4e 20 22 31 2e 31 22 0a 23 64 65 66 69 6e  ION "1.1".#defin
01e0: 65 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45  e FILED_SENDFILE
01f0: 5f 4d 41 58 20 31 36 37 37 37 32 31 35 0a 23 64  _MAX 16777215.#d
0200: 65 66 69 6e 65 20 46 49 4c 45 44 5f 4d 41 58 5f  efine FILED_MAX_
0210: 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 20 33 30  FAILURE_COUNT 30
0220: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 44 5f 44  .#define FILED_D
0230: 45 46 41 55 4c 54 5f 54 59 50 45 20 22 61 70 70  EFAULT_TYPE "app
0240: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
0250: 74 72 65 61 6d 22 0a 23 64 65 66 69 6e 65 20 46  tream".#define F
0260: 49 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52  ILED_PATH_BUFFER
0270: 5f 53 49 5a 45 20 31 30 31 30 0a 0a 2f 2a 20 44  _SIZE 1010../* D
0280: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 2a 2f  efault values */
0290: 0a 23 64 65 66 69 6e 65 20 50 4f 52 54 20 38 30  .#define PORT 80
02a0: 0a 23 64 65 66 69 6e 65 20 54 48 52 45 41 44 5f  .#define THREAD_
02b0: 43 4f 55 4e 54 20 35 0a 23 64 65 66 69 6e 65 20  COUNT 5.#define 
02c0: 42 49 4e 44 5f 41 44 44 52 20 22 3a 3a 22 0a 23  BIND_ADDR "::".#
02d0: 64 65 66 69 6e 65 20 43 41 43 48 45 5f 53 49 5a  define CACHE_SIZ
02e0: 45 20 38 32 30 39 0a 23 64 65 66 69 6e 65 20 4c  E 8209.#define L
02f0: 4f 47 5f 46 49 4c 45 20 22 2d 22 0a 0a 2f 2a 20  OG_FILE "-"../* 
0300: 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 77 6f  Arguments for wo
0310: 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a  rker threads */.
0320: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77 6f 72  struct filed_wor
0330: 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ker_thread_args 
0340: 7b 0a 09 69 6e 74 20 66 64 3b 0a 7d 3b 0a 0a 2f  {..int fd;.};../
0350: 2a 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  * Arguments for 
0360: 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 73 20  logging threads 
0370: 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f  */.struct filed_
0380: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f 61  logging_thread_a
0390: 72 67 73 20 7b 0a 09 46 49 4c 45 20 2a 66 70 3b  rgs {..FILE *fp;
03a0: 0a 7d 3b 0a 0a 2f 2a 20 46 69 6c 65 20 69 6e 66  .};../* File inf
03b0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 73 74 72 75  ormation */.stru
03c0: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
03d0: 6f 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  o {..pthread_mut
03e0: 65 78 5f 74 20 6d 75 74 65 78 3b 0a 09 63 68 61  ex_t mutex;..cha
03f0: 72 20 2a 70 61 74 68 3b 0a 09 69 6e 74 20 66 64  r *path;..int fd
0400: 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e 3b 0a 09 63  ;..off_t len;..c
0410: 68 61 72 20 2a 6c 61 73 74 6d 6f 64 3b 0a 09 63  har *lastmod;..c
0420: 68 61 72 20 6c 61 73 74 6d 6f 64 5f 62 5b 36 34  har lastmod_b[64
0430: 5d 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a  ];..const char *
0440: 74 79 70 65 3b 0a 7d 3b 0a 0a 2f 2a 20 52 65 71  type;.};../* Req
0450: 75 65 73 74 20 76 61 72 69 61 62 6c 65 73 20 2a  uest variables *
0460: 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68  /.struct filed_h
0470: 74 74 70 5f 72 65 71 75 65 73 74 20 7b 0a 09 2f  ttp_request {../
0480: 2a 2a 20 42 75 66 66 65 72 73 20 2a 2a 2f 0a 09  ** Buffers **/..
0490: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c  struct filed_fil
04a0: 65 69 6e 66 6f 20 66 69 6c 65 69 6e 66 6f 3b 0a  einfo fileinfo;.
04b0: 09 63 68 61 72 20 70 61 74 68 5f 62 5b 46 49 4c  .char path_b[FIL
04c0: 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f 53  ED_PATH_BUFFER_S
04d0: 49 5a 45 5d 3b 0a 09 63 68 61 72 20 74 6d 70 62  IZE];..char tmpb
04e0: 75 66 5b 31 30 31 30 5d 3b 0a 0a 09 2f 2a 2a 20  uf[1010];.../** 
04f0: 48 54 54 50 20 52 65 71 75 65 73 74 20 69 6e 66  HTTP Request inf
0500: 6f 72 6d 61 74 69 6f 6e 20 2a 2a 2f 0a 09 63 68  ormation **/..ch
0510: 61 72 20 2a 70 61 74 68 3b 20 20 20 20 20 2f 2a  ar *path;     /*
0520: 2a 2a 20 50 61 74 68 20 62 65 69 6e 67 20 72 65  ** Path being re
0530: 71 75 65 73 74 65 64 20 2a 2a 2a 2f 0a 0a 09 73  quested ***/...s
0540: 74 72 75 63 74 20 7b 0a 09 09 73 74 72 75 63 74  truct {...struct
0550: 20 7b 0a 09 09 09 69 6e 74 20 70 72 65 73 65 6e   {....int presen
0560: 74 3b 0a 09 09 09 6f 66 66 5f 74 20 6f 66 66 73  t;....off_t offs
0570: 65 74 3b 20 20 20 2f 2a 2a 2a 20 52 61 6e 67 65  et;   /*** Range
0580: 20 73 74 61 72 74 20 2a 2a 2a 2f 0a 09 09 09 6f   start ***/....o
0590: 66 66 5f 74 20 6c 65 6e 67 74 68 3b 20 20 20 2f  ff_t length;   /
05a0: 2a 2a 2a 20 52 61 6e 67 65 20 6c 65 6e 67 74 68  *** Range length
05b0: 20 2a 2a 2a 2f 0a 09 09 7d 20 72 61 6e 67 65 3b   ***/...} range;
05c0: 0a 09 7d 20 68 65 61 64 65 72 73 3b 0a 7d 3b 0a  ..} headers;.};.
05d0: 0a 2f 2a 20 4c 6f 67 20 72 65 63 6f 72 64 20 2a  ./* Log record *
05e0: 2f 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c  /.struct filed_l
05f0: 6f 67 5f 65 6e 74 72 79 20 7b 0a 09 2f 2a 20 54  og_entry {../* T
0600: 79 70 65 20 6f 66 20 6c 6f 67 20 65 6e 74 72 79  ype of log entry
0610: 20 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09 09 46 49   */..enum {...FI
0620: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53  LED_LOG_TYPE_MES
0630: 53 41 47 45 2c 0a 09 09 46 49 4c 45 44 5f 4c 4f  SAGE,...FILED_LO
0640: 47 5f 54 59 50 45 5f 54 52 41 4e 53 46 45 52 0a  G_TYPE_TRANSFER.
0650: 09 7d 20 74 79 70 65 3b 0a 0a 09 2f 2a 20 4c 69  .} type;.../* Li
0660: 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 2f 74  nked list head/t
0670: 61 69 6c 20 2a 2f 0a 09 73 74 72 75 63 74 20 66  ail */..struct f
0680: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a  iled_log_entry *
0690: 5f 6e 65 78 74 3b 0a 09 73 74 72 75 63 74 20 66  _next;..struct f
06a0: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a  iled_log_entry *
06b0: 5f 70 72 65 76 3b 0a 0a 09 2f 2a 20 54 68 72 65  _prev;.../* Thre
06c0: 61 64 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  ad from which th
06d0: 69 73 20 6c 6f 67 20 65 6e 74 72 79 20 65 6d 69  is log entry emi
06e0: 6e 61 74 65 73 20 2a 2f 0a 09 70 74 68 72 65 61  nates */..pthrea
06f0: 64 5f 74 20 74 68 72 65 61 64 3b 0a 0a 09 2f 2a  d_t thread;.../*
0700: 20 4d 65 73 73 61 67 65 20 62 75 66 66 65 72 20   Message buffer 
0710: 66 6f 72 20 74 79 70 65 20 3d 20 4d 45 53 53 41  for type = MESSA
0720: 47 45 20 2a 2f 0a 09 2f 2a 20 50 61 74 68 20 62  GE */../* Path b
0730: 75 66 66 65 72 20 66 6f 72 20 74 79 70 65 20 3d  uffer for type =
0740: 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a 09 63 68   TRANSFER */..ch
0750: 61 72 20 62 75 66 66 65 72 5b 46 49 4c 45 44 5f  ar buffer[FILED_
0760: 50 41 54 48 5f 42 55 46 46 45 52 5f 53 49 5a 45  PATH_BUFFER_SIZE
0770: 5d 3b 0a 0a 09 2f 2a 20 49 74 65 6d 73 20 66 6f  ];.../* Items fo
0780: 72 20 74 79 70 65 20 3d 20 54 52 41 4e 53 46 45  r type = TRANSFE
0790: 52 20 2a 2f 0a 09 69 6e 74 20 68 74 74 70 5f 63  R */..int http_c
07a0: 6f 64 65 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72  ode;..const char
07b0: 20 2a 72 65 61 73 6f 6e 3b 0a 09 74 69 6d 65 5f   *reason;..time_
07c0: 74 20 73 74 61 72 74 74 69 6d 65 3b 0a 09 74 69  t starttime;..ti
07d0: 6d 65 5f 74 20 65 6e 64 74 69 6d 65 3b 0a 09 6f  me_t endtime;..o
07e0: 66 66 5f 74 20 72 65 71 5f 6f 66 66 73 65 74 3b  ff_t req_offset;
07f0: 0a 09 6f 66 66 5f 74 20 72 65 71 5f 6c 65 6e 67  ..off_t req_leng
0800: 74 68 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 74 5f  th;..off_t sent_
0810: 6c 65 6e 67 74 68 3b 0a 09 6f 66 66 5f 74 20 66  length;..off_t f
0820: 69 6c 65 5f 6c 65 6e 67 74 68 3b 0a 09 63 68 61  ile_length;..cha
0830: 72 20 69 70 5b 31 32 38 5d 3b 0a 09 69 6e 74 20  r ip[128];..int 
0840: 70 6f 72 74 3b 0a 7d 3b 0a 0a 2f 2a 20 47 6c 6f  port;.};../* Glo
0850: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  bal variables */
0860: 0a 2f 2a 2a 20 4f 70 65 6e 20 46 69 6c 65 20 63  ./** Open File c
0870: 61 63 68 65 20 2a 2a 2f 0a 73 74 72 75 63 74 20  ache **/.struct 
0880: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a  filed_fileinfo *
0890: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
08a0: 64 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 75  dcache = NULL;.u
08b0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65  nsigned int 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 20 3d 20 30 3b 0a 0a 2f 2a  he_size = 0;../*
08e0: 2a 20 4c 6f 67 67 69 6e 67 20 2a 2a 2f 0a 73 74  * Logging **/.st
08f0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
0900: 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f  ntry *filed_log_
0910: 6d 73 67 5f 6c 69 73 74 3b 0a 70 74 68 72 65 61  msg_list;.pthrea
0920: 64 5f 6d 75 74 65 78 5f 74 20 66 69 6c 65 64 5f  d_mutex_t filed_
0930: 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74  log_msg_list_mut
0940: 65 78 3b 0a 70 74 68 72 65 61 64 5f 63 6f 6e 64  ex;.pthread_cond
0950: 5f 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  _t filed_log_msg
0960: 5f 6c 69 73 74 5f 72 65 61 64 79 3b 0a 0a 2f 2a  _list_ready;../*
0970: 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68   Initialize cach
0980: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
0990: 66 69 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65  filed_init_cache
09a0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  (unsigned int ca
09b0: 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 75 6e 73  che_size) {..uns
09c0: 69 67 6e 65 64 20 69 6e 74 20 69 64 78 3b 0a 09  igned int idx;..
09d0: 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
09e0: 65 74 3b 0a 0a 09 2f 2a 20 43 61 63 68 65 20 6d  et;.../* Cache m
09f0: 61 79 20 6e 6f 74 20 62 65 20 72 65 2d 69 6e 69  ay not be re-ini
0a00: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 09 69 66 20  tialized */..if 
0a10: 28 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  (filed_fileinfo_
0a20: 66 64 63 61 63 68 65 5f 73 69 7a 65 20 21 3d 20  fdcache_size != 
0a30: 30 20 7c 7c 20 66 69 6c 65 64 5f 66 69 6c 65 69  0 || filed_filei
0a40: 6e 66 6f 5f 66 64 63 61 63 68 65 20 21 3d 20 4e  nfo_fdcache != N
0a50: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
0a60: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 6c 6c 6f  1);..}.../* Allo
0a70: 63 61 74 65 20 63 61 63 68 65 20 2a 2f 0a 09 66  cate cache */..f
0a80: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
0a90: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 63 61 63  cache_size = cac
0aa0: 68 65 5f 73 69 7a 65 3b 0a 09 66 69 6c 65 64 5f  he_size;..filed_
0ab0: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
0ac0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
0ad0: 28 2a 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  (*filed_fileinfo
0ae0: 5f 66 64 63 61 63 68 65 29 20 2a 20 66 69 6c 65  _fdcache) * file
0af0: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
0b00: 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 66  he_size);..if (f
0b10: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
0b20: 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  cache == NULL) {
0b30: 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
0b40: 0a 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .../* Initialize
0b50: 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 20 2a   cache entries *
0b60: 2f 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  /..for (idx = 0;
0b70: 20 69 64 78 20 3c 20 66 69 6c 65 64 5f 66 69 6c   idx < filed_fil
0b80: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69  einfo_fdcache_si
0b90: 7a 65 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d  ze; idx++) {...m
0ba0: 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20  utex_init_ret = 
0bb0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
0bc0: 69 74 28 26 66 69 6c 65 64 5f 66 69 6c 65 69 6e  it(&filed_filein
0bd0: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
0be0: 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09  mutex, NULL);...
0bf0: 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72  if (mutex_init_r
0c00: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65  et != 0) {....re
0c10: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09  turn(1);...}....
0c20: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
0c30: 64 63 61 63 68 65 5b 69 64 78 5d 2e 70 61 74 68  dcache[idx].path
0c40: 20 3d 20 73 74 72 64 75 70 28 22 22 29 3b 0a 09   = strdup("");..
0c50: 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f  .filed_fileinfo_
0c60: 66 64 63 61 63 68 65 5b 69 64 78 5d 2e 66 64 20  fdcache[idx].fd 
0c70: 3d 20 2d 31 3b 0a 09 09 66 69 6c 65 64 5f 66 69  = -1;...filed_fi
0c80: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69  leinfo_fdcache[i
0c90: 64 78 5d 2e 6c 61 73 74 6d 6f 64 20 3d 20 22 22  dx].lastmod = ""
0ca0: 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e  ;...filed_filein
0cb0: 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78 5d 2e  fo_fdcache[idx].
0cc0: 74 79 70 65 20 3d 20 22 22 3b 0a 09 7d 0a 0a 09  type = "";..}...
0cd0: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
0ce0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 70 72 6f 63   Initialize proc
0cf0: 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
0d00: 74 20 66 69 6c 65 64 5f 69 6e 69 74 28 75 6e 73  t filed_init(uns
0d10: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 5f  igned int cache_
0d20: 73 69 7a 65 29 20 7b 0a 09 73 74 61 74 69 63 20  size) {..static 
0d30: 69 6e 74 20 63 61 6c 6c 65 64 20 3d 20 30 3b 0a  int called = 0;.
0d40: 09 69 6e 74 20 63 61 63 68 65 5f 72 65 74 3b 0a  .int cache_ret;.
0d50: 0a 09 69 66 20 28 63 61 6c 6c 65 64 29 20 7b 0a  ..if (called) {.
0d60: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
0d70: 0a 09 63 61 6c 6c 65 64 20 3d 20 31 3b 0a 0a 09  ..called = 1;...
0d80: 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c 5f 43 55 52  mlockall(MCL_CUR
0d90: 52 45 4e 54 20 7c 20 4d 43 4c 5f 46 55 54 55 52  RENT | MCL_FUTUR
0da0: 45 29 3b 0a 0a 09 73 69 67 6e 61 6c 28 53 49 47  E);...signal(SIG
0db0: 50 49 50 45 2c 20 53 49 47 5f 49 47 4e 29 3b 0a  PIPE, SIG_IGN);.
0dc0: 0a 09 63 61 63 68 65 5f 72 65 74 20 3d 20 66 69  ..cache_ret = fi
0dd0: 6c 65 64 5f 69 6e 69 74 5f 63 61 63 68 65 28 63  led_init_cache(c
0de0: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 09 69 66 20  ache_size);..if 
0df0: 28 63 61 63 68 65 5f 72 65 74 20 21 3d 20 30 29  (cache_ret != 0)
0e00: 20 7b 0a 09 09 72 65 74 75 72 6e 28 63 61 63 68   {...return(cach
0e10: 65 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 72 65 74  e_ret);..}...ret
0e20: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 4c 69  urn(0);.}../* Li
0e30: 73 74 65 6e 20 6f 6e 20 61 20 70 61 72 74 69 63  sten on a partic
0e40: 75 6c 61 72 20 61 64 64 72 65 73 73 2f 70 6f 72  ular address/por
0e50: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
0e60: 66 69 6c 65 64 5f 6c 69 73 74 65 6e 28 63 6f 6e  filed_listen(con
0e70: 73 74 20 63 68 61 72 20 2a 61 64 64 72 65 73 73  st char *address
0e80: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70  , unsigned int p
0e90: 6f 72 74 29 20 7b 0a 09 73 74 72 75 63 74 20 73  ort) {..struct s
0ea0: 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72  ockaddr_in6 addr
0eb0: 5f 76 36 3b 0a 09 73 74 72 75 63 74 20 73 6f 63  _v6;..struct soc
0ec0: 6b 61 64 64 72 5f 69 6e 20 61 64 64 72 5f 76 34  kaddr_in addr_v4
0ed0: 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61 64  ;..struct sockad
0ee0: 64 72 20 2a 61 64 64 72 3b 0a 09 73 6f 63 6b 6c  dr *addr;..sockl
0ef0: 65 6e 5f 74 20 61 64 64 72 5f 6c 65 6e 3b 0a 09  en_t addr_len;..
0f00: 69 6e 74 20 70 74 6f 6e 5f 72 65 74 2c 20 62 69  int pton_ret, bi
0f10: 6e 64 5f 72 65 74 2c 20 6c 69 73 74 65 6e 5f 72  nd_ret, listen_r
0f20: 65 74 3b 0a 09 69 6e 74 20 66 61 6d 69 6c 79 3b  et;..int family;
0f30: 0a 09 69 6e 74 20 66 64 3b 0a 0a 0a 09 66 61 6d  ..int fd;....fam
0f40: 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a  ily = AF_INET6;.
0f50: 09 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74  .pton_ret = inet
0f60: 5f 70 74 6f 6e 28 66 61 6d 69 6c 79 2c 20 61 64  _pton(family, ad
0f70: 64 72 65 73 73 2c 20 26 61 64 64 72 5f 76 36 2e  dress, &addr_v6.
0f80: 73 69 6e 36 5f 61 64 64 72 2e 73 36 5f 61 64 64  sin6_addr.s6_add
0f90: 72 29 3b 0a 09 69 66 20 28 70 74 6f 6e 5f 72 65  r);..if (pton_re
0fa0: 74 20 21 3d 20 31 29 20 7b 0a 09 09 66 61 6d 69  t != 1) {...fami
0fb0: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 3b 0a 09 09  ly = AF_INET;...
0fc0: 70 74 6f 6e 5f 72 65 74 20 3d 20 69 6e 65 74 5f  pton_ret = inet_
0fd0: 70 74 6f 6e 28 66 61 6d 69 6c 79 2c 20 61 64 64  pton(family, add
0fe0: 72 65 73 73 2c 20 26 61 64 64 72 5f 76 34 2e 73  ress, &addr_v4.s
0ff0: 69 6e 5f 61 64 64 72 2e 73 5f 61 64 64 72 29 3b  in_addr.s_addr);
1000: 0a 09 09 69 66 20 28 70 74 6f 6e 5f 72 65 74 20  ...if (pton_ret 
1010: 21 3d 20 31 29 20 7b 0a 09 09 09 72 65 74 75 72  != 1) {....retur
1020: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 61 64  n(-1);...}....ad
1030: 64 72 5f 76 34 2e 73 69 6e 5f 66 61 6d 69 6c 79  dr_v4.sin_family
1040: 20 3d 20 66 61 6d 69 6c 79 3b 0a 09 09 61 64 64   = family;...add
1050: 72 5f 76 34 2e 73 69 6e 5f 70 6f 72 74 20 3d 20  r_v4.sin_port = 
1060: 68 74 6f 6e 73 28 70 6f 72 74 29 3b 0a 0a 09 09  htons(port);....
1070: 61 64 64 72 20 3d 20 28 73 74 72 75 63 74 20 73  addr = (struct s
1080: 6f 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72  ockaddr *) &addr
1090: 5f 76 34 3b 0a 09 09 61 64 64 72 5f 6c 65 6e 20  _v4;...addr_len 
10a0: 3d 20 73 69 7a 65 6f 66 28 61 64 64 72 5f 76 34  = sizeof(addr_v4
10b0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 61  );..} else {...a
10c0: 64 64 72 5f 76 36 2e 73 69 6e 36 5f 66 61 6d 69  ddr_v6.sin6_fami
10d0: 6c 79 20 3d 20 41 46 5f 49 4e 45 54 36 3b 0a 09  ly = AF_INET6;..
10e0: 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 66 6c  .addr_v6.sin6_fl
10f0: 6f 77 69 6e 66 6f 20 3d 20 30 3b 0a 09 09 61 64  owinfo = 0;...ad
1100: 64 72 5f 76 36 2e 73 69 6e 36 5f 73 63 6f 70 65  dr_v6.sin6_scope
1110: 5f 69 64 20 3d 20 30 3b 0a 09 09 61 64 64 72 5f  _id = 0;...addr_
1120: 76 36 2e 73 69 6e 36 5f 70 6f 72 74 20 3d 20 68  v6.sin6_port = h
1130: 74 6f 6e 73 28 70 6f 72 74 29 3b 0a 0a 09 09 61  tons(port);....a
1140: 64 64 72 20 3d 20 28 73 74 72 75 63 74 20 73 6f  ddr = (struct so
1150: 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72 5f  ckaddr *) &addr_
1160: 76 36 3b 0a 09 09 61 64 64 72 5f 6c 65 6e 20 3d  v6;...addr_len =
1170: 20 73 69 7a 65 6f 66 28 61 64 64 72 5f 76 36 29   sizeof(addr_v6)
1180: 3b 0a 09 7d 0a 0a 09 66 64 20 3d 20 73 6f 63 6b  ;..}...fd = sock
1190: 65 74 28 66 61 6d 69 6c 79 2c 20 53 4f 43 4b 5f  et(family, SOCK_
11a0: 53 54 52 45 41 4d 2c 20 30 29 3b 0a 09 69 66 20  STREAM, 0);..if 
11b0: 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  (fd < 0) {...ret
11c0: 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 62 69  urn(fd);..}...bi
11d0: 6e 64 5f 72 65 74 20 3d 20 62 69 6e 64 28 66 64  nd_ret = bind(fd
11e0: 2c 20 61 64 64 72 2c 20 61 64 64 72 5f 6c 65 6e  , addr, addr_len
11f0: 29 3b 0a 09 69 66 20 28 62 69 6e 64 5f 72 65 74  );..if (bind_ret
1200: 20 3c 20 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28   < 0) {...close(
1210: 66 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  fd);....return(-
1220: 31 29 3b 0a 09 7d 0a 0a 09 6c 69 73 74 65 6e 5f  1);..}...listen_
1230: 72 65 74 20 3d 20 6c 69 73 74 65 6e 28 66 64 2c  ret = listen(fd,
1240: 20 31 32 38 29 3b 0a 09 69 66 20 28 6c 69 73 74   128);..if (list
1250: 65 6e 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  en_ret != 0) {..
1260: 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72  .close(fd);....r
1270: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
1280: 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 2f  return(fd);.}../
1290: 2a 20 4c 6f 67 20 61 20 6d 65 73 73 61 67 65 20  * Log a message 
12a0: 2a 2f 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f  */.#ifdef FILED_
12b0: 44 4f 4e 54 5f 4c 4f 47 0a 23 20 20 64 65 66 69  DONT_LOG.#  defi
12c0: 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  ne filed_logging
12d0: 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 78 29 20  _thread_init(x) 
12e0: 30 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  0.#  define file
12f0: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
1300: 78 2c 20 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  x, ...) /**/.#  
1310: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
1320: 5f 6d 73 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a 2a  _msg(x, ...) /**
1330: 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65  /.#  define file
1340: 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 78 29 20 2f  d_log_entry(x) /
1350: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 66 69  **/.#  define fi
1360: 6c 65 64 5f 6c 6f 67 5f 69 70 28 78 2c 20 2e 2e  led_log_ip(x, ..
1370: 2e 29 20 4e 55 4c 4c 0a 23 20 20 64 65 66 69 6e  .) NULL.#  defin
1380: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28  e filed_log_new(
1390: 78 29 20 26 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f  x) &local_dummy_
13a0: 6c 6f 67 0a 23 65 6c 73 65 0a 23 20 20 69 66 64  log.#else.#  ifd
13b0: 65 66 20 46 49 4c 45 44 5f 44 45 42 55 47 0a 23  ef FILED_DEBUG.#
13c0: 20 20 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64      define filed
13d0: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 78  _log_msg_debug(x
13e0: 2c 20 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66  , ...) { fprintf
13f0: 28 73 74 64 65 72 72 2c 20 78 2c 20 5f 5f 56 41  (stderr, x, __VA
1400: 5f 41 52 47 53 5f 5f 29 3b 20 66 70 72 69 6e 74  _ARGS__); fprint
1410: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b  f(stderr, "\n");
1420: 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b   fflush(stderr);
1430: 20 7d 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20   }.#  else.#    
1440: 64 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67  define filed_log
1450: 5f 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e  _msg_debug(x, ..
1460: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 66  .) /**/.#  endif
1470: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
1480: 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a  logging thread *
1490: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66  /.static void *f
14a0: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
14b0: 65 61 64 28 76 6f 69 64 20 2a 61 72 67 5f 70 29  ead(void *arg_p)
14c0: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
14d0: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
14e0: 61 72 67 73 20 2a 61 72 67 3b 0a 09 73 74 72 75  args *arg;..stru
14f0: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
1500: 72 79 20 2a 63 75 72 72 2c 20 2a 70 72 65 76 3b  ry *curr, *prev;
1510: 0a 09 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 09 46  ..time_t now;..F
1520: 49 4c 45 20 2a 66 70 3b 0a 0a 09 61 72 67 20 3d  ILE *fp;...arg =
1530: 20 61 72 67 5f 70 3b 0a 0a 09 66 70 20 3d 20 61   arg_p;...fp = a
1540: 72 67 2d 3e 66 70 3b 0a 0a 09 77 68 69 6c 65 20  rg->fp;...while 
1550: 28 31 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  (1) {...pthread_
1560: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65  mutex_lock(&file
1570: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
1580: 75 74 65 78 29 3b 0a 09 09 70 74 68 72 65 61 64  utex);...pthread
1590: 5f 63 6f 6e 64 5f 77 61 69 74 28 26 66 69 6c 65  _cond_wait(&file
15a0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72  d_log_msg_list_r
15b0: 65 61 64 79 2c 20 26 66 69 6c 65 64 5f 6c 6f 67  eady, &filed_log
15c0: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
15d0: 3b 0a 0a 09 09 63 75 72 72 20 3d 20 66 69 6c 65  ;....curr = file
15e0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a  d_log_msg_list;.
15f0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
1600: 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  list = NULL;....
1610: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
1620: 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  lock(&filed_log_
1630: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
1640: 0a 0a 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e  ....now = time(N
1650: 55 4c 4c 29 3b 0a 0a 09 09 70 72 65 76 20 3d 20  ULL);....prev = 
1660: 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20 28 3b 20 63  NULL;...for (; c
1670: 75 72 72 3b 20 63 75 72 72 20 3d 20 63 75 72 72  urr; curr = curr
1680: 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 63 75  ->_next) {....cu
1690: 72 72 2d 3e 5f 70 72 65 76 20 3d 20 70 72 65 76  rr->_prev = prev
16a0: 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75 72  ;.....prev = cur
16b0: 72 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72 20 3d  r;...}....curr =
16c0: 20 70 72 65 76 3b 0a 09 09 77 68 69 6c 65 20 28   prev;...while (
16d0: 63 75 72 72 29 20 7b 0a 09 09 09 73 77 69 74 63  curr) {....switc
16e0: 68 20 28 63 75 72 72 2d 3e 74 79 70 65 29 20 7b  h (curr->type) {
16f0: 0a 09 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f  .....case FILED_
1700: 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45  LOG_TYPE_MESSAGE
1710: 3a 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28 66  :......fprintf(f
1720: 70 2c 20 22 25 73 22 2c 20 63 75 72 72 2d 3e 62  p, "%s", curr->b
1730: 75 66 66 65 72 29 3b 0a 0a 09 09 09 09 09 62 72  uffer);.......br
1740: 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 46 49  eak;.....case FI
1750: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41  LED_LOG_TYPE_TRA
1760: 4e 53 46 45 52 3a 0a 09 09 09 09 09 69 66 20 28  NSFER:......if (
1770: 63 75 72 72 2d 3e 65 6e 64 74 69 6d 65 20 3d 3d  curr->endtime ==
1780: 20 28 28 74 69 6d 65 5f 74 29 20 2d 31 29 29 20   ((time_t) -1)) 
1790: 7b 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 65 6e  {.......curr->en
17a0: 64 74 69 6d 65 20 3d 20 6e 6f 77 3b 0a 09 09 09  dtime = now;....
17b0: 09 09 7d 0a 0a 09 09 09 09 09 66 70 72 69 6e 74  ..}.......fprint
17c0: 66 28 66 70 2c 20 22 54 52 41 4e 53 46 45 52 20  f(fp, "TRANSFER 
17d0: 50 41 54 48 3d 25 73 20 53 52 43 3d 25 73 3a 25  PATH=%s SRC=%s:%
17e0: 69 20 54 49 4d 45 2e 53 54 41 52 54 3d 25 6c 6c  i TIME.START=%ll
17f0: 75 20 54 49 4d 45 2e 45 4e 44 3d 25 6c 6c 75 20  u TIME.END=%llu 
1800: 43 4f 44 45 2e 56 41 4c 55 45 3d 25 75 20 43 4f  CODE.VALUE=%u CO
1810: 44 45 2e 52 45 41 53 4f 4e 3d 25 73 20 52 45 51  DE.REASON=%s REQ
1820: 55 45 53 54 2e 4f 46 46 53 45 54 3d 25 6c 6c 75  UEST.OFFSET=%llu
1830: 20 52 45 51 55 45 53 54 2e 4c 45 4e 47 54 48 3d   REQUEST.LENGTH=
1840: 25 6c 6c 75 20 46 49 4c 45 2e 4c 45 4e 47 54 48  %llu FILE.LENGTH
1850: 3d 25 6c 6c 75 20 54 52 41 4e 53 46 45 52 2e 4c  =%llu TRANSFER.L
1860: 45 4e 47 54 48 3d 25 6c 6c 75 22 2c 0a 09 09 09  ENGTH=%llu",....
1870: 09 09 09 63 75 72 72 2d 3e 62 75 66 66 65 72 2c  ...curr->buffer,
1880: 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 69 70 2c  .......curr->ip,
1890: 20 63 75 72 72 2d 3e 70 6f 72 74 2c 0a 09 09 09   curr->port,....
18a0: 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
18b0: 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 73 74  g long) curr->st
18c0: 61 72 74 74 69 6d 65 2c 0a 09 09 09 09 09 09 28  arttime,.......(
18d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18e0: 6e 67 29 20 63 75 72 72 2d 3e 65 6e 64 74 69 6d  ng) curr->endtim
18f0: 65 2c 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 68  e,.......curr->h
1900: 74 74 70 5f 63 6f 64 65 2c 20 63 75 72 72 2d 3e  ttp_code, curr->
1910: 72 65 61 73 6f 6e 2c 0a 09 09 09 09 09 09 28 75  reason,.......(u
1920: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
1930: 67 29 20 63 75 72 72 2d 3e 72 65 71 5f 6f 66 66  g) curr->req_off
1940: 73 65 74 2c 0a 09 09 09 09 09 09 28 75 6e 73 69  set,.......(unsi
1950: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
1960: 63 75 72 72 2d 3e 72 65 71 5f 6c 65 6e 67 74 68  curr->req_length
1970: 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65  ,.......(unsigne
1980: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72  d long long) cur
1990: 72 2d 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 2c 0a  r->file_length,.
19a0: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
19b0: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
19c0: 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 0a 09 09 09  >sent_length....
19d0: 09 09 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  ..);.......break
19e0: 3b 0a 09 09 09 7d 0a 09 09 09 66 70 72 69 6e 74  ;....}....fprint
19f0: 66 28 66 70 2c 20 22 20 54 48 52 45 41 44 3d 25  f(fp, " THREAD=%
1a00: 6c 6c 75 20 54 49 4d 45 3d 25 6c 6c 75 5c 6e 22  llu TIME=%llu\n"
1a10: 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ,.....(unsigned 
1a20: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
1a30: 3e 74 68 72 65 61 64 2c 0a 09 09 09 09 28 75 6e  >thread,.....(un
1a40: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1a50: 29 20 6e 6f 77 0a 09 09 09 29 3b 0a 09 09 09 66  ) now....);....f
1a60: 66 6c 75 73 68 28 66 70 29 3b 0a 0a 09 09 09 70  flush(fp);.....p
1a70: 72 65 76 20 3d 20 63 75 72 72 3b 0a 09 09 09 63  rev = curr;....c
1a80: 75 72 72 20 3d 20 63 75 72 72 2d 3e 5f 70 72 65  urr = curr->_pre
1a90: 76 3b 0a 0a 09 09 09 66 72 65 65 28 70 72 65 76  v;.....free(prev
1aa0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  );...}..}...retu
1ab0: 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61  rn(NULL);.}..sta
1ac0: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c  tic void filed_l
1ad0: 6f 67 5f 65 6e 74 72 79 28 73 74 72 75 63 74 20  og_entry(struct 
1ae0: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20  filed_log_entry 
1af0: 2a 65 6e 74 72 79 29 20 7b 0a 09 65 6e 74 72 79  *entry) {..entry
1b00: 2d 3e 74 68 72 65 61 64 20 3d 20 70 74 68 72 65  ->thread = pthre
1b10: 61 64 5f 73 65 6c 66 28 29 3b 0a 0a 09 70 74 68  ad_self();...pth
1b20: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
1b30: 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  &filed_log_msg_l
1b40: 69 73 74 5f 6d 75 74 65 78 29 3b 0a 0a 09 65 6e  ist_mutex);...en
1b50: 74 72 79 2d 3e 5f 6e 65 78 74 20 3d 20 66 69 6c  try->_next = fil
1b60: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b  ed_log_msg_list;
1b70: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
1b80: 6c 69 73 74 20 3d 20 65 6e 74 72 79 3b 0a 0a 09  list = entry;...
1b90: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
1ba0: 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  lock(&filed_log_
1bb0: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
1bc0: 0a 0a 09 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f  ...pthread_cond_
1bd0: 73 69 67 6e 61 6c 28 26 66 69 6c 65 64 5f 6c 6f  signal(&filed_lo
1be0: 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65 61 64 79  g_msg_list_ready
1bf0: 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );...return;.}..
1c00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 66 69  static struct fi
1c10: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66  led_log_entry *f
1c20: 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 69 6e 74  iled_log_new(int
1c30: 20 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09   initialize) {..
1c40: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
1c50: 5f 65 6e 74 72 79 20 2a 72 65 74 76 61 6c 3b 0a  _entry *retval;.
1c60: 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
1c70: 63 28 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  c(sizeof(*retval
1c80: 29 29 3b 0a 0a 09 69 66 20 28 69 6e 69 74 69 61  ));...if (initia
1c90: 6c 69 7a 65 29 20 7b 0a 09 09 72 65 74 76 61 6c  lize) {...retval
1ca0: 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d 20 27 5c  ->buffer[0] = '\
1cb0: 30 27 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 68 74  0';...retval->ht
1cc0: 74 70 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a 09 09  tp_code = -1;...
1cd0: 72 65 74 76 61 6c 2d 3e 73 74 61 72 74 74 69 6d  retval->starttim
1ce0: 65 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d  e = 0;...retval-
1cf0: 3e 65 6e 64 74 69 6d 65 20 3d 20 30 3b 0a 09 09  >endtime = 0;...
1d00: 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6f 66 66 73  retval->req_offs
1d10: 65 74 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c  et = 0;...retval
1d20: 2d 3e 72 65 71 5f 6c 65 6e 67 74 68 20 3d 20 30  ->req_length = 0
1d30: 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 73 65 6e 74  ;...retval->sent
1d40: 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 09 09 72  _length = 0;...r
1d50: 65 74 76 61 6c 2d 3e 66 69 6c 65 5f 6c 65 6e 67  etval->file_leng
1d60: 74 68 20 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c  th = 0;...retval
1d70: 2d 3e 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ->ip[0] = '\0';.
1d80: 09 09 72 65 74 76 61 6c 2d 3e 70 6f 72 74 20 3d  ..retval->port =
1d90: 20 2d 31 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e   -1;..}...return
1da0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
1db0: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c  tic void filed_l
1dc0: 6f 67 5f 6d 73 67 28 63 6f 6e 73 74 20 63 68 61  og_msg(const cha
1dd0: 72 20 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09  r *fmt, ...) {..
1de0: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
1df0: 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a 09  _entry *entry;..
1e00: 76 61 5f 6c 69 73 74 20 61 72 67 73 3b 0a 0a 09  va_list args;...
1e10: 65 6e 74 72 79 20 3d 20 66 69 6c 65 64 5f 6c 6f  entry = filed_lo
1e20: 67 5f 6e 65 77 28 30 29 3b 0a 0a 09 76 61 5f 73  g_new(0);...va_s
1e30: 74 61 72 74 28 61 72 67 73 2c 20 66 6d 74 29 3b  tart(args, fmt);
1e40: 0a 0a 09 76 73 6e 70 72 69 6e 74 66 28 65 6e 74  ...vsnprintf(ent
1e50: 72 79 2d 3e 62 75 66 66 65 72 2c 20 73 69 7a 65  ry->buffer, size
1e60: 6f 66 28 65 6e 74 72 79 2d 3e 62 75 66 66 65 72  of(entry->buffer
1e70: 29 2c 20 66 6d 74 2c 20 61 72 67 73 29 3b 0a 0a  ), fmt, args);..
1e80: 09 76 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a  .va_end(args);..
1e90: 09 65 6e 74 72 79 2d 3e 74 79 70 65 20 3d 20 46  .entry->type = F
1ea0: 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45  ILED_LOG_TYPE_ME
1eb0: 53 53 41 47 45 3b 0a 0a 09 66 69 6c 65 64 5f 6c  SSAGE;...filed_l
1ec0: 6f 67 5f 65 6e 74 72 79 28 65 6e 74 72 79 29 3b  og_entry(entry);
1ed0: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74  ...return;.}..st
1ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1ef0: 2a 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 73 74  *filed_log_ip(st
1f00: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61  ruct sockaddr *a
1f10: 64 64 72 2c 20 63 68 61 72 20 2a 62 75 66 66 65  ddr, char *buffe
1f20: 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72  r, size_t buffer
1f30: 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 73  len) {..struct s
1f40: 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 61 64 64 72  ockaddr_in *addr
1f50: 5f 76 34 3b 0a 09 73 74 72 75 63 74 20 73 6f 63  _v4;..struct soc
1f60: 6b 61 64 64 72 5f 69 6e 36 20 2a 61 64 64 72 5f  kaddr_in6 *addr_
1f70: 76 36 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  v6;..const char 
1f80: 2a 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a  *retval = NULL;.
1f90: 0a 09 61 64 64 72 5f 76 36 20 3d 20 28 73 74 72  ..addr_v6 = (str
1fa0: 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36  uct sockaddr_in6
1fb0: 20 2a 29 20 61 64 64 72 3b 0a 0a 09 73 77 69 74   *) addr;...swit
1fc0: 63 68 20 28 61 64 64 72 5f 76 36 2d 3e 73 69 6e  ch (addr_v6->sin
1fd0: 36 5f 66 61 6d 69 6c 79 29 20 7b 0a 09 09 63 61  6_family) {...ca
1fe0: 73 65 20 41 46 5f 49 4e 45 54 3a 0a 09 09 09 61  se AF_INET:....a
1ff0: 64 64 72 5f 76 34 20 3d 20 28 73 74 72 75 63 74  ddr_v4 = (struct
2000: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 29 20   sockaddr_in *) 
2010: 61 64 64 72 3b 0a 09 09 09 72 65 74 76 61 6c 20  addr;....retval 
2020: 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49  = inet_ntop(AF_I
2030: 4e 45 54 2c 20 26 61 64 64 72 5f 76 34 2d 3e 73  NET, &addr_v4->s
2040: 69 6e 5f 61 64 64 72 2c 20 62 75 66 66 65 72 2c  in_addr, buffer,
2050: 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09   bufferlen);....
2060: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 46  break;...case AF
2070: 5f 49 4e 45 54 36 3a 0a 09 09 09 72 65 74 76 61  _INET6:....retva
2080: 6c 20 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46  l = inet_ntop(AF
2090: 5f 49 4e 45 54 36 2c 20 26 61 64 64 72 5f 76 36  _INET6, &addr_v6
20a0: 2d 3e 73 69 6e 36 5f 61 64 64 72 2c 20 62 75 66  ->sin6_addr, buf
20b0: 66 65 72 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b  fer, bufferlen);
20c0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
20d0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
20e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  }..static int fi
20f0: 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65  led_logging_thre
2100: 61 64 5f 69 6e 69 74 28 46 49 4c 45 20 2a 6c 6f  ad_init(FILE *lo
2110: 67 66 70 29 20 7b 0a 09 73 74 72 75 63 74 20 66  gfp) {..struct f
2120: 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72  iled_logging_thr
2130: 65 61 64 5f 61 72 67 73 20 2a 61 72 67 73 3b 0a  ead_args *args;.
2140: 09 70 74 68 72 65 61 64 5f 74 20 74 68 72 65 61  .pthread_t threa
2150: 64 5f 69 64 3b 0a 0a 09 61 72 67 73 20 3d 20 6d  d_id;...args = m
2160: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 61 72  alloc(sizeof(*ar
2170: 67 73 29 29 3b 0a 09 61 72 67 73 2d 3e 66 70 20  gs));..args->fp 
2180: 3d 20 6c 6f 67 66 70 3b 0a 0a 09 66 69 6c 65 64  = logfp;...filed
2190: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20  _log_msg_list = 
21a0: 4e 55 4c 4c 3b 0a 0a 09 70 74 68 72 65 61 64 5f  NULL;...pthread_
21b0: 6d 75 74 65 78 5f 69 6e 69 74 28 26 66 69 6c 65  mutex_init(&file
21c0: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
21d0: 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 70  utex, NULL);...p
21e0: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
21f0: 68 72 65 61 64 5f 69 64 2c 20 4e 55 4c 4c 2c 20  hread_id, NULL, 
2200: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
2210: 72 65 61 64 2c 20 61 72 67 73 29 3b 0a 0a 09 66  read, args);...f
2220: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 53 54  iled_log_msg("ST
2230: 41 52 54 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ART");...return(
2240: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0);.}.#endif../*
2250: 20 46 6f 72 6d 61 74 20 74 69 6d 65 20 70 65 72   Format time per
2260: 20 52 46 43 32 36 31 36 20 2a 2f 0a 73 74 61 74   RFC2616 */.stat
2270: 69 63 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 66  ic char *filed_f
2280: 6f 72 6d 61 74 5f 74 69 6d 65 28 63 68 61 72 20  ormat_time(char 
2290: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
22a0: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 63 6f 6e 73  buffer_len, cons
22b0: 74 20 74 69 6d 65 5f 74 20 74 69 6d 65 69 6e 66  t time_t timeinf
22c0: 6f 29 20 7b 0a 09 73 74 72 75 63 74 20 74 6d 20  o) {..struct tm 
22d0: 74 69 6d 65 69 6e 66 6f 5f 74 6d 2c 20 2a 74 69  timeinfo_tm, *ti
22e0: 6d 65 69 6e 66 6f 5f 74 6d 5f 70 3b 0a 0a 09 74  meinfo_tm_p;...t
22f0: 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70 20 3d 20 67  imeinfo_tm_p = g
2300: 6d 74 69 6d 65 5f 72 28 26 74 69 6d 65 69 6e 66  mtime_r(&timeinf
2310: 6f 2c 20 26 74 69 6d 65 69 6e 66 6f 5f 74 6d 29  o, &timeinfo_tm)
2320: 3b 0a 09 69 66 20 28 74 69 6d 65 69 6e 66 6f 5f  ;..if (timeinfo_
2330: 74 6d 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tm_p == NULL) {.
2340: 09 09 72 65 74 75 72 6e 28 22 75 6e 6b 6e 6f 77  ..return("unknow
2350: 6e 22 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72  n");..}...buffer
2360: 5b 62 75 66 66 65 72 5f 6c 65 6e 20 2d 20 31 5d  [buffer_len - 1]
2370: 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66 65 72   = '\0';..buffer
2380: 5f 6c 65 6e 20 3d 20 73 74 72 66 74 69 6d 65 28  _len = strftime(
2390: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c  buffer, buffer_l
23a0: 65 6e 20 2d 20 31 2c 20 22 25 61 2c 20 25 64 20  en - 1, "%a, %d 
23b0: 25 62 20 25 59 20 25 48 3a 25 4d 3a 25 53 20 47  %b %Y %H:%M:%S G
23c0: 4d 54 22 2c 20 74 69 6d 65 69 6e 66 6f 5f 74 6d  MT", timeinfo_tm
23d0: 5f 70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75  _p);...return(bu
23e0: 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 68 61 73  ffer);.}../* has
23f0: 68 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  h */.static unsi
2400: 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 64 5f 68  gned int filed_h
2410: 61 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ash(const unsign
2420: 65 64 20 63 68 61 72 20 2a 76 61 6c 75 65 2c 20  ed char *value, 
2430: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 6f 64  unsigned int mod
2440: 75 6c 75 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65  ulus) {..unsigne
2450: 64 20 63 68 61 72 20 63 75 72 72 2c 20 70 72 65  d char curr, pre
2460: 76 3b 0a 09 69 6e 74 20 64 69 66 66 3b 0a 09 75  v;..int diff;..u
2470: 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 65 74 76  nsigned int retv
2480: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d  al;...retval = m
2490: 6f 64 75 6c 75 73 20 2d 20 31 3b 0a 09 70 72 65  odulus - 1;..pre
24a0: 76 20 3d 20 6d 6f 64 75 6c 75 73 20 25 20 32 35  v = modulus % 25
24b0: 35 3b 0a 0a 09 77 68 69 6c 65 20 28 28 63 75 72  5;...while ((cur
24c0: 72 20 3d 20 2a 76 61 6c 75 65 29 29 20 7b 0a 09  r = *value)) {..
24d0: 09 69 66 20 28 63 75 72 72 20 3c 20 33 32 29 20  .if (curr < 32) 
24e0: 7b 0a 09 09 09 63 75 72 72 20 3d 20 32 35 35 20  {....curr = 255 
24f0: 2d 20 63 75 72 72 3b 0a 09 09 7d 20 65 6c 73 65  - curr;...} else
2500: 20 7b 0a 09 09 09 63 75 72 72 20 2d 3d 20 33 32   {....curr -= 32
2510: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 72 65  ;...}....if (pre
2520: 76 20 3c 20 63 75 72 72 29 20 7b 0a 09 09 09 64  v < curr) {....d
2530: 69 66 66 20 3d 20 63 75 72 72 20 2d 20 70 72 65  iff = curr - pre
2540: 76 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  v;...} else {...
2550: 09 64 69 66 66 20 3d 20 70 72 65 76 20 2d 20 63  .diff = prev - c
2560: 75 72 72 3b 0a 09 09 7d 0a 0a 09 09 70 72 65 76  urr;...}....prev
2570: 20 3d 20 63 75 72 72 3b 0a 0a 09 09 72 65 74 76   = curr;....retv
2580: 61 6c 20 3c 3c 3d 20 33 3b 0a 09 09 72 65 74 76  al <<= 3;...retv
2590: 61 6c 20 26 3d 20 30 78 46 46 46 46 46 46 46 46  al &= 0xFFFFFFFF
25a0: 4c 55 3b 0a 09 09 72 65 74 76 61 6c 20 5e 3d 20  LU;...retval ^= 
25b0: 64 69 66 66 3b 0a 0a 09 09 76 61 6c 75 65 2b 2b  diff;....value++
25c0: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
25d0: 72 65 74 76 61 6c 20 25 20 6d 6f 64 75 6c 75 73  retval % modulus
25e0: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
25f0: 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  l);.}../* Find a
2600: 20 6d 69 6d 65 2d 74 79 70 65 20 62 61 73 65 64   mime-type based
2610: 20 6f 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   on the filename
2620: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
2630: 20 63 68 61 72 20 2a 66 69 6c 65 64 5f 64 65 74   char *filed_det
2640: 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28  ermine_mimetype(
2650: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
2660: 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20  ) {..const char 
2670: 2a 70 3b 0a 0a 09 70 20 3d 20 73 74 72 72 63 68  *p;...p = strrch
2680: 72 28 70 61 74 68 2c 20 27 2e 27 29 3b 0a 09 69  r(path, '.');..i
2690: 66 20 28 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  f (p == NULL) {.
26a0: 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44  ..return(FILED_D
26b0: 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d  EFAULT_TYPE);..}
26c0: 0a 0a 09 70 2b 2b 3b 0a 09 69 66 20 28 2a 70 20  ...p++;..if (*p 
26d0: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 72 65 74  == '\0') {...ret
26e0: 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41 55 4c  urn(FILED_DEFAUL
26f0: 54 5f 54 59 50 45 29 3b 0a 09 7d 0a 0a 09 66 69  T_TYPE);..}...fi
2700: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75  led_log_msg_debu
2710: 67 28 22 4c 6f 6f 6b 69 6e 67 20 75 70 20 4d 49  g("Looking up MI
2720: 4d 45 20 74 79 70 65 20 66 6f 72 20 25 73 20 28  ME type for %s (
2730: 68 61 73 68 20 3d 20 25 6c 6c 75 29 22 2c 20 70  hash = %llu)", p
2740: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2750: 20 6c 6f 6e 67 29 20 66 69 6c 65 64 5f 68 61 73   long) filed_has
2760: 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  h((const unsigne
2770: 64 20 63 68 61 72 20 2a 29 20 70 2c 20 31 36 37  d char *) p, 167
2780: 37 37 32 35 39 29 29 3b 0a 0a 23 69 6e 63 6c 75  77259));..#inclu
2790: 64 65 20 22 66 69 6c 65 64 2d 6d 69 6d 65 2d 74  de "filed-mime-t
27a0: 79 70 65 73 2e 68 22 0a 0a 09 72 65 74 75 72 6e  ypes.h"...return
27b0: 28 46 49 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54  (FILED_DEFAULT_T
27c0: 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e  YPE);.}../* Open
27d0: 20 61 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75   a file and retu
27e0: 72 6e 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  rn file informat
27f0: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
2800: 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69  ruct filed_filei
2810: 6e 66 6f 20 2a 66 69 6c 65 64 5f 6f 70 65 6e 5f  nfo *filed_open_
2820: 66 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  file(const char 
2830: 2a 70 61 74 68 2c 20 73 74 72 75 63 74 20 66 69  *path, struct fi
2840: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 62 75  led_fileinfo *bu
2850: 66 66 65 72 29 20 7b 0a 09 73 74 72 75 63 74 20  ffer) {..struct 
2860: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a  filed_fileinfo *
2870: 63 61 63 68 65 3b 0a 09 63 6f 6e 73 74 20 63 68  cache;..const ch
2880: 61 72 20 2a 6f 70 65 6e 5f 70 61 74 68 3b 0a 09  ar *open_path;..
2890: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63  unsigned int cac
28a0: 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f 74 20 6c  he_idx;..off_t l
28b0: 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 63  en;..int fd;...c
28c0: 61 63 68 65 5f 69 64 78 20 3d 20 66 69 6c 65 64  ache_idx = filed
28d0: 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73  _hash((const uns
28e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70 61  igned char *) pa
28f0: 74 68 2c 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  th, filed_filein
2900: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29  fo_fdcache_size)
2910: 3b 0a 0a 09 63 61 63 68 65 20 3d 20 26 66 69 6c  ;...cache = &fil
2920: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
2930: 63 68 65 5b 63 61 63 68 65 5f 69 64 78 5d 3b 0a  che[cache_idx];.
2940: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
2950: 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e 67 20 6d  debug("Locking m
2960: 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c  utex for idx: %l
2970: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
2980: 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a  ng) cache_idx);.
2990: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
29a0: 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74  lock(&cache->mut
29b0: 65 78 29 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  ex);...filed_log
29c0: 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70  _msg_debug("Comp
29d0: 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6d 75  leted locking mu
29e0: 74 65 78 20 66 6f 72 20 69 64 78 3a 20 25 6c 75  tex for idx: %lu
29f0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2a00: 67 29 20 63 61 63 68 65 5f 69 64 78 29 3b 0a 0a  g) cache_idx);..
2a10: 09 69 66 20 28 73 74 72 63 6d 70 28 70 61 74 68  .if (strcmp(path
2a20: 2c 20 63 61 63 68 65 2d 3e 70 61 74 68 29 20 21  , cache->path) !
2a30: 3d 20 30 29 20 7b 0a 09 09 66 69 6c 65 64 5f 6c  = 0) {...filed_l
2a40: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 61  og_msg_debug("Ca
2a50: 63 68 65 20 6d 69 73 73 20 66 6f 72 20 69 64 78  che miss for idx
2a60: 3a 20 25 6c 75 3a 20 4f 4c 44 20 5c 22 25 73 5c  : %lu: OLD \"%s\
2a70: 22 2c 20 4e 45 57 20 5c 22 25 73 5c 22 22 2c 20  ", NEW \"%s\"", 
2a80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2a90: 63 61 63 68 65 5f 69 64 78 2c 20 63 61 63 68 65  cache_idx, cache
2aa0: 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b 0a 0a  ->path, path);..
2ab0: 09 09 2f 2a 20 46 6f 72 20 72 65 71 75 65 73 74  ../* For request
2ac0: 73 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 64  s for the root d
2ad0: 69 72 65 63 74 6f 72 79 2c 20 73 65 72 76 65 20  irectory, serve 
2ae0: 6f 75 74 20 69 6e 64 65 78 2e 68 74 6d 6c 20 2a  out index.html *
2af0: 2f 0a 09 09 69 66 20 28 70 61 74 68 5b 30 5d 20  /...if (path[0] 
2b00: 3d 3d 20 27 5c 30 27 20 7c 7c 20 28 70 61 74 68  == '\0' || (path
2b10: 5b 30 5d 20 3d 3d 20 27 2f 27 20 26 26 20 70 61  [0] == '/' && pa
2b20: 74 68 5b 31 5d 20 3d 3d 20 27 5c 30 27 29 29 20  th[1] == '\0')) 
2b30: 7b 0a 09 09 09 6f 70 65 6e 5f 70 61 74 68 20 3d  {....open_path =
2b40: 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 3b 0a   "/index.html";.
2b50: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6f 70  ..} else {....op
2b60: 65 6e 5f 70 61 74 68 20 3d 20 70 61 74 68 3b 0a  en_path = path;.
2b70: 09 09 7d 0a 0a 09 09 66 64 20 3d 20 6f 70 65 6e  ..}....fd = open
2b80: 28 6f 70 65 6e 5f 70 61 74 68 2c 20 4f 5f 52 44  (open_path, O_RD
2b90: 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52 47 45 46 49  ONLY | O_LARGEFI
2ba0: 4c 45 29 3b 0a 09 09 69 66 20 28 66 64 20 3c 20  LE);...if (fd < 
2bb0: 30 29 20 7b 0a 09 09 09 70 74 68 72 65 61 64 5f  0) {....pthread_
2bc0: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61  mutex_unlock(&ca
2bd0: 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09  che->mutex);....
2be0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
2bf0: 09 7d 0a 0a 09 09 66 72 65 65 28 63 61 63 68 65  .}....free(cache
2c00: 2d 3e 70 61 74 68 29 3b 0a 09 09 69 66 20 28 63  ->path);...if (c
2c10: 61 63 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b  ache->fd >= 0) {
2c20: 0a 09 09 09 63 6c 6f 73 65 28 63 61 63 68 65 2d  ....close(cache-
2c30: 3e 66 64 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e  >fd);...}....len
2c40: 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20   = lseek(fd, 0, 
2c50: 53 45 45 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65  SEEK_END);...lse
2c60: 65 6b 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53  ek(fd, 0, SEEK_S
2c70: 45 54 29 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66  ET);....cache->f
2c80: 64 20 3d 20 66 64 3b 0a 09 09 63 61 63 68 65 2d  d = fd;...cache-
2c90: 3e 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 09 09 63 61  >len = len;...ca
2ca0: 63 68 65 2d 3e 70 61 74 68 20 3d 20 73 74 72 64  che->path = strd
2cb0: 75 70 28 70 61 74 68 29 3b 0a 09 09 63 61 63 68  up(path);...cach
2cc0: 65 2d 3e 74 79 70 65 20 3d 20 66 69 6c 65 64 5f  e->type = filed_
2cd0: 64 65 74 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79  determine_mimety
2ce0: 70 65 28 6f 70 65 6e 5f 70 61 74 68 29 3b 0a 0a  pe(open_path);..
2cf0: 09 09 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 44  ../* XXX:TODO: D
2d00: 65 74 65 72 6d 69 6e 65 20 2a 2f 0a 09 09 63 61  etermine */...ca
2d10: 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 66  che->lastmod = f
2d20: 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65  iled_format_time
2d30: 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f  (cache->lastmod_
2d40: 62 2c 20 73 69 7a 65 6f 66 28 63 61 63 68 65 2d  b, sizeof(cache-
2d50: 3e 6c 61 73 74 6d 6f 64 5f 62 29 2c 20 74 69 6d  >lastmod_b), tim
2d60: 65 28 4e 55 4c 4c 29 20 2d 20 33 30 29 3b 0a 09  e(NULL) - 30);..
2d70: 7d 20 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65 64  } else {...filed
2d80: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
2d90: 43 61 63 68 65 20 68 69 74 20 66 6f 72 20 69 64  Cache hit for id
2da0: 78 3a 20 25 6c 75 3a 20 50 41 54 48 20 5c 22 25  x: %lu: PATH \"%
2db0: 73 5c 22 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  s\"", (unsigned 
2dc0: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 2c  long) cache_idx,
2dd0: 20 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a   path);..}.../*.
2de0: 09 20 2a 20 57 65 20 68 61 76 65 20 74 6f 20 6d  . * We have to m
2df0: 61 6b 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ake a duplicate 
2e00: 46 44 2c 20 62 65 63 61 75 73 65 20 6f 6e 63 65  FD, because once
2e10: 20 77 65 20 72 65 6c 65 61 73 65 20 74 68 65 20   we release the 
2e20: 63 61 63 68 65 0a 09 20 2a 20 6d 75 74 65 78 2c  cache.. * mutex,
2e30: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2e40: 70 74 6f 72 20 6d 61 79 20 62 65 20 63 6c 6f 73  ptor may be clos
2e50: 65 64 0a 09 20 2a 2f 0a 09 66 64 20 3d 20 64 75  ed.. */..fd = du
2e60: 70 28 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 69  p(cache->fd);..i
2e70: 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 70  f (fd < 0) {...p
2e80: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
2e90: 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65  ock(&cache->mute
2ea0: 78 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  x);....return(NU
2eb0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72  LL);..}...buffer
2ec0: 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 62 75 66 66  ->fd = fd;..buff
2ed0: 65 72 2d 3e 6c 65 6e 20 3d 20 63 61 63 68 65 2d  er->len = cache-
2ee0: 3e 6c 65 6e 3b 0a 09 62 75 66 66 65 72 2d 3e 74  >len;..buffer->t
2ef0: 79 70 65 20 3d 20 63 61 63 68 65 2d 3e 74 79 70  ype = cache->typ
2f00: 65 3b 0a 09 6d 65 6d 63 70 79 28 62 75 66 66 65  e;..memcpy(buffe
2f10: 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20 63 61  r->lastmod_b, ca
2f20: 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20  che->lastmod_b, 
2f30: 73 69 7a 65 6f 66 28 62 75 66 66 65 72 2d 3e 6c  sizeof(buffer->l
2f40: 61 73 74 6d 6f 64 5f 62 29 29 3b 0a 09 62 75 66  astmod_b));..buf
2f50: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 62  fer->lastmod = b
2f60: 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62  uffer->lastmod_b
2f70: 20 2b 20 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d   + (cache->lastm
2f80: 6f 64 20 2d 20 63 61 63 68 65 2d 3e 6c 61 73 74  od - cache->last
2f90: 6d 6f 64 5f 62 29 3b 0a 0a 09 70 74 68 72 65 61  mod_b);...pthrea
2fa0: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
2fb0: 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  cache->mutex);..
2fc0: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b  .return(buffer);
2fd0: 0a 7d 0a 0a 2f 2a 20 50 72 6f 63 65 73 73 20 61  .}../* Process a
2fe0: 6e 20 48 54 54 50 20 72 65 71 75 65 73 74 20 61  n HTTP request a
2ff0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  nd return the pa
3000: 74 68 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  th requested */.
3010: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 66 69  static struct fi
3020: 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74  led_http_request
3030: 20 2a 66 69 6c 65 64 5f 67 65 74 5f 68 74 74 70   *filed_get_http
3040: 5f 72 65 71 75 65 73 74 28 46 49 4c 45 20 2a 66  _request(FILE *f
3050: 70 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  p, struct filed_
3060: 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a 62 75  http_request *bu
3070: 66 66 65 72 5f 73 74 29 20 7b 0a 09 63 68 61 72  ffer_st) {..char
3080: 20 2a 6d 65 74 68 6f 64 2c 20 2a 70 61 74 68 3b   *method, *path;
3090: 0a 09 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  ..char *buffer, 
30a0: 2a 74 6d 70 62 75 66 66 65 72 2c 20 2a 77 6f 72  *tmpbuffer, *wor
30b0: 6b 62 75 66 66 65 72 2c 20 2a 77 6f 72 6b 62 75  kbuffer, *workbu
30c0: 66 66 65 72 5f 6e 65 78 74 3b 0a 09 73 69 7a 65  ffer_next;..size
30d0: 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 74  _t buffer_len, t
30e0: 6d 70 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 6f  mpbuffer_len;..o
30f0: 66 66 5f 74 20 72 61 6e 67 65 5f 73 74 61 72 74  ff_t range_start
3100: 2c 20 72 61 6e 67 65 5f 65 6e 64 2c 20 72 61 6e  , range_end, ran
3110: 67 65 5f 6c 65 6e 67 74 68 3b 0a 09 69 6e 74 20  ge_length;..int 
3120: 72 61 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09  range_request;..
3130: 69 6e 74 20 66 64 3b 0a 09 69 6e 74 20 69 3b 0a  int fd;..int i;.
3140: 0a 09 66 64 20 3d 20 66 69 6c 65 6e 6f 28 66 70  ..fd = fileno(fp
3150: 29 3b 0a 0a 09 72 61 6e 67 65 5f 73 74 61 72 74  );...range_start
3160: 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 65 6e 64   = 0;..range_end
3170: 20 20 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 72     = 0;..range_r
3180: 65 71 75 65 73 74 20 3d 20 30 3b 0a 09 72 61 6e  equest = 0;..ran
3190: 67 65 5f 6c 65 6e 67 74 68 20 3d 20 2d 31 3b 0a  ge_length = -1;.
31a0: 0a 09 62 75 66 66 65 72 20 3d 20 62 75 66 66 65  ..buffer = buffe
31b0: 72 5f 73 74 2d 3e 70 61 74 68 5f 62 3b 0a 09 62  r_st->path_b;..b
31c0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
31d0: 6f 66 28 62 75 66 66 65 72 5f 73 74 2d 3e 70 61  of(buffer_st->pa
31e0: 74 68 5f 62 29 3b 0a 0a 09 74 6d 70 62 75 66 66  th_b);...tmpbuff
31f0: 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d 3e  er = buffer_st->
3200: 74 6d 70 62 75 66 3b 0a 09 74 6d 70 62 75 66 66  tmpbuf;..tmpbuff
3210: 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  er_len = sizeof(
3220: 62 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75  buffer_st->tmpbu
3230: 66 29 3b 0a 0a 09 66 67 65 74 73 28 62 75 66 66  f);...fgets(buff
3240: 65 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  er, buffer_len, 
3250: 66 70 29 3b 0a 0a 09 6d 65 74 68 6f 64 20 3d 20  fp);...method = 
3260: 62 75 66 66 65 72 3b 0a 0a 09 62 75 66 66 65 72  buffer;...buffer
3270: 20 3d 20 73 74 72 63 68 72 28 62 75 66 66 65 72   = strchr(buffer
3280: 2c 20 27 20 27 29 3b 0a 09 69 66 20 28 62 75 66  , ' ');..if (buf
3290: 66 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  fer == NULL) {..
32a0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
32b0: 7d 0a 0a 09 2a 62 75 66 66 65 72 20 3d 20 27 5c  }...*buffer = '\
32c0: 30 27 3b 0a 09 62 75 66 66 65 72 2b 2b 3b 0a 0a  0';..buffer++;..
32d0: 09 70 61 74 68 20 3d 20 62 75 66 66 65 72 3b 0a  .path = buffer;.
32e0: 0a 09 62 75 66 66 65 72 20 3d 20 73 74 72 63 68  ..buffer = strch
32f0: 72 28 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a  r(buffer, ' ');.
3300: 09 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e  .if (buffer != N
3310: 55 4c 4c 29 20 7b 0a 09 09 2a 62 75 66 66 65 72  ULL) {...*buffer
3320: 20 3d 20 27 5c 30 27 3b 0a 09 09 62 75 66 66 65   = '\0';...buffe
3330: 72 2b 2b 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  r++;..}...for (i
3340: 20 3d 20 30 3b 20 69 20 3c 20 31 30 30 3b 20 69   = 0; i < 100; i
3350: 2b 2b 29 20 7b 0a 09 09 66 67 65 74 73 28 74 6d  ++) {...fgets(tm
3360: 70 62 75 66 66 65 72 2c 20 74 6d 70 62 75 66 66  pbuffer, tmpbuff
3370: 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 0a 09 09  er_len, fp);....
3380: 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28  if (strncasecmp(
3390: 74 6d 70 62 75 66 66 65 72 2c 20 22 52 61 6e 67  tmpbuffer, "Rang
33a0: 65 3a 20 22 2c 20 37 29 20 3d 3d 20 30 29 20 7b  e: ", 7) == 0) {
33b0: 0a 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d  ....workbuffer =
33c0: 20 74 6d 70 62 75 66 66 65 72 20 2b 20 37 3b 0a   tmpbuffer + 7;.
33d0: 0a 09 09 09 69 66 20 28 73 74 72 6e 63 61 73 65  ....if (strncase
33e0: 63 6d 70 28 77 6f 72 6b 62 75 66 66 65 72 2c 20  cmp(workbuffer, 
33f0: 22 62 79 74 65 73 3d 22 2c 20 36 29 20 3d 3d 20  "bytes=", 6) == 
3400: 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b 62 75 66  0) {.....workbuf
3410: 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09 09 09 72  fer += 6;......r
3420: 61 6e 67 65 5f 72 65 71 75 65 73 74 20 3d 20 31  ange_request = 1
3430: 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f 73 74 61  ;......range_sta
3440: 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f  rt = strtoull(wo
3450: 72 6b 62 75 66 66 65 72 2c 20 26 77 6f 72 6b 62  rkbuffer, &workb
3460: 75 66 66 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b  uffer_next, 10);
3470: 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72  ......workbuffer
3480: 20 3d 20 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65   = workbuffer_ne
3490: 78 74 3b 0a 0a 09 09 09 09 69 66 20 28 2a 77 6f  xt;......if (*wo
34a0: 72 6b 62 75 66 66 65 72 20 3d 3d 20 27 2d 27 29  rkbuffer == '-')
34b0: 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62 75 66 66   {......workbuff
34c0: 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69 66 20 28  er++;.......if (
34d0: 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d 20 27  *workbuffer != '
34e0: 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62 75 66 66  \r' && *workbuff
34f0: 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b 0a 09 09  er != '\n') {...
3500: 09 09 09 09 72 61 6e 67 65 5f 65 6e 64 20 3d 20  ....range_end = 
3510: 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75 66  strtoull(workbuf
3520: 66 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65 72  fer, &workbuffer
3530: 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09 09 09 09  _next, 10);.....
3540: 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  .}.....}....}...
3550: 7d 0a 0a 09 09 69 66 20 28 6d 65 6d 63 6d 70 28  }....if (memcmp(
3560: 74 6d 70 62 75 66 66 65 72 2c 20 22 5c 72 5c 6e  tmpbuffer, "\r\n
3570: 22 2c 20 32 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 2) == 0) {...
3580: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
3590: 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 68 61 6e 64  ./* We only hand
35a0: 6c 65 20 74 68 65 20 22 47 45 54 22 20 6d 65 74  le the "GET" met
35b0: 68 6f 64 20 2a 2f 0a 09 69 66 20 28 73 74 72 63  hod */..if (strc
35c0: 61 73 65 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22  asecmp(method, "
35d0: 67 65 74 22 29 20 21 3d 20 30 29 20 7b 0a 09 09  get") != 0) {...
35e0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
35f0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
3600: 72 61 6e 67 65 20 2a 2f 0a 09 69 66 20 28 72 61  range */..if (ra
3610: 6e 67 65 5f 65 6e 64 20 21 3d 20 30 29 20 7b 0a  nge_end != 0) {.
3620: 09 09 69 66 20 28 72 61 6e 67 65 5f 65 6e 64 20  ..if (range_end 
3630: 3c 3d 20 72 61 6e 67 65 5f 73 74 61 72 74 29 20  <= range_start) 
3640: 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  {....return(NULL
3650: 29 3b 0a 09 09 7d 0a 0a 09 09 72 61 6e 67 65 5f  );...}....range_
3660: 6c 65 6e 67 74 68 20 3d 20 72 61 6e 67 65 5f 65  length = range_e
3670: 6e 64 20 2d 20 72 61 6e 67 65 5f 73 74 61 72 74  nd - range_start
3680: 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  ;....filed_log_m
3690: 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75 74  sg_debug("Comput
36a0: 69 6e 67 20 6c 65 6e 67 74 68 20 70 61 72 61 6d  ing length param
36b0: 65 74 65 72 3a 20 25 6c 6c 75 20 3d 20 25 6c 6c  eter: %llu = %ll
36c0: 75 20 2d 20 25 6c 6c 75 22 2c 0a 09 09 09 28 75  u - %llu",....(u
36d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
36e0: 67 29 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 2c  g) range_length,
36f0: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
3700: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 65  ng long) range_e
3710: 6e 64 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64  nd,....(unsigned
3720: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67   long long) rang
3730: 65 5f 73 74 61 72 74 0a 09 09 29 3b 0a 09 7d 0a  e_start...);..}.
3740: 0a 09 2f 2a 20 46 69 6c 6c 20 75 70 20 73 74 72  ../* Fill up str
3750: 75 63 74 75 72 65 20 74 6f 20 72 65 74 75 72 6e  ucture to return
3760: 20 2a 2f 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e   */..buffer_st->
3770: 70 61 74 68 20 20 20 3d 20 70 61 74 68 3b 0a 09  path   = path;..
3780: 62 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65  buffer_st->heade
3790: 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65 6e 74  rs.range.present
37a0: 20 3d 20 72 61 6e 67 65 5f 72 65 71 75 65 73 74   = range_request
37b0: 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  ;..buffer_st->he
37c0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
37d0: 65 74 20 20 3d 20 72 61 6e 67 65 5f 73 74 61 72  et  = range_star
37e0: 74 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68  t;..buffer_st->h
37f0: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e  eaders.range.len
3800: 67 74 68 20 20 3d 20 72 61 6e 67 65 5f 6c 65 6e  gth  = range_len
3810: 67 74 68 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75  gth;...return(bu
3820: 66 66 65 72 5f 73 74 29 3b 0a 0a 09 2f 2a 20 4d  ffer_st);.../* M
3830: 61 6b 65 20 63 6f 6d 70 69 6c 65 72 20 68 61 70  ake compiler hap
3840: 70 79 20 2a 2f 0a 09 66 64 20 3d 20 66 64 3b 0a  py */..fd = fd;.
3850: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
3860: 65 72 72 6f 72 20 70 61 67 65 20 2a 2f 0a 73 74  error page */.st
3870: 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f  atic void filed_
3880: 65 72 72 6f 72 5f 70 61 67 65 28 46 49 4c 45 20  error_page(FILE 
3890: 2a 66 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *fp, const char 
38a0: 2a 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 69  *date_current, i
38b0: 6e 74 20 65 72 72 6f 72 5f 6e 75 6d 62 65 72 29  nt error_number)
38c0: 20 7b 0a 09 63 68 61 72 20 2a 65 72 72 6f 72 5f   {..char *error_
38d0: 73 74 72 69 6e 67 20 3d 20 22 3c 68 74 6d 6c 3e  string = "<html>
38e0: 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 45 52 52  <head><title>ERR
38f0: 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64  OR</title></head
3900: 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c 65 20 74 6f  ><body>Unable to
3910: 20 70 72 6f 63 65 73 73 20 72 65 71 75 65 73 74   process request
3920: 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c 3e 22 3b  </body></html>";
3930: 0a 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22  ...fprintf(fp, "
3940: 48 54 54 50 2f 31 2e 31 20 25 69 20 4e 6f 74 20  HTTP/1.1 %i Not 
3950: 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c 72  OK\r\nDate: %s\r
3960: 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64 5c  \nServer: filed\
3970: 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64  r\nLast-Modified
3980: 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74 2d  : %s\r\nContent-
3990: 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c 6e  Length: %llu\r\n
39a0: 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 73  Content-Type: %s
39b0: 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  \r\nConnection: 
39c0: 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c 6e 25 73 22  close\r\n\r\n%s"
39d0: 2c 0a 09 09 65 72 72 6f 72 5f 6e 75 6d 62 65 72  ,...error_number
39e0: 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74  ,...date_current
39f0: 2c 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74  ,...date_current
3a00: 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ,...(unsigned lo
3a10: 6e 67 20 6c 6f 6e 67 29 20 73 74 72 6c 65 6e 28  ng long) strlen(
3a20: 65 72 72 6f 72 5f 73 74 72 69 6e 67 29 2c 0a 09  error_string),..
3a30: 09 22 74 65 78 74 2f 68 74 6d 6c 22 2c 0a 09 09  ."text/html",...
3a40: 65 72 72 6f 72 5f 73 74 72 69 6e 67 0a 09 29 3b  error_string..);
3a50: 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20 61 20  .}../* Handle a 
3a60: 73 69 6e 67 6c 65 20 72 65 71 75 65 73 74 20 66  single request f
3a70: 72 6f 6d 20 61 20 63 6c 69 65 6e 74 20 2a 2f 0a  rom a client */.
3a80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
3a90: 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74 28  d_handle_client(
3aa0: 69 6e 74 20 66 64 2c 20 73 74 72 75 63 74 20 66  int fd, struct f
3ab0: 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73  iled_http_reques
3ac0: 74 20 2a 72 65 71 75 65 73 74 2c 20 73 74 72 75  t *request, stru
3ad0: 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ct filed_log_ent
3ae0: 72 79 20 2a 6c 6f 67 29 20 7b 0a 09 73 74 72 75  ry *log) {..stru
3af0: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
3b00: 6f 20 2a 66 69 6c 65 69 6e 66 6f 3b 0a 09 73 73  o *fileinfo;..ss
3b10: 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 72  ize_t sendfile_r
3b20: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 73 65 6e 64  et;..size_t send
3b30: 66 69 6c 65 5f 73 69 7a 65 3b 0a 09 6f 66 66 5f  file_size;..off_
3b40: 74 20 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65  t sendfile_offse
3b50: 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74  t, sendfile_sent
3b60: 2c 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a  , sendfile_len;.
3b70: 09 63 68 61 72 20 2a 70 61 74 68 3b 0a 09 63 68  .char *path;..ch
3b80: 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65 6e 74  ar *date_current
3b90: 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62  , date_current_b
3ba0: 5b 36 34 5d 3b 0a 09 69 6e 74 20 68 74 74 70 5f  [64];..int http_
3bb0: 63 6f 64 65 3b 0a 09 46 49 4c 45 20 2a 66 70 3b  code;..FILE *fp;
3bc0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
3bd0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 2a 2f 0a  current time */.
3be0: 09 64 61 74 65 5f 63 75 72 72 65 6e 74 20 3d 20  .date_current = 
3bf0: 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d  filed_format_tim
3c00: 65 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f 62  e(date_current_b
3c10: 2c 20 73 69 7a 65 6f 66 28 64 61 74 65 5f 63 75  , sizeof(date_cu
3c20: 72 72 65 6e 74 5f 62 29 2c 20 74 69 6d 65 28 4e  rrent_b), time(N
3c30: 55 4c 4c 29 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ULL));.../* Open
3c40: 20 73 6f 63 6b 65 74 20 61 73 20 41 4e 53 49 20   socket as ANSI 
3c50: 49 2f 4f 20 66 6f 72 20 65 61 73 65 20 6f 66 20  I/O for ease of 
3c60: 75 73 65 20 2a 2f 0a 09 66 70 20 3d 20 66 64 6f  use */..fp = fdo
3c70: 70 65 6e 28 66 64 2c 20 22 77 2b 62 22 29 3b 0a  pen(fd, "w+b");.
3c80: 09 69 66 20 28 66 70 20 3d 3d 20 4e 55 4c 4c 29  .if (fp == NULL)
3c90: 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a   {...close(fd);.
3ca0: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
3cb0: 72 65 71 75 65 73 74 20 3d 20 66 69 6c 65 64 5f  request = filed_
3cc0: 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74  get_http_request
3cd0: 28 66 70 2c 20 72 65 71 75 65 73 74 29 3b 0a 0a  (fp, request);..
3ce0: 09 69 66 20 28 72 65 71 75 65 73 74 20 3d 3d 20  .if (request == 
3cf0: 4e 55 4c 4c 20 7c 7c 20 72 65 71 75 65 73 74 2d  NULL || request-
3d00: 3e 70 61 74 68 20 3d 3d 20 4e 55 4c 4c 29 20 7b  >path == NULL) {
3d10: 0a 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70  ...filed_error_p
3d20: 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72  age(fp, date_cur
3d30: 72 65 6e 74 2c 20 35 30 30 29 3b 0a 0a 09 09 6c  rent, 500);....l
3d40: 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d 20 3d 20  og->buffer[0] = 
3d50: 27 5c 30 27 3b 0a 09 09 6c 6f 67 2d 3e 68 74 74  '\0';...log->htt
3d60: 70 5f 63 6f 64 65 20 3d 20 35 30 30 3b 0a 09 09  p_code = 500;...
3d70: 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 66  log->reason = "f
3d80: 6f 72 6d 61 74 22 3b 0a 0a 09 09 66 69 6c 65 64  ormat";....filed
3d90: 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b  _log_entry(log);
3da0: 0a 0a 09 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a  ....fclose(fp);.
3db0: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
3dc0: 70 61 74 68 20 3d 20 72 65 71 75 65 73 74 2d 3e  path = request->
3dd0: 70 61 74 68 3b 0a 09 73 74 72 63 70 79 28 6c 6f  path;..strcpy(lo
3de0: 67 2d 3e 62 75 66 66 65 72 2c 20 70 61 74 68 29  g->buffer, path)
3df0: 3b 0a 0a 09 68 74 74 70 5f 63 6f 64 65 20 3d 20  ;...http_code = 
3e00: 2d 31 3b 0a 0a 09 66 69 6c 65 69 6e 66 6f 20 3d  -1;...fileinfo =
3e10: 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65   filed_open_file
3e20: 28 70 61 74 68 2c 20 26 72 65 71 75 65 73 74 2d  (path, &request-
3e30: 3e 66 69 6c 65 69 6e 66 6f 29 3b 0a 09 69 66 20  >fileinfo);..if 
3e40: 28 66 69 6c 65 69 6e 66 6f 20 3d 3d 20 4e 55 4c  (fileinfo == NUL
3e50: 4c 29 20 7b 0a 09 09 66 69 6c 65 64 5f 65 72 72  L) {...filed_err
3e60: 6f 72 5f 70 61 67 65 28 66 70 2c 20 64 61 74 65  or_page(fp, date
3e70: 5f 63 75 72 72 65 6e 74 2c 20 34 30 34 29 3b 0a  _current, 404);.
3e80: 0a 09 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f 64  ...log->http_cod
3e90: 65 20 3d 20 34 30 34 3b 0a 09 09 6c 6f 67 2d 3e  e = 404;...log->
3ea0: 72 65 61 73 6f 6e 20 3d 20 22 6f 70 65 6e 5f 66  reason = "open_f
3eb0: 61 69 6c 65 64 22 3b 0a 0a 09 09 66 69 6c 65 64  ailed";....filed
3ec0: 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b  _log_entry(log);
3ed0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
3ee0: 28 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72  (request->header
3ef0: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 21  s.range.offset !
3f00: 3d 20 30 20 7c 7c 20 72 65 71 75 65 73 74 2d 3e  = 0 || request->
3f10: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65  headers.range.le
3f20: 6e 67 74 68 20 3e 3d 20 30 29 20 7b 0a 09 09 09  ngth >= 0) {....
3f30: 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61  if (request->hea
3f40: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
3f50: 74 20 3e 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c  t >= fileinfo->l
3f60: 65 6e 29 20 7b 0a 09 09 09 09 66 69 6c 65 64 5f  en) {.....filed_
3f70: 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64  error_page(fp, d
3f80: 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 31 36  ate_current, 416
3f90: 29 3b 0a 0a 09 09 09 09 6c 6f 67 2d 3e 68 74 74  );......log->htt
3fa0: 70 5f 63 6f 64 65 20 3d 20 34 31 36 3b 0a 09 09  p_code = 416;...
3fb0: 09 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20  ..log->reason = 
3fc0: 22 72 61 6e 67 65 5f 69 6e 76 61 6c 69 64 22 3b  "range_invalid";
3fd0: 0a 0a 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ......filed_log_
3fe0: 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 09 09 09 7d  entry(log);....}
3ff0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
4000: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
4010: 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 3d  .range.length ==
4020: 20 28 28 6f 66 66 5f 74 29 20 2d 31 29 29 20 7b   ((off_t) -1)) {
4030: 0a 09 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ......filed_log_
4040: 6d 73 67 5f 64 65 62 75 67 28 22 43 6f 6d 70 75  msg_debug("Compu
4050: 74 69 6e 67 20 6c 65 6e 67 74 68 20 74 6f 20 66  ting length to f
4060: 69 74 20 69 6e 20 62 6f 75 6e 64 73 3a 20 66 69  it in bounds: fi
4070: 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 3d 20 25 6c  leinfo->len = %l
4080: 6c 75 2c 20 72 65 71 75 65 73 74 2d 3e 68 65 61  lu, request->hea
4090: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
40a0: 74 20 3d 20 25 6c 6c 75 22 2c 0a 09 09 09 09 09  t = %llu",......
40b0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
40c0: 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e  long) fileinfo->
40d0: 6c 65 6e 2c 0a 09 09 09 09 09 09 28 75 6e 73 69  len,.......(unsi
40e0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
40f0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
4100: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09  .range.offset...
4110: 09 09 09 29 3b 0a 0a 09 09 09 09 09 72 65 71 75  ...);.......requ
4120: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
4130: 67 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65  ge.length = file
4140: 69 6e 66 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75  info->len - requ
4150: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
4160: 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09 09 7d  ge.offset;.....}
4170: 0a 0a 09 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ......filed_log_
4180: 6d 73 67 5f 64 65 62 75 67 28 22 50 61 72 74 69  msg_debug("Parti
4190: 61 6c 20 72 65 71 75 65 73 74 2c 20 73 74 61 72  al request, star
41a0: 74 69 6e 67 20 61 74 3a 20 25 6c 6c 75 20 61 6e  ting at: %llu an
41b0: 64 20 72 75 6e 6e 69 6e 67 20 66 6f 72 20 25 6c  d running for %l
41c0: 6c 69 20 62 79 74 65 73 22 2c 0a 09 09 09 09 09  li bytes",......
41d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
41e0: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
41f0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
4200: 65 74 2c 0a 09 09 09 09 09 28 6c 6f 6e 67 20 6c  et,......(long l
4210: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
4220: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
4230: 74 68 0a 09 09 09 09 29 3b 0a 0a 09 09 09 09 68  th.....);......h
4240: 74 74 70 5f 63 6f 64 65 20 3d 20 32 30 36 3b 0a  ttp_code = 206;.
4250: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
4260: 09 09 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e  ...if (request->
4270: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 70 72  headers.range.pr
4280: 65 73 65 6e 74 29 20 7b 0a 09 09 09 09 68 74 74  esent) {.....htt
4290: 70 5f 63 6f 64 65 20 3d 20 32 30 36 3b 0a 09 09  p_code = 206;...
42a0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 68 74  .} else {.....ht
42b0: 74 70 5f 63 6f 64 65 20 3d 20 32 30 30 3b 0a 09  tp_code = 200;..
42c0: 09 09 7d 0a 09 09 09 72 65 71 75 65 73 74 2d 3e  ..}....request->
42d0: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
42e0: 66 73 65 74 20 3d 20 30 3b 0a 09 09 09 72 65 71  fset = 0;....req
42f0: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
4300: 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c  nge.length = fil
4310: 65 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 09 09 7d 0a  einfo->len;...}.
4320: 0a 09 09 69 66 20 28 68 74 74 70 5f 63 6f 64 65  ...if (http_code
4330: 20 3e 20 30 29 20 7b 0a 09 09 09 66 70 72 69 6e   > 0) {....fprin
4340: 74 66 28 66 70 2c 20 22 48 54 54 50 2f 31 2e 31  tf(fp, "HTTP/1.1
4350: 20 25 69 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20   %i OK\r\nDate: 
4360: 25 73 5c 72 5c 6e 53 65 72 76 65 72 3a 20 66 69  %s\r\nServer: fi
4370: 6c 65 64 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69  led\r\nLast-Modi
4380: 66 69 65 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74  fied: %s\r\nCont
4390: 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75  ent-Length: %llu
43a0: 5c 72 5c 6e 41 63 63 65 70 74 2d 52 61 6e 67 65  \r\nAccept-Range
43b0: 73 3a 20 62 79 74 65 73 5c 72 5c 6e 43 6f 6e 74  s: bytes\r\nCont
43c0: 65 6e 74 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e  ent-Type: %s\r\n
43d0: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73  Connection: clos
43e0: 65 5c 72 5c 6e 22 2c 0a 09 09 09 09 68 74 74 70  e\r\n",.....http
43f0: 5f 63 6f 64 65 2c 0a 09 09 09 09 64 61 74 65 5f  _code,.....date_
4400: 63 75 72 72 65 6e 74 2c 0a 09 09 09 09 66 69 6c  current,.....fil
4410: 65 69 6e 66 6f 2d 3e 6c 61 73 74 6d 6f 64 2c 0a  einfo->lastmod,.
4420: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
4430: 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73 74  ng long) request
4440: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
4450: 6c 65 6e 67 74 68 2c 0a 09 09 09 09 66 69 6c 65  length,.....file
4460: 69 6e 66 6f 2d 3e 74 79 70 65 0a 09 09 09 29 3b  info->type....);
4470: 0a 09 09 09 69 66 20 28 68 74 74 70 5f 63 6f 64  ....if (http_cod
4480: 65 20 3d 3d 20 32 30 36 29 20 7b 0a 09 09 09 09  e == 206) {.....
4490: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 43 6f 6e  fprintf(fp, "Con
44a0: 74 65 6e 74 2d 52 61 6e 67 65 3a 20 62 79 74 65  tent-Range: byte
44b0: 73 20 25 6c 6c 75 2d 25 6c 6c 75 2f 25 6c 6c 75  s %llu-%llu/%llu
44c0: 5c 72 5c 6e 22 2c 0a 09 09 09 09 09 28 75 6e 73  \r\n",......(uns
44d0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
44e0: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
44f0: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c 0a  s.range.offset,.
4500: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
4510: 6f 6e 67 20 6c 6f 6e 67 29 20 28 72 65 71 75 65  ong long) (reque
4520: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
4530: 65 2e 6f 66 66 73 65 74 20 2b 20 72 65 71 75 65  e.offset + reque
4540: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
4550: 65 2e 6c 65 6e 67 74 68 20 2d 20 31 29 2c 0a 09  e.length - 1),..
4560: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
4570: 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e 66  ng long) fileinf
4580: 6f 2d 3e 6c 65 6e 0a 09 09 09 09 29 3b 0a 09 09  o->len.....);...
4590: 09 7d 0a 09 09 09 66 70 72 69 6e 74 66 28 66 70  .}....fprintf(fp
45a0: 2c 20 22 5c 72 5c 6e 22 29 3b 0a 09 09 09 66 66  , "\r\n");....ff
45b0: 6c 75 73 68 28 66 70 29 3b 0a 0a 09 09 09 6c 6f  lush(fp);.....lo
45c0: 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 68  g->http_code = h
45d0: 74 74 70 5f 63 6f 64 65 3b 0a 09 09 09 6c 6f 67  ttp_code;....log
45e0: 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 4f 4b 22 3b  ->reason = "OK";
45f0: 0a 09 09 09 6c 6f 67 2d 3e 73 74 61 72 74 74 69  ....log->startti
4600: 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b  me = time(NULL);
4610: 0a 09 09 09 6c 6f 67 2d 3e 72 65 71 5f 6f 66 66  ....log->req_off
4620: 73 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68  set = request->h
4630: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66  eaders.range.off
4640: 73 65 74 3b 0a 09 09 09 6c 6f 67 2d 3e 72 65 71  set;....log->req
4650: 5f 6c 65 6e 67 74 68 20 3d 20 72 65 71 75 65 73  _length = reques
4660: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
4670: 2e 6c 65 6e 67 74 68 3b 0a 09 09 09 6c 6f 67 2d  .length;....log-
4680: 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 66  >file_length = f
4690: 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 0a 23  ileinfo->len;..#
46a0: 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42  ifdef FILED_NONB
46b0: 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69 6e 74  LOCK_HTTP....int
46c0: 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73 3b 0a 09   socket_flags;..
46d0: 09 09 66 64 5f 73 65 74 20 72 66 64 2c 20 77 66  ..fd_set rfd, wf
46e0: 64 3b 0a 09 09 09 63 68 61 72 20 73 69 6e 6b 62  d;....char sinkb
46f0: 75 66 5b 38 31 39 32 5d 3b 0a 09 09 09 73 73 69  uf[8192];....ssi
4700: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 0a  ze_t read_ret;..
4710: 09 09 09 46 44 5f 5a 45 52 4f 28 26 72 66 64 29  ...FD_ZERO(&rfd)
4720: 3b 0a 09 09 09 46 44 5f 5a 45 52 4f 28 26 77 66  ;....FD_ZERO(&wf
4730: 64 29 3b 0a 09 09 09 46 44 5f 53 45 54 28 66 64  d);....FD_SET(fd
4740: 2c 20 26 72 66 64 29 3b 0a 09 09 09 46 44 5f 53  , &rfd);....FD_S
4750: 45 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a 09  ET(fd, &wfd);...
4760: 09 09 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20 3d  ..socket_flags =
4770: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
4780: 46 4c 29 3b 0a 09 09 09 66 63 6e 74 6c 28 66 64  FL);....fcntl(fd
4790: 2c 20 46 5f 53 45 54 46 4c 2c 20 73 6f 63 6b 65  , F_SETFL, socke
47a0: 74 5f 66 6c 61 67 73 20 7c 20 4f 5f 4e 4f 4e 42  t_flags | O_NONB
47b0: 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  LOCK);.#endif...
47c0: 09 09 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65  ..sendfile_offse
47d0: 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61  t = request->hea
47e0: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
47f0: 74 3b 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f 6c  t;....sendfile_l
4800: 65 6e 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65  en = request->he
4810: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
4820: 74 68 3b 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f  th;....sendfile_
4830: 73 65 6e 74 20 3d 20 30 3b 0a 09 09 09 77 68 69  sent = 0;....whi
4840: 6c 65 20 28 31 29 20 7b 0a 09 09 09 09 69 66 20  le (1) {.....if 
4850: 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3e 20  (sendfile_len > 
4860: 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c 45 5f 4d  FILED_SENDFILE_M
4870: 41 58 29 20 7b 0a 09 09 09 09 09 73 65 6e 64 66  AX) {......sendf
4880: 69 6c 65 5f 73 69 7a 65 20 3d 20 46 49 4c 45 44  ile_size = FILED
4890: 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 3b 0a 09  _SENDFILE_MAX;..
48a0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
48b0: 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d  .sendfile_size =
48c0: 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 3b 0a 09   sendfile_len;..
48d0: 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 66 69  ...}......sendfi
48e0: 6c 65 5f 72 65 74 20 3d 20 73 65 6e 64 66 69 6c  le_ret = sendfil
48f0: 65 28 66 64 2c 20 66 69 6c 65 69 6e 66 6f 2d 3e  e(fd, fileinfo->
4900: 66 64 2c 20 26 73 65 6e 64 66 69 6c 65 5f 6f 66  fd, &sendfile_of
4910: 66 73 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73  fset, sendfile_s
4920: 69 7a 65 29 3b 0a 09 09 09 09 69 66 20 28 73 65  ize);.....if (se
4930: 6e 64 66 69 6c 65 5f 72 65 74 20 3c 3d 20 30 29  ndfile_ret <= 0)
4940: 20 7b 0a 23 69 66 64 65 66 20 46 49 4c 45 44 5f   {.#ifdef FILED_
4950: 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 09  NONBLOCK_HTTP...
4960: 09 09 09 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20  ...if (errno == 
4970: 45 41 47 41 49 4e 29 20 7b 0a 09 09 09 09 09 09  EAGAIN) {.......
4980: 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3d 20 30  sendfile_ret = 0
4990: 3b 0a 0a 09 09 09 09 09 09 77 68 69 6c 65 20 28  ;........while (
49a0: 31 29 20 7b 0a 09 09 09 09 09 09 09 73 65 6c 65  1) {........sele
49b0: 63 74 28 66 64 20 2b 20 31 2c 20 26 72 66 64 2c  ct(fd + 1, &rfd,
49c0: 20 26 77 66 64 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   &wfd, NULL, NUL
49d0: 4c 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28 46  L);........if (F
49e0: 44 5f 49 53 53 45 54 28 66 64 2c 20 26 72 66 64  D_ISSET(fd, &rfd
49f0: 29 29 20 7b 0a 09 09 09 09 09 09 09 09 72 65 61  )) {.........rea
4a00: 64 5f 72 65 74 20 3d 20 72 65 61 64 28 66 64 2c  d_ret = read(fd,
4a10: 20 73 69 6e 6b 62 75 66 2c 20 73 69 7a 65 6f 66   sinkbuf, sizeof
4a20: 28 73 69 6e 6b 62 75 66 29 29 3b 0a 0a 09 09 09  (sinkbuf));.....
4a30: 09 09 09 09 09 69 66 20 28 72 65 61 64 5f 72 65  .....if (read_re
4a40: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  t <= 0) {.......
4a50: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
4a60: 09 09 7d 0a 09 09 09 09 09 09 09 7d 0a 0a 09 09  ..}........}....
4a70: 09 09 09 09 09 69 66 20 28 46 44 5f 49 53 53 45  .....if (FD_ISSE
4a80: 54 28 66 64 2c 20 26 77 66 64 29 29 20 7b 0a 09  T(fd, &wfd)) {..
4a90: 09 09 09 09 09 09 09 72 65 61 64 5f 72 65 74 20  .......read_ret 
4aa0: 3d 20 31 3b 0a 0a 09 09 09 09 09 09 09 09 62 72  = 1;..........br
4ab0: 65 61 6b 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09  eak;........}...
4ac0: 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 69 66 20  ....}........if 
4ad0: 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  (read_ret <= 0) 
4ae0: 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  {........break;.
4af0: 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
4b00: 6c 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61  lse {.......brea
4b10: 6b 3b 0a 09 09 09 09 09 7d 0a 23 65 6c 73 65 0a  k;......}.#else.
4b20: 09 09 09 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64  .....break;.#end
4b30: 69 66 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65  if.....}......se
4b40: 6e 64 66 69 6c 65 5f 6c 65 6e 20 2d 3d 20 73 65  ndfile_len -= se
4b50: 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 09 09 09  ndfile_ret;.....
4b60: 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 20 2b 3d  sendfile_sent +=
4b70: 20 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09   sendfile_ret;..
4b80: 09 09 09 69 66 20 28 73 65 6e 64 66 69 6c 65 5f  ...if (sendfile_
4b90: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  len == 0) {.....
4ba0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
4bb0: 09 7d 0a 0a 09 09 09 6c 6f 67 2d 3e 65 6e 64 74  .}.....log->endt
4bc0: 69 6d 65 20 3d 20 28 74 69 6d 65 5f 74 29 20 2d  ime = (time_t) -
4bd0: 31 3b 0a 09 09 09 6c 6f 67 2d 3e 73 65 6e 74 5f  1;....log->sent_
4be0: 6c 65 6e 67 74 68 20 3d 20 73 65 6e 64 66 69 6c  length = sendfil
4bf0: 65 5f 73 65 6e 74 3b 0a 0a 09 09 09 66 69 6c 65  e_sent;.....file
4c00: 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29  d_log_entry(log)
4c10: 3b 0a 09 09 7d 0a 0a 09 09 63 6c 6f 73 65 28 66  ;...}....close(f
4c20: 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b 0a 09 7d  ileinfo->fd);..}
4c30: 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29 3b 0a 0a  ...fclose(fp);..
4c40: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 48  .return;.}../* H
4c50: 61 6e 64 6c 65 20 69 6e 63 6f 6d 69 6e 67 20 63  andle incoming c
4c60: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 73 74  onnections */.st
4c70: 61 74 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64  atic void *filed
4c80: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 28 76  _worker_thread(v
4c90: 6f 69 64 20 2a 61 72 67 5f 76 29 20 7b 0a 09 73  oid *arg_v) {..s
4ca0: 74 72 75 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b  truct filed_work
4cb0: 65 72 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a  er_thread_args *
4cc0: 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66 69 6c  arg;..struct fil
4cd0: 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74 20  ed_http_request 
4ce0: 72 65 71 75 65 73 74 3b 0a 09 73 74 72 75 63 74  request;..struct
4cf0: 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79   filed_log_entry
4d00: 20 2a 6c 6f 67 2c 20 6c 6f 63 61 6c 5f 64 75 6d   *log, local_dum
4d10: 6d 79 5f 6c 6f 67 3b 0a 09 73 74 72 75 63 74 20  my_log;..struct 
4d20: 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 61 64 64  sockaddr_in6 add
4d30: 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 61 64  r;..socklen_t ad
4d40: 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66 61 69 6c  drlen;..int fail
4d50: 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 6d  ure_count = 0, m
4d60: 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74  ax_failure_count
4d70: 20 3d 20 46 49 4c 45 44 5f 4d 41 58 5f 46 41 49   = FILED_MAX_FAI
4d80: 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74  LURE_COUNT;..int
4d90: 20 6d 61 73 74 65 72 5f 66 64 2c 20 66 64 3b 0a   master_fd, fd;.
4da0: 0a 09 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65  ../* Read argume
4db0: 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d 20 61 72  nts */..arg = ar
4dc0: 67 5f 76 3b 0a 0a 09 6d 61 73 74 65 72 5f 66 64  g_v;...master_fd
4dd0: 20 3d 20 61 72 67 2d 3e 66 64 3b 0a 0a 09 77 68   = arg->fd;...wh
4de0: 69 6c 65 20 28 31 29 20 7b 0a 09 09 2f 2a 20 46  ile (1) {.../* F
4df0: 61 69 6c 75 72 65 20 6c 6f 6f 70 20 70 72 65 76  ailure loop prev
4e00: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 09 69 66 20 28  ention */...if (
4e10: 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3e 20  failure_count > 
4e20: 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f 75 6e  max_failure_coun
4e30: 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  t) {....break;..
4e40: 09 7d 0a 0a 09 09 2f 2a 20 41 63 63 65 70 74 20  .}..../* Accept 
4e50: 61 20 6e 65 77 20 63 6c 69 65 6e 74 20 2a 2f 0a  a new client */.
4e60: 09 09 61 64 64 72 6c 65 6e 20 3d 20 73 69 7a 65  ..addrlen = size
4e70: 6f 66 28 61 64 64 72 29 3b 0a 09 09 66 64 20 3d  of(addr);...fd =
4e80: 20 61 63 63 65 70 74 28 6d 61 73 74 65 72 5f 66   accept(master_f
4e90: 64 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61  d, (struct socka
4ea0: 64 64 72 20 2a 29 20 26 61 64 64 72 2c 20 26 61  ddr *) &addr, &a
4eb0: 64 64 72 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 0a 09  ddrlen);..../*..
4ec0: 09 20 2a 20 49 66 20 77 65 20 66 61 69 6c 2c 20  . * If we fail, 
4ed0: 6d 61 6b 65 20 61 20 6e 6f 74 65 20 6f 66 20 69  make a note of i
4ee0: 74 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 67 6f  t so we don't go
4ef0: 20 69 6e 74 6f 20 61 20 6c 6f 6f 70 20 6f 66 0a   into a loop of.
4f00: 09 09 20 2a 20 61 63 63 65 70 74 28 29 20 66 61  .. * accept() fa
4f10: 69 6c 69 6e 67 0a 09 09 20 2a 2f 0a 09 09 69 66  iling... */...if
4f20: 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 09 2f   (fd < 0) {..../
4f30: 2a 20 4c 6f 67 20 74 68 65 20 6e 65 77 20 63 6f  * Log the new co
4f40: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 66  nnection */....f
4f50: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 41 43  iled_log_msg("AC
4f60: 43 45 50 54 5f 46 41 49 4c 45 44 22 29 3b 0a 0a  CEPT_FAILED");..
4f70: 09 09 09 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74  ...failure_count
4f80: 2b 2b 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ++;.....continue
4f90: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 4c 6f 67 20  ;...}..../* Log 
4fa0: 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
4fb0: 6f 6e 20 2a 2f 0a 09 09 6c 6f 67 20 3d 20 66 69  on */...log = fi
4fc0: 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 31 29 3b 0a  led_log_new(1);.
4fd0: 09 09 69 66 20 28 6c 6f 67 20 3d 3d 20 4e 55 4c  ..if (log == NUL
4fe0: 4c 29 20 7b 0a 09 09 09 63 6c 6f 73 65 28 66 64  L) {....close(fd
4ff0: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
5000: 0a 09 09 7d 0a 0a 09 09 6c 6f 67 2d 3e 74 79 70  ...}....log->typ
5010: 65 20 3d 20 46 49 4c 45 44 5f 4c 4f 47 5f 54 59  e = FILED_LOG_TY
5020: 50 45 5f 54 52 41 4e 53 46 45 52 3b 0a 09 09 69  PE_TRANSFER;...i
5030: 66 20 28 66 69 6c 65 64 5f 6c 6f 67 5f 69 70 28  f (filed_log_ip(
5040: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72  (struct sockaddr
5050: 20 2a 29 20 26 61 64 64 72 2c 20 6c 6f 67 2d 3e   *) &addr, log->
5060: 69 70 2c 20 73 69 7a 65 6f 66 28 6c 6f 67 2d 3e  ip, sizeof(log->
5070: 69 70 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ip)) == NULL) {.
5080: 09 09 09 6c 6f 67 2d 3e 69 70 5b 30 5d 20 3d 20  ...log->ip[0] = 
5090: 27 5c 30 27 3b 0a 09 09 7d 0a 09 09 6c 6f 67 2d  '\0';...}...log-
50a0: 3e 70 6f 72 74 20 3d 20 61 64 64 72 2e 73 69 6e  >port = addr.sin
50b0: 36 5f 70 6f 72 74 3b 0a 0a 09 09 2f 2a 20 52 65  6_port;..../* Re
50c0: 73 65 74 20 66 61 69 6c 75 72 65 20 63 6f 75 6e  set failure coun
50d0: 74 2a 2f 0a 09 09 66 61 69 6c 75 72 65 5f 63 6f  t*/...failure_co
50e0: 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 2f 2a 20 48  unt = 0;..../* H
50f0: 61 6e 64 6c 65 20 73 6f 63 6b 65 74 20 2a 2f 0a  andle socket */.
5100: 09 09 66 69 6c 65 64 5f 68 61 6e 64 6c 65 5f 63  ..filed_handle_c
5110: 6c 69 65 6e 74 28 66 64 2c 20 26 72 65 71 75 65  lient(fd, &reque
5120: 73 74 2c 20 6c 6f 67 29 3b 0a 09 7d 0a 0a 09 2f  st, log);..}.../
5130: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 20 2a  * Report error *
5140: 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  /..filed_log_msg
5150: 28 22 54 48 52 45 41 44 5f 44 49 45 44 20 41 42  ("THREAD_DIED AB
5160: 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72 65 74 75  NORMAL");...retu
5170: 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 6c  rn(NULL);.../* l
5180: 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 20 69  ocal_dummy_log i
5190: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 46  s only used if F
51a0: 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 20 69 73  ILED_DONT_LOG is
51b0: 20 61 6e 65 62 6c 65 64 2c 20 6f 74 68 65 72 77   anebled, otherw
51c0: 69 73 65 20 69 74 27 73 20 6e 6f 74 20 75 73 65  ise it's not use
51d0: 64 2c 20 62 75 74 20 74 68 65 20 63 6f 6d 70 69  d, but the compi
51e0: 6c 65 72 20 68 61 74 65 73 20 74 68 61 74 20 69  ler hates that i
51f0: 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61 6c 5f 64  dea. */..local_d
5200: 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65 20 3d 20  ummy_log.type = 
5210: 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f  0;..local_dummy_
5220: 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f 63 61 6c  log.type = local
5230: 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65 3b  _dummy_log.type;
5240: 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 77 6f  .}../* Create wo
5250: 72 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a  rker threads */.
5260: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 64  static int filed
5270: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f  _worker_threads_
5280: 69 6e 69 74 28 69 6e 74 20 66 64 2c 20 69 6e 74  init(int fd, int
5290: 20 74 68 72 65 61 64 5f 63 6f 75 6e 74 29 20 7b   thread_count) {
52a0: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  ..struct filed_w
52b0: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
52c0: 73 20 2a 61 72 67 3b 0a 09 70 74 68 72 65 61 64  s *arg;..pthread
52d0: 5f 74 20 74 68 72 65 61 64 69 64 3b 0a 09 69 6e  _t threadid;..in
52e0: 74 20 70 74 68 72 65 61 64 5f 72 65 74 3b 0a 09  t pthread_ret;..
52f0: 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28 69 20  int i;...for (i 
5300: 3d 20 30 3b 20 69 20 3c 20 74 68 72 65 61 64 5f  = 0; i < thread_
5310: 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 09  count; i++) {...
5320: 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  arg = malloc(siz
5330: 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a 09 09 61  eof(*arg));....a
5340: 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a 0a 09 09  rg->fd = fd;....
5350: 70 74 68 72 65 61 64 5f 72 65 74 20 3d 20 70 74  pthread_ret = pt
5360: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 68  hread_create(&th
5370: 72 65 61 64 69 64 2c 20 4e 55 4c 4c 2c 20 66 69  readid, NULL, fi
5380: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
5390: 64 2c 20 61 72 67 29 3b 0a 09 09 69 66 20 28 70  d, arg);...if (p
53a0: 74 68 72 65 61 64 5f 72 65 74 20 21 3d 20 30 29  thread_ret != 0)
53b0: 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29   {....return(-1)
53c0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
53d0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 69 73 70  n(0);.}../* Disp
53e0: 6c 61 79 20 68 65 6c 70 20 2a 2f 0a 73 74 61 74  lay help */.stat
53f0: 69 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 70 72  ic void filed_pr
5400: 69 6e 74 5f 68 65 6c 70 28 46 49 4c 45 20 2a 6f  int_help(FILE *o
5410: 75 74 70 75 74 2c 20 69 6e 74 20 6c 6f 6e 67 5f  utput, int long_
5420: 68 65 6c 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  help, const char
5430: 20 2a 65 78 74 72 61 29 20 7b 0a 09 69 66 20 28   *extra) {..if (
5440: 65 78 74 72 61 29 20 7b 0a 09 09 66 70 72 69 6e  extra) {...fprin
5450: 74 66 28 6f 75 74 70 75 74 2c 20 22 25 73 5c 6e  tf(output, "%s\n
5460: 22 2c 20 65 78 74 72 61 29 3b 0a 09 7d 0a 0a 09  ", extra);..}...
5470: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
5480: 22 55 73 61 67 65 3a 20 66 69 6c 65 64 20 5b 3c  "Usage: filed [<
5490: 6f 70 74 69 6f 6e 73 3e 5d 5c 6e 22 29 3b 0a 09  options>]\n");..
54a0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
54b0: 22 20 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 29 3b  "  Options:\n");
54c0: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
54d0: 2c 20 22 20 20 20 20 20 20 2d 68 2c 20 2d 2d 68  , "      -h, --h
54e0: 65 6c 70 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  elp\n");..fprint
54f0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5500: 20 2d 64 2c 20 2d 2d 64 61 65 6d 6f 6e 5c 6e 22   -d, --daemon\n"
5510: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
5520: 75 74 2c 20 22 20 20 20 20 20 20 2d 76 2c 20 2d  ut, "      -v, -
5530: 2d 76 65 72 73 69 6f 6e 5c 6e 22 29 3b 0a 09 66  -version\n");..f
5540: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5550: 20 20 20 20 20 20 2d 62 20 3c 61 64 64 72 65 73        -b <addres
5560: 73 3e 2c 20 2d 2d 62 69 6e 64 20 3c 61 64 64 72  s>, --bind <addr
5570: 65 73 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  ess>\n");..fprin
5580: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
5590: 20 20 2d 70 20 3c 70 6f 72 74 3e 2c 20 2d 2d 70    -p <port>, --p
55a0: 6f 72 74 20 3c 70 6f 72 74 3e 5c 6e 22 29 3b 0a  ort <port>\n");.
55b0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
55c0: 20 22 20 20 20 20 20 20 2d 74 20 3c 63 6f 75 6e   "      -t <coun
55d0: 74 3e 2c 20 2d 2d 74 68 72 65 61 64 73 20 3c 63  t>, --threads <c
55e0: 6f 75 6e 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  ount>\n");..fpri
55f0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5600: 20 20 20 2d 63 20 3c 65 6e 74 72 69 65 73 3e 2c     -c <entries>,
5610: 20 2d 2d 63 61 63 68 65 20 3c 65 6e 74 72 69 65   --cache <entrie
5620: 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  s>\n");..fprintf
5630: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
5640: 2d 6c 20 3c 66 69 6c 65 3e 2c 20 2d 2d 6c 6f 67  -l <file>, --log
5650: 20 3c 66 69 6c 65 3e 5c 6e 22 29 3b 0a 09 66 70   <file>\n");..fp
5660: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5670: 20 20 20 20 20 2d 75 20 3c 75 73 65 72 3e 2c 20       -u <user>, 
5680: 2d 2d 75 73 65 72 20 3c 75 73 65 72 3e 5c 6e 22  --user <user>\n"
5690: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
56a0: 75 74 2c 20 22 20 20 20 20 20 20 2d 72 20 3c 64  ut, "      -r <d
56b0: 69 72 65 63 74 6f 72 79 3e 2c 20 2d 2d 72 6f 6f  irectory>, --roo
56c0: 74 20 3c 64 69 72 65 63 74 6f 72 79 3e 5c 6e 22  t <directory>\n"
56d0: 29 3b 0a 0a 09 69 66 20 28 6c 6f 6e 67 5f 68 65  );...if (long_he
56e0: 6c 70 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  lp) {...fprintf(
56f0: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
5700: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5710: 20 22 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a   "  Usage:\n");.
5720: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5730: 2c 20 22 20 20 20 20 20 20 2d 68 20 28 6f 72 20  , "      -h (or 
5740: 2d 2d 68 65 6c 70 29 20 70 72 69 6e 74 73 20 74  --help) prints t
5750: 68 69 73 20 75 73 61 67 65 20 69 6e 66 6f 72 6d  his usage inform
5760: 61 74 69 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70  ation.\n");...fp
5770: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
5780: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5790: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64  utput, "      -d
57a0: 20 28 6f 72 20 2d 2d 64 61 65 6d 6f 6e 29 20 69   (or --daemon) i
57b0: 6e 73 74 72 75 63 74 73 20 66 69 6c 65 64 20 74  nstructs filed t
57c0: 6f 20 62 65 63 6f 6d 65 20 61 20 64 61 65 6d 6f  o become a daemo
57d0: 6e 20 61 66 74 65 72 20 69 6e 69 74 69 61 6c 69  n after initiali
57e0: 7a 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69  zing\n");...fpri
57f0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 74 68 65 20 6c 69 73 74 65 6e 69 6e      the listenin
5820: 67 20 54 43 50 20 73 6f 63 6b 65 74 20 61 6e 64  g TCP socket and
5830: 20 6c 6f 67 20 66 69 6c 65 73 2e 5c 6e 22 29 3b   log files.\n");
5840: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5850: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
5860: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5870: 20 20 20 2d 76 20 28 6f 72 20 2d 2d 76 65 72 73     -v (or --vers
5880: 69 6f 6e 29 20 69 6e 73 74 72 75 63 74 73 20 66  ion) instructs f
5890: 69 6c 65 64 20 70 72 69 6e 74 20 6f 75 74 20 74  iled print out t
58a0: 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
58b0: 72 20 61 6e 64 20 65 78 69 74 2e 5c 6e 22 29 3b  r and exit.\n");
58c0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
58d0: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
58e0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
58f0: 20 20 20 2d 62 20 28 6f 72 20 2d 2d 62 69 6e 64     -b (or --bind
5900: 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  ) specifies the 
5910: 61 64 64 72 65 73 73 20 74 6f 20 6c 69 73 74 65  address to liste
5920: 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e 67 20 48  n for incoming H
5930: 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  TTP\n");...fprin
5940: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 72 65 71 75 65 73 74 73 20 6f 6e 2e 20 20 54   requests on.  T
5970: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
5980: 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 20   is \"%s\".\n", 
5990: 42 49 4e 44 5f 41 44 44 52 29 3b 0a 09 09 66 70  BIND_ADDR);...fp
59a0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
59b0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
59c0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 70  utput, "      -p
59d0: 20 28 6f 72 20 2d 2d 70 6f 72 74 29 20 73 70 65   (or --port) spe
59e0: 63 69 66 69 65 73 20 74 68 65 20 54 43 50 20 70  cifies the TCP p
59f0: 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 20 6c 69  ort number to li
5a00: 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e  sten for incomin
5a10: 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70  g HTTP\n");...fp
5a20: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 72 65 71 75 65 73 74 73 20 6f 6e 2e      requests on.
5a50: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
5a60: 20 25 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e   %u.\n", (unsign
5a70: 65 64 20 69 6e 74 29 20 50 4f 52 54 29 3b 0a 09  ed int) PORT);..
5a80: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5a90: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
5aa0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5ab0: 20 2d 74 20 28 6f 72 20 2d 2d 74 68 72 65 61 64   -t (or --thread
5ac0: 73 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65  s) specifies the
5ad0: 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 65   number of worke
5ae0: 72 20 74 68 72 65 61 64 73 20 74 6f 20 63 72 65  r threads to cre
5af0: 61 74 65 2e 20 45 61 63 68 5c 6e 22 29 3b 0a 09  ate. Each\n");..
5b00: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5b10: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5b20: 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 65 72            worker
5b30: 20 74 68 72 65 61 64 20 63 61 6e 20 73 65 72 76   thread can serv
5b40: 69 63 65 20 6f 6e 65 20 63 6f 6e 63 75 72 72 65  ice one concurre
5b50: 6e 74 20 48 54 54 50 20 73 65 73 73 69 6f 6e 2e  nt HTTP session.
5b60: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
5b70: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 54 68 75 73 20 74 68 65 20 6e 75 6d 62 65 72   Thus the number
5ba0: 20 6f 66 20 74 68 72 65 61 64 73 20 63 72 65 61   of threads crea
5bb0: 74 65 64 20 77 69 6c 6c 20 64 65 74 65 72 6d 69  ted will determi
5bc0: 6e 65 20 68 6f 77 5c 6e 22 29 3b 0a 09 09 66 70  ne how\n");...fp
5bd0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 20 20 20 20 20 20 6d 61 6e 79 20 73 69 6d 75         many simu
5c00: 6c 74 61 6e 65 6f 75 73 20 74 72 61 6e 73 66 65  ltaneous transfe
5c10: 72 73 20 77 69 6c 6c 20 62 65 20 70 6f 73 73 69  rs will be possi
5c20: 62 6c 65 2e 20 54 68 65 5c 6e 22 29 3b 0a 09 09  ble. The\n");...
5c30: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
5c40: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5c50: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
5c60: 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e   is %lu.\n", (un
5c70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 48 52  signed long) THR
5c80: 45 41 44 5f 43 4f 55 4e 54 29 3b 0a 09 09 66 70  EAD_COUNT);...fp
5c90: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
5ca0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5cb0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 63  utput, "      -c
5cc0: 20 28 6f 72 20 2d 2d 63 61 63 68 65 29 20 73 70   (or --cache) sp
5cd0: 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
5ce0: 65 72 20 6f 66 20 66 69 6c 65 20 69 6e 66 6f 72  er of file infor
5cf0: 6d 61 74 69 6f 6e 20 63 61 63 68 65 20 65 6e 74  mation cache ent
5d00: 72 69 65 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69  ries\n");...fpri
5d10: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20     to allocate. 
5d40: 20 45 61 63 68 20 63 61 63 68 65 20 65 6e 74 72   Each cache entr
5d50: 79 20 68 6f 6c 64 73 20 66 69 6c 65 20 69 6e 66  y holds file inf
5d60: 6f 72 6d 61 74 69 6f 6e 20 61 73 5c 6e 22 29 3b  ormation as\n");
5d70: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5d80: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
5d90: 20 20 20 20 20 20 20 20 20 20 77 65 6c 6c 20 61            well a
5da0: 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  s an open file d
5db0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5dc0: 20 66 69 6c 65 2c 20 73 6f 20 72 65 73 6f 75 72   file, so resour
5dd0: 63 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ce\n");...fprint
5de0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 6c 69 6d 69 74 73 20 28 69 2e 65 2e 2c 20 75   limits (i.e., u
5e10: 6c 69 6d 69 74 29 20 73 68 6f 75 6c 64 20 62 65  limit) should be
5e20: 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68   considered.  Th
5e30: 69 73 20 73 68 6f 75 6c 64 5c 6e 22 29 3b 0a 09  is should\n");..
5e40: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5e50: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
5e60: 20 20 20 20 20 20 20 20 62 65 20 61 20 70 72 69          be a pri
5e70: 6d 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 69 64  me number for id
5e80: 65 61 6c 20 75 73 65 20 77 69 74 68 20 74 68 65  eal use with the
5e90: 20 6c 6f 6f 6b 75 70 20 6d 65 74 68 6f 64 2e 5c   lookup method.\
5ea0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5eb0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
5ed0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 25 6c 75  e default is %lu
5ee0: 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  .\n", (unsigned 
5ef0: 6c 6f 6e 67 29 20 43 41 43 48 45 5f 53 49 5a 45  long) CACHE_SIZE
5f00: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5f10: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
5f20: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5f30: 20 20 20 20 20 2d 6c 20 28 6f 72 20 2d 2d 6c 6f       -l (or --lo
5f40: 67 29 20 73 70 65 63 69 66 69 65 73 20 61 20 66  g) specifies a f
5f50: 69 6c 65 6e 61 6d 65 20 74 6f 20 6f 70 65 6e 20  ilename to open 
5f60: 66 6f 72 20 77 72 69 74 69 6e 67 20 6c 6f 67 20  for writing log 
5f70: 65 6e 74 72 69 65 73 2e 20 20 4c 6f 67 5c 6e 22  entries.  Log\n"
5f80: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5f90: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
5fa0: 20 20 20 20 20 20 20 20 20 20 65 6e 74 72 69 65            entrie
5fb0: 73 20 61 72 65 20 6d 61 64 65 20 66 6f 72 20 76  s are made for v
5fc0: 61 72 69 6f 75 73 20 73 74 61 67 65 73 20 69 6e  arious stages in
5fd0: 20 74 72 61 6e 73 66 65 72 69 6e 67 20 66 69 6c   transfering fil
5fe0: 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  es.\n");...fprin
5ff0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 54 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  The log file is 
6020: 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 73 77  opened before sw
6030: 69 74 63 68 69 6e 67 20 75 73 65 72 73 20 28 73  itching users (s
6040: 65 65 20 5c 22 2d 75 5c 22 29 5c 6e 22 29 3b 0a  ee \"-u\")\n");.
6050: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
6060: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
6070: 20 20 20 20 20 20 20 61 6e 64 20 72 6f 6f 74 20         and root 
6080: 64 69 72 65 63 74 6f 72 69 65 73 20 28 73 65 65  directories (see
6090: 20 5c 22 2d 72 5c 22 29 2e 20 20 54 68 65 20 6c   \"-r\").  The l
60a0: 6f 67 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  og file is never
60b0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
60c0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
60e0: 73 65 64 20 73 6f 20 6c 6f 67 20 72 6f 74 61 74  sed so log rotat
60f0: 69 6f 6e 20 77 69 74 68 6f 75 74 20 73 74 6f 70  ion without stop
6100: 70 69 6e 67 20 74 68 65 20 64 61 65 6d 6f 6e 20  ping the daemon 
6110: 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66  is will\n");...f
6120: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 6e 6f 74 20 77 6f 72 6b 2e 20 20 54      not work.  T
6150: 68 65 20 76 61 6c 75 65 20 6f 66 20 5c 22 2d 5c  he value of \"-\
6160: 22 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  " indicates that
6170: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
6180: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
6190: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
61b0: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
61c0: 6c 6f 67 67 69 6e 67 2e 20 20 54 68 65 20 64 65  logging.  The de
61d0: 66 61 75 6c 74 20 69 73 20 5c 22 25 73 5c 22 2e  fault is \"%s\".
61e0: 5c 6e 22 2c 20 4c 4f 47 5f 46 49 4c 45 29 3b 0a  \n", LOG_FILE);.
61f0: 23 69 66 64 65 66 20 46 49 4c 45 44 5f 44 4f 4e  #ifdef FILED_DON
6200: 54 5f 4c 4f 47 0a 09 09 66 70 72 69 6e 74 66 28  T_LOG...fprintf(
6210: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74               Not
6230: 65 20 74 68 61 74 20 6c 6f 67 67 69 6e 67 20 69  e that logging i
6240: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  s completely dis
6250: 61 62 6c 65 64 20 73 6f 20 74 68 69 73 20 6f 70  abled so this op
6260: 74 69 6f 6e 20 64 6f 65 73 5c 6e 22 29 3b 0a 09  tion does\n");..
6270: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6280: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
6290: 20 20 20 20 20 20 6e 6f 74 68 69 6e 67 20 69 6e        nothing in
62a0: 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29   this build.\n")
62b0: 3b 0a 23 65 6e 64 69 66 0a 09 09 66 70 72 69 6e  ;.#endif...fprin
62c0: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
62d0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
62e0: 75 74 2c 20 22 20 20 20 20 20 20 2d 75 20 28 6f  ut, "      -u (o
62f0: 72 20 2d 2d 75 73 65 72 29 20 73 70 65 63 69 66  r --user) specif
6300: 69 65 73 20 74 68 65 20 75 73 65 72 20 74 6f 20  ies the user to 
6310: 73 77 69 74 63 68 20 75 73 65 72 20 49 44 73 20  switch user IDs 
6320: 74 6f 20 62 65 66 6f 72 65 20 73 65 72 76 69 63  to before servic
6330: 69 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ing\n");...fprin
6340: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6360: 20 72 65 71 75 65 73 74 73 2e 20 20 54 68 65 20   requests.  The 
6370: 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 20 63  default is not c
6380: 68 61 6e 67 65 20 75 73 65 72 20 49 44 73 2e 5c  hange user IDs.\
6390: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
63a0: 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09  utput, "\n");...
63b0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
63c0: 22 20 20 20 20 20 20 2d 72 20 28 6f 72 20 2d 2d  "      -r (or --
63d0: 72 6f 6f 74 29 20 73 70 65 63 69 66 69 65 73 20  root) specifies 
63e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
63f0: 20 61 63 74 20 61 73 20 74 68 65 20 72 6f 6f 74   act as the root
6400: 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 5c 6e   directory for\n
6410: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
6420: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
6430: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
6440: 66 69 6c 65 20 73 65 72 76 65 72 2e 20 20 49 66  file server.  If
6450: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20   this option is 
6460: 73 70 65 63 69 66 69 65 64 2c 20 63 68 72 6f 6f  specified, chroo
6470: 74 28 32 29 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t(2)\n");...fpri
6480: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64a0: 20 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 54 68    is called.  Th
64b0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 6e 6f 74  e default is not
64c0: 20 63 68 61 6e 67 65 20 72 6f 6f 74 20 64 69 72   change root dir
64d0: 65 63 74 6f 72 69 65 73 2c 5c 6e 22 29 3b 0a 09  ectories,\n");..
64e0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
64f0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
6500: 20 20 20 20 20 20 20 74 68 61 74 20 69 73 2c 20         that is, 
6510: 74 68 65 20 5c 22 2f 5c 22 20 64 69 72 65 63 74  the \"/\" direct
6520: 6f 72 79 20 69 73 20 73 68 61 72 65 64 20 6f 75  ory is shared ou
6530: 74 2e 20 20 54 68 69 73 20 77 69 6c 6c 5c 6e 22  t.  This will\n"
6540: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
6550: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
6560: 20 20 20 20 20 20 20 20 20 20 20 6c 69 6b 65 6c             likel
6570: 79 20 62 65 20 61 20 73 65 63 75 72 69 74 79 20  y be a security 
6580: 69 73 73 75 65 2c 20 73 6f 20 74 68 69 73 20 6f  issue, so this o
6590: 70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ption should alw
65a0: 61 79 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ays\n");...fprin
65b0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 62 65 20 75 73 65 64 2e 5c 6e 22 29 3b 0a 09   be used.\n");..
65e0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
65f0: 2a 20 41 64 64 20 61 20 67 65 74 6f 70 74 20 6f  * Add a getopt o
6600: 70 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ption */.static 
6610: 76 6f 69 64 20 66 69 6c 65 64 5f 67 65 74 6f 70  void filed_getop
6620: 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 73 74  t_long_setopt(st
6630: 72 75 63 74 20 6f 70 74 69 6f 6e 20 2a 6f 70 74  ruct option *opt
6640: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61  , const char *na
6650: 6d 65 2c 20 69 6e 74 20 68 61 73 5f 61 72 67 2c  me, int has_arg,
6660: 20 69 6e 74 20 76 61 6c 29 20 7b 0a 09 6f 70 74   int val) {..opt
6670: 2d 3e 6e 61 6d 65 20 20 20 20 20 3d 20 6e 61 6d  ->name     = nam
6680: 65 3b 0a 09 6f 70 74 2d 3e 68 61 73 5f 61 72 67  e;..opt->has_arg
6690: 20 20 3d 20 68 61 73 5f 61 72 67 3b 0a 09 6f 70    = has_arg;..op
66a0: 74 2d 3e 66 6c 61 67 20 20 20 20 20 3d 20 4e 55  t->flag     = NU
66b0: 4c 4c 3b 0a 09 6f 70 74 2d 3e 76 61 6c 20 20 20  LL;..opt->val   
66c0: 20 20 20 3d 20 76 61 6c 3b 0a 0a 09 72 65 74 75     = val;...retu
66d0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76  rn;.}../* Resolv
66e0: 65 20 61 20 75 73 65 72 6e 61 6d 65 20 74 6f 20  e a username to 
66f0: 61 20 55 49 44 20 2a 2f 0a 73 74 61 74 69 63 20  a UID */.static 
6700: 69 6e 74 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c  int filed_user_l
6710: 6f 6f 6b 75 70 28 63 6f 6e 73 74 20 63 68 61 72  ookup(const char
6720: 20 2a 75 73 65 72 2c 20 75 69 64 5f 74 20 2a 75   *user, uid_t *u
6730: 73 65 72 5f 69 64 29 20 7b 0a 09 63 68 61 72 20  ser_id) {..char 
6740: 2a 6e 65 78 74 3b 0a 09 75 69 64 5f 74 20 75 73  *next;..uid_t us
6750: 65 72 5f 69 64 5f 63 68 65 63 6b 3b 0a 23 69 66  er_id_check;.#if
6760: 6e 64 65 66 20 46 49 4c 45 44 5f 4e 4f 5f 47 45  ndef FILED_NO_GE
6770: 54 50 57 4e 41 4d 0a 09 73 74 72 75 63 74 20 70  TPWNAM..struct p
6780: 61 73 73 77 64 20 2a 65 6e 74 3b 0a 0a 09 65 6e  asswd *ent;...en
6790: 74 20 3d 20 67 65 74 70 77 6e 61 6d 28 75 73 65  t = getpwnam(use
67a0: 72 29 3b 0a 09 69 66 20 28 65 6e 74 20 21 3d 20  r);..if (ent != 
67b0: 4e 55 4c 4c 29 20 7b 0a 09 09 2a 75 73 65 72 5f  NULL) {...*user_
67c0: 69 64 20 3d 20 65 6e 74 2d 3e 70 77 5f 75 69 64  id = ent->pw_uid
67d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a  ;....return(0);.
67e0: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 75 73 65 72  .}.#endif...user
67f0: 5f 69 64 5f 63 68 65 63 6b 20 3d 20 73 74 72 74  _id_check = strt
6800: 6f 75 6c 6c 28 75 73 65 72 2c 20 26 6e 65 78 74  oull(user, &next
6810: 2c 20 31 30 29 3b 0a 09 69 66 20 28 6e 65 78 74  , 10);..if (next
6820: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
6830: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
6840: 20 28 6e 65 78 74 5b 30 5d 20 21 3d 20 27 5c 30   (next[0] != '\0
6850: 27 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  ') {...return(1)
6860: 3b 0a 09 7d 0a 0a 09 2a 75 73 65 72 5f 69 64 20  ;..}...*user_id 
6870: 3d 20 75 73 65 72 5f 69 64 5f 63 68 65 63 6b 3b  = user_id_check;
6880: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
6890: 0a 2f 2a 20 44 61 65 6d 6f 6e 69 7a 65 20 2a 2f  ./* Daemonize */
68a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
68b0: 64 5f 64 61 65 6d 6f 6e 69 7a 65 28 76 6f 69 64  d_daemonize(void
68c0: 29 20 7b 0a 09 70 69 64 5f 74 20 73 65 74 73 69  ) {..pid_t setsi
68d0: 64 5f 72 65 74 2c 20 66 6f 72 6b 5f 72 65 74 3b  d_ret, fork_ret;
68e0: 0a 09 69 6e 74 20 63 68 64 69 72 5f 72 65 74 2c  ..int chdir_ret,
68f0: 20 64 75 70 32 5f 72 65 74 3b 0a 09 69 6e 74 20   dup2_ret;..int 
6900: 66 64 5f 69 6e 2c 20 66 64 5f 6f 75 74 3b 0a 0a  fd_in, fd_out;..
6910: 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64  .chdir_ret = chd
6920: 69 72 28 22 2f 22 29 3b 0a 09 69 66 20 28 63 68  ir("/");..if (ch
6930: 64 69 72 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  dir_ret != 0) {.
6940: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
6950: 0a 09 66 6f 72 6b 5f 72 65 74 20 3d 20 66 6f 72  ..fork_ret = for
6960: 6b 28 29 3b 0a 09 69 66 20 28 66 6f 72 6b 5f 72  k();..if (fork_r
6970: 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
6980: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn(1);..}...if (
6990: 66 6f 72 6b 5f 72 65 74 20 3e 20 30 29 20 7b 0a  fork_ret > 0) {.
69a0: 09 09 2f 2a 20 50 61 72 65 6e 74 20 2a 2f 0a 09  ../* Parent */..
69b0: 09 77 61 69 74 70 69 64 28 66 6f 72 6b 5f 72 65  .waitpid(fork_re
69c0: 74 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 09  t, NULL, 0);....
69d0: 65 78 69 74 28 45 58 49 54 5f 53 55 43 43 45 53  exit(EXIT_SUCCES
69e0: 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 68 69 6c  S);..}.../* Chil
69f0: 64 20 2a 2f 0a 09 69 66 20 28 66 6f 72 6b 28 29  d */..if (fork()
6a00: 20 21 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 43 68   != 0) {.../* Ch
6a10: 69 6c 64 20 2a 2f 0a 09 09 65 78 69 74 28 45 58  ild */...exit(EX
6a20: 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a  IT_SUCCESS);..}.
6a30: 0a 09 2f 2a 20 47 72 61 6e 64 20 63 68 69 6c 64  ../* Grand child
6a40: 20 2a 2f 0a 09 73 65 74 73 69 64 5f 72 65 74 20   */..setsid_ret 
6a50: 3d 20 73 65 74 73 69 64 28 29 3b 0a 09 69 66 20  = setsid();..if 
6a60: 28 73 65 74 73 69 64 5f 72 65 74 20 3d 3d 20 28  (setsid_ret == (
6a70: 28 70 69 64 5f 74 29 20 2d 31 29 29 20 7b 0a 09  (pid_t) -1)) {..
6a80: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
6a90: 09 66 64 5f 69 6e 20 3d 20 6f 70 65 6e 28 22 2f  .fd_in = open("/
6aa0: 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 52 44 4f  dev/null", O_RDO
6ab0: 4e 4c 59 29 3b 0a 09 66 64 5f 6f 75 74 20 3d 20  NLY);..fd_out = 
6ac0: 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  open("/dev/null"
6ad0: 2c 20 4f 5f 57 52 4f 4e 4c 59 29 3b 0a 09 69 66  , O_WRONLY);..if
6ae0: 20 28 66 64 5f 69 6e 20 3c 20 30 20 7c 7c 20 66   (fd_in < 0 || f
6af0: 64 5f 6f 75 74 20 3c 20 30 29 20 7b 0a 09 09 72  d_out < 0) {...r
6b00: 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64  eturn(1);..}...d
6b10: 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66  up2_ret = dup2(f
6b20: 64 5f 69 6e 2c 20 53 54 44 49 4e 5f 46 49 4c 45  d_in, STDIN_FILE
6b30: 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72  NO);..if (dup2_r
6b40: 65 74 20 21 3d 20 53 54 44 49 4e 5f 46 49 4c 45  et != STDIN_FILE
6b50: 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  NO) {...return(1
6b60: 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74  );..}...dup2_ret
6b70: 20 3d 20 64 75 70 32 28 66 64 5f 6f 75 74 2c 20   = dup2(fd_out, 
6b80: 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 3b 0a  STDOUT_FILENO);.
6b90: 09 69 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d  .if (dup2_ret !=
6ba0: 20 53 54 44 4f 55 54 5f 46 49 4c 45 4e 4f 29 20   STDOUT_FILENO) 
6bb0: 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  {...return(1);..
6bc0: 7d 0a 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64  }...dup2_ret = d
6bd0: 75 70 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 45  up2(fd_out, STDE
6be0: 52 52 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20  RR_FILENO);..if 
6bf0: 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44  (dup2_ret != STD
6c00: 45 52 52 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09  ERR_FILENO) {...
6c10: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
6c20: 63 6c 6f 73 65 28 66 64 5f 69 6e 29 3b 0a 09 63  close(fd_in);..c
6c30: 6c 6f 73 65 28 66 64 5f 6f 75 74 29 3b 0a 0a 09  lose(fd_out);...
6c40: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
6c50: 20 52 75 6e 20 70 72 6f 63 65 73 73 20 2a 2f 0a   Run process */.
6c60: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
6c70: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 20  c, char **argv) 
6c80: 7b 0a 09 73 74 72 75 63 74 20 6f 70 74 69 6f 6e  {..struct option
6c90: 20 6f 70 74 69 6f 6e 73 5b 31 31 5d 3b 0a 09 63   options[11];..c
6ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 62 69 6e 64 5f  onst char *bind_
6cb0: 61 64 64 72 20 3d 20 42 49 4e 44 5f 41 44 44 52  addr = BIND_ADDR
6cc0: 2c 20 2a 6e 65 77 72 6f 6f 74 20 3d 20 4e 55 4c  , *newroot = NUL
6cd0: 4c 2c 20 2a 6c 6f 67 5f 66 69 6c 65 20 3d 20 4c  L, *log_file = L
6ce0: 4f 47 5f 46 49 4c 45 3b 0a 09 46 49 4c 45 20 2a  OG_FILE;..FILE *
6cf0: 6c 6f 67 5f 66 70 3b 0a 09 75 69 64 5f 74 20 75  log_fp;..uid_t u
6d00: 73 65 72 20 3d 20 30 3b 0a 09 69 6e 74 20 70 6f  ser = 0;..int po
6d10: 72 74 20 3d 20 50 4f 52 54 2c 20 74 68 72 65 61  rt = PORT, threa
6d20: 64 5f 63 6f 75 6e 74 20 3d 20 54 48 52 45 41 44  d_count = THREAD
6d30: 5f 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 63 61 63  _COUNT;..int cac
6d40: 68 65 5f 73 69 7a 65 20 3d 20 43 41 43 48 45 5f  he_size = CACHE_
6d50: 53 49 5a 45 3b 0a 09 69 6e 74 20 69 6e 69 74 5f  SIZE;..int init_
6d60: 72 65 74 2c 20 63 68 72 6f 6f 74 5f 72 65 74 2c  ret, chroot_ret,
6d70: 20 73 65 74 75 69 64 5f 72 65 74 2c 20 6c 6f 6f   setuid_ret, loo
6d80: 6b 75 70 5f 72 65 74 2c 20 63 68 64 69 72 5f 72  kup_ret, chdir_r
6d90: 65 74 3b 0a 09 69 6e 74 20 73 65 74 75 69 64 5f  et;..int setuid_
6da0: 65 6e 61 62 6c 65 64 20 3d 20 30 2c 20 64 61 65  enabled = 0, dae
6db0: 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d 20 30 3b  mon_enabled = 0;
6dc0: 0a 09 69 6e 74 20 63 68 3b 0a 09 69 6e 74 20 66  ..int ch;..int f
6dd0: 64 3b 0a 0a 09 2f 2a 20 50 72 6f 63 65 73 73 20  d;.../* Process 
6de0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 09 66 69  arguments */..fi
6df0: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
6e00: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
6e10: 30 5d 2c 20 22 70 6f 72 74 22 2c 20 72 65 71 75  0], "port", requ
6e20: 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27  ired_argument, '
6e30: 70 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f  p');..filed_geto
6e40: 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26  pt_long_setopt(&
6e50: 6f 70 74 69 6f 6e 73 5b 31 5d 2c 20 22 74 68 72  options[1], "thr
6e60: 65 61 64 73 22 2c 20 72 65 71 75 69 72 65 64 5f  eads", required_
6e70: 61 72 67 75 6d 65 6e 74 2c 20 27 74 27 29 3b 0a  argument, 't');.
6e80: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
6e90: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
6ea0: 6e 73 5b 32 5d 2c 20 22 63 61 63 68 65 22 2c 20  ns[2], "cache", 
6eb0: 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e  required_argumen
6ec0: 74 2c 20 27 63 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'c');..filed_
6ed0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
6ee0: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 33 5d 2c 20  pt(&options[3], 
6ef0: 22 62 69 6e 64 22 2c 20 72 65 71 75 69 72 65 64  "bind", required
6f00: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 62 27 29 3b  _argument, 'b');
6f10: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
6f20: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
6f30: 6f 6e 73 5b 34 5d 2c 20 22 75 73 65 72 22 2c 20  ons[4], "user", 
6f40: 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e  required_argumen
6f50: 74 2c 20 27 75 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 'u');..filed_
6f60: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
6f70: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 35 5d 2c 20  pt(&options[5], 
6f80: 22 72 6f 6f 74 22 2c 20 72 65 71 75 69 72 65 64  "root", required
6f90: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 72 27 29 3b  _argument, 'r');
6fa0: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
6fb0: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
6fc0: 6f 6e 73 5b 36 5d 2c 20 22 68 65 6c 70 22 2c 20  ons[6], "help", 
6fd0: 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 68 27  no_argument, 'h'
6fe0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
6ff0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
7000: 74 69 6f 6e 73 5b 37 5d 2c 20 22 64 61 65 6d 6f  tions[7], "daemo
7010: 6e 22 2c 20 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c  n", no_argument,
7020: 20 27 64 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'd');..filed_ge
7030: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
7040: 28 26 6f 70 74 69 6f 6e 73 5b 38 5d 2c 20 22 6c  (&options[8], "l
7050: 6f 67 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72  og", required_ar
7060: 67 75 6d 65 6e 74 2c 20 27 6c 27 29 3b 0a 09 66  gument, 'l');..f
7070: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
7080: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
7090: 5b 39 5d 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20  [9], "version", 
70a0: 6e 6f 5f 61 72 67 75 6d 65 6e 74 2c 20 27 76 27  no_argument, 'v'
70b0: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
70c0: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
70d0: 74 69 6f 6e 73 5b 31 30 5d 2c 20 4e 55 4c 4c 2c  tions[10], NULL,
70e0: 20 30 2c 20 30 29 3b 0a 09 77 68 69 6c 65 20 28   0, 0);..while (
70f0: 28 63 68 20 3d 20 67 65 74 6f 70 74 5f 6c 6f 6e  (ch = getopt_lon
7100: 67 28 61 72 67 63 2c 20 61 72 67 76 2c 20 22 70  g(argc, argv, "p
7110: 3a 74 3a 63 3a 62 3a 75 3a 72 3a 6c 3a 68 64 76  :t:c:b:u:r:l:hdv
7120: 22 2c 20 6f 70 74 69 6f 6e 73 2c 20 4e 55 4c 4c  ", options, NULL
7130: 29 29 20 21 3d 20 2d 31 29 20 7b 0a 09 09 73 77  )) != -1) {...sw
7140: 69 74 63 68 28 63 68 29 20 7b 0a 09 09 09 63 61  itch(ch) {....ca
7150: 73 65 20 27 70 27 3a 0a 09 09 09 09 70 6f 72 74  se 'p':.....port
7160: 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b   = atoi(optarg);
7170: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
7180: 61 73 65 20 27 74 27 3a 0a 09 09 09 09 74 68 72  ase 't':.....thr
7190: 65 61 64 5f 63 6f 75 6e 74 20 3d 20 61 74 6f 69  ead_count = atoi
71a0: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
71b0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 63 27  eak;....case 'c'
71c0: 3a 0a 09 09 09 09 63 61 63 68 65 5f 73 69 7a 65  :.....cache_size
71d0: 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67 29 3b   = atoi(optarg);
71e0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
71f0: 61 73 65 20 27 62 27 3a 0a 09 09 09 09 62 69 6e  ase 'b':.....bin
7200: 64 5f 61 64 64 72 20 3d 20 73 74 72 64 75 70 28  d_addr = strdup(
7210: 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72 65  optarg);.....bre
7220: 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 75 27 3a  ak;....case 'u':
7230: 0a 09 09 09 09 73 65 74 75 69 64 5f 65 6e 61 62  .....setuid_enab
7240: 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 6c 6f 6f  led = 1;.....loo
7250: 6b 75 70 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  kup_ret = filed_
7260: 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 6f 70 74 61  user_lookup(opta
7270: 72 67 2c 20 26 75 73 65 72 29 3b 0a 09 09 09 09  rg, &user);.....
7280: 69 66 20 28 6c 6f 6f 6b 75 70 5f 72 65 74 20 21  if (lookup_ret !
7290: 3d 20 30 29 20 7b 0a 09 09 09 09 09 66 69 6c 65  = 0) {......file
72a0: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64  d_print_help(std
72b0: 65 72 72 2c 20 30 2c 20 22 49 6e 76 61 6c 69 64  err, 0, "Invalid
72c0: 20 75 73 65 72 6e 61 6d 65 20 73 70 65 63 69 66   username specif
72d0: 69 65 64 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  ied");.......ret
72e0: 75 72 6e 28 31 29 3b 0a 09 09 09 09 7d 0a 09 09  urn(1);.....}...
72f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7300: 20 27 72 27 3a 0a 09 09 09 09 6e 65 77 72 6f 6f   'r':.....newroo
7310: 74 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72  t = strdup(optar
7320: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
7330: 09 09 63 61 73 65 20 27 6c 27 3a 0a 09 09 09 09  ..case 'l':.....
7340: 6c 6f 67 5f 66 69 6c 65 20 3d 20 73 74 72 64 75  log_file = strdu
7350: 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  p(optarg);.....b
7360: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 64  reak;....case 'd
7370: 27 3a 0a 09 09 09 09 64 61 65 6d 6f 6e 5f 65 6e  ':.....daemon_en
7380: 61 62 6c 65 64 20 3d 20 31 3b 0a 09 09 09 09 62  abled = 1;.....b
7390: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 76  reak;....case 'v
73a0: 27 3a 0a 09 09 09 09 70 72 69 6e 74 66 28 22 66  ':.....printf("f
73b0: 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 25 73 5c  iled version %s\
73c0: 6e 22 2c 20 46 49 4c 45 44 5f 56 45 52 53 49 4f  n", FILED_VERSIO
73d0: 4e 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  N);......return(
73e0: 30 29 3b 0a 09 09 09 63 61 73 65 20 27 3f 27 3a  0);....case '?':
73f0: 0a 09 09 09 63 61 73 65 20 27 3a 27 3a 0a 09 09  ....case ':':...
7400: 09 09 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65  ..filed_print_he
7410: 6c 70 28 73 74 64 65 72 72 2c 20 30 2c 20 4e 55  lp(stderr, 0, NU
7420: 4c 4c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  LL);......return
7430: 28 31 29 3b 0a 09 09 09 63 61 73 65 20 27 68 27  (1);....case 'h'
7440: 3a 0a 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e  :.....filed_prin
7450: 74 5f 68 65 6c 70 28 73 74 64 6f 75 74 2c 20 31  t_help(stdout, 1
7460: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 09 09 72 65  , NULL);......re
7470: 74 75 72 6e 28 30 29 3b 0a 09 09 7d 0a 09 7d 0a  turn(0);...}..}.
7480: 0a 09 2f 2a 20 4f 70 65 6e 20 6c 6f 67 20 66 69  ../* Open log fi
7490: 6c 65 20 2a 2f 0a 09 69 66 20 28 73 74 72 63 6d  le */..if (strcm
74a0: 70 28 6c 6f 67 5f 66 69 6c 65 2c 20 22 2d 22 29  p(log_file, "-")
74b0: 20 3d 3d 20 30 29 20 7b 0a 09 09 6c 6f 67 5f 66   == 0) {...log_f
74c0: 70 20 3d 20 73 74 64 6f 75 74 3b 0a 09 7d 20 65  p = stdout;..} e
74d0: 6c 73 65 20 7b 0a 09 09 6c 6f 67 5f 66 70 20 3d  lse {...log_fp =
74e0: 20 66 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c 65 2c   fopen(log_file,
74f0: 20 22 61 2b 22 29 3b 0a 09 09 69 66 20 28 6c 6f   "a+");...if (lo
7500: 67 5f 66 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  g_fp == NULL) {.
7510: 09 09 09 70 65 72 72 6f 72 28 22 66 6f 70 65 6e  ...perror("fopen
7520: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 34  ");.....return(4
7530: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 43  );...}..}.../* C
7540: 72 65 61 74 65 20 6c 69 73 74 65 6e 69 6e 67 20  reate listening 
7550: 73 6f 63 6b 65 74 20 2a 2f 0a 09 66 64 20 3d 20  socket */..fd = 
7560: 66 69 6c 65 64 5f 6c 69 73 74 65 6e 28 62 69 6e  filed_listen(bin
7570: 64 5f 61 64 64 72 2c 20 70 6f 72 74 29 3b 0a 09  d_addr, port);..
7580: 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09  if (fd < 0) {...
7590: 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 6c 69  perror("filed_li
75a0: 73 74 65 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72  sten");....retur
75b0: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65  n(1);..}.../* Be
75c0: 63 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 2a 2f  come a daemon */
75d0: 0a 09 69 66 20 28 64 61 65 6d 6f 6e 5f 65 6e 61  ..if (daemon_ena
75e0: 62 6c 65 64 29 20 7b 0a 09 09 69 6e 69 74 5f 72  bled) {...init_r
75f0: 65 74 20 3d 20 66 69 6c 65 64 5f 64 61 65 6d 6f  et = filed_daemo
7600: 6e 69 7a 65 28 29 3b 0a 09 09 69 66 20 28 69 6e  nize();...if (in
7610: 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
7620: 09 09 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f  ..perror("filed_
7630: 64 61 65 6d 6f 6e 69 7a 65 22 29 3b 0a 0a 09 09  daemonize");....
7640: 09 72 65 74 75 72 6e 28 36 29 3b 0a 09 09 7d 0a  .return(6);...}.
7650: 09 7d 0a 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c 20  .}.../* Chroot, 
7660: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  if appropriate *
7670: 2f 0a 09 69 66 20 28 6e 65 77 72 6f 6f 74 29 20  /..if (newroot) 
7680: 7b 0a 09 09 63 68 64 69 72 5f 72 65 74 20 3d 20  {...chdir_ret = 
7690: 63 68 64 69 72 28 6e 65 77 72 6f 6f 74 29 3b 0a  chdir(newroot);.
76a0: 09 09 69 66 20 28 63 68 64 69 72 5f 72 65 74 20  ..if (chdir_ret 
76b0: 21 3d 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f  != 0) {....perro
76c0: 72 28 22 63 68 64 69 72 22 29 3b 0a 0a 09 09 09  r("chdir");.....
76d0: 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a  return(1);...}..
76e0: 09 09 63 68 72 6f 6f 74 5f 72 65 74 20 3d 20 63  ..chroot_ret = c
76f0: 68 72 6f 6f 74 28 22 2e 22 29 3b 0a 09 09 69 66  hroot(".");...if
7700: 20 28 63 68 72 6f 6f 74 5f 72 65 74 20 21 3d 20   (chroot_ret != 
7710: 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  0) {....perror("
7720: 63 68 72 6f 6f 74 22 29 3b 0a 0a 09 09 09 72 65  chroot");.....re
7730: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a  turn(1);...}..}.
7740: 0a 09 2f 2a 20 44 72 6f 70 20 70 72 69 76 69 6c  ../* Drop privil
7750: 65 67 65 73 2c 20 69 66 20 61 70 70 72 6f 70 72  eges, if appropr
7760: 69 61 74 65 20 2a 2f 0a 09 69 66 20 28 73 65 74  iate */..if (set
7770: 75 69 64 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09  uid_enabled) {..
7780: 09 73 65 74 75 69 64 5f 72 65 74 20 3d 20 73 65  .setuid_ret = se
7790: 74 75 69 64 28 75 73 65 72 29 3b 0a 09 09 69 66  tuid(user);...if
77a0: 20 28 73 65 74 75 69 64 5f 72 65 74 20 21 3d 20   (setuid_ret != 
77b0: 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  0) {....perror("
77c0: 73 65 74 75 69 64 22 29 3b 0a 0a 09 09 09 72 65  setuid");.....re
77d0: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a  turn(1);...}..}.
77e0: 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
77f0: 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66  */..init_ret = f
7800: 69 6c 65 64 5f 69 6e 69 74 28 63 61 63 68 65 5f  iled_init(cache_
7810: 73 69 7a 65 29 3b 0a 09 69 66 20 28 69 6e 69 74  size);..if (init
7820: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70  _ret != 0) {...p
7830: 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 69 6e 69  error("filed_ini
7840: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 33  t");....return(3
7850: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74  );..}.../* Creat
7860: 65 20 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64  e logging thread
7870: 20 2a 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20   */..init_ret = 
7880: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
7890: 72 65 61 64 5f 69 6e 69 74 28 6c 6f 67 5f 66 70  read_init(log_fp
78a0: 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74  );..if (init_ret
78b0: 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f   != 0) {...perro
78c0: 72 28 22 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  r("filed_logging
78d0: 5f 74 68 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a  _thread_init");.
78e0: 0a 09 09 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d  ...return(4);..}
78f0: 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 77 6f 72  .../* Create wor
7900: 6b 65 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 09  ker threads */..
7910: 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64  init_ret = filed
7920: 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f  _worker_threads_
7930: 69 6e 69 74 28 66 64 2c 20 74 68 72 65 61 64 5f  init(fd, thread_
7940: 63 6f 75 6e 74 29 3b 0a 09 69 66 20 28 69 6e 69  count);..if (ini
7950: 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
7960: 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 77 6f  perror("filed_wo
7970: 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69  rker_threads_ini
7980: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 35  t");....return(5
7990: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69 74 20  );..}.../* Wait 
79a0: 66 6f 72 20 74 68 72 65 61 64 73 20 74 6f 20 65  for threads to e
79b0: 78 69 74 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54  xit */../* XXX:T
79c0: 4f 44 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74 68 72  ODO: Monitor thr
79d0: 65 61 64 20 75 73 61 67 65 20 2a 2f 0a 09 77 68  ead usage */..wh
79e0: 69 6c 65 20 28 31 29 20 7b 0a 09 09 73 6c 65 65  ile (1) {...slee
79f0: 70 28 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52  p(60);..}.../* R
7a00: 65 74 75 72 6e 20 69 6e 20 66 61 69 6c 75 72 65  eturn in failure
7a10: 20 2a 2f 0a 09 72 65 74 75 72 6e 28 32 29 3b 0a   */..return(2);.
7a20: 7d 0a                                            }.