Hex Artifact Content

Artifact 16407cc7239c9dc962e23f78f1739005509c4172:


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 37 22 0a 23 64 65 66 69 6e  ION "1.7".#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 2d 25 6c 6c 78  ngth, "%llx-%llx
2d10: 25 6c 6c 78 25 6c 6c 78 25 6c 6c 78 22 2c 0a 09  %llx%llx%llx",..
2d20: 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  .(unsigned long 
2d30: 6c 6f 6e 67 29 20 74 69 6d 65 28 4e 55 4c 4c 29  long) time(NULL)
2d40: 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ,...(unsigned lo
2d50: 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d 28  ng long) random(
2d60: 29 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ),...(unsigned l
2d70: 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f 6d  ong long) random
2d80: 28 29 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64 20  (),...(unsigned 
2d90: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64 6f  long long) rando
2da0: 6d 28 29 2c 0a 09 09 28 75 6e 73 69 67 6e 65 64  m(),...(unsigned
2db0: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 64   long long) rand
2dc0: 6f 6d 28 29 0a 09 29 3b 0a 7d 0a 0a 2f 2a 20 4f  om()..);.}../* O
2dd0: 70 65 6e 20 61 20 66 69 6c 65 20 61 6e 64 20 72  pen a file and r
2de0: 65 74 75 72 6e 20 66 69 6c 65 20 69 6e 66 6f 72  eturn file infor
2df0: 6d 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  mation */.static
2e00: 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f 66 69   struct filed_fi
2e10: 6c 65 69 6e 66 6f 20 2a 66 69 6c 65 64 5f 6f 70  leinfo *filed_op
2e20: 65 6e 5f 66 69 6c 65 28 63 6f 6e 73 74 20 63 68  en_file(const ch
2e30: 61 72 20 2a 70 61 74 68 2c 20 73 74 72 75 63 74  ar *path, struct
2e40: 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 20   filed_fileinfo 
2e50: 2a 62 75 66 66 65 72 29 20 7b 0a 09 73 74 72 75  *buffer) {..stru
2e60: 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66  ct filed_fileinf
2e70: 6f 20 2a 63 61 63 68 65 3b 0a 09 63 6f 6e 73 74  o *cache;..const
2e80: 20 63 68 61 72 20 2a 6f 70 65 6e 5f 70 61 74 68   char *open_path
2e90: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
2ea0: 63 61 63 68 65 5f 69 64 78 3b 0a 09 6f 66 66 5f  cache_idx;..off_
2eb0: 74 20 6c 65 6e 3b 0a 09 69 6e 74 20 66 64 3b 0a  t len;..int fd;.
2ec0: 0a 09 63 61 63 68 65 5f 69 64 78 20 3d 20 66 69  ..cache_idx = fi
2ed0: 6c 65 64 5f 68 61 73 68 28 28 63 6f 6e 73 74 20  led_hash((const 
2ee0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
2ef0: 20 70 61 74 68 2c 20 66 69 6c 65 64 5f 66 69 6c   path, filed_fil
2f00: 65 69 6e 66 6f 5f 66 64 63 61 63 68 65 5f 73 69  einfo_fdcache_si
2f10: 7a 65 29 3b 0a 0a 09 63 61 63 68 65 20 3d 20 26  ze);...cache = &
2f20: 66 69 6c 65 64 5f 66 69 6c 65 69 6e 66 6f 5f 66  filed_fileinfo_f
2f30: 64 63 61 63 68 65 5b 63 61 63 68 65 5f 69 64 78  dcache[cache_idx
2f40: 5d 3b 0a 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d  ];...filed_log_m
2f50: 73 67 5f 64 65 62 75 67 28 22 4c 6f 63 6b 69 6e  sg_debug("Lockin
2f60: 67 20 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a  g mutex for idx:
2f70: 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64   %lu", (unsigned
2f80: 20 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78   long) cache_idx
2f90: 29 3b 0a 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  );...pthread_mut
2fa0: 65 78 5f 6c 6f 63 6b 28 26 63 61 63 68 65 2d 3e  ex_lock(&cache->
2fb0: 6d 75 74 65 78 29 3b 0a 0a 09 66 69 6c 65 64 5f  mutex);...filed_
2fc0: 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22 43  log_msg_debug("C
2fd0: 6f 6d 70 6c 65 74 65 64 20 6c 6f 63 6b 69 6e 67  ompleted locking
2fe0: 20 6d 75 74 65 78 20 66 6f 72 20 69 64 78 3a 20   mutex for idx: 
2ff0: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
3000: 6c 6f 6e 67 29 20 63 61 63 68 65 5f 69 64 78 29  long) cache_idx)
3010: 3b 0a 0a 09 69 66 20 28 73 74 72 63 6d 70 28 70  ;...if (strcmp(p
3020: 61 74 68 2c 20 63 61 63 68 65 2d 3e 70 61 74 68  ath, cache->path
3030: 29 20 21 3d 20 30 29 20 7b 0a 09 09 66 69 6c 65  ) != 0) {...file
3040: 64 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28  d_log_msg_debug(
3050: 22 43 61 63 68 65 20 6d 69 73 73 20 66 6f 72 20  "Cache miss for 
3060: 69 64 78 3a 20 25 6c 75 3a 20 4f 4c 44 20 5c 22  idx: %lu: OLD \"
3070: 25 73 5c 22 2c 20 4e 45 57 20 5c 22 25 73 5c 22  %s\", NEW \"%s\"
3080: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
3090: 67 29 20 63 61 63 68 65 5f 69 64 78 2c 20 63 61  g) cache_idx, ca
30a0: 63 68 65 2d 3e 70 61 74 68 2c 20 70 61 74 68 29  che->path, path)
30b0: 3b 0a 0a 09 09 2f 2a 20 46 6f 72 20 72 65 71 75  ;..../* For requ
30c0: 65 73 74 73 20 66 6f 72 20 74 68 65 20 72 6f 6f  ests for the roo
30d0: 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 65 72  t directory, ser
30e0: 76 65 20 6f 75 74 20 69 6e 64 65 78 2e 68 74 6d  ve out index.htm
30f0: 6c 20 2a 2f 0a 09 09 69 66 20 28 70 61 74 68 5b  l */...if (path[
3100: 30 5d 20 3d 3d 20 27 5c 30 27 20 7c 7c 20 28 70  0] == '\0' || (p
3110: 61 74 68 5b 30 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[0] == '/' &&
3120: 20 70 61 74 68 5b 31 5d 20 3d 3d 20 27 5c 30 27   path[1] == '\0'
3130: 29 29 20 7b 0a 09 09 09 6f 70 65 6e 5f 70 61 74  )) {....open_pat
3140: 68 20 3d 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c  h = "/index.html
3150: 22 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ";...} else {...
3160: 09 6f 70 65 6e 5f 70 61 74 68 20 3d 20 70 61 74  .open_path = pat
3170: 68 3b 0a 09 09 7d 0a 0a 09 09 66 64 20 3d 20 6f  h;...}....fd = o
3180: 70 65 6e 28 6f 70 65 6e 5f 70 61 74 68 2c 20 4f  pen(open_path, O
3190: 5f 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4c 41 52 47  _RDONLY | O_LARG
31a0: 45 46 49 4c 45 29 3b 0a 09 09 69 66 20 28 66 64  EFILE);...if (fd
31b0: 20 3c 20 30 29 20 7b 0a 09 09 09 70 74 68 72 65   < 0) {....pthre
31c0: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
31d0: 26 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a  &cache->mutex);.
31e0: 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
31f0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
3200: 68 65 2d 3e 66 64 20 3e 3d 20 30 29 20 7b 0a 09  he->fd >= 0) {..
3210: 09 09 63 6c 6f 73 65 28 63 61 63 68 65 2d 3e 66  ..close(cache->f
3220: 64 29 3b 0a 09 09 7d 0a 0a 09 09 6c 65 6e 20 3d  d);...}....len =
3230: 20 6c 73 65 65 6b 28 66 64 2c 20 30 2c 20 53 45   lseek(fd, 0, SE
3240: 45 4b 5f 45 4e 44 29 3b 0a 09 09 6c 73 65 65 6b  EK_END);...lseek
3250: 28 66 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  (fd, 0, SEEK_SET
3260: 29 3b 0a 0a 09 09 63 61 63 68 65 2d 3e 66 64 20  );....cache->fd 
3270: 3d 20 66 64 3b 0a 09 09 63 61 63 68 65 2d 3e 6c  = fd;...cache->l
3280: 65 6e 20 3d 20 6c 65 6e 3b 0a 09 09 73 74 72 63  en = len;...strc
3290: 70 79 28 63 61 63 68 65 2d 3e 70 61 74 68 2c 20  py(cache->path, 
32a0: 70 61 74 68 29 3b 0a 09 09 63 61 63 68 65 2d 3e  path);...cache->
32b0: 74 79 70 65 20 3d 20 66 69 6c 65 64 5f 64 65 74  type = filed_det
32c0: 65 72 6d 69 6e 65 5f 6d 69 6d 65 74 79 70 65 28  ermine_mimetype(
32d0: 6f 70 65 6e 5f 70 61 74 68 29 3b 0a 09 09 66 69  open_path);...fi
32e0: 6c 65 64 5f 67 65 6e 65 72 61 74 65 5f 65 74 61  led_generate_eta
32f0: 67 28 63 61 63 68 65 2d 3e 65 74 61 67 2c 20 73  g(cache->etag, s
3300: 69 7a 65 6f 66 28 63 61 63 68 65 2d 3e 65 74 61  izeof(cache->eta
3310: 67 29 29 3b 0a 0a 09 09 2f 2a 20 58 58 58 3a 54  g));..../* XXX:T
3320: 4f 44 4f 3a 20 44 65 74 65 72 6d 69 6e 65 20 2a  ODO: Determine *
3330: 2f 0a 09 09 63 61 63 68 65 2d 3e 6c 61 73 74 6d  /...cache->lastm
3340: 6f 64 20 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61  od = filed_forma
3350: 74 5f 74 69 6d 65 28 63 61 63 68 65 2d 3e 6c 61  t_time(cache->la
3360: 73 74 6d 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28  stmod_b, sizeof(
3370: 63 61 63 68 65 2d 3e 6c 61 73 74 6d 6f 64 5f 62  cache->lastmod_b
3380: 29 2c 20 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20  ), time(NULL) - 
3390: 33 30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  30);..} else {..
33a0: 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 5f 64  .filed_log_msg_d
33b0: 65 62 75 67 28 22 43 61 63 68 65 20 68 69 74 20  ebug("Cache hit 
33c0: 66 6f 72 20 69 64 78 3a 20 25 6c 75 3a 20 50 41  for idx: %lu: PA
33d0: 54 48 20 5c 22 25 73 5c 22 22 2c 20 28 75 6e 73  TH \"%s\"", (uns
33e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 68  igned long) cach
33f0: 65 5f 69 64 78 2c 20 70 61 74 68 29 3b 0a 09 7d  e_idx, path);..}
3400: 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 68 61 76  .../*.. * We hav
3410: 65 20 74 6f 20 6d 61 6b 65 20 61 20 64 75 70 6c  e to make a dupl
3420: 69 63 61 74 65 20 46 44 2c 20 62 65 63 61 75 73  icate FD, becaus
3430: 65 20 6f 6e 63 65 20 77 65 20 72 65 6c 65 61 73  e once we releas
3440: 65 20 74 68 65 20 63 61 63 68 65 0a 09 20 2a 20  e the cache.. * 
3450: 6d 75 74 65 78 2c 20 74 68 65 20 66 69 6c 65 20  mutex, the file 
3460: 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 62  descriptor may b
3470: 65 20 63 6c 6f 73 65 64 0a 09 20 2a 2f 0a 09 66  e closed.. */..f
3480: 64 20 3d 20 64 75 70 28 63 61 63 68 65 2d 3e 66  d = dup(cache->f
3490: 64 29 3b 0a 09 69 66 20 28 66 64 20 3c 20 30 29  d);..if (fd < 0)
34a0: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
34b0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 63 61 63 68 65  ex_unlock(&cache
34c0: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 09 09 72 65 74  ->mutex);....ret
34d0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
34e0: 62 75 66 66 65 72 2d 3e 66 64 20 3d 20 66 64 3b  buffer->fd = fd;
34f0: 0a 09 62 75 66 66 65 72 2d 3e 6c 65 6e 20 3d 20  ..buffer->len = 
3500: 63 61 63 68 65 2d 3e 6c 65 6e 3b 0a 09 62 75 66  cache->len;..buf
3510: 66 65 72 2d 3e 74 79 70 65 20 3d 20 63 61 63 68  fer->type = cach
3520: 65 2d 3e 74 79 70 65 3b 0a 09 6d 65 6d 63 70 79  e->type;..memcpy
3530: 28 62 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64  (buffer->lastmod
3540: 5f 62 2c 20 63 61 63 68 65 2d 3e 6c 61 73 74 6d  _b, cache->lastm
3550: 6f 64 5f 62 2c 20 73 69 7a 65 6f 66 28 62 75 66  od_b, sizeof(buf
3560: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62 29 29  fer->lastmod_b))
3570: 3b 0a 09 6d 65 6d 63 70 79 28 62 75 66 66 65 72  ;..memcpy(buffer
3580: 2d 3e 65 74 61 67 2c 20 63 61 63 68 65 2d 3e 65  ->etag, cache->e
3590: 74 61 67 2c 20 73 69 7a 65 6f 66 28 62 75 66 66  tag, sizeof(buff
35a0: 65 72 2d 3e 65 74 61 67 29 29 3b 0a 09 62 75 66  er->etag));..buf
35b0: 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 20 3d 20 62  fer->lastmod = b
35c0: 75 66 66 65 72 2d 3e 6c 61 73 74 6d 6f 64 5f 62  uffer->lastmod_b
35d0: 20 2b 20 28 63 61 63 68 65 2d 3e 6c 61 73 74 6d   + (cache->lastm
35e0: 6f 64 20 2d 20 63 61 63 68 65 2d 3e 6c 61 73 74  od - cache->last
35f0: 6d 6f 64 5f 62 29 3b 0a 0a 09 70 74 68 72 65 61  mod_b);...pthrea
3600: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
3610: 63 61 63 68 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  cache->mutex);..
3620: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 29 3b  .return(buffer);
3630: 0a 7d 0a 0a 2f 2a 20 50 72 6f 63 65 73 73 20 61  .}../* Process a
3640: 6e 20 48 54 54 50 20 72 65 71 75 65 73 74 20 61  n HTTP request a
3650: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  nd return the pa
3660: 74 68 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  th requested */.
3670: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 66 69  static struct fi
3680: 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65 73 74  led_http_request
3690: 20 2a 66 69 6c 65 64 5f 67 65 74 5f 68 74 74 70   *filed_get_http
36a0: 5f 72 65 71 75 65 73 74 28 46 49 4c 45 20 2a 66  _request(FILE *f
36b0: 70 2c 20 73 74 72 75 63 74 20 66 69 6c 65 64 5f  p, struct filed_
36c0: 68 74 74 70 5f 72 65 71 75 65 73 74 20 2a 62 75  http_request *bu
36d0: 66 66 65 72 5f 73 74 29 20 7b 0a 09 63 68 61 72  ffer_st) {..char
36e0: 20 2a 6d 65 74 68 6f 64 2c 20 2a 70 61 74 68 3b   *method, *path;
36f0: 0a 09 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  ..char *buffer, 
3700: 2a 77 6f 72 6b 62 75 66 66 65 72 2c 20 2a 77 6f  *workbuffer, *wo
3710: 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 3b 0a 09  rkbuffer_next;..
3720: 63 68 61 72 20 2a 66 67 65 74 73 5f 72 65 74 3b  char *fgets_ret;
3730: 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  ..size_t buffer_
3740: 6c 65 6e 3b 0a 09 6f 66 66 5f 74 20 72 61 6e 67  len;..off_t rang
3750: 65 5f 73 74 61 72 74 2c 20 72 61 6e 67 65 5f 65  e_start, range_e
3760: 6e 64 2c 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68  nd, range_length
3770: 3b 0a 09 69 6e 74 20 72 61 6e 67 65 5f 72 65 71  ;..int range_req
3780: 75 65 73 74 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09  uest;..int i;...
3790: 72 61 6e 67 65 5f 73 74 61 72 74 20 3d 20 30 3b  range_start = 0;
37a0: 0a 09 72 61 6e 67 65 5f 65 6e 64 20 20 20 3d 20  ..range_end   = 
37b0: 30 3b 0a 09 72 61 6e 67 65 5f 72 65 71 75 65 73  0;..range_reques
37c0: 74 20 3d 20 30 3b 0a 09 72 61 6e 67 65 5f 6c 65  t = 0;..range_le
37d0: 6e 67 74 68 20 3d 20 2d 31 3b 0a 0a 09 62 75 66  ngth = -1;...buf
37e0: 66 65 72 20 3d 20 62 75 66 66 65 72 5f 73 74 2d  fer = buffer_st-
37f0: 3e 74 6d 70 62 75 66 3b 0a 09 62 75 66 66 65 72  >tmpbuf;..buffer
3800: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75  _len = sizeof(bu
3810: 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66 29  ffer_st->tmpbuf)
3820: 3b 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d 20  ;...fgets_ret = 
3830: 66 67 65 74 73 28 62 75 66 66 65 72 2c 20 62 75  fgets(buffer, bu
3840: 66 66 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09  ffer_len, fp);..
3850: 69 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d  if (fgets_ret ==
3860: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
3870: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 6d 65  n(NULL);..}...me
3880: 74 68 6f 64 20 3d 20 62 75 66 66 65 72 3b 0a 0a  thod = buffer;..
3890: 09 62 75 66 66 65 72 20 3d 20 73 74 72 63 68 72  .buffer = strchr
38a0: 28 62 75 66 66 65 72 2c 20 27 20 27 29 3b 0a 09  (buffer, ' ');..
38b0: 69 66 20 28 62 75 66 66 65 72 20 3d 3d 20 4e 55  if (buffer == NU
38c0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e  LL) {...return(N
38d0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 62 75 66 66  ULL);..}...*buff
38e0: 65 72 20 3d 20 27 5c 30 27 3b 0a 09 62 75 66 66  er = '\0';..buff
38f0: 65 72 2b 2b 3b 0a 0a 09 70 61 74 68 20 3d 20 62  er++;...path = b
3900: 75 66 66 65 72 3b 0a 0a 09 62 75 66 66 65 72 20  uffer;...buffer 
3910: 3d 20 73 74 72 63 68 72 28 62 75 66 66 65 72 2c  = strchr(buffer,
3920: 20 27 20 27 29 3b 0a 09 69 66 20 28 62 75 66 66   ' ');..if (buff
3930: 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  er != NULL) {...
3940: 2a 62 75 66 66 65 72 20 3d 20 27 5c 30 27 3b 0a  *buffer = '\0';.
3950: 09 09 62 75 66 66 65 72 2b 2b 3b 0a 09 7d 0a 0a  ..buffer++;..}..
3960: 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 68 61 6e 64  ./* We only hand
3970: 6c 65 20 74 68 65 20 22 47 45 54 22 20 61 6e 64  le the "GET" and
3980: 20 22 48 45 41 44 27 20 6d 65 74 68 6f 64 73 20   "HEAD' methods 
3990: 2a 2f 0a 09 69 66 20 28 73 74 72 63 61 73 65 63  */..if (strcasec
39a0: 6d 70 28 6d 65 74 68 6f 64 2c 20 22 68 65 61 64  mp(method, "head
39b0: 22 29 20 21 3d 20 30 29 20 7b 0a 09 09 69 66 20  ") != 0) {...if 
39c0: 28 73 74 72 63 61 73 65 63 6d 70 28 6d 65 74 68  (strcasecmp(meth
39d0: 6f 64 2c 20 22 67 65 74 22 29 20 21 3d 20 30 29  od, "get") != 0)
39e0: 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c   {....return(NUL
39f0: 4c 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 47 45  L);...}..../* GE
3a00: 54 20 72 65 71 75 65 73 74 20 2a 2f 0a 09 09 62  T request */...b
3a10: 75 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f 64  uffer_st->method
3a20: 20 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54   = FILED_REQUEST
3a30: 5f 4d 45 54 48 4f 44 5f 47 45 54 3b 0a 09 7d 20  _METHOD_GET;..} 
3a40: 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 48 45 41 44  else {.../* HEAD
3a50: 20 72 65 71 75 65 73 74 20 2a 2f 0a 09 09 62 75   request */...bu
3a60: 66 66 65 72 5f 73 74 2d 3e 6d 65 74 68 6f 64 20  ffer_st->method 
3a70: 3d 20 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f  = FILED_REQUEST_
3a80: 4d 45 54 48 4f 44 5f 48 45 41 44 3b 0a 09 7d 0a  METHOD_HEAD;..}.
3a90: 0a 09 2f 2a 20 4e 6f 74 65 20 70 61 74 68 20 2a  ../* Note path *
3aa0: 2f 0a 09 73 74 72 63 70 79 28 62 75 66 66 65 72  /..strcpy(buffer
3ab0: 5f 73 74 2d 3e 70 61 74 68 2c 20 70 61 74 68 29  _st->path, path)
3ac0: 3b 0a 0a 09 2f 2a 20 52 65 73 65 74 20 62 75 66  ;.../* Reset buf
3ad0: 66 65 72 20 66 6f 72 20 6c 61 74 65 72 20 75 73  fer for later us
3ae0: 65 20 2a 2f 0a 09 62 75 66 66 65 72 20 3d 20 62  e */..buffer = b
3af0: 75 66 66 65 72 5f 73 74 2d 3e 74 6d 70 62 75 66  uffer_st->tmpbuf
3b00: 3b 0a 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  ;...for (i = 0; 
3b10: 69 20 3c 20 31 30 30 3b 20 69 2b 2b 29 20 7b 0a  i < 100; i++) {.
3b20: 09 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67  ..fgets_ret = fg
3b30: 65 74 73 28 62 75 66 66 65 72 2c 20 62 75 66 66  ets(buffer, buff
3b40: 65 72 5f 6c 65 6e 2c 20 66 70 29 3b 0a 09 09 69  er_len, fp);...i
3b50: 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20  f (fgets_ret == 
3b60: 4e 55 4c 4c 29 20 7b 0a 09 09 09 62 72 65 61 6b  NULL) {....break
3b70: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 74 72  ;...}....if (str
3b80: 6e 63 61 73 65 63 6d 70 28 62 75 66 66 65 72 2c  ncasecmp(buffer,
3b90: 20 22 52 61 6e 67 65 3a 20 22 2c 20 37 29 20 3d   "Range: ", 7) =
3ba0: 3d 20 30 29 20 7b 0a 09 09 09 77 6f 72 6b 62 75  = 0) {....workbu
3bb0: 66 66 65 72 20 3d 20 62 75 66 66 65 72 20 2b 20  ffer = buffer + 
3bc0: 37 3b 0a 0a 09 09 09 69 66 20 28 73 74 72 6e 63  7;.....if (strnc
3bd0: 61 73 65 63 6d 70 28 77 6f 72 6b 62 75 66 66 65  asecmp(workbuffe
3be0: 72 2c 20 22 62 79 74 65 73 3d 22 2c 20 36 29 20  r, "bytes=", 6) 
3bf0: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 77 6f 72 6b  == 0) {.....work
3c00: 62 75 66 66 65 72 20 2b 3d 20 36 3b 0a 0a 09 09  buffer += 6;....
3c10: 09 09 72 61 6e 67 65 5f 72 65 71 75 65 73 74 20  ..range_request 
3c20: 3d 20 31 3b 0a 0a 09 09 09 09 72 61 6e 67 65 5f  = 1;......range_
3c30: 73 74 61 72 74 20 3d 20 73 74 72 74 6f 75 6c 6c  start = strtoull
3c40: 28 77 6f 72 6b 62 75 66 66 65 72 2c 20 26 77 6f  (workbuffer, &wo
3c50: 72 6b 62 75 66 66 65 72 5f 6e 65 78 74 2c 20 31  rkbuffer_next, 1
3c60: 30 29 3b 0a 0a 09 09 09 09 77 6f 72 6b 62 75 66  0);......workbuf
3c70: 66 65 72 20 3d 20 77 6f 72 6b 62 75 66 66 65 72  fer = workbuffer
3c80: 5f 6e 65 78 74 3b 0a 0a 09 09 09 09 69 66 20 28  _next;......if (
3c90: 2a 77 6f 72 6b 62 75 66 66 65 72 20 3d 3d 20 27  *workbuffer == '
3ca0: 2d 27 29 20 7b 0a 09 09 09 09 09 77 6f 72 6b 62  -') {......workb
3cb0: 75 66 66 65 72 2b 2b 3b 0a 0a 09 09 09 09 09 69  uffer++;.......i
3cc0: 66 20 28 2a 77 6f 72 6b 62 75 66 66 65 72 20 21  f (*workbuffer !
3cd0: 3d 20 27 5c 72 27 20 26 26 20 2a 77 6f 72 6b 62  = '\r' && *workb
3ce0: 75 66 66 65 72 20 21 3d 20 27 5c 6e 27 29 20 7b  uffer != '\n') {
3cf0: 0a 09 09 09 09 09 09 72 61 6e 67 65 5f 65 6e 64  .......range_end
3d00: 20 3d 20 73 74 72 74 6f 75 6c 6c 28 77 6f 72 6b   = strtoull(work
3d10: 62 75 66 66 65 72 2c 20 26 77 6f 72 6b 62 75 66  buffer, &workbuf
3d20: 66 65 72 5f 6e 65 78 74 2c 20 31 30 29 3b 0a 09  fer_next, 10);..
3d30: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
3d40: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 65 6d 63  ...}....if (memc
3d50: 6d 70 28 62 75 66 66 65 72 2c 20 22 5c 72 5c 6e  mp(buffer, "\r\n
3d60: 22 2c 20 32 29 20 3d 3d 20 30 29 20 7b 0a 09 09  ", 2) == 0) {...
3d70: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
3d80: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 61  ./* Determine ra
3d90: 6e 67 65 20 2a 2f 0a 09 69 66 20 28 72 61 6e 67  nge */..if (rang
3da0: 65 5f 65 6e 64 20 21 3d 20 30 29 20 7b 0a 09 09  e_end != 0) {...
3db0: 69 66 20 28 72 61 6e 67 65 5f 65 6e 64 20 3c 3d  if (range_end <=
3dc0: 20 72 61 6e 67 65 5f 73 74 61 72 74 29 20 7b 0a   range_start) {.
3dd0: 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
3de0: 0a 09 09 7d 0a 0a 09 09 72 61 6e 67 65 5f 6c 65  ...}....range_le
3df0: 6e 67 74 68 20 3d 20 72 61 6e 67 65 5f 65 6e 64  ngth = range_end
3e00: 20 2d 20 72 61 6e 67 65 5f 73 74 61 72 74 3b 0a   - range_start;.
3e10: 0a 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67  ...filed_log_msg
3e20: 5f 64 65 62 75 67 28 22 43 6f 6d 70 75 74 69 6e  _debug("Computin
3e30: 67 20 6c 65 6e 67 74 68 20 70 61 72 61 6d 65 74  g length paramet
3e40: 65 72 3a 20 25 6c 6c 75 20 3d 20 25 6c 6c 75 20  er: %llu = %llu 
3e50: 2d 20 25 6c 6c 75 22 2c 0a 09 09 09 28 75 6e 73  - %llu",....(uns
3e60: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
3e70: 20 72 61 6e 67 65 5f 6c 65 6e 67 74 68 2c 0a 09   range_length,..
3e80: 09 09 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ..(unsigned long
3e90: 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f 65 6e 64   long) range_end
3ea0: 2c 0a 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  ,....(unsigned l
3eb0: 6f 6e 67 20 6c 6f 6e 67 29 20 72 61 6e 67 65 5f  ong long) range_
3ec0: 73 74 61 72 74 0a 09 09 29 3b 0a 09 7d 0a 0a 09  start...);..}...
3ed0: 2f 2a 20 46 69 6c 6c 20 75 70 20 73 74 72 75 63  /* Fill up struc
3ee0: 74 75 72 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ture to return *
3ef0: 2f 0a 09 62 75 66 66 65 72 5f 73 74 2d 3e 68 65  /..buffer_st->he
3f00: 61 64 65 72 73 2e 72 61 6e 67 65 2e 70 72 65 73  aders.range.pres
3f10: 65 6e 74 20 3d 20 72 61 6e 67 65 5f 72 65 71 75  ent = range_requ
3f20: 65 73 74 3b 0a 09 62 75 66 66 65 72 5f 73 74 2d  est;..buffer_st-
3f30: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
3f40: 66 66 73 65 74 20 20 3d 20 72 61 6e 67 65 5f 73  ffset  = range_s
3f50: 74 61 72 74 3b 0a 09 62 75 66 66 65 72 5f 73 74  tart;..buffer_st
3f60: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
3f70: 6c 65 6e 67 74 68 20 20 3d 20 72 61 6e 67 65 5f  length  = range_
3f80: 6c 65 6e 67 74 68 3b 0a 0a 09 72 65 74 75 72 6e  length;...return
3f90: 28 62 75 66 66 65 72 5f 73 74 29 3b 0a 7d 0a 0a  (buffer_st);.}..
3fa0: 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  /* Return an err
3fb0: 6f 72 20 70 61 67 65 20 2a 2f 0a 73 74 61 74 69  or page */.stati
3fc0: 63 20 76 6f 69 64 20 66 69 6c 65 64 5f 65 72 72  c void filed_err
3fd0: 6f 72 5f 70 61 67 65 28 46 49 4c 45 20 2a 66 70  or_page(FILE *fp
3fe0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61  , const char *da
3ff0: 74 65 5f 63 75 72 72 65 6e 74 2c 20 69 6e 74 20  te_current, int 
4000: 65 72 72 6f 72 5f 6e 75 6d 62 65 72 2c 20 69 6e  error_number, in
4010: 74 20 6d 65 74 68 6f 64 29 20 7b 0a 09 63 68 61  t method) {..cha
4020: 72 20 2a 65 72 72 6f 72 5f 73 74 72 69 6e 67 20  r *error_string 
4030: 3d 20 22 3c 68 74 6d 6c 3e 3c 68 65 61 64 3e 3c  = "<html><head><
4040: 74 69 74 6c 65 3e 45 52 52 4f 52 3c 2f 74 69 74  title>ERROR</tit
4050: 6c 65 3e 3c 2f 68 65 61 64 3e 3c 62 6f 64 79 3e  le></head><body>
4060: 55 6e 61 62 6c 65 20 74 6f 20 70 72 6f 63 65 73  Unable to proces
4070: 73 20 72 65 71 75 65 73 74 3c 2f 62 6f 64 79 3e  s request</body>
4080: 3c 2f 68 74 6d 6c 3e 22 3b 0a 0a 09 66 70 72 69  </html>";...fpri
4090: 6e 74 66 28 66 70 2c 20 22 48 54 54 50 2f 31 2e  ntf(fp, "HTTP/1.
40a0: 31 20 25 69 20 4e 6f 74 20 4f 4b 5c 72 5c 6e 44  1 %i Not OK\r\nD
40b0: 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65  ate: %s\r\nServe
40c0: 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74  r: filed\r\nLast
40d0: 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c  -Modified: %s\r\
40e0: 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a  nContent-Length:
40f0: 20 25 6c 6c 75 5c 72 5c 6e 43 6f 6e 74 65 6e 74   %llu\r\nContent
4100: 2d 54 79 70 65 3a 20 25 73 5c 72 5c 6e 43 6f 6e  -Type: %s\r\nCon
4110: 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72  nection: close\r
4120: 5c 6e 5c 72 5c 6e 22 2c 0a 09 09 65 72 72 6f 72  \n\r\n",...error
4130: 5f 6e 75 6d 62 65 72 2c 0a 09 09 64 61 74 65 5f  _number,...date_
4140: 63 75 72 72 65 6e 74 2c 0a 09 09 64 61 74 65 5f  current,...date_
4150: 63 75 72 72 65 6e 74 2c 0a 09 09 28 75 6e 73 69  current,...(unsi
4160: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
4170: 73 74 72 6c 65 6e 28 65 72 72 6f 72 5f 73 74 72  strlen(error_str
4180: 69 6e 67 29 2c 0a 09 09 22 74 65 78 74 2f 68 74  ing),..."text/ht
4190: 6d 6c 22 0a 09 29 3b 0a 0a 09 2f 2a 20 73 69 6c  ml"..);.../* sil
41a0: 65 6e 63 65 20 65 72 72 6f 72 20 73 74 72 69 6e  ence error strin
41b0: 67 20 66 6f 72 20 48 45 41 44 20 72 65 71 75 65  g for HEAD reque
41c0: 73 74 73 20 2a 2f 0a 09 69 66 20 28 6d 65 74 68  sts */..if (meth
41d0: 6f 64 20 21 3d 20 46 49 4c 45 44 5f 52 45 51 55  od != FILED_REQU
41e0: 45 53 54 5f 4d 45 54 48 4f 44 5f 48 45 41 44 29  EST_METHOD_HEAD)
41f0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 66 70 2c   {...fprintf(fp,
4200: 20 22 25 73 22 2c 20 65 72 72 6f 72 5f 73 74 72   "%s", error_str
4210: 69 6e 67 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ing);..}...retur
4220: 6e 3b 0a 7d 0a 0a 2f 2a 20 48 61 6e 64 6c 65 20  n;.}../* Handle 
4230: 61 20 73 69 6e 67 6c 65 20 72 65 71 75 65 73 74  a single request
4240: 20 66 72 6f 6d 20 61 20 63 6c 69 65 6e 74 20 2a   from a client *
4250: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
4260: 6c 65 64 5f 68 61 6e 64 6c 65 5f 63 6c 69 65 6e  led_handle_clien
4270: 74 28 69 6e 74 20 66 64 2c 20 73 74 72 75 63 74  t(int fd, struct
4280: 20 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75   filed_http_requ
4290: 65 73 74 20 2a 72 65 71 75 65 73 74 2c 20 73 74  est *request, st
42a0: 72 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65  ruct filed_log_e
42b0: 6e 74 72 79 20 2a 6c 6f 67 29 20 7b 0a 09 73 74  ntry *log) {..st
42c0: 72 75 63 74 20 66 69 6c 65 64 5f 66 69 6c 65 69  ruct filed_filei
42d0: 6e 66 6f 20 2a 66 69 6c 65 69 6e 66 6f 3b 0a 09  nfo *fileinfo;..
42e0: 73 73 69 7a 65 5f 74 20 73 65 6e 64 66 69 6c 65  ssize_t sendfile
42f0: 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 73 65  _ret;..size_t se
4300: 6e 64 66 69 6c 65 5f 73 69 7a 65 3b 0a 09 6f 66  ndfile_size;..of
4310: 66 5f 74 20 73 65 6e 64 66 69 6c 65 5f 6f 66 66  f_t sendfile_off
4320: 73 65 74 2c 20 73 65 6e 64 66 69 6c 65 5f 73 65  set, sendfile_se
4330: 6e 74 2c 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  nt, sendfile_len
4340: 3b 0a 09 63 68 61 72 20 2a 70 61 74 68 3b 0a 09  ;..char *path;..
4350: 63 68 61 72 20 2a 64 61 74 65 5f 63 75 72 72 65  char *date_curre
4360: 6e 74 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74  nt, date_current
4370: 5f 62 5b 36 34 5d 3b 0a 09 69 6e 74 20 68 74 74  _b[64];..int htt
4380: 70 5f 63 6f 64 65 3b 0a 09 46 49 4c 45 20 2a 66  p_code;..FILE *f
4390: 70 3b 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  p;.../* Determin
43a0: 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 2a  e current time *
43b0: 2f 0a 09 64 61 74 65 5f 63 75 72 72 65 6e 74 20  /..date_current 
43c0: 3d 20 66 69 6c 65 64 5f 66 6f 72 6d 61 74 5f 74  = filed_format_t
43d0: 69 6d 65 28 64 61 74 65 5f 63 75 72 72 65 6e 74  ime(date_current
43e0: 5f 62 2c 20 73 69 7a 65 6f 66 28 64 61 74 65 5f  _b, sizeof(date_
43f0: 63 75 72 72 65 6e 74 5f 62 29 2c 20 74 69 6d 65  current_b), time
4400: 28 4e 55 4c 4c 29 29 3b 0a 0a 09 2f 2a 20 4f 70  (NULL));.../* Op
4410: 65 6e 20 73 6f 63 6b 65 74 20 61 73 20 41 4e 53  en socket as ANS
4420: 49 20 49 2f 4f 20 66 6f 72 20 65 61 73 65 20 6f  I I/O for ease o
4430: 66 20 75 73 65 20 2a 2f 0a 09 66 70 20 3d 20 66  f use */..fp = f
4440: 64 6f 70 65 6e 28 66 64 2c 20 22 77 2b 62 22 29  dopen(fd, "w+b")
4450: 3b 0a 09 69 66 20 28 66 70 20 3d 3d 20 4e 55 4c  ;..if (fp == NUL
4460: 4c 29 20 7b 0a 09 09 63 6c 6f 73 65 28 66 64 29  L) {...close(fd)
4470: 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a  ;....return;..}.
4480: 0a 09 72 65 71 75 65 73 74 20 3d 20 66 69 6c 65  ..request = file
4490: 64 5f 67 65 74 5f 68 74 74 70 5f 72 65 71 75 65  d_get_http_reque
44a0: 73 74 28 66 70 2c 20 72 65 71 75 65 73 74 29 3b  st(fp, request);
44b0: 0a 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 3d  ...if (request =
44c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65  = NULL) {...file
44d0: 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c  d_error_page(fp,
44e0: 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 35   date_current, 5
44f0: 30 30 2c 20 46 49 4c 45 44 5f 52 45 51 55 45 53  00, FILED_REQUES
4500: 54 5f 4d 45 54 48 4f 44 5f 47 45 54 29 3b 0a 0a  T_METHOD_GET);..
4510: 09 09 6c 6f 67 2d 3e 62 75 66 66 65 72 5b 30 5d  ..log->buffer[0]
4520: 20 3d 20 27 5c 30 27 3b 0a 09 09 6c 6f 67 2d 3e   = '\0';...log->
4530: 68 74 74 70 5f 63 6f 64 65 20 3d 20 35 30 30 3b  http_code = 500;
4540: 0a 09 09 6c 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d  ...log->reason =
4550: 20 22 66 6f 72 6d 61 74 22 3b 0a 0a 09 09 66 69   "format";....fi
4560: 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f  led_log_entry(lo
4570: 67 29 3b 0a 0a 09 09 66 63 6c 6f 73 65 28 66 70  g);....fclose(fp
4580: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  );....return;..}
4590: 0a 0a 09 70 61 74 68 20 3d 20 72 65 71 75 65 73  ...path = reques
45a0: 74 2d 3e 70 61 74 68 3b 0a 09 73 74 72 63 70 79  t->path;..strcpy
45b0: 28 6c 6f 67 2d 3e 62 75 66 66 65 72 2c 20 70 61  (log->buffer, pa
45c0: 74 68 29 3b 0a 09 6c 6f 67 2d 3e 6d 65 74 68 6f  th);..log->metho
45d0: 64 20 3d 20 72 65 71 75 65 73 74 2d 3e 6d 65 74  d = request->met
45e0: 68 6f 64 3b 0a 0a 09 68 74 74 70 5f 63 6f 64 65  hod;...http_code
45f0: 20 3d 20 2d 31 3b 0a 0a 09 66 69 6c 65 69 6e 66   = -1;...fileinf
4600: 6f 20 3d 20 66 69 6c 65 64 5f 6f 70 65 6e 5f 66  o = filed_open_f
4610: 69 6c 65 28 70 61 74 68 2c 20 26 72 65 71 75 65  ile(path, &reque
4620: 73 74 2d 3e 66 69 6c 65 69 6e 66 6f 29 3b 0a 09  st->fileinfo);..
4630: 69 66 20 28 66 69 6c 65 69 6e 66 6f 20 3d 3d 20  if (fileinfo == 
4640: 4e 55 4c 4c 29 20 7b 0a 09 09 66 69 6c 65 64 5f  NULL) {...filed_
4650: 65 72 72 6f 72 5f 70 61 67 65 28 66 70 2c 20 64  error_page(fp, d
4660: 61 74 65 5f 63 75 72 72 65 6e 74 2c 20 34 30 34  ate_current, 404
4670: 2c 20 72 65 71 75 65 73 74 2d 3e 6d 65 74 68 6f  , request->metho
4680: 64 29 3b 0a 0a 09 09 6c 6f 67 2d 3e 68 74 74 70  d);....log->http
4690: 5f 63 6f 64 65 20 3d 20 34 30 34 3b 0a 09 09 6c  _code = 404;...l
46a0: 6f 67 2d 3e 72 65 61 73 6f 6e 20 3d 20 22 6f 70  og->reason = "op
46b0: 65 6e 5f 66 61 69 6c 65 64 22 3b 0a 0a 09 09 66  en_failed";....f
46c0: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c  iled_log_entry(l
46d0: 6f 67 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  og);..} else {..
46e0: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
46f0: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
4700: 65 74 20 21 3d 20 30 20 7c 7c 20 72 65 71 75 65  et != 0 || reque
4710: 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67  st->headers.rang
4720: 65 2e 6c 65 6e 67 74 68 20 3e 3d 20 30 29 20 7b  e.length >= 0) {
4730: 0a 09 09 09 69 66 20 28 72 65 71 75 65 73 74 2d  ....if (request-
4740: 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f  >headers.range.o
4750: 66 66 73 65 74 20 3e 3d 20 66 69 6c 65 69 6e 66  ffset >= fileinf
4760: 6f 2d 3e 6c 65 6e 29 20 7b 0a 09 09 09 09 66 69  o->len) {.....fi
4770: 6c 65 64 5f 65 72 72 6f 72 5f 70 61 67 65 28 66  led_error_page(f
4780: 70 2c 20 64 61 74 65 5f 63 75 72 72 65 6e 74 2c  p, date_current,
4790: 20 34 31 36 2c 20 72 65 71 75 65 73 74 2d 3e 6d   416, request->m
47a0: 65 74 68 6f 64 29 3b 0a 0a 09 09 09 09 6c 6f 67  ethod);......log
47b0: 2d 3e 68 74 74 70 5f 63 6f 64 65 20 3d 20 34 31  ->http_code = 41
47c0: 36 3b 0a 09 09 09 09 6c 6f 67 2d 3e 72 65 61 73  6;.....log->reas
47d0: 6f 6e 20 3d 20 22 72 61 6e 67 65 5f 69 6e 76 61  on = "range_inva
47e0: 6c 69 64 22 3b 0a 0a 09 09 09 09 66 69 6c 65 64  lid";......filed
47f0: 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c 6f 67 29 3b  _log_entry(log);
4800: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
4810: 09 69 66 20 28 72 65 71 75 65 73 74 2d 3e 68 65  .if (request->he
4820: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67  aders.range.leng
4830: 74 68 20 3d 3d 20 28 28 6f 66 66 5f 74 29 20 2d  th == ((off_t) -
4840: 31 29 29 20 7b 0a 09 09 09 09 09 66 69 6c 65 64  1)) {......filed
4850: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
4860: 43 6f 6d 70 75 74 69 6e 67 20 6c 65 6e 67 74 68  Computing length
4870: 20 74 6f 20 66 69 74 20 69 6e 20 62 6f 75 6e 64   to fit in bound
4880: 73 3a 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e  s: fileinfo->len
4890: 20 3d 20 25 6c 6c 75 2c 20 72 65 71 75 65 73 74   = %llu, request
48a0: 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65 2e  ->headers.range.
48b0: 6f 66 66 73 65 74 20 3d 20 25 6c 6c 75 22 2c 0a  offset = %llu",.
48c0: 09 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20  ......(unsigned 
48d0: 6c 6f 6e 67 20 6c 6f 6e 67 29 20 66 69 6c 65 69  long long) filei
48e0: 6e 66 6f 2d 3e 6c 65 6e 2c 0a 09 09 09 09 09 09  nfo->len,.......
48f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c  (unsigned long l
4900: 6f 6e 67 29 20 72 65 71 75 65 73 74 2d 3e 68 65  ong) request->he
4910: 61 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73  aders.range.offs
4920: 65 74 0a 09 09 09 09 09 29 3b 0a 0a 09 09 09 09  et......);......
4930: 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72  .request->header
4940: 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20 3d  s.range.length =
4950: 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 20 2d   fileinfo->len -
4960: 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72   request->header
4970: 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a  s.range.offset;.
4980: 09 09 09 09 7d 0a 0a 09 09 09 09 66 69 6c 65 64  ....}......filed
4990: 5f 6c 6f 67 5f 6d 73 67 5f 64 65 62 75 67 28 22  _log_msg_debug("
49a0: 50 61 72 74 69 61 6c 20 72 65 71 75 65 73 74 2c  Partial request,
49b0: 20 73 74 61 72 74 69 6e 67 20 61 74 3a 20 25 6c   starting at: %l
49c0: 6c 75 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20 66  lu and running f
49d0: 6f 72 20 25 6c 6c 69 20 62 79 74 65 73 22 2c 0a  or %lli bytes",.
49e0: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
49f0: 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73  ong long) reques
4a00: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
4a10: 2e 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 28 6c  .offset,......(l
4a20: 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73  ong long) reques
4a30: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
4a40: 2e 6c 65 6e 67 74 68 0a 09 09 09 09 29 3b 0a 0a  .length.....);..
4a50: 09 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d 20  ....http_code = 
4a60: 32 30 36 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  206;....}...} el
4a70: 73 65 20 7b 0a 09 09 09 69 66 20 28 72 65 71 75  se {....if (requ
4a80: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
4a90: 67 65 2e 70 72 65 73 65 6e 74 29 20 7b 0a 09 09  ge.present) {...
4aa0: 09 09 68 74 74 70 5f 63 6f 64 65 20 3d 20 32 30  ..http_code = 20
4ab0: 36 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  6;....} else {..
4ac0: 09 09 09 68 74 74 70 5f 63 6f 64 65 20 3d 20 32  ...http_code = 2
4ad0: 30 30 3b 0a 09 09 09 7d 0a 09 09 09 72 65 71 75  00;....}....requ
4ae0: 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e  est->headers.ran
4af0: 67 65 2e 6f 66 66 73 65 74 20 3d 20 30 3b 0a 09  ge.offset = 0;..
4b00: 09 09 72 65 71 75 65 73 74 2d 3e 68 65 61 64 65  ..request->heade
4b10: 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68 20  rs.range.length 
4b20: 3d 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 3b  = fileinfo->len;
4b30: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 68 74 74 70  ...}....if (http
4b40: 5f 63 6f 64 65 20 3e 20 30 29 20 7b 0a 09 09 09  _code > 0) {....
4b50: 66 70 72 69 6e 74 66 28 66 70 2c 20 22 48 54 54  fprintf(fp, "HTT
4b60: 50 2f 31 2e 31 20 25 69 20 4f 4b 5c 72 5c 6e 44  P/1.1 %i OK\r\nD
4b70: 61 74 65 3a 20 25 73 5c 72 5c 6e 53 65 72 76 65  ate: %s\r\nServe
4b80: 72 3a 20 66 69 6c 65 64 5c 72 5c 6e 4c 61 73 74  r: filed\r\nLast
4b90: 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 5c  -Modified: %s\r\
4ba0: 6e 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a  nContent-Length:
4bb0: 20 25 6c 6c 75 5c 72 5c 6e 41 63 63 65 70 74 2d   %llu\r\nAccept-
4bc0: 52 61 6e 67 65 73 3a 20 62 79 74 65 73 5c 72 5c  Ranges: bytes\r\
4bd0: 6e 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25  nContent-Type: %
4be0: 73 5c 72 5c 6e 43 6f 6e 6e 65 63 74 69 6f 6e 3a  s\r\nConnection:
4bf0: 20 63 6c 6f 73 65 5c 72 5c 6e 45 54 61 67 3a 20   close\r\nETag: 
4c00: 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 0a 09 09 09  \"%s\"\r\n",....
4c10: 09 68 74 74 70 5f 63 6f 64 65 2c 0a 09 09 09 09  .http_code,.....
4c20: 64 61 74 65 5f 63 75 72 72 65 6e 74 2c 0a 09 09  date_current,...
4c30: 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 6c 61 73 74  ..fileinfo->last
4c40: 6d 6f 64 2c 0a 09 09 09 09 28 75 6e 73 69 67 6e  mod,.....(unsign
4c50: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 72 65  ed long long) re
4c60: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
4c70: 61 6e 67 65 2e 6c 65 6e 67 74 68 2c 0a 09 09 09  ange.length,....
4c80: 09 66 69 6c 65 69 6e 66 6f 2d 3e 74 79 70 65 2c  .fileinfo->type,
4c90: 0a 09 09 09 09 66 69 6c 65 69 6e 66 6f 2d 3e 65  .....fileinfo->e
4ca0: 74 61 67 0a 09 09 09 29 3b 0a 09 09 09 69 66 20  tag....);....if 
4cb0: 28 68 74 74 70 5f 63 6f 64 65 20 3d 3d 20 32 30  (http_code == 20
4cc0: 36 29 20 7b 0a 09 09 09 09 66 70 72 69 6e 74 66  6) {.....fprintf
4cd0: 28 66 70 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 61  (fp, "Content-Ra
4ce0: 6e 67 65 3a 20 62 79 74 65 73 20 25 6c 6c 75 2d  nge: bytes %llu-
4cf0: 25 6c 6c 75 2f 25 6c 6c 75 5c 72 5c 6e 22 2c 0a  %llu/%llu\r\n",.
4d00: 09 09 09 09 09 28 75 6e 73 69 67 6e 65 64 20 6c  .....(unsigned l
4d10: 6f 6e 67 20 6c 6f 6e 67 29 20 72 65 71 75 65 73  ong long) reques
4d20: 74 2d 3e 68 65 61 64 65 72 73 2e 72 61 6e 67 65  t->headers.range
4d30: 2e 6f 66 66 73 65 74 2c 0a 09 09 09 09 09 28 75  .offset,......(u
4d40: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
4d50: 67 29 20 28 72 65 71 75 65 73 74 2d 3e 68 65 61  g) (request->hea
4d60: 64 65 72 73 2e 72 61 6e 67 65 2e 6f 66 66 73 65  ders.range.offse
4d70: 74 20 2b 20 72 65 71 75 65 73 74 2d 3e 68 65 61  t + request->hea
4d80: 64 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74  ders.range.lengt
4d90: 68 20 2d 20 31 29 2c 0a 09 09 09 09 09 28 75 6e  h - 1),......(un
4da0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
4db0: 29 20 66 69 6c 65 69 6e 66 6f 2d 3e 6c 65 6e 0a  ) fileinfo->len.
4dc0: 09 09 09 09 29 3b 0a 09 09 09 7d 0a 09 09 09 66  ....);....}....f
4dd0: 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 72 5c 6e  printf(fp, "\r\n
4de0: 22 29 3b 0a 09 09 09 66 66 6c 75 73 68 28 66 70  ");....fflush(fp
4df0: 29 3b 0a 0a 09 09 09 6c 6f 67 2d 3e 68 74 74 70  );.....log->http
4e00: 5f 63 6f 64 65 20 3d 20 68 74 74 70 5f 63 6f 64  _code = http_cod
4e10: 65 3b 0a 09 09 09 6c 6f 67 2d 3e 72 65 61 73 6f  e;....log->reaso
4e20: 6e 20 3d 20 22 4f 4b 22 3b 0a 09 09 09 6c 6f 67  n = "OK";....log
4e30: 2d 3e 73 74 61 72 74 74 69 6d 65 20 3d 20 74 69  ->starttime = ti
4e40: 6d 65 28 4e 55 4c 4c 29 3b 0a 09 09 09 6c 6f 67  me(NULL);....log
4e50: 2d 3e 72 65 71 5f 6f 66 66 73 65 74 20 3d 20 72  ->req_offset = r
4e60: 65 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e  equest->headers.
4e70: 72 61 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09  range.offset;...
4e80: 09 6c 6f 67 2d 3e 72 65 71 5f 6c 65 6e 67 74 68  .log->req_length
4e90: 20 3d 20 72 65 71 75 65 73 74 2d 3e 68 65 61 64   = request->head
4ea0: 65 72 73 2e 72 61 6e 67 65 2e 6c 65 6e 67 74 68  ers.range.length
4eb0: 3b 0a 09 09 09 6c 6f 67 2d 3e 66 69 6c 65 5f 6c  ;....log->file_l
4ec0: 65 6e 67 74 68 20 3d 20 66 69 6c 65 69 6e 66 6f  ength = fileinfo
4ed0: 2d 3e 6c 65 6e 3b 0a 0a 23 69 66 64 65 66 20 46  ->len;..#ifdef F
4ee0: 49 4c 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48 54  ILED_NONBLOCK_HT
4ef0: 54 50 0a 09 09 09 69 6e 74 20 73 6f 63 6b 65 74  TP....int socket
4f00: 5f 66 6c 61 67 73 3b 0a 09 09 09 66 64 5f 73 65  _flags;....fd_se
4f10: 74 20 72 66 64 2c 20 77 66 64 3b 0a 09 09 09 63  t rfd, wfd;....c
4f20: 68 61 72 20 73 69 6e 6b 62 75 66 5b 38 31 39 32  har sinkbuf[8192
4f30: 5d 3b 0a 09 09 09 73 73 69 7a 65 5f 74 20 72 65  ];....ssize_t re
4f40: 61 64 5f 72 65 74 3b 0a 0a 09 09 09 46 44 5f 5a  ad_ret;.....FD_Z
4f50: 45 52 4f 28 26 72 66 64 29 3b 0a 09 09 09 46 44  ERO(&rfd);....FD
4f60: 5f 5a 45 52 4f 28 26 77 66 64 29 3b 0a 09 09 09  _ZERO(&wfd);....
4f70: 46 44 5f 53 45 54 28 66 64 2c 20 26 72 66 64 29  FD_SET(fd, &rfd)
4f80: 3b 0a 09 09 09 46 44 5f 53 45 54 28 66 64 2c 20  ;....FD_SET(fd, 
4f90: 26 77 66 64 29 3b 0a 0a 09 09 09 73 6f 63 6b 65  &wfd);.....socke
4fa0: 74 5f 66 6c 61 67 73 20 3d 20 66 63 6e 74 6c 28  t_flags = fcntl(
4fb0: 66 64 2c 20 46 5f 47 45 54 46 4c 29 3b 0a 09 09  fd, F_GETFL);...
4fc0: 09 66 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54  .fcntl(fd, F_SET
4fd0: 46 4c 2c 20 73 6f 63 6b 65 74 5f 66 6c 61 67 73  FL, socket_flags
4fe0: 20 7c 20 4f 5f 4e 4f 4e 42 4c 4f 43 4b 29 3b 0a   | O_NONBLOCK);.
4ff0: 23 65 6e 64 69 66 0a 0a 09 09 09 73 65 6e 64 66  #endif.....sendf
5000: 69 6c 65 5f 6f 66 66 73 65 74 20 3d 20 72 65 71  ile_offset = req
5010: 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72 61  uest->headers.ra
5020: 6e 67 65 2e 6f 66 66 73 65 74 3b 0a 09 09 09 73  nge.offset;....s
5030: 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 3d 20 72 65  endfile_len = re
5040: 71 75 65 73 74 2d 3e 68 65 61 64 65 72 73 2e 72  quest->headers.r
5050: 61 6e 67 65 2e 6c 65 6e 67 74 68 3b 0a 09 09 09  ange.length;....
5060: 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74 20 3d 20  sendfile_sent = 
5070: 30 3b 0a 09 09 09 77 68 69 6c 65 20 28 72 65 71  0;....while (req
5080: 75 65 73 74 2d 3e 6d 65 74 68 6f 64 20 3d 3d 20  uest->method == 
5090: 46 49 4c 45 44 5f 52 45 51 55 45 53 54 5f 4d 45  FILED_REQUEST_ME
50a0: 54 48 4f 44 5f 47 45 54 29 20 7b 0a 09 09 09 09  THOD_GET) {.....
50b0: 69 66 20 28 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  if (sendfile_len
50c0: 20 3e 20 46 49 4c 45 44 5f 53 45 4e 44 46 49 4c   > FILED_SENDFIL
50d0: 45 5f 4d 41 58 29 20 7b 0a 09 09 09 09 09 73 65  E_MAX) {......se
50e0: 6e 64 66 69 6c 65 5f 73 69 7a 65 20 3d 20 46 49  ndfile_size = FI
50f0: 4c 45 44 5f 53 45 4e 44 46 49 4c 45 5f 4d 41 58  LED_SENDFILE_MAX
5100: 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
5110: 09 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 69 7a  ....sendfile_siz
5120: 65 20 3d 20 73 65 6e 64 66 69 6c 65 5f 6c 65 6e  e = sendfile_len
5130: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e  ;.....}......sen
5140: 64 66 69 6c 65 5f 72 65 74 20 3d 20 73 65 6e 64  dfile_ret = send
5150: 66 69 6c 65 28 66 64 2c 20 66 69 6c 65 69 6e 66  file(fd, fileinf
5160: 6f 2d 3e 66 64 2c 20 26 73 65 6e 64 66 69 6c 65  o->fd, &sendfile
5170: 5f 6f 66 66 73 65 74 2c 20 73 65 6e 64 66 69 6c  _offset, sendfil
5180: 65 5f 73 69 7a 65 29 3b 0a 09 09 09 09 69 66 20  e_size);.....if 
5190: 28 73 65 6e 64 66 69 6c 65 5f 72 65 74 20 3c 3d  (sendfile_ret <=
51a0: 20 30 29 20 7b 0a 23 69 66 64 65 66 20 46 49 4c   0) {.#ifdef FIL
51b0: 45 44 5f 4e 4f 4e 42 4c 4f 43 4b 5f 48 54 54 50  ED_NONBLOCK_HTTP
51c0: 0a 09 09 09 09 09 69 66 20 28 65 72 72 6e 6f 20  ......if (errno 
51d0: 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 09  == EAGAIN) {....
51e0: 09 09 09 73 65 6e 64 66 69 6c 65 5f 72 65 74 20  ...sendfile_ret 
51f0: 3d 20 30 3b 0a 0a 09 09 09 09 09 09 77 68 69 6c  = 0;........whil
5200: 65 20 28 31 29 20 7b 0a 09 09 09 09 09 09 09 73  e (1) {........s
5210: 65 6c 65 63 74 28 66 64 20 2b 20 31 2c 20 26 72  elect(fd + 1, &r
5220: 66 64 2c 20 26 77 66 64 2c 20 4e 55 4c 4c 2c 20  fd, &wfd, NULL, 
5230: 4e 55 4c 4c 29 3b 0a 09 09 09 09 09 09 09 69 66  NULL);........if
5240: 20 28 46 44 5f 49 53 53 45 54 28 66 64 2c 20 26   (FD_ISSET(fd, &
5250: 72 66 64 29 29 20 7b 0a 09 09 09 09 09 09 09 09  rfd)) {.........
5260: 72 65 61 64 5f 72 65 74 20 3d 20 72 65 61 64 28  read_ret = read(
5270: 66 64 2c 20 73 69 6e 6b 62 75 66 2c 20 73 69 7a  fd, sinkbuf, siz
5280: 65 6f 66 28 73 69 6e 6b 62 75 66 29 29 3b 0a 0a  eof(sinkbuf));..
5290: 09 09 09 09 09 09 09 09 69 66 20 28 72 65 61 64  ........if (read
52a0: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
52b0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
52c0: 09 09 09 09 09 7d 0a 09 09 09 09 09 09 09 7d 0a  .....}........}.
52d0: 0a 09 09 09 09 09 09 09 69 66 20 28 46 44 5f 49  ........if (FD_I
52e0: 53 53 45 54 28 66 64 2c 20 26 77 66 64 29 29 20  SSET(fd, &wfd)) 
52f0: 7b 0a 09 09 09 09 09 09 09 09 72 65 61 64 5f 72  {.........read_r
5300: 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 09 09 09  et = 1;.........
5310: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 09 7d  .break;........}
5320: 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09  .......}........
5330: 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20  if (read_ret <= 
5340: 30 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61  0) {........brea
5350: 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  k;.......}......
5360: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 62  } else {.......b
5370: 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 23 65 6c  reak;......}.#el
5380: 73 65 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 23  se......break;.#
5390: 65 6e 64 69 66 0a 09 09 09 09 7d 0a 0a 09 09 09  endif.....}.....
53a0: 09 73 65 6e 64 66 69 6c 65 5f 6c 65 6e 20 2d 3d  .sendfile_len -=
53b0: 20 73 65 6e 64 66 69 6c 65 5f 72 65 74 3b 0a 09   sendfile_ret;..
53c0: 09 09 09 73 65 6e 64 66 69 6c 65 5f 73 65 6e 74  ...sendfile_sent
53d0: 20 2b 3d 20 73 65 6e 64 66 69 6c 65 5f 72 65 74   += sendfile_ret
53e0: 3b 0a 09 09 09 09 69 66 20 28 73 65 6e 64 66 69  ;.....if (sendfi
53f0: 6c 65 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  le_len == 0) {..
5400: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
5410: 0a 09 09 09 7d 0a 0a 09 09 09 6c 6f 67 2d 3e 65  ....}.....log->e
5420: 6e 64 74 69 6d 65 20 3d 20 28 74 69 6d 65 5f 74  ndtime = (time_t
5430: 29 20 2d 31 3b 0a 09 09 09 6c 6f 67 2d 3e 73 65  ) -1;....log->se
5440: 6e 74 5f 6c 65 6e 67 74 68 20 3d 20 73 65 6e 64  nt_length = send
5450: 66 69 6c 65 5f 73 65 6e 74 3b 0a 0a 09 09 09 66  file_sent;.....f
5460: 69 6c 65 64 5f 6c 6f 67 5f 65 6e 74 72 79 28 6c  iled_log_entry(l
5470: 6f 67 29 3b 0a 09 09 7d 0a 0a 09 09 63 6c 6f 73  og);...}....clos
5480: 65 28 66 69 6c 65 69 6e 66 6f 2d 3e 66 64 29 3b  e(fileinfo->fd);
5490: 0a 09 7d 0a 0a 09 66 63 6c 6f 73 65 28 66 70 29  ..}...fclose(fp)
54a0: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
54b0: 2a 20 48 61 6e 64 6c 65 20 69 6e 63 6f 6d 69 6e  * Handle incomin
54c0: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
54d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 69  .static void *fi
54e0: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
54f0: 64 28 76 6f 69 64 20 2a 61 72 67 5f 76 29 20 7b  d(void *arg_v) {
5500: 0a 09 73 74 72 75 63 74 20 66 69 6c 65 64 5f 77  ..struct filed_w
5510: 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f 61 72 67  orker_thread_arg
5520: 73 20 2a 61 72 67 3b 0a 09 73 74 72 75 63 74 20  s *arg;..struct 
5530: 66 69 6c 65 64 5f 68 74 74 70 5f 72 65 71 75 65  filed_http_reque
5540: 73 74 20 72 65 71 75 65 73 74 3b 0a 09 73 74 72  st request;..str
5550: 75 63 74 20 66 69 6c 65 64 5f 6c 6f 67 5f 65 6e  uct filed_log_en
5560: 74 72 79 20 2a 6c 6f 67 2c 20 6c 6f 63 61 6c 5f  try *log, local_
5570: 64 75 6d 6d 79 5f 6c 6f 67 3b 0a 09 73 74 72 75  dummy_log;..stru
5580: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20  ct sockaddr_in6 
5590: 61 64 64 72 3b 0a 09 73 6f 63 6b 6c 65 6e 5f 74  addr;..socklen_t
55a0: 20 61 64 64 72 6c 65 6e 3b 0a 09 69 6e 74 20 66   addrlen;..int f
55b0: 61 69 6c 75 72 65 5f 63 6f 75 6e 74 20 3d 20 30  ailure_count = 0
55c0: 2c 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63 6f  , max_failure_co
55d0: 75 6e 74 20 3d 20 46 49 4c 45 44 5f 4d 41 58 5f  unt = FILED_MAX_
55e0: 46 41 49 4c 55 52 45 5f 43 4f 55 4e 54 3b 0a 09  FAILURE_COUNT;..
55f0: 69 6e 74 20 6d 61 73 74 65 72 5f 66 64 2c 20 66  int master_fd, f
5600: 64 3b 0a 0a 09 2f 2a 20 52 65 61 64 20 61 72 67  d;.../* Read arg
5610: 75 6d 65 6e 74 73 20 2a 2f 0a 09 61 72 67 20 3d  uments */..arg =
5620: 20 61 72 67 5f 76 3b 0a 0a 09 6d 61 73 74 65 72   arg_v;...master
5630: 5f 66 64 20 3d 20 61 72 67 2d 3e 66 64 3b 0a 0a  _fd = arg->fd;..
5640: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 2f  .while (1) {.../
5650: 2a 20 46 61 69 6c 75 72 65 20 6c 6f 6f 70 20 70  * Failure loop p
5660: 72 65 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 09 69  revention */...i
5670: 66 20 28 66 61 69 6c 75 72 65 5f 63 6f 75 6e 74  f (failure_count
5680: 20 3e 20 6d 61 78 5f 66 61 69 6c 75 72 65 5f 63   > max_failure_c
5690: 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b  ount) {....break
56a0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 41 63 63 65  ;...}..../* Acce
56b0: 70 74 20 61 20 6e 65 77 20 63 6c 69 65 6e 74 20  pt a new client 
56c0: 2a 2f 0a 09 09 61 64 64 72 6c 65 6e 20 3d 20 73  */...addrlen = s
56d0: 69 7a 65 6f 66 28 61 64 64 72 29 3b 0a 09 09 66  izeof(addr);...f
56e0: 64 20 3d 20 61 63 63 65 70 74 28 6d 61 73 74 65  d = accept(maste
56f0: 72 5f 66 64 2c 20 28 73 74 72 75 63 74 20 73 6f  r_fd, (struct so
5700: 63 6b 61 64 64 72 20 2a 29 20 26 61 64 64 72 2c  ckaddr *) &addr,
5710: 20 26 61 64 64 72 6c 65 6e 29 3b 0a 0a 09 09 2f   &addrlen);..../
5720: 2a 0a 09 09 20 2a 20 49 66 20 77 65 20 66 61 69  *... * If we fai
5730: 6c 2c 20 6d 61 6b 65 20 61 20 6e 6f 74 65 20 6f  l, make a note o
5740: 66 20 69 74 20 73 6f 20 77 65 20 64 6f 6e 27 74  f it so we don't
5750: 20 67 6f 20 69 6e 74 6f 20 61 20 6c 6f 6f 70 20   go into a loop 
5760: 6f 66 0a 09 09 20 2a 20 61 63 63 65 70 74 28 29  of... * accept()
5770: 20 66 61 69 6c 69 6e 67 0a 09 09 20 2a 2f 0a 09   failing... */..
5780: 09 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 09  .if (fd < 0) {..
5790: 09 09 2f 2a 20 4c 6f 67 20 74 68 65 20 6e 65 77  ../* Log the new
57a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 09   connection */..
57b0: 09 09 66 69 6c 65 64 5f 6c 6f 67 5f 6d 73 67 28  ..filed_log_msg(
57c0: 22 41 43 43 45 50 54 5f 46 41 49 4c 45 44 22 29  "ACCEPT_FAILED")
57d0: 3b 0a 0a 09 09 09 66 61 69 6c 75 72 65 5f 63 6f  ;.....failure_co
57e0: 75 6e 74 2b 2b 3b 0a 0a 09 09 09 63 6f 6e 74 69  unt++;.....conti
57f0: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 4c  nue;...}..../* L
5800: 6f 67 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  og the new conne
5810: 63 74 69 6f 6e 20 2a 2f 0a 09 09 6c 6f 67 20 3d  ction */...log =
5820: 20 66 69 6c 65 64 5f 6c 6f 67 5f 6e 65 77 28 31   filed_log_new(1
5830: 29 3b 0a 09 09 69 66 20 28 6c 6f 67 20 3d 3d 20  );...if (log == 
5840: 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 6c 6f 73 65  NULL) {....close
5850: 28 66 64 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  (fd);.....contin
5860: 75 65 3b 0a 09 09 7d 0a 0a 09 09 6c 6f 67 2d 3e  ue;...}....log->
5870: 74 79 70 65 20 3d 20 46 49 4c 45 44 5f 4c 4f 47  type = FILED_LOG
5880: 5f 54 59 50 45 5f 54 52 41 4e 53 46 45 52 3b 0a  _TYPE_TRANSFER;.
5890: 09 09 69 66 20 28 66 69 6c 65 64 5f 6c 6f 67 5f  ..if (filed_log_
58a0: 69 70 28 28 73 74 72 75 63 74 20 73 6f 63 6b 61  ip((struct socka
58b0: 64 64 72 20 2a 29 20 26 61 64 64 72 2c 20 6c 6f  ddr *) &addr, lo
58c0: 67 2d 3e 69 70 2c 20 73 69 7a 65 6f 66 28 6c 6f  g->ip, sizeof(lo
58d0: 67 2d 3e 69 70 29 29 20 3d 3d 20 4e 55 4c 4c 29  g->ip)) == NULL)
58e0: 20 7b 0a 09 09 09 6c 6f 67 2d 3e 69 70 5b 30 5d   {....log->ip[0]
58f0: 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 09 09 6c   = '\0';...}...l
5900: 6f 67 2d 3e 70 6f 72 74 20 3d 20 61 64 64 72 2e  og->port = addr.
5910: 73 69 6e 36 5f 70 6f 72 74 3b 0a 0a 09 09 2f 2a  sin6_port;..../*
5920: 20 52 65 73 65 74 20 66 61 69 6c 75 72 65 20 63   Reset failure c
5930: 6f 75 6e 74 2a 2f 0a 09 09 66 61 69 6c 75 72 65  ount*/...failure
5940: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 2f  _count = 0;..../
5950: 2a 20 48 61 6e 64 6c 65 20 73 6f 63 6b 65 74 20  * Handle socket 
5960: 2a 2f 0a 09 09 66 69 6c 65 64 5f 68 61 6e 64 6c  */...filed_handl
5970: 65 5f 63 6c 69 65 6e 74 28 66 64 2c 20 26 72 65  e_client(fd, &re
5980: 71 75 65 73 74 2c 20 6c 6f 67 29 3b 0a 09 7d 0a  quest, log);..}.
5990: 0a 09 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f  ../* Report erro
59a0: 72 20 2a 2f 0a 09 66 69 6c 65 64 5f 6c 6f 67 5f  r */..filed_log_
59b0: 6d 73 67 28 22 54 48 52 45 41 44 5f 44 49 45 44  msg("THREAD_DIED
59c0: 20 41 42 4e 4f 52 4d 41 4c 22 29 3b 0a 0a 09 72   ABNORMAL");...r
59d0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 2f  eturn(NULL);.../
59e0: 2a 20 6c 6f 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f  * local_dummy_lo
59f0: 67 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69  g is only used i
5a00: 66 20 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47  f FILED_DONT_LOG
5a10: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 6f 74 68   is enabled, oth
5a20: 65 72 77 69 73 65 20 69 74 27 73 20 6e 6f 74 20  erwise it's not 
5a30: 75 73 65 64 2c 20 62 75 74 20 74 68 65 20 63 6f  used, but the co
5a40: 6d 70 69 6c 65 72 20 68 61 74 65 73 20 74 68 61  mpiler hates tha
5a50: 74 20 69 64 65 61 2e 20 2a 2f 0a 09 6c 6f 63 61  t idea. */..loca
5a60: 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79 70 65  l_dummy_log.type
5a70: 20 3d 20 30 3b 0a 09 6c 6f 63 61 6c 5f 64 75 6d   = 0;..local_dum
5a80: 6d 79 5f 6c 6f 67 2e 74 79 70 65 20 3d 20 6c 6f  my_log.type = lo
5a90: 63 61 6c 5f 64 75 6d 6d 79 5f 6c 6f 67 2e 74 79  cal_dummy_log.ty
5aa0: 70 65 3b 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65  pe;.}../* Create
5ab0: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73 20   worker threads 
5ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
5ad0: 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61  led_worker_threa
5ae0: 64 73 5f 69 6e 69 74 28 69 6e 74 20 66 64 2c 20  ds_init(int fd, 
5af0: 69 6e 74 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  int thread_count
5b00: 29 20 7b 0a 09 73 74 72 75 63 74 20 66 69 6c 65  ) {..struct file
5b10: 64 5f 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 5f  d_worker_thread_
5b20: 61 72 67 73 20 2a 61 72 67 3b 0a 09 70 74 68 72  args *arg;..pthr
5b30: 65 61 64 5f 74 20 74 68 72 65 61 64 69 64 3b 0a  ead_t threadid;.
5b40: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
5b50: 3b 0a 09 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20  ;..int i;...for 
5b60: 28 69 20 3d 20 30 3b 20 69 20 3c 20 74 68 72 65  (i = 0; i < thre
5b70: 61 64 5f 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b  ad_count; i++) {
5b80: 0a 09 09 61 72 67 20 3d 20 6d 61 6c 6c 6f 63 28  ...arg = malloc(
5b90: 73 69 7a 65 6f 66 28 2a 61 72 67 29 29 3b 0a 0a  sizeof(*arg));..
5ba0: 09 09 61 72 67 2d 3e 66 64 20 3d 20 66 64 3b 0a  ..arg->fd = fd;.
5bb0: 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 20 3d  ...pthread_ret =
5bc0: 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28   pthread_create(
5bd0: 26 74 68 72 65 61 64 69 64 2c 20 4e 55 4c 4c 2c  &threadid, NULL,
5be0: 20 66 69 6c 65 64 5f 77 6f 72 6b 65 72 5f 74 68   filed_worker_th
5bf0: 72 65 61 64 2c 20 61 72 67 29 3b 0a 09 09 69 66  read, arg);...if
5c00: 20 28 70 74 68 72 65 61 64 5f 72 65 74 20 21 3d   (pthread_ret !=
5c10: 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28   0) {....return(
5c20: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  -1);...}..}...re
5c30: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44  turn(0);.}../* D
5c40: 69 73 70 6c 61 79 20 68 65 6c 70 20 2a 2f 0a 73  isplay help */.s
5c50: 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 64  tatic void filed
5c60: 5f 70 72 69 6e 74 5f 68 65 6c 70 28 46 49 4c 45  _print_help(FILE
5c70: 20 2a 6f 75 74 70 75 74 2c 20 69 6e 74 20 6c 6f   *output, int lo
5c80: 6e 67 5f 68 65 6c 70 2c 20 63 6f 6e 73 74 20 63  ng_help, const c
5c90: 68 61 72 20 2a 65 78 74 72 61 29 20 7b 0a 09 69  har *extra) {..i
5ca0: 66 20 28 65 78 74 72 61 29 20 7b 0a 09 09 66 70  f (extra) {...fp
5cb0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 25  rintf(output, "%
5cc0: 73 5c 6e 22 2c 20 65 78 74 72 61 29 3b 0a 09 7d  s\n", extra);..}
5cd0: 0a 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
5ce0: 74 2c 20 22 55 73 61 67 65 3a 20 66 69 6c 65 64  t, "Usage: filed
5cf0: 20 5b 3c 6f 70 74 69 6f 6e 73 3e 5d 5c 6e 22 29   [<options>]\n")
5d00: 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ;..fprintf(outpu
5d10: 74 2c 20 22 20 20 4f 70 74 69 6f 6e 73 3a 5c 6e  t, "  Options:\n
5d20: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74  ");..fprintf(out
5d30: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68 2c 20  put, "      -h, 
5d40: 2d 2d 68 65 6c 70 5c 6e 22 29 3b 0a 09 66 70 72  --help\n");..fpr
5d50: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
5d60: 20 20 20 20 2d 64 2c 20 2d 2d 64 61 65 6d 6f 6e      -d, --daemon
5d70: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
5d80: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 76  utput, "      -v
5d90: 2c 20 2d 2d 76 65 72 73 69 6f 6e 5c 6e 22 29 3b  , --version\n");
5da0: 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
5db0: 2c 20 22 20 20 20 20 20 20 2d 62 20 3c 61 64 64  , "      -b <add
5dc0: 72 65 73 73 3e 2c 20 2d 2d 62 69 6e 64 20 3c 61  ress>, --bind <a
5dd0: 64 64 72 65 73 73 3e 5c 6e 22 29 3b 0a 09 66 70  ddress>\n");..fp
5de0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
5df0: 20 20 20 20 20 2d 70 20 3c 70 6f 72 74 3e 2c 20       -p <port>, 
5e00: 2d 2d 70 6f 72 74 20 3c 70 6f 72 74 3e 5c 6e 22  --port <port>\n"
5e10: 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f 75 74 70  );..fprintf(outp
5e20: 75 74 2c 20 22 20 20 20 20 20 20 2d 74 20 3c 63  ut, "      -t <c
5e30: 6f 75 6e 74 3e 2c 20 2d 2d 74 68 72 65 61 64 73  ount>, --threads
5e40: 20 3c 63 6f 75 6e 74 3e 5c 6e 22 29 3b 0a 09 66   <count>\n");..f
5e50: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
5e60: 20 20 20 20 20 20 2d 63 20 3c 65 6e 74 72 69 65        -c <entrie
5e70: 73 3e 2c 20 2d 2d 63 61 63 68 65 20 3c 65 6e 74  s>, --cache <ent
5e80: 72 69 65 73 3e 5c 6e 22 29 3b 0a 09 66 70 72 69  ries>\n");..fpri
5e90: 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20  ntf(output, "   
5ea0: 20 20 20 2d 6c 20 3c 66 69 6c 65 3e 2c 20 2d 2d     -l <file>, --
5eb0: 6c 6f 67 20 3c 66 69 6c 65 3e 5c 6e 22 29 3b 0a  log <file>\n");.
5ec0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5ed0: 20 22 20 20 20 20 20 20 2d 75 20 3c 75 73 65 72   "      -u <user
5ee0: 3e 2c 20 2d 2d 75 73 65 72 20 3c 75 73 65 72 3e  >, --user <user>
5ef0: 5c 6e 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 6f  \n");..fprintf(o
5f00: 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 2d 72  utput, "      -r
5f10: 20 3c 64 69 72 65 63 74 6f 72 79 3e 2c 20 2d 2d   <directory>, --
5f20: 72 6f 6f 74 20 3c 64 69 72 65 63 74 6f 72 79 3e  root <directory>
5f30: 5c 6e 22 29 3b 0a 0a 09 69 66 20 28 6c 6f 6e 67  \n");...if (long
5f40: 5f 68 65 6c 70 29 20 7b 0a 09 09 66 70 72 69 6e  _help) {...fprin
5f50: 74 66 28 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29  tf(output, "\n")
5f60: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
5f70: 75 74 2c 20 22 20 20 55 73 61 67 65 3a 5c 6e 22  ut, "  Usage:\n"
5f80: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
5f90: 70 75 74 2c 20 22 20 20 20 20 20 20 2d 68 20 28  put, "      -h (
5fa0: 6f 72 20 2d 2d 68 65 6c 70 29 20 70 72 69 6e 74  or --help) print
5fb0: 73 20 74 68 69 73 20 75 73 61 67 65 20 69 6e 66  s this usage inf
5fc0: 6f 72 6d 61 74 69 6f 6e 2e 5c 6e 22 29 3b 0a 09  ormation.\n");..
5fd0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
5fe0: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
5ff0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6000: 20 2d 64 20 28 6f 72 20 2d 2d 64 61 65 6d 6f 6e   -d (or --daemon
6010: 29 20 69 6e 73 74 72 75 63 74 73 20 66 69 6c 65  ) instructs file
6020: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 64 61  d to become a da
6030: 65 6d 6f 6e 20 61 66 74 65 72 20 69 6e 69 74 69  emon after initi
6040: 61 6c 69 7a 69 6e 67 5c 6e 22 29 3b 0a 09 09 66  alizing\n");...f
6050: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 20 20 20 20 74 68 65 20 6c 69 73 74 65         the liste
6080: 6e 69 6e 67 20 54 43 50 20 73 6f 63 6b 65 74 20  ning TCP socket 
6090: 61 6e 64 20 6c 6f 67 20 66 69 6c 65 73 2e 5c 6e  and log files.\n
60a0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
60b0: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
60c0: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
60d0: 20 20 20 20 20 20 2d 76 20 28 6f 72 20 2d 2d 76        -v (or --v
60e0: 65 72 73 69 6f 6e 29 20 69 6e 73 74 72 75 63 74  ersion) instruct
60f0: 73 20 66 69 6c 65 64 20 70 72 69 6e 74 20 6f 75  s filed print ou
6100: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
6110: 6d 62 65 72 20 61 6e 64 20 65 78 69 74 2e 5c 6e  mber and exit.\n
6120: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
6130: 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66  tput, "\n");...f
6140: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6150: 20 20 20 20 20 20 2d 62 20 28 6f 72 20 2d 2d 62        -b (or --b
6160: 69 6e 64 29 20 73 70 65 63 69 66 69 65 73 20 74  ind) specifies t
6170: 68 65 20 61 64 64 72 65 73 73 20 74 6f 20 6c 69  he address to li
6180: 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f 6d 69 6e  sten for incomin
6190: 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09 09 66 70  g HTTP\n");...fp
61a0: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 72 65 71 75 65 73 74 73 20 6f 6e 2e      requests on.
61d0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61    The default va
61e0: 6c 75 65 20 69 73 20 5c 22 25 73 5c 22 2e 5c 6e  lue is \"%s\".\n
61f0: 22 2c 20 42 49 4e 44 5f 41 44 44 52 29 3b 0a 09  ", BIND_ADDR);..
6200: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6210: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
6220: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6230: 20 2d 70 20 28 6f 72 20 2d 2d 70 6f 72 74 29 20   -p (or --port) 
6240: 73 70 65 63 69 66 69 65 73 20 74 68 65 20 54 43  specifies the TC
6250: 50 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f  P port number to
6260: 20 6c 69 73 74 65 6e 20 66 6f 72 20 69 6e 63 6f   listen for inco
6270: 6d 69 6e 67 20 48 54 54 50 5c 6e 22 29 3b 0a 09  ming HTTP\n");..
6280: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6290: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
62a0: 20 20 20 20 20 20 20 72 65 71 75 65 73 74 73 20         requests 
62b0: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
62c0: 20 69 73 20 25 75 2e 5c 6e 22 2c 20 28 75 6e 73   is %u.\n", (uns
62d0: 69 67 6e 65 64 20 69 6e 74 29 20 50 4f 52 54 29  igned int) PORT)
62e0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
62f0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
6300: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
6310: 20 20 20 20 2d 74 20 28 6f 72 20 2d 2d 74 68 72      -t (or --thr
6320: 65 61 64 73 29 20 73 70 65 63 69 66 69 65 73 20  eads) specifies 
6330: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 6f  the number of wo
6340: 72 6b 65 72 20 74 68 72 65 61 64 73 20 74 6f 20  rker threads to 
6350: 63 72 65 61 74 65 2e 20 45 61 63 68 5c 6e 22 29  create. Each\n")
6360: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
6370: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 6f 72               wor
6390: 6b 65 72 20 74 68 72 65 61 64 20 63 61 6e 20 73  ker thread can s
63a0: 65 72 76 69 63 65 20 6f 6e 65 20 63 6f 6e 63 75  ervice one concu
63b0: 72 72 65 6e 74 20 48 54 54 50 20 73 65 73 73 69  rrent HTTP sessi
63c0: 6f 6e 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  on.\n");...fprin
63d0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 20 20 20 54 68 75 73 20 74 68 65 20 6e 75 6d      Thus the num
6400: 62 65 72 20 6f 66 20 74 68 72 65 61 64 73 20 63  ber of threads c
6410: 72 65 61 74 65 64 20 77 69 6c 6c 20 64 65 74 65  reated will dete
6420: 72 6d 69 6e 65 20 68 6f 77 5c 6e 22 29 3b 0a 09  rmine how\n");..
6430: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6440: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
6450: 20 20 20 20 20 20 20 20 20 20 6d 61 6e 79 20 73            many s
6460: 69 6d 75 6c 74 61 6e 65 6f 75 73 20 74 72 61 6e  imultaneous tran
6470: 73 66 65 72 73 20 77 69 6c 6c 20 62 65 20 70 6f  sfers will be po
6480: 73 73 69 62 6c 65 2e 20 54 68 65 5c 6e 22 29 3b  ssible. The\n");
6490: 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75  ...fprintf(outpu
64a0: 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20  t, "            
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
64c0: 75 6c 74 20 69 73 20 25 6c 75 2e 5c 6e 22 2c 20  ult is %lu.\n", 
64d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
64e0: 54 48 52 45 41 44 5f 43 4f 55 4e 54 29 3b 0a 09  THREAD_COUNT);..
64f0: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6500: 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74   "\n");...fprint
6510: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6520: 20 2d 63 20 28 6f 72 20 2d 2d 63 61 63 68 65 29   -c (or --cache)
6530: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
6540: 75 6d 62 65 72 20 6f 66 20 66 69 6c 65 20 69 6e  umber of file in
6550: 66 6f 72 6d 61 74 69 6f 6e 20 63 61 63 68 65 20  formation cache 
6560: 65 6e 74 72 69 65 73 5c 6e 22 29 3b 0a 09 09 66  entries\n");...f
6570: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 20 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74        to allocat
65a0: 65 2e 20 20 45 61 63 68 20 63 61 63 68 65 20 65  e.  Each cache e
65b0: 6e 74 72 79 20 68 6f 6c 64 73 20 66 69 6c 65 20  ntry holds file 
65c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 5c 6e  information as\n
65d0: 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75  ");...fprintf(ou
65e0: 74 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20  tput, "         
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 65 6c               wel
6600: 6c 20 61 73 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l as an open fil
6610: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
6620: 74 68 65 20 66 69 6c 65 2c 20 73 6f 20 72 65 73  the file, so res
6630: 6f 75 72 63 65 5c 6e 22 29 3b 0a 09 09 66 70 72  ource\n");...fpr
6640: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 20 20 6c 69 6d 69 74 73 20 28 69 2e 65 2e      limits (i.e.
6670: 2c 20 75 6c 69 6d 69 74 29 20 73 68 6f 75 6c 64  , ulimit) should
6680: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
6690: 20 54 68 69 73 20 73 68 6f 75 6c 64 5c 6e 22 29   This should\n")
66a0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
66b0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
66c0: 20 20 20 20 20 20 20 20 20 20 20 62 65 20 61 20             be a 
66d0: 70 72 69 6d 65 20 6e 75 6d 62 65 72 20 66 6f 72  prime number for
66e0: 20 69 64 65 61 6c 20 75 73 65 20 77 69 74 68 20   ideal use with 
66f0: 74 68 65 20 6c 6f 6f 6b 75 70 20 6d 65 74 68 6f  the lookup metho
6700: 64 2e 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  d.\n");...fprint
6710: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
6740: 25 6c 75 2e 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  %lu.\n", (unsign
6750: 65 64 20 6c 6f 6e 67 29 20 43 41 43 48 45 5f 53  ed long) CACHE_S
6760: 49 5a 45 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  IZE);...fprintf(
6770: 6f 75 74 70 75 74 2c 20 22 5c 6e 22 29 3b 0a 09  output, "\n");..
6780: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6790: 20 22 20 20 20 20 20 20 2d 6c 20 28 6f 72 20 2d   "      -l (or -
67a0: 2d 6c 6f 67 29 20 73 70 65 63 69 66 69 65 73 20  -log) specifies 
67b0: 61 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 6f 70  a filename to op
67c0: 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6c  en for writing l
67d0: 6f 67 20 65 6e 74 72 69 65 73 2e 20 20 4c 6f 67  og entries.  Log
67e0: 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  \n");...fprintf(
67f0: 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20 20  output, "       
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74               ent
6810: 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 66 6f  ries are made fo
6820: 72 20 76 61 72 69 6f 75 73 20 73 74 61 67 65 73  r various stages
6830: 20 69 6e 20 74 72 61 6e 73 66 65 72 69 6e 67 20   in transfering 
6840: 66 69 6c 65 73 2e 5c 6e 22 29 3b 0a 09 09 66 70  files.\n");...fp
6850: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20     The log file 
6880: 69 73 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  is opened before
6890: 20 73 77 69 74 63 68 69 6e 67 20 75 73 65 72 73   switching users
68a0: 20 28 73 65 65 20 5c 22 2d 75 5c 22 29 5c 6e 22   (see \"-u\")\n"
68b0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
68c0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
68d0: 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 72 6f            and ro
68e0: 6f 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 28  ot directories (
68f0: 73 65 65 20 5c 22 2d 72 5c 22 29 2e 20 20 54 68  see \"-r\").  Th
6900: 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 6e 65  e log file is ne
6910: 76 65 72 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  ver\n");...fprin
6920: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 63 6c 6f 73 65 64 20 73 6f 20 6c 6f 67 20 72 6f  closed so log ro
6950: 74 61 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 73  tation without s
6960: 74 6f 70 70 69 6e 67 20 74 68 65 20 64 61 65 6d  topping the daem
6970: 6f 6e 20 69 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a  on is will\n");.
6980: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
6990: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
69a0: 20 20 20 20 20 20 20 6e 6f 74 20 77 6f 72 6b 2e         not work.
69b0: 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 5c    The value of \
69c0: 22 2d 5c 22 20 69 6e 64 69 63 61 74 65 73 20 74  "-\" indicates t
69d0: 68 61 74 20 73 74 61 6e 64 61 72 64 20 6f 75 74  hat standard out
69e0: 70 75 74 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e  put\n");...fprin
69f0: 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20  tf(output, "    
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
6a20: 6f 72 20 6c 6f 67 67 69 6e 67 2e 20 20 49 66 20  or logging.  If 
6a30: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 62 65 67  the filename beg
6a40: 69 6e 73 20 77 69 74 68 20 61 5c 6e 22 29 3b 0a  ins with a\n");.
6a50: 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74  ..fprintf(output
6a60: 2c 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20  , "             
6a70: 20 20 20 20 20 20 20 70 69 70 65 20 28 5c 22 7c         pipe (\"|
6a80: 5c 22 29 20 74 68 65 6e 20 61 20 70 72 6f 63 65  \") then a proce
6a90: 73 73 20 69 73 20 73 74 61 72 74 65 64 20 61 6e  ss is started an
6aa0: 64 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69  d used for loggi
6ab0: 6e 67 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  ng\n");...fprint
6ac0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6ae0: 6e 73 74 65 61 64 20 6f 66 20 61 20 66 69 6c 65  nstead of a file
6af0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
6b00: 73 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 20 4c 4f  s \"%s\".\n", LO
6b10: 47 5f 46 49 4c 45 29 3b 0a 23 69 66 64 65 66 20  G_FILE);.#ifdef 
6b20: 46 49 4c 45 44 5f 44 4f 4e 54 5f 4c 4f 47 0a 09  FILED_DONT_LOG..
6b30: 09 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c  .fprintf(output,
6b40: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
6b50: 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20        Note that 
6b60: 6c 6f 67 67 69 6e 67 20 69 73 20 63 6f 6d 70 6c  logging is compl
6b70: 65 74 65 6c 79 20 64 69 73 61 62 6c 65 64 20 73  etely disabled s
6b80: 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 64 6f  o this option do
6b90: 65 73 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  es\n");...fprint
6ba0: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
6bc0: 6f 74 68 69 6e 67 20 69 6e 20 74 68 69 73 20 62  othing in this b
6bd0: 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
6be0: 66 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  f...fprintf(outp
6bf0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 70 72  ut, "\n");...fpr
6c00: 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20 20  intf(output, "  
6c10: 20 20 20 20 2d 75 20 28 6f 72 20 2d 2d 75 73 65      -u (or --use
6c20: 72 29 20 73 70 65 63 69 66 69 65 73 20 74 68 65  r) specifies the
6c30: 20 75 73 65 72 20 74 6f 20 73 77 69 74 63 68 20   user to switch 
6c40: 75 73 65 72 20 49 44 73 20 74 6f 20 62 65 66 6f  user IDs to befo
6c50: 72 65 20 73 65 72 76 69 63 69 6e 67 5c 6e 22 29  re servicing\n")
6c60: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
6c70: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
6c80: 20 20 20 20 20 20 20 20 20 20 72 65 71 75 65 73            reques
6c90: 74 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  ts.  The default
6ca0: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 75   is not change u
6cb0: 73 65 72 20 49 44 73 2e 5c 6e 22 29 3b 0a 09 09  ser IDs.\n");...
6cc0: 66 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20  fprintf(output, 
6cd0: 22 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74 66  "\n");...fprintf
6ce0: 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20 20  (output, "      
6cf0: 2d 72 20 28 6f 72 20 2d 2d 72 6f 6f 74 29 20 73  -r (or --root) s
6d00: 70 65 63 69 66 69 65 73 20 74 68 65 20 64 69 72  pecifies the dir
6d10: 65 63 74 6f 72 79 20 74 6f 20 61 63 74 20 61 73  ectory to act as
6d20: 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74   the root direct
6d30: 6f 72 79 20 66 6f 72 5c 6e 22 29 3b 0a 09 09 66  ory for\n");...f
6d40: 70 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22  printf(output, "
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 20 20 20 20 74 68 65 20 66 69 6c 65 20 73 65       the file se
6d70: 72 76 65 72 2e 20 20 49 66 20 74 68 69 73 20 6f  rver.  If this o
6d80: 70 74 69 6f 6e 20 69 73 20 73 70 65 63 69 66 69  ption is specifi
6d90: 65 64 2c 20 63 68 72 6f 6f 74 28 32 29 5c 6e 22  ed, chroot(2)\n"
6da0: 29 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74  );...fprintf(out
6db0: 70 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20  put, "          
6dc0: 20 20 20 20 20 20 20 20 20 20 20 69 73 20 63 61             is ca
6dd0: 6c 6c 65 64 2e 20 20 54 68 65 20 64 65 66 61 75  lled.  The defau
6de0: 6c 74 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  lt is not change
6df0: 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 69 65   root directorie
6e00: 73 2c 5c 6e 22 29 3b 0a 09 09 66 70 72 69 6e 74  s,\n");...fprint
6e10: 66 28 6f 75 74 70 75 74 2c 20 22 20 20 20 20 20  f(output, "     
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 74 68 61 74 20 69 73 2c 20 74 68 65 20 5c 22 2f  that is, the \"/
6e40: 5c 22 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  \" directory is 
6e50: 73 68 61 72 65 64 20 6f 75 74 2e 20 20 54 68 69  shared out.  Thi
6e60: 73 20 77 69 6c 6c 5c 6e 22 29 3b 0a 09 09 66 70  s will\n");...fp
6e70: 72 69 6e 74 66 28 6f 75 74 70 75 74 2c 20 22 20  rintf(output, " 
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 20 20 20 20 6c 69 6b 65 6c 79 20 62 65 20 61 20      likely be a 
6ea0: 73 65 63 75 72 69 74 79 20 69 73 73 75 65 2c 20  security issue, 
6eb0: 73 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 73  so this option s
6ec0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 5c 6e 22 29  hould always\n")
6ed0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 6f 75 74 70  ;...fprintf(outp
6ee0: 75 74 2c 20 22 20 20 20 20 20 20 20 20 20 20 20  ut, "           
6ef0: 20 20 20 20 20 20 20 20 20 20 62 65 20 75 73 65            be use
6f00: 64 2e 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  d.\n");..}...ret
6f10: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  urn;.}../* Add a
6f20: 20 67 65 74 6f 70 74 20 6f 70 74 69 6f 6e 20 2a   getopt option *
6f30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
6f40: 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f  led_getopt_long_
6f50: 73 65 74 6f 70 74 28 73 74 72 75 63 74 20 6f 70  setopt(struct op
6f60: 74 69 6f 6e 20 2a 6f 70 74 2c 20 63 6f 6e 73 74  tion *opt, const
6f70: 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74   char *name, int
6f80: 20 68 61 73 5f 61 72 67 2c 20 69 6e 74 20 76 61   has_arg, int va
6f90: 6c 29 20 7b 0a 09 6f 70 74 2d 3e 6e 61 6d 65 20  l) {..opt->name 
6fa0: 20 20 20 20 3d 20 6e 61 6d 65 3b 0a 09 6f 70 74      = name;..opt
6fb0: 2d 3e 68 61 73 5f 61 72 67 20 20 3d 20 68 61 73  ->has_arg  = has
6fc0: 5f 61 72 67 3b 0a 09 6f 70 74 2d 3e 66 6c 61 67  _arg;..opt->flag
6fd0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 09 6f 70       = NULL;..op
6fe0: 74 2d 3e 76 61 6c 20 20 20 20 20 20 3d 20 76 61  t->val      = va
6ff0: 6c 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  l;...return;.}..
7000: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 75 73 65  /* Resolve a use
7010: 72 6e 61 6d 65 20 74 6f 20 61 20 55 49 44 20 2a  rname to a UID *
7020: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
7030: 65 64 5f 75 73 65 72 5f 6c 6f 6f 6b 75 70 28 63  ed_user_lookup(c
7040: 6f 6e 73 74 20 63 68 61 72 20 2a 75 73 65 72 2c  onst char *user,
7050: 20 75 69 64 5f 74 20 2a 75 73 65 72 5f 69 64 29   uid_t *user_id)
7060: 20 7b 0a 09 63 68 61 72 20 2a 6e 65 78 74 3b 0a   {..char *next;.
7070: 09 75 69 64 5f 74 20 75 73 65 72 5f 69 64 5f 63  .uid_t user_id_c
7080: 68 65 63 6b 3b 0a 23 69 66 6e 64 65 66 20 46 49  heck;.#ifndef FI
7090: 4c 45 44 5f 4e 4f 5f 47 45 54 50 57 4e 41 4d 0a  LED_NO_GETPWNAM.
70a0: 09 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a  .struct passwd *
70b0: 65 6e 74 3b 0a 0a 09 65 6e 74 20 3d 20 67 65 74  ent;...ent = get
70c0: 70 77 6e 61 6d 28 75 73 65 72 29 3b 0a 09 69 66  pwnam(user);..if
70d0: 20 28 65 6e 74 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ent != NULL) {
70e0: 0a 09 09 2a 75 73 65 72 5f 69 64 20 3d 20 65 6e  ...*user_id = en
70f0: 74 2d 3e 70 77 5f 75 69 64 3b 0a 0a 09 09 72 65  t->pw_uid;....re
7100: 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 23 65 6e 64  turn(0);..}.#end
7110: 69 66 0a 0a 09 75 73 65 72 5f 69 64 5f 63 68 65  if...user_id_che
7120: 63 6b 20 3d 20 73 74 72 74 6f 75 6c 6c 28 75 73  ck = strtoull(us
7130: 65 72 2c 20 26 6e 65 78 74 2c 20 31 30 29 3b 0a  er, &next, 10);.
7140: 09 69 66 20 28 6e 65 78 74 20 3d 3d 20 4e 55 4c  .if (next == NUL
7150: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29  L) {...return(1)
7160: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6e 65 78 74 5b  ;..}...if (next[
7170: 30 5d 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09 09  0] != '\0') {...
7180: 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
7190: 2a 75 73 65 72 5f 69 64 20 3d 20 75 73 65 72 5f  *user_id = user_
71a0: 69 64 5f 63 68 65 63 6b 3b 0a 0a 09 72 65 74 75  id_check;...retu
71b0: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 44 61 65  rn(0);.}../* Dae
71c0: 6d 6f 6e 69 7a 65 20 2a 2f 0a 73 74 61 74 69 63  monize */.static
71d0: 20 69 6e 74 20 66 69 6c 65 64 5f 64 61 65 6d 6f   int filed_daemo
71e0: 6e 69 7a 65 28 76 6f 69 64 29 20 7b 0a 09 70 69  nize(void) {..pi
71f0: 64 5f 74 20 73 65 74 73 69 64 5f 72 65 74 2c 20  d_t setsid_ret, 
7200: 66 6f 72 6b 5f 72 65 74 3b 0a 09 69 6e 74 20 63  fork_ret;..int c
7210: 68 64 69 72 5f 72 65 74 2c 20 64 75 70 32 5f 72  hdir_ret, dup2_r
7220: 65 74 3b 0a 09 69 6e 74 20 66 64 5f 69 6e 2c 20  et;..int fd_in, 
7230: 66 64 5f 6f 75 74 3b 0a 0a 09 63 68 64 69 72 5f  fd_out;...chdir_
7240: 72 65 74 20 3d 20 63 68 64 69 72 28 22 2f 22 29  ret = chdir("/")
7250: 3b 0a 09 69 66 20 28 63 68 64 69 72 5f 72 65 74  ;..if (chdir_ret
7260: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   != 0) {...retur
7270: 6e 28 31 29 3b 0a 09 7d 0a 0a 09 66 6f 72 6b 5f  n(1);..}...fork_
7280: 72 65 74 20 3d 20 66 6f 72 6b 28 29 3b 0a 09 69  ret = fork();..i
7290: 66 20 28 66 6f 72 6b 5f 72 65 74 20 3c 20 30 29  f (fork_ret < 0)
72a0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a   {...return(1);.
72b0: 09 7d 0a 0a 09 69 66 20 28 66 6f 72 6b 5f 72 65  .}...if (fork_re
72c0: 74 20 3e 20 30 29 20 7b 0a 09 09 2f 2a 20 50 61  t > 0) {.../* Pa
72d0: 72 65 6e 74 20 2a 2f 0a 09 09 77 61 69 74 70 69  rent */...waitpi
72e0: 64 28 66 6f 72 6b 5f 72 65 74 2c 20 4e 55 4c 4c  d(fork_ret, NULL
72f0: 2c 20 30 29 3b 0a 0a 09 09 65 78 69 74 28 45 58  , 0);....exit(EX
7300: 49 54 5f 53 55 43 43 45 53 53 29 3b 0a 09 7d 0a  IT_SUCCESS);..}.
7310: 0a 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a 09 69  ../* Child */..i
7320: 66 20 28 66 6f 72 6b 28 29 20 21 3d 20 30 29 20  f (fork() != 0) 
7330: 7b 0a 09 09 2f 2a 20 43 68 69 6c 64 20 2a 2f 0a  {.../* Child */.
7340: 09 09 65 78 69 74 28 45 58 49 54 5f 53 55 43 43  ..exit(EXIT_SUCC
7350: 45 53 53 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 72  ESS);..}.../* Gr
7360: 61 6e 64 20 63 68 69 6c 64 20 2a 2f 0a 09 73 65  and child */..se
7370: 74 73 69 64 5f 72 65 74 20 3d 20 73 65 74 73 69  tsid_ret = setsi
7380: 64 28 29 3b 0a 09 69 66 20 28 73 65 74 73 69 64  d();..if (setsid
7390: 5f 72 65 74 20 3d 3d 20 28 28 70 69 64 5f 74 29  _ret == ((pid_t)
73a0: 20 2d 31 29 29 20 7b 0a 09 09 72 65 74 75 72 6e   -1)) {...return
73b0: 28 31 29 3b 0a 09 7d 0a 0a 09 66 64 5f 69 6e 20  (1);..}...fd_in 
73c0: 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c  = open("/dev/nul
73d0: 6c 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 09  l", O_RDONLY);..
73e0: 66 64 5f 6f 75 74 20 3d 20 6f 70 65 6e 28 22 2f  fd_out = open("/
73f0: 64 65 76 2f 6e 75 6c 6c 22 2c 20 4f 5f 57 52 4f  dev/null", O_WRO
7400: 4e 4c 59 29 3b 0a 09 69 66 20 28 66 64 5f 69 6e  NLY);..if (fd_in
7410: 20 3c 20 30 20 7c 7c 20 66 64 5f 6f 75 74 20 3c   < 0 || fd_out <
7420: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 31   0) {...return(1
7430: 29 3b 0a 09 7d 0a 0a 09 64 75 70 32 5f 72 65 74  );..}...dup2_ret
7440: 20 3d 20 64 75 70 32 28 66 64 5f 69 6e 2c 20 53   = dup2(fd_in, S
7450: 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 3b 0a 09 69  TDIN_FILENO);..i
7460: 66 20 28 64 75 70 32 5f 72 65 74 20 21 3d 20 53  f (dup2_ret != S
7470: 54 44 49 4e 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09  TDIN_FILENO) {..
7480: 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
7490: 09 64 75 70 32 5f 72 65 74 20 3d 20 64 75 70 32  .dup2_ret = dup2
74a0: 28 66 64 5f 6f 75 74 2c 20 53 54 44 4f 55 54 5f  (fd_out, STDOUT_
74b0: 46 49 4c 45 4e 4f 29 3b 0a 09 69 66 20 28 64 75  FILENO);..if (du
74c0: 70 32 5f 72 65 74 20 21 3d 20 53 54 44 4f 55 54  p2_ret != STDOUT
74d0: 5f 46 49 4c 45 4e 4f 29 20 7b 0a 09 09 72 65 74  _FILENO) {...ret
74e0: 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 64 75 70  urn(1);..}...dup
74f0: 32 5f 72 65 74 20 3d 20 64 75 70 32 28 66 64 5f  2_ret = dup2(fd_
7500: 6f 75 74 2c 20 53 54 44 45 52 52 5f 46 49 4c 45  out, STDERR_FILE
7510: 4e 4f 29 3b 0a 09 69 66 20 28 64 75 70 32 5f 72  NO);..if (dup2_r
7520: 65 74 20 21 3d 20 53 54 44 45 52 52 5f 46 49 4c  et != STDERR_FIL
7530: 45 4e 4f 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ENO) {...return(
7540: 31 29 3b 0a 09 7d 0a 0a 09 63 6c 6f 73 65 28 66  1);..}...close(f
7550: 64 5f 69 6e 29 3b 0a 09 63 6c 6f 73 65 28 66 64  d_in);..close(fd
7560: 5f 6f 75 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  _out);...return(
7570: 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 70 72  0);.}../* Run pr
7580: 6f 63 65 73 73 20 2a 2f 0a 69 6e 74 20 6d 61 69  ocess */.int mai
7590: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
75a0: 20 2a 2a 61 72 67 76 29 20 7b 0a 09 73 74 72 75   **argv) {..stru
75b0: 63 74 20 6f 70 74 69 6f 6e 20 6f 70 74 69 6f 6e  ct option option
75c0: 73 5b 31 31 5d 3b 0a 09 63 6f 6e 73 74 20 63 68  s[11];..const ch
75d0: 61 72 20 2a 62 69 6e 64 5f 61 64 64 72 20 3d 20  ar *bind_addr = 
75e0: 42 49 4e 44 5f 41 44 44 52 2c 20 2a 6e 65 77 72  BIND_ADDR, *newr
75f0: 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 6f 67  oot = NULL, *log
7600: 5f 66 69 6c 65 20 3d 20 4c 4f 47 5f 46 49 4c 45  _file = LOG_FILE
7610: 3b 0a 09 46 49 4c 45 20 2a 6c 6f 67 5f 66 70 3b  ;..FILE *log_fp;
7620: 0a 09 75 69 64 5f 74 20 75 73 65 72 20 3d 20 30  ..uid_t user = 0
7630: 3b 0a 09 69 6e 74 20 70 6f 72 74 20 3d 20 50 4f  ;..int port = PO
7640: 52 54 2c 20 74 68 72 65 61 64 5f 63 6f 75 6e 74  RT, thread_count
7650: 20 3d 20 54 48 52 45 41 44 5f 43 4f 55 4e 54 3b   = THREAD_COUNT;
7660: 0a 09 69 6e 74 20 63 61 63 68 65 5f 73 69 7a 65  ..int cache_size
7670: 20 3d 20 43 41 43 48 45 5f 53 49 5a 45 3b 0a 09   = CACHE_SIZE;..
7680: 69 6e 74 20 69 6e 69 74 5f 72 65 74 2c 20 63 68  int init_ret, ch
7690: 72 6f 6f 74 5f 72 65 74 2c 20 73 65 74 75 69 64  root_ret, setuid
76a0: 5f 72 65 74 2c 20 6c 6f 6f 6b 75 70 5f 72 65 74  _ret, lookup_ret
76b0: 2c 20 63 68 64 69 72 5f 72 65 74 3b 0a 09 69 6e  , chdir_ret;..in
76c0: 74 20 73 65 74 75 69 64 5f 65 6e 61 62 6c 65 64  t setuid_enabled
76d0: 20 3d 20 30 2c 20 64 61 65 6d 6f 6e 5f 65 6e 61   = 0, daemon_ena
76e0: 62 6c 65 64 20 3d 20 30 3b 0a 09 69 6e 74 20 63  bled = 0;..int c
76f0: 68 3b 0a 09 69 6e 74 20 66 64 3b 0a 0a 09 2f 2a  h;..int fd;.../*
7700: 20 50 72 6f 63 65 73 73 20 61 72 67 75 6d 65 6e   Process argumen
7710: 74 73 20 2a 2f 0a 09 66 69 6c 65 64 5f 67 65 74  ts */..filed_get
7720: 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74 28  opt_long_setopt(
7730: 26 6f 70 74 69 6f 6e 73 5b 30 5d 2c 20 22 70 6f  &options[0], "po
7740: 72 74 22 2c 20 72 65 71 75 69 72 65 64 5f 61 72  rt", required_ar
7750: 67 75 6d 65 6e 74 2c 20 27 70 27 29 3b 0a 09 66  gument, 'p');..f
7760: 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67  iled_getopt_long
7770: 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73  _setopt(&options
7780: 5b 31 5d 2c 20 22 74 68 72 65 61 64 73 22 2c 20  [1], "threads", 
7790: 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e  required_argumen
77a0: 74 2c 20 27 74 27 29 3b 0a 09 66 69 6c 65 64 5f  t, 't');..filed_
77b0: 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f  getopt_long_seto
77c0: 70 74 28 26 6f 70 74 69 6f 6e 73 5b 32 5d 2c 20  pt(&options[2], 
77d0: 22 63 61 63 68 65 22 2c 20 72 65 71 75 69 72 65  "cache", require
77e0: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 63 27 29  d_argument, 'c')
77f0: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
7800: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
7810: 69 6f 6e 73 5b 33 5d 2c 20 22 62 69 6e 64 22 2c  ions[3], "bind",
7820: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
7830: 6e 74 2c 20 27 62 27 29 3b 0a 09 66 69 6c 65 64  nt, 'b');..filed
7840: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
7850: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 34 5d 2c  opt(&options[4],
7860: 20 22 75 73 65 72 22 2c 20 72 65 71 75 69 72 65   "user", require
7870: 64 5f 61 72 67 75 6d 65 6e 74 2c 20 27 75 27 29  d_argument, 'u')
7880: 3b 0a 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f  ;..filed_getopt_
7890: 6c 6f 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74  long_setopt(&opt
78a0: 69 6f 6e 73 5b 35 5d 2c 20 22 72 6f 6f 74 22 2c  ions[5], "root",
78b0: 20 72 65 71 75 69 72 65 64 5f 61 72 67 75 6d 65   required_argume
78c0: 6e 74 2c 20 27 72 27 29 3b 0a 09 66 69 6c 65 64  nt, 'r');..filed
78d0: 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74  _getopt_long_set
78e0: 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 36 5d 2c  opt(&options[6],
78f0: 20 22 68 65 6c 70 22 2c 20 6e 6f 5f 61 72 67 75   "help", no_argu
7900: 6d 65 6e 74 2c 20 27 68 27 29 3b 0a 09 66 69 6c  ment, 'h');..fil
7910: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
7920: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 37  etopt(&options[7
7930: 5d 2c 20 22 64 61 65 6d 6f 6e 22 2c 20 6e 6f 5f  ], "daemon", no_
7940: 61 72 67 75 6d 65 6e 74 2c 20 27 64 27 29 3b 0a  argument, 'd');.
7950: 09 66 69 6c 65 64 5f 67 65 74 6f 70 74 5f 6c 6f  .filed_getopt_lo
7960: 6e 67 5f 73 65 74 6f 70 74 28 26 6f 70 74 69 6f  ng_setopt(&optio
7970: 6e 73 5b 38 5d 2c 20 22 6c 6f 67 22 2c 20 72 65  ns[8], "log", re
7980: 71 75 69 72 65 64 5f 61 72 67 75 6d 65 6e 74 2c  quired_argument,
7990: 20 27 6c 27 29 3b 0a 09 66 69 6c 65 64 5f 67 65   'l');..filed_ge
79a0: 74 6f 70 74 5f 6c 6f 6e 67 5f 73 65 74 6f 70 74  topt_long_setopt
79b0: 28 26 6f 70 74 69 6f 6e 73 5b 39 5d 2c 20 22 76  (&options[9], "v
79c0: 65 72 73 69 6f 6e 22 2c 20 6e 6f 5f 61 72 67 75  ersion", no_argu
79d0: 6d 65 6e 74 2c 20 27 76 27 29 3b 0a 09 66 69 6c  ment, 'v');..fil
79e0: 65 64 5f 67 65 74 6f 70 74 5f 6c 6f 6e 67 5f 73  ed_getopt_long_s
79f0: 65 74 6f 70 74 28 26 6f 70 74 69 6f 6e 73 5b 31  etopt(&options[1
7a00: 30 5d 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b  0], NULL, 0, 0);
7a10: 0a 09 77 68 69 6c 65 20 28 28 63 68 20 3d 20 67  ..while ((ch = g
7a20: 65 74 6f 70 74 5f 6c 6f 6e 67 28 61 72 67 63 2c  etopt_long(argc,
7a30: 20 61 72 67 76 2c 20 22 70 3a 74 3a 63 3a 62 3a   argv, "p:t:c:b:
7a40: 75 3a 72 3a 6c 3a 68 64 76 22 2c 20 6f 70 74 69  u:r:l:hdv", opti
7a50: 6f 6e 73 2c 20 4e 55 4c 4c 29 29 20 21 3d 20 2d  ons, NULL)) != -
7a60: 31 29 20 7b 0a 09 09 73 77 69 74 63 68 28 63 68  1) {...switch(ch
7a70: 29 20 7b 0a 09 09 09 63 61 73 65 20 27 70 27 3a  ) {....case 'p':
7a80: 0a 09 09 09 09 70 6f 72 74 20 3d 20 61 74 6f 69  .....port = atoi
7a90: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
7aa0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 74 27  eak;....case 't'
7ab0: 3a 0a 09 09 09 09 74 68 72 65 61 64 5f 63 6f 75  :.....thread_cou
7ac0: 6e 74 20 3d 20 61 74 6f 69 28 6f 70 74 61 72 67  nt = atoi(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 63 27 3a 0a 09 09 09 09 63  .case 'c':.....c
7af0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 61 74 6f 69  ache_size = atoi
7b00: 28 6f 70 74 61 72 67 29 3b 0a 09 09 09 09 62 72  (optarg);.....br
7b10: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 27 62 27  eak;....case 'b'
7b20: 3a 0a 09 09 09 09 62 69 6e 64 5f 61 64 64 72 20  :.....bind_addr 
7b30: 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72 67 29  = strdup(optarg)
7b40: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
7b50: 63 61 73 65 20 27 75 27 3a 0a 09 09 09 09 73 65  case 'u':.....se
7b60: 74 75 69 64 5f 65 6e 61 62 6c 65 64 20 3d 20 31  tuid_enabled = 1
7b70: 3b 0a 09 09 09 09 6c 6f 6f 6b 75 70 5f 72 65 74  ;.....lookup_ret
7b80: 20 3d 20 66 69 6c 65 64 5f 75 73 65 72 5f 6c 6f   = filed_user_lo
7b90: 6f 6b 75 70 28 6f 70 74 61 72 67 2c 20 26 75 73  okup(optarg, &us
7ba0: 65 72 29 3b 0a 09 09 09 09 69 66 20 28 6c 6f 6f  er);.....if (loo
7bb0: 6b 75 70 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  kup_ret != 0) {.
7bc0: 09 09 09 09 09 66 69 6c 65 64 5f 70 72 69 6e 74  .....filed_print
7bd0: 5f 68 65 6c 70 28 73 74 64 65 72 72 2c 20 30 2c  _help(stderr, 0,
7be0: 20 22 49 6e 76 61 6c 69 64 20 75 73 65 72 6e 61   "Invalid userna
7bf0: 6d 65 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  me specified");.
7c00: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b  ......return(1);
7c10: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
7c20: 3b 0a 09 09 09 63 61 73 65 20 27 72 27 3a 0a 09  ;....case 'r':..
7c30: 09 09 09 6e 65 77 72 6f 6f 74 20 3d 20 73 74 72  ...newroot = str
7c40: 64 75 70 28 6f 70 74 61 72 67 29 3b 0a 09 09 09  dup(optarg);....
7c50: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
7c60: 27 6c 27 3a 0a 09 09 09 09 6c 6f 67 5f 66 69 6c  'l':.....log_fil
7c70: 65 20 3d 20 73 74 72 64 75 70 28 6f 70 74 61 72  e = strdup(optar
7c80: 67 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  g);.....break;..
7c90: 09 09 63 61 73 65 20 27 64 27 3a 0a 09 09 09 09  ..case 'd':.....
7ca0: 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65 64 20 3d  daemon_enabled =
7cb0: 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09   1;.....break;..
7cc0: 09 09 63 61 73 65 20 27 76 27 3a 0a 09 09 09 09  ..case 'v':.....
7cd0: 70 72 69 6e 74 66 28 22 66 69 6c 65 64 20 76 65  printf("filed ve
7ce0: 72 73 69 6f 6e 20 25 73 5c 6e 22 2c 20 46 49 4c  rsion %s\n", FIL
7cf0: 45 44 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 09  ED_VERSION);....
7d00: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 09 09  ..return(0);....
7d10: 63 61 73 65 20 27 3f 27 3a 0a 09 09 09 63 61 73  case '?':....cas
7d20: 65 20 27 3a 27 3a 0a 09 09 09 09 66 69 6c 65 64  e ':':.....filed
7d30: 5f 70 72 69 6e 74 5f 68 65 6c 70 28 73 74 64 65  _print_help(stde
7d40: 72 72 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  rr, 0, NULL);...
7d50: 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
7d60: 09 63 61 73 65 20 27 68 27 3a 0a 09 09 09 09 66  .case 'h':.....f
7d70: 69 6c 65 64 5f 70 72 69 6e 74 5f 68 65 6c 70 28  iled_print_help(
7d80: 73 74 64 6f 75 74 2c 20 31 2c 20 4e 55 4c 4c 29  stdout, 1, NULL)
7d90: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 30 29  ;......return(0)
7da0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 4f 70  ;...}..}.../* Op
7db0: 65 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 09  en log file */..
7dc0: 6c 6f 67 5f 66 70 20 3d 20 66 69 6c 65 64 5f 6c  log_fp = filed_l
7dd0: 6f 67 5f 6f 70 65 6e 28 6c 6f 67 5f 66 69 6c 65  og_open(log_file
7de0: 29 3b 0a 09 69 66 20 28 6c 6f 67 5f 66 70 20 3d  );..if (log_fp =
7df0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 65 72 72  = NULL) {...perr
7e00: 6f 72 28 22 66 69 6c 65 64 5f 6c 6f 67 5f 6f 70  or("filed_log_op
7e10: 65 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  en");....return(
7e20: 34 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  4);..}.../* Crea
7e30: 74 65 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63  te listening soc
7e40: 6b 65 74 20 2a 2f 0a 09 66 64 20 3d 20 66 69 6c  ket */..fd = fil
7e50: 65 64 5f 6c 69 73 74 65 6e 28 62 69 6e 64 5f 61  ed_listen(bind_a
7e60: 64 64 72 2c 20 70 6f 72 74 29 3b 0a 09 69 66 20  ddr, port);..if 
7e70: 28 66 64 20 3c 20 30 29 20 7b 0a 09 09 70 65 72  (fd < 0) {...per
7e80: 72 6f 72 28 22 66 69 6c 65 64 5f 6c 69 73 74 65  ror("filed_liste
7e90: 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  n");....return(1
7ea0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 63 6f 6d  );..}.../* Becom
7eb0: 65 20 61 20 64 61 65 6d 6f 6e 20 2a 2f 0a 09 69  e a daemon */..i
7ec0: 66 20 28 64 61 65 6d 6f 6e 5f 65 6e 61 62 6c 65  f (daemon_enable
7ed0: 64 29 20 7b 0a 09 09 69 6e 69 74 5f 72 65 74 20  d) {...init_ret 
7ee0: 3d 20 66 69 6c 65 64 5f 64 61 65 6d 6f 6e 69 7a  = filed_daemoniz
7ef0: 65 28 29 3b 0a 09 09 69 66 20 28 69 6e 69 74 5f  e();...if (init_
7f00: 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 70  ret != 0) {....p
7f10: 65 72 72 6f 72 28 22 66 69 6c 65 64 5f 64 61 65  error("filed_dae
7f20: 6d 6f 6e 69 7a 65 22 29 3b 0a 0a 09 09 09 72 65  monize");.....re
7f30: 74 75 72 6e 28 36 29 3b 0a 09 09 7d 0a 09 7d 0a  turn(6);...}..}.
7f40: 0a 09 2f 2a 20 43 68 72 6f 6f 74 2c 20 69 66 20  ../* Chroot, if 
7f50: 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 09  appropriate */..
7f60: 69 66 20 28 6e 65 77 72 6f 6f 74 29 20 7b 0a 09  if (newroot) {..
7f70: 09 63 68 64 69 72 5f 72 65 74 20 3d 20 63 68 64  .chdir_ret = chd
7f80: 69 72 28 6e 65 77 72 6f 6f 74 29 3b 0a 09 09 69  ir(newroot);...i
7f90: 66 20 28 63 68 64 69 72 5f 72 65 74 20 21 3d 20  f (chdir_ret != 
7fa0: 30 29 20 7b 0a 09 09 09 70 65 72 72 6f 72 28 22  0) {....perror("
7fb0: 63 68 64 69 72 22 29 3b 0a 0a 09 09 09 72 65 74  chdir");.....ret
7fc0: 75 72 6e 28 31 29 3b 0a 09 09 7d 0a 0a 09 09 63  urn(1);...}....c
7fd0: 68 72 6f 6f 74 5f 72 65 74 20 3d 20 63 68 72 6f  hroot_ret = chro
7fe0: 6f 74 28 22 2e 22 29 3b 0a 09 09 69 66 20 28 63  ot(".");...if (c
7ff0: 68 72 6f 6f 74 5f 72 65 74 20 21 3d 20 30 29 20  hroot_ret != 0) 
8000: 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 63 68 72  {....perror("chr
8010: 6f 6f 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  oot");.....retur
8020: 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(1);...}..}.../
8030: 2a 20 44 72 6f 70 20 70 72 69 76 69 6c 65 67 65  * Drop privilege
8040: 73 2c 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  s, if appropriat
8050: 65 20 2a 2f 0a 09 69 66 20 28 73 65 74 75 69 64  e */..if (setuid
8060: 5f 65 6e 61 62 6c 65 64 29 20 7b 0a 09 09 73 65  _enabled) {...se
8070: 74 75 69 64 5f 72 65 74 20 3d 20 73 65 74 75 69  tuid_ret = setui
8080: 64 28 75 73 65 72 29 3b 0a 09 09 69 66 20 28 73  d(user);...if (s
8090: 65 74 75 69 64 5f 72 65 74 20 21 3d 20 30 29 20  etuid_ret != 0) 
80a0: 7b 0a 09 09 09 70 65 72 72 6f 72 28 22 73 65 74  {....perror("set
80b0: 75 69 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uid");.....retur
80c0: 6e 28 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  n(1);...}..}.../
80d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a  * Initialize */.
80e0: 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c 65  .init_ret = file
80f0: 64 5f 69 6e 69 74 28 63 61 63 68 65 5f 73 69 7a  d_init(cache_siz
8100: 65 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72 65  e);..if (init_re
8110: 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72 72  t != 0) {...perr
8120: 6f 72 28 22 66 69 6c 65 64 5f 69 6e 69 74 22 29  or("filed_init")
8130: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 33 29 3b 0a  ;....return(3);.
8140: 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 6c  .}.../* Create l
8150: 6f 67 67 69 6e 67 20 74 68 72 65 61 64 20 2a 2f  ogging thread */
8160: 0a 09 69 6e 69 74 5f 72 65 74 20 3d 20 66 69 6c  ..init_ret = fil
8170: 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68 72 65 61  ed_logging_threa
8180: 64 5f 69 6e 69 74 28 6c 6f 67 5f 66 70 29 3b 0a  d_init(log_fp);.
8190: 09 69 66 20 28 69 6e 69 74 5f 72 65 74 20 21 3d  .if (init_ret !=
81a0: 20 30 29 20 7b 0a 09 09 70 65 72 72 6f 72 28 22   0) {...perror("
81b0: 66 69 6c 65 64 5f 6c 6f 67 67 69 6e 67 5f 74 68  filed_logging_th
81c0: 72 65 61 64 5f 69 6e 69 74 22 29 3b 0a 0a 09 09  read_init");....
81d0: 72 65 74 75 72 6e 28 34 29 3b 0a 09 7d 0a 0a 09  return(4);..}...
81e0: 2f 2a 20 43 72 65 61 74 65 20 77 6f 72 6b 65 72  /* Create worker
81f0: 20 74 68 72 65 61 64 73 20 2a 2f 0a 09 69 6e 69   threads */..ini
8200: 74 5f 72 65 74 20 3d 20 66 69 6c 65 64 5f 77 6f  t_ret = filed_wo
8210: 72 6b 65 72 5f 74 68 72 65 61 64 73 5f 69 6e 69  rker_threads_ini
8220: 74 28 66 64 2c 20 74 68 72 65 61 64 5f 63 6f 75  t(fd, thread_cou
8230: 6e 74 29 3b 0a 09 69 66 20 28 69 6e 69 74 5f 72  nt);..if (init_r
8240: 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 70 65 72  et != 0) {...per
8250: 72 6f 72 28 22 66 69 6c 65 64 5f 77 6f 72 6b 65  ror("filed_worke
8260: 72 5f 74 68 72 65 61 64 73 5f 69 6e 69 74 22 29  r_threads_init")
8270: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 35 29 3b 0a  ;....return(5);.
8280: 09 7d 0a 0a 09 2f 2a 20 57 61 69 74 20 66 6f 72  .}.../* Wait for
8290: 20 74 68 72 65 61 64 73 20 74 6f 20 65 78 69 74   threads to exit
82a0: 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 54 4f 44 4f   */../* XXX:TODO
82b0: 3a 20 4d 6f 6e 69 74 6f 72 20 74 68 72 65 61 64  : Monitor thread
82c0: 20 75 73 61 67 65 20 2a 2f 0a 09 77 68 69 6c 65   usage */..while
82d0: 20 28 31 29 20 7b 0a 09 09 73 6c 65 65 70 28 36   (1) {...sleep(6
82e0: 30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 74 75  0);..}.../* Retu
82f0: 72 6e 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  rn in failure */
8300: 0a 09 72 65 74 75 72 6e 28 32 29 3b 0a 7d 0a     ..return(2);.}.