62 lines
1.5 KiB
V
62 lines
1.5 KiB
V
module pidfile
|
|
|
|
import os
|
|
import strconv
|
|
|
|
fn runtime_dir() string {
|
|
if dir := os.getenv_opt('XDG_RUNTIME_DIR') {
|
|
return dir
|
|
}
|
|
euid := os.geteuid()
|
|
if euid > 0 {
|
|
return '/run/user/${euid}'
|
|
}
|
|
return '/run'
|
|
}
|
|
|
|
@[params]
|
|
pub struct CreateFileConfig {
|
|
pub:
|
|
// Path prefix for pid-file, e.g. `/run/1000`. Defaults to XDG_RUNTIME_DIR if set or
|
|
// to `/run/user/${EUID}` for normal users and `/run` for root user.
|
|
prefix string
|
|
|
|
// Path that will be created inside the prefix. Has no default value.
|
|
// For example `myapp` subpath with `/run/1000` prefix becomes to `/run/1000/myapp` path.
|
|
subpath string
|
|
|
|
// If true omit the file extension. Otherwise append the `.pid` extension to filename.
|
|
no_extension bool
|
|
}
|
|
|
|
// create creates the new pid-file and returns path to it.
|
|
pub fn create(name string, pid int, config CreateFileConfig) !string {
|
|
mut filename := name
|
|
if !name.ends_with('.pid') && !config.no_extension {
|
|
filename += '.pid'
|
|
}
|
|
mut path := runtime_dir()
|
|
if config.prefix != '' {
|
|
path = config.prefix
|
|
}
|
|
path = os.join_path_single(path, config.subpath)
|
|
os.mkdir_all(path)!
|
|
path = os.join_path_single(path, filename)
|
|
os.write_file(path, pid.str())!
|
|
return path
|
|
}
|
|
|
|
// write writes the pid into file specified in path.
|
|
//
|
|
// If directories in `path` do not exist, they will be created.
|
|
pub fn write(path string, pid int) ! {
|
|
os.mkdir_all(os.dir(path))!
|
|
os.write_file(path, pid.str())!
|
|
}
|
|
|
|
// read reads the pid-file and returns its content as integer.
|
|
pub fn read(path string) !int {
|
|
s := os.read_file(path)!
|
|
return strconv.atoi(s.trim_space())!
|
|
}
|