CFStringRef WBProcessCopyNameForPID(pid_t pid) { /* if current process */ if (pid == getpid()) { spx_assert(getprogname(), "progname required"); return CFStringCreateWithCString(kCFAllocatorDefault, getprogname(), kCFStringEncodingUTF8); } /* try to use carbon process manager */ ProcessSerialNumber psn; if (noErr == GetProcessForPID(pid, &psn)) { CFStringRef name = NULL; if (noErr == CopyProcessName(&psn, &name)) return name; } CFStringRef name = NULL; /* fall back: use sysctl */ size_t len = 0; char stackbuf[2048]; char *buffer = stackbuf; int mig[] = { CTL_KERN, KERN_PROCARGS, pid }; int err = sysctl(mig, 3, NULL, &len, NULL, 0); if (0 == err && len > 0) { if (len > 2048) buffer = malloc(len); buffer[0] = '\0'; err = sysctl(mig, 3, buffer, &len, NULL, 0); if (0 == err && strlen(buffer) > 0) { name = CFStringCreateWithCString(kCFAllocatorDefault, basename(buffer), kCFStringEncodingUTF8); } if (buffer != stackbuf) free(buffer); } return name; }
bool testProcessName(const char* name, const ProcessSerialNumber& psn) { CFStringRef processName; OSStatus err = CopyProcessName(&psn, &processName); return (err == 0 && CFEqual(CFSTR("ScreenSaverEngine"), processName)); }
CFStringRef copyCurrentProcessName(void) { ProcessSerialNumber PSN = { 0, kCurrentProcess }; CFStringRef name = NULL; OSStatus err = CopyProcessName(&PSN, &name); if (err != noErr) { NSLog(CFSTR("in copyCurrentProcessName in CFGrowlAdditions: Could not get process name because CopyProcessName returned %li"), (long)err); name = NULL; } return name; }
void COSXScreenSaver::processLaunched(ProcessSerialNumber psn) { CFStringRef processName; OSStatus err = CopyProcessName(&psn, &processName); if (err == 0 && CFEqual(CFSTR("ScreenSaverEngine"), processName)) { m_screenSaverPSN = psn; LOG((CLOG_DEBUG1 "ScreenSaverEngine launched. Enabled=%d", m_enabled)); if (m_enabled) { EVENTQUEUE->addEvent( CEvent(IPrimaryScreen::getScreensaverActivatedEvent(), m_eventTarget)); } } }
bool application_is_open(CFStringRef appName, ProcessSerialNumber *psn) { OSStatus status; ProcessSerialNumber currentProcessPSN = {kNoProcess, kNoProcess}; status = GetNextProcess(¤tProcessPSN); while (status == noErr) { CFStringRef processName = NULL; status = CopyProcessName(¤tProcessPSN, &processName); if (status != noErr) die("CopyProcessName failed"); if (NULL == processName) die("CopyProcessName succeeded, but the process name is NULL!"); if (kCFCompareEqualTo == CFStringCompare(processName, appName, 0)) { memcpy(psn, ¤tProcessPSN, sizeof(*psn)); return TRUE; } status = GetNextProcess(¤tProcessPSN); } return FALSE; }
void list_open_applications() { OSStatus status; ProcessSerialNumber currentProcessPSN = {kNoProcess, kNoProcess}; status = GetNextProcess(¤tProcessPSN); while (status == noErr) { CFStringRef processName = NULL; char name[32]; status = CopyProcessName(¤tProcessPSN, &processName); if (status != noErr) die("CopyProcessName failed"); if (NULL == processName) die("CopyProcessName succeeded, but the process name is NULL!"); CFStringGetCString(processName, &name[0], 32, kCFStringEncodingUTF8); printf("{ 0x%x, 0x%08x } %s\n", currentProcessPSN.highLongOfPSN, currentProcessPSN.lowLongOfPSN, &name); status = GetNextProcess(¤tProcessPSN); } }