diff --git a/bin/t01.c b/bin/t01.c index 4c406ea..45e8ca6 100644 --- a/bin/t01.c +++ b/bin/t01.c @@ -976,7 +976,7 @@ if (hio_htre_getcontentlen(req) > 0) else if (hio_comp_bcstr_limited(qpath, "/cgi/", 5, 1) == 0) x = hio_svc_htts_docgi(htts, csck, req, "", qpath + 4, 0); else - x = hio_svc_htts_dofile(htts, csck, req, "", qpath, "text/plain", 0); + x = hio_svc_htts_dofile(htts, csck, req, "", qpath, "text/plain", 0, HIO_NULL); if (x <= -1) goto oops; } #if 0 diff --git a/bin/t06.c b/bin/t06.c index 05de469..d012cbf 100644 --- a/bin/t06.c +++ b/bin/t06.c @@ -211,7 +211,7 @@ if (hio_htre_getcontentlen(req) > 0) x = hio_svc_htts_dofcgi(htts, csck, req, &fcgis_addr, 0); } else - x = hio_svc_htts_dofile(htts, csck, req, "", qpath, "text/plain", 0); + x = hio_svc_htts_dofile(htts, csck, req, "", qpath, "text/plain", 0, HIO_NULL); if (x <= -1) goto oops; } #if 0 diff --git a/bin/webs.c b/bin/webs.c index 1d8b2a6..782b98a 100644 --- a/bin/webs.c +++ b/bin/webs.c @@ -84,7 +84,7 @@ static int process_http_request (hio_svc_htts_t* htts, hio_dev_sck_t* csck, hio_ else // if (mth == HIO_HTTP_GET || mth == HIO_HTTP_POST) { /* TODO: proper mime-type */ - if (hio_svc_htts_dofile(htts, csck, req, ext->docroot, qpath, HIO_NULL, 0) <= -1) goto oops; + if (hio_svc_htts_dofile(htts, csck, req, ext->docroot, qpath, HIO_NULL, 0, HIO_NULL) <= -1) goto oops; } #if 0 else diff --git a/lib/hio-http.h b/lib/hio-http.h index b5f40c1..d6c4d9e 100644 --- a/lib/hio-http.h +++ b/lib/hio-http.h @@ -137,7 +137,6 @@ typedef void (*hio_svc_htts_thr_func_t) ( /* -------------------------------------------------------------- */ - enum hio_svc_htts_cgi_option_t { HIO_SVC_HTTS_CGI_NO_100_CONTINUE = (1 << 0) @@ -162,6 +161,12 @@ enum hio_svc_htts_txt_option_t }; #endif +struct hio_svc_htts_file_cbs_t +{ + int (*bfmt_dir) (hio_svc_htts_t* htts, const hio_bch_t* name); +}; +typedef struct hio_svc_htts_file_cbs_t hio_svc_htts_file_cbs_t; + #if defined(__cplusplus) extern "C" { #endif @@ -341,17 +346,18 @@ HIO_EXPORT int hio_svc_htts_dofcgi ( hio_dev_sck_t* csck, hio_htre_t* req, const hio_skad_t* fcgis_addr, - int options + int options /**< 0 or bitwise-Ored of #hio_svc_htts_file_option_t enumerators */ ); HIO_EXPORT int hio_svc_htts_dofile ( - hio_svc_htts_t* htts, - hio_dev_sck_t* csck, - hio_htre_t* req, - const hio_bch_t* docroot, - const hio_bch_t* filepath, - const hio_bch_t* mime_type, - int options + hio_svc_htts_t* htts, + hio_dev_sck_t* csck, + hio_htre_t* req, + const hio_bch_t* docroot, + const hio_bch_t* filepath, + const hio_bch_t* mime_type, + int options, + hio_svc_htts_file_cbs_t* cbs ); HIO_EXPORT int hio_svc_htts_dothr ( diff --git a/lib/hio-opt.h b/lib/hio-opt.h index 0470ae7..7dc7652 100644 --- a/lib/hio-opt.h +++ b/lib/hio-opt.h @@ -73,18 +73,18 @@ struct hio_bopt_lng_t struct hio_bopt_t { /* input */ - const hio_bch_t* str; /* option string */ - hio_bopt_lng_t* lng; /* long options */ + const hio_bch_t* str; /**< option string */ + hio_bopt_lng_t* lng; /**< long options */ /* output */ - hio_bci_t opt; /* character checked for validity */ - hio_bch_t* arg; /* argument associated with an option */ + hio_bci_t opt; /**< character checked for validity */ + hio_bch_t* arg; /**< argument associated with an option */ /* output */ const hio_bch_t* lngopt; /* input + output */ - int ind; /* index into parent argv vector */ + int ind; /**< index into parent argv vector */ /* input + output - internal*/ hio_bch_t* cur; @@ -95,7 +95,7 @@ extern "C" { #endif /** - * The hio_getopt() function processes the \a argc command-line arguments + * The hio_getuopt() function processes the \a argc command-line arguments * pointed to by \a argv as configured in \a opt. It can process two * different option styles: a single character starting with '-', and a * long name starting with '--'. @@ -107,7 +107,7 @@ extern "C" { * - \b ? indicates a bad option stored in the \a opt->opt field. * - \b : indicates a bad parameter for an option stored in the \a opt->opt field. * - * @return an option character on success, HIO_CHAR_EOF on no more options. + * @return an option character on success, #HIO_UCI_EOF on no more options. */ HIO_EXPORT hio_uci_t hio_getuopt ( int argc, /* argument count */ @@ -115,6 +115,10 @@ HIO_EXPORT hio_uci_t hio_getuopt ( hio_uopt_t* opt /* option configuration */ ); +/** + * The hio_getbopt() function is analogous to hio_getuopt() except that + * it accepts character strings of the #hio_bch_t type. + */ HIO_EXPORT hio_bci_t hio_getbopt ( int argc, /* argument count */ hio_bch_t* const* argv, /* argument array */ diff --git a/lib/hio.h b/lib/hio.h index 6df1bfd..fe1418c 100644 --- a/lib/hio.h +++ b/lib/hio.h @@ -25,6 +25,10 @@ #ifndef _HIO_H_ #define _HIO_H_ +/** \file + * The file defines basic data types and functions common through the entire + * library. + */ #include #include @@ -259,6 +263,10 @@ struct hio_dev_evcb_t int (*on_write) (hio_dev_t* dev, hio_iolen_t wrlen, void* wrctx, const hio_devaddr_t* dstaddr); }; +/** + * The #hio_q_t type is a basic structure that holds two pointers to the previous + * item and the next to form a circular doubly linked list to used as a queue. + */ struct hio_q_t { hio_q_t* q_next; @@ -297,14 +305,14 @@ struct hio_q_t __nn->q_prev->q_next = __nn; \ } while (0) -/* insert an item at the back of the queue */ +/** The #HIO_Q_ENQ macro inserts an item at the back of the queue. */ /*#define HIO_Q_ENQ(wq,x) HIO_Q_LINK(HIO_Q_TAIL(wq), x, HIO_Q_TAIL(wq)->next)*/ #define HIO_Q_ENQ(wq,x) HIO_Q_LINK(HIO_Q_TAIL(wq), x, wq) -/* remove an item in the front from the queue */ +/** The #HIO_Q_DEQ macro removes an item in the front from the queue. */ #define HIO_Q_DEQ(wq) HIO_Q_UNLINK(HIO_Q_HEAD(wq)) -/* completed write queue */ +/** The #hio_cwq_t type defines a queue of completed writes. */ struct hio_cwq_t { hio_cwq_t* q_next; @@ -331,7 +339,7 @@ struct hio_cwq_t #define HIO_CWQ_ENQ(cwq,x) HIO_CWQ_LINK(HIO_CWQ_TAIL(cwq), (hio_q_t*)x, cwq) #define HIO_CWQ_DEQ(cwq) HIO_CWQ_UNLINK(HIO_CWQ_HEAD(cwq)) -/* write queue */ +/** The #hio_wq_t type defines a queue of pending writes */ struct hio_wq_t { hio_wq_t* q_next; diff --git a/lib/http-file.c b/lib/http-file.c index f5c7085..1bae85c 100644 --- a/lib/http-file.c +++ b/lib/http-file.c @@ -35,6 +35,7 @@ #include #include #include +#include #define FILE_ALLOW_UNLIMITED_REQ_CONTENT_LENGTH @@ -56,6 +57,7 @@ struct file_t HIO_SVC_HTTS_RSRC_HEADER; int options; + hio_svc_htts_file_cbs_t* cbs; hio_oow_t num_pending_writes_to_client; hio_oow_t num_pending_writes_to_peer; int sendfile_ok; @@ -736,12 +738,18 @@ static int open_peer_with_mode (file_t* file, const hio_bch_t* actual_file, int while ((de = readdir(dp))) { /* TODO: do buffering ... */ + #if 0 + /* TODO: call a directory entry formatter callback?? */ + if (file->cbs && file->cbs->bfmt_dir) + { + file->cbs->bfmt_dir(file->htts, de->d_name); + } + #endif if (strcmp(de->d_name, ".") != 0) { write (alt_fd, de->d_name, strlen(de->d_name)); write (alt_fd, "\n", 1); } - /* TODO: call a directory entry formatter callback?? */ } lseek (alt_fd, SEEK_SET, 0); @@ -792,10 +800,8 @@ static HIO_INLINE void set_tcp_cork (hio_dev_sck_t* sck) #endif } -int hio_svc_htts_dofile (hio_svc_htts_t* htts, hio_dev_sck_t* csck, hio_htre_t* req, const hio_bch_t* docroot, const hio_bch_t* filepath, const hio_bch_t* mime_type, int options) +int hio_svc_htts_dofile (hio_svc_htts_t* htts, hio_dev_sck_t* csck, hio_htre_t* req, const hio_bch_t* docroot, const hio_bch_t* filepath, const hio_bch_t* mime_type, int options, hio_svc_htts_file_cbs_t* cbs) { -/* TODO: ETag, Last-Modified... */ - hio_t* hio = htts->hio; hio_svc_htts_cli_t* cli = hio_dev_sck_getxtn(csck); file_t* file = HIO_NULL; @@ -815,6 +821,7 @@ int hio_svc_htts_dofile (hio_svc_htts_t* htts, hio_dev_sck_t* csck, hio_htre_t* if (HIO_UNLIKELY(!file)) goto oops; file->options = options; + file->cbs = cbs; /* the given pointer must outlive the lifespan of the while file handling cycle. */ file->client = cli; file->sendfile_ok = hio_dev_sck_sendfileok(cli->sck); /*file->num_pending_writes_to_client = 0;