// attempt to broadcast msg to all lines registered in utmp // returns count of lines successfully opened (and likely broadcasted to) func broadcast(msg string) uint { var cnt uint C.setutent() for { var utmp *C.struct_utmp utmp = C.getutent() if utmp == nil { break } line := C.GoString(&utmp.ut_line[0]) tty, _ := os.OpenFile("/dev/"+line, os.O_WRONLY, 0) if tty == nil { // ignore errors, this is just a best-effort courtesy notice continue } cnt++ go func() { fmt.Fprintf(tty, "\r%79s\r\n", " ") fmt.Fprintf(tty, "%-79.79s\007\007\r\n", fmt.Sprintf("Broadcast message from locksmithd at %s:", time.Now())) fmt.Fprintf(tty, "%-79.79s\r\n", msg) // msg is assumed to be short and not require wrapping fmt.Fprintf(tty, "\r%79s\r\n", " ") tty.Close() }() } return cnt }
func main() { var p_utent *C.utmp C.getutent() fmt.Println(p_utent.ut_user) }