summaryrefslogtreecommitdiffstats
path: root/src/common/processing.h
blob: 51105c8baf1e5b43d37d453d916cbccdd2c9d28a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#pragma once

#include "common/FFstrbuf.h"

#ifndef _WIN32
    #include <sys/types.h> // pid_t
#endif

typedef struct FFProcessHandle {
#if _WIN32
    void* pid;      // HANDLE
    void* pipeRead; // HANDLE
#else
    pid_t pid;
    int pipeRead;
#endif
} FFProcessHandle;

const char* ffProcessSpawn(char* const argv[], bool useStdErr, FFProcessHandle* outHandle);
const char* ffProcessReadOutput(FFProcessHandle* handle, FFstrbuf* buffer); // Destroys handle internally

static inline const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[]) {
    FFProcessHandle handle;
    const char* error = ffProcessSpawn(argv, false, &handle);
    if (error) {
        return error;
    }

    error = ffProcessReadOutput(&handle, buffer);
    if (!error) {
        ffStrbufTrimRightSpace(buffer);
    }
    return error;
}

static inline const char* ffProcessAppendStdErr(FFstrbuf* buffer, char* const argv[]) {
    FFProcessHandle handle;
    const char* error = ffProcessSpawn(argv, true, &handle);
    if (error) {
        return error;
    }

    error = ffProcessReadOutput(&handle, buffer);
    if (!error) {
        ffStrbufTrimRightSpace(buffer);
    }
    return error;
}

#ifdef _WIN32
bool ffProcessGetInfoWindows(uint32_t pid, uint32_t* ppid, FFstrbuf* pname, FFstrbuf* exe, const char** exeName, FFstrbuf* exePath, bool* gui);
#else
void ffProcessGetInfoLinux(pid_t pid, FFstrbuf* processName, FFstrbuf* exe, const char** exeName, FFstrbuf* exePath);
const char* ffProcessGetBasicInfoLinux(pid_t pid, FFstrbuf* name, pid_t* ppid, int32_t* tty);
#endif