int main(int argc, char* argv[]) { char* fileName=NULL; char* url=NULL; char* paramsFileName=NULL; #ifdef PROFILING_SUPPORT char* profilingFileName=NULL; #endif char *HTTPcookie=NULL; SecurityManager::SANDBOXTYPE sandboxType=SecurityManager::LOCAL_WITH_FILE; bool useInterpreter=true; bool useJit=false; bool exitOnError=false; LOG_LEVEL log_level=LOG_INFO; setlocale(LC_ALL, ""); #ifdef _WIN32 const char* localedir = getExectuablePath(); #else const char* localedir = "/usr/share/locale"; #endif bindtextdomain("lightspark", localedir); textdomain("lightspark"); LOG(LOG_INFO,"Lightspark version " << VERSION << " Copyright 2009-2012 Alessandro Pignotti and others"); //Make GTK thread enabled g_thread_init(NULL); gdk_threads_init(); //Give GTK a chance to parse its own options gtk_init (&argc, &argv); for(int i=1;i<argc;i++) { if(strcmp(argv[i],"-u")==0 || strcmp(argv[i],"--url")==0) { i++; if(i==argc) { fileName=NULL; break; } url=argv[i]; } else if(strcmp(argv[i],"-ni")==0 || strcmp(argv[i],"--disable-interpreter")==0) useInterpreter=false; else if(strcmp(argv[i],"-j")==0 || strcmp(argv[i],"--enable-jit")==0) useJit=true; else if(strcmp(argv[i],"-l")==0 || strcmp(argv[i],"--log-level")==0) { i++; if(i==argc) { fileName=NULL; break; } log_level=(LOG_LEVEL) min(4, max(0, atoi(argv[i]))); } else if(strcmp(argv[i],"-p")==0 || strcmp(argv[i],"--parameters-file")==0) { i++; if(i==argc) { fileName=NULL; break; } paramsFileName=argv[i]; } #ifdef PROFILING_SUPPORT else if(strcmp(argv[i],"-o")==0 || strcmp(argv[i],"--profiling-output")==0) { i++; if(i==argc) { fileName=NULL; break; } profilingFileName=argv[i]; } #endif else if(strcmp(argv[i],"-s")==0 || strcmp(argv[i],"--security-sandbox")==0) { i++; if(i==argc) { fileName=NULL; break; } if(strncmp(argv[i], "remote", 6) == 0) sandboxType = SecurityManager::REMOTE; else if(strncmp(argv[i], "local-with-filesystem", 21) == 0) sandboxType = SecurityManager::LOCAL_WITH_FILE; else if(strncmp(argv[i], "local-with-networking", 21) == 0) sandboxType = SecurityManager::LOCAL_WITH_NETWORK; else if(strncmp(argv[i], "local-trusted", 13) == 0) sandboxType = SecurityManager::LOCAL_TRUSTED; } else if(strcmp(argv[i],"-v")==0 || strcmp(argv[i],"--version")==0) { exit(0); } else if(strcmp(argv[i],"--exit-on-error")==0) { exitOnError = true; } else if(strcmp(argv[i],"--HTTP-cookies")==0) { i++; if(i==argc) { fileName=NULL; break; } HTTPcookie=argv[i]; } else { //No options flag, so set the swf file name if(fileName) //If already set, exit in error status { fileName=NULL; break; } fileName=argv[i]; } } if(fileName==NULL) { LOG(LOG_ERROR, "Usage: " << argv[0] << " [--url|-u http://loader.url/file.swf]" << " [--disable-interpreter|-ni] [--enable-jit|-j] [--log-level|-l 0-4]" << " [--parameters-file|-p params-file] [--security-sandbox|-s sandbox]" << " [--exit-on-error] [--HTTP-cookies cookie]" << #ifdef PROFILING_SUPPORT " [--profiling-output|-o profiling-file]" << #endif " <file.swf>"); exit(1); } #ifndef _WIN32 struct rlimit rl; getrlimit(RLIMIT_AS,&rl); rl.rlim_cur=400000000; rl.rlim_max=rl.rlim_cur; //setrlimit(RLIMIT_AS,&rl); #endif Log::setLogLevel(log_level); ifstream f(fileName, ios::in|ios::binary); f.seekg(0, ios::end); uint32_t fileSize=f.tellg(); f.seekg(0, ios::beg); if(!f) { LOG(LOG_ERROR, argv[0] << ": " << fileName << ": No such file or directory"); exit(2); } f.exceptions ( istream::eofbit | istream::failbit | istream::badbit ); cout.exceptions( ios::failbit | ios::badbit); cerr.exceptions( ios::failbit | ios::badbit); ParseThread* pt = new ParseThread(f); SystemState::staticInit(); EngineData::startGTKMain(); //NOTE: see SystemState declaration SystemState* sys =new SystemState(pt, fileSize); setTLSSys(sys); sys->setDownloadedPath(fileName); //This setting allows qualifying filename-only paths to fully qualified paths //When the URL parameter is set, set the root URL to the given parameter if(url) { sys->setOrigin(url, fileName); sandboxType = SecurityManager::REMOTE; } #ifndef _WIN32 //When running in a local sandbox, set the root URL to the current working dir else if(sandboxType != SecurityManager::REMOTE) { char * cwd = get_current_dir_name(); string cwdStr = string("file://") + string(cwd); free(cwd); cwdStr += "/"; sys->setOrigin(cwdStr, fileName); } #endif else { sys->setOrigin(string("file://") + fileName); LOG(LOG_INFO, _("Warning: running with no origin URL set.")); } //One of useInterpreter or useJit must be enabled if(!(useInterpreter || useJit)) { LOG(LOG_ERROR,_("No execution model enabled")); exit(1); } sys->useInterpreter=useInterpreter; sys->useJit=useJit; sys->exitOnError=exitOnError; if(paramsFileName) sys->parseParametersFromFile(paramsFileName); #ifdef PROFILING_SUPPORT if(profilingFileName) sys->setProfilingOutput(profilingFileName); #endif if(HTTPcookie) sys->setCookies(HTTPcookie); sys->setParamsAndEngine(new StandaloneEngineData(), true); sys->securityManager->setSandboxType(sandboxType); if(sandboxType == SecurityManager::REMOTE) LOG(LOG_INFO, _("Running in remote sandbox")); else if(sandboxType == SecurityManager::LOCAL_WITH_NETWORK) LOG(LOG_INFO, _("Running in local-with-networking sandbox")); else if(sandboxType == SecurityManager::LOCAL_WITH_FILE) LOG(LOG_INFO, _("Running in local-with-filesystem sandbox")); else if(sandboxType == SecurityManager::LOCAL_TRUSTED) LOG(LOG_INFO, _("Running in local-trusted sandbox")); sys->downloadManager=new StandaloneDownloadManager(); //Start the parser sys->addJob(pt); /* Destroy blocks until the 'terminated' flag is set by * SystemState::setShutdownFlag. */ sys->destroy(); delete pt; SystemState::staticDeinit(); EngineData::quitGTKMain(); return 0; }