diff --git a/funcs.go b/funcs.go index 619f005..9082ec6 100644 --- a/funcs.go +++ b/funcs.go @@ -1,10 +1,16 @@ package sysutils import ( + `bytes` + `errors` + `fmt` + `io/ioutil` `os` `runtime` `strconv` `strings` + + `r00t2.io/sysutils/paths` ) /* @@ -206,3 +212,53 @@ func getArrStr(s string) (a []string, ok bool) { return } + +/* + GetEnvPid will only work on *NIX-like systems with procfs. + It gets the environment variables of a given process' PID. +*/ +func GetEnvPid(pid uint32) (env map[string]string, err error) { + + var envBytes []byte + var envArr [][]byte + var procPath string + var exists bool + + env = make(map[string]string, 0) + + procPath = fmt.Sprintf("/proc/%v/environ", pid) + + if exists, err = paths.RealPathExists(&procPath); err != nil { + return + } + if !exists { + err = errors.New(fmt.Sprintf("information for pid %v does not exist", pid)) + return + } + + if envBytes, err = ioutil.ReadFile(procPath); err != nil { + return + } + + envArr = bytes.Split(envBytes, []byte{0x0}) + + for _, b := range envArr { + + // s := strings.TrimSpace(string(b)) + s := string(b) + e := strings.SplitN(s, "=", 2) + + for _, i := range e { + + if len(i) != 2 { + env[string(i[0])] = "" + continue + } + + env[string(i[0])] = string(i[1]) + + } + } + + return +} diff --git a/terminal/funcs.go b/terminal/funcs.go new file mode 100644 index 0000000..68b7119 --- /dev/null +++ b/terminal/funcs.go @@ -0,0 +1,40 @@ +/* + SysUtils - a library to assist with various system-related functions + Copyright (C) 2020 Brent Saner + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +package terminal + +import ( + "os" + "fmt" +) + +// IsShell returns true if the program is running inside an interactive shell (interactive invocation, sudo, etc.), and false if not (cron, ssh exec, pipe, etc.). +// Thanks to https://rosettacode.org/wiki/Check_output_device_is_a_terminal#Go +func IsShell() (interactive bool) { + + var stdoutStat os.FileInfo + + stdoutStat, _ = os.Stdout.Stat() + + if (stdoutStaf.Mode() & os.ModeCharDevice) != 0 { + interactive = True + } + + return +}