aboutsummaryrefslogtreecommitdiff
path: root/linux-bin/zzz.nim
blob: eac2797859d99f218145baa39130e961b5d05377 (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Just a copy of the C version.
# I don't actually use this at the moment, but it was a nice small
# introduction of using nim for something.
import std/strformat
import std/envvars
import std/os
import posix
import posix_utils as putils

let power_state_f = "/sys/power/state"

proc suspend() =
    writeFile(power_state_f, "mem")

let uid = posix.getuid()
let gid = posix.getgid()
let euid = posix.geteuid()

var lockProg = "slock"
let lockProgWl = "swaylock"

if euid != 0:
    echo "This program must be run with setuid"
    system.quit(1)

if getEnv("XDG_SESSION_TYPE") == "wayland":
    lockProg = lockProgWl

for i in 1..os.paramCount():
    if paramStr(i) == "-l":
        if i+1 <= os.paramCount():
            lockProg = paramStr(i + 1)
        else:
            echo "-l requires an argument"
            system.quit(1)
    else:
        let s = paramStr(i)
        echo &"unknown argument {s}"
        system.quit(1)

var pid = posix.fork()
if pid == -1:
    echo "unknown error"
    system.quit(1)
elif pid == 0:
    var ret = posix.setuid(uid)
    if ret == -1:
        echo "Failed to setuid"
        system.quit(1)
    ret = posix.setgid(gid)
    if ret == -1:
        echo "Failed to setuid"
        system.quit(1)

    ret = execlp(lockprog, "")
    echo &"excelp: {ret}"
else:
    suspend()
    while true:
        var info : cint
        let ret = waitpid(pid, info, WNOHANG)

        if ret == 0:
            suspend()
            sleep(10000)
            continue

        echo "exiting"
        system.quit(0)