static void irc_sending_text(PurpleConnection *gc, char **msg, gpointer null) { PurpleAccount *account = purple_connection_get_account(gc); char *old = *msg; if (MATCHES("QUIT ")) { char *message = strchr(*msg, ':'); if (!message || !strcmp(message + 1, "Leaving.\r\n")) { *msg = g_strdup_printf("QUIT :%s\r\n", QUIT_MESSAGE); } } else if (MATCHES("PART ")) { char *message = strchr(*msg, ':'); if (message) return; /* The user did give some part message. Do not use the default one. */ message = strchr(*msg, '\r'); *message = '\0'; *msg = g_strdup_printf("%s :%s\r\n", *msg, PART_MESSAGE); } else if (MATCHES("NOTICE ")) { char *version = strstr(*msg, ":\001VERSION "); if (!version) return; *version = '\0'; *msg = g_strdup_printf("%s:\001VERSION %s\001\r\n", *msg, CTCP_REPLY); } if (*msg != old) g_free(old); }
noit_boolean noit_apply_filterset(const char *filterset, noit_check_t *check, metric_t *metric) { /* We pass in filterset here just in case someone wants to apply * a filterset other than check->filterset.. You never know. */ void *vfs; if(!filterset) return noit_true; /* No filter */ if(!filtersets) return noit_false; /* Couldn't possibly match */ LOCKFS(); if(noit_hash_retrieve(filtersets, filterset, strlen(filterset), &vfs)) { filterset_t *fs = (filterset_t *)vfs; filterrule_t *r; noit_atomic_inc32(&fs->ref_cnt); UNLOCKFS(); #define MATCHES(rname, value) noit_apply_filterrule(r->rname, r->rname##_e, value) for(r = fs->rules; r; r = r->next) { if(MATCHES(target, check->target) && MATCHES(module, check->module) && MATCHES(name, check->name) && MATCHES(metric, metric->metric_name)) return (r->type == NOIT_FILTER_ACCEPT) ? noit_true : noit_false; } filterset_free(fs); return noit_false; } UNLOCKFS(); return noit_false; }
static int get_protocol(char const* proto) { if (MATCHES( "udp", proto )) return IPPROTO_UDP; if (MATCHES( "tcp", proto )) return IPPROTO_TCP; printf("Could not understand requested protocol %s\n", proto); print_help(); return -1; }
RULEID __CopyRule(LPRULE lpOldRule, ITEMID idName) { #ifdef INFERENCE RULEID idRule; LPRULE lpRule; LPEXP lpBody; EXPID idBody; if (GetRule(idName) != NULLID) return NULLID; idRule = KppAddItemAndName (RULE, (LPLPSTR)&lpRule, idName); if (!idRule) return NULLID; NAME(lpRule) = idName; FLAGS(lpRule) = NULL; PRIORITY(lpRule) = 0; MATCHES(lpRule) = NULLID; NUMVARS(lpRule) = NUMVARS(lpOldRule); if (! (FLAGS(lpRule) & CBODY)) { VARS(lpRule) = KppDeepListCopy(VARS(lpOldRule), Kpp__CopyVar,idRule); idBody = BODY(lpRule) = KppCopyExp( BODY(lpOldRule), (LPLPSTR)&lpBody, kPERMMODE); KppReleaseExp(idBody); } KppReleaseItem(RULE, idRule); /* Add to KnowledgeTools */ KppAddItemCB (RULE, 1); return idRule; #endif }
short PEXPORT Kpp__SetupRule(LPRULE lpRule, LISTID idVarList, LISTID idClassList, EXPID idIfPart, EXPID idThenPart) { #ifdef INFERENCE PRIORITY(lpRule) = 0; MATCHES(lpRule) = NULLID; NUMVARS(lpRule) = KppListLen(idVarList); BODY(lpRule) = JoinIfThen(idIfPart, idThenPart); if (idIfPart) KppDeleteExp(idIfPart); if (idThenPart) KppDeleteExp(idThenPart); if (NUMVARS(lpRule) == 0) VARS(lpRule) = KppMakeList(0); else { VARS(lpRule) = MakeRuleArgList(idVarList, idClassList); if (idVarList) KppDeleteList(idVarList); if (idClassList) KppDeleteList(idClassList); idVarList = VARS(lpRule); KppClearVarList(idVarList); KppBindVars(idVarList, BODY(lpRule)); } #endif return TRUE; }
int is_keyword(const char word[]) { int i; for (i = 0; i < sizeof(KEYWORDS) / sizeof(char *); i++) { if (MATCHES(word, KEYWORDS[i])) { return TRUE; } } return FALSE; }
void ImageScanThread<DBFS>::SyncSubTree(const QFileInfo &dirInfo, int parentId, int devId, const QString &base) { // Ignore excluded dirs if (MATCHES(m_exclusions, dirInfo.fileName())) { LOG(VB_FILE, LOG_INFO, QString("Excluding dir %1").arg(dirInfo.absoluteFilePath())); return; } // Use global image filters QDir dir = m_dir; if (!dir.cd(dirInfo.absoluteFilePath())) { LOG(VB_FILE, LOG_INFO, QString("Failed to open dir %1").arg(dirInfo.absoluteFilePath())); return; } // Create directory node int id = SyncDirectory(dirInfo, devId, base, parentId); // Sync its contents QFileInfoList list = dir.entryInfoList(); foreach(const QFileInfo &fileInfo, list) { if (!IsScanning()) { LOG(VB_GENERAL, LOG_INFO, QString("Scan interrupted in %2").arg(dirInfo.absoluteFilePath())); return; } if (fileInfo.isDir()) { // Scan this directory SyncSubTree(fileInfo, id, devId, base); } else { SyncFile(fileInfo, devId, base, id); QMutexLocker locker(&m_mutexProgress); ++m_progressCount; // Throttle updates if (m_bcastTimer.elapsed() > 250) Broadcast(m_progressCount); } } }
short PEXPORT Kpp__ResetRule(LPRULE lpRule) { #ifdef INFERENCE if (FLAGS(lpRule) & CBODY) { if (VARS(lpRule)) KppDeleteList(VARS(lpRule)); if (CIFPAIRS(lpRule)) KppDeleteList(CIFPAIRS(lpRule)); if (CTHENPAIRS(lpRule)) KppDeleteList(CTHENPAIRS(lpRule)); } else { /* first delete the list of variables */ if (VARS(lpRule) != NULLID) { KppClearVarList(VARS(lpRule)); KppClearList(VARS(lpRule), VAR); KppDeleteList(VARS(lpRule)); VARS (lpRule) = NULLID; } /* then delete the body */ if (BODY(lpRule) != NULLID) { KppDeleteExp(BODY(lpRule)); BODY(lpRule) = NULLID; } } /* then delete list of matches if it exists! */ if (MATCHES(lpRule) != NULLID) { KppDeleteMatchList(MATCHES(lpRule)); MATCHES(lpRule) = NULLID; } #endif return TRUE; }
int nextIsWordAndRemove(Parser *parser, char word[]) { Token *tok; NULL_CHECK(parser->tok_q, "Unexpected EOF!"); if (1 > parser->tok_q->size) { return FALSE; } tok = queue_peek(parser->tok_q); if (WORD != tok->type || !MATCHES(word, tok->text)) { return FALSE; } queue_remove(parser->tok_q); free(tok); return TRUE; }
void ImageScanThread<DBFS>::CountTree(QDir &dir) { QFileInfoList files = dir.entryInfoList(); foreach(const QFileInfo &fileInfo, files) { // Ignore excluded dirs/files if (MATCHES(m_exclusions, fileInfo.fileName())) continue; if (fileInfo.isFile()) ++m_progressTotalCount; // Ignore missing dirs else if (dir.cd(fileInfo.fileName())) { CountTree(dir); dir.cdUp(); } } }
void ImageScanThread<DBFS>::SyncFile(const QFileInfo &fileInfo, int devId, const QString &base, int parentId) { // Ignore excluded files if (MATCHES(m_exclusions, fileInfo.fileName())) { LOG(VB_FILE, LOG_INFO, QString("Excluding file %1").arg(fileInfo.absoluteFilePath())); return; } QString absFilePath = fileInfo.absoluteFilePath(); ImagePtr im(m_dbfs.CreateItem(fileInfo, parentId, devId, base)); if (!im) // Ignore unknown file type return; if (m_dbFileMap.contains(im->m_filePath)) { ImagePtrK dbIm = m_dbFileMap.value(im->m_filePath); // Parent may have changed due to a move if (im->m_modTime == dbIm->m_modTime && im->m_parentId == dbIm->m_parentId) { // File already known & hasn't changed // Remove it from removed list m_dbFileMap.remove(im->m_filePath); // Detect duplicates m_seenFile.insert(im->m_filePath, absFilePath); return; } LOG(VB_FILE, LOG_INFO, QString("Modified file %1").arg(absFilePath)); // Retain existing id & settings im->m_id = dbIm->m_id; im->m_isHidden = dbIm->m_isHidden; // Set date, comment from file meta data int fileOrient; PopulateMetadata(absFilePath, im->m_type, im->m_comment, im->m_date, fileOrient); // Reset file orientation, retaining existing setting int currentOrient = Orientation(dbIm->m_orientation).GetCurrent(false); im->m_orientation = Orientation(currentOrient, fileOrient).Composite(); // Remove it from removed list m_dbFileMap.remove(im->m_filePath); // Note modified images m_changedImages << QString::number(im->m_id); // Update db m_dbfs.UpdateDbImage(*im); } else if (m_seenFile.contains(im->m_filePath)) { LOG(VB_GENERAL, LOG_WARNING, QString("Ignoring %1 (Duplicate of %2)") .arg(absFilePath, m_seenFile.value(im->m_filePath))); return; } else { // New images will be assigned an id by the db AUTO-INCREMENT LOG(VB_FILE, LOG_INFO, QString("New file %1").arg(absFilePath)); // Set date, comment from file meta data int fileOrient; PopulateMetadata(absFilePath, im->m_type, im->m_comment, im->m_date, fileOrient); // Set file orientation im->m_orientation = Orientation(fileOrient, fileOrient).Composite(); // Update db (Set id for thumb generator) im->m_id = m_dbfs.InsertDbImage(*im); } // Detect duplicate filepaths in SG m_seenFile.insert(im->m_filePath, absFilePath); // Populate absolute filename so that thumbgen doesn't need to locate file im->m_filePath = absFilePath; // Ensure thumbnail exists. m_thumb.CreateThumbnail(im); }
WORD TestRule(ITEMID idRule) { WORD i = FALSE, nVars; WORD wLength; LISTID idMatchList; LISTID idVarList; EXPID idBody; GLOBALHANDLE hCopy1, hCopy2; LPEXP lpCopy1, lpCopy2; LPRULE lpRule = (LPRULE) KppGetItem(RULE, idRule); if (!lpRule) return ERROR; if ((idBody = BODY(lpRule)) == NULLID) { KppReleaseItem(RULE, idRule); return ERROR; } nVars = NUMVARS(lpRule); idVarList = VARS(lpRule); if (nVars > 0) { if (MATCHES(lpRule) != NULLID) KppDeleteMatchList(MATCHES(lpRule)); idMatchList = MATCHES(lpRule) = KppMakeList(0); } KppReleaseItem(RULE, idRule); if (nVars <= 0) { lpCopy1 = KppCopyTempExp(idBody, (GLOBALHANDLE FAR *)&hCopy1); UnwindProtect (cleanup_1); i = Kpp_EvalExp(lpCopy1 + 2); cleanup_1: KppReleaseTempExp (hCopy1, i); EndProtect(); return i; } else { KppEnumList(idVarList, KppLoadInstances, (LPSTR)(LONG)idMatchList); /* loop only if all classes have valid instances */ if (KppSelectElem(idMatchList, KppIsListEmpty, 0L) == NULLID) { lpCopy1 = (LPEXP)KppGetExp(idBody, &wLength); KppReleaseExp(idBody); lpCopy1 = KppCopyTempExp(idBody, (GLOBALHANDLE FAR *)&hCopy1); lpCopy2 = KppCopyTempExp(idBody, (GLOBALHANDLE FAR *)&hCopy2); UnwindProtect (cleanup_2); i = KppEvalAllMappings(lpCopy1,lpCopy2, wLength, idVarList, idMatchList, nVars, 0, TestARule, wSELECT); cleanup_2: KppReleaseTempExp (hCopy1,i); KppReleaseTempExp (hCopy2, i); EndProtect(); return i; } KappaReturnFalse; } }
NS_IMETHODIMP nsHTMLURIRefObject::GetNextURI(nsAString & aURI) { if (!mNode) return NS_ERROR_NOT_INITIALIZED; nsAutoString tagName; nsresult rv = mNode->GetNodeName(tagName); if (NS_FAILED(rv)) return rv; // Loop over attribute list: if (!mAttributes) { nsCOMPtr<nsIDOMElement> element (do_QueryInterface(mNode)); if (!element) return NS_ERROR_INVALID_ARG; mCurAttrIndex = 0; mNode->GetAttributes(getter_AddRefs(mAttributes)); if (!mAttributes) return NS_ERROR_NOT_INITIALIZED; rv = mAttributes->GetLength(&mAttributeCnt); NS_ENSURE_SUCCESS(rv, rv); if (!mAttributeCnt) return NS_ERROR_FAILURE; mCurAttrIndex = 0; } #ifdef DEBUG_akkana printf("Looking at tag '%s'\n", NS_LossyConvertUCS2toASCII(tagName).get()); #endif while (mCurAttrIndex < mAttributeCnt) { nsCOMPtr<nsIDOMNode> attrNode; rv = mAttributes->Item(mCurAttrIndex++, getter_AddRefs(attrNode)); // XXX Does Item() addref, or not? // The comparable code in nsEditor assumes it doesn't. NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_ARG_POINTER(attrNode); nsCOMPtr<nsIDOMAttr> curAttrNode (do_QueryInterface(attrNode)); NS_ENSURE_ARG_POINTER(curAttrNode); nsString curAttr; rv = curAttrNode->GetName(curAttr); NS_ENSURE_SUCCESS(rv, rv); // href >> A, AREA, BASE, LINK #ifdef DEBUG_akkana printf("Trying to match attribute '%s'\n", NS_LossyConvertUCS2toASCII(curAttr).get()); #endif if (MATCHES(curAttr, "href")) { if (!MATCHES(tagName, "a") && !MATCHES(tagName, "area") && !MATCHES(tagName, "base") && !MATCHES(tagName, "link")) continue; rv = curAttrNode->GetValue(aURI); NS_ENSURE_SUCCESS(rv, rv); nsString uri (aURI); // href pointing to a named anchor doesn't count if (aURI.First() != PRUnichar('#')) return NS_OK; aURI.Truncate(); return NS_ERROR_INVALID_ARG; } // src >> FRAME, IFRAME, IMG, INPUT, SCRIPT else if (MATCHES(curAttr, "src")) { if (!MATCHES(tagName, "img") && !MATCHES(tagName, "frame") && !MATCHES(tagName, "iframe") && !MATCHES(tagName, "input") && !MATCHES(tagName, "script")) continue; return curAttrNode->GetValue(aURI); } //<META http-equiv="refresh" content="3,http://www.acme.com/intro.html"> else if (MATCHES(curAttr, "content")) { if (!MATCHES(tagName, "meta")) continue; } // longdesc >> FRAME, IFRAME, IMG else if (MATCHES(curAttr, "longdesc")) { if (!MATCHES(tagName, "img") && !MATCHES(tagName, "frame") && !MATCHES(tagName, "iframe")) continue; } // usemap >> IMG, INPUT, OBJECT else if (MATCHES(curAttr, "usemap")) { if (!MATCHES(tagName, "img") && !MATCHES(tagName, "input") && !MATCHES(tagName, "object")) continue; } // action >> FORM else if (MATCHES(curAttr, "action")) { if (!MATCHES(tagName, "form")) continue; } // background >> BODY else if (MATCHES(curAttr, "background")) { if (!MATCHES(tagName, "body")) continue; } // codebase >> OBJECT, APPLET else if (MATCHES(curAttr, "codebase")) { if (!MATCHES(tagName, "meta")) continue; } // classid >> OBJECT else if (MATCHES(curAttr, "classid")) { if (!MATCHES(tagName, "object")) continue; } // data >> OBJECT else if (MATCHES(curAttr, "data")) { if (!MATCHES(tagName, "object")) continue; } // cite >> BLOCKQUOTE, DEL, INS, Q else if (MATCHES(curAttr, "cite")) { if (!MATCHES(tagName, "blockquote") && !MATCHES(tagName, "q") && !MATCHES(tagName, "del") && !MATCHES(tagName, "ins")) continue; } // profile >> HEAD else if (MATCHES(curAttr, "profile")) { if (!MATCHES(tagName, "head")) continue; } // archive attribute on APPLET; warning, it contains a list of URIs. else if (MATCHES(curAttr, "archive")) { if (!MATCHES(tagName, "applet")) continue; } } // Return a code to indicate that there are no more, // to distinguish that case from real errors. return NS_ERROR_NOT_AVAILABLE; }
mtev_boolean noit_apply_filterset(const char *filterset, noit_check_t *check, metric_t *metric) { /* We pass in filterset here just in case someone wants to apply * a filterset other than check->filterset.. You never know. */ void *vfs; if(!filterset) return mtev_true; /* No filter */ if(!filtersets) return mtev_false; /* Couldn't possibly match */ LOCKFS(); if(mtev_hash_retrieve(filtersets, filterset, strlen(filterset), &vfs)) { filterset_t *fs = (filterset_t *)vfs; filterrule_t *r, *skipto_rule = NULL; int idx = 0; mtev_atomic_inc32(&fs->ref_cnt); UNLOCKFS(); #define MATCHES(rname, value) noit_apply_filterrule(r->rname##_ht, r->rname ? r->rname : r->rname##_override, r->rname ? r->rname##_e : NULL, value) for(r = fs->rules; r; r = r->next) { int need_target, need_module, need_name, need_metric; /* If we're targeting a skipto rule, match or continue */ idx++; if(skipto_rule && skipto_rule != r) continue; skipto_rule = NULL; need_target = !MATCHES(target, check->target); need_module = !MATCHES(module, check->module); need_name = !MATCHES(name, check->name); need_metric = !MATCHES(metric, metric->metric_name); if(!need_target && !need_module && !need_name && !need_metric) { if(r->type == NOIT_FILTER_SKIPTO) { skipto_rule = r->skipto_rule; continue; } return (r->type == NOIT_FILTER_ACCEPT) ? mtev_true : mtev_false; } /* If we need some of these and we have an auto setting that isn't fulfilled for each of them, we can add and succeed */ #define CHECK_ADD(rname) (!need_##rname || (r->rname##_auto_hash_max > 0 && r->rname##_ht && mtev_hash_size(r->rname##_ht) < r->rname##_auto_hash_max)) if(CHECK_ADD(target) && CHECK_ADD(module) && CHECK_ADD(name) && CHECK_ADD(metric)) { #define UPDATE_FILTER_RULE(rnum, rname, value) do { \ mtev_hash_replace(r->rname##_ht, strdup(value), strlen(value), NULL, free, NULL); \ if(noit_filter_update_conf_rule(fs->name, rnum, #rname, value) < 0) { \ mtevL(noit_error, "Error updating configuration for new filter auto_add on %s=%s\n", #rname, value); \ } \ } while(0) if(need_target) UPDATE_FILTER_RULE(idx, target, check->target); if(need_module) UPDATE_FILTER_RULE(idx, module, check->module); if(need_name) UPDATE_FILTER_RULE(idx, name, check->name); if(need_metric) UPDATE_FILTER_RULE(idx, metric, metric->metric_name); noit_filterset_log_auto_add(fs->name, check, metric, r->type == NOIT_FILTER_ACCEPT); if(r->type == NOIT_FILTER_SKIPTO) { skipto_rule = r->skipto_rule; continue; } return (r->type == NOIT_FILTER_ACCEPT) ? mtev_true : mtev_false; } } filterset_free(fs); return mtev_false; } UNLOCKFS(); return mtev_false; }
int main(int argc, char **argv) { RTEXITCODE rcExit; /* * Init globals and such. */ int rc = RTR3InitExe(argc, &argv, 0); if (RT_FAILURE(rc)) return RTMsgInitFailure(rc); g_pszProgName = RTPathFilename(argv[0]); #ifdef DEBUG rc = RTCritSectInit(&g_csLog); AssertRC(rc); #endif #ifdef VBOXSERVICE_TOOLBOX /* * Run toolbox code before all other stuff since these things are simpler * shell/file/text utility like programs that just happens to be inside * VBoxService and shouldn't be subject to /dev/vboxguest, pid-files and * global mutex restrictions. */ if (VBoxServiceToolboxMain(argc, argv, &rcExit)) return rcExit; #endif /* * Connect to the kernel part before daemonizing so we can fail and * complain if there is some kind of problem. We need to initialize the * guest lib *before* we do the pre-init just in case one of services needs * do to some initial stuff with it. */ VBoxServiceVerbose(2, "Calling VbgR3Init()\n"); rc = VbglR3Init(); if (RT_FAILURE(rc)) { if (rc == VERR_ACCESS_DENIED) return RTMsgErrorExit(RTEXITCODE_FAILURE, "Insufficient privileges to start %s! Please start with Administrator/root privileges!\n", g_pszProgName); return RTMsgErrorExit(RTEXITCODE_FAILURE, "VbglR3Init failed with rc=%Rrc\n", rc); } #ifdef RT_OS_WINDOWS /* * Check if we're the specially spawned VBoxService.exe process that * handles page fusion. This saves an extra executable. */ if ( argc == 2 && !strcmp(argv[1], "--pagefusionfork")) return VBoxServicePageSharingInitFork(); #endif char szLogFile[RTPATH_MAX + 128] = ""; /* * Parse the arguments. * * Note! This code predates RTGetOpt, thus the manual parsing. */ bool fDaemonize = true; bool fDaemonized = false; for (int i = 1; i < argc; i++) { const char *psz = argv[i]; if (*psz != '-') return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown argument '%s'\n", psz); psz++; /* translate long argument to short */ if (*psz == '-') { psz++; size_t cch = strlen(psz); #define MATCHES(strconst) ( cch == sizeof(strconst) - 1 \ && !memcmp(psz, strconst, sizeof(strconst) - 1) ) if (MATCHES("foreground")) psz = "f"; else if (MATCHES("verbose")) psz = "v"; else if (MATCHES("version")) psz = "V"; else if (MATCHES("help")) psz = "h"; else if (MATCHES("interval")) psz = "i"; #ifdef RT_OS_WINDOWS else if (MATCHES("register")) psz = "r"; else if (MATCHES("unregister")) psz = "u"; #endif else if (MATCHES("logfile")) psz = "l"; else if (MATCHES("daemonized")) { fDaemonized = true; continue; } else { bool fFound = false; if (cch > sizeof("enable-") && !memcmp(psz, "enable-", sizeof("enable-") - 1)) for (unsigned j = 0; !fFound && j < RT_ELEMENTS(g_aServices); j++) if ((fFound = !RTStrICmp(psz + sizeof("enable-") - 1, g_aServices[j].pDesc->pszName))) g_aServices[j].fEnabled = true; if (cch > sizeof("disable-") && !memcmp(psz, "disable-", sizeof("disable-") - 1)) for (unsigned j = 0; !fFound && j < RT_ELEMENTS(g_aServices); j++) if ((fFound = !RTStrICmp(psz + sizeof("disable-") - 1, g_aServices[j].pDesc->pszName))) g_aServices[j].fEnabled = false; if (cch > sizeof("only-") && !memcmp(psz, "only-", sizeof("only-") - 1)) for (unsigned j = 0; j < RT_ELEMENTS(g_aServices); j++) { g_aServices[j].fEnabled = !RTStrICmp(psz + sizeof("only-") - 1, g_aServices[j].pDesc->pszName); if (g_aServices[j].fEnabled) fFound = true; } if (!fFound) { rcExit = vboxServiceLazyPreInit(); if (rcExit != RTEXITCODE_SUCCESS) return rcExit; for (unsigned j = 0; !fFound && j < RT_ELEMENTS(g_aServices); j++) { rc = g_aServices[j].pDesc->pfnOption(NULL, argc, argv, &i); fFound = rc == VINF_SUCCESS; if (fFound) break; if (rc != -1) return rc; } } if (!fFound) return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown option '%s'\n", argv[i]); continue; } #undef MATCHES } /* handle the string of short options. */ do { switch (*psz) { case 'i': rc = VBoxServiceArgUInt32(argc, argv, psz + 1, &i, &g_DefaultInterval, 1, (UINT32_MAX / 1000) - 1); if (rc) return rc; psz = NULL; break; case 'f': fDaemonize = false; break; case 'v': g_cVerbosity++; break; case 'V': RTPrintf("%sr%s\n", RTBldCfgVersion(), RTBldCfgRevisionStr()); return RTEXITCODE_SUCCESS; case 'h': case '?': return vboxServiceUsage(); #ifdef RT_OS_WINDOWS case 'r': return VBoxServiceWinInstall(); case 'u': return VBoxServiceWinUninstall(); #endif case 'l': { rc = VBoxServiceArgString(argc, argv, psz + 1, &i, szLogFile, sizeof(szLogFile)); if (rc) return rc; psz = NULL; break; } default: { rcExit = vboxServiceLazyPreInit(); if (rcExit != RTEXITCODE_SUCCESS) return rcExit; bool fFound = false; for (unsigned j = 0; j < RT_ELEMENTS(g_aServices); j++) { rc = g_aServices[j].pDesc->pfnOption(&psz, argc, argv, &i); fFound = rc == VINF_SUCCESS; if (fFound) break; if (rc != -1) return rc; } if (!fFound) return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown option '%c' (%s)\n", *psz, argv[i]); break; } } } while (psz && *++psz); } /* Check that at least one service is enabled. */ if (vboxServiceCountEnabledServices() == 0) return RTMsgErrorExit(RTEXITCODE_SYNTAX, "At least one service must be enabled\n"); rc = VBoxServiceLogCreate(strlen(szLogFile) ? szLogFile : NULL); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to create release log (%s, %Rrc)", strlen(szLogFile) ? szLogFile : "<None>", rc); /* Call pre-init if we didn't do it already. */ rcExit = vboxServiceLazyPreInit(); if (rcExit != RTEXITCODE_SUCCESS) return rcExit; #ifdef RT_OS_WINDOWS /* * Make sure only one instance of VBoxService runs at a time. Create a * global mutex for that. * * Note! The \\Global\ namespace was introduced with Win2K, thus the * version check. * Note! If the mutex exists CreateMutex will open it and set last error to * ERROR_ALREADY_EXISTS. */ OSVERSIONINFOEX OSInfoEx; RT_ZERO(OSInfoEx); OSInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); SetLastError(NO_ERROR); HANDLE hMutexAppRunning; if ( GetVersionEx((LPOSVERSIONINFO)&OSInfoEx) && OSInfoEx.dwPlatformId == VER_PLATFORM_WIN32_NT && OSInfoEx.dwMajorVersion >= 5 /* NT 5.0 a.k.a W2K */) hMutexAppRunning = CreateMutex(NULL, FALSE, "Global\\" VBOXSERVICE_NAME); else hMutexAppRunning = CreateMutex(NULL, FALSE, VBOXSERVICE_NAME); if (hMutexAppRunning == NULL) { DWORD dwErr = GetLastError(); if ( dwErr == ERROR_ALREADY_EXISTS || dwErr == ERROR_ACCESS_DENIED) { VBoxServiceError("%s is already running! Terminating.", g_pszProgName); return RTEXITCODE_FAILURE; } VBoxServiceError("CreateMutex failed with last error %u! Terminating", GetLastError()); return RTEXITCODE_FAILURE; } #else /* !RT_OS_WINDOWS */ /** @todo Add PID file creation here? */ #endif /* !RT_OS_WINDOWS */ VBoxServiceVerbose(0, "%s r%s started. Verbose level = %d\n", RTBldCfgVersion(), RTBldCfgRevisionStr(), g_cVerbosity); /* * Daemonize if requested. */ if (fDaemonize && !fDaemonized) { #ifdef RT_OS_WINDOWS VBoxServiceVerbose(2, "Starting service dispatcher ...\n"); rcExit = VBoxServiceWinEnterCtrlDispatcher(); #else VBoxServiceVerbose(1, "Daemonizing...\n"); rc = VbglR3Daemonize(false /* fNoChDir */, false /* fNoClose */); if (RT_FAILURE(rc)) return VBoxServiceError("Daemon failed: %Rrc\n", rc); /* in-child */ #endif } #ifdef RT_OS_WINDOWS else #endif { /* * Windows: We're running the service as a console application now. Start the * services, enter the main thread's run loop and stop them again * when it returns. * * POSIX: This is used for both daemons and console runs. Start all services * and return immediately. */ #ifdef RT_OS_WINDOWS # ifndef RT_OS_NT4 /* Install console control handler. */ if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)VBoxServiceConsoleControlHandler, TRUE /* Add handler */)) { VBoxServiceError("Unable to add console control handler, error=%ld\n", GetLastError()); /* Just skip this error, not critical. */ } # endif /* !RT_OS_NT4 */ #endif /* RT_OS_WINDOWS */ rc = VBoxServiceStartServices(); rcExit = RT_SUCCESS(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE; if (RT_SUCCESS(rc)) VBoxServiceMainWait(); #ifdef RT_OS_WINDOWS # ifndef RT_OS_NT4 /* Uninstall console control handler. */ if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)NULL, FALSE /* Remove handler */)) { VBoxServiceError("Unable to remove console control handler, error=%ld\n", GetLastError()); /* Just skip this error, not critical. */ } # endif /* !RT_OS_NT4 */ #else /* !RT_OS_WINDOWS */ /* On Windows - since we're running as a console application - we already stopped all services * through the console control handler. So only do the stopping of services here on other platforms * where the break/shutdown/whatever signal was just received. */ VBoxServiceStopServices(); #endif /* RT_OS_WINDOWS */ } VBoxServiceReportStatus(VBoxGuestFacilityStatus_Terminated); #ifdef RT_OS_WINDOWS /* * Cleanup mutex. */ CloseHandle(hMutexAppRunning); #endif VBoxServiceVerbose(0, "Ended.\n"); #ifdef DEBUG RTCritSectDelete(&g_csLog); //RTMemTrackerDumpAllToStdOut(); #endif VBoxServiceLogDestroy(); return rcExit; }
NS_IMETHODIMP nsHTMLURIRefObject::GetNextURI(nsAString & aURI) { NS_ENSURE_TRUE(mNode, NS_ERROR_NOT_INITIALIZED); nsAutoString tagName; nsresult rv = mNode->GetNodeName(tagName); NS_ENSURE_SUCCESS(rv, rv); // Loop over attribute list: if (!mAttributes) { nsCOMPtr<nsIDOMElement> element (do_QueryInterface(mNode)); NS_ENSURE_TRUE(element, NS_ERROR_INVALID_ARG); mCurAttrIndex = 0; element->GetAttributes(getter_AddRefs(mAttributes)); NS_ENSURE_TRUE(mAttributes, NS_ERROR_NOT_INITIALIZED); rv = mAttributes->GetLength(&mAttributeCnt); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(mAttributeCnt, NS_ERROR_FAILURE); mCurAttrIndex = 0; } while (mCurAttrIndex < mAttributeCnt) { nsCOMPtr<nsIDOMAttr> attrNode; rv = mAttributes->Item(mCurAttrIndex++, getter_AddRefs(attrNode)); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_ARG_POINTER(attrNode); nsString curAttr; rv = attrNode->GetName(curAttr); NS_ENSURE_SUCCESS(rv, rv); // href >> A, AREA, BASE, LINK if (MATCHES(curAttr, "href")) { if (!MATCHES(tagName, "a") && !MATCHES(tagName, "area") && !MATCHES(tagName, "base") && !MATCHES(tagName, "link")) continue; rv = attrNode->GetValue(aURI); NS_ENSURE_SUCCESS(rv, rv); nsString uri (aURI); // href pointing to a named anchor doesn't count if (aURI.First() != char16_t('#')) return NS_OK; aURI.Truncate(); return NS_ERROR_INVALID_ARG; } // src >> FRAME, IFRAME, IMG, INPUT, SCRIPT else if (MATCHES(curAttr, "src")) { if (!MATCHES(tagName, "img") && !MATCHES(tagName, "frame") && !MATCHES(tagName, "iframe") && !MATCHES(tagName, "input") && !MATCHES(tagName, "script")) continue; return attrNode->GetValue(aURI); } //<META http-equiv="refresh" content="3,http://www.acme.com/intro.html"> else if (MATCHES(curAttr, "content")) { if (!MATCHES(tagName, "meta")) continue; } // longdesc >> FRAME, IFRAME, IMG else if (MATCHES(curAttr, "longdesc")) { if (!MATCHES(tagName, "img") && !MATCHES(tagName, "frame") && !MATCHES(tagName, "iframe")) continue; } // usemap >> IMG, INPUT, OBJECT else if (MATCHES(curAttr, "usemap")) { if (!MATCHES(tagName, "img") && !MATCHES(tagName, "input") && !MATCHES(tagName, "object")) continue; } // action >> FORM else if (MATCHES(curAttr, "action")) { if (!MATCHES(tagName, "form")) continue; } // background >> BODY else if (MATCHES(curAttr, "background")) { if (!MATCHES(tagName, "body")) continue; } // codebase >> OBJECT, APPLET else if (MATCHES(curAttr, "codebase")) { if (!MATCHES(tagName, "meta")) continue; } // classid >> OBJECT else if (MATCHES(curAttr, "classid")) { if (!MATCHES(tagName, "object")) continue; } // data >> OBJECT else if (MATCHES(curAttr, "data")) { if (!MATCHES(tagName, "object")) continue; } // cite >> BLOCKQUOTE, DEL, INS, Q else if (MATCHES(curAttr, "cite")) { if (!MATCHES(tagName, "blockquote") && !MATCHES(tagName, "q") && !MATCHES(tagName, "del") && !MATCHES(tagName, "ins")) continue; } // profile >> HEAD else if (MATCHES(curAttr, "profile")) { if (!MATCHES(tagName, "head")) continue; } // archive attribute on APPLET; warning, it contains a list of URIs. else if (MATCHES(curAttr, "archive")) { if (!MATCHES(tagName, "applet")) continue; } } // Return a code to indicate that there are no more, // to distinguish that case from real errors. return NS_ERROR_NOT_AVAILABLE; }
/* * Deserialize args, settings and user_info arrays. * Fills in struct sudo_user and other common sudoers state. */ int sudoers_policy_deserialize_info(void *v, char **runas_user, char **runas_group) { struct sudoers_policy_open_info *info = v; char * const *cur; const char *p, *errstr, *groups = NULL; const char *remhost = NULL; int flags = 0; debug_decl(sudoers_policy_deserialize_info, SUDOERS_DEBUG_PLUGIN) #define MATCHES(s, v) (strncmp(s, v, sizeof(v) - 1) == 0) /* Parse sudo.conf plugin args. */ if (info->plugin_args != NULL) { for (cur = info->plugin_args; *cur != NULL; cur++) { if (MATCHES(*cur, "sudoers_file=")) { sudoers_file = *cur + sizeof("sudoers_file=") - 1; continue; } if (MATCHES(*cur, "sudoers_uid=")) { p = *cur + sizeof("sudoers_uid=") - 1; sudoers_uid = (uid_t) sudo_strtoid(p, NULL, NULL, &errstr); if (errstr != NULL) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "sudoers_gid=")) { p = *cur + sizeof("sudoers_gid=") - 1; sudoers_gid = (gid_t) sudo_strtoid(p, NULL, NULL, &errstr); if (errstr != NULL) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "sudoers_mode=")) { p = *cur + sizeof("sudoers_mode=") - 1; sudoers_mode = sudo_strtomode(p, &errstr); if (errstr != NULL) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "ldap_conf=")) { path_ldap_conf = *cur + sizeof("ldap_conf=") - 1; continue; } if (MATCHES(*cur, "ldap_secret=")) { path_ldap_secret = *cur + sizeof("ldap_secret=") - 1; continue; } } } /* Parse command line settings. */ user_closefrom = -1; for (cur = info->settings; *cur != NULL; cur++) { if (MATCHES(*cur, "closefrom=")) { errno = 0; p = *cur + sizeof("closefrom=") - 1; user_closefrom = strtonum(p, 4, INT_MAX, &errstr); if (user_closefrom == 0) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "runas_user="******"runas_user="******"runas_group=")) { *runas_group = *cur + sizeof("runas_group=") - 1; sudo_user.flags |= RUNAS_GROUP_SPECIFIED; continue; } if (MATCHES(*cur, "prompt=")) { user_prompt = *cur + sizeof("prompt=") - 1; def_passprompt_override = true; continue; } if (MATCHES(*cur, "set_home=")) { if (sudo_strtobool(*cur + sizeof("set_home=") - 1) == true) SET(flags, MODE_RESET_HOME); continue; } if (MATCHES(*cur, "preserve_environment=")) { if (sudo_strtobool(*cur + sizeof("preserve_environment=") - 1) == true) SET(flags, MODE_PRESERVE_ENV); continue; } if (MATCHES(*cur, "run_shell=")) { if (sudo_strtobool(*cur + sizeof("run_shell=") - 1) == true) SET(flags, MODE_SHELL); continue; } if (MATCHES(*cur, "login_shell=")) { if (sudo_strtobool(*cur + sizeof("login_shell=") - 1) == true) { SET(flags, MODE_LOGIN_SHELL); def_env_reset = true; } continue; } if (MATCHES(*cur, "implied_shell=")) { if (sudo_strtobool(*cur + sizeof("implied_shell=") - 1) == true) SET(flags, MODE_IMPLIED_SHELL); continue; } if (MATCHES(*cur, "preserve_groups=")) { if (sudo_strtobool(*cur + sizeof("preserve_groups=") - 1) == true) SET(flags, MODE_PRESERVE_GROUPS); continue; } if (MATCHES(*cur, "ignore_ticket=")) { if (sudo_strtobool(*cur + sizeof("ignore_ticket=") - 1) == true) SET(flags, MODE_IGNORE_TICKET); continue; } if (MATCHES(*cur, "noninteractive=")) { if (sudo_strtobool(*cur + sizeof("noninteractive=") - 1) == true) SET(flags, MODE_NONINTERACTIVE); continue; } if (MATCHES(*cur, "sudoedit=")) { if (sudo_strtobool(*cur + sizeof("sudoedit=") - 1) == true) SET(flags, MODE_EDIT); continue; } if (MATCHES(*cur, "login_class=")) { login_class = *cur + sizeof("login_class=") - 1; def_use_loginclass = true; continue; } #ifdef HAVE_PRIV_SET if (MATCHES(*cur, "runas_privs=")) { def_privs = *cur + sizeof("runas_privs=") - 1; continue; } if (MATCHES(*cur, "runas_limitprivs=")) { def_limitprivs = *cur + sizeof("runas_limitprivs=") - 1; continue; } #endif /* HAVE_PRIV_SET */ #ifdef HAVE_SELINUX if (MATCHES(*cur, "selinux_role=")) { user_role = *cur + sizeof("selinux_role=") - 1; continue; } if (MATCHES(*cur, "selinux_type=")) { user_type = *cur + sizeof("selinux_type=") - 1; continue; } #endif /* HAVE_SELINUX */ #ifdef HAVE_BSD_AUTH_H if (MATCHES(*cur, "bsdauth_type=")) { login_style = *cur + sizeof("bsdauth_type=") - 1; continue; } #endif /* HAVE_BSD_AUTH_H */ if (MATCHES(*cur, "network_addrs=")) { interfaces_string = *cur + sizeof("network_addrs=") - 1; set_interfaces(interfaces_string); continue; } if (MATCHES(*cur, "max_groups=")) { errno = 0; p = *cur + sizeof("max_groups=") - 1; sudo_user.max_groups = strtonum(p, 1, INT_MAX, &errstr); if (sudo_user.max_groups == 0) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "remote_host=")) { remhost = *cur + sizeof("remote_host=") - 1; continue; } } for (cur = info->user_info; *cur != NULL; cur++) { if (MATCHES(*cur, "user="******"user="******"uid=")) { p = *cur + sizeof("uid=") - 1; user_uid = (uid_t) sudo_strtoid(p, NULL, NULL, &errstr); if (errstr != NULL) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "gid=")) { p = *cur + sizeof("gid=") - 1; user_gid = (gid_t) sudo_strtoid(p, NULL, NULL, &errstr); if (errstr != NULL) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "groups=")) { groups = *cur + sizeof("groups=") - 1; continue; } if (MATCHES(*cur, "cwd=")) { user_cwd = sudo_estrdup(*cur + sizeof("cwd=") - 1); continue; } if (MATCHES(*cur, "tty=")) { user_tty = user_ttypath = sudo_estrdup(*cur + sizeof("tty=") - 1); if (strncmp(user_tty, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0) user_tty += sizeof(_PATH_DEV) - 1; continue; } if (MATCHES(*cur, "host=")) { user_host = user_shost = sudo_estrdup(*cur + sizeof("host=") - 1); if ((p = strchr(user_host, '.'))) user_shost = sudo_estrndup(user_host, (size_t)(p - user_host)); continue; } if (MATCHES(*cur, "lines=")) { errno = 0; p = *cur + sizeof("lines=") - 1; sudo_user.lines = strtonum(p, 1, INT_MAX, &errstr); if (sudo_user.lines == 0) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "cols=")) { errno = 0; p = *cur + sizeof("cols=") - 1; sudo_user.cols = strtonum(p, 1, INT_MAX, &errstr); if (sudo_user.lines == 0) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } if (MATCHES(*cur, "sid=")) { p = *cur + sizeof("sid=") - 1; sudo_user.sid = (pid_t) sudo_strtoid(p, NULL, NULL, &errstr); if (errstr != NULL) { sudo_warnx(U_("%s: %s"), *cur, U_(errstr)); goto bad; } continue; } } user_runhost = user_srunhost = sudo_estrdup(remhost ? remhost : user_host); if ((p = strchr(user_runhost, '.'))) user_srunhost = sudo_estrndup(user_runhost, (size_t)(p - user_runhost)); if (user_cwd == NULL) user_cwd = sudo_estrdup("unknown"); if (user_tty == NULL) user_tty = sudo_estrdup("unknown"); /* user_ttypath remains NULL */ if (groups != NULL && groups[0] != '\0') { /* sudo_parse_gids() will print a warning on error. */ user_ngids = sudo_parse_gids(groups, &user_gid, &user_gids); if (user_ngids == -1) goto bad; } /* Stash initial umask for later use. */ user_umask = umask(SUDO_UMASK); umask(user_umask); /* Dump settings and user info (XXX - plugin args) */ for (cur = info->settings; *cur != NULL; cur++) sudo_debug_printf(SUDO_DEBUG_INFO, "settings: %s", *cur); for (cur = info->user_info; *cur != NULL; cur++) sudo_debug_printf(SUDO_DEBUG_INFO, "user_info: %s", *cur); #undef MATCHES debug_return_int(flags); bad: debug_return_int(MODE_ERROR); }