Merge pull request #16581 from jow-/openwrt-19.07
cgi-io: update to latest Git HEAD
This commit is contained in:
commit
4b79a343fe
5 changed files with 8 additions and 1505 deletions
|
@ -8,10 +8,16 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=cgi-io
|
PKG_NAME:=cgi-io
|
||||||
PKG_RELEASE:=19
|
PKG_RELEASE:=20
|
||||||
|
|
||||||
|
PKG_SOURCE_PROTO:=git
|
||||||
|
PKG_SOURCE_URL=$(PROJECT_GIT)/project/cgi-io.git
|
||||||
|
PKG_SOURCE_DATE:=2021-09-08
|
||||||
|
PKG_SOURCE_VERSION:=98cef9dda63623eff07bd574ad7c98ef282af18d
|
||||||
|
PKG_MIRROR_HASH:=dfbec859e261ef6851f76474739c19baaadc1e5cd3ae2d2b9d56a7782ac79963
|
||||||
|
CMAKE_INSTALL:=1
|
||||||
|
|
||||||
PKG_LICENSE:=GPL-2.0-or-later
|
PKG_LICENSE:=GPL-2.0-or-later
|
||||||
|
|
||||||
PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
|
PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
@ -29,11 +35,6 @@ define Package/cgi-io/description
|
||||||
This package contains an cgi utility that is useful for up/downloading files
|
This package contains an cgi utility that is useful for up/downloading files
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Build/Prepare
|
|
||||||
mkdir -p $(PKG_BUILD_DIR)
|
|
||||||
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/cgi-io/install
|
define Package/cgi-io/install
|
||||||
$(INSTALL_DIR) $(1)/usr/libexec $(1)/www/cgi-bin/
|
$(INSTALL_DIR) $(1)/usr/libexec $(1)/www/cgi-bin/
|
||||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/cgi-io $(1)/usr/libexec
|
$(INSTALL_BIN) $(PKG_BUILD_DIR)/cgi-io $(1)/usr/libexec
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
cmake_minimum_required(VERSION 2.6)
|
|
||||||
|
|
||||||
PROJECT(cgi-io C)
|
|
||||||
|
|
||||||
INCLUDE(CheckFunctionExists)
|
|
||||||
|
|
||||||
FIND_PATH(ubus_include_dir libubus.h)
|
|
||||||
FIND_LIBRARY(ubox NAMES ubox)
|
|
||||||
FIND_LIBRARY(ubus NAMES ubus)
|
|
||||||
INCLUDE_DIRECTORIES(${ubus_include_dir})
|
|
||||||
|
|
||||||
ADD_DEFINITIONS(-Os -Wall -Werror -Wextra --std=gnu99 -g3)
|
|
||||||
ADD_DEFINITIONS(-Wno-unused-parameter -Wmissing-declarations)
|
|
||||||
|
|
||||||
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
|
|
||||||
|
|
||||||
IF(APPLE)
|
|
||||||
INCLUDE_DIRECTORIES(/opt/local/include)
|
|
||||||
LINK_DIRECTORIES(/opt/local/lib)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
ADD_EXECUTABLE(cgi-io main.c multipart_parser.c)
|
|
||||||
TARGET_LINK_LIBRARIES(cgi-io ${ubox} ${ubus})
|
|
||||||
|
|
||||||
INSTALL(TARGETS cgi-io RUNTIME DESTINATION sbin)
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,309 +0,0 @@
|
||||||
/* Based on node-formidable by Felix Geisendörfer
|
|
||||||
* Igor Afonov - afonov@gmail.com - 2012
|
|
||||||
* MIT License - http://www.opensource.org/licenses/mit-license.php
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "multipart_parser.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static void multipart_log(const char * format, ...)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG_MULTIPART
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
|
|
||||||
fprintf(stderr, "[HTTP_MULTIPART_PARSER] %s:%d: ", __FILE__, __LINE__);
|
|
||||||
vfprintf(stderr, format, args);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#define NOTIFY_CB(FOR) \
|
|
||||||
do { \
|
|
||||||
if (p->settings->on_##FOR) { \
|
|
||||||
if (p->settings->on_##FOR(p) != 0) { \
|
|
||||||
return i; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define EMIT_DATA_CB(FOR, ptr, len) \
|
|
||||||
do { \
|
|
||||||
if (p->settings->on_##FOR) { \
|
|
||||||
if (p->settings->on_##FOR(p, ptr, len) != 0) { \
|
|
||||||
return i; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
#define LF 10
|
|
||||||
#define CR 13
|
|
||||||
|
|
||||||
struct multipart_parser {
|
|
||||||
void * data;
|
|
||||||
|
|
||||||
size_t index;
|
|
||||||
size_t boundary_length;
|
|
||||||
|
|
||||||
unsigned char state;
|
|
||||||
|
|
||||||
const multipart_parser_settings* settings;
|
|
||||||
|
|
||||||
char* lookbehind;
|
|
||||||
char multipart_boundary[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
enum state {
|
|
||||||
s_uninitialized = 1,
|
|
||||||
s_start,
|
|
||||||
s_start_boundary,
|
|
||||||
s_header_field_start,
|
|
||||||
s_header_field,
|
|
||||||
s_headers_almost_done,
|
|
||||||
s_header_value_start,
|
|
||||||
s_header_value,
|
|
||||||
s_header_value_almost_done,
|
|
||||||
s_part_data_start,
|
|
||||||
s_part_data,
|
|
||||||
s_part_data_almost_boundary,
|
|
||||||
s_part_data_boundary,
|
|
||||||
s_part_data_almost_end,
|
|
||||||
s_part_data_end,
|
|
||||||
s_part_data_final_hyphen,
|
|
||||||
s_end
|
|
||||||
};
|
|
||||||
|
|
||||||
multipart_parser* multipart_parser_init
|
|
||||||
(const char *boundary, const multipart_parser_settings* settings) {
|
|
||||||
|
|
||||||
multipart_parser* p = malloc(sizeof(multipart_parser) +
|
|
||||||
strlen(boundary) +
|
|
||||||
strlen(boundary) + 9);
|
|
||||||
|
|
||||||
strcpy(p->multipart_boundary, boundary);
|
|
||||||
p->boundary_length = strlen(boundary);
|
|
||||||
|
|
||||||
p->lookbehind = (p->multipart_boundary + p->boundary_length + 1);
|
|
||||||
|
|
||||||
p->index = 0;
|
|
||||||
p->state = s_start;
|
|
||||||
p->settings = settings;
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void multipart_parser_free(multipart_parser* p) {
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void multipart_parser_set_data(multipart_parser *p, void *data) {
|
|
||||||
p->data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *multipart_parser_get_data(multipart_parser *p) {
|
|
||||||
return p->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t multipart_parser_execute(multipart_parser* p, const char *buf, size_t len) {
|
|
||||||
size_t i = 0;
|
|
||||||
size_t mark = 0;
|
|
||||||
char c, cl;
|
|
||||||
int is_last = 0;
|
|
||||||
|
|
||||||
while(i < len) {
|
|
||||||
c = buf[i];
|
|
||||||
is_last = (i == (len - 1));
|
|
||||||
switch (p->state) {
|
|
||||||
case s_start:
|
|
||||||
multipart_log("s_start");
|
|
||||||
p->index = 0;
|
|
||||||
p->state = s_start_boundary;
|
|
||||||
|
|
||||||
/* fallthrough */
|
|
||||||
case s_start_boundary:
|
|
||||||
multipart_log("s_start_boundary");
|
|
||||||
if (p->index == p->boundary_length) {
|
|
||||||
if (c != CR) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
p->index++;
|
|
||||||
break;
|
|
||||||
} else if (p->index == (p->boundary_length + 1)) {
|
|
||||||
if (c != LF) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
p->index = 0;
|
|
||||||
NOTIFY_CB(part_data_begin);
|
|
||||||
p->state = s_header_field_start;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (c != p->multipart_boundary[p->index]) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
p->index++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_header_field_start:
|
|
||||||
multipart_log("s_header_field_start");
|
|
||||||
mark = i;
|
|
||||||
p->state = s_header_field;
|
|
||||||
|
|
||||||
/* fallthrough */
|
|
||||||
case s_header_field:
|
|
||||||
multipart_log("s_header_field");
|
|
||||||
if (c == CR) {
|
|
||||||
p->state = s_headers_almost_done;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == '-') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == ':') {
|
|
||||||
EMIT_DATA_CB(header_field, buf + mark, i - mark);
|
|
||||||
p->state = s_header_value_start;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
cl = tolower(c);
|
|
||||||
if (cl < 'a' || cl > 'z') {
|
|
||||||
multipart_log("invalid character in header name");
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
if (is_last)
|
|
||||||
EMIT_DATA_CB(header_field, buf + mark, (i - mark) + 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_headers_almost_done:
|
|
||||||
multipart_log("s_headers_almost_done");
|
|
||||||
if (c != LF) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->state = s_part_data_start;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_header_value_start:
|
|
||||||
multipart_log("s_header_value_start");
|
|
||||||
if (c == ' ') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mark = i;
|
|
||||||
p->state = s_header_value;
|
|
||||||
|
|
||||||
/* fallthrough */
|
|
||||||
case s_header_value:
|
|
||||||
multipart_log("s_header_value");
|
|
||||||
if (c == CR) {
|
|
||||||
EMIT_DATA_CB(header_value, buf + mark, i - mark);
|
|
||||||
p->state = s_header_value_almost_done;
|
|
||||||
}
|
|
||||||
if (is_last)
|
|
||||||
EMIT_DATA_CB(header_value, buf + mark, (i - mark) + 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_header_value_almost_done:
|
|
||||||
multipart_log("s_header_value_almost_done");
|
|
||||||
if (c != LF) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
p->state = s_header_field_start;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_part_data_start:
|
|
||||||
multipart_log("s_part_data_start");
|
|
||||||
NOTIFY_CB(headers_complete);
|
|
||||||
mark = i;
|
|
||||||
p->state = s_part_data;
|
|
||||||
|
|
||||||
/* fallthrough */
|
|
||||||
case s_part_data:
|
|
||||||
multipart_log("s_part_data");
|
|
||||||
if (c == CR) {
|
|
||||||
EMIT_DATA_CB(part_data, buf + mark, i - mark);
|
|
||||||
mark = i;
|
|
||||||
p->state = s_part_data_almost_boundary;
|
|
||||||
p->lookbehind[0] = CR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (is_last)
|
|
||||||
EMIT_DATA_CB(part_data, buf + mark, (i - mark) + 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_part_data_almost_boundary:
|
|
||||||
multipart_log("s_part_data_almost_boundary");
|
|
||||||
if (c == LF) {
|
|
||||||
p->state = s_part_data_boundary;
|
|
||||||
p->lookbehind[1] = LF;
|
|
||||||
p->index = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
EMIT_DATA_CB(part_data, p->lookbehind, 1);
|
|
||||||
p->state = s_part_data;
|
|
||||||
mark = i --;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_part_data_boundary:
|
|
||||||
multipart_log("s_part_data_boundary");
|
|
||||||
if (p->multipart_boundary[p->index] != c) {
|
|
||||||
EMIT_DATA_CB(part_data, p->lookbehind, 2 + p->index);
|
|
||||||
p->state = s_part_data;
|
|
||||||
mark = i --;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p->lookbehind[2 + p->index] = c;
|
|
||||||
if ((++ p->index) == p->boundary_length) {
|
|
||||||
NOTIFY_CB(part_data_end);
|
|
||||||
p->state = s_part_data_almost_end;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case s_part_data_almost_end:
|
|
||||||
multipart_log("s_part_data_almost_end");
|
|
||||||
if (c == '-') {
|
|
||||||
p->state = s_part_data_final_hyphen;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (c == CR) {
|
|
||||||
p->state = s_part_data_end;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
|
|
||||||
case s_part_data_final_hyphen:
|
|
||||||
multipart_log("s_part_data_final_hyphen");
|
|
||||||
if (c == '-') {
|
|
||||||
NOTIFY_CB(body_end);
|
|
||||||
p->state = s_end;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
|
|
||||||
case s_part_data_end:
|
|
||||||
multipart_log("s_part_data_end");
|
|
||||||
if (c == LF) {
|
|
||||||
p->state = s_header_field_start;
|
|
||||||
NOTIFY_CB(part_data_begin);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
|
|
||||||
case s_end:
|
|
||||||
multipart_log("s_end: %02X", (int) c);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
multipart_log("Multipart parser unrecoverable error");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
++ i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
/* Based on node-formidable by Felix Geisendörfer
|
|
||||||
* Igor Afonov - afonov@gmail.com - 2012
|
|
||||||
* MIT License - http://www.opensource.org/licenses/mit-license.php
|
|
||||||
*/
|
|
||||||
#ifndef _multipart_parser_h
|
|
||||||
#define _multipart_parser_h
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
typedef struct multipart_parser multipart_parser;
|
|
||||||
typedef struct multipart_parser_settings multipart_parser_settings;
|
|
||||||
typedef struct multipart_parser_state multipart_parser_state;
|
|
||||||
|
|
||||||
typedef int (*multipart_data_cb) (multipart_parser*, const char *at, size_t length);
|
|
||||||
typedef int (*multipart_notify_cb) (multipart_parser*);
|
|
||||||
|
|
||||||
struct multipart_parser_settings {
|
|
||||||
multipart_data_cb on_header_field;
|
|
||||||
multipart_data_cb on_header_value;
|
|
||||||
multipart_data_cb on_part_data;
|
|
||||||
|
|
||||||
multipart_notify_cb on_part_data_begin;
|
|
||||||
multipart_notify_cb on_headers_complete;
|
|
||||||
multipart_notify_cb on_part_data_end;
|
|
||||||
multipart_notify_cb on_body_end;
|
|
||||||
};
|
|
||||||
|
|
||||||
multipart_parser* multipart_parser_init
|
|
||||||
(const char *boundary, const multipart_parser_settings* settings);
|
|
||||||
|
|
||||||
void multipart_parser_free(multipart_parser* p);
|
|
||||||
|
|
||||||
size_t multipart_parser_execute(multipart_parser* p, const char *buf, size_t len);
|
|
||||||
|
|
||||||
void multipart_parser_set_data(multipart_parser* p, void* data);
|
|
||||||
void * multipart_parser_get_data(multipart_parser* p);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in a new issue