📄 cgi.c
字号:
printf ("%s'\">\n", cgi_script_name()); } if (cgi_stylesheet) { printf ("\t<LINK rel=stylesheet href=\"%s\">\n", cgi_stylesheet); } printf ("</HEAD>\n"); printf ("<BODY"); if (cgi_background) { if (*cgi_background == '/') { printf (" background=\"%s\"", cgi_background); } else { printf (" bgcolor=\"%s\"", cgi_background); } } if (cgi_foreground) printf (" text=\"%s\"", cgi_foreground); printf (">\n");}/* */voidcgi_html_end (const char *s){ if (s) { printf ("%s\n", s); } if (cgi_bottomline) { printf ("%s\n", cgi_bottomline); } printf ("</BODY>\n</HTML>\n");}/* */const char *cgi_sourceURL (void){ return (cgi_source_url);}/* */const char *cgi_logdir (void){ return (cgi_loggingdir);}/* */const char *cgi_defaultMTA (void){ return (cgi_defaultmta);}/* */intcgi_init (const char *pname){# define CFG_bg "background"# define CFG_fg "foreground"# define CFG_css "stylesheet"# define CFG_src "source_url"# define CFG_log "loggingdir"# define CFG_btl "bottomline"# define CFG_mta "detaultMTA"# define CFG_desc "meta_desc"# define CFG_keyw "meta_keyw" char cfgfile[PATH_MAX+1]; char buff[MAX_LINE], *p; char key[256], value[256]; FILE *fp; int len; int cfg_num = 0; prog_wp = pname; program = strrchr (pname, '/'); if (program) program++; else program = (char *)pname; if (strstr (program, "nph-")) run_as_nph = 1; strcpy (cfgfile, pname); strcat (cfgfile, ".scf"); fp = fopen (cfgfile, "rb"); if (!fp) { return (0); } while (fgets (buff, MAX_LINE, fp) != NULL) { p = buff; while (*p && (*p == ' ' || *p == '\t')) p++; if (*p == '#') continue; *value = EMPTY; sscanf (p, " %[^= \t] = %[^\n]", key, value); if (*value) { len = strlen (value); if (len > 0) { if (*value == '"') { /* remove quote chars */ memmove (value, value+1, len + 1); p = strrchr (value, '"'); if (p) *p = EMPTY; } else { /* use last white char as end point */ p = strchr (value, '\t'); if (p) *p = EMPTY; else { p = strchr (value, ' '); if (p) *p = EMPTY; } } } } else { continue; }#ifdef DEBUG fprintf (stderr, "key=%s, value=%s\n", key, value);#endif len = strlen (key); if ((len == strlen (CFG_bg)) && (strcmp (key, CFG_bg) ==0)) { cgi_background = (char *) malloc (strlen (value) +1); strcpy (cgi_background, value); } else if ((len == strlen (CFG_fg)) && (strcmp (key, CFG_fg) ==0)) { cgi_foreground = (char *) malloc (strlen (value) +1); strcpy (cgi_foreground, value); } else if ((len == strlen (CFG_css)) && (strcmp (key, CFG_css) ==0)) { cgi_stylesheet = (char *) malloc (strlen (value) +1); strcpy (cgi_stylesheet, value); } else if ((len == strlen (CFG_src)) && (strcmp (key, CFG_src) ==0)) { cgi_source_url = (char *) malloc (strlen (value) +1); strcpy (cgi_source_url, value); } else if ((len == strlen (CFG_log)) && (strcmp (key, CFG_log) ==0)) { cgi_loggingdir = (char *) malloc (strlen (value) +1); strcpy (cgi_loggingdir, value); } else if ((len == strlen (CFG_btl)) && (strcmp (key, CFG_btl) ==0)) { cgi_bottomline = (char *) malloc (strlen (value) +1); strcpy (cgi_bottomline, value); } else if ((len == strlen (CFG_mta)) && (strcmp (key, CFG_mta) ==0)) { cgi_defaultmta = (char *) malloc (strlen (value) +1); strcpy (cgi_defaultmta, value); } else if ((len == strlen (CFG_desc)) && (strcmp (key, CFG_desc) ==0)) { cgi_meta_desc = (char *) malloc (strlen (value) +1); strcpy (cgi_meta_desc, value); } else if ((len == strlen (CFG_keyw)) && (strcmp (key, CFG_keyw) ==0)) { cgi_meta_keyw = (char *) malloc (strlen (value) +1); strcpy (cgi_meta_keyw, value); } else { /* private configuration data */ cfg_num += 2; if (cfg_num == 2) { /* first time */ cgi_cfg = calloc (3, sizeof(char *)); } else { cgi_cfg = realloc (cgi_cfg, (cfg_num+1) * sizeof (char *)); } cgi_cfg[cfg_num-2] = strdup (key); cgi_cfg[cfg_num-1] = strdup (value); cgi_cfg[cfg_num] = NULL; } } fclose (fp); return (1);}/* */intcgi_content (void){ char *c; c = getenv ("CONTENT_TYPE"); if (c) { if (strstr (c, "multipart/form-data")) return (MULTIPART_FORM); } return (0);}/* * returns the method: CGI_METHOD_{GET|POST|PUT} */intcgi_method (void){ const char *method; int rc = 0; method = getenv ("REQUEST_METHOD"); if (method) { if (strcmp (method, "GET") == 0) rc = CGI_METHOD_GET; else if (strcmp (method, "POST") == 0) rc = CGI_METHOD_POST; else if (strcmp (method, "PUT") == 0) rc = CGI_METHOD_PUT; else if (strcmp (method, "DELETE") == 0) rc = CGI_METHOD_DELETE; } return (rc);}/* */static char *hex_to_asc (const char *str, int len){ char *p, *s; char buff[4]; int chr; if (!str) return (NULL); s = (char *) malloc (len + 1); p = s; buff[2] = '\0'; while (*str && len) { if (*str == '%') { strncpy (buff, str+1, 2); sscanf (buff, "%02X", &chr); *p = (unsigned char) chr; str += 3; len -= 3; } else { if (*str == '+') *p = ' '; else *p = *str; str++; len--; } p++; } *p = '\0'; return (s);}/* */char **cgi_parse_string (const char *str){ char **kv = NULL; const char *p, *end; int num = 1, i; int len; if (!str) return (NULL); p = str; while ((p = strchr (p, '&')) != NULL) { num++; p++; } kv = (char **) calloc ((num * 2 +1), sizeof (char **)); p = str; i = 0; do { len = 0; if (*p == '&') { p++; } end = p; while ((*end != '=') && (*end != '\0') && (*end != '&')) { len++; end++; } kv[i] = hex_to_asc (p, len); if (*end == '&') { /* variable has no value .. */ p += len; i++; continue; } p += len+1; end = p; i++; len = 0; while ((*end != '&') && (*end != '\0')) { len++; end++; } kv[i] = hex_to_asc (p, len); if (len > 0) p++; i++; } while ((p = strchr (p, '&')) != NULL); return (kv);}/* * return content length as int */intcgi_content_length (void){ const char *len_env; int len = 0; len_env = getenv ("CONTENT_LENGTH"); if (!len_env) return (0); sscanf (len_env, " %d ", &len); return (len);}/* * read multipart request * still not ready! */mime **cgi_parse_multipart (void){ mime **mpart = NULL; char *boundary; char line[MAX_LINE]; int len, sl, read = 0, max = MAX_LINE; boundary = getenv("CONTENT_TYPE"); boundary = strstr (boundary, "boundary="); len = cgi_content_length (); if (!boundary || !len) return (NULL); if (len < MAX_LINE) max = len; boundary += 9; do { /* find the start boundary */ fgets (line, max, stdin); read += strlen (line); if (strstr (line, boundary)) break; } while (read < len); printf ("found\n"); do { fgets (line, max, stdin); sl = strlen (line); if (sl >= 20) { if (strncasecmp (line, "content-disposition:", 20)) { } } read += sl; } while (read < len); return (mpart);}/* * read stdin and encode query data */char **cgi_parse_stdin (void){ char **form = NULL; char *buff; int len; len = cgi_content_length(); if (!len) return (NULL); buff = (char *) malloc (len+1); buff[len] = '\0'; fread (buff, 1, len, stdin); form = cgi_parse_string(buff); free (buff); return (form);}/* */char **cgi_parse_query (void){ char *qs = getenv ("QUERY_STRING"); if (!qs) return (NULL); return (cgi_parse_string (qs));}/* * parse a formular, not depending on the request method * PUT method not done until now */char **cgi_parse_form (void){ int method; /* changes globals! (cgi_form) */ method = cgi_method(); if (method == CGI_METHOD_POST) { if (cgi_content() == MULTIPART_FORM) cgi_form = (char **) cgi_parse_multipart (); else cgi_form = cgi_parse_stdin(); } else if (method == CGI_METHOD_GET) cgi_form = cgi_parse_query(); else cgi_form = NULL; return (cgi_form);}/* * return the corresponding value for a given key */char *cgi_form_value (const char *key){ char **form; if (!key) return (NULL); if (!cgi_form) return (NULL); form = cgi_form; while (*form) { if (strcmp (key, *form) == 0) return (*(form+1)); form += 2; } return (NULL);}/* * return the corresponding value for a given key */char *cgi_cfg_value (const char *key){ char **cfg; if (!key) return (NULL); if (!cgi_cfg) return (NULL); cfg = cgi_cfg; while (*cfg) { if (strcmp (key, *cfg) == 0) return (*(cfg+1)); cfg += 2; } return (NULL);}/* * set refresh time, use 0 to disable */voidcgi_refresh (int t, char *url){ cgi_refresh_time = t; cgi_refresh_url = url;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -