aboutsummaryrefslogtreecommitdiffhomepage
path: root/cli.go
diff options
context:
space:
mode:
authorOphestra Umiker <cat@ophivana.moe>2024-07-09 15:39:40 +0900
committerOphestra Umiker <cat@ophivana.moe>2024-07-09 15:39:40 +0900
commit491cc16d53c897908244606bc0d77a6ace8c22a1 (patch)
treea26dc0f5386ad3b21e3d6e24961b26548b8235da /cli.go
cli: parse and resolve flags
Copy all flags from upstream. The machinectl flag is dropped as it does nothing. the flag package is used to reduce complexity since we do not care about compatibility with upstream. Signed-off-by: Ophestra Umiker <cat@ophivana.moe>
Diffstat (limited to 'cli.go')
-rw-r--r--cli.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/cli.go b/cli.go
new file mode 100644
index 00000000..e85917e1
--- /dev/null
+++ b/cli.go
@@ -0,0 +1,67 @@
+package main
+
+import (
+ "errors"
+ "flag"
+ "fmt"
+ "os"
+ "os/user"
+)
+
+var (
+ ego *user.User
+ command []string
+ verbose bool
+ method = machinectl
+
+ userName string
+ methodFlags [2]bool
+ printVersion bool
+)
+
+const (
+ machinectl uint8 = iota
+ machinectlBare
+ sudo
+)
+
+func init() {
+ flag.StringVar(&userName, "u", "ego", "Specify a username")
+ flag.BoolVar(&methodFlags[0], "sudo", false, "Use 'sudo' to change user")
+ flag.BoolVar(&methodFlags[1], "bare", false, "Use 'machinectl' but skip xdg-desktop-portal setup")
+ flag.BoolVar(&verbose, "v", false, "Verbose output")
+ flag.BoolVar(&printVersion, "V", false, "Print version")
+}
+
+func copyArgs() {
+ if printVersion {
+ fmt.Println(Version)
+ os.Exit(0)
+ }
+
+ command = flag.Args()
+
+ switch { // zero value is machinectl
+ case methodFlags[0]:
+ method = sudo
+ case methodFlags[1]:
+ method = machinectlBare
+ }
+
+ if u, err := user.Lookup(userName); err != nil {
+ if errors.As(err, new(user.UnknownUserError)) {
+ fmt.Println("unknown user", userName)
+ } else {
+ // unreachable
+ panic(err)
+ }
+
+ os.Exit(1)
+ } else {
+ ego = u
+ }
+
+ if verbose {
+ fmt.Println("Running command", command, "as user", ego.Username, "("+ego.Uid+")")
+ }
+}