diff --git a/src/main.go b/src/main.go index 4b83d9c..005b939 100644 --- a/src/main.go +++ b/src/main.go @@ -19,6 +19,7 @@ import ( "latchd/auth" "latchd/config" "latchd/login" + "latchd/session" "latchd/tui/bg" ) @@ -144,39 +145,27 @@ func spawnSession(res *login.Result) error { return nil } log.Printf("spawning %s → %s (%s)", res.Username, res.Env.Title, res.Env.Kind) + creds, err := auth.Validate(res.Username, res.Password, res.Config.PAMService) if err != nil { return fmt.Errorf("auth: %w", err) } defer creds.CloseSession() - pid, err := syscall.ForkExec("/proc/self/exe", []string{ - "latchd-session", - "--user", creds.Username, - "--uid", fmt.Sprintf("%d", creds.UID), - "--gid", fmt.Sprintf("%d", creds.PrimaryGID), - "--home", creds.HomeDir, - "--shell", creds.Shell, - "--env-kind", res.Env.Kind, - "--env-exec", res.Env.XinitrcPath, - "--tty", fmt.Sprintf("%d", res.Config.TTY), - }, &syscall.ProcAttr{ - Env: os.Environ(), - Dir: creds.HomeDir, - Files: []uintptr{0, 1, 2}, - Sys: &syscall.SysProcAttr{Setsid: true}, - }) + if err := creds.OpenSession(); err != nil { + return fmt.Errorf("pam session: %w", err) + } + + sess, err := session.Spawn(&res.Env, creds.UID, creds.PrimaryGID, creds.AllGIDs, &res.Config) if err != nil { - return fmt.Errorf("fork: %w", err) + return fmt.Errorf("spawn: %w", err) } - creds.OpenSession() - - var ws syscall.WaitStatus - if _, err := syscall.Wait4(pid, &ws, 0, nil); err != nil { - return fmt.Errorf("wait: %w", err) + err = sess.Wait() + if err != nil { + log.Printf("session exited: %v", err) } - log.Printf("session pid %d exited %d", pid, ws.ExitStatus()) + log.Printf("session pid %d ended", sess.PID()) return nil }