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)
|