/** * Tests the cgroup_attach_cgroup() api under different scenarios * @param retcode error code in case any error is expected from api * @param cgrp the group to assign the task to * @param group1 the name of the group under first (single) mountpoint * @param group2 the name of the group under 2nd moutpoint for multimount * @param i the test number * @param k the message enum number to print the useful message */ void test_cgroup_attach_task(int retcode, struct cgroup *cgrp, const char *group1, const char *group2, pid_t pid, int k, int i) { int retval; char tasksfile[FILENAME_MAX], tasksfile2[FILENAME_MAX]; /* Check, In case some error is expected due to a negative scenario */ if (retcode) { if (pid) retval = cgroup_attach_task_pid(cgrp, pid); else retval = cgroup_attach_task(cgrp); if (retval == retcode) message(i, PASS, "attach_task()", retval, info[k]); else message(i, FAIL, "attach_task()", retval, info[k]); return; } /* Now there is no error and it is a genuine call */ if (pid) retval = cgroup_attach_task_pid(cgrp, pid); else retval = cgroup_attach_task(cgrp); /* API returned success, so perform check */ if (retval == 0) { build_path(tasksfile, mountpoint, group1, "tasks"); if (check_task(tasksfile, 0)) { if (fs_mounted == 2) { /* multiple mounts */ build_path(tasksfile2, mountpoint2, group2, "tasks"); if (check_task(tasksfile2, 0)) { message(i, PASS, "attach_task()", retval, info[TASKINGRP]); } else { message(i, FAIL, "attach_task()", retval, info[TASKNOTINANYGRP]); } } else { /* single mount */ message(i, PASS, "attach_task()", retval, info[TASKINGRP]); } } else { message(i, FAIL, "attach_task()", retval, info[TASKNOTINGRP]); } } else { message(i, FAIL, "attach_task()", retval, (char *)"\n"); } }
char *find_name_by_proc(int target){ DIR *dir; struct dirent *dent; char task_file[50], cmdline[64]; int pid, fd; if(!(dir=opendir("/proc"))) { perror("open proc"); return NULL; } TASK_TYPE = ""; while(dent = readdir(dir)) { if((pid=atoi(dent->d_name)) > 1) { memset(task_file, 0, sizeof(task_file)); sprintf(task_file, "/proc/%d/cmdline", pid); if((fd=open(task_file, O_RDONLY)) > 0) { memset(cmdline, 0, sizeof(cmdline)); read(fd, cmdline, sizeof(cmdline)); check_task(cmdline, target); close(fd); } else printf("cannot open %s\n", task_file); } } closedir(dir); return TASK_TYPE; }
CFDictionaryRef SecTaskCopyValuesForEntitlements(SecTaskRef task, CFArrayRef entitlements, CFErrorRef *error) { CFMutableDictionaryRef values = NULL; require(check_task(task), out); /* Load entitlements if necessary */ if (task->entitlementsLoaded == false) { SecTaskLoadEntitlements(task, error); } /* Iterate over the passed in entitlements, populating the dictionary * If entitlements were loaded but none were present, return an empty * dictionary */ if (task->entitlementsLoaded == true) { CFIndex i, count = CFArrayGetCount(entitlements); values = CFDictionaryCreateMutable(CFGetAllocator(task), count, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); if (task->entitlements != NULL) { for (i = 0; i < count; i++) { CFStringRef entitlement = CFArrayGetValueAtIndex(entitlements, i); CFTypeRef value = CFDictionaryGetValue(task->entitlements, entitlement); if (value != NULL) { CFDictionarySetValue(values, entitlement, value); } } } } out: return values; }
CFTypeRef SecTaskCopyValueForEntitlement(SecTaskRef task, CFStringRef entitlement, CFErrorRef *error) { CFTypeRef value = NULL; require(check_task(task), out); /* Load entitlements if necessary */ if (task->entitlementsLoaded == false) { require_quiet(SecTaskLoadEntitlements(task, error), out); } if (task->entitlements != NULL) { value = CFDictionaryGetValue(task->entitlements, entitlement); /* Return something the caller must release */ if (value != NULL) { CFRetain(value); } } out: return value; }