Consider the following function:
func Listen(username string) (net.Listener, error) {
path := filepath.Join(socketsDir, username)
oldUmask := syscall.Umask(^0600)
defer syscall.Umask(oldUmask)
listener, err := net.Listen("unixpacket", path)
if err != nil {
return nil, err
}
passwd, err := passwd.Getpwnam(username)
if err != nil {
goto chownFailed
}
err = os.Chown(path, int(passwd.Uid), os.Getgid())
if err != nil {
goto chownFailed
}
return listener, err
chownFailed:
listener.Close()
return nil, err
}
I think this way of error handling is ugly. Is there a way to get rid of the goto without duplicating the call to listener.Close
?