package auth /* #include #include #include #include #include "utmpx_time.h" */ import "C" import ( "time" "unsafe" ) type UtmpxSession struct { ok bool username string tty uint8 } func AddUtmpx(user string, tty uint8, pid uint32) *UtmpxSession { s := &UtmpxSession{username: user, tty: tty} cUser := C.CString(user) defer C.free(unsafe.Pointer(cUser)) var ut C.struct_utmpx C.memset(unsafe.Pointer(&ut), 0, C.sizeof_struct_utmpx) ut.ut_type = C.USER_PROCESS ut.ut_pid = C.pid_t(pid) n := len(user) if n > 32 { n = 32 } for i := 0; i < n; i++ { ut.ut_user[i] = C.char(user[i]) } ttyCh := byte('0' + tty) ut.ut_line[0] = 't' ut.ut_line[1] = 't' ut.ut_line[2] = 'y' ut.ut_line[3] = C.char(ttyCh) ut.ut_id[0] = C.char(ttyCh) us := time.Now().UnixMicro() C.latchd_set_utmpx_time(&ut, C.int64_t(us/1_000_000), C.int32_t(us%1_000_000)) C.setutxent() C.pututxline(&ut) s.ok = true return s } func (s *UtmpxSession) Close() { if !s.ok { return } var ut C.struct_utmpx C.memset(unsafe.Pointer(&ut), 0, C.sizeof_struct_utmpx) ut.ut_type = C.DEAD_PROCESS C.setutxent() C.pututxline(&ut) C.endutxent() s.ok = false }