diff options
Diffstat (limited to 'src/couchdb/priv')
-rw-r--r-- | src/couchdb/priv/Makefile.am | 98 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/http.c | 581 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/http.h | 24 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/main.c | 21 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/sm170.c | 378 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/sm180.c | 387 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/sm185.c | 401 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/utf8.c | 291 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/utf8.h | 19 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/util.c | 237 | ||||
-rw-r--r-- | src/couchdb/priv/couch_js/util.h | 34 | ||||
-rw-r--r-- | src/couchdb/priv/icu_driver/couch_icu_driver.c | 177 | ||||
-rw-r--r-- | src/couchdb/priv/spawnkillable/couchspawnkillable.sh | 20 | ||||
-rw-r--r-- | src/couchdb/priv/spawnkillable/couchspawnkillable_win.c | 145 | ||||
-rw-r--r-- | src/couchdb/priv/stat_descriptions.cfg.in | 50 |
15 files changed, 0 insertions, 2863 deletions
diff --git a/src/couchdb/priv/Makefile.am b/src/couchdb/priv/Makefile.am deleted file mode 100644 index 4a32c0a2..00000000 --- a/src/couchdb/priv/Makefile.am +++ /dev/null @@ -1,98 +0,0 @@ -## Licensed under the Apache License, Version 2.0 (the "License"); you may not -## use this file except in compliance with the License. You may obtain a copy of -## the License at -## -## http://www.apache.org/licenses/LICENSE-2.0 -## -## Unless required by applicable law or agreed to in writing, software -## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -## License for the specific language governing permissions and limitations under -## the License. - -couchlibdir = $(localerlanglibdir)/couch-$(version) -couchprivdir = $(couchlibdir)/priv -couchprivlibdir = $(couchlibdir)/priv/lib - -EXTRA_DIST = \ - spawnkillable/couchspawnkillable.sh \ - stat_descriptions.cfg.in \ - couch_js/sm170.c \ - couch_js/sm180.c \ - couch_js/sm185.c - -CLEANFILES = stat_descriptions.cfg - -ICU_LOCAL_FLAGS = $(ICU_LOCAL_CFLAGS) $(ICU_LOCAL_LDFLAGS) -if WINDOWS -ICU_LOCAL_LIBS=-licuuc -licudt -licuin -else -ICU_LOCAL_LIBS=-licuuc -licudata -licui18n -endif - -couchprivlib_LTLIBRARIES = couch_icu_driver.la -couch_icu_driver_la_SOURCES = icu_driver/couch_icu_driver.c -couch_icu_driver_la_LDFLAGS = -module -avoid-version $(ICU_LOCAL_FLAGS) -couch_icu_driver_la_CFLAGS = $(ICU_LOCAL_FLAGS) -couch_icu_driver_la_LIBADD = $(ICU_LOCAL_LIBS) - -if WINDOWS -couch_icu_driver_la_LDFLAGS += -no-undefined -endif - -COUCHJS_SRCS = \ - couch_js/http.c \ - couch_js/http.h \ - couch_js/main.c \ - couch_js/utf8.c \ - couch_js/utf8.h \ - couch_js/util.h \ - couch_js/util.c - -locallibbin_PROGRAMS = couchjs -couchjs_SOURCES = $(COUCHJS_SRCS) -couchjs_LDFLAGS = $(CURL_LDFLAGS) -couchjs_CFLAGS = -g -Wall -Werror -D_BSD_SOURCE $(CURL_CFLAGS) -couchjs_LDADD = $(CURL_LDFLAGS) @JSLIB@ - -couchpriv_DATA = stat_descriptions.cfg -couchpriv_PROGRAMS = couchspawnkillable - -%.cfg: %.cfg.in - cp $< $@ - -if WINDOWS -couchspawnkillable_SOURCES = spawnkillable/couchspawnkillable_win.c -endif - -if !WINDOWS -couchspawnkillable: spawnkillable/couchspawnkillable.sh - cp $< $@ - chmod +x $@ -endif - -# libtool and automake have defeated markh. For each of our executables -# we end up with 2 copies - one directly in the 'target' folder (eg, 'priv') -# and another - the correct one - in .libs. The former doesn't work but is -# what gets installed for 'couchspawnkillable' - but the correct one for -# couchjs.exe *does* get copied. *shrug* So just clobber it with the -# correct one as the last step. See bug COUCHDB-439 -install-data-hook: - if test -f "$(DESTDIR)$(couchprivlibdir)/couch_icu_driver"; then \ - rm -f "$(DESTDIR)$(couchprivlibdir)/couch_icu_driver.so"; \ - cd "$(DESTDIR)$(couchprivlibdir)" && \ - $(LN_S) couch_icu_driver couch_icu_driver.so; \ - fi -if WINDOWS - $(INSTALL) $(ICU_LOCAL_BIN)/icuuc44.dll $(bindir) - $(INSTALL) $(ICU_LOCAL_BIN)/icudt44.dll $(bindir) - $(INSTALL) $(ICU_LOCAL_BIN)/icuin44.dll $(bindir) - $(INSTALL) $(JS_LIB_BINARY) $(bindir) - $(INSTALL) .libs/couchspawnkillable.exe \ - "$(DESTDIR)$(couchprivdir)/couchspawnkillable.exe" -endif - -uninstall-local: - if test -f "$(DESTDIR)$(couchprivlibdir)/couch_erl_driver"; then \ - rm -f "$(DESTDIR)$(couchprivlibdir)/couch_erl_driver.so"; \ - fi diff --git a/src/couchdb/priv/couch_js/http.c b/src/couchdb/priv/couch_js/http.c deleted file mode 100644 index 77078e35..00000000 --- a/src/couchdb/priv/couch_js/http.c +++ /dev/null @@ -1,581 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <jsapi.h> -#include "config.h" -#include "utf8.h" - - -#include <curl/curl.h> - - -void -http_check_enabled() -{ - return; -} - - -// Map some of the string function names to things which exist on Windows -#ifdef XP_WIN -#define strcasecmp _strcmpi -#define strncasecmp _strnicmp -#define snprintf _snprintf -#endif - - -typedef struct curl_slist CurlHeaders; - - -typedef struct { - int method; - char* url; - CurlHeaders* req_headers; - jsint last_status; -} HTTPData; - - -char* METHODS[] = {"GET", "HEAD", "POST", "PUT", "DELETE", "COPY", NULL}; - - -#define GET 0 -#define HEAD 1 -#define POST 2 -#define PUT 3 -#define DELETE 4 -#define COPY 5 - - -static JSBool -go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t blen); - - -static JSString* -str_from_binary(JSContext* cx, char* data, size_t length); - - -JSBool -http_ctor(JSContext* cx, JSObject* req) -{ - HTTPData* http = NULL; - JSBool ret = JS_FALSE; - - http = (HTTPData*) malloc(sizeof(HTTPData)); - if(!http) - { - JS_ReportError(cx, "Failed to create CouchHTTP instance."); - goto error; - } - - http->method = -1; - http->url = NULL; - http->req_headers = NULL; - http->last_status = -1; - - if(!JS_SetPrivate(cx, req, http)) - { - JS_ReportError(cx, "Failed to set private CouchHTTP data."); - goto error; - } - - ret = JS_TRUE; - goto success; - -error: - if(http) free(http); - -success: - return ret; -} - - -void -http_dtor(JSContext* cx, JSObject* obj) -{ - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, obj); - if(http) { - if(http->url) free(http->url); - if(http->req_headers) curl_slist_free_all(http->req_headers); - free(http); - } -} - - -JSBool -http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc) -{ - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); - char* method = NULL; - int methid; - JSBool ret = JS_FALSE; - - if(!http) { - JS_ReportError(cx, "Invalid CouchHTTP instance."); - goto done; - } - - if(mth == JSVAL_VOID) { - JS_ReportError(cx, "You must specify a method."); - goto done; - } - - method = enc_string(cx, mth, NULL); - if(!method) { - JS_ReportError(cx, "Failed to encode method."); - goto done; - } - - for(methid = 0; METHODS[methid] != NULL; methid++) { - if(strcasecmp(METHODS[methid], method) == 0) break; - } - - if(methid > COPY) { - JS_ReportError(cx, "Invalid method specified."); - goto done; - } - - http->method = methid; - - if(url == JSVAL_VOID) { - JS_ReportError(cx, "You must specify a URL."); - goto done; - } - - if(http->url != NULL) { - free(http->url); - http->url = NULL; - } - - http->url = enc_string(cx, url, NULL); - if(http->url == NULL) { - JS_ReportError(cx, "Failed to encode URL."); - goto done; - } - - if(snc != JSVAL_FALSE) { - JS_ReportError(cx, "Synchronous flag must be false."); - goto done; - } - - if(http->req_headers) { - curl_slist_free_all(http->req_headers); - http->req_headers = NULL; - } - - // Disable Expect: 100-continue - http->req_headers = curl_slist_append(http->req_headers, "Expect:"); - - ret = JS_TRUE; - -done: - if(method) free(method); - return ret; -} - - -JSBool -http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val) -{ - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); - char* keystr = NULL; - char* valstr = NULL; - char* hdrbuf = NULL; - size_t hdrlen = -1; - JSBool ret = JS_FALSE; - - if(!http) { - JS_ReportError(cx, "Invalid CouchHTTP instance."); - goto done; - } - - if(name == JSVAL_VOID) - { - JS_ReportError(cx, "You must speciy a header name."); - goto done; - } - - keystr = enc_string(cx, name, NULL); - if(!keystr) - { - JS_ReportError(cx, "Failed to encode header name."); - goto done; - } - - if(val == JSVAL_VOID) - { - JS_ReportError(cx, "You must specify a header value."); - goto done; - } - - valstr = enc_string(cx, val, NULL); - if(!valstr) - { - JS_ReportError(cx, "Failed to encode header value."); - goto done; - } - - hdrlen = strlen(keystr) + strlen(valstr) + 3; - hdrbuf = (char*) malloc(hdrlen * sizeof(char)); - if(!hdrbuf) { - JS_ReportError(cx, "Failed to allocate header buffer."); - goto done; - } - - snprintf(hdrbuf, hdrlen, "%s: %s", keystr, valstr); - http->req_headers = curl_slist_append(http->req_headers, hdrbuf); - - ret = JS_TRUE; - -done: - if(keystr) free(keystr); - if(valstr) free(valstr); - if(hdrbuf) free(hdrbuf); - return ret; -} - -JSBool -http_send(JSContext* cx, JSObject* req, jsval body) -{ - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); - char* bodystr = NULL; - size_t bodylen = 0; - JSBool ret = JS_FALSE; - - if(!http) { - JS_ReportError(cx, "Invalid CouchHTTP instance."); - goto done; - } - - if(body != JSVAL_VOID && body != JS_GetEmptyStringValue(cx)) { - bodystr = enc_string(cx, body, &bodylen); - if(!bodystr) { - JS_ReportError(cx, "Failed to encode body."); - goto done; - } - } - - ret = go(cx, req, http, bodystr, bodylen); - -done: - if(bodystr) free(bodystr); - return ret; -} - -int -http_status(JSContext* cx, JSObject* req) -{ - HTTPData* http = (HTTPData*) JS_GetPrivate(cx, req); - - if(!http) { - JS_ReportError(cx, "Invalid CouchHTTP instance."); - return JS_FALSE; - } - - return http->last_status; -} - -// Curl Helpers - -typedef struct { - HTTPData* http; - JSContext* cx; - JSObject* resp_headers; - char* sendbuf; - size_t sendlen; - size_t sent; - int sent_once; - char* recvbuf; - size_t recvlen; - size_t read; -} CurlState; - -/* - * I really hate doing this but this doesn't have to be - * uber awesome, it just has to work. - */ -CURL* HTTP_HANDLE = NULL; -char ERRBUF[CURL_ERROR_SIZE]; - -static size_t send_body(void *ptr, size_t size, size_t nmem, void *data); -static int seek_body(void *ptr, curl_off_t offset, int origin); -static size_t recv_body(void *ptr, size_t size, size_t nmem, void *data); -static size_t recv_header(void *ptr, size_t size, size_t nmem, void *data); - -static JSBool -go(JSContext* cx, JSObject* obj, HTTPData* http, char* body, size_t bodylen) -{ - CurlState state; - JSString* jsbody; - JSBool ret = JS_FALSE; - jsval tmp; - - state.cx = cx; - state.http = http; - - state.sendbuf = body; - state.sendlen = bodylen; - state.sent = 0; - state.sent_once = 0; - - state.recvbuf = NULL; - state.recvlen = 0; - state.read = 0; - - if(HTTP_HANDLE == NULL) { - HTTP_HANDLE = curl_easy_init(); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_READFUNCTION, send_body); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKFUNCTION, - (curl_seek_callback) seek_body); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_HEADERFUNCTION, recv_header); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEFUNCTION, recv_body); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOPROGRESS, 1); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_ERRORBUFFER, ERRBUF); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_COOKIEFILE, ""); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_USERAGENT, - "CouchHTTP Client - Relax"); - } - - if(!HTTP_HANDLE) { - JS_ReportError(cx, "Failed to initialize cURL handle."); - goto done; - } - - if(http->method < 0 || http->method > COPY) { - JS_ReportError(cx, "INTERNAL: Unknown method."); - goto done; - } - - curl_easy_setopt(HTTP_HANDLE, CURLOPT_CUSTOMREQUEST, METHODS[http->method]); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 0); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 1); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 0); - - if(http->method == HEAD) { - curl_easy_setopt(HTTP_HANDLE, CURLOPT_NOBODY, 1); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0); - } else if(http->method == POST || http->method == PUT) { - curl_easy_setopt(HTTP_HANDLE, CURLOPT_UPLOAD, 1); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_FOLLOWLOCATION, 0); - } - - if(body && bodylen) { - curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, bodylen); - } else { - curl_easy_setopt(HTTP_HANDLE, CURLOPT_INFILESIZE, 0); - } - - // curl_easy_setopt(HTTP_HANDLE, CURLOPT_VERBOSE, 1); - - curl_easy_setopt(HTTP_HANDLE, CURLOPT_URL, http->url); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_HTTPHEADER, http->req_headers); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_READDATA, &state); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_SEEKDATA, &state); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEHEADER, &state); - curl_easy_setopt(HTTP_HANDLE, CURLOPT_WRITEDATA, &state); - - if(curl_easy_perform(HTTP_HANDLE) != 0) { - JS_ReportError(cx, "Failed to execute HTTP request: %s", ERRBUF); - goto done; - } - - if(!state.resp_headers) { - JS_ReportError(cx, "Failed to recieve HTTP headers."); - goto done; - } - - tmp = OBJECT_TO_JSVAL(state.resp_headers); - if(!JS_DefineProperty( - cx, obj, - "_headers", - tmp, - NULL, NULL, - JSPROP_READONLY - )) { - JS_ReportError(cx, "INTERNAL: Failed to set response headers."); - goto done; - } - - if(state.recvbuf) { - state.recvbuf[state.read] = '\0'; - jsbody = dec_string(cx, state.recvbuf, state.read+1); - if(!jsbody) { - // If we can't decode the body as UTF-8 we forcefully - // convert it to a string by just forcing each byte - // to a jschar. - jsbody = str_from_binary(cx, state.recvbuf, state.read); - if(!jsbody) { - if(!JS_IsExceptionPending(cx)) { - JS_ReportError(cx, "INTERNAL: Failed to decode body."); - } - goto done; - } - } - tmp = STRING_TO_JSVAL(jsbody); - } else { - tmp = JS_GetEmptyStringValue(cx); - } - - if(!JS_DefineProperty( - cx, obj, - "responseText", - tmp, - NULL, NULL, - JSPROP_READONLY - )) { - JS_ReportError(cx, "INTERNAL: Failed to set responseText."); - goto done; - } - - ret = JS_TRUE; - -done: - if(state.recvbuf) JS_free(cx, state.recvbuf); - return ret; -} - -static size_t -send_body(void *ptr, size_t size, size_t nmem, void *data) -{ - CurlState* state = (CurlState*) data; - size_t length = size * nmem; - size_t towrite = state->sendlen - state->sent; - - // Assume this is cURL trying to resend a request that - // failed. - if(towrite == 0 && state->sent_once == 0) { - state->sent_once = 1; - return 0; - } else if(towrite == 0) { - state->sent = 0; - state->sent_once = 0; - towrite = state->sendlen; - } - - if(length < towrite) towrite = length; - - memcpy(ptr, state->sendbuf + state->sent, towrite); - state->sent += towrite; - - return towrite; -} - -static int -seek_body(void* ptr, curl_off_t offset, int origin) -{ - CurlState* state = (CurlState*) ptr; - if(origin != SEEK_SET) return -1; - - state->sent = (size_t) offset; - return (int) state->sent; -} - -static size_t -recv_header(void *ptr, size_t size, size_t nmem, void *data) -{ - CurlState* state = (CurlState*) data; - char code[4]; - char* header = (char*) ptr; - size_t length = size * nmem; - JSString* hdr = NULL; - jsuint hdrlen; - jsval hdrval; - - if(length > 7 && strncasecmp(header, "HTTP/1.", 7) == 0) { - if(length < 12) { - return CURLE_WRITE_ERROR; - } - - memcpy(code, header+9, 3*sizeof(char)); - code[3] = '\0'; - state->http->last_status = atoi(code); - - state->resp_headers = JS_NewArrayObject(state->cx, 0, NULL); - if(!state->resp_headers) { - return CURLE_WRITE_ERROR; - } - - return length; - } - - // We get a notice at the \r\n\r\n after headers. - if(length <= 2) { - return length; - } - - // Append the new header to our array. - hdr = dec_string(state->cx, header, length); - if(!hdr) { - return CURLE_WRITE_ERROR; - } - - if(!JS_GetArrayLength(state->cx, state->resp_headers, &hdrlen)) { - return CURLE_WRITE_ERROR; - } - - hdrval = STRING_TO_JSVAL(hdr); - if(!JS_SetElement(state->cx, state->resp_headers, hdrlen, &hdrval)) { - return CURLE_WRITE_ERROR; - } - - return length; -} - -static size_t -recv_body(void *ptr, size_t size, size_t nmem, void *data) -{ - CurlState* state = (CurlState*) data; - size_t length = size * nmem; - char* tmp = NULL; - - if(!state->recvbuf) { - state->recvlen = 4096; - state->read = 0; - state->recvbuf = JS_malloc(state->cx, state->recvlen); - } - - if(!state->recvbuf) { - return CURLE_WRITE_ERROR; - } - - // +1 so we can add '\0' back up in the go function. - while(length+1 > state->recvlen - state->read) state->recvlen *= 2; - tmp = JS_realloc(state->cx, state->recvbuf, state->recvlen); - if(!tmp) return CURLE_WRITE_ERROR; - state->recvbuf = tmp; - - memcpy(state->recvbuf + state->read, ptr, length); - state->read += length; - return length; -} - -JSString* -str_from_binary(JSContext* cx, char* data, size_t length) -{ - jschar* conv = (jschar*) JS_malloc(cx, length * sizeof(jschar)); - JSString* ret = NULL; - size_t i; - - if(!conv) return NULL; - - for(i = 0; i < length; i++) { - conv[i] = (jschar) data[i]; - } - - ret = JS_NewUCString(cx, conv, length); - if(!ret) JS_free(cx, conv); - - return ret; -} diff --git a/src/couchdb/priv/couch_js/http.h b/src/couchdb/priv/couch_js/http.h deleted file mode 100644 index 373d1e48..00000000 --- a/src/couchdb/priv/couch_js/http.h +++ /dev/null @@ -1,24 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#ifndef COUCH_JS_HTTP_H -#define COUCH_JS_HTTP_H - -void http_check_enabled(); -JSBool http_ctor(JSContext* cx, JSObject* req); -void http_dtor(JSContext* cx, JSObject* req); -JSBool http_open(JSContext* cx, JSObject* req, jsval mth, jsval url, jsval snc); -JSBool http_set_hdr(JSContext* cx, JSObject* req, jsval name, jsval val); -JSBool http_send(JSContext* cx, JSObject* req, jsval body); -int http_status(JSContext* cx, JSObject* req); - -#endif diff --git a/src/couchdb/priv/couch_js/main.c b/src/couchdb/priv/couch_js/main.c deleted file mode 100644 index 209bb023..00000000 --- a/src/couchdb/priv/couch_js/main.c +++ /dev/null @@ -1,21 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#include "config.h" - -#if defined(SM185) -#include "sm185.c" -#elif defined(SM180) -#include "sm180.c" -#else -#include "sm170.c" -#endif diff --git a/src/couchdb/priv/couch_js/sm170.c b/src/couchdb/priv/couch_js/sm170.c deleted file mode 100644 index ebb6673f..00000000 --- a/src/couchdb/priv/couch_js/sm170.c +++ /dev/null @@ -1,378 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include <jsapi.h> -#include "http.h" -#include "utf8.h" -#include "util.h" - - -#ifdef JS_THREADSAFE -#define SETUP_REQUEST(cx) \ - JS_SetContextThread(cx); \ - JS_BeginRequest(cx); -#define FINISH_REQUEST(cx) \ - JS_EndRequest(cx); \ - JS_ClearContextThread(cx); -#else -#define SETUP_REQUEST(cx) -#define FINISH_REQUEST(cx) -#endif - - -static JSBool -req_ctor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - return http_ctor(cx, obj); -} - - -static void -req_dtor(JSContext* cx, JSObject* obj) -{ - http_dtor(cx, obj); -} - - -static JSBool -req_open(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - JSBool ret = JS_FALSE; - - if(argc == 2) { - ret = http_open(cx, obj, argv[0], argv[1], JSVAL_FALSE); - } else if(argc == 3) { - ret = http_open(cx, obj, argv[0], argv[1], argv[2]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.open"); - } - - *rval = JSVAL_VOID; - return ret; -} - - -static JSBool -req_set_hdr(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - JSBool ret = JS_FALSE; - if(argc == 2) { - ret = http_set_hdr(cx, obj, argv[0], argv[1]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.set_header"); - } - - *rval = JSVAL_VOID; - return ret; -} - - -static JSBool -req_send(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - JSBool ret = JS_FALSE; - if(argc == 1) { - ret = http_send(cx, obj, argv[0]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.send"); - } - - *rval = JSVAL_VOID; - return ret; -} - - -static JSBool -req_status(JSContext* cx, JSObject* obj, jsval idval, jsval* rval) -{ - int status = http_status(cx, obj); - if(status < 0) - return JS_FALSE; - - if(INT_FITS_IN_JSVAL(status)) { - *rval = INT_TO_JSVAL(status); - return JS_TRUE; - } else { - JS_ReportError(cx, "Invalid HTTP status."); - return JS_FALSE; - } -} - - -static JSBool -evalcx(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - JSString *str; - JSObject *sandbox; - JSContext *subcx; - const jschar *src; - size_t srclen; - JSBool ret = JS_FALSE; - - sandbox = NULL; - if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { - return JS_FALSE; - } - - subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); - if(!subcx) { - JS_ReportOutOfMemory(cx); - return JS_FALSE; - } - - SETUP_REQUEST(subcx); - - src = JS_GetStringChars(str); - srclen = JS_GetStringLength(str); - - if(!sandbox) { - sandbox = JS_NewObject(subcx, NULL, NULL, NULL); - if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { - goto done; - } - } - - if(srclen == 0) { - *rval = OBJECT_TO_JSVAL(sandbox); - } else { - JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, rval); - } - - ret = JS_TRUE; - -done: - FINISH_REQUEST(subcx); - JS_DestroyContext(subcx); - return ret; -} - - -static JSBool -gc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - JS_GC(cx); - *rval = JSVAL_VOID; - return JS_TRUE; -} - - -static JSBool -print(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - couch_print(cx, argc, argv); - *rval = JSVAL_VOID; - return JS_TRUE; -} - - -static JSBool -quit(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - int exit_code = 0; - JS_ConvertArguments(cx, argc, argv, "/i", &exit_code); - exit(exit_code); -} - - -static JSBool -readline(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - JSString* line; - - /* GC Occasionally */ - JS_MaybeGC(cx); - - line = couch_readline(cx, stdin); - if(line == NULL) return JS_FALSE; - - *rval = STRING_TO_JSVAL(line); - return JS_TRUE; -} - - -static JSBool -seal(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - JSObject *target; - JSBool deep = JS_FALSE; - - if(!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) - return JS_FALSE; - - if(!target) { - *rval = JSVAL_VOID; - return JS_TRUE; - } - - if(JS_SealObject(cx, obj, deep) != JS_TRUE) - return JS_FALSE; - - *rval = JSVAL_VOID; - return JS_TRUE; -} - - -JSClass CouchHTTPClass = { - "CouchHTTP", - JSCLASS_HAS_PRIVATE - | JSCLASS_CONSTRUCT_PROTOTYPE - | JSCLASS_HAS_RESERVED_SLOTS(2), - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_EnumerateStub, - JS_ResolveStub, - JS_ConvertStub, - req_dtor, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - - -JSPropertySpec CouchHTTPProperties[] = { - {"status", 0, JSPROP_READONLY, req_status, NULL}, - {0, 0, 0, 0, 0} -}; - - -JSFunctionSpec CouchHTTPFunctions[] = { - {"_open", req_open, 3, 0, 0}, - {"_setRequestHeader", req_set_hdr, 2, 0, 0}, - {"_send", req_send, 1, 0, 0}, - {0, 0, 0, 0, 0} -}; - - -static JSClass global_class = { - "GlobalClass", - JSCLASS_GLOBAL_FLAGS, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_EnumerateStub, - JS_ResolveStub, - JS_ConvertStub, - JS_FinalizeStub, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - - -static JSFunctionSpec global_functions[] = { - {"evalcx", evalcx, 0, 0, 0}, - {"gc", gc, 0, 0, 0}, - {"print", print, 0, 0, 0}, - {"quit", quit, 0, 0, 0}, - {"readline", readline, 0, 0, 0}, - {"seal", seal, 0, 0, 0}, - {0, 0, 0, 0, 0} -}; - - -int -main(int argc, const char* argv[]) -{ - JSRuntime* rt = NULL; - JSContext* cx = NULL; - JSObject* global = NULL; - JSObject* klass = NULL; - JSScript* script; - JSString* scriptsrc; - jschar* schars; - size_t slen; - jsval sroot; - jsval result; - - couch_args* args = couch_parse_args(argc, argv); - - rt = JS_NewRuntime(64L * 1024L * 1024L); - if(rt == NULL) - return 1; - - cx = JS_NewContext(rt, args->stack_size); - if(cx == NULL) - return 1; - - JS_SetErrorReporter(cx, couch_error); - JS_ToggleOptions(cx, JSOPTION_XML); - - SETUP_REQUEST(cx); - - global = JS_NewObject(cx, &global_class, NULL, NULL); - if(global == NULL) - return 1; - - JS_SetGlobalObject(cx, global); - - if(!JS_InitStandardClasses(cx, global)) - return 1; - - if(couch_load_funcs(cx, global, global_functions) != JS_TRUE) - return 1; - - if(args->use_http) { - http_check_enabled(); - - klass = JS_InitClass( - cx, global, - NULL, - &CouchHTTPClass, req_ctor, - 0, - CouchHTTPProperties, CouchHTTPFunctions, - NULL, NULL - ); - - if(!klass) - { - fprintf(stderr, "Failed to initialize CouchHTTP class.\n"); - exit(2); - } - } - - // Convert script source to jschars. - scriptsrc = dec_string(cx, args->script, strlen(args->script)); - if(!scriptsrc) - return 1; - - schars = JS_GetStringChars(scriptsrc); - slen = JS_GetStringLength(scriptsrc); - - // Root it so GC doesn't collect it. - sroot = STRING_TO_JSVAL(scriptsrc); - if(JS_AddRoot(cx, &sroot) != JS_TRUE) { - fprintf(stderr, "Internal root error.\n"); - return 1; - } - - // Compile and run - script = JS_CompileUCScript(cx, global, schars, slen, args->script_name, 1); - if(!script) { - fprintf(stderr, "Failed to compile script.\n"); - return 1; - } - - JS_ExecuteScript(cx, global, script, &result); - - // Warning message if we don't remove it. - JS_RemoveRoot(cx, &sroot); - - FINISH_REQUEST(cx); - JS_DestroyContext(cx); - JS_DestroyRuntime(rt); - JS_ShutDown(); - - return 0; -} diff --git a/src/couchdb/priv/couch_js/sm180.c b/src/couchdb/priv/couch_js/sm180.c deleted file mode 100644 index dee16a78..00000000 --- a/src/couchdb/priv/couch_js/sm180.c +++ /dev/null @@ -1,387 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include <jsapi.h> -#include "http.h" -#include "utf8.h" -#include "util.h" - - -#define SETUP_REQUEST(cx) \ - JS_SetContextThread(cx); \ - JS_BeginRequest(cx); -#define FINISH_REQUEST(cx) \ - JS_EndRequest(cx); \ - JS_ClearContextThread(cx); - - -static JSBool -req_ctor(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) -{ - return http_ctor(cx, obj); -} - - -static void -req_dtor(JSContext* cx, JSObject* obj) -{ - http_dtor(cx, obj); -} - - -static JSBool -req_open(JSContext* cx, uintN argc, jsval* vp) -{ - JSObject* obj = JS_THIS_OBJECT(cx, vp); - jsval* argv = JS_ARGV(cx, vp); - JSBool ret = JS_FALSE; - - if(argc == 2) { - ret = http_open(cx, obj, argv[0], argv[1], JSVAL_FALSE); - } else if(argc == 3) { - ret = http_open(cx, obj, argv[0], argv[1], argv[2]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.open"); - } - - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return ret; -} - - -static JSBool -req_set_hdr(JSContext* cx, uintN argc, jsval* vp) -{ - JSObject* obj = JS_THIS_OBJECT(cx, vp); - jsval* argv = JS_ARGV(cx, vp); - JSBool ret = JS_FALSE; - - if(argc == 2) { - ret = http_set_hdr(cx, obj, argv[0], argv[1]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.set_header"); - } - - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return ret; -} - - -static JSBool -req_send(JSContext* cx, uintN argc, jsval* vp) -{ - JSObject* obj = JS_THIS_OBJECT(cx, vp); - jsval* argv = JS_ARGV(cx, vp); - JSBool ret = JS_FALSE; - - if(argc == 1) { - ret = http_send(cx, obj, argv[0]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.send"); - } - - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return ret; -} - - -static JSBool -req_status(JSContext* cx, JSObject* obj, jsval idval, jsval* vp) -{ - int status = http_status(cx, obj); - if(status < 0) - return JS_FALSE; - - if(INT_FITS_IN_JSVAL(status)) { - JS_SET_RVAL(cx, vp, INT_TO_JSVAL(status)); - return JS_TRUE; - } else { - JS_ReportError(cx, "Invalid HTTP status."); - return JS_FALSE; - } -} - - -static JSBool -evalcx(JSContext *cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - JSString *str; - JSObject *sandbox; - JSContext *subcx; - const jschar *src; - size_t srclen; - jsval rval; - JSBool ret = JS_FALSE; - - sandbox = NULL; - if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { - return JS_FALSE; - } - - subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); - if(!subcx) { - JS_ReportOutOfMemory(cx); - return JS_FALSE; - } - - SETUP_REQUEST(subcx); - - src = JS_GetStringChars(str); - srclen = JS_GetStringLength(str); - - if(!sandbox) { - sandbox = JS_NewObject(subcx, NULL, NULL, NULL); - if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { - goto done; - } - } - - if(srclen == 0) { - JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox)); - } else { - JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, &rval); - JS_SET_RVAL(cx, vp, rval); - } - - ret = JS_TRUE; - -done: - FINISH_REQUEST(subcx); - JS_DestroyContext(subcx); - return ret; -} - - -static JSBool -gc(JSContext* cx, uintN argc, jsval* vp) -{ - JS_GC(cx); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; -} - - -static JSBool -print(JSContext* cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - couch_print(cx, argc, argv); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; -} - - -static JSBool -quit(JSContext* cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - int exit_code = 0; - JS_ConvertArguments(cx, argc, argv, "/i", &exit_code); - exit(exit_code); -} - - -static JSBool -readline(JSContext* cx, uintN argc, jsval* vp) -{ - JSString* line; - - /* GC Occasionally */ - JS_MaybeGC(cx); - - line = couch_readline(cx, stdin); - if(line == NULL) return JS_FALSE; - - JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(line)); - return JS_TRUE; -} - - -static JSBool -seal(JSContext* cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - JSObject *target; - JSBool deep = JS_FALSE; - - if(!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) - return JS_FALSE; - - if(!target) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; - } - - if(JS_SealObject(cx, target, deep) != JS_TRUE) - return JS_FALSE; - - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; -} - - -JSClass CouchHTTPClass = { - "CouchHTTP", - JSCLASS_HAS_PRIVATE - | JSCLASS_CONSTRUCT_PROTOTYPE - | JSCLASS_HAS_RESERVED_SLOTS(2), - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_EnumerateStub, - JS_ResolveStub, - JS_ConvertStub, - req_dtor, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - - -JSPropertySpec CouchHTTPProperties[] = { - {"status", 0, JSPROP_READONLY, req_status, NULL}, - {0, 0, 0, 0, 0} -}; - - -JSFunctionSpec CouchHTTPFunctions[] = { - JS_FS("_open", (JSNative) req_open, 3, JSFUN_FAST_NATIVE, 0), - JS_FS("_setRequestHeader", (JSNative) req_set_hdr, 2, JSFUN_FAST_NATIVE, 0), - JS_FS("_send", (JSNative) req_send, 1, JSFUN_FAST_NATIVE, 0), - JS_FS_END -}; - - -static JSClass global_class = { - "GlobalClass", - JSCLASS_GLOBAL_FLAGS, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_EnumerateStub, - JS_ResolveStub, - JS_ConvertStub, - JS_FinalizeStub, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - - -static JSFunctionSpec global_functions[] = { - JS_FS("evalcx", (JSNative) evalcx, 0, JSFUN_FAST_NATIVE, 0), - JS_FS("gc", (JSNative) gc, 0, JSFUN_FAST_NATIVE, 0), - JS_FS("print", (JSNative) print, 0, JSFUN_FAST_NATIVE, 0), - JS_FS("quit", (JSNative) quit, 0, JSFUN_FAST_NATIVE, 0), - JS_FS("readline", (JSNative) readline, 0, JSFUN_FAST_NATIVE, 0), - JS_FS("seal", (JSNative) seal, 0, JSFUN_FAST_NATIVE, 0), - JS_FS_END -}; - - -int -main(int argc, const char* argv[]) -{ - JSRuntime* rt = NULL; - JSContext* cx = NULL; - JSObject* global = NULL; - JSObject* klass = NULL; - JSScript* script; - JSString* scriptsrc; - jschar* schars; - size_t slen; - jsval sroot; - jsval result; - - couch_args* args = couch_parse_args(argc, argv); - - rt = JS_NewRuntime(64L * 1024L * 1024L); - if(rt == NULL) - return 1; - - cx = JS_NewContext(rt, args->stack_size); - if(cx == NULL) - return 1; - - JS_SetErrorReporter(cx, couch_error); - JS_ToggleOptions(cx, JSOPTION_XML); - - SETUP_REQUEST(cx); - - global = JS_NewObject(cx, &global_class, NULL, NULL); - if(global == NULL) - return 1; - - JS_SetGlobalObject(cx, global); - - if(!JS_InitStandardClasses(cx, global)) - return 1; - - if(couch_load_funcs(cx, global, global_functions) != JS_TRUE) - return 1; - - if(args->use_http) { - http_check_enabled(); - - klass = JS_InitClass( - cx, global, - NULL, - &CouchHTTPClass, req_ctor, - 0, - CouchHTTPProperties, CouchHTTPFunctions, - NULL, NULL - ); - - if(!klass) - { - fprintf(stderr, "Failed to initialize CouchHTTP class.\n"); - exit(2); - } - } - - // Convert script source to jschars. - scriptsrc = dec_string(cx, args->script, strlen(args->script)); - if(!scriptsrc) - return 1; - - schars = JS_GetStringChars(scriptsrc); - slen = JS_GetStringLength(scriptsrc); - - // Root it so GC doesn't collect it. - sroot = STRING_TO_JSVAL(scriptsrc); - if(JS_AddRoot(cx, &sroot) != JS_TRUE) { - fprintf(stderr, "Internal root error.\n"); - return 1; - } - - // Compile and run - script = JS_CompileUCScript(cx, global, schars, slen, args->script_name, 1); - if(!script) { - fprintf(stderr, "Failed to compile script.\n"); - return 1; - } - - JS_ExecuteScript(cx, global, script, &result); - - // Warning message if we don't remove it. - JS_RemoveRoot(cx, &sroot); - - FINISH_REQUEST(cx); - JS_DestroyContext(cx); - JS_DestroyRuntime(rt); - JS_ShutDown(); - - return 0; -} diff --git a/src/couchdb/priv/couch_js/sm185.c b/src/couchdb/priv/couch_js/sm185.c deleted file mode 100644 index 701d5677..00000000 --- a/src/couchdb/priv/couch_js/sm185.c +++ /dev/null @@ -1,401 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include <jsapi.h> -#include "http.h" -#include "utf8.h" -#include "util.h" - - -#define SETUP_REQUEST(cx) \ - JS_SetContextThread(cx); \ - JS_BeginRequest(cx); -#define FINISH_REQUEST(cx) \ - JS_EndRequest(cx); \ - JS_ClearContextThread(cx); - - -static JSClass global_class = { - "GlobalClass", - JSCLASS_GLOBAL_FLAGS, - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_StrictPropertyStub, - JS_EnumerateStub, - JS_ResolveStub, - JS_ConvertStub, - JS_FinalizeStub, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - - -static JSBool -req_ctor(JSContext* cx, uintN argc, jsval* vp) -{ - JSBool ret; - JSObject* obj = JS_NewObjectForConstructor(cx, vp); - if(!obj) { - JS_ReportError(cx, "Failed to create CouchHTTP instance.\n"); - return JS_FALSE; - } - ret = http_ctor(cx, obj); - JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj)); - return ret; -} - - -static void -req_dtor(JSContext* cx, JSObject* obj) -{ - http_dtor(cx, obj); -} - - -static JSBool -req_open(JSContext* cx, uintN argc, jsval* vp) -{ - JSObject* obj = JS_THIS_OBJECT(cx, vp); - jsval* argv = JS_ARGV(cx, vp); - JSBool ret = JS_FALSE; - - if(argc == 2) { - ret = http_open(cx, obj, argv[0], argv[1], JSVAL_FALSE); - } else if(argc == 3) { - ret = http_open(cx, obj, argv[0], argv[1], argv[2]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.open"); - } - - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return ret; -} - - -static JSBool -req_set_hdr(JSContext* cx, uintN argc, jsval* vp) -{ - JSObject* obj = JS_THIS_OBJECT(cx, vp); - jsval* argv = JS_ARGV(cx, vp); - JSBool ret = JS_FALSE; - - if(argc == 2) { - ret = http_set_hdr(cx, obj, argv[0], argv[1]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.set_header"); - } - - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return ret; -} - - -static JSBool -req_send(JSContext* cx, uintN argc, jsval* vp) -{ - JSObject* obj = JS_THIS_OBJECT(cx, vp); - jsval* argv = JS_ARGV(cx, vp); - JSBool ret = JS_FALSE; - - if(argc == 1) { - ret = http_send(cx, obj, argv[0]); - } else { - JS_ReportError(cx, "Invalid call to CouchHTTP.send"); - } - - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return ret; -} - - -static JSBool -req_status(JSContext* cx, JSObject* obj, jsid pid, jsval* vp) -{ - int status = http_status(cx, obj); - if(status < 0) - return JS_FALSE; - - JS_SET_RVAL(cx, vp, INT_TO_JSVAL(status)); - return JS_TRUE; -} - - -static JSBool -evalcx(JSContext *cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - JSString* str; - JSObject* sandbox; - JSObject* global; - JSContext* subcx; - JSCrossCompartmentCall* call = NULL; - const jschar* src; - size_t srclen; - jsval rval; - JSBool ret = JS_FALSE; - - sandbox = NULL; - if(!JS_ConvertArguments(cx, argc, argv, "S / o", &str, &sandbox)) { - return JS_FALSE; - } - - subcx = JS_NewContext(JS_GetRuntime(cx), 8L * 1024L); - if(!subcx) { - JS_ReportOutOfMemory(cx); - return JS_FALSE; - } - - SETUP_REQUEST(subcx); - - src = JS_GetStringCharsAndLength(cx, str, &srclen); - - // Re-use the compartment associated with the main context, - // rather than creating a new compartment */ - global = JS_GetGlobalObject(cx); - if(global == NULL) goto done; - call = JS_EnterCrossCompartmentCall(subcx, global); - - if(!sandbox) { - sandbox = JS_NewGlobalObject(subcx, &global_class); - if(!sandbox || !JS_InitStandardClasses(subcx, sandbox)) { - goto done; - } - } - - if(srclen == 0) { - JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sandbox)); - } else { - JS_EvaluateUCScript(subcx, sandbox, src, srclen, NULL, 0, &rval); - JS_SET_RVAL(cx, vp, rval); - } - - ret = JS_TRUE; - -done: - JS_LeaveCrossCompartmentCall(call); - FINISH_REQUEST(subcx); - JS_DestroyContext(subcx); - return ret; -} - - -static JSBool -gc(JSContext* cx, uintN argc, jsval* vp) -{ - JS_GC(cx); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; -} - - -static JSBool -print(JSContext* cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - couch_print(cx, argc, argv); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; -} - - -static JSBool -quit(JSContext* cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - int exit_code = 0; - JS_ConvertArguments(cx, argc, argv, "/i", &exit_code); - exit(exit_code); -} - - -static JSBool -readline(JSContext* cx, uintN argc, jsval* vp) -{ - JSString* line; - - /* GC Occasionally */ - JS_MaybeGC(cx); - - line = couch_readline(cx, stdin); - if(line == NULL) return JS_FALSE; - - JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(line)); - return JS_TRUE; -} - - -static JSBool -seal(JSContext* cx, uintN argc, jsval* vp) -{ - jsval* argv = JS_ARGV(cx, vp); - JSObject *target; - JSBool deep = JS_FALSE; - JSBool ret; - - if(!JS_ConvertArguments(cx, argc, argv, "o/b", &target, &deep)) - return JS_FALSE; - - if(!target) { - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return JS_TRUE; - } - - - ret = deep ? JS_DeepFreezeObject(cx, target) : JS_FreezeObject(cx, target); - JS_SET_RVAL(cx, vp, JSVAL_VOID); - return ret; -} - - -JSClass CouchHTTPClass = { - "CouchHTTP", - JSCLASS_HAS_PRIVATE - | JSCLASS_CONSTRUCT_PROTOTYPE - | JSCLASS_HAS_RESERVED_SLOTS(2), - JS_PropertyStub, - JS_PropertyStub, - JS_PropertyStub, - JS_StrictPropertyStub, - JS_EnumerateStub, - JS_ResolveStub, - JS_ConvertStub, - req_dtor, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - - -JSPropertySpec CouchHTTPProperties[] = { - {"status", 0, JSPROP_READONLY, req_status, NULL}, - {0, 0, 0, 0, 0} -}; - - -JSFunctionSpec CouchHTTPFunctions[] = { - JS_FS("_open", req_open, 3, 0), - JS_FS("_setRequestHeader", req_set_hdr, 2, 0), - JS_FS("_send", req_send, 1, 0), - JS_FS_END -}; - - -static JSFunctionSpec global_functions[] = { - JS_FS("evalcx", evalcx, 0, 0), - JS_FS("gc", gc, 0, 0), - JS_FS("print", print, 0, 0), - JS_FS("quit", quit, 0, 0), - JS_FS("readline", readline, 0, 0), - JS_FS("seal", seal, 0, 0), - JS_FS_END -}; - - -int -main(int argc, const char* argv[]) -{ - JSRuntime* rt = NULL; - JSContext* cx = NULL; - JSObject* global = NULL; - JSCrossCompartmentCall *call = NULL; - JSObject* klass = NULL; - JSObject* script; - JSString* scriptsrc; - const jschar* schars; - size_t slen; - jsval sroot; - jsval result; - - couch_args* args = couch_parse_args(argc, argv); - - rt = JS_NewRuntime(64L * 1024L * 1024L); - if(rt == NULL) - return 1; - - cx = JS_NewContext(rt, args->stack_size); - if(cx == NULL) - return 1; - - JS_SetErrorReporter(cx, couch_error); - JS_ToggleOptions(cx, JSOPTION_XML); - - SETUP_REQUEST(cx); - - global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL); - if(global == NULL) - return 1; - - call = JS_EnterCrossCompartmentCall(cx, global); - - JS_SetGlobalObject(cx, global); - - if(!JS_InitStandardClasses(cx, global)) - return 1; - - if(couch_load_funcs(cx, global, global_functions) != JS_TRUE) - return 1; - - if(args->use_http) { - http_check_enabled(); - - klass = JS_InitClass( - cx, global, - NULL, - &CouchHTTPClass, req_ctor, - 0, - CouchHTTPProperties, CouchHTTPFunctions, - NULL, NULL - ); - - if(!klass) - { - fprintf(stderr, "Failed to initialize CouchHTTP class.\n"); - exit(2); - } - } - - // Convert script source to jschars. - scriptsrc = dec_string(cx, args->script, strlen(args->script)); - if(!scriptsrc) - return 1; - - schars = JS_GetStringCharsAndLength(cx, scriptsrc, &slen); - - // Root it so GC doesn't collect it. - sroot = STRING_TO_JSVAL(scriptsrc); - if(JS_AddValueRoot(cx, &sroot) != JS_TRUE) { - fprintf(stderr, "Internal root error.\n"); - return 1; - } - - // Compile and run - script = JS_CompileUCScript(cx, global, schars, slen, args->script_name, 1); - if(!script) { - fprintf(stderr, "Failed to compile script.\n"); - return 1; - } - - JS_ExecuteScript(cx, global, script, &result); - - // Warning message if we don't remove it. - JS_RemoveValueRoot(cx, &sroot); - - JS_LeaveCrossCompartmentCall(call); - FINISH_REQUEST(cx); - JS_DestroyContext(cx); - JS_DestroyRuntime(rt); - JS_ShutDown(); - - return 0; -} diff --git a/src/couchdb/priv/couch_js/utf8.c b/src/couchdb/priv/couch_js/utf8.c deleted file mode 100644 index d6064267..00000000 --- a/src/couchdb/priv/couch_js/utf8.c +++ /dev/null @@ -1,291 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#include <jsapi.h> -#include "config.h" - -static int -enc_char(uint8 *utf8Buffer, uint32 ucs4Char) -{ - int utf8Length = 1; - - if (ucs4Char < 0x80) - { - *utf8Buffer = (uint8)ucs4Char; - } - else - { - int i; - uint32 a = ucs4Char >> 11; - utf8Length = 2; - while(a) - { - a >>= 5; - utf8Length++; - } - i = utf8Length; - while(--i) - { - utf8Buffer[i] = (uint8)((ucs4Char & 0x3F) | 0x80); - ucs4Char >>= 6; - } - *utf8Buffer = (uint8)(0x100 - (1 << (8-utf8Length)) + ucs4Char); - } - - return utf8Length; -} - -static JSBool -enc_charbuf(const jschar* src, size_t srclen, char* dst, size_t* dstlenp) -{ - size_t i; - size_t utf8Len; - size_t dstlen = *dstlenp; - size_t origDstlen = dstlen; - jschar c; - jschar c2; - uint32 v; - uint8 utf8buf[6]; - - if(!dst) - { - dstlen = origDstlen = (size_t) -1; - } - - while(srclen) - { - c = *src++; - srclen--; - - if((c >= 0xDC00) && (c <= 0xDFFF)) goto bad_surrogate; - - if(c < 0xD800 || c > 0xDBFF) - { - v = c; - } - else - { - if(srclen < 1) goto buffer_too_small; - c2 = *src++; - srclen--; - if ((c2 < 0xDC00) || (c2 > 0xDFFF)) - { - c = c2; - goto bad_surrogate; - } - v = ((c - 0xD800) << 10) + (c2 - 0xDC00) + 0x10000; - } - if(v < 0x0080) - { - /* no encoding necessary - performance hack */ - if(!dstlen) goto buffer_too_small; - if(dst) *dst++ = (char) v; - utf8Len = 1; - } - else - { - utf8Len = enc_char(utf8buf, v); - if(utf8Len > dstlen) goto buffer_too_small; - if(dst) - { - for (i = 0; i < utf8Len; i++) - { - *dst++ = (char) utf8buf[i]; - } - } - } - dstlen -= utf8Len; - } - - *dstlenp = (origDstlen - dstlen); - return JS_TRUE; - -bad_surrogate: - *dstlenp = (origDstlen - dstlen); - return JS_FALSE; - -buffer_too_small: - *dstlenp = (origDstlen - dstlen); - return JS_FALSE; -} - -char* -enc_string(JSContext* cx, jsval arg, size_t* buflen) -{ - JSString* str = NULL; - const jschar* src = NULL; - char* bytes = NULL; - size_t srclen = 0; - size_t byteslen = 0; - - str = JS_ValueToString(cx, arg); - if(!str) goto error; - -#ifdef HAVE_JS_GET_STRING_CHARS_AND_LENGTH - src = JS_GetStringCharsAndLength(cx, str, &srclen); -#else - src = JS_GetStringChars(str); - srclen = JS_GetStringLength(str); -#endif - - if(!enc_charbuf(src, srclen, NULL, &byteslen)) goto error; - - bytes = JS_malloc(cx, (byteslen) + 1); - bytes[byteslen] = 0; - - if(!enc_charbuf(src, srclen, bytes, &byteslen)) goto error; - - if(buflen) *buflen = byteslen; - goto success; - -error: - if(bytes != NULL) JS_free(cx, bytes); - bytes = NULL; - -success: - return bytes; -} - -static uint32 -dec_char(const uint8 *utf8Buffer, int utf8Length) -{ - uint32 ucs4Char; - uint32 minucs4Char; - - /* from Unicode 3.1, non-shortest form is illegal */ - static const uint32 minucs4Table[] = { - 0x00000080, 0x00000800, 0x0001000, 0x0020000, 0x0400000 - }; - - if (utf8Length == 1) - { - ucs4Char = *utf8Buffer; - } - else - { - ucs4Char = *utf8Buffer++ & ((1<<(7-utf8Length))-1); - minucs4Char = minucs4Table[utf8Length-2]; - while(--utf8Length) - { - ucs4Char = ucs4Char<<6 | (*utf8Buffer++ & 0x3F); - } - if(ucs4Char < minucs4Char || ucs4Char == 0xFFFE || ucs4Char == 0xFFFF) - { - ucs4Char = 0xFFFD; - } - } - - return ucs4Char; -} - -static JSBool -dec_charbuf(const char *src, size_t srclen, jschar *dst, size_t *dstlenp) -{ - uint32 v; - size_t offset = 0; - size_t j; - size_t n; - size_t dstlen = *dstlenp; - size_t origDstlen = dstlen; - - if(!dst) dstlen = origDstlen = (size_t) -1; - - while(srclen) - { - v = (uint8) *src; - n = 1; - - if(v & 0x80) - { - while(v & (0x80 >> n)) - { - n++; - } - - if(n > srclen) goto buffer_too_small; - if(n == 1 || n > 6) goto bad_character; - - for(j = 1; j < n; j++) - { - if((src[j] & 0xC0) != 0x80) goto bad_character; - } - - v = dec_char((const uint8 *) src, n); - if(v >= 0x10000) - { - v -= 0x10000; - - if(v > 0xFFFFF || dstlen < 2) - { - *dstlenp = (origDstlen - dstlen); - return JS_FALSE; - } - - if(dstlen < 2) goto buffer_too_small; - - if(dst) - { - *dst++ = (jschar)((v >> 10) + 0xD800); - v = (jschar)((v & 0x3FF) + 0xDC00); - } - dstlen--; - } - } - - if(!dstlen) goto buffer_too_small; - if(dst) *dst++ = (jschar) v; - - dstlen--; - offset += n; - src += n; - srclen -= n; - } - - *dstlenp = (origDstlen - dstlen); - return JS_TRUE; - -bad_character: - *dstlenp = (origDstlen - dstlen); - return JS_FALSE; - -buffer_too_small: - *dstlenp = (origDstlen - dstlen); - return JS_FALSE; -} - -JSString* -dec_string(JSContext* cx, const char* bytes, size_t byteslen) -{ - JSString* str = NULL; - jschar* chars = NULL; - size_t charslen; - - if(!dec_charbuf(bytes, byteslen, NULL, &charslen)) goto error; - - chars = JS_malloc(cx, (charslen + 1) * sizeof(jschar)); - if(!chars) return NULL; - chars[charslen] = 0; - - if(!dec_charbuf(bytes, byteslen, chars, &charslen)) goto error; - - str = JS_NewUCString(cx, chars, charslen - 1); - if(!str) goto error; - - goto success; - -error: - if(chars != NULL) JS_free(cx, chars); - str = NULL; - -success: - return str; -} diff --git a/src/couchdb/priv/couch_js/utf8.h b/src/couchdb/priv/couch_js/utf8.h deleted file mode 100644 index 00f6b736..00000000 --- a/src/couchdb/priv/couch_js/utf8.h +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#ifndef COUCH_JS_UTF_8_H -#define COUCH_JS_UTF_8_H - -char* enc_string(JSContext* cx, jsval arg, size_t* buflen); -JSString* dec_string(JSContext* cx, const char* buf, size_t buflen); - -#endif
\ No newline at end of file diff --git a/src/couchdb/priv/couch_js/util.c b/src/couchdb/priv/couch_js/util.c deleted file mode 100644 index 070d7172..00000000 --- a/src/couchdb/priv/couch_js/util.c +++ /dev/null @@ -1,237 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#include <stdlib.h> -#include <string.h> - -#include <jsapi.h> - -#include "util.h" -#include "utf8.h" - - -char* -slurp_file(char* buf, const char* file) -{ - FILE* fp; - char fbuf[16384]; - char* tmp; - size_t nread = 0; - size_t buflen = 0; - - if(strcmp(file, "-") == 0) { - fp = stdin; - } else { - fp = fopen(file, "r"); - if(fp == NULL) { - fprintf(stderr, "Failed to read file: %s\n", file); - exit(3); - } - } - - while((nread = fread(fbuf, 1, 16384, fp)) > 0) { - if(buf == NULL) { - buflen = nread; - buf = (char*) malloc(nread + 1); - if(buf == NULL) { - fprintf(stderr, "Out of memory.\n"); - exit(3); - } - memcpy(buf, fbuf, buflen); - buf[buflen] = '\0'; - } else { - buflen = strlen(buf); - tmp = (char*) malloc(buflen + nread + 1); - if(tmp == NULL) { - fprintf(stderr, "Out of memory.\n"); - exit(3); - } - memcpy(tmp, buf, buflen); - memcpy(tmp+buflen, fbuf, nread); - tmp[buflen+nread] = '\0'; - free(buf); - buf = tmp; - } - } - return buf; -} - -couch_args* -couch_parse_args(int argc, const char* argv[]) -{ - couch_args* args; - int i = 1; - - args = (couch_args*) malloc(sizeof(couch_args)); - if(args == NULL) - return NULL; - - memset(args, '\0', sizeof(couch_args)); - args->stack_size = 8L * 1024L; - - while(i < argc) { - if(strcmp("--http", argv[i]) == 0) { - args->use_http = 1; - } else if(strcmp("--stack-size", argv[i]) == 0) { - args->stack_size = atoi(argv[i+1]); - if(args->stack_size <= 0) { - fprintf(stderr, "Invalid stack size.\n"); - exit(2); - } - } else { - args->script = slurp_file(args->script, argv[i]); - if(args->script_name == NULL) { - if(strcmp(argv[i], "-") == 0) { - args->script_name = "<stdin>"; - } else { - args->script_name = argv[i]; - } - } else { - args->script_name = "<multiple_files>"; - } - } - i++; - } - - if(args->script_name == NULL || args->script == NULL) { - fprintf(stderr, "No script provided.\n"); - exit(3); - } - - return args; -} - - -int -couch_fgets(char* buf, int size, FILE* fp) -{ - int n, i, c; - - if(size <= 0) return -1; - n = size - 1; - - for(i = 0; i < n && (c = getc(fp)) != EOF; i++) { - buf[i] = c; - if(c == '\n') { - i++; - break; - } - } - - buf[i] = '\0'; - return i; -} - - -JSString* -couch_readline(JSContext* cx, FILE* fp) -{ - JSString* str; - char* bytes = NULL; - char* tmp = NULL; - size_t used = 0; - size_t byteslen = 256; - size_t readlen = 0; - - bytes = JS_malloc(cx, byteslen); - if(bytes == NULL) return NULL; - - while((readlen = couch_fgets(bytes+used, byteslen-used, fp)) > 0) { - used += readlen; - - if(bytes[used-1] == '\n') { - bytes[used-1] = '\0'; - break; - } - - // Double our buffer and read more. - byteslen *= 2; - tmp = JS_realloc(cx, bytes, byteslen); - if(!tmp) { - JS_free(cx, bytes); - return NULL; - } - - bytes = tmp; - } - - // Treat empty strings specially - if(used == 0) { - JS_free(cx, bytes); - return JSVAL_TO_STRING(JS_GetEmptyStringValue(cx)); - } - - // Shring the buffer to the actual data size - tmp = JS_realloc(cx, bytes, used); - if(!tmp) { - JS_free(cx, bytes); - return NULL; - } - bytes = tmp; - byteslen = used; - - str = dec_string(cx, bytes, byteslen); - JS_free(cx, bytes); - return str; -} - - -JSObject* -couch_readfile(JSContext* cx, FILE* fp) -{ - return NULL; -} - - -void -couch_print(JSContext* cx, uintN argc, jsval* argv) -{ - char *bytes; - uintN i; - - for(i = 0; i < argc; i++) - { - bytes = enc_string(cx, argv[i], NULL); - if(!bytes) return; - - fprintf(stdout, "%s%s", i ? " " : "", bytes); - JS_free(cx, bytes); - } - - fputc('\n', stdout); - fflush(stdout); -} - - -void -couch_error(JSContext* cx, const char* mesg, JSErrorReport* report) -{ - if(!report || !JSREPORT_IS_WARNING(report->flags)) - { - fprintf(stderr, "[couchjs] %s\n", mesg); - } -} - - -JSBool -couch_load_funcs(JSContext* cx, JSObject* obj, JSFunctionSpec* funcs) -{ - JSFunctionSpec* f; - for(f = funcs; f->name != NULL; f++) { - if(!JS_DefineFunction(cx, obj, f->name, f->call, f->nargs, f->flags)) { - fprintf(stderr, "Failed to create function: %s\n", f->name); - return JS_FALSE; - } - } - return JS_TRUE; -} - diff --git a/src/couchdb/priv/couch_js/util.h b/src/couchdb/priv/couch_js/util.h deleted file mode 100644 index 6caebfa1..00000000 --- a/src/couchdb/priv/couch_js/util.h +++ /dev/null @@ -1,34 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -#ifndef COUCHJS_UTIL_H -#define COUCHJS_UTIL_H - -#include <jsapi.h> - -typedef struct { - int use_http; - int stack_size; - const char* script_name; - char* script; -} couch_args; - -void couch_usage(); -couch_args* couch_parse_args(int argc, const char* argv[]); -int couch_fgets(char* buf, int size, FILE* fp); -JSString* couch_readline(JSContext* cx, FILE* fp); -void couch_print(JSContext* cx, uintN argc, jsval* argv); -void couch_error(JSContext* cx, const char* mesg, JSErrorReport* report); -JSBool couch_load_funcs(JSContext* cx, JSObject* obj, JSFunctionSpec* funcs); - - -#endif // Included util.h diff --git a/src/couchdb/priv/icu_driver/couch_icu_driver.c b/src/couchdb/priv/icu_driver/couch_icu_driver.c deleted file mode 100644 index 1afe8eac..00000000 --- a/src/couchdb/priv/icu_driver/couch_icu_driver.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. - -*/ - -// This file is the C port driver for Erlang. It provides a low overhead -// means of calling into C code, however coding errors in this module can -// crash the entire Erlang server. - -#ifdef DARWIN -#define U_HIDE_DRAFT_API 1 -#define U_DISABLE_RENAMING 1 -#endif - -#include "erl_driver.h" -#include "unicode/ucol.h" -#include "unicode/ucasemap.h" -#ifndef WIN32 -#include <string.h> // for memcpy -#endif - -typedef struct { - ErlDrvPort port; - UCollator* collNoCase; - UCollator* coll; -} couch_drv_data; - -static void couch_drv_stop(ErlDrvData data) -{ - couch_drv_data* pData = (couch_drv_data*)data; - if (pData->coll) { - ucol_close(pData->coll); - } - if (pData->collNoCase) { - ucol_close(pData->collNoCase); - } - driver_free((char*)pData); -} - -static ErlDrvData couch_drv_start(ErlDrvPort port, char *buff) -{ - UErrorCode status = U_ZERO_ERROR; - couch_drv_data* pData = (couch_drv_data*)driver_alloc(sizeof(couch_drv_data)); - - if (pData == NULL) - return ERL_DRV_ERROR_GENERAL; - - pData->port = port; - - pData->coll = ucol_open("", &status); - if (U_FAILURE(status)) { - couch_drv_stop((ErlDrvData)pData); - return ERL_DRV_ERROR_GENERAL; - } - - pData->collNoCase = ucol_open("", &status); - if (U_FAILURE(status)) { - couch_drv_stop((ErlDrvData)pData); - return ERL_DRV_ERROR_GENERAL; - } - - ucol_setAttribute(pData->collNoCase, UCOL_STRENGTH, UCOL_PRIMARY, &status); - if (U_FAILURE(status)) { - couch_drv_stop((ErlDrvData)pData); - return ERL_DRV_ERROR_GENERAL; - } - - return (ErlDrvData)pData; -} - -static int return_control_result(void* pLocalResult, int localLen, char **ppRetBuf, int returnLen) -{ - if (*ppRetBuf == NULL || localLen > returnLen) { - *ppRetBuf = (char*)driver_alloc_binary(localLen); - if(*ppRetBuf == NULL) { - return -1; - } - } - memcpy(*ppRetBuf, pLocalResult, localLen); - return localLen; -} - -static int couch_drv_control(ErlDrvData drv_data, unsigned int command, char *pBuf, - int bufLen, char **rbuf, int rlen) -{ - - couch_drv_data* pData = (couch_drv_data*)drv_data; - switch(command) { - case 0: // COLLATE - case 1: // COLLATE_NO_CASE: - { - UErrorCode status = U_ZERO_ERROR; - int collResult; - char response; - UCharIterator iterA; - UCharIterator iterB; - int32_t length; - - // 2 strings are in the buffer, consecutively - // The strings begin first with a 32 bit integer byte length, then the actual - // string bytes follow. - - // first 32bits are the length - memcpy(&length, pBuf, sizeof(length)); - pBuf += sizeof(length); - - // point the iterator at it. - uiter_setUTF8(&iterA, pBuf, length); - - pBuf += length; // now on to string b - - // first 32bits are the length - memcpy(&length, pBuf, sizeof(length)); - pBuf += sizeof(length); - - // point the iterator at it. - uiter_setUTF8(&iterB, pBuf, length); - - if (command == 0) // COLLATE - collResult = ucol_strcollIter(pData->coll, &iterA, &iterB, &status); - else // COLLATE_NO_CASE - collResult = ucol_strcollIter(pData->collNoCase, &iterA, &iterB, &status); - - if (collResult < 0) - response = 0; //lt - else if (collResult > 0) - response = 2; //gt - else - response = 1; //eq - - return return_control_result(&response, sizeof(response), rbuf, rlen); - } - - default: - return -1; - } -} - -ErlDrvEntry couch_driver_entry = { - NULL, /* F_PTR init, N/A */ - couch_drv_start, /* L_PTR start, called when port is opened */ - couch_drv_stop, /* F_PTR stop, called when port is closed */ - NULL, /* F_PTR output, called when erlang has sent */ - NULL, /* F_PTR ready_input, called when input descriptor ready */ - NULL, /* F_PTR ready_output, called when output descriptor ready */ - "couch_icu_driver", /* char *driver_name, the argument to open_port */ - NULL, /* F_PTR finish, called when unloaded */ - NULL, /* Not used */ - couch_drv_control, /* F_PTR control, port_command callback */ - NULL, /* F_PTR timeout, reserved */ - NULL, /* F_PTR outputv, reserved */ - NULL, /* F_PTR ready_async */ - NULL, /* F_PTR flush */ - NULL, /* F_PTR call */ - NULL, /* F_PTR event */ - ERL_DRV_EXTENDED_MARKER, - ERL_DRV_EXTENDED_MAJOR_VERSION, - ERL_DRV_EXTENDED_MINOR_VERSION, - ERL_DRV_FLAG_USE_PORT_LOCKING, - NULL, /* Reserved -- Used by emulator internally */ - NULL, /* F_PTR process_exit */ -}; - -DRIVER_INIT(couch_icu_driver) /* must match name in driver_entry */ -{ - return &couch_driver_entry; -} diff --git a/src/couchdb/priv/spawnkillable/couchspawnkillable.sh b/src/couchdb/priv/spawnkillable/couchspawnkillable.sh deleted file mode 100644 index f8d042e3..00000000 --- a/src/couchdb/priv/spawnkillable/couchspawnkillable.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /bin/sh -e - -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -# The purpose of this script is to echo an OS specific command before launching -# the actual process. This provides a way for Erlang to hard-kill its external -# processes. - -echo "kill -9 $$" -exec $* diff --git a/src/couchdb/priv/spawnkillable/couchspawnkillable_win.c b/src/couchdb/priv/spawnkillable/couchspawnkillable_win.c deleted file mode 100644 index 06782315..00000000 --- a/src/couchdb/priv/spawnkillable/couchspawnkillable_win.c +++ /dev/null @@ -1,145 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations under -// the License. - -// Do what 2 lines of shell script in couchspawnkillable does... -// * Create a new suspended process with the same (duplicated) standard -// handles as us. -// * Write a line to stdout, consisting of the path to ourselves, plus -// '--kill {pid}' where {pid} is the PID of the newly created process. -// * Un-suspend the new process. -// * Wait for the process to terminate. -// * Terminate with the child's exit-code. - -// Later, couch will call us with --kill and the PID, so we dutifully -// terminate the specified PID. - -#include <stdlib.h> -#include "windows.h" - -char *get_child_cmdline(int argc, char **argv) -{ - // make a new command-line, but skipping me. - // XXX - todo - spaces etc in args??? - int i; - char *p, *cmdline; - int nchars = 0; - int nthis = 1; - for (i=1;i<argc;i++) - nchars += strlen(argv[i])+1; - cmdline = p = malloc(nchars+1); - if (!cmdline) - return NULL; - for (i=1;i<argc;i++) { - nthis = strlen(argv[i]); - strncpy(p, argv[i], nthis); - p[nthis] = ' '; - p += nthis+1; - } - // Replace the last space we added above with a '\0' - cmdline[nchars-1] = '\0'; - return cmdline; -} - -// create the child process, returning 0, or the exit-code we will -// terminate with. -int create_child(int argc, char **argv, PROCESS_INFORMATION *pi) -{ - char buf[1024]; - DWORD dwcreate; - STARTUPINFO si; - char *cmdline; - if (argc < 2) - return 1; - cmdline = get_child_cmdline(argc, argv); - if (!cmdline) - return 2; - - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - // depending on how *our* parent is started, we may or may not have - // a valid stderr stream - so although we try and duplicate it, only - // failing to duplicate stdin and stdout are considered fatal. - if (!DuplicateHandle(GetCurrentProcess(), - GetStdHandle(STD_INPUT_HANDLE), - GetCurrentProcess(), - &si.hStdInput, - 0, - TRUE, // inheritable - DUPLICATE_SAME_ACCESS) || - !DuplicateHandle(GetCurrentProcess(), - GetStdHandle(STD_OUTPUT_HANDLE), - GetCurrentProcess(), - &si.hStdOutput, - 0, - TRUE, // inheritable - DUPLICATE_SAME_ACCESS)) { - return 3; - } - DuplicateHandle(GetCurrentProcess(), - GetStdHandle(STD_ERROR_HANDLE), - GetCurrentProcess(), - &si.hStdError, - 0, - TRUE, // inheritable - DUPLICATE_SAME_ACCESS); - - si.dwFlags = STARTF_USESTDHANDLES; - dwcreate = CREATE_SUSPENDED; - if (!CreateProcess( NULL, cmdline, - NULL, - NULL, - TRUE, // inherit handles - dwcreate, - NULL, // environ - NULL, // cwd - &si, - pi)) - return 4; - return 0; -} - -// and here we go... -int main(int argc, char **argv) -{ - char out_buf[1024]; - int rc; - DWORD cbwritten; - DWORD exitcode; - PROCESS_INFORMATION pi; - if (argc==3 && strcmp(argv[1], "--kill")==0) { - HANDLE h = OpenProcess(PROCESS_TERMINATE, 0, atoi(argv[2])); - if (!h) - return 1; - if (!TerminateProcess(h, 0)) - return 2; - CloseHandle(h); - return 0; - } - // spawn the new suspended process - rc = create_child(argc, argv, &pi); - if (rc) - return rc; - // Write the 'terminate' command, which includes this PID, back to couch. - // *sob* - what about spaces etc? - sprintf_s(out_buf, sizeof(out_buf), "%s --kill %d\n", - argv[0], pi.dwProcessId); - WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), out_buf, strlen(out_buf), - &cbwritten, NULL); - // Let the child process go... - ResumeThread(pi.hThread); - // Wait for the process to terminate so we can reflect the exit code - // back to couch. - WaitForSingleObject(pi.hProcess, INFINITE); - if (!GetExitCodeProcess(pi.hProcess, &exitcode)) - return 6; - return exitcode; -} diff --git a/src/couchdb/priv/stat_descriptions.cfg.in b/src/couchdb/priv/stat_descriptions.cfg.in deleted file mode 100644 index b80d7684..00000000 --- a/src/couchdb/priv/stat_descriptions.cfg.in +++ /dev/null @@ -1,50 +0,0 @@ -%% Licensed under the Apache License, Version 2.0 (the "License"); you may not -%% use this file except in compliance with the License. You may obtain a copy of -%% the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -%% License for the specific language governing permissions and limitations under -%% the License. - -% Style guide for descriptions: Start with a lowercase letter & do not add -% a trailing full-stop / period -% Please keep this in alphabetical order - -{couchdb, database_writes, "number of times a database was changed"}. -{couchdb, database_reads, "number of times a document was read from a database"}. -{couchdb, open_databases, "number of open databases"}. -{couchdb, open_os_files, "number of file descriptors CouchDB has open"}. -{couchdb, request_time, "length of a request inside CouchDB without MochiWeb"}. -{couchdb, auth_cache_hits, "number of authentication cache hits"}. -{couchdb, auth_cache_misses, "number of authentication cache misses"}. - -{httpd, bulk_requests, "number of bulk requests"}. -{httpd, requests, "number of HTTP requests"}. -{httpd, temporary_view_reads, "number of temporary view reads"}. -{httpd, view_reads, "number of view reads"}. -{httpd, clients_requesting_changes, "number of clients for continuous _changes"}. - -{httpd_request_methods, 'COPY', "number of HTTP COPY requests"}. -{httpd_request_methods, 'DELETE', "number of HTTP DELETE requests"}. -{httpd_request_methods, 'GET', "number of HTTP GET requests"}. -{httpd_request_methods, 'HEAD', "number of HTTP HEAD requests"}. -{httpd_request_methods, 'POST', "number of HTTP POST requests"}. -{httpd_request_methods, 'PUT', "number of HTTP PUT requests"}. - -{httpd_status_codes, '200', "number of HTTP 200 OK responses"}. -{httpd_status_codes, '201', "number of HTTP 201 Created responses"}. -{httpd_status_codes, '202', "number of HTTP 202 Accepted responses"}. -{httpd_status_codes, '301', "number of HTTP 301 Moved Permanently responses"}. -{httpd_status_codes, '304', "number of HTTP 304 Not Modified responses"}. -{httpd_status_codes, '400', "number of HTTP 400 Bad Request responses"}. -{httpd_status_codes, '401', "number of HTTP 401 Unauthorized responses"}. -{httpd_status_codes, '403', "number of HTTP 403 Forbidden responses"}. -{httpd_status_codes, '404', "number of HTTP 404 Not Found responses"}. -{httpd_status_codes, '405', "number of HTTP 405 Method Not Allowed responses"}. -{httpd_status_codes, '409', "number of HTTP 409 Conflict responses"}. -{httpd_status_codes, '412', "number of HTTP 412 Precondition Failed responses"}. -{httpd_status_codes, '500', "number of HTTP 500 Internal Server Error responses"}. |