static void profilelookup(nialptr sym, nialptr entr, int sysnames) { char *tmp; if (entr == grounded) return; if (!sym_flag(entr) || sysnames) { nialptr osn = sym_name(entr); nialint osr = sym_role(entr); switch (osr) { case Rexpr: make_sym_entry(entr, slower(pfirstchar(osn))); break; case Roptn: if (sym == global_symtab) make_sym_entry(entr, slower(pfirstchar(osn))); else /* a formal parameter to a trform */ { char temp[80]; strcpy(temp, trname); strcat(temp, "."); strcat(temp, tmp = slower(pfirstchar(osn))); make_sym_entry(entr, strdup(temp)); free(tmp); } break; case Rtrans: { nialptr tval = sym_valu(entr), localsym; strcpy(trname, tmp = slower(pfirstchar(osn))); free(tmp); make_sym_entry(entr, strdup(trname)); /* want to write an entry for the formal parameters, so search the local symbol table for the trform. */ if (tag(tval) == t_trform) { localsym = get_trsym(tval); profilelookup(localsym, get_root(localsym), false); } } break; default: break; } } profilelookup(sym, sym_left(entr), sysnames); profilelookup(sym, sym_rght(entr), sysnames); }
void Widget::initMenu() { QMenu* command = menuBar()->addMenu("Control"); command->addAction("Start / Stop", this, SLOT(toggleReading()), QKeySequence(Qt::Key_F4)); command->addAction("Slower", this, SLOT(slower()), QKeySequence(Qt::Key_F5)); command->addAction("Faster", this, SLOT(faster()), QKeySequence(Qt::Key_F6)); }
/* 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; }
int main (int argc, char *argv[]) { int i; double x; for ( i = 0; i < 30000000; i++) { x = 100.0; x = slow(x); x = slower(x); x = slowest(x); } return 0; }
/* function header(key: String): String */ static EjsString *http_header(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { EjsString *result; cchar *value; char *str; if (!waitForResponseHeaders(hp)) { return 0; } str = slower(ejsToMulti(ejs, argv[0])); value = httpGetHeader(hp->conn, str); if (value) { result = ejsCreateStringFromAsc(ejs, value); } else { result = ESV(null); } return result; }
void QVLCMenu::PopupMenuControlEntries( QMenu *menu, intf_thread_t *p_intf ) { QAction *action; /* Faster/Slower */ action = menu->addAction( qtr( "&Faster" ), THEMIM->getIM(), SLOT( faster() ) ); action->setIcon( QIcon( ":/toolbar/faster") ); action->setData( STATIC_ENTRY ); action = menu->addAction( qtr( "Faster (fine)" ), THEMIM->getIM(), SLOT( littlefaster() ) ); action->setData( STATIC_ENTRY ); action = menu->addAction( qtr( "N&ormal Speed" ), THEMIM->getIM(), SLOT( normalRate() ) ); action->setData( STATIC_ENTRY ); action = menu->addAction( qtr( "Slower (fine)" ), THEMIM->getIM(), SLOT( littleslower() ) ); action->setData( STATIC_ENTRY ); action = menu->addAction( qtr( "Slo&wer" ), THEMIM->getIM(), SLOT( slower() ) ); action->setIcon( QIcon( ":/toolbar/slower") ); action->setData( STATIC_ENTRY ); menu->addSeparator(); action = menu->addAction( qtr( "&Jump Forward" ), THEMIM->getIM(), SLOT( jumpFwd() ) ); action->setIcon( QIcon( ":/toolbar/skip_fw") ); action->setData( STATIC_ENTRY ); action = menu->addAction( qtr( "Jump Bac&kward" ), THEMIM->getIM(), SLOT( jumpBwd() ) ); action->setIcon( QIcon( ":/toolbar/skip_back") ); action->setData( STATIC_ENTRY ); addDPStaticEntry( menu, qtr( I_MENU_GOTOTIME ),"", SLOT( gotoTimeDialog() ), "Ctrl+T" ); menu->addSeparator(); }
/********************************************************************** * Speed control widget **********************************************************************/ SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i, QWidget *_parent ) : QFrame( _parent ), p_intf( _p_i ) { QSizePolicy sizePolicy( QSizePolicy::Fixed, QSizePolicy::Maximum ); sizePolicy.setHorizontalStretch( 0 ); sizePolicy.setVerticalStretch( 0 ); speedSlider = new QSlider( this ); speedSlider->setSizePolicy( sizePolicy ); speedSlider->setMinimumSize( QSize( 140, 20 ) ); speedSlider->setOrientation( Qt::Horizontal ); speedSlider->setTickPosition( QSlider::TicksBelow ); speedSlider->setRange( -34, 34 ); speedSlider->setSingleStep( 1 ); speedSlider->setPageStep( 1 ); speedSlider->setTickInterval( 17 ); CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) ); QToolButton *normalSpeedButton = new QToolButton( this ); normalSpeedButton->setMaximumSize( QSize( 26, 16 ) ); normalSpeedButton->setAutoRaise( true ); normalSpeedButton->setText( "1x" ); normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) ); CONNECT( normalSpeedButton, clicked(), this, resetRate() ); QToolButton *slowerButton = new QToolButton( this ); slowerButton->setMaximumSize( QSize( 26, 16 ) ); slowerButton->setAutoRaise( true ); slowerButton->setToolTip( tooltipL[SLOWER_BUTTON] ); slowerButton->setIcon( QIcon( iconL[SLOWER_BUTTON] ) ); CONNECT( slowerButton, clicked(), THEMIM->getIM(), slower() ); QToolButton *fasterButton = new QToolButton( this ); fasterButton->setMaximumSize( QSize( 26, 16 ) ); fasterButton->setAutoRaise( true ); fasterButton->setToolTip( tooltipL[FASTER_BUTTON] ); fasterButton->setIcon( QIcon( iconL[FASTER_BUTTON] ) ); CONNECT( fasterButton, clicked(), THEMIM->getIM(), faster() ); /* spinBox = new QDoubleSpinBox(); spinBox->setDecimals( 2 ); spinBox->setMaximum( 32 ); spinBox->setMinimum( 0.03F ); spinBox->setSingleStep( 0.10F ); spinBox->setAlignment( Qt::AlignRight ); CONNECT( spinBox, valueChanged( double ), this, updateSpinBoxRate( double ) ); */ QGridLayout* speedControlLayout = new QGridLayout( this ); speedControlLayout->addWidget( speedSlider, 0, 0, 1, 3 ); speedControlLayout->addWidget( slowerButton, 1, 0 ); speedControlLayout->addWidget( normalSpeedButton, 1, 1, 1, 1, Qt::AlignRight ); speedControlLayout->addWidget( fasterButton, 1, 2, 1, 1, Qt::AlignRight ); //speedControlLayout->addWidget( spinBox ); speedControlLayout->setContentsMargins( 0, 0, 0, 0 ); speedControlLayout->setSpacing( 0 ); lastValue = 0; activateOnState(); }
/* Parse the a date/time string and return the result in *time. Missing date items may be provided via the defaults argument. This is a tolerant parser. It is not validating and will do its best to parse any possible date string. */ PUBLIC int websParseDateTime(WebsTime *time, char *dateString, struct tm *defaults) { TimeToken *tt; struct tm tm; char *str, *next, *token, *cp, *sep; int64 value; int kind, hour, min, negate, value1, value2, value3, alpha, alpha2, alpha3; int dateSep, offset, zoneOffset, explicitZone, fullYear; if (!dateString) { dateString = ""; } offset = 0; zoneOffset = 0; explicitZone = 0; sep = ", \t"; cp = 0; next = 0; fullYear = 0; /* Set these mandatory values to -1 so we can tell if they are set to valid values WARNING: all the calculations use tm_year with origin 0, not 1900. It is fixed up below. */ tm.tm_year = -MAXINT; tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_sec = tm.tm_min = tm.tm_wday = -1; tm.tm_min = tm.tm_sec = tm.tm_yday = -1; #if ME_UNIX_LIKE && !CYGWIN tm.tm_gmtoff = 0; tm.tm_zone = 0; #endif /* Set to -1 to try to determine if DST is in effect */ tm.tm_isdst = -1; str = slower(dateString); /* Handle ISO dates: "2009-05-21t16:06:05.000z */ if (strchr(str, ' ') == 0 && strchr(str, '-') && str[slen(str) - 1] == 'z') { for (cp = str; *cp; cp++) { if (*cp == '-') { *cp = '/'; } else if (*cp == 't' && cp > str && isdigit((uchar) cp[-1]) && isdigit((uchar) cp[1]) ) { *cp = ' '; } } } token = stok(str, sep, &next); while (token && *token) { if (snumber(token)) { /* Parse either day of month or year. Priority to day of month. Format: <29> Jan <15> <2014> */ value = atoi(token); if (value > 3000) { *time = value; return 0; } else if (value > 32 || (tm.tm_mday >= 0 && tm.tm_year == -MAXINT)) { if (value >= 1000) { fullYear = 1; } tm.tm_year = (int) value - 1900; } else if (tm.tm_mday < 0) { tm.tm_mday = (int) value; } } else if ((*token == '+') || (*token == '-') || ((strncmp(token, "gmt", 3) == 0 || strncmp(token, "utc", 3) == 0) && ((cp = strchr(&token[3], '+')) != 0 || (cp = strchr(&token[3], '-')) != 0))) { /* Timezone. Format: [GMT|UTC][+-]NN[:]NN */ if (!isalpha((uchar) *token)) { cp = token; } negate = *cp == '-' ? -1 : 1; cp++; hour = getNum(&cp, timeSep); if (hour >= 100) { hour /= 100; } min = getNum(&cp, timeSep); zoneOffset = negate * (hour * 60 + min); explicitZone = 1; } else if (isalpha((uchar) *token)) { if ((tt = (TimeToken*) hashLookupSymbol(timeTokens, token)) != 0) { kind = tt->value & TOKEN_MASK; value = tt->value & ~TOKEN_MASK; switch (kind) { case TOKEN_DAY: tm.tm_wday = (int) value; break; case TOKEN_MONTH: tm.tm_mon = (int) value; break; case TOKEN_OFFSET: /* Named timezones or symbolic names like: tomorrow, yesterday, next week ... */ /* Units are seconds */ offset += (int) value; break; case TOKEN_ZONE: zoneOffset = (int) value; explicitZone = 1; break; default: /* Just ignore unknown values */ break; } } } else if ((cp = strchr(token, timeSep)) != 0 && isdigit((uchar) token[0])) { /* Time: 10:52[:23] Must not parse GMT-07:30 */ tm.tm_hour = getNum(&token, timeSep); tm.tm_min = getNum(&token, timeSep); tm.tm_sec = getNum(&token, timeSep); } else { dateSep = '/'; if (strchr(token, dateSep) == 0) { dateSep = '-'; if (strchr(token, dateSep) == 0) { dateSep = '.'; if (strchr(token, dateSep) == 0) { dateSep = 0; } } } if (dateSep) { /* Date: 07/28/2014, 07/28/08, Jan/28/2014, Jaunuary-28-2014, 28-jan-2014 Support order: dd/mm/yy, mm/dd/yy and yyyy/mm/dd Support separators "/", ".", "-" */ value1 = getNumOrSym(&token, dateSep, TOKEN_MONTH, &alpha); value2 = getNumOrSym(&token, dateSep, TOKEN_MONTH, &alpha2); value3 = getNumOrSym(&token, dateSep, TOKEN_MONTH, &alpha3); if (value1 > 31) { /* yy/mm/dd */ tm.tm_year = value1; tm.tm_mon = value2; tm.tm_mday = value3; } else if (value1 > 12 || alpha2) { /* dd/mm/yy Cannot detect 01/02/03 This will be evaluated as Jan 2 2003 below. */ tm.tm_mday = value1; tm.tm_mon = value2; tm.tm_year = value3; } else { /* The default to parse is mm/dd/yy unless the mm value is out of range */ tm.tm_mon = value1; tm.tm_mday = value2; tm.tm_year = value3; } } } token = stok(NULL, sep, &next); } /* Y2K fix and rebias */ if (0 <= tm.tm_year && tm.tm_year < 100 && !fullYear) { if (tm.tm_year < 50) { tm.tm_year += 2000; } else { tm.tm_year += 1900; } } if (tm.tm_year >= 1900) { tm.tm_year -= 1900; } /* Convert back to origin 0 for months */ if (tm.tm_mon > 0) { tm.tm_mon--; } /* Validate and fill in missing items with defaults */ validateTime(&tm, defaults); *time = makeTime(&tm); *time += -(zoneOffset * SEC_PER_MIN); *time += offset; return 0; }
static bool process(cchar *operation, bool quiet) { cchar *name, *off, *path; int rc, launch, update, service, upstart; /* No systemd support yet */ rc = 1; name = app->serviceName; launch = upstart = update = service = 0; if (exists("/bin/launchctl") && exists("/Library/LaunchDaemons/com.%s.%s.plist", slower(BLD_COMPANY), name)) { launch++; } else if (exists("/sbin/start") && exists("/etc/init/rc.conf") && (exists("/etc/init/%s.conf", name) || exists("/etc/init/%s.off", name))) { upstart++; } else if (exists("/usr/sbin/update-rc.d") && exists("/etc/init.d/%s", name)) { update++; } else if (exists("/sbin/service") && exists("/etc/init.d/%s", name)) { service++; } else { mprError("Can't locate system tool to manage service"); return 0; } /* Operations */ if (smatch(operation, "install")) { if (launch) { ; } else if (service) { if (!run("/sbin/chkconfig --del %s", name)) { rc = 0; } else if (!run("/sbin/chkconfig --add %s", name)) { rc = 0; } else if (!run("/sbin/chkconfig --level 5 %s", name)) { rc = 0; } } else if (update) { ; } else if (upstart) { ; } } else if (smatch(operation, "uninstall")) { process("disable", 1); if (launch) { ; } else if (service) { rc = run("/sbin/chkconfig --del %s", name); } else if (update) { ; } else if (upstart) { ; } } else if (smatch(operation, "enable")) { /* Enable service (will start on reboot) */ if (launch) { path = sfmt("/Library/LaunchDaemons/com.%s.%s.plist", slower(BLD_COMPANY), name); /* Unfortunately, there is no launchctl command to do an enable without starting. So must do a stop below. */ if (!run("/bin/launchctl load -w %s", path)) { rc = 0; } else { rc = process("stop", 1); } } else if (update) { rc = run("/usr/sbin/update-rc.d %s defaults 90 10", name); /* Not supported on older versions rc = run("/usr/sbin/update-rc.d %s enable", name); */ } else if (service) { rc = run("/sbin/chkconfig %s on", name); } else if (upstart) { off = sfmt("/etc/init/%s.off", name); if (exists(off) && !run("mv %s /etc/init/%s.conf", off, name)) { rc = 0; } } } else if (smatch(operation, "disable")) { process("stop", 1); if (launch) { rc = run("/bin/launchctl unload -w /Library/LaunchDaemons/com.%s.%s.plist", slower(BLD_COMPANY), name); } else if (update) { /* Not supported on older versions rc = run("/usr/sbin/update-rc.d %s disable", name); */ rc = run("/usr/sbin/update-rc.d -f %s remove", name); } else if (service) { rc = run("/sbin/chkconfig %s off", name); } else if (upstart) { if (exists("/etc/init/%s.conf", name)) { rc = run("mv /etc/init/%s.conf /etc/init/%s.off", name, name); } } } else if (smatch(operation, "start")) { if (launch) { rc = run("/bin/launchctl load /Library/LaunchDaemons/com.%s.%s.plist", slower(BLD_COMPANY), name); } else if (service) { rc = run("/sbin/service %s start", name); } else if (update) { rc = run("/usr/sbin/invoke-rc.d --quiet %s start", name); } else if (upstart) { rc = run("/sbin/start %s", name); if (!rc) { if (scontains(app->error, "start: Job is already running", -1)) { rc = 0; } } } } else if (smatch(operation, "stop")) { if (launch) { rc = run("/bin/launchctl unload /Library/LaunchDaemons/com.%s.%s.plist", slower(BLD_COMPANY), name); } else if (service) { if (!run("/sbin/service %s stop", name)) { rc = killPid(); } } else if (update) { if (!run("/usr/sbin/invoke-rc.d --quiet %s stop", name)) { rc = killPid(); } } else if (upstart) { if (exists("/etc/init/%s.conf", name)) { rc = run("/sbin/stop %s", name); } } } else if (smatch(operation, "reload")) { rc = process("restart", 0); } else if (smatch(operation, "restart")) { process("stop", 1); rc = process("start", 0); } else if (smatch(operation, "run")) { runService(); } if (!quiet) { if (!rc && app->error && *app->error) { mprError("Can't run command: %s\nCommand output: %s\n", app->command, app->error); } /* Logging at level one will be visible if appman -v is used */ if (app->error && *app->error) { mprLog(1, "Error: %s", app->error); } if (app->output && *app->output) { mprLog(1, "Output: %s", app->output); } } return rc; }
/* Parse the CGI output headers. Sample CGI program output: Content-type: text/html <html..... */ static bool parseCgiHeaders(Cgi *cgi, HttpPacket *packet) { HttpConn *conn; MprBuf *buf; char *endHeaders, *headers, *key, *value; ssize blen; int len; conn = cgi->conn; value = 0; buf = packet->content; headers = mprGetBufStart(buf); blen = mprGetBufLength(buf); /* Split the headers from the body. Add null to ensure we can search for line terminators. */ len = 0; if ((endHeaders = sncontains(headers, "\r\n\r\n", blen)) == NULL) { if ((endHeaders = sncontains(headers, "\n\n", blen)) == NULL) { if (mprGetCmdFd(cgi->cmd, MPR_CMD_STDOUT) >= 0 && strlen(headers) < ME_MAX_HEADERS) { /* Not EOF and less than max headers and have not yet seen an end of headers delimiter */ return 0; } } len = 2; } else { len = 4; } if (endHeaders > buf->end) { assert(endHeaders <= buf->end); return 0; } if (endHeaders) { endHeaders[len - 1] = '\0'; endHeaders += len; } /* Want to be tolerant of CGI programs that omit the status line. */ if (strncmp((char*) buf->start, "HTTP/1.", 7) == 0) { if (!parseFirstCgiResponse(cgi, packet)) { /* httpError already called */ return 0; } } if (endHeaders && strchr(mprGetBufStart(buf), ':')) { while (mprGetBufLength(buf) > 0 && buf->start[0] && (buf->start[0] != '\r' && buf->start[0] != '\n')) { if ((key = getCgiToken(buf, ":")) == 0) { key = "Bad Header"; } value = getCgiToken(buf, "\n"); while (isspace((uchar) *value)) { value++; } len = (int) strlen(value); while (len > 0 && (value[len - 1] == '\r' || value[len - 1] == '\n')) { value[len - 1] = '\0'; len--; } key = slower(key); if (strcmp(key, "location") == 0) { cgi->location = value; } else if (strcmp(key, "status") == 0) { httpSetStatus(conn, atoi(value)); } else if (strcmp(key, "content-type") == 0) { httpSetHeaderString(conn, "Content-Type", value); } else if (strcmp(key, "content-length") == 0) { httpSetContentLength(conn, (MprOff) stoi(value)); httpSetChunkSize(conn, 0); } else { /* Now pass all other headers back to the client */ key = ssplit(key, ":\r\n\t ", NULL); httpSetHeaderString(conn, key, value); } } buf->start = endHeaders; } return 1; }
int singleplayer_process_input (struct state *st, struct ui *ui, char c) { int cursi = ui->cursor.i; int cursj = ui->cursor.j; switch (c) { case 'q': case 'Q': return 1; case 'f': st->prev_speed = st->speed; st->speed = faster(st->speed); break; case 's': st->prev_speed = st->speed; st->speed = slower(st->speed); break; case 'p': if (st->speed == sp_pause) st->speed = st->prev_speed; else { st->prev_speed = st->speed; st->speed = sp_pause; } break; case 'h': case K_LEFT: cursi--; break; case 'l': case K_RIGHT: cursi++; break; case 'k': case K_UP: cursj--; if (cursj % 2 == 1) cursi++; break; case 'j': case K_DOWN: cursj++; if (cursj % 2 == 0) cursi--; break; case ' ': if (st->fg[st->controlled].flag[ui->cursor.i][ui->cursor.j] == 0) add_flag (&st->grid, &st->fg[st->controlled], ui->cursor.i, ui->cursor.j, FLAG_POWER); else remove_flag (&st->grid, &st->fg[st->controlled], ui->cursor.i, ui->cursor.j, FLAG_POWER); break; case 'x': remove_flags_with_prob (&st->grid, &st->fg[st->controlled], 1.0); break; case 'c': remove_flags_with_prob (&st->grid, &st->fg[st->controlled], 0.5); break; case 'r': case 'v': build (&st->grid, &st->country[st->controlled], st->controlled, ui->cursor.i, ui->cursor.j); break; case ESCAPE: case 91: break; } adjust_cursor(st, ui, cursi, cursj); return 0; }
static ssize parseCgiHeaders(Webs *wp, char *buf) { char *end, *cp, *key, *value, *location, *contentType; ssize len, contentLength; int status, doneHeaders; status = HTTP_CODE_OK; contentLength = -1; contentType = 0; location = 0; doneHeaders = 0; /* Look for end of headers */ if ((end = strstr(buf, "\r\n\r\n")) == NULL) { if ((end = strstr(buf, "\n\n")) == NULL) { return 0; } len = 2; } else { len = 4; } end[len - 1] = '\0'; end += len; cp = buf; if (!strchr(cp, ':')) { /* No headers found */ return 0; } if (strncmp(cp, "HTTP/1.", 7) == 0) { stok(cp, "\r\n", &cp); } for (; *cp && (*cp != '\r' && *cp != '\n') && cp < end; ) { key = slower(stok(cp, ":", &value)); if (strcmp(key, "location") == 0) { location = value; } else if (strcmp(key, "status") == 0) { status = atoi(value); } else if (strcmp(key, "content-type") == 0) { contentType = value; } else if (strcmp(key, "content-length") == 0) { contentLength = atoi(value); } else { /* Now pass all other headers back to the client */ if (!doneHeaders) { writeCgiHeaders(wp, status, contentLength, location, contentType); doneHeaders = 1; } websWriteHeader(wp, key, "%s", value); } stok(value, "\r\n", &cp); } if (!doneHeaders) { writeCgiHeaders(wp, status, contentLength, location, contentType); } websWriteEndHeaders(wp); return end - buf; }
PUBLIC Http *httpCreate(int flags) { Http *http; HttpStatusCode *code; mprGlobalLock(); if (MPR->httpService) { mprGlobalUnlock(); return MPR->httpService; } if ((http = mprAllocObj(Http, manageHttp)) == 0) { mprGlobalUnlock(); return 0; } MPR->httpService = HTTP = http; http->software = sclone(ME_HTTP_SOFTWARE); http->protocol = sclone("HTTP/1.1"); http->mutex = mprCreateLock(); http->stages = mprCreateHash(-1, MPR_HASH_STABLE); http->hosts = mprCreateList(-1, MPR_LIST_STABLE); http->connections = mprCreateList(-1, MPR_LIST_STATIC_VALUES); http->authTypes = mprCreateHash(-1, MPR_HASH_CASELESS | MPR_HASH_UNIQUE | MPR_HASH_STABLE); http->authStores = mprCreateHash(-1, MPR_HASH_CASELESS | MPR_HASH_UNIQUE | MPR_HASH_STABLE); http->routeSets = mprCreateHash(-1, MPR_HASH_STATIC_VALUES | MPR_HASH_STABLE); http->booted = mprGetTime(); http->flags = flags; http->monitorPeriod = ME_HTTP_MONITOR_PERIOD; http->secret = mprGetRandomString(HTTP_MAX_SECRET); http->trace = httpCreateTrace(0); http->startLevel = 2; http->localPlatform = slower(sfmt("%s-%s-%s", ME_OS, ME_CPU, ME_PROFILE)); httpSetPlatform(http->localPlatform); httpSetPlatformDir(NULL); updateCurrentDate(); http->statusCodes = mprCreateHash(41, MPR_HASH_STATIC_VALUES | MPR_HASH_STATIC_KEYS | MPR_HASH_STABLE); for (code = HttpStatusCodes; code->code; code++) { mprAddKey(http->statusCodes, code->codeString, code); } httpGetUserGroup(); httpInitParser(); httpInitAuth(); httpOpenNetConnector(); httpOpenSendConnector(); httpOpenRangeFilter(); httpOpenChunkFilter(); #if ME_HTTP_WEB_SOCKETS httpOpenWebSockFilter(); #endif mprSetIdleCallback(isIdle); mprAddTerminator(terminateHttp); if (flags & HTTP_SERVER_SIDE) { http->endpoints = mprCreateList(-1, MPR_LIST_STABLE); http->counters = mprCreateList(-1, MPR_LIST_STABLE); http->monitors = mprCreateList(-1, MPR_LIST_STABLE); http->routeTargets = mprCreateHash(-1, MPR_HASH_STATIC_VALUES | MPR_HASH_STABLE); http->routeConditions = mprCreateHash(-1, MPR_HASH_STATIC_VALUES | MPR_HASH_STABLE); http->routeUpdates = mprCreateHash(-1, MPR_HASH_STATIC_VALUES | MPR_HASH_STABLE); http->sessionCache = mprCreateCache(MPR_CACHE_SHARED | MPR_HASH_STABLE); http->addresses = mprCreateHash(-1, MPR_HASH_STABLE); http->defenses = mprCreateHash(-1, MPR_HASH_STABLE); http->remedies = mprCreateHash(-1, MPR_HASH_CASELESS | MPR_HASH_STATIC_VALUES | MPR_HASH_STABLE); httpOpenUploadFilter(); httpOpenCacheHandler(); httpOpenPassHandler(); httpOpenActionHandler(); httpOpenDirHandler(); httpOpenFileHandler(); http->serverLimits = httpCreateLimits(1); httpDefineRouteBuiltins(); httpAddCounters(); httpAddRemedies(); httpCreateDefaultHost(); } if (flags & HTTP_CLIENT_SIDE) { http->defaultClientHost = sclone("127.0.0.1"); http->defaultClientPort = 80; http->clientLimits = httpCreateLimits(0); http->clientRoute = httpCreateConfiguredRoute(0, 0); http->clientHandler = httpCreateHandler("client", 0); } mprGlobalUnlock(); return http; }
static int parseArgs(int argc, char **argv) { char *argp, *key, *value; int i, setWorkers, nextArg, ssl; setWorkers = 0; ssl = 0; for (nextArg = 1; nextArg < argc; nextArg++) { argp = argv[nextArg]; if (*argp != '-') { break; } if (smatch(argp, "--auth")) { if (nextArg >= argc) { return showUsage(); } else { app->authType = slower(argv[++nextArg]); } } else if (smatch(argp, "--benchmark") || smatch(argp, "-b")) { app->benchmark++; } else if (smatch(argp, "--ca")) { if (nextArg >= argc) { return showUsage(); } else { app->ca = sclone(argv[++nextArg]); if (!mprPathExists(app->ca, R_OK)) { mprError("Cannot find ca file %s", app->ca); return MPR_ERR_BAD_ARGS; } } ssl = 1; } else if (smatch(argp, "--cert")) { if (nextArg >= argc) { return showUsage(); } else { app->cert = sclone(argv[++nextArg]); if (!mprPathExists(app->cert, R_OK)) { mprError("Cannot find cert file %s", app->cert); return MPR_ERR_BAD_ARGS; } } ssl = 1; } else if (smatch(argp, "--chunk")) { if (nextArg >= argc) { return showUsage(); } else { value = argv[++nextArg]; app->chunkSize = atoi(value); if (app->chunkSize < 0) { mprError("Bad chunksize %d", app->chunkSize); return MPR_ERR_BAD_ARGS; } } } else if (smatch(argp, "--ciphers")) { if (nextArg >= argc) { return showUsage(); } else { app->ciphers = sclone(argv[++nextArg]); } ssl = 1; } else if (smatch(argp, "--continue") || smatch(argp, "-c")) { app->continueOnErrors++; } else if (smatch(argp, "--cookie")) { if (nextArg >= argc) { return showUsage(); } else { mprAddItem(app->headers, mprCreateKeyPair("Cookie", argv[++nextArg], 0)); } } else if (smatch(argp, "--data")) { if (nextArg >= argc) { return showUsage(); } else { if (app->bodyData == 0) { app->bodyData = mprCreateBuf(-1, -1); } mprPutStringToBuf(app->bodyData, argv[++nextArg]); } } else if (smatch(argp, "--debugger") || smatch(argp, "-D")) { mprSetDebugMode(1); app->retries = 0; app->timeout = MAXINT; } else if (smatch(argp, "--delete")) { app->method = "DELETE"; } else if (smatch(argp, "--form") || smatch(argp, "-f")) { if (nextArg >= argc) { return showUsage(); } else { if (app->formData == 0) { app->formData = mprCreateList(-1, 0); } addFormVars(argv[++nextArg]); } } else if (smatch(argp, "--header")) { if (nextArg >= argc) { return showUsage(); } else { key = argv[++nextArg]; if ((value = strchr(key, ':')) == 0) { mprError("Bad header format. Must be \"key: value\""); return MPR_ERR_BAD_ARGS; } *value++ = '\0'; while (isspace((uchar) *value)) { value++; } mprAddItem(app->headers, mprCreateKeyPair(key, value, 0)); } } else if (smatch(argp, "--host")) { if (nextArg >= argc) { return showUsage(); } else { app->host = argv[++nextArg]; if (*app->host == ':') { app->host = &app->host[1]; } if (isPort(app->host)) { app->host = sfmt("http://127.0.0.1:%s", app->host); } else { app->host = sclone(app->host); } } } else if (smatch(argp, "--iterations") || smatch(argp, "-i")) { if (nextArg >= argc) { return showUsage(); } else { app->iterations = atoi(argv[++nextArg]); } } else if (smatch(argp, "--key")) { if (nextArg >= argc) { return showUsage(); } else { app->key = sclone(argv[++nextArg]); if (!mprPathExists(app->key, R_OK)) { mprError("Cannot find key file %s", app->key); return MPR_ERR_BAD_ARGS; } } ssl = 1; } else if (smatch(argp, "--log") || smatch(argp, "-l")) { if (nextArg >= argc) { return showUsage(); } else { mprStartLogging(argv[++nextArg], 0); } } else if (smatch(argp, "--method") || smatch(argp, "-m")) { if (nextArg >= argc) { return showUsage(); } else { app->method = argv[++nextArg]; } } else if (smatch(argp, "--out") || smatch(argp, "-o")) { if (nextArg >= argc) { return showUsage(); } else { app->outFilename = sclone(argv[++nextArg]); } } else if (smatch(argp, "--noout") || smatch(argp, "-n") || smatch(argp, "--quiet") || smatch(argp, "-q")) { app->noout++; } else if (smatch(argp, "--nofollow")) { app->nofollow++; } else if (smatch(argp, "--password") || smatch(argp, "-p")) { if (nextArg >= argc) { return showUsage(); } else { app->password = sclone(argv[++nextArg]); } } else if (smatch(argp, "--post")) { app->method = "POST"; } else if (smatch(argp, "--printable")) { app->printable++; } else if (smatch(argp, "--protocol")) { if (nextArg >= argc) { return showUsage(); } else { app->protocol = supper(argv[++nextArg]); } } else if (smatch(argp, "--provider")) { /* Undocumented SSL provider selection */ if (nextArg >= argc) { return showUsage(); } else { app->provider = sclone(argv[++nextArg]); } ssl = 1; } else if (smatch(argp, "--put")) { app->method = "PUT"; } else if (smatch(argp, "--range")) { if (nextArg >= argc) { return showUsage(); } else { if (app->ranges == 0) { app->ranges = sfmt("bytes=%s", argv[++nextArg]); } else { app->ranges = srejoin(app->ranges, ",", argv[++nextArg], NULL); } } } else if (smatch(argp, "--retries") || smatch(argp, "-r")) { if (nextArg >= argc) { return showUsage(); } else { app->retries = atoi(argv[++nextArg]); } } else if (smatch(argp, "--self")) { /* Undocumented. Allow self-signed certs. Users should just not set --verify */ app->verifyIssuer = 0; ssl = 1; } else if (smatch(argp, "--sequence")) { app->sequence++; } else if (smatch(argp, "--showHeaders") || smatch(argp, "--show") || smatch(argp, "-s")) { app->showHeaders++; } else if (smatch(argp, "--showStatus") || smatch(argp, "--showCode")) { app->showStatus++; } else if (smatch(argp, "--single") || smatch(argp, "-s")) { app->singleStep++; } else if (smatch(argp, "--text")) { app->text++; } else if (smatch(argp, "--threads") || smatch(argp, "-t")) { if (nextArg >= argc) { return showUsage(); } else { app->loadThreads = atoi(argv[++nextArg]); } } else if (smatch(argp, "--timeout")) { if (nextArg >= argc) { return showUsage(); } else { app->timeout = atoi(argv[++nextArg]) * MPR_TICKS_PER_SEC; } } else if (smatch(argp, "--upload") || smatch(argp, "-u")) { app->upload++; } else if (smatch(argp, "--user") || smatch(argp, "--username")) { if (nextArg >= argc) { return showUsage(); } else { app->username = argv[++nextArg]; } // DEPRECATE validate. Preserve verify. } else if (smatch(argp, "--validate") || smatch(argp, "--verify")) { app->verifyPeer = 1; ssl = 1; } else if (smatch(argp, "--verbose") || smatch(argp, "-v")) { app->verbose++; } else if (smatch(argp, "--version") || smatch(argp, "-V")) { mprEprintf("%s %s\n" "Copyright (C) Embedthis Software 2003-2013\n" "Copyright (C) Michael O'Brien 2003-2013\n", BIT_TITLE, BIT_VERSION); exit(0); } else if (smatch(argp, "--workerTheads") || smatch(argp, "-w")) { if (nextArg >= argc) { return showUsage(); } else { app->workers = atoi(argv[++nextArg]); } setWorkers++; } else if (smatch(argp, "--zero")) { app->zeroOnErrors++; } else if (smatch(argp, "--")) { nextArg++; break; } else if (smatch(argp, "-")) { break; } else { return showUsage(); } } if (argc == nextArg) { return showUsage(); } app->nextArg = nextArg; argc = argc - nextArg; argv = &argv[nextArg]; app->target = argv[argc - 1]; if (--argc > 0) { /* Files present on command line */ app->files = mprCreateList(argc, MPR_LIST_STATIC_VALUES); for (i = 0; i < argc; i++) { mprAddItem(app->files, argv[i]); } } if (!setWorkers) { app->workers = app->loadThreads + 2; } if (app->method == 0) { if (app->bodyData || app->formData || app->upload) { app->method = "POST"; } else if (app->files) { app->method = "PUT"; } else { app->method = "GET"; } } #if BIT_PACK_SSL { HttpUri *uri = httpCreateUri(app->target, 0); if (uri->secure || ssl) { app->ssl = mprCreateSsl(0); if (app->provider) { mprSetSslProvider(app->ssl, app->provider); } if (app->cert) { if (!app->key) { mprError("Must specify key file"); return 0; } mprSetSslCertFile(app->ssl, app->cert); mprSetSslKeyFile(app->ssl, app->key); } if (app->ca) { mprLog(4, "Using CA: \"%s\"", app->ca); mprSetSslCaFile(app->ssl, app->ca); } if (app->verifyIssuer == -1) { app->verifyIssuer = app->verifyPeer ? 1 : 0; } mprVerifySslPeer(app->ssl, app->verifyPeer); mprVerifySslIssuer(app->ssl, app->verifyIssuer); if (app->ciphers) { mprSetSslCiphers(app->ssl, app->ciphers); } } else { mprVerifySslPeer(NULL, 0); } } #else /* Suppress comp warning */ mprNop(&ssl); #endif return 0; }