Hex Artifact Content

Artifact bcf59951689d404764b8c0faac1298a5ec854865:


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 34 22 0a 23 64 65 66 69 6e  ION "1.4".#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 70 61 74 68 5b 46 49 4c 45 44 5f 50 41 54  r path[FILED_PAT
0400: 48 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a  H_BUFFER_SIZE];.
0410: 09 69 6e 74 20 66 64 3b 0a 09 6f 66 66 5f 74 20  .int fd;..off_t 
0420: 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 73 74  len;..char *last
0430: 6d 6f 64 3b 0a 09 63 68 61 72 20 6c 61 73 74 6d  mod;..char lastm
0440: 6f 64 5f 62 5b 36 34 5d 3b 0a 09 63 6f 6e 73 74  od_b[64];..const
0450: 20 63 68 61 72 20 2a 74 79 70 65 3b 0a 09 63 68   char *type;..ch
0460: 61 72 20 65 74 61 67 5b 36 34 5d 3b 0a 7d 3b 0a  ar etag[64];.};.
0470: 0a 2f 2a 20 52 65 71 75 65 73 74 20 76 61 72 69  ./* Request vari
0480: 61 62 6c 65 73 20 2a 2f 0a 73 74 72 75 63 74 20  ables */.struct 
0490: 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65  filed_http_reque
04a0: 73 74 20 7b 0a 09 2f 2a 2a 20 42 75 66 66 65 72  st {../** Buffer
04b0: 73 20 2a 2a 2f 0a 09 73 74 72 75 63 74 20 66 69  s **/..struct fi
04c0: 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 66 69 6c  led_fileinfo fil
04d0: 65 69 6e 66 6f 3b 0a 09 63 68 61 72 20 74 6d 70  einfo;..char tmp
04e0: 62 75 66 5b 31 30 31 30 5d 3b 0a 0a 09 2f 2a 2a  buf[1010];.../**
04f0: 20 48 54 54 50 20 52 65 71 75 65 73 74 20 69 6e   HTTP Request in
0500: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2a 2f 0a 09 2f  formation **/../
0510: 2a 2a 2a 20 54 79 70 65 20 6f 66 20 72 65 71 75  *** Type of requ
0520: 65 73 74 20 28 48 45 41 44 20 6f 72 20 47 45 54  est (HEAD or GET
0530: 29 20 2a 2a 2a 2f 0a 09 65 6e 75 6d 20 7b 0a 09  ) ***/..enum {..
0540: 09 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d  .FILED_REQUEST_M
0550: 45 54 48 4f 44 5f 47 45 54 2c 0a 09 09 46 49 4c  ETHOD_GET,...FIL
0560: 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f  ED_REQUEST_METHO
0570: 44 5f 48 45 41 44 0a 09 7d 20 6d 65 74 68 6f 64  D_HEAD..} method
0580: 3b 0a 0a 09 2f 2a 2a 2a 20 50 61 74 68 20 62 65  ;.../*** Path be
0590: 69 6e 67 20 72 65 71 75 65 73 74 65 64 20 2a 2a  ing requested **
05a0: 2a 2f 0a 09 63 68 61 72 20 70 61 74 68 5b 46 49  */..char path[FI
05b0: 4c 45 44 5f 50 41 54 48 5f 42 55 46 46 45 52 5f  LED_PATH_BUFFER_
05c0: 53 49 5a 45 5d 3b 20 0a 0a 09 73 74 72 75 63 74  SIZE]; ...struct
05d0: 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09   {...struct {...
05e0: 09 69 6e 74 20 70 72 65 73 65 6e 74 3b 0a 09 09  .int present;...
05f0: 09 6f 66 66 5f 74 20 6f 66 66 73 65 74 3b 20 20  .off_t offset;  
0600: 20 2f 2a 2a 2a 20 52 61 6e 67 65 20 73 74 61 72   /*** Range star
0610: 74 20 2a 2a 2a 2f 0a 09 09 09 6f 66 66 5f 74 20  t ***/....off_t 
0620: 6c 65 6e 67 74 68 3b 20 20 20 2f 2a 2a 2a 20 52  length;   /*** R
0630: 61 6e 67 65 20 6c 65 6e 67 74 68 20 2a 2a 2a 2f  ange length ***/
0640: 0a 09 09 7d 20 72 61 6e 67 65 3b 0a 09 7d 20 68  ...} range;..} h
0650: 65 61 64 65 72 73 3b 0a 7d 3b 0a 0a 2f 2a 20 4c  eaders;.};../* L
0660: 6f 67 20 72 65 63 6f 72 64 20 2a 2f 0a 73 74 72  og record */.str
0670: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
0680: 74 72 79 20 7b 0a 09 2f 2a 20 54 79 70 65 20 6f  try {../* Type o
0690: 66 20 6c 6f 67 20 65 6e 74 72 79 20 2a 2f 0a 09  f log entry */..
06a0: 65 6e 75 6d 20 7b 0a 09 09 46 49 4c 45 44 5f 4c  enum {...FILED_L
06b0: 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45 2c  OG_TYPE_MESSAGE,
06c0: 0a 09 09 46 49 4c 45 44 5f 4c 4f 47 5f 54 59 50  ...FILED_LOG_TYP
06d0: 45 5f 54 52 41 4e 53 46 45 52 0a 09 7d 20 74 79  E_TRANSFER..} ty
06e0: 70 65 3b 0a 0a 09 2f 2a 20 4c 69 6e 6b 65 64 20  pe;.../* Linked 
06f0: 6c 69 73 74 20 68 65 61 64 2f 74 61 69 6c 20 2a  list head/tail *
0700: 2f 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  /..struct filed_
0710: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 6e 65 78 74  log_entry *_next
0720: 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f  ;..struct filed_
0730: 6c 6f 67 5f 65 6e 74 72 79 20 2a 5f 70 72 65 76  log_entry *_prev
0740: 3b 0a 0a 09 2f 2a 20 54 68 72 65 61 64 20 66 72  ;.../* Thread fr
0750: 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 6c 6f  om which this lo
0760: 67 20 65 6e 74 72 79 20 65 6d 69 6e 61 74 65 73  g entry eminates
0770: 20 2a 2f 0a 09 70 74 68 72 65 61 64 5f 74 20 74   */..pthread_t t
0780: 68 72 65 61 64 3b 0a 0a 09 2f 2a 20 4d 65 73 73  hread;.../* Mess
0790: 61 67 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  age buffer for t
07a0: 79 70 65 20 3d 20 4d 45 53 53 41 47 45 20 2a 2f  ype = MESSAGE */
07b0: 0a 09 2f 2a 20 50 61 74 68 20 62 75 66 66 65 72  ../* Path buffer
07c0: 20 66 6f 72 20 74 79 70 65 20 3d 20 54 52 41 4e   for type = TRAN
07d0: 53 46 45 52 20 2a 2f 0a 09 63 68 61 72 20 62 75  SFER */..char bu
07e0: 66 66 65 72 5b 46 49 4c 45 44 5f 50 41 54 48 5f  ffer[FILED_PATH_
07f0: 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 0a 09  BUFFER_SIZE];...
0800: 2f 2a 20 49 74 65 6d 73 20 66 6f 72 20 74 79 70  /* Items for typ
0810: 65 20 3d 20 54 52 41 4e 53 46 45 52 20 2a 2f 0a  e = TRANSFER */.
0820: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
0830: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 65 61  .const char *rea
0840: 73 6f 6e 3b 0a 09 74 69 6d 65 5f 74 20 73 74 61  son;..time_t sta
0850: 72 74 74 69 6d 65 3b 0a 09 74 69 6d 65 5f 74 20  rttime;..time_t 
0860: 65 6e 64 74 69 6d 65 3b 0a 09 6f 66 66 5f 74 20  endtime;..off_t 
0870: 72 65 71 5f 6f 66 66 73 65 74 3b 0a 09 6f 66 66  req_offset;..off
0880: 5f 74 20 72 65 71 5f 6c 65 6e 67 74 68 3b 0a 09  _t req_length;..
0890: 6f 66 66 5f 74 20 73 65 6e 74 5f 6c 65 6e 67 74  off_t sent_lengt
08a0: 68 3b 0a 09 6f 66 66 5f 74 20 66 69 6c 65 5f 6c  h;..off_t file_l
08b0: 65 6e 67 74 68 3b 0a 09 63 68 61 72 20 69 70 5b  ength;..char ip[
08c0: 31 32 38 5d 3b 0a 09 69 6e 74 20 70 6f 72 74 3b  128];..int port;
08d0: 0a 09 69 6e 74 20 6d 65 74 68 6f 64 3b 0a 7d 3b  ..int method;.};
08e0: 0a 0a 2f 2a 20 47 6c 6f 62 61 6c 20 76 61 72 69  ../* Global vari
08f0: 61 62 6c 65 73 20 2a 2f 0a 2f 2a 2a 20 4f 70 65  ables */./** Ope
0900: 6e 20 46 69 6c 65 20 63 61 63 68 65 20 2a 2a 2f  n File cache **/
0910: 0a 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69  .struct filed_fi
0920: 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 66 69  leinfo *filed_fi
0930: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d  leinfo_fdcache =
0940: 20 4e 55 4c 4c 3b 0a 75 6e 73 69 67 6e 65 64 20   NULL;.unsigned 
0950: 69 6e 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  int filed_filein
0960: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 20  fo_fdcache_size 
0970: 3d 20 30 3b 0a 0a 2f 2a 2a 20 4c 6f 67 67 69 6e  = 0;../** Loggin
0980: 67 20 2a 2a 2f 0a 73 74 72 75 63 74 20 66 69 6c  g **/.struct fil
0990: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 66 69  ed_log_entry *fi
09a0: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74  led_log_msg_list
09b0: 3b 0a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ;.pthread_mutex_
09c0: 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  t filed_log_msg_
09d0: 6c 69 73 74 5f 6d 75 74 65 78 3b 0a 70 74 68 72  list_mutex;.pthr
09e0: 65 61 64 5f 63 6f 6e 64 5f 74 20 66 69 6c 65 64  ead_cond_t filed
09f0: 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72 65  _log_msg_list_re
0a00: 61 64 79 3b 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ady;../* Initial
0a10: 69 7a 65 20 63 61 63 68 65 20 2a 2f 0a 73 74 61  ize cache */.sta
0a20: 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 69 6e  tic int filed_in
0a30: 69 74 5f 63 61 63 68 65 28 75 6e 73 69 67 6e 65  it_cache(unsigne
0a40: 64 20 69 6e 74 20 63 61 63 68 65 5f 73 69 7a 65  d int cache_size
0a50: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  ) {..unsigned in
0a60: 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
0a70: 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 2f 2a  x_init_ret;.../*
0a80: 20 43 61 63 68 65 20 6d 61 79 20 6e 6f 74 20 62   Cache may not b
0a90: 65 20 72 65 2d 69 6e 69 74 69 61 6c 69 7a 65 64  e re-initialized
0aa0: 20 2a 2f 0a 09 69 66 20 28 66 69 6c 65 64 5f 66   */..if (filed_f
0ab0: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f  ileinfo_fdcache_
0ac0: 73 69 7a 65 20 21 3d 20 30 20 7c 7c 20 66 69 6c  size != 0 || fil
0ad0: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
0ae0: 63 68 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  che != NULL) {..
0af0: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
0b00: 09 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 61 63  ./* Allocate cac
0b10: 68 65 20 2a 2f 0a 09 66 69 6c 65 64 5f 66 69 6c  he */..filed_fil
0b20: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69  einfo_fdcache_si
0b30: 7a 65 20 3d 20 63 61 63 68 65 5f 73 69 7a 65 3b  ze = cache_size;
0b40: 0a 09 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f  ..filed_fileinfo
0b50: 5f 66 64 63 61 63 68 65 20 3d 20 6d 61 6c 6c 6f  _fdcache = mallo
0b60: 63 28 73 69 7a 65 6f 66 28 2a 66 69 6c 65 64 5f  c(sizeof(*filed_
0b70: 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65  fileinfo_fdcache
0b80: 29 20 2a 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e  ) * filed_filein
0b90: 66 6f 5f 66 64 63 61 63 68 65 5f 73 69 7a 65 29  fo_fdcache_size)
0ba0: 3b 0a 09 69 66 20 28 66 69 6c 65 64 5f 66 69 6c  ;..if (filed_fil
0bb0: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 20 3d 3d  einfo_fdcache ==
0bc0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
0bd0: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e  n(1);..}.../* In
0be0: 69 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20 65  itialize cache e
0bf0: 6e 74 72 69 65 73 20 2a 2f 0a 09 66 6f 72 20 28  ntries */..for (
0c00: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 66  idx = 0; idx < f
0c10: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
0c20: 63 61 63 68 65 5f 73 69 7a 65 3b 20 69 64 78 2b  cache_size; idx+
0c30: 2b 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69  +) {...mutex_ini
0c40: 74 5f 72 65 74 20 3d 20 70 74 68 72 65 61 64 5f  t_ret = pthread_
0c50: 6d 75 74 65 78 5f 69 6e 69 74 28 26 66 69 6c 65  mutex_init(&file
0c60: 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63  d_fileinfo_fdcac
0c70: 68 65 5b 69 64 78 5d 2e 6d 75 74 65 78 2c 20 4e  he[idx].mutex, N
0c80: 55 4c 4c 29 3b 0a 09 09 69 66 20 28 6d 75 74 65  ULL);...if (mute
0c90: 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29  x_init_ret != 0)
0ca0: 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 31 29 3b   {....return(1);
0cb0: 0a 09 09 7d 0a 0a 09 09 66 69 6c 65 64 5f 66 69  ...}....filed_fi
0cc0: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69  leinfo_fdcache[i
0cd0: 64 78 5d 2e 70 61 74 68 5b 30 5d 20 3d 20 27 5c  dx].path[0] = '\
0ce0: 30 27 3b 0a 09 09 66 69 6c 65 64 5f 66 69 6c 65  0';...filed_file
0cf0: 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 69 64 78  info_fdcache[idx
0d00: 5d 2e 66 64 20 3d 20 2d 31 3b 0a 09 09 66 69 6c  ].fd = -1;...fil
0d10: 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64 63 61  ed_fileinfo_fdca
0d20: 63 68 65 5b 69 64 78 5d 2e 6c 61 73 74 6d 6f 64  che[idx].lastmod
0d30: 20 3d 20 22 22 3b 0a 09 09 66 69 6c 65 64 5f 66   = "";...filed_f
0d40: 69 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b  ileinfo_fdcache[
0d50: 69 64 78 5d 2e 74 79 70 65 20 3d 20 22 22 3b 0a  idx].type = "";.
0d60: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  .}...return(0);.
0d70: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
0d80: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 73 74 61 74   process */.stat
0d90: 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 69 6e 69  ic int filed_ini
0da0: 74 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63  t(unsigned int c
0db0: 61 63 68 65 5f 73 69 7a 65 29 20 7b 0a 09 73 74  ache_size) {..st
0dc0: 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 65 64 20  atic int called 
0dd0: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  = 0;..unsigned i
0de0: 6e 74 20 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20  nt random_value 
0df0: 3d 20 30 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f  = 0;..int cache_
0e00: 72 65 74 3b 0a 09 69 6e 74 20 72 61 6e 64 6f 6d  ret;..int random
0e10: 5f 66 64 3b 0a 0a 09 69 66 20 28 63 61 6c 6c 65  _fd;...if (calle
0e20: 64 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  d) {...return(0)
0e30: 3b 0a 09 7d 0a 0a 09 63 61 6c 6c 65 64 20 3d 20  ;..}...called = 
0e40: 31 3b 0a 0a 09 2f 2a 20 41 74 74 65 6d 70 74 20  1;.../* Attempt 
0e50: 74 6f 20 6c 6f 63 6b 20 61 6c 6c 20 6d 65 6d 6f  to lock all memo
0e60: 72 79 20 74 6f 20 70 68 79 73 69 63 61 6c 20 52  ry to physical R
0e70: 41 4d 20 28 62 75 74 20 64 6f 6e 27 74 20 63 61  AM (but don't ca
0e80: 72 65 20 69 66 20 77 65 20 63 61 6e 27 74 29 20  re if we can't) 
0e90: 2a 2f 0a 09 6d 6c 6f 63 6b 61 6c 6c 28 4d 43 4c  */..mlockall(MCL
0ea0: 5f 43 55 52 52 45 4e 54 20 7c 20 4d 43 4c 5f 46  _CURRENT | MCL_F
0eb0: 55 54 55 52 45 29 3b 0a 0a 09 2f 2a 20 49 67 6e  UTURE);.../* Ign
0ec0: 6f 72 65 20 53 49 47 50 49 50 45 20 2a 2f 0a 09  ore SIGPIPE */..
0ed0: 73 69 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20  signal(SIGPIPE, 
0ee0: 53 49 47 5f 49 47 4e 29 3b 0a 0a 09 2f 2a 20 49  SIG_IGN);.../* I
0ef0: 6e 69 74 69 61 6c 69 7a 65 20 63 61 63 68 65 20  nitialize cache 
0f00: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 09 63 61  structure */..ca
0f10: 63 68 65 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f  che_ret = filed_
0f20: 69 6e 69 74 5f 63 61 63 68 65 28 63 61 63 68 65  init_cache(cache
0f30: 5f 73 69 7a 65 29 3b 0a 09 69 66 20 28 63 61 63  _size);..if (cac
0f40: 68 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  he_ret != 0) {..
0f50: 09 72 65 74 75 72 6e 28 63 61 63 68 65 5f 72 65  .return(cache_re
0f60: 74 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 6e 69 74  t);..}.../* Init
0f70: 69 61 6c 69 7a 65 20 72 61 6e 64 6f 6d 20 6e 75  ialize random nu
0f80: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 2a  mber generator *
0f90: 2f 0a 09 72 61 6e 64 6f 6d 5f 66 64 20 3d 20 6f  /..random_fd = o
0fa0: 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f  pen("/dev/urando
0fb0: 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09  m", O_RDONLY);..
0fc0: 69 66 20 28 72 61 6e 64 6f 6d 5f 66 64 20 3e 3d  if (random_fd >=
0fd0: 20 30 29 20 7b 0a 09 09 72 65 61 64 28 72 61 6e   0) {...read(ran
0fe0: 64 6f 6d 5f 66 64 2c 20 26 72 61 6e 64 6f 6d 5f  dom_fd, &random_
0ff0: 76 61 6c 75 65 2c 20 73 69 7a 65 6f 66 28 72 61  value, sizeof(ra
1000: 6e 64 6f 6d 5f 76 61 6c 75 65 29 29 3b 0a 0a 09  ndom_value));...
1010: 09 63 6c 6f 73 65 28 72 61 6e 64 6f 6d 5f 66 64  .close(random_fd
1020: 29 3b 0a 09 7d 0a 0a 09 72 61 6e 64 6f 6d 5f 76  );..}...random_v
1030: 61 6c 75 65 20 5e 3d 20 67 65 74 70 69 64 28 29  alue ^= getpid()
1040: 3b 0a 09 72 61 6e 64 6f 6d 5f 76 61 6c 75 65 20  ;..random_value 
1050: 5e 3d 20 67 65 74 75 69 64 28 29 3b 0a 09 72 61  ^= getuid();..ra
1060: 6e 64 6f 6d 5f 76 61 6c 75 65 20 5e 3d 20 74 69  ndom_value ^= ti
1070: 6d 65 28 4e 55 4c 4c 29 3b 0a 0a 09 73 72 61 6e  me(NULL);...sran
1080: 64 6f 6d 28 72 61 6e 64 6f 6d 5f 76 61 6c 75 65  dom(random_value
1090: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
10a0: 7d 0a 0a 2f 2a 20 4c 69 73 74 65 6e 20 6f 6e 20  }../* Listen on 
10b0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 61 64 64  a particular add
10c0: 72 65 73 73 2f 70 6f 72 74 20 2a 2f 0a 73 74 61  ress/port */.sta
10d0: 74 69 63 20 69 6e 74 20 66 69 6c 65 64 5f 6c 69  tic int filed_li
10e0: 73 74 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  sten(const char 
10f0: 2a 61 64 64 72 65 73 73 2c 20 75 6e 73 69 67 6e  *address, unsign
1100: 65 64 20 69 6e 74 20 70 6f 72 74 29 20 7b 0a 09  ed int port) {..
1110: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
1120: 69 6e 36 20 61 64 64 72 5f 76 36 3b 0a 09 73 74  in6 addr_v6;..st
1130: 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e  ruct sockaddr_in
1140: 20 61 64 64 72 5f 76 34 3b 0a 09 73 74 72 75 63   addr_v4;..struc
1150: 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64 72  t sockaddr *addr
1160: 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74 20 61 64 64  ;..socklen_t add
1170: 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 70 74 6f 6e  r_len;..int pton
1180: 5f 72 65 74 2c 20 62 69 6e 64 5f 72 65 74 2c 20  _ret, bind_ret, 
1190: 6c 69 73 74 65 6e 5f 72 65 74 3b 0a 09 69 6e 74  listen_ret;..int
11a0: 20 66 61 6d 69 6c 79 3b 0a 09 69 6e 74 20 66 64   family;..int fd
11b0: 3b 0a 0a 0a 09 66 61 6d 69 6c 79 20 3d 20 41 46  ;....family = AF
11c0: 5f 49 4e 45 54 36 3b 0a 09 70 74 6f 6e 5f 72 65  _INET6;..pton_re
11d0: 74 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61  t = inet_pton(fa
11e0: 6d 69 6c 79 2c 20 61 64 64 72 65 73 73 2c 20 26  mily, address, &
11f0: 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f 61 64 64  addr_v6.sin6_add
1200: 72 2e 73 36 5f 61 64 64 72 29 3b 0a 09 69 66 20  r.s6_addr);..if 
1210: 28 70 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20  (pton_ret != 1) 
1220: 7b 0a 09 09 66 61 6d 69 6c 79 20 3d 20 41 46 5f  {...family = AF_
1230: 49 4e 45 54 3b 0a 09 09 70 74 6f 6e 5f 72 65 74  INET;...pton_ret
1240: 20 3d 20 69 6e 65 74 5f 70 74 6f 6e 28 66 61 6d   = inet_pton(fam
1250: 69 6c 79 2c 20 61 64 64 72 65 73 73 2c 20 26 61  ily, address, &a
1260: 64 64 72 5f 76 34 2e 73 69 6e 5f 61 64 64 72 2e  ddr_v4.sin_addr.
1270: 73 5f 61 64 64 72 29 3b 0a 09 09 69 66 20 28 70  s_addr);...if (p
1280: 74 6f 6e 5f 72 65 74 20 21 3d 20 31 29 20 7b 0a  ton_ret != 1) {.
1290: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12a0: 09 7d 0a 0a 09 09 61 64 64 72 5f 76 34 2e 73 69  .}....addr_v4.si
12b0: 6e 5f 66 61 6d 69 6c 79 20 3d 20 66 61 6d 69 6c  n_family = famil
12c0: 79 3b 0a 09 09 61 64 64 72 5f 76 34 2e 73 69 6e  y;...addr_v4.sin
12d0: 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f  _port = htons(po
12e0: 72 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28  rt);....addr = (
12f0: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
1300: 2a 29 20 26 61 64 64 72 5f 76 34 3b 0a 09 09 61  *) &addr_v4;...a
1310: 64 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ddr_len = sizeof
1320: 28 61 64 64 72 5f 76 34 29 3b 0a 09 7d 20 65 6c  (addr_v4);..} el
1330: 73 65 20 7b 0a 09 09 61 64 64 72 5f 76 36 2e 73  se {...addr_v6.s
1340: 69 6e 36 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f  in6_family = AF_
1350: 49 4e 45 54 36 3b 0a 09 09 61 64 64 72 5f 76 36  INET6;...addr_v6
1360: 2e 73 69 6e 36 5f 66 6c 6f 77 69 6e 66 6f 20 3d  .sin6_flowinfo =
1370: 20 30 3b 0a 09 09 61 64 64 72 5f 76 36 2e 73 69   0;...addr_v6.si
1380: 6e 36 5f 73 63 6f 70 65 5f 69 64 20 3d 20 30 3b  n6_scope_id = 0;
1390: 0a 09 09 61 64 64 72 5f 76 36 2e 73 69 6e 36 5f  ...addr_v6.sin6_
13a0: 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 70 6f 72  port = htons(por
13b0: 74 29 3b 0a 0a 09 09 61 64 64 72 20 3d 20 28 73  t);....addr = (s
13c0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
13d0: 29 20 26 61 64 64 72 5f 76 36 3b 0a 09 09 61 64  ) &addr_v6;...ad
13e0: 64 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  dr_len = sizeof(
13f0: 61 64 64 72 5f 76 36 29 3b 0a 09 7d 0a 0a 09 66  addr_v6);..}...f
1400: 64 20 3d 20 73 6f 63 6b 65 74 28 66 61 6d 69 6c  d = socket(famil
1410: 79 2c 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20  y, SOCK_STREAM, 
1420: 30 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29  0);..if (fd < 0)
1430: 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29 3b   {...return(fd);
1440: 0a 09 7d 0a 0a 09 62 69 6e 64 5f 72 65 74 20 3d  ..}...bind_ret =
1450: 20 62 69 6e 64 28 66 64 2c 20 61 64 64 72 2c 20   bind(fd, addr, 
1460: 61 64 64 72 5f 6c 65 6e 29 3b 0a 09 69 66 20 28  addr_len);..if (
1470: 62 69 6e 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  bind_ret < 0) {.
1480: 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09  ..close(fd);....
1490: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
14a0: 09 6c 69 73 74 65 6e 5f 72 65 74 20 3d 20 6c 69  .listen_ret = li
14b0: 73 74 65 6e 28 66 64 2c 20 31 32 38 29 3b 0a 09  sten(fd, 128);..
14c0: 69 66 20 28 6c 69 73 74 65 6e 5f 72 65 74 20 21  if (listen_ret !
14d0: 3d 20 30 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66  = 0) {...close(f
14e0: 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  d);....return(-1
14f0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 66  );..}...return(f
1500: 64 29 3b 0a 7d 0a 0a 2f 2a 20 4c 6f 67 20 61 20  d);.}../* Log a 
1510: 6d 65 73 73 61 67 65 20 2a 2f 0a 23 69 66 64 65  message */.#ifde
1520: 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47  f FILED_DONT_LOG
1530: 0a 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64  .#  define filed
1540: 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 5f  _logging_thread_
1550: 69 6e 69 74 28 78 29 20 30 0a 23 20 20 64 65 66  init(x) 0.#  def
1560: 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ine filed_log_ms
1570: 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20  g_debug(x, ...) 
1580: 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 66  /**/.#  define f
1590: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 78 2c 20  iled_log_msg(x, 
15a0: 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66  ...) /**/.#  def
15b0: 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  ine filed_log_en
15c0: 74 72 79 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64  try(x) /**/.#  d
15d0: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
15e0: 69 70 28 78 2c 20 2e 2e 2e 29 20 4e 55 4c 4c 0a  ip(x, ...) NULL.
15f0: 23 20 20 64 65 66 69 6e 65 20 66 69 6c 65 64 5f  #  define filed_
1600: 6c 6f 67 5f 6e 65 77 28 78 29 20 26 6c 6f 63 61  log_new(x) &loca
1610: 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 0a 23 20 20 64  l_dummy_log.#  d
1620: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
1630: 6f 70 65 6e 28 78 29 20 73 74 64 6f 75 74 0a 23  open(x) stdout.#
1640: 65 6c 73 65 0a 23 20 20 69 66 64 65 66 20 46 49  else.#  ifdef FI
1650: 4c 45 44 5f 44 45 42 55 47 0a 23 20 20 20 20 64  LED_DEBUG.#    d
1660: 65 66 69 6e 65 20 66 69 6c 65 64 5f 6c 6f 67 5f  efine filed_log_
1670: 6d 73 67 5f 64 65 62 75 67 28 78 2c 20 2e 2e 2e  msg_debug(x, ...
1680: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
1690: 72 72 2c 20 78 2c 20 5f 5f 56 41 5f 41 52 47 53  rr, x, __VA_ARGS
16a0: 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64  __); fprintf(std
16b0: 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75  err, "\n"); fflu
16c0: 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20  sh(stderr); }.# 
16d0: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
16e0: 65 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  e filed_log_msg_
16f0: 64 65 62 75 67 28 78 2c 20 2e 2e 2e 29 20 2f 2a  debug(x, ...) /*
1700: 2a 2f 0a 23 20 20 65 6e 64 69 66 0a 0a 2f 2a 20  */.#  endif../* 
1710: 49 6e 69 74 69 61 6c 69 7a 65 20 6c 6f 67 67 69  Initialize loggi
1720: 6e 67 20 74 68 72 65 61 64 20 2a 2f 0a 73 74 61  ng thread */.sta
1730: 74 69 63 20 76 6f 69 64 20 2a 66 69 6c 65 64 5f  tic void *filed_
1740: 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61 64 28 76  logging_thread(v
1750: 6f 69 64 20 2a 61 72 67 5f 70 29 20 7b 0a 09 73  oid *arg_p) {..s
1760: 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67  truct filed_logg
1770: 69 6e 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20  ing_thread_args 
1780: 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20 66 69  *arg;..struct fi
1790: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 63  led_log_entry *c
17a0: 75 72 72 2c 20 2a 70 72 65 76 3b 0a 09 63 6f 6e  urr, *prev;..con
17b0: 73 74 20 63 68 61 72 20 2a 6d 65 74 68 6f 64 3b  st char *method;
17c0: 0a 09 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 09 46  ..time_t now;..F
17d0: 49 4c 45 20 2a 66 70 3b 0a 0a 09 61 72 67 20 3d  ILE *fp;...arg =
17e0: 20 61 72 67 5f 70 3b 0a 0a 09 66 70 20 3d 20 61   arg_p;...fp = a
17f0: 72 67 2d 3e 66 70 3b 0a 0a 09 77 68 69 6c 65 20  rg->fp;...while 
1800: 28 31 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  (1) {...pthread_
1810: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 66 69 6c 65  mutex_lock(&file
1820: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d  d_log_msg_list_m
1830: 75 74 65 78 29 3b 0a 09 09 70 74 68 72 65 61 64  utex);...pthread
1840: 5f 63 6f 6e 64 5f 77 61 69 74 28 26 66 69 6c 65  _cond_wait(&file
1850: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f 72  d_log_msg_list_r
1860: 65 61 64 79 2c 20 26 66 69 6c 65 64 5f 6c 6f 67  eady, &filed_log
1870: 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29  _msg_list_mutex)
1880: 3b 0a 0a 09 09 63 75 72 72 20 3d 20 66 69 6c 65  ;....curr = file
1890: 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 3b 0a  d_log_msg_list;.
18a0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
18b0: 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  list = NULL;....
18c0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
18d0: 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f 67 5f  lock(&filed_log_
18e0: 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78 29 3b  msg_list_mutex);
18f0: 0a 0a 09 09 6e 6f 77 20 3d 20 74 69 6d 65 28 4e  ....now = time(N
1900: 55 4c 4c 29 3b 0a 0a 09 09 70 72 65 76 20 3d 20  ULL);....prev = 
1910: 4e 55 4c 4c 3b 0a 09 09 66 6f 72 20 28 3b 20 63  NULL;...for (; c
1920: 75 72 72 3b 20 63 75 72 72 20 3d 20 63 75 72 72  urr; curr = curr
1930: 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 63 75  ->_next) {....cu
1940: 72 72 2d 3e 5f 70 72 65 76 20 3d 20 70 72 65 76  rr->_prev = prev
1950: 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75 72  ;.....prev = cur
1960: 72 3b 0a 09 09 7d 0a 0a 09 09 63 75 72 72 20 3d  r;...}....curr =
1970: 20 70 72 65 76 3b 0a 09 09 77 68 69 6c 65 20 28   prev;...while (
1980: 63 75 72 72 29 20 7b 0a 09 09 09 73 77 69 74 63  curr) {....switc
1990: 68 20 28 63 75 72 72 2d 3e 74 79 70 65 29 20 7b  h (curr->type) {
19a0: 0a 09 09 09 09 63 61 73 65 20 46 49 4c 45 44 5f  .....case FILED_
19b0: 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53 41 47 45  LOG_TYPE_MESSAGE
19c0: 3a 0a 09 09 09 09 09 66 70 72 69 6e 74 66 28 66  :......fprintf(f
19d0: 70 2c 20 22 25 73 22 2c 20 63 75 72 72 2d 3e 62  p, "%s", curr->b
19e0: 75 66 66 65 72 29 3b 0a 0a 09 09 09 09 09 62 72  uffer);.......br
19f0: 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 46 49  eak;.....case FI
1a00: 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52 41  LED_LOG_TYPE_TRA
1a10: 4e 53 46 45 52 3a 0a 09 09 09 09 09 73 77 69 74  NSFER:......swit
1a20: 63 68 20 28 63 75 72 72 2d 3e 6d 65 74 68 6f 64  ch (curr->method
1a30: 29 20 7b 0a 09 09 09 09 09 09 63 61 73 65 20 46  ) {.......case F
1a40: 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54  ILED_REQUEST_MET
1a50: 48 4f 44 5f 47 45 54 3a 0a 09 09 09 09 09 09 09  HOD_GET:........
1a60: 6d 65 74 68 6f 64 3d 22 47 45 54 22 3b 0a 09 09  method="GET";...
1a70: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1a80: 09 09 63 61 73 65 20 46 49 4c 45 44 5f 52 45 51  ..case FILED_REQ
1a90: 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44  UEST_METHOD_HEAD
1aa0: 3a 0a 09 09 09 09 09 09 09 6d 65 74 68 6f 64 3d  :........method=
1ab0: 22 48 45 41 44 22 3b 0a 09 09 09 09 09 09 09 62  "HEAD";........b
1ac0: 72 65 61 6b 3b 0a 09 09 09 09 09 09 64 65 66 61  reak;.......defa
1ad0: 75 6c 74 3a 0a 09 09 09 09 09 09 09 6d 65 74 68  ult:........meth
1ae0: 6f 64 3d 22 3c 75 6e 6b 6e 6f 77 6e 3e 22 3b 0a  od="<unknown>";.
1af0: 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1b00: 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
1b10: 75 72 72 2d 3e 65 6e 64 74 69 6d 65 20 3d 3d 20  urr->endtime == 
1b20: 28 28 74 69 6d 65 5f 74 29 20 2d 31 29 29 20 7b  ((time_t) -1)) {
1b30: 0a 09 09 09 09 09 09 63 75 72 72 2d 3e 65 6e 64  .......curr->end
1b40: 74 69 6d 65 20 3d 20 6e 6f 77 3b 0a 09 09 09 09  time = now;.....
1b50: 09 7d 0a 0a 09 09 09 09 09 66 70 72 69 6e 74 66  .}.......fprintf
1b60: 28 66 70 2c 20 22 54 52 41 4e 53 46 45 52 20 4d  (fp, "TRANSFER M
1b70: 45 54 48 4f 44 3d 25 73 20 50 41 54 48 3d 25 73  ETHOD=%s PATH=%s
1b80: 20 53 52 43 3d 25 73 3a 25 69 20 54 49 4d 45 2e   SRC=%s:%i TIME.
1b90: 53 54 41 52 54 3d 25 6c 6c 75 20 54 49 4d 45 2e  START=%llu TIME.
1ba0: 45 4e 44 3d 25 6c 6c 75 20 43 4f 44 45 2e 56 41  END=%llu CODE.VA
1bb0: 4c 55 45 3d 25 75 20 43 4f 44 45 2e 52 45 41 53  LUE=%u CODE.REAS
1bc0: 4f 4e 3d 25 73 20 52 45 51 55 45 53 54 2e 4f 46  ON=%s REQUEST.OF
1bd0: 46 53 45 54 3d 25 6c 6c 75 20 52 45 51 55 45 53  FSET=%llu REQUES
1be0: 54 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 20 46 49  T.LENGTH=%llu FI
1bf0: 4c 45 2e 4c 45 4e 47 54 48 3d 25 6c 6c 75 20 54  LE.LENGTH=%llu T
1c00: 52 41 4e 53 46 45 52 2e 4c 45 4e 47 54 48 3d 25  RANSFER.LENGTH=%
1c10: 6c 6c 75 22 2c 0a 09 09 09 09 09 09 6d 65 74 68  llu",.......meth
1c20: 6f 64 2c 0a 09 09 09 09 09 09 63 75 72 72 2d 3e  od,.......curr->
1c30: 62 75 66 66 65 72 2c 0a 09 09 09 09 09 09 63 75  buffer,.......cu
1c40: 72 72 2d 3e 69 70 2c 20 63 75 72 72 2d 3e 70 6f  rr->ip, curr->po
1c50: 72 74 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67  rt,.......(unsig
1c60: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63  ned long long) c
1c70: 75 72 72 2d 3e 73 74 61 72 74 74 69 6d 65 2c 0a  urr->starttime,.
1c80: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
1c90: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d  long long) curr-
1ca0: 3e 65 6e 64 74 69 6d 65 2c 0a 09 09 09 09 09 09  >endtime,.......
1cb0: 63 75 72 72 2d 3e 68 74 74 70 5f 63 6f 64 65 2c  curr->http_code,
1cc0: 20 63 75 72 72 2d 3e 72 65 61 73 6f 6e 2c 0a 09   curr->reason,..
1cd0: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
1ce0: 6f 6e 67 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e  ong long) curr->
1cf0: 72 65 71 5f 6f 66 66 73 65 74 2c 0a 09 09 09 09  req_offset,.....
1d00: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
1d10: 20 6c 6f 6e 67 29 20 63 75 72 72 2d 3e 72 65 71   long) curr->req
1d20: 5f 6c 65 6e 67 74 68 2c 0a 09 09 09 09 09 09 28  _length,.......(
1d30: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
1d40: 6e 67 29 20 63 75 72 72 2d 3e 66 69 6c 65 5f 6c  ng) curr->file_l
1d50: 65 6e 67 74 68 2c 0a 09 09 09 09 09 09 28 75 6e  ength,.......(un
1d60: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1d70: 29 20 63 75 72 72 2d 3e 73 65 6e 74 5f 6c 65 6e  ) curr->sent_len
1d80: 67 74 68 0a 09 09 09 09 09 29 3b 0a 0a 09 09 09  gth......);.....
1d90: 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
1da0: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 54  .fprintf(fp, " T
1db0: 48 52 45 41 44 3d 25 6c 6c 75 20 54 49 4d 45 3d  HREAD=%llu TIME=
1dc0: 25 6c 6c 75 5c 6e 22 2c 0a 09 09 09 09 28 75 6e  %llu\n",.....(un
1dd0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1de0: 29 20 63 75 72 72 2d 3e 74 68 72 65 61 64 2c 0a  ) curr->thread,.
1df0: 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
1e00: 6e 67 20 6c 6f 6e 67 29 20 6e 6f 77 0a 09 09 09  ng long) now....
1e10: 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70 29  );....fflush(fp)
1e20: 3b 0a 0a 09 09 09 70 72 65 76 20 3d 20 63 75 72  ;.....prev = cur
1e30: 72 3b 0a 09 09 09 63 75 72 72 20 3d 20 63 75 72  r;....curr = cur
1e40: 72 2d 3e 5f 70 72 65 76 3b 0a 0a 09 09 09 66 72  r->_prev;.....fr
1e50: 65 65 28 70 72 65 76 29 3b 0a 09 09 7d 0a 09 7d  ee(prev);...}..}
1e60: 0a 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
1e70: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1e80: 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28  filed_log_entry(
1e90: 73 74 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67  struct filed_log
1ea0: 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 29 20 7b  _entry *entry) {
1eb0: 0a 09 65 6e 74 72 79 2d 3e 74 68 72 65 61 64 20  ..entry->thread 
1ec0: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
1ed0: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65  ;...pthread_mute
1ee0: 78 5f 6c 6f 63 6b 28 26 66 69 6c 65 64 5f 6c 6f  x_lock(&filed_lo
1ef0: 67 5f 6d 73 67 5f 6c 69 73 74 5f 6d 75 74 65 78  g_msg_list_mutex
1f00: 29 3b 0a 0a 09 65 6e 74 72 79 2d 3e 5f 6e 65 78  );...entry->_nex
1f10: 74 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  t = filed_log_ms
1f20: 67 5f 6c 69 73 74 3b 0a 09 66 69 6c 65 64 5f 6c  g_list;..filed_l
1f30: 6f 67 5f 6d 73 67 5f 6c 69 73 74 20 3d 20 65 6e  og_msg_list = en
1f40: 74 72 79 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d  try;...pthread_m
1f50: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 66 69 6c  utex_unlock(&fil
1f60: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73 74 5f  ed_log_msg_list_
1f70: 6d 75 74 65 78 29 3b 0a 0a 09 70 74 68 72 65 61  mutex);...pthrea
1f80: 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 26 66  d_cond_signal(&f
1f90: 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69 73  iled_log_msg_lis
1fa0: 74 5f 72 65 61 64 79 29 3b 0a 0a 09 72 65 74 75  t_ready);...retu
1fb0: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  rn;.}..static st
1fc0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
1fd0: 6e 74 72 79 20 2a 66 69 6c 65 64 5f 6c 6f 67 5f  ntry *filed_log_
1fe0: 6e 65 77 28 69 6e 74 20 69 6e 69 74 69 61 6c 69  new(int initiali
1ff0: 7a 65 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69  ze) {..struct fi
2000: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 72  led_log_entry *r
2010: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
2020: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
2030: 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 69 66 20  *retval));...if 
2040: 28 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09  (initialize) {..
2050: 09 72 65 74 76 61 6c 2d 3e 62 75 66 66 65 72 5b  .retval->buffer[
2060: 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 72 65 74  0] = '\0';...ret
2070: 76 61 6c 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d  val->http_code =
2080: 20 2d 31 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 73   -1;...retval->s
2090: 74 61 72 74 74 69 6d 65 20 3d 20 30 3b 0a 09 09  tarttime = 0;...
20a0: 72 65 74 76 61 6c 2d 3e 65 6e 64 74 69 6d 65 20  retval->endtime 
20b0: 3d 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 72  = 0;...retval->r
20c0: 65 71 5f 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09  eq_offset = 0;..
20d0: 09 72 65 74 76 61 6c 2d 3e 72 65 71 5f 6c 65 6e  .retval->req_len
20e0: 67 74 68 20 3d 20 30 3b 0a 09 09 72 65 74 76 61  gth = 0;...retva
20f0: 6c 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74 68 20 3d  l->sent_length =
2100: 20 30 3b 0a 09 09 72 65 74 76 61 6c 2d 3e 66 69   0;...retval->fi
2110: 6c 65 5f 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 09  le_length = 0;..
2120: 09 72 65 74 76 61 6c 2d 3e 69 70 5b 30 5d 20 3d  .retval->ip[0] =
2130: 20 27 5c 30 27 3b 0a 09 09 72 65 74 76 61 6c 2d   '\0';...retval-
2140: 3e 70 6f 72 74 20 3d 20 2d 31 3b 0a 09 09 72 65  >port = -1;...re
2150: 74 76 61 6c 2d 3e 6d 65 74 68 6f 64 20 3d 20 2d  tval->method = -
2160: 31 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  1;..}...return(r
2170: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
2180: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 6c 6f 67  c void filed_log
2190: 5f 6d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20  _msg(const char 
21a0: 2a 66 6d 74 2c 20 2e 2e 2e 29 20 7b 0a 09 73 74  *fmt, ...) {..st
21b0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
21c0: 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a 09 76 61  ntry *entry;..va
21d0: 5f 6c 69 73 74 20 61 72 67 73 3b 0a 0a 09 65 6e  _list args;...en
21e0: 74 72 79 20 3d 20 66 69 6c 65 64 5f 6c 6f 67 5f  try = filed_log_
21f0: 6e 65 77 28 30 29 3b 0a 0a 09 76 61 5f 73 74 61  new(0);...va_sta
2200: 72 74 28 61 72 67 73 2c 20 66 6d 74 29 3b 0a 0a  rt(args, fmt);..
2210: 09 76 73 6e 70 72 69 6e 74 66 28 65 6e 74 72 79  .vsnprintf(entry
2220: 2d 3e 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66  ->buffer, sizeof
2230: 28 65 6e 74 72 79 2d 3e 62 75 66 66 65 72 29 2c  (entry->buffer),
2240: 20 66 6d 74 2c 20 61 72 67 73 29 3b 0a 0a 09 76   fmt, args);...v
2250: 61 5f 65 6e 64 28 61 72 67 73 29 3b 0a 0a 09 65  a_end(args);...e
2260: 6e 74 72 79 2d 3e 74 79 70 65 20 3d 20 46 49 4c  ntry->type = FIL
2270: 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 4d 45 53 53  ED_LOG_TYPE_MESS
2280: 41 47 45 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67  AGE;...filed_log
2290: 5f 65 6e 74 72 79 28 65 6e 74 72 79 29 3b 0a 0a  _entry(entry);..
22a0: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
22b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  ic const char *f
22c0: 69 6c 65 64 5f 6c 6f 67 5f 69 70 28 73 74 72 75  iled_log_ip(stru
22d0: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 61 64 64  ct sockaddr *add
22e0: 72 2c 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  r, char *buffer,
22f0: 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 6c 65   size_t bufferle
2300: 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 73 6f 63  n) {..struct soc
2310: 6b 61 64 64 72 5f 69 6e 20 2a 61 64 64 72 5f 76  kaddr_in *addr_v
2320: 34 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61  4;..struct socka
2330: 64 64 72 5f 69 6e 36 20 2a 61 64 64 72 5f 76 36  ddr_in6 *addr_v6
2340: 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 72  ;..const char *r
2350: 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  etval = NULL;...
2360: 61 64 64 72 5f 76 36 20 3d 20 28 73 74 72 75 63  addr_v6 = (struc
2370: 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 2a  t sockaddr_in6 *
2380: 29 20 61 64 64 72 3b 0a 0a 09 73 77 69 74 63 68  ) addr;...switch
2390: 20 28 61 64 64 72 5f 76 36 2d 3e 73 69 6e 36 5f   (addr_v6->sin6_
23a0: 66 61 6d 69 6c 79 29 20 7b 0a 09 09 63 61 73 65  family) {...case
23b0: 20 41 46 5f 49 4e 45 54 3a 0a 09 09 09 61 64 64   AF_INET:....add
23c0: 72 5f 76 34 20 3d 20 28 73 74 72 75 63 74 20 73  r_v4 = (struct s
23d0: 6f 63 6b 61 64 64 72 5f 69 6e 20 2a 29 20 61 64  ockaddr_in *) ad
23e0: 64 72 3b 0a 09 09 09 72 65 74 76 61 6c 20 3d 20  dr;....retval = 
23f0: 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e 45  inet_ntop(AF_INE
2400: 54 2c 20 26 61 64 64 72 5f 76 34 2d 3e 73 69 6e  T, &addr_v4->sin
2410: 5f 61 64 64 72 2c 20 62 75 66 66 65 72 2c 20 62  _addr, buffer, b
2420: 75 66 66 65 72 6c 65 6e 29 3b 0a 09 09 09 62 72  ufferlen);....br
2430: 65 61 6b 3b 0a 09 09 63 61 73 65 20 41 46 5f 49  eak;...case AF_I
2440: 4e 45 54 36 3a 0a 09 09 09 72 65 74 76 61 6c 20  NET6:....retval 
2450: 3d 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49  = inet_ntop(AF_I
2460: 4e 45 54 36 2c 20 26 61 64 64 72 5f 76 36 2d 3e  NET6, &addr_v6->
2470: 73 69 6e 36 5f 61 64 64 72 2c 20 62 75 66 66 65  sin6_addr, buffe
2480: 72 2c 20 62 75 66 66 65 72 6c 65 6e 29 3b 0a 09  r, bufferlen);..
2490: 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65  ..break;..}...re
24a0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
24b0: 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 69  .static FILE *fi
24c0: 6c 65 64 5f 6c 6f 67 5f 6f 70 65 6e 28 63 6f 6e  led_log_open(con
24d0: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 29 20 7b  st char *file) {
24e0: 0a 09 46 49 4c 45 20 2a 72 65 74 76 61 6c 3b 0a  ..FILE *retval;.
24f0: 0a 09 69 66 20 28 73 74 72 63 6d 70 28 66 69 6c  ..if (strcmp(fil
2500: 65 2c 20 22 2d 22 29 20 3d 3d 20 30 29 20 7b 0a  e, "-") == 0) {.
2510: 09 09 72 65 74 76 61 6c 20 3d 20 73 74 64 6f 75  ..retval = stdou
2520: 74 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 66  t;..} else if (f
2530: 69 6c 65 5b 30 5d 20 3d 3d 20 27 7c 27 29 20 7b  ile[0] == '|') {
2540: 0a 09 09 66 69 6c 65 2b 2b 3b 0a 09 09 72 65 74  ...file++;...ret
2550: 76 61 6c 20 3d 20 70 6f 70 65 6e 28 66 69 6c 65  val = popen(file
2560: 2c 20 22 77 22 29 3b 0a 09 7d 20 65 6c 73 65 20  , "w");..} else 
2570: 7b 0a 09 09 72 65 74 76 61 6c 20 3d 20 66 6f 70  {...retval = fop
2580: 65 6e 28 66 69 6c 65 2c 20 22 61 2b 22 29 3b 0a  en(file, "a+");.
2590: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
25a0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  al);.}..static i
25b0: 6e 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67  nt filed_logging
25c0: 5f 74 68 72 65 61 64 5f 69 6e 69 74 28 46 49 4c  _thread_init(FIL
25d0: 45 20 2a 6c 6f 67 66 70 29 20 7b 0a 09 73 74 72  E *logfp) {..str
25e0: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 67 69 6e  uct filed_loggin
25f0: 67 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61  g_thread_args *a
2600: 72 67 73 3b 0a 09 70 74 68 72 65 61 64 5f 74 20  rgs;..pthread_t 
2610: 74 68 72 65 61 64 5f 69 64 3b 0a 0a 09 61 72 67  thread_id;...arg
2620: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
2630: 66 28 2a 61 72 67 73 29 29 3b 0a 09 61 72 67 73  f(*args));..args
2640: 2d 3e 66 70 20 3d 20 6c 6f 67 66 70 3b 0a 0a 09  ->fp = logfp;...
2650: 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c 69  filed_log_msg_li
2660: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 70 74 68  st = NULL;...pth
2670: 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
2680: 26 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 6c  &filed_log_msg_l
2690: 69 73 74 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29  ist_mutex, NULL)
26a0: 3b 0a 0a 09 70 74 68 72 65 61 64 5f 63 72 65 61  ;...pthread_crea
26b0: 74 65 28 26 74 68 72 65 61 64 5f 69 64 2c 20 4e  te(&thread_id, N
26c0: 55 4c 4c 2c 20 66 69 6c 65 64 5f 6c 6f 67 67 69  ULL, filed_loggi
26d0: 6e 67 5f 74 68 72 65 61 64 2c 20 61 72 67 73 29  ng_thread, args)
26e0: 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  ;...filed_log_ms
26f0: 67 28 22 53 54 41 52 54 22 29 3b 0a 0a 09 72 65  g("START");...re
2700: 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 65 6e 64 69  turn(0);.}.#endi
2710: 66 0a 0a 2f 2a 20 46 6f 72 6d 61 74 20 74 69 6d  f../* Format tim
2720: 65 20 70 65 72 20 52 46 43 32 36 31 36 20 2a 2f  e per RFC2616 */
2730: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 69  .static char *fi
2740: 6c 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28  led_format_time(
2750: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
2760: 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c  ze_t buffer_len,
2770: 20 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 74 69   const time_t ti
2780: 6d 65 69 6e 66 6f 29 20 7b 0a 09 73 74 72 75 63  meinfo) {..struc
2790: 74 20 74 6d 20 74 69 6d 65 69 6e 66 6f 5f 74 6d  t tm timeinfo_tm
27a0: 2c 20 2a 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f 70  , *timeinfo_tm_p
27b0: 3b 0a 0a 09 74 69 6d 65 69 6e 66 6f 5f 74 6d 5f  ;...timeinfo_tm_
27c0: 70 20 3d 20 67 6d 74 69 6d 65 5f 72 28 26 74 69  p = gmtime_r(&ti
27d0: 6d 65 69 6e 66 6f 2c 20 26 74 69 6d 65 69 6e 66  meinfo, &timeinf
27e0: 6f 5f 74 6d 29 3b 0a 09 69 66 20 28 74 69 6d 65  o_tm);..if (time
27f0: 69 6e 66 6f 5f 74 6d 5f 70 20 3d 3d 20 4e 55 4c  info_tm_p == NUL
2800: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 22 75  L) {...return("u
2810: 6e 6b 6e 6f 77 6e 22 29 3b 0a 09 7d 0a 0a 09 62  nknown");..}...b
2820: 75 66 66 65 72 5b 62 75 66 66 65 72 5f 6c 65 6e  uffer[buffer_len
2830: 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 62   - 1] = '\0';..b
2840: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 74 72 66  uffer_len = strf
2850: 74 69 6d 65 28 62 75 66 66 65 72 2c 20 62 75 66  time(buffer, buf
2860: 66 65 72 5f 6c 65 6e 20 2d 20 31 2c 20 22 25 61  fer_len - 1, "%a
2870: 2c 20 25 64 20 25 62 20 25 59 20 25 48 3a 25 4d  , %d %b %Y %H:%M
2880: 3a 25 53 20 47 4d 54 22 2c 20 74 69 6d 65 69 6e  :%S GMT", timein
2890: 66 6f 5f 74 6d 5f 70 29 3b 0a 0a 09 72 65 74 75  fo_tm_p);...retu
28a0: 72 6e 28 62 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f  rn(buffer);.}../
28b0: 2a 20 68 61 73 68 20 2a 2f 0a 73 74 61 74 69 63  * hash */.static
28c0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69   unsigned int fi
28d0: 6c 65 64 5f 68 61 73 68 28 63 6f 6e 73 74 20 75  led_hash(const u
28e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 76 61  nsigned char *va
28f0: 6c 75 65 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  lue, unsigned in
2900: 74 20 6d 6f 64 75 6c 75 73 29 20 7b 0a 09 75 6e  t modulus) {..un
2910: 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72  signed char curr
2920: 2c 20 70 72 65 76 3b 0a 09 69 6e 74 20 64 69 66  , prev;..int dif
2930: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  f;..unsigned int
2940: 20 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61   retval;...retva
2950: 6c 20 3d 20 6d 6f 64 75 6c 75 73 20 2d 20 31 3b  l = modulus - 1;
2960: 0a 09 70 72 65 76 20 3d 20 6d 6f 64 75 6c 75 73  ..prev = modulus
2970: 20 25 20 32 35 35 3b 0a 0a 09 77 68 69 6c 65 20   % 255;...while 
2980: 28 28 63 75 72 72 20 3d 20 2a 76 61 6c 75 65 29  ((curr = *value)
2990: 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 20 3c  ) {...if (curr <
29a0: 20 33 32 29 20 7b 0a 09 09 09 63 75 72 72 20 3d   32) {....curr =
29b0: 20 32 35 35 20 2d 20 63 75 72 72 3b 0a 09 09 7d   255 - curr;...}
29c0: 20 65 6c 73 65 20 7b 0a 09 09 09 63 75 72 72 20   else {....curr 
29d0: 2d 3d 20 33 32 3b 0a 09 09 7d 0a 0a 09 09 69 66  -= 32;...}....if
29e0: 20 28 70 72 65 76 20 3c 20 63 75 72 72 29 20 7b   (prev < curr) {
29f0: 0a 09 09 09 64 69 66 66 20 3d 20 63 75 72 72 20  ....diff = curr 
2a00: 2d 20 70 72 65 76 3b 0a 09 09 7d 20 65 6c 73 65  - prev;...} else
2a10: 20 7b 0a 09 09 09 64 69 66 66 20 3d 20 70 72 65   {....diff = pre
2a20: 76 20 2d 20 63 75 72 72 3b 0a 09 09 7d 0a 0a 09  v - curr;...}...
2a30: 09 70 72 65 76 20 3d 20 63 75 72 72 3b 0a 0a 09  .prev = curr;...
2a40: 09 72 65 74 76 61 6c 20 3c 3c 3d 20 33 3b 0a 09  .retval <<= 3;..
2a50: 09 72 65 74 76 61 6c 20 26 3d 20 30 78 46 46 46  .retval &= 0xFFF
2a60: 46 46 46 46 46 4c 55 3b 0a 09 09 72 65 74 76 61  FFFFFLU;...retva
2a70: 6c 20 5e 3d 20 64 69 66 66 3b 0a 0a 09 09 76 61  l ^= diff;....va
2a80: 6c 75 65 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 76  lue++;..}...retv
2a90: 61 6c 20 3d 20 72 65 74 76 61 6c 20 25 20 6d 6f  al = retval % mo
2aa0: 64 75 6c 75 73 3b 0a 0a 09 72 65 74 75 72 6e 28  dulus;...return(
2ab0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 46  retval);.}../* F
2ac0: 69 6e 64 20 61 20 6d 69 6d 65 2d 74 79 70 65 20  ind a mime-type 
2ad0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 69 6c  based on the fil
2ae0: 65 6e 61 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20  ename */.static 
2af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2b00: 64 5f 64 65 74 65 72 6d 69 6e 65 5f 6d 69 6d 65  d_determine_mime
2b10: 74 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  type(const char 
2b20: 2a 70 61 74 68 29 20 7b 0a 09 63 6f 6e 73 74 20  *path) {..const 
2b30: 63 68 61 72 20 2a 70 3b 0a 0a 09 70 20 3d 20 73  char *p;...p = s
2b40: 74 72 72 63 68 72 28 70 61 74 68 2c 20 27 2e 27  trrchr(path, '.'
2b50: 29 3b 0a 09 69 66 20 28 70 20 3d 3d 20 4e 55 4c  );..if (p == NUL
2b60: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 46 49  L) {...return(FI
2b70: 4c 45 44 5f 44 45 46 41 55 4c 54 5f 54 59 50 45  LED_DEFAULT_TYPE
2b80: 29 3b 0a 09 7d 0a 0a 09 70 2b 2b 3b 0a 09 69 66  );..}...p++;..if
2b90: 20 28 2a 70 20 3d 3d 20 27 5c 30 27 29 20 7b 0a   (*p == '\0') {.
2ba0: 09 09 72 65 74 75 72 6e 28 46 49 4c 45 44 5f 44  ..return(FILED_D
2bb0: 45 46 41 55 4c 54 5f 54 59 50 45 29 3b 0a 09 7d  EFAULT_TYPE);..}
2bc0: 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
2bd0: 5f 64 65 62 75 67 28 22 4c 6f 6f 6b 69 6e 67 20  _debug("Looking 
2be0: 75 70 20 4d 49 4d 45 20 74 79 70 65 20 66 6f 72  up MIME type for
2bf0: 20 25 73 20 28 68 61 73 68 20 3d 20 25 6c 6c 75   %s (hash = %llu
2c00: 29 22 2c 20 70 2c 20 28 75 6e 73 69 67 6e 65 64  )", p, (unsigned
2c10: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65   long long) file
2c20: 64 5f 68 61 73 68 28 28 63 6f 6e 73 74 20 75 6e  d_hash((const un
2c30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 70  signed char *) p
2c40: 2c 20 31 36 37 37 37 32 35 39 29 29 3b 0a 0a 23  , 16777259));..#
2c50: 69 6e 63 6c 75 64 65 20 22 66 69 6c 65 64 2d 6d  include "filed-m
2c60: 69 6d 65 2d 74 79 70 65 73 2e 68 22 0a 0a 09 72  ime-types.h"...r
2c70: 65 74 75 72 6e 28 46 49 4c 45 44 5f 44 45 46 41  eturn(FILED_DEFA
2c80: 55 4c 54 5f 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  ULT_TYPE);.}../*
2c90: 20 47 65 6e 65 72 61 74 65 20 61 20 75 6e 69 71   Generate a uniq
2ca0: 75 65 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  ue identifier */
2cb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
2cc0: 65 64 5f 67 65 6e 65 72 61 74 65 5f 65 74 61 67  ed_generate_etag
2cd0: 28 63 68 61 72 20 2a 65 74 61 67 2c 20 73 69 7a  (char *etag, siz
2ce0: 65 5f 74 20 6c 65 6e 67 74 68 29 20 7b 0a 09 73  e_t length) {..s
2cf0: 6e 70 72 69 6e 74 66 28 65 74 61 67 2c 20 6c 65  nprintf(etag, le
2d00: 6e 67 74 68 2c 20 22 25 6c 6c 78 25 6c 6c 78 25  ngth, "%llx%llx%
2d10: 6c 6c 78 25 6c 6c 78 22 2c 0a 09 09 28 75 6e 73  llx%llx",...(uns
2d20: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
2d30: 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75 6e   random(),...(un
2d40: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
2d50: 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28 75  ) random(),...(u
2d60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
2d70: 67 29 20 72 61 6e 64 6f 6d 28 29 2c 0a 09 09 28  g) random(),...(
2d80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
2d90: 6e 67 29 20 72 61 6e 64 6f 6d 28 29 0a 09 29 3b  ng) random()..);
2da0: 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69  .}../* Open a fi
2db0: 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 66 69  le and return fi
2dc0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
2dd0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2de0: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a  filed_fileinfo *
2df0: 66 69 6c 65 64 5f 6f 70 65 6e 5f 66 69 6c 65 28  filed_open_file(
2e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
2e10: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66  , struct filed_f
2e20: 69 6c 65 69 6e 66 6f 20 2a 62 75 66 66 65 72 29  ileinfo *buffer)
2e30: 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64   {..struct filed
2e40: 5f 66 69 6c 65 69 6e 66 6f 20 2a 63 61 63 68 65  _fileinfo *cache
2e50: 3b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f  ;..const char *o
2e60: 70 65 6e 5f 70 61 74 68 3b 0a 09 75 6e 73 69 67  pen_path;..unsig
2e70: 6e 65 64 20 69 6e 74 20 63 61 63 68 65 5f 69 64  ned int cache_id
2e80: 78 3b 0a 09 6f 66 66 5f 74 20 6c 65 6e 3b 0a 09  x;..off_t len;..
2e90: 69 6e 74 20 66 64 3b 0a 0a 09 63 61 63 68 65 5f  int fd;...cache_
2ea0: 69 64 78 20 3d 20 66 69 6c 65 64 5f 68 61 73 68  idx = filed_hash
2eb0: 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ((const unsigned
2ec0: 20 63 68 61 72 20 2a 29 20 70 61 74 68 2c 20 66   char *) path, f
2ed0: 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66 64  iled_fileinfo_fd
2ee0: 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 0a 09 63  cache_size);...c
2ef0: 61 63 68 65 20 3d 20 26 66 69 6c 65 64 5f 66 69  ache = &filed_fi
2f00: 6c 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5b 63  leinfo_fdcache[c
2f10: 61 63 68 65 5f 69 64 78 5d 3b 0a 0a 09 66 69 6c  ache_idx];...fil
2f20: 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67  ed_log_msg_debug
2f30: 28 22 4c 6f 63 6b 69 6e 67 20 6d 75 74 65 78 20  ("Locking mutex 
2f40: 66 6f 72 20 69 64 78 3a 20 25 6c 75 22 2c 20 28  for idx: %lu", (
2f50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
2f60: 61 63 68 65 5f 69 64 78 29 3b 0a 0a 09 70 74 68  ache_idx);...pth
2f70: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
2f80: 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a  &cache->mutex);.
2f90: 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f  ..filed_log_msg_
2fa0: 64 65 62 75 67 28 22 43 6f 6d 70 6c 65 74 65 64  debug("Completed
2fb0: 20 6c 6f 63 6b 69 6e 67 20 6d 75 74 65 78 20 66   locking mutex f
2fc0: 6f 72 20 69 64 78 3a 20 25 6c 75 22 2c 20 28 75  or idx: %lu", (u
2fd0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
2fe0: 63 68 65 5f 69 64 78 29 3b 0a 0a 09 69 66 20 28  che_idx);...if (
2ff0: 73 74 72 63 6d 70 28 70 61 74 68 2c 20 63 61 63  strcmp(path, cac
3000: 68 65 2d 3e 70 61 74 68 29 20 21 3d 20 30 29 20  he->path) != 0) 
3010: 7b 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73  {...filed_log_ms
3020: 67 5f 64 65 62 75 67 28 22 43 61 63 68 65 20 6d  g_debug("Cache m
3030: 69 73 73 20 66 6f 72 20 69 64 78 3a 20 25 6c 75  iss for idx: %lu
3040: 3a 20 4f 4c 44 20 5c 22 25 73 5c 22 2c 20 4e 45  : OLD \"%s\", NE
3050: 57 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73 69  W \"%s\"", (unsi
3060: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68 65  gned long) cache
3070: 5f 69 64 78 2c 20 63 61 63 68 65 2d 3e 70 61 74  _idx, cache->pat
3080: 68 2c 20 70 61 74 68 29 3b 0a 0a 09 09 2f 2a 20  h, path);..../* 
3090: 46 6f 72 20 72 65 71 75 65 73 74 73 20 66 6f 72  For requests for
30a0: 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74   the root direct
30b0: 6f 72 79 2c 20 73 65 72 76 65 20 6f 75 74 20 69  ory, serve out i
30c0: 6e 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 09 09 69  ndex.html */...i
30d0: 66 20 28 70 61 74 68 5b 30 5d 20 3d 3d 20 27 5c  f (path[0] == '\
30e0: 30 27 20 7c 7c 20 28 70 61 74 68 5b 30 5d 20 3d  0' || (path[0] =
30f0: 3d 20 27 2f 27 20 26 26 20 70 61 74 68 5b 31 5d  = '/' && path[1]
3100: 20 3d 3d 20 27 5c 30 27 29 29 20 7b 0a 09 09 09   == '\0')) {....
3110: 6f 70 65 6e 5f 70 61 74 68 20 3d 20 22 2f 69 6e  open_path = "/in
3120: 64 65 78 2e 68 74 6d 6c 22 3b 0a 09 09 7d 20 65  dex.html";...} e
3130: 6c 73 65 20 7b 0a 09 09 09 6f 70 65 6e 5f 70 61  lse {....open_pa
3140: 74 68 20 3d 20 70 61 74 68 3b 0a 09 09 7d 0a 0a  th = path;...}..
3150: 09 09 66 64 20 3d 20 6f 70 65 6e 28 6f 70 65 6e  ..fd = open(open
3160: 5f 70 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 20  _path, O_RDONLY 
3170: 7c 20 4f 5f 4c 41 52 47 45 46 49 4c 45 29 3b 0a  | O_LARGEFILE);.
3180: 09 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a  ..if (fd < 0) {.
3190: 09 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
31a0: 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e  _unlock(&cache->
31b0: 6d 75 74 65 78 29 3b 0a 0a 09 09 09 72 65 74 75  mutex);.....retu
31c0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09  rn(NULL);...}...
31d0: 09 69 66 20 28 63 61 63 68 65 2d 3e 66 64 20 3e  .if (cache->fd >
31e0: 3d 20 30 29 20 7b 0a 09 09 09 63 6c 6f 73 65 28  = 0) {....close(
31f0: 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 09 7d 0a  cache->fd);...}.
3200: 0a 09 09 6c 65 6e 20 3d 20 6c 73 65 65 6b 28 66  ...len = lseek(f
3210: 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b  d, 0, SEEK_END);
3220: 0a 09 09 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20  ...lseek(fd, 0, 
3230: 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 09 09 63 61  SEEK_SET);....ca
3240: 63 68 65 2d 3e 66 64 20 3d 20 66 64 3b 0a 09 09  che->fd = fd;...
3250: 63 61 63 68 65 2d 3e 6c 65 6e 20 3d 20 6c 65 6e  cache->len = len
3260: 3b 0a 09 09 73 74 72 63 70 79 28 63 61 63 68 65  ;...strcpy(cache
3270: 2d 3e 70 61 74 68 2c 20 70 61 74 68 29 3b 0a 09  ->path, path);..
3280: 09 63 61 63 68 65 2d 3e 74 79 70 65 20 3d 20 66  .cache->type = f
3290: 69 6c 65 64 5f 64 65 74 65 72 6d 69 6e 65 5f 6d  iled_determine_m
32a0: 69 6d 65 74 79 70 65 28 6f 70 65 6e 5f 70 61 74  imetype(open_pat
32b0: 68 29 3b 0a 09 09 66 69 6c 65 64 5f 67 65 6e 65  h);...filed_gene
32c0: 72 61 74 65 5f 65 74 61 67 28 63 61 63 68 65 2d  rate_etag(cache-
32d0: 3e 65 74 61 67 2c 20 73 69 7a 65 6f 66 28 63 61  >etag, sizeof(ca
32e0: 63 68 65 2d 3e 65 74 61 67 29 29 3b 0a 0a 09 09  che->etag));....
32f0: 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 44 65 74  /* XXX:TODO: Det
3300: 65 72 6d 69 6e 65 20 2a 2f 0a 09 09 63 61 63 68  ermine */...cach
3310: 65 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 66 69 6c  e->lastmod = fil
3320: 65 64 5f 66 6f 72 6d 61 74 5f 74 69 6d 65 28 63  ed_format_time(c
3330: 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c  ache->lastmod_b,
3340: 20 73 69 7a 65 6f 66 28 63 61 63 68 65 2d 3e 6c   sizeof(cache->l
3350: 61 73 74 6d 6f 64 5f 62 29 2c 20 74 69 6d 65 28  astmod_b), time(
3360: 4e 55 4c 4c 29 20 2d 20 33 30 29 3b 0a 09 7d 20  NULL) - 30);..} 
3370: 65 6c 73 65 20 7b 0a 09 09 66 69 6c 65 64 5f 6c  else {...filed_l
3380: 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43 61  og_msg_debug("Ca
3390: 63 68 65 20 68 69 74 20 66 6f 72 20 69 64 78 3a  che hit for idx:
33a0: 20 25 6c 75 3a 20 50 41 54 48 20 5c 22 25 73 5c   %lu: PATH \"%s\
33b0: 22 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  "", (unsigned lo
33c0: 6e 67 29 20 63 61 63 68 65 5f 69 64 78 2c 20 70  ng) cache_idx, p
33d0: 61 74 68 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  ath);..}.../*.. 
33e0: 2a 20 57 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  * We have to mak
33f0: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 46 44  e a duplicate FD
3400: 2c 20 62 65 63 61 75 73 65 20 6f 6e 63 65 20 77  , because once w
3410: 65 20 72 65 6c 65 61 73 65 20 74 68 65 20 63 61  e release the ca
3420: 63 68 65 0a 09 20 2a 20 6d 75 74 65 78 2c 20 74  che.. * mutex, t
3430: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
3440: 6f 72 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64  or may be closed
3450: 0a 09 20 2a 2f 0a 09 66 64 20 3d 20 64 75 70 28  .. */..fd = dup(
3460: 63 61 63 68 65 2d 3e 66 64 29 3b 0a 09 69 66 20  cache->fd);..if 
3470: 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 70 74 68  (fd < 0) {...pth
3480: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
3490: 6b 28 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29  k(&cache->mutex)
34a0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
34b0: 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 2d 3e  );..}...buffer->
34c0: 66 64 20 3d 20 66 64 3b 0a 09 62 75 66 66 65 72  fd = fd;..buffer
34d0: 2d 3e 6c 65 6e 20 3d 20 63 61 63 68 65 2d 3e 6c  ->len = cache->l
34e0: 65 6e 3b 0a 09 62 75 66 66 65 72 2d 3e 74 79 70  en;..buffer->typ
34f0: 65 20 3d 20 63 61 63 68 65 2d 3e 74 79 70 65 3b  e = cache->type;
3500: 0a 09 6d 65 6d 63 70 79 28 62 75 66 66 65 72 2d  ..memcpy(buffer-
3510: 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20 63 61 63 68  >lastmod_b, cach
3520: 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 2c 20 73 69  e->lastmod_b, si
3530: 7a 65 6f 66 28 62 75 66 66 65 72 2d 3e 6c 61 73  zeof(buffer->las
3540: 74 6d 6f 64 5f 62 29 29 3b 0a 09 6d 65 6d 63 70  tmod_b));..memcp
3550: 79 28 62 75 66 66 65 72 2d 3e 65 74 61 67 2c 20  y(buffer->etag, 
3560: 63 61 63 68 65 2d 3e 65 74 61 67 2c 20 73 69 7a  cache->etag, siz
3570: 65 6f 66 28 62 75 66 66 65 72 2d 3e 65 74 61 67  eof(buffer->etag
3580: 29 29 3b 0a 09 62 75 66 66 65 72 2d 3e 6c 61 73  ));..buffer->las
3590: 74 6d 6f 64 20 3d 20 62 75 66 66 65 72 2d 3e 6c  tmod = buffer->l
35a0: 61 73 74 6d 6f 64 5f 62 20 2b 20 28 63 61 63 68  astmod_b + (cach
35b0: 65 2d 3e 6c 61 73 74 6d 6f 64 20 2d 20 63 61 63  e->lastmod - cac
35c0: 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 3b 0a  he->lastmod_b);.
35d0: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
35e0: 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e 6d  unlock(&cache->m
35f0: 75 74 65 78 29 3b 0a 0a 09 72 65 74 75 72 6e 28  utex);...return(
3600: 62 75 66 66 65 72 29 3b 0a 7d 0a 0a 2f 2a 20 50  buffer);.}../* P
3610: 72 6f 63 65 73 73 20 61 6e 20 48 54 54 50 20 72  rocess an HTTP r
3620: 65 71 75 65 73 74 20 61 6e 64 20 72 65 74 75 72  equest and retur
3630: 6e 20 74 68 65 20 70 61 74 68 20 72 65 71 75 65  n the path reque
3640: 73 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 73  sted */.static s
3650: 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74 74 70  truct filed_http
3660: 5f 72 65 71 75 65 73 74 20 2a 66 69 6c 65 64 5f  _request *filed_
3670: 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65 73 74  get_http_request
3680: 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63  (FILE *fp, struc
3690: 74 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71  t filed_http_req
36a0: 75 65 73 74 20 2a 62 75 66 66 65 72 5f 73 74 29  uest *buffer_st)
36b0: 20 7b 0a 09 63 68 61 72 20 2a 6d 65 74 68 6f 64   {..char *method
36c0: 2c 20 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a  , *path;..char *
36d0: 62 75 66 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66  buffer, *workbuf
36e0: 66 65 72 2c 20 2a 77 6f 72 6b 62 75 66 66 65 72  fer, *workbuffer
36f0: 5f 6e 65 78 74 3b 0a 09 63 68 61 72 20 2a 66 67  _next;..char *fg
3700: 65 74 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74  ets_ret;..size_t
3710: 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 6f 66   buffer_len;..of
3720: 66 5f 74 20 72 61 6e 67 65 5f 73 74 61 72 74 2c  f_t range_start,
3730: 20 72 61 6e 67 65 5f 65 6e 64 2c 20 72 61 6e 67   range_end, rang
3740: 65 5f 6c 65 6e 67 74 68 3b 0a 09 69 6e 74 20 72  e_length;..int r
3750: 61 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 69  ange_request;..i
3760: 6e 74 20 69 3b 0a 0a 09 72 61 6e 67 65 5f 73 74  nt i;...range_st
3770: 61 72 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f  art = 0;..range_
3780: 65 6e 64 20 20 20 3d 20 30 3b 0a 09 72 61 6e 67  end   = 0;..rang
3790: 65 5f 72 65 71 75 65 73 74 20 3d 20 30 3b 0a 09  e_request = 0;..
37a0: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 2d  range_length = -
37b0: 31 3b 0a 0a 09 62 75 66 66 65 72 20 3d 20 62 75  1;...buffer = bu
37c0: 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 3b  ffer_st->tmpbuf;
37d0: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73  ..buffer_len = s
37e0: 69 7a 65 6f 66 28 62 75 66 66 65 72 5f 73 74 2d  izeof(buffer_st-
37f0: 3e 74 6d 70 62 75 66 29 3b 0a 0a 09 66 67 65 74  >tmpbuf);...fget
3800: 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28 62 75  s_ret = fgets(bu
3810: 66 66 65 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e  ffer, buffer_len
3820: 2c 20 66 70 29 3b 0a 09 69 66 20 28 66 67 65 74  , fp);..if (fget
3830: 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  s_ret == NULL) {
3840: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
3850: 0a 09 7d 0a 0a 09 6d 65 74 68 6f 64 20 3d 20 62  ..}...method = b
3860: 75 66 66 65 72 3b 0a 0a 09 62 75 66 66 65 72 20  uffer;...buffer 
3870: 3d 20 73 74 72 63 68 72 28 62 75 66 66 65 72 2c  = strchr(buffer,
3880: 20 27 20 27 29 3b 0a 09 69 66 20 28 62 75 66 66   ' ');..if (buff
3890: 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  er == NULL) {...
38a0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
38b0: 0a 0a 09 2a 62 75 66 66 65 72 20 3d 20 27 5c 30  ...*buffer = '\0
38c0: 27 3b 0a 09 62 75 66 66 65 72 2b 2b 3b 0a 0a 09  ';..buffer++;...
38d0: 70 61 74 68 20 3d 20 62 75 66 66 65 72 3b 0a 0a  path = buffer;..
38e0: 09 62 75 66 66 65 72 20 3d 20 73 74 72 63 68 72  .buffer = strchr
38f0: 28 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a 09  (buffer, ' ');..
3900: 69 66 20 28 62 75 66 66 65 72 20 21 3d 20 4e 55  if (buffer != NU
3910: 4c 4c 29 20 7b 0a 09 09 2a 62 75 66 66 65 72 20  LL) {...*buffer 
3920: 3d 20 27 5c 30 27 3b 0a 09 09 62 75 66 66 65 72  = '\0';...buffer
3930: 2b 2b 3b 0a 09 7d 0a 0a 09 2f 2a 20 57 65 20 6f  ++;..}.../* We o
3940: 6e 6c 79 20 68 61 6e 64 6c 65 20 74 68 65 20 22  nly handle the "
3950: 47 45 54 22 20 61 6e 64 20 22 48 45 41 44 27 20  GET" and "HEAD' 
3960: 6d 65 74 68 6f 64 73 20 2a 2f 0a 09 69 66 20 28  methods */..if (
3970: 73 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68 6f  strcasecmp(metho
3980: 64 2c 20 22 68 65 61 64 22 29 20 21 3d 20 30 29  d, "head") != 0)
3990: 20 7b 0a 09 09 69 66 20 28 73 74 72 63 61 73 65   {...if (strcase
39a0: 63 6d 70 28 6d 65 74 68 6f 64 2c 20 22 67 65 74  cmp(method, "get
39b0: 22 29 20 21 3d 20 30 29 20 7b 0a 09 09 09 72 65  ") != 0) {....re
39c0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a  turn(NULL);...}.
39d0: 0a 09 09 2f 2a 20 47 45 54 20 72 65 71 75 65 73  .../* GET reques
39e0: 74 20 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74  t */...buffer_st
39f0: 2d 3e 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44  ->method = FILED
3a00: 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f  _REQUEST_METHOD_
3a10: 47 45 54 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  GET;..} else {..
3a20: 09 2f 2a 20 48 45 41 44 20 72 65 71 75 65 73 74  ./* HEAD request
3a30: 20 2a 2f 0a 09 09 62 75 66 66 65 72 5f 73 74 2d   */...buffer_st-
3a40: 3e 6d 65 74 68 6f 64 20 3d 20 46 49 4c 45 44 5f  >method = FILED_
3a50: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 48  REQUEST_METHOD_H
3a60: 45 41 44 3b 0a 09 7d 0a 0a 09 2f 2a 20 4e 6f 74  EAD;..}.../* Not
3a70: 65 20 70 61 74 68 20 2a 2f 0a 09 73 74 72 63 70  e path */..strcp
3a80: 79 28 62 75 66 66 65 72 5f 73 74 2d 3e 70 61 74  y(buffer_st->pat
3a90: 68 2c 20 70 61 74 68 29 3b 0a 0a 09 66 6f 72 20  h, path);...for 
3aa0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 30 30 3b  (i = 0; i < 100;
3ab0: 20 69 2b 2b 29 20 7b 0a 09 09 66 67 65 74 73 5f   i++) {...fgets_
3ac0: 72 65 74 20 3d 20 66 67 65 74 73 28 62 75 66 66  ret = fgets(buff
3ad0: 65 72 2c 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  er, buffer_len, 
3ae0: 66 70 29 3b 0a 09 09 69 66 20 28 66 67 65 74 73  fp);...if (fgets
3af0: 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  _ret == NULL) {.
3b00: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
3b10: 09 69 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70  .if (strncasecmp
3b20: 28 62 75 66 66 65 72 2c 20 22 52 61 6e 67 65 3a  (buffer, "Range:
3b30: 20 22 2c 20 37 29 20 3d 3d 20 30 29 20 7b 0a 09   ", 7) == 0) {..
3b40: 09 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 62  ..workbuffer = b
3b50: 75 66 66 65 72 20 2b 20 37 3b 0a 0a 09 09 09 69  uffer + 7;.....i
3b60: 66 20 28 73 74 72 6e 63 61 73 65 63 6d 70 28 77  f (strncasecmp(w
3b70: 6f 72 6b 62 75 66 66 65 72 2c 20 22 62 79 74 65  orkbuffer, "byte
3b80: 73 3d 22 2c 20 36 29 20 3d 3d 20 30 29 20 7b 0a  s=", 6) == 0) {.
3b90: 09 09 09 09 77 6f 72 6b 62 75 66 66 65 72 20 2b  ....workbuffer +
3ba0: 3d 20 36 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f  = 6;......range_
3bb0: 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a 09 09  request = 1;....
3bc0: 09 09 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20  ..range_start = 
3bd0: 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b 62 75 66  strtoull(workbuf
3be0: 66 65 72 2c 20 26 77 6f 72 6b 62 75 66 66 65 72  fer, &workbuffer
3bf0: 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 0a 09 09 09  _next, 10);.....
3c00: 09 77 6f 72 6b 62 75 66 66 65 72 20 3d 20 77 6f  .workbuffer = wo
3c10: 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 0a  rkbuffer_next;..
3c20: 09 09 09 09 69 66 20 28 2a 77 6f 72 6b 62 75 66  ....if (*workbuf
3c30: 66 65 72 20 3d 3d 20 27 2d 27 29 20 7b 0a 09 09  fer == '-') {...
3c40: 09 09 09 77 6f 72 6b 62 75 66 66 65 72 2b 2b 3b  ...workbuffer++;
3c50: 0a 0a 09 09 09 09 09 69 66 20 28 2a 77 6f 72 6b  .......if (*work
3c60: 62 75 66 66 65 72 20 21 3d 20 27 5c 72 27 20 26  buffer != '\r' &
3c70: 26 20 2a 77 6f 72 6b 62 75 66 66 65 72 20 21 3d  & *workbuffer !=
3c80: 20 27 5c 6e 27 29 20 7b 0a 09 09 09 09 09 09 72   '\n') {.......r
3c90: 61 6e 67 65 5f 65 6e 64 20 3d 20 73 74 72 74 6f  ange_end = strto
3ca0: 75 6c 6c 28 77 6f 72 6b 62 75 66 66 65 72 2c 20  ull(workbuffer, 
3cb0: 26 77 6f 72 6b 62 75 66 66 65 72 5f 6e 65 78 74  &workbuffer_next
3cc0: 2c 20 31 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09  , 10);......}...
3cd0: 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ..}....}...}....
3ce0: 69 66 20 28 6d 65 6d 63 6d 70 28 62 75 66 66 65  if (memcmp(buffe
3cf0: 72 2c 20 22 5c 72 5c 6e 22 2c 20 32 29 20 3d 3d  r, "\r\n", 2) ==
3d00: 20 30 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a   0) {....break;.
3d10: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
3d20: 72 6d 69 6e 65 20 72 61 6e 67 65 20 2a 2f 0a 09  rmine range */..
3d30: 69 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 21 3d  if (range_end !=
3d40: 20 30 29 20 7b 0a 09 09 69 66 20 28 72 61 6e 67   0) {...if (rang
3d50: 65 5f 65 6e 64 20 3c 3d 20 72 61 6e 67 65 5f 73  e_end <= range_s
3d60: 74 61 72 74 29 20 7b 0a 09 09 09 72 65 74 75 72  tart) {....retur
3d70: 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09  n(NULL);...}....
3d80: 72 61 6e 67 65 5f 6c 65 6e 67 74 68 20 3d 20 72  range_length = r
3d90: 61 6e 67 65 5f 65 6e 64 20 2d 20 72 61 6e 67 65  ange_end - range
3da0: 5f 73 74 61 72 74 3b 0a 0a 09 09 66 69 6c 65 64  _start;....filed
3db0: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
3dc0: 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68  Computing length
3dd0: 20 70 61 72 61 6d 65 74 65 72 3a 20 25 6c 6c 75   parameter: %llu
3de0: 20 3d 20 25 6c 6c 75 20 2d 20 25 6c 6c 75 22 2c   = %llu - %llu",
3df0: 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ....(unsigned lo
3e00: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 6c  ng long) range_l
3e10: 65 6e 67 74 68 2c 0a 09 09 09 28 75 6e 73 69 67  ength,....(unsig
3e20: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72  ned long long) r
3e30: 61 6e 67 65 5f 65 6e 64 2c 0a 09 09 09 28 75 6e  ange_end,....(un
3e40: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
3e50: 29 20 72 61 6e 67 65 5f 73 74 61 72 74 0a 09 09  ) range_start...
3e60: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 46 69 6c 6c 20  );..}.../* Fill 
3e70: 75 70 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  up structure to 
3e80: 72 65 74 75 72 6e 20 2a 2f 0a 09 62 75 66 66 65  return */..buffe
3e90: 72 5f 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  r_st->headers.ra
3ea0: 6e 67 65 2e 70 72 65 73 65 6e 74 20 3d 20 72 61  nge.present = ra
3eb0: 6e 67 65 5f 72 65 71 75 65 73 74 3b 0a 09 62 75  nge_request;..bu
3ec0: 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72 73  ffer_st->headers
3ed0: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 20 3d  .range.offset  =
3ee0: 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a 09 62   range_start;..b
3ef0: 75 66 66 65 72 5f 73 74 2d 3e 68 65 61 64 65 72  uffer_st->header
3f00: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 20  s.range.length  
3f10: 3d 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 3b 0a  = range_length;.
3f20: 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f  ..return(buffer_
3f30: 73 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  st);.}../* Retur
3f40: 6e 20 61 6e 20 65 72 72 6f 72 20 70 61 67 65 20  n an error page 
3f50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
3f60: 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28  iled_error_page(
3f70: 46 49 4c 45 20 2a 66 70 2c 20 63 6f 6e 73 74 20  FILE *fp, const 
3f80: 63 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65  char *date_curre
3f90: 6e 74 2c 20 69 6e 74 20 65 72 72 6f 72 5f 6e 75  nt, int error_nu
3fa0: 6d 62 65 72 2c 20 69 6e 74 20 6d 65 74 68 6f 64  mber, int method
3fb0: 29 20 7b 0a 09 63 68 61 72 20 2a 65 72 72 6f 72  ) {..char *error
3fc0: 5f 73 74 72 69 6e 67 20 3d 20 22 3c 68 74 6d 6c  _string = "<html
3fd0: 3e 3c 68 65 61 64 3e 3c 74 69 74 6c 65 3e 45 52  ><head><title>ER
3fe0: 52 4f 52 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61  ROR</title></hea
3ff0: 64 3e 3c 62 6f 64 79 3e 55 6e 61 62 6c 65 20 74  d><body>Unable t
4000: 6f 20 70 72 6f 63 65 73 73 20 72 65 71 75 65 73  o process reques
4010: 74 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c 3e 22  t</body></html>"
4020: 3b 0a 0a 09 66 70 72 69 6e 74 66 28 66 70 2c 20  ;...fprintf(fp, 
4030: 22 48 54 54 50 2f 31 2e 31 20 25 69 20 4e 6f 74  "HTTP/1.1 %i Not
4040: 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c   OK\r\nDate: %s\
4050: 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64  r\nServer: filed
4060: 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65  \r\nLast-Modifie
4070: 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74  d: %s\r\nContent
4080: 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c  -Length: %llu\r\
4090: 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25  nContent-Type: %
40a0: 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a  s\r\nConnection:
40b0: 20 63 6c 6f 73 65 5c 72 5c 6e 5c 72 5c 6e 22 2c   close\r\n\r\n",
40c0: 0a 09 09 65 72 72 6f 72 5f 6e 75 6d 62 65 72 2c  ...error_number,
40d0: 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
40e0: 0a 09 09 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  ...date_current,
40f0: 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ...(unsigned lon
4100: 67 20 6c 6f 6e 67 29 20 73 74 72 6c 65 6e 28 65  g long) strlen(e
4110: 72 72 6f 72 5f 73 74 72 69 6e 67 29 2c 0a 09 09  rror_string),...
4120: 22 74 65 78 74 2f 68 74 6d 6c 22 0a 09 29 3b 0a  "text/html"..);.
4130: 0a 09 2f 2a 20 73 69 6c 65 6e 63 65 20 65 72 72  ../* silence err
4140: 6f 72 20 73 74 72 69 6e 67 20 66 6f 72 20 48 45  or string for HE
4150: 41 44 20 72 65 71 75 65 73 74 73 20 2a 2f 0a 09  AD requests */..
4160: 69 66 20 28 6d 65 74 68 6f 64 20 21 3d 20 46 49  if (method != FI
4170: 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48  LED_REQUEST_METH
4180: 4f 44 5f 48 45 41 44 29 20 7b 0a 09 09 66 70 72  OD_HEAD) {...fpr
4190: 69 6e 74 66 28 66 70 2c 20 22 25 73 22 2c 20 65  intf(fp, "%s", e
41a0: 72 72 6f 72 5f 73 74 72 69 6e 67 29 3b 0a 09 7d  rror_string);..}
41b0: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
41c0: 20 48 61 6e 64 6c 65 20 61 20 73 69 6e 67 6c 65   Handle a single
41d0: 20 72 65 71 75 65 73 74 20 66 72 6f 6d 20 61 20   request from a 
41e0: 63 6c 69 65 6e 74 20 2a 2f 0a 73 74 61 74 69 63  client */.static
41f0: 20 76 6f 69 64 20 66 69 6c 65 64 5f 68 61 6e 64   void filed_hand
4200: 6c 65 5f 63 6c 69 65 6e 74 28 69 6e 74 20 66 64  le_client(int fd
4210: 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68  , struct filed_h
4220: 74 74 70 5f 72 65 71 75 65 73 74 20 2a 72 65 71  ttp_request *req
4230: 75 65 73 74 2c 20 73 74 72 75 63 74 20 66 69 6c  uest, struct fil
4240: 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f  ed_log_entry *lo
4250: 67 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c  g) {..struct fil
4260: 65 64 5f 66 69 6c 65 69 6e 66 6f 20 2a 66 69 6c  ed_fileinfo *fil
4270: 65 69 6e 66 6f 3b 0a 09 73 73 69 7a 65 5f 74 20  einfo;..ssize_t 
4280: 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09 73  sendfile_ret;..s
4290: 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65 5f 73  ize_t sendfile_s
42a0: 69 7a 65 3b 0a 09 6f 66 66 5f 74 20 73 65 6e 64  ize;..off_t send
42b0: 66 69 6c 65 5f 6f 66 66 73 65 74 2c 20 73 65 6e  file_offset, sen
42c0: 64 66 69 6c 65 5f 73 65 6e 74 2c 20 73 65 6e 64  dfile_sent, send
42d0: 66 69 6c 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 20  file_len;..char 
42e0: 2a 70 61 74 68 3b 0a 09 63 68 61 72 20 2a 64 61  *path;..char *da
42f0: 74 65 5f 63 75 72 72 65 6e 74 2c 20 64 61 74 65  te_current, date
4300: 5f 63 75 72 72 65 6e 74 5f 62 5b 36 34 5d 3b 0a  _current_b[64];.
4310: 09 69 6e 74 20 68 74 74 70 5f 63 6f 64 65 3b 0a  .int http_code;.
4320: 09 46 49 4c 45 20 2a 66 70 3b 0a 0a 09 2f 2a 20  .FILE *fp;.../* 
4330: 44 65 74 65 72 6d 69 6e 65 20 63 75 72 72 65 6e  Determine curren
4340: 74 20 74 69 6d 65 20 2a 2f 0a 09 64 61 74 65 5f  t time */..date_
4350: 63 75 72 72 65 6e 74 20 3d 20 66 69 6c 65 64 5f  current = filed_
4360: 66 6f 72 6d 61 74 5f 74 69 6d 65 28 64 61 74 65  format_time(date
4370: 5f 63 75 72 72 65 6e 74 5f 62 2c 20 73 69 7a 65  _current_b, size
4380: 6f 66 28 64 61 74 65 5f 63 75 72 72 65 6e 74 5f  of(date_current_
4390: 62 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 29 3b  b), time(NULL));
43a0: 0a 0a 09 2f 2a 20 4f 70 65 6e 20 73 6f 63 6b 65  .../* Open socke
43b0: 74 20 61 73 20 41 4e 53 49 20 49 2f 4f 20 66 6f  t as ANSI I/O fo
43c0: 72 20 65 61 73 65 20 6f 66 20 75 73 65 20 2a 2f  r ease of use */
43d0: 0a 09 66 70 20 3d 20 66 64 6f 70 65 6e 28 66 64  ..fp = fdopen(fd
43e0: 2c 20 22 77 2b 62 22 29 3b 0a 09 69 66 20 28 66  , "w+b");..if (f
43f0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  p == NULL) {...c
4400: 6c 6f 73 65 28 66 64 29 3b 0a 0a 09 09 72 65 74  lose(fd);....ret
4410: 75 72 6e 3b 0a 09 7d 0a 0a 09 72 65 71 75 65 73  urn;..}...reques
4420: 74 20 3d 20 66 69 6c 65 64 5f 67 65 74 5f 68 74  t = filed_get_ht
4430: 74 70 5f 72 65 71 75 65 73 74 28 66 70 2c 20 72  tp_request(fp, r
4440: 65 71 75 65 73 74 29 3b 0a 0a 09 69 66 20 28 72  equest);...if (r
4450: 65 71 75 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  equest == NULL) 
4460: 7b 0a 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f  {...filed_error_
4470: 70 61 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75  page(fp, date_cu
4480: 72 72 65 6e 74 2c 20 35 30 30 2c 20 46 49 4c 45  rrent, 500, FILE
4490: 44 5f 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44  D_REQUEST_METHOD
44a0: 5f 47 45 54 29 3b 0a 0a 09 09 6c 6f 67 2d 3e 62  _GET);....log->b
44b0: 75 66 66 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  uffer[0] = '\0';
44c0: 0a 09 09 6c 6f 67 2d 3e 68 74 74 70 5f 63 6f 64  ...log->http_cod
44d0: 65 20 3d 20 35 30 30 3b 0a 09 09 6c 6f 67 2d 3e  e = 500;...log->
44e0: 72 65 61 73 6f 6e 20 3d 20 22 66 6f 72 6d 61 74  reason = "format
44f0: 22 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f  ";....filed_log_
4500: 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 0a 09 09 66  entry(log);....f
4510: 63 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 09 72 65  close(fp);....re
4520: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 70 61 74 68 20  turn;..}...path 
4530: 3d 20 72 65 71 75 65 73 74 2d 3e 70 61 74 68 3b  = request->path;
4540: 0a 09 73 74 72 63 70 79 28 6c 6f 67 2d 3e 62 75  ..strcpy(log->bu
4550: 66 66 65 72 2c 20 70 61 74 68 29 3b 0a 09 6c 6f  ffer, path);..lo
4560: 67 2d 3e 6d 65 74 68 6f 64 20 3d 20 72 65 71 75  g->method = requ
4570: 65 73 74 2d 3e 6d 65 74 68 6f 64 3b 0a 0a 09 68  est->method;...h
4580: 74 74 70 5f 63 6f 64 65 20 3d 20 2d 31 3b 0a 0a  ttp_code = -1;..
4590: 09 66 69 6c 65 69 6e 66 6f 20 3d 20 66 69 6c 65  .fileinfo = file
45a0: 64 5f 6f 70 65 6e 5f 66 69 6c 65 28 70 61 74 68  d_open_file(path
45b0: 2c 20 26 72 65 71 75 65 73 74 2d 3e 66 69 6c 65  , &request->file
45c0: 69 6e 66 6f 29 3b 0a 09 69 66 20 28 66 69 6c 65  info);..if (file
45d0: 69 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  info == NULL) {.
45e0: 09 09 66 69 6c 65 64 5f 65 72 72 6f 72 5f 70 61  ..filed_error_pa
45f0: 67 65 28 66 70 2c 20 64 61 74 65 5f 63 75 72 72  ge(fp, date_curr
4600: 65 6e 74 2c 20 34 30 34 2c 20 72 65 71 75 65 73  ent, 404, reques
4610: 74 2d 3e 6d 65 74 68 6f 64 29 3b 0a 0a 09 09 6c  t->method);....l
4620: 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20  og->http_code = 
4630: 34 30 34 3b 0a 09 09 6c 6f 67 2d 3e 72 65 61 73  404;...log->reas
4640: 6f 6e 20 3d 20 22 6f 70 65 6e 5f 66 61 69 6c 65  on = "open_faile
4650: 64 22 3b 0a 0a 09 09 66 69 6c 65 64 5f 6c 6f 67  d";....filed_log
4660: 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 09 7d 20  _entry(log);..} 
4670: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 71  else {...if (req
4680: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
4690: 6e 67 65 2e 6f 66 66 73 65 74 20 21 3d 20 30 20  nge.offset != 0 
46a0: 7c 7c 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64  || request->head
46b0: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
46c0: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 69 66 20 28   >= 0) {....if (
46d0: 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73  request->headers
46e0: 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3e 3d  .range.offset >=
46f0: 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 29 20   fileinfo->len) 
4700: 7b 0a 09 09 09 09 66 69 6c 65 64 5f 65 72 72 6f  {.....filed_erro
4710: 72 5f 70 61 67 65 28 66 70 2c 20 64 61 74 65 5f  r_page(fp, date_
4720: 63 75 72 72 65 6e 74 2c 20 34 31 36 2c 20 72 65  current, 416, re
4730: 71 75 65 73 74 2d 3e 6d 65 74 68 6f 64 29 3b 0a  quest->method);.
4740: 0a 09 09 09 09 6c 6f 67 2d 3e 68 74 74 70 5f 63  .....log->http_c
4750: 6f 64 65 20 3d 20 34 31 36 3b 0a 09 09 09 09 6c  ode = 416;.....l
4760: 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 72 61  og->reason = "ra
4770: 6e 67 65 5f 69 6e 76 61 6c 69 64 22 3b 0a 0a 09  nge_invalid";...
4780: 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74  ...filed_log_ent
4790: 72 79 28 6c 6f 67 29 3b 0a 09 09 09 7d 20 65 6c  ry(log);....} el
47a0: 73 65 20 7b 0a 09 09 09 09 69 66 20 28 72 65 71  se {.....if (req
47b0: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
47c0: 6e 67 65 2e 6c 65 6e 67 74 68 20 3d 3d 20 28 28  nge.length == ((
47d0: 6f 66 66 5f 74 29 20 2d 31 29 29 20 7b 0a 09 09  off_t) -1)) {...
47e0: 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
47f0: 5f 64 65 62 75 67 28 22 43 6f 6d 70 75 74 69 6e  _debug("Computin
4800: 67 20 6c 65 6e 67 74 68 20 74 6f 20 66 69 74 20  g length to fit 
4810: 69 6e 20 62 6f 75 6e 64 73 3a 20 66 69 6c 65 69  in bounds: filei
4820: 6e 66 6f 2d 3e 6c 65 6e 20 3d 20 25 6c 6c 75 2c  nfo->len = %llu,
4830: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
4840: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 20 3d  s.range.offset =
4850: 20 25 6c 6c 75 22 2c 0a 09 09 09 09 09 09 28 75   %llu",.......(u
4860: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
4870: 67 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e  g) fileinfo->len
4880: 2c 0a 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65  ,.......(unsigne
4890: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71  d long long) req
48a0: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
48b0: 6e 67 65 2e 6f 66 66 73 65 74 0a 09 09 09 09 09  nge.offset......
48c0: 29 3b 0a 0a 09 09 09 09 09 72 65 71 75 65 73 74  );.......request
48d0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
48e0: 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66  length = fileinf
48f0: 6f 2d 3e 6c 65 6e 20 2d 20 72 65 71 75 65 73 74  o->len - request
4900: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
4910: 6f 66 66 73 65 74 3b 0a 09 09 09 09 7d 0a 0a 09  offset;.....}...
4920: 09 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
4930: 5f 64 65 62 75 67 28 22 50 61 72 74 69 61 6c 20  _debug("Partial 
4940: 72 65 71 75 65 73 74 2c 20 73 74 61 72 74 69 6e  request, startin
4950: 67 20 61 74 3a 20 25 6c 6c 75 20 61 6e 64 20 72  g at: %llu and r
4960: 75 6e 6e 69 6e 67 20 66 6f 72 20 25 6c 6c 69 20  unning for %lli 
4970: 62 79 74 65 73 22 2c 0a 09 09 09 09 09 28 75 6e  bytes",......(un
4980: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
4990: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
49a0: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c  rs.range.offset,
49b0: 0a 09 09 09 09 09 28 6c 6f 6e 67 20 6c 6f 6e 67  ......(long long
49c0: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
49d0: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 0a  rs.range.length.
49e0: 09 09 09 09 29 3b 0a 0a 09 09 09 09 68 74 74 70  ....);......http
49f0: 5f 63 6f 64 65 20 3d 20 32 30 36 3b 0a 09 09 09  _code = 206;....
4a00: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
4a10: 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61  if (request->hea
4a20: 64 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73 65  ders.range.prese
4a30: 6e 74 29 20 7b 0a 09 09 09 09 68 74 74 70 5f 63  nt) {.....http_c
4a40: 6f 64 65 20 3d 20 32 30 36 3b 0a 09 09 09 7d 20  ode = 206;....} 
4a50: 65 6c 73 65 20 7b 0a 09 09 09 09 68 74 74 70 5f  else {.....http_
4a60: 63 6f 64 65 20 3d 20 32 30 30 3b 0a 09 09 09 7d  code = 200;....}
4a70: 0a 09 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61  ....request->hea
4a80: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
4a90: 74 20 3d 20 30 3b 0a 09 09 09 72 65 71 75 65 73  t = 0;....reques
4aa0: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
4ab0: 2e 6c 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e  .length = filein
4ac0: 66 6f 2d 3e 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  fo->len;...}....
4ad0: 69 66 20 28 68 74 74 70 5f 63 6f 64 65 20 3e 20  if (http_code > 
4ae0: 30 29 20 7b 0a 09 09 09 66 70 72 69 6e 74 66 28  0) {....fprintf(
4af0: 66 70 2c 20 22 48 54 54 50 2f 31 2e 31 20 25 69  fp, "HTTP/1.1 %i
4b00: 20 4f 4b 5c 72 5c 6e 44 61 74 65 3a 20 25 73 5c   OK\r\nDate: %s\
4b10: 72 5c 6e 53 65 72 76 65 72 3a 20 66 69 6c 65 64  r\nServer: filed
4b20: 5c 72 5c 6e 4c 61 73 74 2d 4d 6f 64 69 66 69 65  \r\nLast-Modifie
4b30: 64 3a 20 25 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74  d: %s\r\nContent
4b40: 2d 4c 65 6e 67 74 68 3a 20 25 6c 6c 75 5c 72 5c  -Length: %llu\r\
4b50: 6e 41 63 63 65 70 74 2d 52 61 6e 67 65 73 3a 20  nAccept-Ranges: 
4b60: 62 79 74 65 73 5c 72 5c 6e 43 6f 6e 74 65 6e 74  bytes\r\nContent
4b70: 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e  -Type: %s\r\nCon
4b80: 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72  nection: close\r
4b90: 5c 6e 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c 72  \nETag: \"%s\"\r
4ba0: 5c 6e 22 2c 0a 09 09 09 09 68 74 74 70 5f 63 6f  \n",.....http_co
4bb0: 64 65 2c 0a 09 09 09 09 64 61 74 65 5f 63 75 72  de,.....date_cur
4bc0: 72 65 6e 74 2c 0a 09 09 09 09 66 69 6c 65 69 6e  rent,.....filein
4bd0: 66 6f 2d 3e 6c 61 73 74 6d 6f 64 2c 0a 09 09 09  fo->lastmod,....
4be0: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
4bf0: 6c 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68  long) request->h
4c00: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e  eaders.range.len
4c10: 67 74 68 2c 0a 09 09 09 09 66 69 6c 65 69 6e 66  gth,.....fileinf
4c20: 6f 2d 3e 74 79 70 65 2c 0a 09 09 09 09 66 69 6c  o->type,.....fil
4c30: 65 69 6e 66 6f 2d 3e 65 74 61 67 0a 09 09 09 29  einfo->etag....)
4c40: 3b 0a 09 09 09 69 66 20 28 68 74 74 70 5f 63 6f  ;....if (http_co
4c50: 64 65 20 3d 3d 20 32 30 36 29 20 7b 0a 09 09 09  de == 206) {....
4c60: 09 66 70 72 69 6e 74 66 28 66 70 2c 20 22 43 6f  .fprintf(fp, "Co
4c70: 6e 74 65 6e 74 2d 52 61 6e 67 65 3a 20 62 79 74  ntent-Range: byt
4c80: 65 73 20 25 6c 6c 75 2d 25 6c 6c 75 2f 25 6c 6c  es %llu-%llu/%ll
4c90: 75 5c 72 5c 6e 22 2c 0a 09 09 09 09 09 28 75 6e  u\r\n",......(un
4ca0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
4cb0: 29 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ) request->heade
4cc0: 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 2c  rs.range.offset,
4cd0: 0a 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
4ce0: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 28 72 65 71 75  long long) (requ
4cf0: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
4d00: 67 65 2e 6f 66 66 73 65 74 20 2b 20 72 65 71 75  ge.offset + requ
4d10: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
4d20: 67 65 2e 6c 65 6e 67 74 68 20 2d 20 31 29 2c 0a  ge.length - 1),.
4d30: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
4d40: 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69 6e  ong long) filein
4d50: 66 6f 2d 3e 6c 65 6e 0a 09 09 09 09 29 3b 0a 09  fo->len.....);..
4d60: 09 09 7d 0a 09 09 09 66 70 72 69 6e 74 66 28 66  ..}....fprintf(f
4d70: 70 2c 20 22 5c 72 5c 6e 22 29 3b 0a 09 09 09 66  p, "\r\n");....f
4d80: 66 6c 75 73 68 28 66 70 29 3b 0a 0a 09 09 09 6c  flush(fp);.....l
4d90: 6f 67 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20  og->http_code = 
4da0: 68 74 74 70 5f 63 6f 64 65 3b 0a 09 09 09 6c 6f  http_code;....lo
4db0: 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 4f 4b 22  g->reason = "OK"
4dc0: 3b 0a 09 09 09 6c 6f 67 2d 3e 73 74 61 72 74 74  ;....log->startt
4dd0: 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29  ime = time(NULL)
4de0: 3b 0a 09 09 09 6c 6f 67 2d 3e 72 65 71 5f 6f 66  ;....log->req_of
4df0: 66 73 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e  fset = request->
4e00: 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66  headers.range.of
4e10: 66 73 65 74 3b 0a 09 09 09 6c 6f 67 2d 3e 72 65  fset;....log->re
4e20: 71 5f 6c 65 6e 67 74 68 20 3d 20 72 65 71 75 65  q_length = reque
4e30: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
4e40: 65 2e 6c 65 6e 67 74 68 3b 0a 09 09 09 6c 6f 67  e.length;....log
4e50: 2d 3e 66 69 6c 65 5f 6c 65 6e 67 74 68 20 3d 20  ->file_length = 
4e60: 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 3b 0a 0a  fileinfo->len;..
4e70: 23 69 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e  #ifdef FILED_NON
4e80: 42 4c 4f 43 4b 5f 48 54 54 50 0a 09 09 09 69 6e  BLOCK_HTTP....in
4e90: 74 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73 3b 0a  t socket_flags;.
4ea0: 09 09 09 66 64 5f 73 65 74 20 72 66 64 2c 20 77  ...fd_set rfd, w
4eb0: 66 64 3b 0a 09 09 09 63 68 61 72 20 73 69 6e 6b  fd;....char sink
4ec0: 62 75 66 5b 38 31 39 32 5d 3b 0a 09 09 09 73 73  buf[8192];....ss
4ed0: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
4ee0: 0a 09 09 09 46 44 5f 5a 45 52 4f 28 26 72 66 64  ....FD_ZERO(&rfd
4ef0: 29 3b 0a 09 09 09 46 44 5f 5a 45 52 4f 28 26 77  );....FD_ZERO(&w
4f00: 66 64 29 3b 0a 09 09 09 46 44 5f 53 45 54 28 66  fd);....FD_SET(f
4f10: 64 2c 20 26 72 66 64 29 3b 0a 09 09 09 46 44 5f  d, &rfd);....FD_
4f20: 53 45 54 28 66 64 2c 20 26 77 66 64 29 3b 0a 0a  SET(fd, &wfd);..
4f30: 09 09 09 73 6f 63 6b 65 74 5f 66 6c 61 67 73 20  ...socket_flags 
4f40: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45  = fcntl(fd, F_GE
4f50: 54 46 4c 29 3b 0a 09 09 09 66 63 6e 74 6c 28 66  TFL);....fcntl(f
4f60: 64 2c 20 46 5f 53 45 54 46 4c 2c 20 73 6f 63 6b  d, F_SETFL, sock
4f70: 65 74 5f 66 6c 61 67 73 20 7c 20 4f 5f 4e 4f 4e  et_flags | O_NON
4f80: 42 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 0a 0a  BLOCK);.#endif..
4f90: 09 09 09 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73  ...sendfile_offs
4fa0: 65 74 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65  et = request->he
4fb0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
4fc0: 65 74 3b 0a 09 09 09 73 65 6e 64 66 69 6c 65 5f  et;....sendfile_
4fd0: 6c 65 6e 20 3d 20 72 65 71 75 65 73 74 2d 3e 68  len = request->h
4fe0: 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e  eaders.range.len
4ff0: 67 74 68 3b 0a 09 09 09 73 65 6e 64 66 69 6c 65  gth;....sendfile
5000: 5f 73 65 6e 74 20 3d 20 30 3b 0a 09 09 09 77 68  _sent = 0;....wh
5010: 69 6c 65 20 28 72 65 71 75 65 73 74 2d 3e 6d 65  ile (request->me
5020: 74 68 6f 64 20 3d 3d 20 46 49 4c 45 44 5f 52 45  thod == FILED_RE
5030: 51 55 45 53 54 5f 4d 45 54 48 4f 44 5f 47 45 54  QUEST_METHOD_GET
5040: 29 20 7b 0a 09 09 09 09 69 66 20 28 73 65 6e 64  ) {.....if (send
5050: 66 69 6c 65 5f 6c 65 6e 20 3e 20 46 49 4c 45 44  file_len > FILED
5060: 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58 29 20 7b  _SENDFILE_MAX) {
5070: 0a 09 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 73  ......sendfile_s
5080: 69 7a 65 20 3d 20 46 49 4c 45 44 5f 53 45 4e 44  ize = FILED_SEND
5090: 46 49 4c 45 5f 4d 41 58 3b 0a 09 09 09 09 7d 20  FILE_MAX;.....} 
50a0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 73 65 6e 64  else {......send
50b0: 66 69 6c 65 5f 73 69 7a 65 20 3d 20 73 65 6e 64  file_size = send
50c0: 66 69 6c 65 5f 6c 65 6e 3b 0a 09 09 09 09 7d 0a  file_len;.....}.
50d0: 0a 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 72 65  .....sendfile_re
50e0: 74 20 3d 20 73 65 6e 64 66 69 6c 65 28 66 64 2c  t = sendfile(fd,
50f0: 20 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 2c 20 26   fileinfo->fd, &
5100: 73 65 6e 64 66 69 6c 65 5f 6f 66 66 73 65 74 2c  sendfile_offset,
5110: 20 73 65 6e 64 66 69 6c 65 5f 73 69 7a 65 29 3b   sendfile_size);
5120: 0a 09 09 09 09 69 66 20 28 73 65 6e 64 66 69 6c  .....if (sendfil
5130: 65 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 23 69  e_ret <= 0) {.#i
5140: 66 64 65 66 20 46 49 4c 45 44 5f 4e 4f 4e 42 4c  fdef FILED_NONBL
5150: 4f 43 4b 5f 48 54 54 50 0a 09 09 09 09 09 69 66  OCK_HTTP......if
5160: 20 28 65 72 72 6e 6f 20 3d 3d 20 45 41 47 41 49   (errno == EAGAI
5170: 4e 29 20 7b 0a 09 09 09 09 09 09 73 65 6e 64 66  N) {.......sendf
5180: 69 6c 65 5f 72 65 74 20 3d 20 30 3b 0a 0a 09 09  ile_ret = 0;....
5190: 09 09 09 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ....while (1) {.
51a0: 09 09 09 09 09 09 09 73 65 6c 65 63 74 28 66 64  .......select(fd
51b0: 20 2b 20 31 2c 20 26 72 66 64 2c 20 26 77 66 64   + 1, &rfd, &wfd
51c0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
51d0: 09 09 09 09 09 09 69 66 20 28 46 44 5f 49 53 53  ......if (FD_ISS
51e0: 45 54 28 66 64 2c 20 26 72 66 64 29 29 20 7b 0a  ET(fd, &rfd)) {.
51f0: 09 09 09 09 09 09 09 09 72 65 61 64 5f 72 65 74  ........read_ret
5200: 20 3d 20 72 65 61 64 28 66 64 2c 20 73 69 6e 6b   = read(fd, sink
5210: 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 6e 6b  buf, sizeof(sink
5220: 62 75 66 29 29 3b 0a 0a 09 09 09 09 09 09 09 09  buf));..........
5230: 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20  if (read_ret <= 
5240: 30 29 20 7b 0a 09 09 09 09 09 09 09 09 09 62 72  0) {..........br
5250: 65 61 6b 3b 0a 09 09 09 09 09 09 09 09 7d 0a 09  eak;.........}..
5260: 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 09  ......}.........
5270: 69 66 20 28 46 44 5f 49 53 53 45 54 28 66 64 2c  if (FD_ISSET(fd,
5280: 20 26 77 66 64 29 29 20 7b 0a 09 09 09 09 09 09   &wfd)) {.......
5290: 09 09 72 65 61 64 5f 72 65 74 20 3d 20 31 3b 0a  ..read_ret = 1;.
52a0: 0a 09 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  .........break;.
52b0: 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d  .......}.......}
52c0: 0a 0a 09 09 09 09 09 09 69 66 20 28 72 65 61 64  ........if (read
52d0: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
52e0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
52f0: 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
5300: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
5310: 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09 09 09  ...}.#else......
5320: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 09  break;.#endif...
5330: 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 66 69 6c  ..}......sendfil
5340: 65 5f 6c 65 6e 20 2d 3d 20 73 65 6e 64 66 69 6c  e_len -= sendfil
5350: 65 5f 72 65 74 3b 0a 09 09 09 09 73 65 6e 64 66  e_ret;.....sendf
5360: 69 6c 65 5f 73 65 6e 74 20 2b 3d 20 73 65 6e 64  ile_sent += send
5370: 66 69 6c 65 5f 72 65 74 3b 0a 09 09 09 09 69 66  file_ret;.....if
5380: 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d   (sendfile_len =
5390: 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 0) {......brea
53a0: 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
53b0: 09 09 6c 6f 67 2d 3e 65 6e 64 74 69 6d 65 20 3d  ..log->endtime =
53c0: 20 28 74 69 6d 65 5f 74 29 20 2d 31 3b 0a 09 09   (time_t) -1;...
53d0: 09 6c 6f 67 2d 3e 73 65 6e 74 5f 6c 65 6e 67 74  .log->sent_lengt
53e0: 68 20 3d 20 73 65 6e 64 66 69 6c 65 5f 73 65 6e  h = sendfile_sen
53f0: 74 3b 0a 0a 09 09 09 66 69 6c 65 64 5f 6c 6f 67  t;.....filed_log
5400: 5f 65 6e 74 72 79 28 6c 6f 67 29 3b 0a 09 09 7d  _entry(log);...}
5410: 0a 0a 09 09 63 6c 6f 73 65 28 66 69 6c 65 69 6e  ....close(filein
5420: 66 6f 2d 3e 66 64 29 3b 0a 09 7d 0a 0a 09 66 63  fo->fd);..}...fc
5430: 6c 6f 73 65 28 66 70 29 3b 0a 0a 09 72 65 74 75  lose(fp);...retu
5440: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65  rn;.}../* Handle
5450: 20 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63   incoming connec
5460: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
5470: 76 6f 69 64 20 2a 66 69 6c 65 64 5f 77 6f 72 6b  void *filed_work
5480: 65 72 5f 74 68 72 65 61 64 28 76 6f 69 64 20 2a  er_thread(void *
5490: 61 72 67 5f 76 29 20 7b 0a 09 73 74 72 75 63 74  arg_v) {..struct
54a0: 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68   filed_worker_th
54b0: 72 65 61 64 5f 61 72 67 73 20 2a 61 72 67 3b 0a  read_args *arg;.
54c0: 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 68 74  .struct filed_ht
54d0: 74 70 5f 72 65 71 75 65 73 74 20 72 65 71 75 65  tp_request reque
54e0: 73 74 3b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  st;..struct file
54f0: 64 5f 6c 6f 67 5f 65 6e 74 72 79 20 2a 6c 6f 67  d_log_entry *log
5500: 2c 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f  , local_dummy_lo
5510: 67 3b 0a 09 73 74 72 75 63 74 20 73 6f 63 6b 61  g;..struct socka
5520: 64 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a 09 73  ddr_in6 addr;..s
5530: 6f 63 6b 6c 65 6e 5f 74 20 61 64 64 72 6c 65 6e  ocklen_t addrlen
5540: 3b 0a 09 69 6e 74 20 66 61 69 6c 75 72 65 5f 63  ;..int failure_c
5550: 6f 75 6e 74 20 3d 20 30 2c 20 6d 61 78 5f 66 61  ount = 0, max_fa
5560: 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 46 49  ilure_count = FI
5570: 4c 45 44 5f 4d 41 58 5f 46 41 49 4c 55 52 45 5f  LED_MAX_FAILURE_
5580: 43 4f 55 4e 54 3b 0a 09 69 6e 74 20 6d 61 73 74  COUNT;..int mast
5590: 65 72 5f 66 64 2c 20 66 64 3b 0a 0a 09 2f 2a 20  er_fd, fd;.../* 
55a0: 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  Read arguments *
55b0: 2f 0a 09 61 72 67 20 3d 20 61 72 67 5f 76 3b 0a  /..arg = arg_v;.
55c0: 0a 09 6d 61 73 74 65 72 5f 66 64 20 3d 20 61 72  ..master_fd = ar
55d0: 67 2d 3e 66 64 3b 0a 0a 09 77 68 69 6c 65 20 28  g->fd;...while (
55e0: 31 29 20 7b 0a 09 09 2f 2a 20 46 61 69 6c 75 72  1) {.../* Failur
55f0: 65 20 6c 6f 6f 70 20 70 72 65 76 65 6e 74 69 6f  e loop preventio
5600: 6e 20 2a 2f 0a 09 09 69 66 20 28 66 61 69 6c 75  n */...if (failu
5610: 72 65 5f 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 66  re_count > max_f
5620: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 29 20 7b 0a  ailure_count) {.
5630: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
5640: 09 2f 2a 20 41 63 63 65 70 74 20 61 20 6e 65 77  ./* Accept a new
5650: 20 63 6c 69 65 6e 74 20 2a 2f 0a 09 09 61 64 64   client */...add
5660: 72 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 64  rlen = sizeof(ad
5670: 64 72 29 3b 0a 09 09 66 64 20 3d 20 61 63 63 65  dr);...fd = acce
5680: 70 74 28 6d 61 73 74 65 72 5f 66 64 2c 20 28 73  pt(master_fd, (s
5690: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20 2a  truct sockaddr *
56a0: 29 20 26 61 64 64 72 2c 20 26 61 64 64 72 6c 65  ) &addr, &addrle
56b0: 6e 29 3b 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 49  n);..../*... * I
56c0: 66 20 77 65 20 66 61 69 6c 2c 20 6d 61 6b 65 20  f we fail, make 
56d0: 61 20 6e 6f 74 65 20 6f 66 20 69 74 20 73 6f 20  a note of it so 
56e0: 77 65 20 64 6f 6e 27 74 20 67 6f 20 69 6e 74 6f  we don't go into
56f0: 20 61 20 6c 6f 6f 70 20 6f 66 0a 09 09 20 2a 20   a loop of... * 
5700: 61 63 63 65 70 74 28 29 20 66 61 69 6c 69 6e 67  accept() failing
5710: 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 66 64 20  ... */...if (fd 
5720: 3c 20 30 29 20 7b 0a 09 09 09 2f 2a 20 4c 6f 67  < 0) {..../* Log
5730: 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
5740: 69 6f 6e 20 2a 2f 0a 09 09 09 66 69 6c 65 64 5f  ion */....filed_
5750: 6c 6f 67 5f 6d 73 67 28 22 41 43 43 45 50 54 5f  log_msg("ACCEPT_
5760: 46 41 49 4c 45 44 22 29 3b 0a 0a 09 09 09 66 61  FAILED");.....fa
5770: 69 6c 75 72 65 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  ilure_count++;..
5780: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
5790: 0a 0a 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e  ..../* Log the n
57a0: 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  ew connection */
57b0: 0a 09 09 6c 6f 67 20 3d 20 66 69 6c 65 64 5f 6c  ...log = filed_l
57c0: 6f 67 5f 6e 65 77 28 31 29 3b 0a 09 09 69 66 20  og_new(1);...if 
57d0: 28 6c 6f 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (log == NULL) {.
57e0: 09 09 09 63 6c 6f 73 65 28 66 64 29 3b 0a 0a 09  ...close(fd);...
57f0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
5800: 0a 09 09 6c 6f 67 2d 3e 74 79 70 65 20 3d 20 46  ...log->type = F
5810: 49 4c 45 44 5f 4c 4f 47 5f 54 59 50 45 5f 54 52  ILED_LOG_TYPE_TR
5820: 41 4e 53 46 45 52 3b 0a 09 09 69 66 20 28 66 69  ANSFER;...if (fi
5830: 6c 65 64 5f 6c 6f 67 5f 69 70 28 28 73 74 72 75  led_log_ip((stru
5840: 63 74 20 73 6f 63 6b 61 64 64 72 20 2a 29 20 26  ct sockaddr *) &
5850: 61 64 64 72 2c 20 6c 6f 67 2d 3e 69 70 2c 20 73  addr, log->ip, s
5860: 69 7a 65 6f 66 28 6c 6f 67 2d 3e 69 70 29 29 20  izeof(log->ip)) 
5870: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f  == NULL) {....lo
5880: 67 2d 3e 69 70 5b 30 5d 20 3d 20 27 5c 30 27 3b  g->ip[0] = '\0';
5890: 0a 09 09 7d 0a 09 09 6c 6f 67 2d 3e 70 6f 72 74  ...}...log->port
58a0: 20 3d 20 61 64 64 72 2e 73 69 6e 36 5f 70 6f 72   = addr.sin6_por
58b0: 74 3b 0a 0a 09 09 2f 2a 20 52 65 73 65 74 20 66  t;..../* Reset f
58c0: 61 69 6c 75 72 65 20 63 6f 75 6e 74 2a 2f 0a 09  ailure count*/..
58d0: 09 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d  .failure_count =
58e0: 20 30 3b 0a 0a 09 09 2f 2a 20 48 61 6e 64 6c 65   0;..../* Handle
58f0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 09 66 69 6c   socket */...fil
5900: 65 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e 74  ed_handle_client
5910: 28 66 64 2c 20 26 72 65 71 75 65 73 74 2c 20 6c  (fd, &request, l
5920: 6f 67 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 70  og);..}.../* Rep
5930: 6f 72 74 20 65 72 72 6f 72 20 2a 2f 0a 09 66 69  ort error */..fi
5940: 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28 22 54 48 52  led_log_msg("THR
5950: 45 41 44 5f 44 49 45 44 20 41 42 4e 4f 52 4d 41  EAD_DIED ABNORMA
5960: 4c 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 4e 55  L");...return(NU
5970: 4c 4c 29 3b 0a 0a 09 2f 2a 20 6c 6f 63 61 6c 5f  LL);.../* local_
5980: 64 75 6d 6d 79 5f 6c 6f 67 20 69 73 20 6f 6e 6c  dummy_log is onl
5990: 79 20 75 73 65 64 20 69 66 20 46 49 4c 45 44 5f  y used if FILED_
59a0: 44 4f 4e 54 5f 4c 4f 47 20 69 73 20 65 6e 61 62  DONT_LOG is enab
59b0: 6c 65 64 2c 20 6f 74 68 65 72 77 69 73 65 20 69  led, otherwise i
59c0: 74 27 73 20 6e 6f 74 20 75 73 65 64 2c 20 62 75  t's not used, bu
59d0: 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 68  t the compiler h
59e0: 61 74 65 73 20 74 68 61 74 20 69 64 65 61 2e 20  ates that idea. 
59f0: 2a 2f 0a 09 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f  */..local_dummy_
5a00: 6c 6f 67 2e 74 79 70 65 20 3d 20 30 3b 0a 09 6c  log.type = 0;..l
5a10: 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74  ocal_dummy_log.t
5a20: 79 70 65 20 3d 20 6c 6f 63 61 6c 5f 64 75 6d 6d  ype = local_dumm
5a30: 79 5f 6c 6f 67 2e 74 79 70 65 3b 0a 7d 0a 0a 2f  y_log.type;.}../
5a40: 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72 20  * Create worker 
5a50: 74 68 72 65 61 64 73 20 2a 2f 0a 73 74 61 74 69  threads */.stati
5a60: 63 20 69 6e 74 20 66 69 6c 65 64 5f 77 6f 72 6b  c int filed_work
5a70: 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 28  er_threads_init(
5a80: 69 6e 74 20 66 64 2c 20 69 6e 74 20 74 68 72 65  int fd, int thre
5a90: 61 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  ad_count) {..str
5aa0: 75 63 74 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72  uct filed_worker
5ab0: 5f 74 68 72 65 61 64 5f 61 72 67 73 20 2a 61 72  _thread_args *ar
5ac0: 67 3b 0a 09 70 74 68 72 65 61 64 5f 74 20 74 68  g;..pthread_t th
5ad0: 72 65 61 64 69 64 3b 0a 09 69 6e 74 20 70 74 68  readid;..int pth
5ae0: 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69  read_ret;..int i
5af0: 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  ;...for (i = 0; 
5b00: 69 20 3c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  i < thread_count
5b10: 3b 20 69 2b 2b 29 20 7b 0a 09 09 61 72 67 20 3d  ; i++) {...arg =
5b20: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
5b30: 61 72 67 29 29 3b 0a 0a 09 09 61 72 67 2d 3e 66  arg));....arg->f
5b40: 64 20 3d 20 66 64 3b 0a 0a 09 09 70 74 68 72 65  d = fd;....pthre
5b50: 61 64 5f 72 65 74 20 3d 20 70 74 68 72 65 61 64  ad_ret = pthread
5b60: 5f 63 72 65 61 74 65 28 26 74 68 72 65 61 64 69  _create(&threadi
5b70: 64 2c 20 4e 55 4c 4c 2c 20 66 69 6c 65 64 5f 77  d, NULL, filed_w
5b80: 6f 72 6b 65 72 5f 74 68 72 65 61 64 2c 20 61 72  orker_thread, ar
5b90: 67 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  g);...if (pthrea
5ba0: 64 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  d_ret != 0) {...
5bb0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
5bc0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ..}...return(0);
5bd0: 0a 7d 0a 0a 2f 2a 20 44 69 73 70 6c 61 79 20 68  .}../* Display h
5be0: 65 6c 70 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  elp */.static vo
5bf0: 69 64 20 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68  id filed_print_h
5c00: 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74 70 75 74  elp(FILE *output
5c10: 2c 20 69 6e 74 20 6c 6f 6e 67 5f 68 65 6c 70 2c  , int long_help,
5c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 74   const char *ext
5c30: 72 61 29 20 7b 0a 09 69 66 20 28 65 78 74 72 61  ra) {..if (extra
5c40: 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ) {...fprintf(ou
5c50: 74 70 75 74 2c 20 22 25 73 5c 6e 22 2c 20 65 78  tput, "%s\n", ex
5c60: 74 72 61 29 3b 0a 09 7d 0a 0a 09 66 70 72 69 6e  tra);..}...fprin
5c70: 74 66 28 6f 75 74 70 75 74 2c 20 22 55 73 61 67  tf(output, "Usag
5c80: 65 3a 20 66 69 6c 65 64 20 5b 3c 6f 70 74 69 6f  e: filed [<optio
5c90: 6e 73 3e 5d 5c 6e 22 29 3b 0a 09 66 70 72 69 6e  ns>]\n");..fprin
5ca0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 4f 70  tf(output, "  Op
5cb0: 74 69 6f 6e 73 3a 5c 6e 22 29 3b 0a 09 66 70 72  tions:\n");..fpr
5cc0: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5cd0: 20 20 20 20 2d 68 2c 20 2d 2d 68 65 6c 70 5c 6e      -h, --help\n
5ce0: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
5cf0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 64 2c 20  put, "      -d, 
5d00: 2d 2d 64 61 65 6d 6f 6e 5c 6e 22 29 3b 0a 09 66  --daemon\n");..f
5d10: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5d20: 20 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72 73        -v, --vers
5d30: 69 6f 6e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74  ion\n");..fprint
5d40: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
5d50: 20 2d 62 20 3c 61 64 64 72 65 73 73 3e 2c 20 2d   -b <address>, -
5d60: 2d 62 69 6e 64 20 3c 61 64 64 72 65 73 73 3e 5c  -bind <address>\
5d70: 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75  n");..fprintf(ou
5d80: 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 70 20  tput, "      -p 
5d90: 3c 70 6f 72 74 3e 2c 20 2d 2d 70 6f 72 74 20 3c  <port>, --port <
5da0: 70 6f 72 74 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  port>\n");..fpri
5db0: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5dc0: 20 20 20 2d 74 20 3c 63 6f 75 6e 74 3e 2c 20 2d     -t <count>, -
5dd0: 2d 74 68 72 65 61 64 73 20 3c 63 6f 75 6e 74 3e  -threads <count>
5de0: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
5df0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 63  utput, "      -c
5e00: 20 3c 65 6e 74 72 69 65 73 3e 2c 20 2d 2d 63 61   <entries>, --ca
5e10: 63 68 65 20 3c 65 6e 74 72 69 65 73 3e 5c 6e 22  che <entries>\n"
5e20: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
5e30: 75 74 2c 20 22 20 20 20 20 20 20 2d 6c 20 3c 66  ut, "      -l <f
5e40: 69 6c 65 3e 2c 20 2d 2d 6c 6f 67 20 3c 66 69 6c  ile>, --log <fil
5e50: 65 3e 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66  e>\n");..fprintf
5e60: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
5e70: 2d 75 20 3c 75 73 65 72 3e 2c 20 2d 2d 75 73 65  -u <user>, --use
5e80: 72 20 3c 75 73 65 72 3e 5c 6e 22 29 3b 0a 09 66  r <user>\n");..f
5e90: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5ea0: 20 20 20 20 20 20 2d 72 20 3c 64 69 72 65 63 74        -r <direct
5eb0: 6f 72 79 3e 2c 20 2d 2d 72 6f 6f 74 20 3c 64 69  ory>, --root <di
5ec0: 72 65 63 74 6f 72 79 3e 5c 6e 22 29 3b 0a 0a 09  rectory>\n");...
5ed0: 69 66 20 28 6c 6f 6e 67 5f 68 65 6c 70 29 20 7b  if (long_help) {
5ee0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5ef0: 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69  t, "\n");...fpri
5f00: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 55  ntf(output, "  U
5f10: 73 61 67 65 3a 5c 6e 22 29 3b 0a 09 09 66 70 72  sage:\n");...fpr
5f20: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5f30: 20 20 20 20 2d 68 20 28 6f 72 20 2d 2d 68 65 6c      -h (or --hel
5f40: 70 29 20 70 72 69 6e 74 73 20 74 68 69 73 20 75  p) prints this u
5f50: 73 61 67 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  sage information
5f60: 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  .\n");...fprintf
5f70: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
5f80: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5f90: 2c 20 22 20 20 20 20 20 20 2d 64 20 28 6f 72 20  , "      -d (or 
5fa0: 2d 2d 64 61 65 6d 6f 6e 29 20 69 6e 73 74 72 75  --daemon) instru
5fb0: 63 74 73 20 66 69 6c 65 64 20 74 6f 20 62 65 63  cts filed to bec
5fc0: 6f 6d 65 20 61 20 64 61 65 6d 6f 6e 20 61 66 74  ome a daemon aft
5fd0: 65 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 5c  er initializing\
5fe0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
5ff0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6010: 68 65 20 6c 69 73 74 65 6e 69 6e 67 20 54 43 50  he listening TCP
6020: 20 73 6f 63 6b 65 74 20 61 6e 64 20 6c 6f 67 20   socket and log 
6030: 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70  files.\n");...fp
6040: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
6050: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
6060: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 76  utput, "      -v
6070: 20 28 6f 72 20 2d 2d 76 65 72 73 69 6f 6e 29 20   (or --version) 
6080: 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65 64 20  instructs filed 
6090: 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 76 65  print out the ve
60a0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 6e 64  rsion number and
60b0: 20 65 78 69 74 2e 5c 6e 22 29 3b 0a 09 09 66 70   exit.\n");...fp
60c0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c  rintf(output, "\
60d0: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
60e0: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 62  utput, "      -b
60f0: 20 28 6f 72 20 2d 2d 62 69 6e 64 29 20 73 70 65   (or --bind) spe
6100: 63 69 66 69 65 73 20 74 68 65 20 61 64 64 72 65  cifies the addre
6110: 73 73 20 74 6f 20 6c 69 73 74 65 6e 20 66 6f 72  ss to listen for
6120: 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 5c 6e   incoming HTTP\n
6130: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
6140: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
6150: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75              requ
6160: 65 73 74 73 20 6f 6e 2e 20 20 54 68 65 20 64 65  ests on.  The de
6170: 66 61 75 6c 74 20 76 61 6c 75 65 20 69 73 20 5c  fault value is \
6180: 22 25 73 5c 22 2e 5c 6e 22 2c 20 42 49 4e 44 5f  "%s\".\n", BIND_
6190: 41 44 44 52 29 3b 0a 09 09 66 70 72 69 6e 74 66  ADDR);...fprintf
61a0: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
61b0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
61c0: 2c 20 22 20 20 20 20 20 20 2d 70 20 28 6f 72 20  , "      -p (or 
61d0: 2d 2d 70 6f 72 74 29 20 73 70 65 63 69 66 69 65  --port) specifie
61e0: 73 20 74 68 65 20 54 43 50 20 70 6f 72 74 20 6e  s the TCP port n
61f0: 75 6d 62 65 72 20 74 6f 20 6c 69 73 74 65 6e 20  umber to listen 
6200: 66 6f 72 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54  for incoming HTT
6210: 50 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  P\n");...fprintf
6220: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
6240: 65 71 75 65 73 74 73 20 6f 6e 2e 20 20 54 68 65  equests on.  The
6250: 20 64 65 66 61 75 6c 74 20 69 73 20 25 75 2e 5c   default is %u.\
6260: 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  n", (unsigned in
6270: 74 29 20 50 4f 52 54 29 3b 0a 09 09 66 70 72 69  t) PORT);...fpri
6280: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22  ntf(output, "\n"
6290: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
62a0: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 74 20 28  put, "      -t (
62b0: 6f 72 20 2d 2d 74 68 72 65 61 64 73 29 20 73 70  or --threads) sp
62c0: 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
62d0: 65 72 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72  er of worker thr
62e0: 65 61 64 73 20 74 6f 20 63 72 65 61 74 65 2e 20  eads to create. 
62f0: 45 61 63 68 5c 6e 22 29 3b 0a 09 09 66 70 72 69  Each\n");...fpri
6300: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 77 6f 72 6b 65 72 20 74 68 72 65       worker thre
6330: 61 64 20 63 61 6e 20 73 65 72 76 69 63 65 20 6f  ad can service o
6340: 6e 65 20 63 6f 6e 63 75 72 72 65 6e 74 20 48 54  ne concurrent HT
6350: 54 50 20 73 65 73 73 69 6f 6e 2e 5c 6e 22 29 3b  TP session.\n");
6360: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
6370: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
6380: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 75 73              Thus
6390: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
63a0: 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 77  hreads created w
63b0: 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ill determine ho
63c0: 77 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  w\n");...fprintf
63d0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 20 6d 61 6e 79 20 73 69 6d 75 6c 74 61 6e 65    many simultane
6400: 6f 75 73 20 74 72 61 6e 73 66 65 72 73 20 77 69  ous transfers wi
6410: 6c 6c 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 20  ll be possible. 
6420: 54 68 65 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  The\n");...fprin
6430: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 20 20 20 20 64 65 66 61 75 6c 74 20 69 73 20 25      default is %
6460: 6c 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65  lu.\n", (unsigne
6470: 64 20 6c 6f 6e 67 29 20 54 48 52 45 41 44 5f 43  d long) THREAD_C
6480: 4f 55 4e 54 29 3b 0a 09 09 66 70 72 69 6e 74 66  OUNT);...fprintf
6490: 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a  (output, "\n");.
64a0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
64b0: 2c 20 22 20 20 20 20 20 20 2d 63 20 28 6f 72 20  , "      -c (or 
64c0: 2d 2d 63 61 63 68 65 29 20 73 70 65 63 69 66 69  --cache) specifi
64d0: 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
64e0: 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   file informatio
64f0: 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 5c  n cache entries\
6500: 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f  n");...fprintf(o
6510: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20  utput, "        
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f                to
6530: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 45 61 63 68   allocate.  Each
6540: 20 63 61 63 68 65 20 65 6e 74 72 79 20 68 6f 6c   cache entry hol
6550: 64 73 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  ds file informat
6560: 69 6f 6e 20 61 73 5c 6e 22 29 3b 0a 09 09 66 70  ion as\n");...fp
6570: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 20 20 20 77 65 6c 6c 20 61 73 20 61 6e 20       well as an 
65a0: 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  open file descri
65b0: 70 74 6f 72 20 74 6f 20 74 68 65 20 66 69 6c 65  ptor to the file
65c0: 2c 20 73 6f 20 72 65 73 6f 75 72 63 65 5c 6e 22  , so resource\n"
65d0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
65e0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69              limi
6600: 74 73 20 28 69 2e 65 2e 2c 20 75 6c 69 6d 69 74  ts (i.e., ulimit
6610: 29 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6e 73  ) should be cons
6620: 69 64 65 72 65 64 2e 20 20 54 68 69 73 20 73 68  idered.  This sh
6630: 6f 75 6c 64 5c 6e 22 29 3b 0a 09 09 66 70 72 69  ould\n");...fpri
6640: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 62 65 20 61 20 70 72 69 6d 65 20 6e 75     be a prime nu
6670: 6d 62 65 72 20 66 6f 72 20 69 64 65 61 6c 20 75  mber for ideal u
6680: 73 65 20 77 69 74 68 20 74 68 65 20 6c 6f 6f 6b  se with the look
6690: 75 70 20 6d 65 74 68 6f 64 2e 5c 6e 22 29 3b 0a  up method.\n");.
66a0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
66b0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
66c0: 20 20 20 20 20 20 20 20 20 54 68 65 20 64 65 66           The def
66d0: 61 75 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c  ault is %lu.\n",
66e0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
66f0: 20 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 09 09   CACHE_SIZE);...
6700: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6710: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
6720: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6730: 2d 6c 20 28 6f 72 20 2d 2d 6c 6f 67 29 20 73 70  -l (or --log) sp
6740: 65 63 69 66 69 65 73 20 61 20 66 69 6c 65 6e 61  ecifies a filena
6750: 6d 65 20 74 6f 20 6f 70 65 6e 20 66 6f 72 20 77  me to open for w
6760: 72 69 74 69 6e 67 20 6c 6f 67 20 65 6e 74 72 69  riting log entri
6770: 65 73 2e 20 20 4c 6f 67 5c 6e 22 29 3b 0a 09 09  es.  Log\n");...
6780: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6790: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
67a0: 20 20 20 20 20 65 6e 74 72 69 65 73 20 61 72 65       entries are
67b0: 20 6d 61 64 65 20 66 6f 72 20 76 61 72 69 6f 75   made for variou
67c0: 73 20 73 74 61 67 65 73 20 69 6e 20 74 72 61 6e  s stages in tran
67d0: 73 66 65 72 69 6e 67 20 66 69 6c 65 73 2e 5c 6e  sfering files.\n
67e0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
67f0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
6800: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6c             The l
6810: 6f 67 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  og file is opene
6820: 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69  d before switchi
6830: 6e 67 20 75 73 65 72 73 20 28 73 65 65 20 5c 22  ng users (see \"
6840: 2d 75 5c 22 29 5c 6e 22 29 3b 0a 09 09 66 70 72  -u\")\n");...fpr
6850: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 61 6e 64 20 72 6f 6f 74 20 64 69 72 65 63    and root direc
6880: 74 6f 72 69 65 73 20 28 73 65 65 20 5c 22 2d 72  tories (see \"-r
6890: 5c 22 29 2e 20 20 54 68 65 20 6c 6f 67 20 66 69  \").  The log fi
68a0: 6c 65 20 69 73 20 6e 65 76 65 72 5c 6e 22 29 3b  le is never\n");
68b0: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
68c0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
68d0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 64 20 73          closed s
68e0: 6f 20 6c 6f 67 20 72 6f 74 61 74 69 6f 6e 20 77  o log rotation w
68f0: 69 74 68 6f 75 74 20 73 74 6f 70 70 69 6e 67 20  ithout stopping 
6900: 74 68 65 20 64 61 65 6d 6f 6e 20 69 73 20 77 69  the daemon is wi
6910: 6c 6c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ll\n");...fprint
6920: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
6940: 6f 74 20 77 6f 72 6b 2e 20 20 54 68 65 20 76 61  ot work.  The va
6950: 6c 75 65 20 6f 66 20 5c 22 2d 5c 22 20 69 6e 64  lue of \"-\" ind
6960: 69 63 61 74 65 73 20 74 68 61 74 20 73 74 61 6e  icates that stan
6970: 64 61 72 64 20 6f 75 74 70 75 74 5c 6e 22 29 3b  dard output\n");
6980: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
6990: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
69a0: 20 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62          should b
69b0: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69  e used for loggi
69c0: 6e 67 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ng.  If the file
69d0: 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
69e0: 20 61 20 5c 22 7c 5c 22 5c 6e 22 29 3b 0a 09 09   a \"|\"\n");...
69f0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6a00: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6a10: 20 20 20 20 20 74 68 65 6e 20 61 20 70 72 6f 63       then a proc
6a20: 65 73 73 20 69 73 20 73 74 61 72 74 65 64 20 61  ess is started a
6a30: 6e 64 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67  nd used for logg
6a40: 69 6e 67 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ing instead of a
6a50: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
6a60: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
6a80: 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  e.  The default 
6a90: 69 73 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 20 4c  is \"%s\".\n", L
6aa0: 4f 47 5f 46 49 4c 45 29 3b 0a 23 69 66 64 65 66  OG_FILE);.#ifdef
6ab0: 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a   FILED_DONT_LOG.
6ac0: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
6ad0: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
6ae0: 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74         Note that
6af0: 20 6c 6f 67 67 69 6e 67 20 69 73 20 63 6f 6d 70   logging is comp
6b00: 6c 65 74 65 6c 79 20 64 69 73 61 62 6c 65 64 20  letely disabled 
6b10: 73 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 64  so this option d
6b20: 6f 65 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  oes\n");...fprin
6b30: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 6e 6f 74 68 69 6e 67 20 69 6e 20 74 68 69 73 20  nothing in this 
6b60: 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64  build.\n");.#end
6b70: 69 66 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  if...fprintf(out
6b80: 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70  put, "\n");...fp
6b90: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6ba0: 20 20 20 20 20 2d 75 20 28 6f 72 20 2d 2d 75 73       -u (or --us
6bb0: 65 72 29 20 73 70 65 63 69 66 69 65 73 20 74 68  er) specifies th
6bc0: 65 20 75 73 65 72 20 74 6f 20 73 77 69 74 63 68  e user to switch
6bd0: 20 75 73 65 72 20 49 44 73 20 74 6f 20 62 65 66   user IDs to bef
6be0: 6f 72 65 20 73 65 72 76 69 63 69 6e 67 5c 6e 22  ore servicing\n"
6bf0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
6c00: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
6c10: 20 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65             reque
6c20: 73 74 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c  sts.  The defaul
6c30: 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  t is not change 
6c40: 75 73 65 72 20 49 44 73 2e 5c 6e 22 29 3b 0a 09  user IDs.\n");..
6c50: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6c60: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
6c70: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6c80: 20 2d 72 20 28 6f 72 20 2d 2d 72 6f 6f 74 29 20   -r (or --root) 
6c90: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 64 69  specifies the di
6ca0: 72 65 63 74 6f 72 79 20 74 6f 20 61 63 74 20 61  rectory to act a
6cb0: 73 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63  s the root direc
6cc0: 74 6f 72 79 20 66 6f 72 5c 6e 22 29 3b 0a 09 09  tory for\n");...
6cd0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6ce0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6cf0: 20 20 20 20 20 20 74 68 65 20 66 69 6c 65 20 73        the file s
6d00: 65 72 76 65 72 2e 20 20 49 66 20 74 68 69 73 20  erver.  If this 
6d10: 6f 70 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66  option is specif
6d20: 69 65 64 2c 20 63 68 72 6f 6f 74 28 32 29 5c 6e  ied, chroot(2)\n
6d30: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
6d40: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 63              is c
6d60: 61 6c 6c 65 64 2e 20 20 54 68 65 20 64 65 66 61  alled.  The defa
6d70: 75 6c 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ult is not chang
6d80: 65 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69  e root directori
6d90: 65 73 2c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  es,\n");...fprin
6da0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 74 68 61 74 20 69 73 2c 20 74 68 65 20 5c 22   that is, the \"
6dd0: 2f 5c 22 20 64 69 72 65 63 74 6f 72 79 20 69 73  /\" directory is
6de0: 20 73 68 61 72 65 64 20 6f 75 74 2e 20 20 54 68   shared out.  Th
6df0: 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66  is will\n");...f
6e00: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 20 6c 69 6b 65 6c 79 20 62 65 20 61       likely be a
6e30: 20 73 65 63 75 72 69 74 79 20 69 73 73 75 65 2c   security issue,
6e40: 20 73 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   so this option 
6e50: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 5c 6e 22  should always\n"
6e60: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
6e70: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
6e80: 20 20 20 20 20 20 20 20 20 20 20 62 65 20 75 73             be us
6e90: 65 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65  ed.\n");..}...re
6ea0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  turn;.}../* Add 
6eb0: 61 20 67 65 74 6f 70 74 20 6f 70 74 69 6f 6e 20  a getopt option 
6ec0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6ed0: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
6ee0: 5f 73 65 74 6f 70 74 28 73 74 72 75 63 74 20 6f  _setopt(struct o
6ef0: 70 74 69 6f 6e 20 2a 6f 70 74 2c 20 63 6f 6e 73  ption *opt, cons
6f00: 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e  t char *name, in
6f10: 74 20 68 61 73 5f 61 72 67 2c 20 69 6e 74 20 76  t has_arg, int v
6f20: 61 6c 29 20 7b 0a 09 6f 70 74 2d 3e 6e 61 6d 65  al) {..opt->name
6f30: 20 20 20 20 20 3d 20 6e 61 6d 65 3b 0a 09 6f 70       = name;..op
6f40: 74 2d 3e 68 61 73 5f 61 72 67 20 20 3d 20 68 61  t->has_arg  = ha
6f50: 73 5f 61 72 67 3b 0a 09 6f 70 74 2d 3e 66 6c 61  s_arg;..opt->fla
6f60: 67 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 09 6f  g     = NULL;..o
6f70: 70 74 2d 3e 76 61 6c 20 20 20 20 20 20 3d 20 76  pt->val      = v
6f80: 61 6c 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  al;...return;.}.
6f90: 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 75 73  ./* Resolve a us
6fa0: 65 72 6e 61 6d 65 20 74 6f 20 61 20 55 49 44 20  ername to a UID 
6fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
6fc0: 6c 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28  led_user_lookup(
6fd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 73 65 72  const char *user
6fe0: 2c 20 75 69 64 5f 74 20 2a 75 73 65 72 5f 69 64  , uid_t *user_id
6ff0: 29 20 7b 0a 09 63 68 61 72 20 2a 6e 65 78 74 3b  ) {..char *next;
7000: 0a 09 75 69 64 5f 74 20 75 73 65 72 5f 69 64 5f  ..uid_t user_id_
7010: 63 68 65 63 6b 3b 0a 23 69 66 6e 64 65 66 20 46  check;.#ifndef F
7020: 49 4c 45 44 5f 4e 4f 5f 47 45 54 50 57 4e 41 4d  ILED_NO_GETPWNAM
7030: 0a 09 73 74 72 75 63 74 20 70 61 73 73 77 64 20  ..struct passwd 
7040: 2a 65 6e 74 3b 0a 0a 09 65 6e 74 20 3d 20 67 65  *ent;...ent = ge
7050: 74 70 77 6e 61 6d 28 75 73 65 72 29 3b 0a 09 69  tpwnam(user);..i
7060: 66 20 28 65 6e 74 20 21 3d 20 4e 55 4c 4c 29 20  f (ent != NULL) 
7070: 7b 0a 09 09 2a 75 73 65 72 5f 69 64 20 3d 20 65  {...*user_id = e
7080: 6e 74 2d 3e 70 77 5f 75 69 64 3b 0a 0a 09 09 72  nt->pw_uid;....r
7090: 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 23 65 6e  eturn(0);..}.#en
70a0: 64 69 66 0a 0a 09 75 73 65 72 5f 69 64 5f 63 68  dif...user_id_ch
70b0: 65 63 6b 20 3d 20 73 74 72 74 6f 75 6c 6c 28 75  eck = strtoull(u
70c0: 73 65 72 2c 20 26 6e 65 78 74 2c 20 31 30 29 3b  ser, &next, 10);
70d0: 0a 09 69 66 20 28 6e 65 78 74 20 3d 3d 20 4e 55  ..if (next == NU
70e0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31  LL) {...return(1
70f0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e 65 78 74  );..}...if (next
7100: 5b 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] != '\0') {..
7110: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
7120: 09 2a 75 73 65 72 5f 69 64 20 3d 20 75 73 65 72  .*user_id = user
7130: 5f 69 64 5f 63 68 65 63 6b 3b 0a 0a 09 72 65 74  _id_check;...ret
7140: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 61  urn(0);.}../* Da
7150: 65 6d 6f 6e 69 7a 65 20 2a 2f 0a 73 74 61 74 69  emonize */.stati
7160: 63 20 69 6e 74 20 66 69 6c 65 64 5f 64 61 65 6d  c int filed_daem
7170: 6f 6e 69 7a 65 28 76 6f 69 64 29 20 7b 0a 09 70  onize(void) {..p
7180: 69 64 5f 74 20 73 65 74 73 69 64 5f 72 65 74 2c  id_t setsid_ret,
7190: 20 66 6f 72 6b 5f 72 65 74 3b 0a 09 69 6e 74 20   fork_ret;..int 
71a0: 63 68 64 69 72 5f 72 65 74 2c 20 64 75 70 32 5f  chdir_ret, dup2_
71b0: 72 65 74 3b 0a 09 69 6e 74 20 66 64 5f 69 6e 2c  ret;..int fd_in,
71c0: 20 66 64 5f 6f 75 74 3b 0a 0a 09 63 68 64 69 72   fd_out;...chdir
71d0: 5f 72 65 74 20 3d 20 63 68 64 69 72 28 22 2f 22  _ret = chdir("/"
71e0: 29 3b 0a 09 69 66 20 28 63 68 64 69 72 5f 72 65  );..if (chdir_re
71f0: 74 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t != 0) {...retu
7200: 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 6b  rn(1);..}...fork
7210: 5f 72 65 74 20 3d 20 66 6f 72 6b 28 29 3b 0a 09  _ret = fork();..
7220: 69 66 20 28 66 6f 72 6b 5f 72 65 74 20 3c 20 30  if (fork_ret < 0
7230: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  ) {...return(1);
7240: 0a 09 7d 0a 0a 09 69 66 20 28 66 6f 72 6b 5f 72  ..}...if (fork_r
7250: 65 74 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 20 50  et > 0) {.../* P
7260: 61 72 65 6e 74 20 2a 2f 0a 09 09 77 61 69 74 70  arent */...waitp
7270: 69 64 28 66 6f 72 6b 5f 72 65 74 2c 20 4e 55 4c  id(fork_ret, NUL
7280: 4c 2c 20 30 29 3b 0a 0a 09 09 65 78 69 74 28 45  L, 0);....exit(E
7290: 58 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d  XIT_SUCCESS);..}
72a0: 0a 0a 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09  .../* Child */..
72b0: 69 66 20 28 66 6f 72 6b 28 29 20 21 3d 20 30 29  if (fork() != 0)
72c0: 20 7b 0a 09 09 2f 2a 20 43 68 69 6c 64 20 2a 2f   {.../* Child */
72d0: 0a 09 09 65 78 69 74 28 45 58 49 54 5f 53 55 43  ...exit(EXIT_SUC
72e0: 43 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47  CESS);..}.../* G
72f0: 72 61 6e 64 20 63 68 69 6c 64 20 2a 2f 0a 09 73  rand child */..s
7300: 65 74 73 69 64 5f 72 65 74 20 3d 20 73 65 74 73  etsid_ret = sets
7310: 69 64 28 29 3b 0a 09 69 66 20 28 73 65 74 73 69  id();..if (setsi
7320: 64 5f 72 65 74 20 3d 3d 20 28 28 70 69 64 5f 74  d_ret == ((pid_t
7330: 29 20 2d 31 29 29 20 7b 0a 09 09 72 65 74 75 72  ) -1)) {...retur
7340: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 64 5f 69 6e  n(1);..}...fd_in
7350: 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75   = open("/dev/nu
7360: 6c 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  ll", O_RDONLY);.
7370: 09 66 64 5f 6f 75 74 20 3d 20 6f 70 65 6e 28 22  .fd_out = open("
7380: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 57 52  /dev/null", O_WR
7390: 4f 4e 4c 59 29 3b 0a 09 69 66 20 28 66 64 5f 69  ONLY);..if (fd_i
73a0: 6e 20 3c 20 30 20 7c 7c 20 66 64 5f 6f 75 74 20  n < 0 || fd_out 
73b0: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
73c0: 31 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65  1);..}...dup2_re
73d0: 74 20 3d 20 64 75 70 32 28 66 64 5f 69 6e 2c 20  t = dup2(fd_in, 
73e0: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09  STDIN_FILENO);..
73f0: 69 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20  if (dup2_ret != 
7400: 53 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 20 7b 0a  STDIN_FILENO) {.
7410: 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
7420: 0a 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70  ..dup2_ret = dup
7430: 32 28 66 64 5f 6f 75 74 2c 20 53 54 44 4f 55 54  2(fd_out, STDOUT
7440: 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64  _FILENO);..if (d
7450: 75 70 32 5f 72 65 74 20 21 3d 20 53 54 44 4f 55  up2_ret != STDOU
7460: 54 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65  T_FILENO) {...re
7470: 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75  turn(1);..}...du
7480: 70 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64  p2_ret = dup2(fd
7490: 5f 6f 75 74 2c 20 53 54 44 45 52 52 5f 46 49 4c  _out, STDERR_FIL
74a0: 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f  ENO);..if (dup2_
74b0: 72 65 74 20 21 3d 20 53 54 44 45 52 52 5f 46 49  ret != STDERR_FI
74c0: 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e  LENO) {...return
74d0: 28 31 29 3b 0a 09 7d 0a 0a 09 63 6c 6f 73 65 28  (1);..}...close(
74e0: 66 64 5f 69 6e 29 3b 0a 09 63 6c 6f 73 65 28 66  fd_in);..close(f
74f0: 64 5f 6f 75 74 29 3b 0a 0a 09 72 65 74 75 72 6e  d_out);...return
7500: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 70  (0);.}../* Run p
7510: 72 6f 63 65 73 73 20 2a 2f 0a 69 6e 74 20 6d 61  rocess */.int ma
7520: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
7530: 72 20 2a 2a 61 72 67 76 29 20 7b 0a 09 73 74 72  r **argv) {..str
7540: 75 63 74 20 6f 70 74 69 6f 6e 20 6f 70 74 69 6f  uct option optio
7550: 6e 73 5b 31 31 5d 3b 0a 09 63 6f 6e 73 74 20 63  ns[11];..const c
7560: 68 61 72 20 2a 62 69 6e 64 5f 61 64 64 72 20 3d  har *bind_addr =
7570: 20 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e 65 77   BIND_ADDR, *new
7580: 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f  root = NULL, *lo
7590: 67 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46 49 4c  g_file = LOG_FIL
75a0: 45 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f 66 70  E;..FILE *log_fp
75b0: 3b 0a 09 75 69 64 5f 74 20 75 73 65 72 20 3d 20  ;..uid_t user = 
75c0: 30 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d 20 50  0;..int port = P
75d0: 4f 52 54 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e  ORT, thread_coun
75e0: 74 20 3d 20 54 48 52 45 41 44 5f 43 4f 55 4e 54  t = THREAD_COUNT
75f0: 3b 0a 09 69 6e 74 20 63 61 63 68 65 5f 73 69 7a  ;..int cache_siz
7600: 65 20 3d 20 43 41 43 48 45 5f 53 49 5a 45 3b 0a  e = CACHE_SIZE;.
7610: 09 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c 20 63  .int init_ret, c
7620: 68 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74 75 69  hroot_ret, setui
7630: 64 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f 72 65  d_ret, lookup_re
7640: 74 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a 09 69  t, chdir_ret;..i
7650: 6e 74 20 73 65 74 75 69 64 5f 65 6e 61 62 6c 65  nt setuid_enable
7660: 64 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f 65 6e  d = 0, daemon_en
7670: 61 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20  abled = 0;..int 
7680: 63 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 2f  ch;..int fd;.../
7690: 2a 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d 65  * Process argume
76a0: 6e 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67 65  nts */..filed_ge
76b0: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
76c0: 28 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22 70  (&options[0], "p
76d0: 6f 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61  ort", required_a
76e0: 72 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a 09  rgument, 'p');..
76f0: 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e  filed_getopt_lon
7700: 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e  g_setopt(&option
7710: 73 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22 2c  s[1], "threads",
7720: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
7730: 6e 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65 64  nt, 't');..filed
7740: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
7750: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d 2c  opt(&options[2],
7760: 20 22 63 61 63 68 65 22 2c 20 72 65 71 75 69 72   "cache", requir
7770: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63 27  ed_argument, 'c'
7780: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
7790: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
77a0: 74 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64 22  tions[3], "bind"
77b0: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
77c0: 65 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c 65  ent, 'b');..file
77d0: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
77e0: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34 5d  topt(&options[4]
77f0: 2c 20 22 75 73 65 72 22 2c 20 72 65 71 75 69 72  , "user", requir
7800: 65 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75 27  ed_argument, 'u'
7810: 29 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74  );..filed_getopt
7820: 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70  _long_setopt(&op
7830: 74 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74 22  tions[5], "root"
7840: 2c 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d  , required_argum
7850: 65 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c 65  ent, 'r');..file
7860: 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65  d_getopt_long_se
7870: 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36 5d  topt(&options[6]
7880: 2c 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72 67  , "help", no_arg
7890: 75 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66 69  ument, 'h');..fi
78a0: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
78b0: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
78c0: 37 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e 6f  7], "daemon", no
78d0: 5f 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29 3b  _argument, 'd');
78e0: 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c  ..filed_getopt_l
78f0: 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69  ong_setopt(&opti
7900: 6f 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20 72  ons[8], "log", r
7910: 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74  equired_argument
7920: 2c 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f 67  , 'l');..filed_g
7930: 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70  etopt_long_setop
7940: 74 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20 22  t(&options[9], "
7950: 76 65 72 73 69 6f 6e 22 2c 20 6e 6f 5f 61 72 67  version", no_arg
7960: 75 6d 65 6e 74 2c 20 27 76 27 29 3b 0a 09 66 69  ument, 'v');..fi
7970: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
7980: 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b  setopt(&options[
7990: 31 30 5d 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29  10], NULL, 0, 0)
79a0: 3b 0a 09 77 68 69 6c 65 20 28 28 63 68 20 3d 20  ;..while ((ch = 
79b0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 28 61 72 67 63  getopt_long(argc
79c0: 2c 20 61 72 67 76 2c 20 22 70 3a 74 3a 63 3a 62  , argv, "p:t:c:b
79d0: 3a 75 3a 72 3a 6c 3a 68 64 76 22 2c 20 6f 70 74  :u:r:l:hdv", opt
79e0: 69 6f 6e 73 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  ions, NULL)) != 
79f0: 2d 31 29 20 7b 0a 09 09 73 77 69 74 63 68 28 63  -1) {...switch(c
7a00: 68 29 20 7b 0a 09 09 09 63 61 73 65 20 27 70 27  h) {....case 'p'
7a10: 3a 0a 09 09 09 09 70 6f 72 74 20 3d 20 61 74 6f  :.....port = ato
7a20: 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  i(optarg);.....b
7a30: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 74  reak;....case 't
7a40: 27 3a 0a 09 09 09 09 74 68 72 65 61 64 5f 63 6f  ':.....thread_co
7a50: 75 6e 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72  unt = atoi(optar
7a60: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
7a70: 09 09 63 61 73 65 20 27 63 27 3a 0a 09 09 09 09  ..case 'c':.....
7a80: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 61 74 6f  cache_size = ato
7a90: 69 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62  i(optarg);.....b
7aa0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 62  reak;....case 'b
7ab0: 27 3a 0a 09 09 09 09 62 69 6e 64 5f 61 64 64 72  ':.....bind_addr
7ac0: 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72 67   = strdup(optarg
7ad0: 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
7ae0: 09 63 61 73 65 20 27 75 27 3a 0a 09 09 09 09 73  .case 'u':.....s
7af0: 65 74 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20  etuid_enabled = 
7b00: 31 3b 0a 09 09 09 09 6c 6f 6f 6b 75 70 5f 72 65  1;.....lookup_re
7b10: 74 20 3d 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c  t = filed_user_l
7b20: 6f 6f 6b 75 70 28 6f 70 74 61 72 67 2c 20 26 75  ookup(optarg, &u
7b30: 73 65 72 29 3b 0a 09 09 09 09 69 66 20 28 6c 6f  ser);.....if (lo
7b40: 6f 6b 75 70 5f 72 65 74 20 21 3d 20 30 29 20 7b  okup_ret != 0) {
7b50: 0a 09 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e  ......filed_prin
7b60: 74 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20 30  t_help(stderr, 0
7b70: 2c 20 22 49 6e 76 61 6c 69 64 20 75 73 65 72 6e  , "Invalid usern
7b80: 61 6d 65 20 73 70 65 63 69 66 69 65 64 22 29 3b  ame specified");
7b90: 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 31 29  .......return(1)
7ba0: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  ;.....}.....brea
7bb0: 6b 3b 0a 09 09 09 63 61 73 65 20 27 72 27 3a 0a  k;....case 'r':.
7bc0: 09 09 09 09 6e 65 77 72 6f 6f 74 20 3d 20 73 74  ....newroot = st
7bd0: 72 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09  rdup(optarg);...
7be0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
7bf0: 20 27 6c 27 3a 0a 09 09 09 09 6c 6f 67 5f 66 69   'l':.....log_fi
7c00: 6c 65 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61  le = strdup(opta
7c10: 72 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  rg);.....break;.
7c20: 09 09 09 63 61 73 65 20 27 64 27 3a 0a 09 09 09  ...case 'd':....
7c30: 09 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20  .daemon_enabled 
7c40: 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  = 1;.....break;.
7c50: 09 09 09 63 61 73 65 20 27 76 27 3a 0a 09 09 09  ...case 'v':....
7c60: 09 70 72 69 6e 74 66 28 22 66 69 6c 65 64 20 76  .printf("filed v
7c70: 65 72 73 69 6f 6e 20 25 73 5c 6e 22 2c 20 46 49  ersion %s\n", FI
7c80: 4c 45 44 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09  LED_VERSION);...
7c90: 09 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09  ...return(0);...
7ca0: 09 63 61 73 65 20 27 3f 27 3a 0a 09 09 09 63 61  .case '?':....ca
7cb0: 73 65 20 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65  se ':':.....file
7cc0: 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64  d_print_help(std
7cd0: 65 72 72 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  err, 0, NULL);..
7ce0: 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
7cf0: 09 09 63 61 73 65 20 27 68 27 3a 0a 09 09 09 09  ..case 'h':.....
7d00: 66 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70  filed_print_help
7d10: 28 73 74 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c  (stdout, 1, NULL
7d20: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 30  );......return(0
7d30: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f  );...}..}.../* O
7d40: 70 65 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  pen log file */.
7d50: 09 6c 6f 67 5f 66 70 20 3d 20 66 69 6c 65 64 5f  .log_fp = filed_
7d60: 6c 6f 67 5f 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c  log_open(log_fil
7d70: 65 29 3b 0a 09 69 66 20 28 6c 6f 67 5f 66 70 20  e);..if (log_fp 
7d80: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 65 72  == NULL) {...per
7d90: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f  ror("filed_log_o
7da0: 70 65 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  pen");....return
7db0: 28 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65  (4);..}.../* Cre
7dc0: 61 74 65 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f  ate listening so
7dd0: 63 6b 65 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69  cket */..fd = fi
7de0: 6c 65 64 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f  led_listen(bind_
7df0: 61 64 64 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66  addr, port);..if
7e00: 20 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 70 65   (fd < 0) {...pe
7e10: 72 72 6f 72 28 22 66 69 6c 65 64 5f 6c 69 73 74  rror("filed_list
7e20: 65 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  en");....return(
7e30: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 63 6f  1);..}.../* Beco
7e40: 6d 65 20 61 20 64 61 65 6d 6f 6e 20 2a 2f 0a 09  me a daemon */..
7e50: 69 66 20 28 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c  if (daemon_enabl
7e60: 65 64 29 20 7b 0a 09 09 69 6e 69 74 5f 72 65 74  ed) {...init_ret
7e70: 20 3d 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69   = filed_daemoni
7e80: 7a 65 28 29 3b 0a 09 09 69 66 20 28 69 6e 69 74  ze();...if (init
7e90: 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
7ea0: 70 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 64 61  perror("filed_da
7eb0: 65 6d 6f 6e 69 7a 65 22 29 3b 0a 0a 09 09 09 72  emonize");.....r
7ec0: 65 74 75 72 6e 28 36 29 3b 0a 09 09 7d 0a 09 7d  eturn(6);...}..}
7ed0: 0a 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66  .../* Chroot, if
7ee0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
7ef0: 09 69 66 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a  .if (newroot) {.
7f00: 09 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68  ..chdir_ret = ch
7f10: 64 69 72 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09  dir(newroot);...
7f20: 69 66 20 28 63 68 64 69 72 5f 72 65 74 20 21 3d  if (chdir_ret !=
7f30: 20 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28   0) {....perror(
7f40: 22 63 68 64 69 72 22 29 3b 0a 0a 09 09 09 72 65  "chdir");.....re
7f50: 74 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09  turn(1);...}....
7f60: 63 68 72 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72  chroot_ret = chr
7f70: 6f 6f 74 28 22 2e 22 29 3b 0a 09 09 69 66 20 28  oot(".");...if (
7f80: 63 68 72 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29  chroot_ret != 0)
7f90: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68   {....perror("ch
7fa0: 72 6f 6f 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  root");.....retu
7fb0: 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  rn(1);...}..}...
7fc0: 2f 2a 20 44 72 6f 70 20 70 72 69 76 69 6c 65 67  /* Drop privileg
7fd0: 65 73 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61  es, if appropria
7fe0: 74 65 20 2a 2f 0a 09 69 66 20 28 73 65 74 75 69  te */..if (setui
7ff0: 64 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73  d_enabled) {...s
8000: 65 74 75 69 64 5f 72 65 74 20 3d 20 73 65 74 75  etuid_ret = setu
8010: 69 64 28 75 73 65 72 29 3b 0a 09 09 69 66 20 28  id(user);...if (
8020: 73 65 74 75 69 64 5f 72 65 74 20 21 3d 20 30 29  setuid_ret != 0)
8030: 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 73 65   {....perror("se
8040: 74 75 69 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  tuid");.....retu
8050: 72 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  rn(1);...}..}...
8060: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 2a 2f  /* Initialize */
8070: 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c  ..init_ret = fil
8080: 65 64 5f 69 6e 69 74 28 63 61 63 68 65 5f 73 69  ed_init(cache_si
8090: 7a 65 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  ze);..if (init_r
80a0: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
80b0: 72 6f 72 28 22 66 69 6c 65 64 5f 69 6e 69 74 22  ror("filed_init"
80c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 33 29 3b  );....return(3);
80d0: 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20  ..}.../* Create 
80e0: 6c 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a  logging thread *
80f0: 2f 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69  /..init_ret = fi
8100: 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65  led_logging_thre
8110: 61 64 5f 69 6e 69 74 28 6c 6f 67 5f 66 70 29 3b  ad_init(log_fp);
8120: 0a 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21  ..if (init_ret !
8130: 3d 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28  = 0) {...perror(
8140: 22 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74  "filed_logging_t
8150: 68 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09  hread_init");...
8160: 09 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a  .return(4);..}..
8170: 09 2f 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65  ./* Create worke
8180: 72 20 74 68 72 65 61 64 73 20 2a 2f 0a 09 69 6e  r threads */..in
8190: 69 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 77  it_ret = filed_w
81a0: 6f 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e  orker_threads_in
81b0: 69 74 28 66 64 2c 20 74 68 72 65 61 64 5f 63 6f  it(fd, thread_co
81c0: 75 6e 74 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f  unt);..if (init_
81d0: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65  ret != 0) {...pe
81e0: 72 72 6f 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b  rror("filed_work
81f0: 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 22  er_threads_init"
8200: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 35 29 3b  );....return(5);
8210: 0a 09 7d 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f  ..}.../* Wait fo
8220: 72 20 74 68 72 65 61 64 73 20 74 6f 20 65 78 69  r threads to exi
8230: 74 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44  t */../* XXX:TOD
8240: 4f 3a 20 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61  O: Monitor threa
8250: 64 20 75 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c  d usage */..whil
8260: 65 20 28 31 29 20 7b 0a 09 09 73 6c 65 65 70 28  e (1) {...sleep(
8270: 36 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74  60);..}.../* Ret
8280: 75 72 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  urn in failure *
8290: 2f 0a 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a  /..return(2);.}.