package main import ( "os" "net" "http" "fmt" "syscall" "runtime" "log" ) type Handler string func (hh *Handler) ServeHTTP(con http.ResponseWriter, req *http.Request) { fmt.Fprintf(con, "Hello! I am %s. My UID/GID is %d/%d. Bye!\n", *hh, syscall.Getuid(), syscall.Getgid()) } func main() { // To listen on port 80 we need root privileges ls, err := net.Listen("tcp", "127.0.0.1:80") if err != nil { log.Exitln("Can't listen:", err) } runtime.LockOSThread() // We don't need root privileges any more if en := syscall.Setgid(65534); en != 0 { log.Exitln("Setgid error:", os.Errno(en)) } if en := syscall.Setuid(65534); en != 0 { log.Exitln("Setuid error:", os.Errno(en)) } // Run http service without root privileges handler := Handler("Test handler") if err = http.Serve(ls, &handler); err != nil { log.Exitln("Http server:", err) } }