static int mdbAddTable(Edi *edi, cchar *tableName) { Mdb *mdb; MdbTable *table; mprAssert(edi); mprAssert(tableName && *tableName); mdb = (Mdb*) edi; lock(mdb); if ((table = lookupTable(mdb, tableName)) != 0) { unlock(mdb); return MPR_ERR_ALREADY_EXISTS; } if ((table = mprAllocObj(MdbTable, manageTable)) == 0) { unlock(mdb); return MPR_ERR_MEMORY; } if ((table->rows = mprCreateList(0, 0)) == 0) { unlock(mdb); return MPR_ERR_MEMORY; } table->name = sclone(tableName); if (mdb->tables == 0) { mdb->tables = mprCreateList(0, 0); } if (!growSchema(table)) { unlock(mdb); return MPR_ERR_MEMORY; } mprAddItem(mdb->tables, table); autoSave(mdb, lookupTable(mdb, tableName)); unlock(mdb); return 0; }
static EjsService *createService() { EjsService *sp; if (MPR->ejsService) { return MPR->ejsService; } if ((sp = mprAllocObj(EjsService, manageEjsService)) == NULL) { return 0; } mprGlobalLock(); MPR->ejsService = sp; #if FUTURE && KEEP mprSetMemNotifier((MprMemNotifier) allocNotifier); #endif sp->nativeModules = mprCreateHash(-1, MPR_HASH_STATIC_KEYS); sp->mutex = mprCreateLock(); sp->vmlist = mprCreateList(-1, MPR_LIST_STATIC_VALUES); sp->vmpool = mprCreateList(-1, MPR_LIST_STATIC_VALUES); sp->intern = ejsCreateIntern(sp); sp->dtoaSpin[0] = mprCreateSpinLock(); sp->dtoaSpin[1] = mprCreateSpinLock(); ejsInitCompiler(sp); mprGlobalUnlock(); return sp; }
/* * Create a host from scratch */ MaHost *maCreateHost(MaServer *server, cchar *ipAddrPort, MaLocation *location) { MaHost *host; host = mprAllocObjZeroed(server, MaHost); if (host == 0) { return 0; } host->aliases = mprCreateList(host); host->dirs = mprCreateList(host); host->connections = mprCreateList(host); host->locations = mprCreateList(host); if (ipAddrPort) { host->ipAddrPort = mprStrdup(server, ipAddrPort); host->name = mprStrdup(server, ipAddrPort); } else { host->ipAddrPort = 0; host->name = 0; } host->server = server; host->flags = MA_HOST_NO_TRACE; host->httpVersion = MPR_HTTP_1_1; host->timeout = MA_SERVER_TIMEOUT; host->limits = &server->http->limits; host->traceMask = MA_TRACE_REQUEST | MA_TRACE_RESPONSE | MA_TRACE_HEADERS; host->traceLevel = 3; host->traceMaxLength = INT_MAX; host->keepAliveTimeout = MA_KEEP_TIMEOUT; host->maxKeepAlive = MA_MAX_KEEP_ALIVE; host->keepAlive = 1; host->location = (location) ? location : maCreateBareLocation(host); maAddLocation(host, host->location); updateCurrentDate(host); #if BLD_FEATURE_AUTH host->location->auth = maCreateAuth(host->location, host->location->auth); #endif #if BLD_FEATURE_MULTITHREAD host->mutex = mprCreateLock(host); #endif mprSetIdleCallback(host, appwebIsIdle); return host; }
PUBLIC MprList *mprListRegistry(cchar *key) { HKEY top, h; wchar name[ME_MAX_PATH]; MprList *list; int index, size; assert(key && *key); /* Get the registry hive */ if ((key = getHive(key, &top)) == 0) { return 0; } if (RegOpenKeyEx(top, wide(key), 0, KEY_READ, &h) != ERROR_SUCCESS) { return 0; } list = mprCreateList(0, 0); index = 0; while (1) { size = sizeof(name) / sizeof(wchar); if (RegEnumValue(h, index, name, &size, 0, NULL, NULL, NULL) != ERROR_SUCCESS) { break; } mprAddItem(list, sclone(multi(name))); index++; } RegCloseKey(h); return list; }
static int mdbAddValidation(Edi *edi, cchar *tableName, cchar *columnName, EdiValidation *vp) { Mdb *mdb; MdbTable *table; MdbCol *col; mprAssert(edi); mprAssert(tableName && *tableName); mprAssert(columnName && *columnName); mdb = (Mdb*) edi; lock(mdb); if ((table = lookupTable(mdb, tableName)) == 0) { unlock(mdb); return MPR_ERR_CANT_FIND; } if ((col = lookupColumn(table, columnName)) == 0) { unlock(mdb); return MPR_ERR_CANT_FIND; } if (col->validations == 0) { col->validations = mprCreateList(0, 0); } mprAddItem(col->validations, vp); unlock(mdb); return 0; }
void httpCreateRxPipeline(HttpConn *conn, HttpRoute *route) { HttpTx *tx; HttpRx *rx; HttpQueue *q; HttpStage *stage, *filter; int next; mprAssert(conn); mprAssert(route); rx = conn->rx; tx = conn->tx; rx->inputPipeline = mprCreateList(-1, 0); if (route) { for (next = 0; (filter = mprGetNextItem(route->inputStages, &next)) != 0; ) { if (matchFilter(conn, filter, route, HTTP_STAGE_RX) == HTTP_ROUTE_OK) { mprAddItem(rx->inputPipeline, filter); } } } mprAddItem(rx->inputPipeline, tx->handler); /* Create the incoming queue heads and open the queues. */ q = tx->queue[HTTP_QUEUE_RX]; for (next = 0; (stage = mprGetNextItem(rx->inputPipeline, &next)) != 0; ) { q = httpCreateQueue(conn, stage, HTTP_QUEUE_RX, q); } conn->readq = tx->queue[HTTP_QUEUE_RX]->prevQ; if (!conn->endpoint) { pairQueues(conn); openQueues(conn); } }
static int runCommand(HttpConn *conn, cchar *command, cchar *csource, cchar *module) { EspReq *req; EspRoute *eroute; MprCmd *cmd; MprKey *var; MprList *elist; cchar **env; char *err, *out; req = conn->data; eroute = req->route->eroute; cmd = mprCreateCmd(conn->dispatcher); if ((req->commandLine = espExpandCommand(eroute, command, csource, module)) == 0) { httpError(conn, HTTP_CODE_INTERNAL_SERVER_ERROR, "Missing EspCompile directive for %s", csource); return MPR_ERR_CANT_READ; } mprLog(4, "ESP command: %s\n", req->commandLine); if (eroute->env) { elist = mprCreateList(0, 0); for (ITERATE_KEYS(eroute->env, var)) { mprAddItem(elist, sfmt("%s=%s", var->key, var->data)); } mprAddNullItem(elist); env = (cchar**) &elist->items[0]; } else {
static void initSettings() { app->method = 0; app->verbose = 0; app->continueOnErrors = 0; app->showHeaders = 0; app->verifyIssuer = -1; app->verifyPeer = 0; app->zeroOnErrors = 0; app->authType = sclone("basic"); app->host = sclone("localhost"); app->iterations = 1; app->loadThreads = 1; app->protocol = "HTTP/1.1"; app->retries = HTTP_RETRIES; app->success = 1; /* zero means no timeout */ app->timeout = 0; app->workers = 1; app->headers = mprCreateList(0, 0); app->mutex = mprCreateLock(); #if WINDOWS _setmode(fileno(stdout), O_BINARY); #endif }
/* String to list. This parses the string into space separated arguments. Single and double quotes are supported. This returns a stable list. */ PUBLIC MprList *stolist(cchar *src) { MprList *list; cchar *start; int quote; list = mprCreateList(0, MPR_LIST_STABLE); while (src && *src != '\0') { while (isspace((uchar) *src)) { src++; } if (*src == '\0') { break; } for (quote = 0, start = src; *src; src++) { if (*src == '\\') { src++; } else if (*src == '"' || *src == '\'') { if (*src == quote) { src++; break; } else if (quote == 0) { quote = *src; } } else if (isspace((uchar) *src) && !quote) { break; } } mprAddItem(list, snclone(start, src - start)); } return list; }
PUBLIC int mprCreateNotifierService(MprWaitService *ws) { struct epoll_event ev; if ((ws->handlerMap = mprCreateList(MPR_FD_MIN, 0)) == 0) { return MPR_ERR_CANT_INITIALIZE; } if ((ws->epoll = epoll_create(ME_MAX_EVENTS)) < 0) { mprLog("critical mpr event", 0, "Call to epoll failed"); return MPR_ERR_CANT_INITIALIZE; } #if defined(EFD_NONBLOCK) if ((ws->breakFd[MPR_READ_PIPE] = eventfd(0, 0)) < 0) { mprLog("critical mpr event", 0, "Cannot open breakout event"); return MPR_ERR_CANT_INITIALIZE; } #else /* Initialize the "wakeup" pipe. This is used to wakeup the service thread if other threads need to wait for I/O. */ if (pipe(ws->breakFd) < 0) { mprLog("critical mpr event", 0, "Cannot open breakout pipe"); return MPR_ERR_CANT_INITIALIZE; } fcntl(ws->breakFd[0], F_SETFL, fcntl(ws->breakFd[0], F_GETFL) | O_NONBLOCK); fcntl(ws->breakFd[1], F_SETFL, fcntl(ws->breakFd[1], F_GETFL) | O_NONBLOCK); #endif memset(&ev, 0, sizeof(ev)); ev.events = EPOLLIN | EPOLLERR | EPOLLHUP; ev.data.fd = ws->breakFd[MPR_READ_PIPE]; epoll_ctl(ws->epoll, EPOLL_CTL_ADD, ws->breakFd[MPR_READ_PIPE], &ev); return 0; }
static int runCommand(HttpRoute *route, MprDispatcher *dispatcher, cchar *command, cchar *csource, cchar *module, char **errMsg) { MprCmd *cmd; MprKey *var; MprList *elist; EspRoute *eroute; cchar **env, *commandLine; char *err, *out; int rc; *errMsg = 0; eroute = route->eroute; cmd = mprCreateCmd(dispatcher); if ((commandLine = espExpandCommand(route, command, csource, module)) == 0) { *errMsg = sfmt("Missing EspCompile directive for %s", csource); return MPR_ERR_CANT_READ; } mprTrace(4, "ESP command: %s\n", commandLine); if (eroute->env) { elist = mprCreateList(0, MPR_LIST_STABLE); for (ITERATE_KEYS(eroute->env, var)) { mprAddItem(elist, sfmt("%s=%s", var->key, var->data)); } mprAddNullItem(elist); env = (cchar**) &elist->items[0]; } else {
static void testListIterate(MprTestGroup *gp) { MprList *lp; int max, i, item, next; max = 50; lp = mprCreateList(max, 0); tassert(lp != 0); for (i = 0; i < max; i++) { mprAddItem(lp, (void*) (long) (i + 1)); } i = next = 0; item = (int) (long) mprGetNextItem(lp, &next); while (item > 0) { i++; item = (int) (long) mprGetNextItem(lp, &next); } tassert(i == max); /* Abbreviated form with no GetFirst */ i = 0; next = 0; while ((item = (int) (long) mprGetNextItem(lp, &next)) != 0) { i++; } tassert(i == max); }
static void testOrderedInserts(MprTestGroup *gp) { MprList *lp; int i, item, next; lp = mprCreateList(0, 0); tassert(lp != 0); /* Add items such that the final list is ordered */ mprAddItem(lp, (void*) (long) 4); mprAddItem(lp, (void*) (long) 5); mprInsertItemAtPos(lp, 0, (void*) 2); mprInsertItemAtPos(lp, 0, (void*) 1); mprInsertItemAtPos(lp, 2, (void*) 3); mprAddItem(lp, (void*) (long) 6); i = 1; next = 0; item = (int) (long) mprGetNextItem(lp, &next); while (item > 0) { tassert(item == i); i++; item = (int) (long) mprGetNextItem(lp, &next); } }
static void testCreateList(MprTestGroup *gp) { MprList *lp; lp = mprCreateList(0, 0); tassert(lp != 0); }
/* Create the top level appweb control object. This is typically a singleton. */ PUBLIC MaAppweb *maCreateAppweb() { MaAppweb *appweb; Http *http; if ((appweb = mprAllocObj(MaAppweb, manageAppweb)) == NULL) { return 0; } MPR->appwebService = appweb; appweb->http = http = httpCreate(HTTP_CLIENT_SIDE | HTTP_SERVER_SIDE); httpSetContext(http, appweb); appweb->servers = mprCreateList(-1, 0); appweb->localPlatform = slower(sfmt("%s-%s-%s", BIT_OS, BIT_CPU, BIT_PROFILE)); maSetPlatform(NULL); maGetUserGroup(appweb); maParseInit(appweb); /* Open the builtin handlers */ #if BIT_PACK_DIR maOpenDirHandler(http); #endif maOpenFileHandler(http); return appweb; }
PUBLIC void httpCreateRxPipeline(HttpConn *conn, HttpRoute *route) { HttpTx *tx; HttpRx *rx; HttpQueue *q; HttpStage *stage, *filter; int next; assert(conn); assert(route); rx = conn->rx; tx = conn->tx; rx->inputPipeline = mprCreateList(-1, MPR_LIST_STABLE); if (route) { for (next = 0; (filter = mprGetNextItem(route->inputStages, &next)) != 0; ) { if (matchFilter(conn, filter, route, HTTP_STAGE_RX) == HTTP_ROUTE_OK) { mprAddItem(rx->inputPipeline, filter); } } } mprAddItem(rx->inputPipeline, tx->handler ? tx->handler : conn->http->clientHandler); /* Create the incoming queue heads and open the queues. */ q = tx->queue[HTTP_QUEUE_RX]; for (next = 0; (stage = mprGetNextItem(rx->inputPipeline, &next)) != 0; ) { q = httpCreateQueue(conn, stage, HTTP_QUEUE_RX, q); } if (httpClientConn(conn)) { pairQueues(conn); openQueues(conn); } }
static void processing() { MprThread *tp; ThreadData *data; int j; if (app->chunkSize > 0) { mprAddItem(app->headers, mprCreateKeyPair("X-Appweb-Chunk-Size", sfmt("%d", app->chunkSize))); } app->activeLoadThreads = app->loadThreads; app->threadData = mprCreateList(app->loadThreads, 0); for (j = 0; j < app->loadThreads; j++) { char name[64]; if ((data = mprAllocObj(ThreadData, manageThreadData)) == 0) { return; } mprAddItem(app->threadData, data); mprSprintf(name, sizeof(name), "http.%d", j); tp = mprCreateThread(name, threadMain, NULL, 0); tp->data = data; mprStartThread(tp); } }
/* Return a list of column names */ static MprList *mdbGetColumns(Edi *edi, cchar *tableName) { Mdb *mdb; MdbTable *table; MdbSchema *schema; MprList *list; int i; mprAssert(edi); mprAssert(tableName && *tableName); mdb = (Mdb*) edi; lock(mdb); if ((table = lookupTable(mdb, tableName)) == 0) { unlock(mdb); return 0; } schema = table->schema; mprAssert(schema); list = mprCreateList(schema->ncols, 0); for (i = 0; i < schema->ncols; i++) { /* No need to clone */ mprAddItem(list, schema->cols[i].name); } unlock(mdb); return list; }
static MprList *expandWild(Ejs *ejs, int argc, char **argv) { MprList *list; EjsArray *files; EjsPath *path, *dir; cchar *arg; int i, j; if ((list = mprCreateList(-1, 0)) == 0) { return 0; } for (i = 0; i < argc; i++) { if (schr(argv[i], '*')) { arg = mprNormalizePath(argv[i]); dir = ejsCreatePathFromAsc(ejs, mprGetPathDir(arg)); path = ejsCreatePathFromAsc(ejs, mprGetPathBase(arg)); if ((files = ejsGetPathFiles(ejs, dir, 1, (EjsObj**) (void*) &path)) == 0) { ejsClearException(ejs); mprAddItem(list, sclone(argv[i])); } else { for (j = 0; j < files->length; j++) { mprAddItem(list, ((EjsPath*) files->data[j])->value); } } } else { mprAddItem(list, sclone(argv[i])); } } return list; }
static EjsXML *shallowCopy(Ejs *ejs, EjsXML *xml) { EjsXML *root, *elt; int next; assure(xml->kind == EJS_XML_LIST); if (xml == 0) { return 0; } if ((root = ejsCreateXMLList(ejs, xml->targetObject, xml->targetProperty)) == NULL) { return 0; } if (xml->elements) { root->elements = mprCreateList(-1, 0); for (next = 0; (elt = mprGetNextItem(xml->elements, &next)) != 0; ) { assure(ejsIsXML(ejs, elt)); if (elt) { mprAddItem(root->elements, elt); } } } if (mprHasMemError(ejs)) { return 0; } return root; }
static void testInsertAndRemove(MprTestGroup *gp) { MprList *lp; int index; lp = mprCreateList(0, 0); tassert(lp != 0); /* Do one insert and remove */ index = mprAddItem(lp, (void*) 1); tassert(index >= 0); tassert(mprGetListLength(lp) == 1); mprRemoveItem(lp, (void*) 1); tassert(mprGetListLength(lp) == 0); /* Test remove will compact */ mprAddItem(lp, (void*) 1); mprAddItem(lp, (void*) 2); mprAddItem(lp, (void*) 3); mprRemoveItem(lp, (void*) 2); tassert(mprGetListLength(lp) == 2); mprRemoveItem(lp, (void*) 3); tassert(mprGetListLength(lp) == 1); }
PUBLIC EjsXML *ejsAppendToXML(Ejs *ejs, EjsXML *xml, EjsXML *node) { EjsXML *elt; int next; if (xml == 0 || node == 0) { return 0; } if (xml->elements == 0) { xml->elements = mprCreateList(-1, 0); } if (node->kind == EJS_XML_LIST) { for (next = 0; (elt = mprGetNextItem(node->elements, &next)) != 0; ) { if (xml->kind != EJS_XML_LIST) { elt->parent = xml; } mprAddItem(xml->elements, elt); } xml->targetObject = node->targetObject; xml->targetProperty = node->targetProperty; } else { if (xml->kind != EJS_XML_LIST) { node->parent = xml; } mprAddItem(xml->elements, node); } return xml; }
Ejs *ejsCreateVM(int argc, cchar **argv, int flags) { EjsService *sp; Ejs *ejs; if ((ejs = mprAllocObj(Ejs, manageEjs)) == NULL) { return 0; } sp = ejs->service = MPR->ejsService; if (sp == 0) { sp = ejs->service = createService(); defineSharedTypes(ejs); } ejs->empty = 1; ejs->state = mprAllocZeroed(sizeof(EjsState)); ejs->argc = argc; ejs->argv = argv; ejs->name = sfmt("ejs-%d", sp->seqno++); ejs->dispatcher = mprCreateDispatcher(ejs->name, MPR_DISPATCHER_ENABLED); ejs->mutex = mprCreateLock(ejs); ejs->dontExit = sp->dontExit; ejs->flags |= (flags & (EJS_FLAG_NO_INIT | EJS_FLAG_DOC | EJS_FLAG_HOSTED)); ejs->hosted = (flags & EJS_FLAG_HOSTED) ? 1 : 0; ejs->global = ejsCreateBlock(ejs, 0); mprSetName(ejs->global, "global"); ejsDefineGlobalNamespaces(ejs); /* Modules are not marked in the modules list. This way, modules are collected when not referenced. Workers are marked. This way workers are preserved to run in the background until they exit. */ ejs->modules = mprCreateList(-1, MPR_LIST_STATIC_VALUES); ejs->workers = mprCreateList(0, 0); initStack(ejs); initSearchPath(ejs, 0); mprAddItem(sp->vmlist, ejs); if (ejs->hasError || mprHasMemError(ejs)) { ejsDestroyVM(ejs); mprError("Cannot create VM"); return 0; } mprLog(5, "ejs: create VM"); return ejs; }
static int processThread(HttpConn *conn, MprEvent *event) { ThreadData *td; cchar *path; char *url; int next; td = mprGetCurrentThread()->data; httpFollowRedirects(conn, !app->nofollow); httpSetTimeout(conn, app->timeout, app->timeout); if (strcmp(app->protocol, "HTTP/1.0") == 0) { httpSetKeepAliveCount(conn, 0); httpSetProtocol(conn, "HTTP/1.0"); } if (app->username) { if (app->password == 0 && !strchr(app->username, ':')) { app->password = getPassword(); } httpSetCredentials(conn, app->username, app->password); } while (!mprShouldDenyNewRequests(conn) && (app->success || app->continueOnErrors)) { if (app->singleStep) waitForUser(); if (app->files && !app->upload) { for (next = 0; (path = mprGetNextItem(app->files, &next)) != 0; ) { /* If URL ends with "/", assume it is a directory on the target and append each file name */ if (app->target[strlen(app->target) - 1] == '/') { url = mprJoinPath(app->target, mprGetPathBase(path)); } else { url = app->target; } app->requestFiles = mprCreateList(-1, MPR_LIST_STATIC_VALUES); mprAddItem(app->requestFiles, path); td->url = url = resolveUrl(conn, url); if (app->verbose) { mprPrintf("putting: %s to %s\n", path, url); } if (doRequest(conn, url, app->requestFiles) < 0) { app->success = 0; break; } } } else { td->url = url = resolveUrl(conn, app->target); if (doRequest(conn, url, app->files) < 0) { app->success = 0; break; } } if (iterationsComplete()) { break; } } httpDestroyConn(conn); finishThread((MprThread*) event->data); return -1; }
PUBLIC int ejsAppendAttributeToXML(Ejs *ejs, EjsXML *parent, EjsXML *node) { if (parent->attributes == 0) { parent->attributes = mprCreateList(-1, 0); } node->parent = parent; return mprAddItem(parent->attributes, node); }
/* * Create a host from scratch */ MaHost *maCreateHost(MaServer *server, cchar *ipAddrPort, MaLocation *location) { MaHost *host; host = mprAllocObjZeroed(server, MaHost); if (host == 0) { return 0; } host->currentDate = maGetDateString(host, 0); host->aliases = mprCreateList(host); host->dirs = mprCreateList(host); host->connections = mprCreateList(host); host->locations = mprCreateList(host); if (ipAddrPort) { host->ipAddrPort = mprStrdup(server, ipAddrPort); host->name = mprStrdup(server, ipAddrPort); } else { host->ipAddrPort = 0; host->name = 0; } host->server = server; host->flags = MA_HOST_NO_TRACE; host->httpVersion = MPR_HTTP_1_1; host->timeout = MA_SERVER_TIMEOUT; host->limits = &server->http->limits; host->keepAliveTimeout = MA_KEEP_TIMEOUT; host->maxKeepAlive = MA_MAX_KEEP_ALIVE; host->keepAlive = 1; host->location = (location) ? location : maCreateBareLocation(host); maAddLocation(host, host->location); #if BLD_FEATURE_AUTH host->location->auth = maCreateAuth(host->location, host->location->auth); #endif #if BLD_FEATURE_MULTITHREAD host->mutex = mprCreateLock(host); #endif return host; }
static int process(EjsMod *mp, cchar *output, int argc, char **argv) { Ejs *ejs; EjsModule *module; MprFile *outfile; MprList *depends; int count, i, next, moduleCount; ejs = mp->ejs; if (output) { outfile = mprOpenFile(output, O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, 0664); } else { outfile = 0; } ejs->loaderCallback = (mp->listing) ? emListingLoadCallback : 0; mp->firstGlobal = ejsGetLength(ejs, ejs->global); /* For each module on the command line */ for (i = 0; i < argc && !mp->fatalError; i++) { moduleCount = mprGetListLength(ejs->modules); ejs->loadData = mp; if (!mprPathExists(argv[i], R_OK)) { mprError("Can't access module %s", argv[i]); return EJS_ERR; } if ((ejsLoadModule(ejs, ejsCreateStringFromAsc(ejs, argv[i]), -1, -1, EJS_LOADER_NO_INIT)) < 0) { ejs->loaderCallback = NULL; mprError("Can't load module %s\n%s", argv[i], ejsGetErrorMsg(ejs, 0)); return EJS_ERR; } if (mp->genSlots) { for (next = moduleCount; (module = mprGetNextItem(ejs->modules, &next)) != 0; ) { emCreateSlotFiles(mp, module, outfile); } } if (mp->depends) { depends = mprCreateList(-1, 0); for (next = moduleCount; (module = mprGetNextItem(ejs->modules, &next)) != 0; ) { getDepends(ejs, depends, module); } count = mprGetListLength(depends); for (next = 1; (module = mprGetNextItem(depends, &next)) != 0; ) { int version = module->version; mprPrintf("%@-%d.%d.%d%s", module->name, EJS_MAJOR(version), EJS_MINOR(version), EJS_PATCH(version), (next >= count) ? "" : " "); } printf("\n"); } } if (mp->html || mp->xml) { emCreateDoc(mp); } mprCloseFile(outfile); return 0; }
/* * Create a new virtual host and inherit settings from another host */ MaHost *maCreateVirtualHost(MaServer *server, cchar *ipAddrPort, MaHost *parent) { MaHost *host; host = mprAllocObjZeroed(server, MaHost); if (host == 0) { return 0; } host->parent = parent; host->connections = mprCreateList(host); if (ipAddrPort) { host->ipAddrPort = mprStrdup(server, ipAddrPort); host->name = mprStrdup(server, ipAddrPort); } else { host->ipAddrPort = 0; host->name = 0; } /* * The aliases, dirs and locations are all copy-on-write */ host->aliases = parent->aliases; host->dirs = parent->dirs; host->locations = parent->locations; host->server = parent->server; host->flags = parent->flags; host->httpVersion = parent->httpVersion; host->timeout = parent->timeout; host->limits = parent->limits; host->keepAliveTimeout = parent->keepAliveTimeout; host->maxKeepAlive = parent->maxKeepAlive; host->keepAlive = parent->keepAlive; host->accessLog = parent->accessLog; host->mimeTypes = parent->mimeTypes; host->location = maCreateLocation(host, parent->location); host->logHost = parent->logHost; host->traceMask = parent->traceMask; host->traceLevel = parent->traceLevel; host->traceMaxLength = parent->traceMaxLength; if (parent->traceInclude) { host->traceInclude = mprCopyHash(host, parent->traceInclude); } if (parent->traceExclude) { host->traceExclude = mprCopyHash(host, parent->traceExclude); } maAddLocation(host, host->location); updateCurrentDate(host); #if BLD_FEATURE_MULTITHREAD host->mutex = mprCreateLock(host); #endif return host; }
PUBLIC EjsAny *cloneXml(Ejs *ejs, EjsXML *xml, bool deep) { EjsXML *root, *elt; int next; if (xml == 0) { return 0; } if (xml->kind == EJS_XML_LIST) { root = ejsCreateXMLList(ejs, xml->targetObject, xml->targetProperty); } else { root = ejsCreateXML(ejs, xml->kind, xml->qname, NULL, xml->value); } if (root == 0) { return 0; } // TODO - must copy inScopeNamespaces? if (xml->attributes) { root->attributes = mprCreateList(-1, 0); for (next = 0; (elt = (EjsXML*) mprGetNextItem(xml->attributes, &next)) != 0; ) { elt = ejsClone(ejs, elt, 1); if (elt) { elt->parent = root; mprAddItem(root->attributes, elt); } } } if (xml->elements) { root->elements = mprCreateList(-1, 0); for (next = 0; (elt = mprGetNextItem(xml->elements, &next)) != 0; ) { assert(ejsIsXML(ejs, elt)); elt = ejsClone(ejs, elt, 1); if (elt) { elt->parent = root; mprAddItem(root->elements, elt); } } } if (mprHasMemError(ejs)) { return 0; } return root; }
static void testIsListEmpty(MprTestGroup *gp) { MprList *lp; lp = mprCreateList(0, 0); tassert(lp != 0); tassert(mprGetListLength(lp) == 0); tassert(mprGetFirstItem(lp) == 0); }