aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..fc6c8af
--- /dev/null
+++ b/main.go
@@ -0,0 +1,85 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "net"
+ "os"
+ "os/signal"
+ "syscall"
+)
+
+type Flags struct {
+ Groups string
+ HostName string
+ Listen string
+ StdErr string
+}
+
+func ParseArgs() (*Flags, []string) {
+ var flags Flags
+
+ name, _ := os.Hostname()
+
+ flag.StringVar(&flags.Groups, "groups", "/etc/postfix/user_groups", "User group list")
+ flag.StringVar(&flags.HostName, "hostname", name, "E-Mail hostname")
+ flag.StringVar(&flags.Listen, "listen", "-", "listen socket path")
+ flag.StringVar(&flags.StdErr, "std-err", name, "Redirect errors to filepath")
+
+ flag.Parse()
+
+ return &flags, flag.Args()
+}
+
+func handleSignal(c <-chan os.Signal, listenner net.Listener) {
+ for v := range c {
+ switch v {
+ case syscall.SIGINT:
+ _ = listenner.Close()
+ default:
+ }
+ }
+}
+
+func exitOnErr(err error) {
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err.Error())
+ os.Exit(1)
+ }
+}
+
+func main() {
+ flags, groups := ParseArgs()
+
+ if flags.StdErr != "" {
+ f, _ := os.OpenFile(flags.StdErr, os.O_APPEND|os.O_RDWR|os.O_CREATE, 0666)
+ os.Stderr = f
+ defer f.Close()
+ }
+
+ srv := &Server{
+ HostName: flags.HostName,
+ GroupsFile: flags.Groups,
+ Groups: groups,
+ }
+
+ if flags.Listen == "-" {
+ srv.HandleConn(os.Stdout, os.Stdin)
+
+ return
+ }
+
+ listenner, err := net.Listen("unix", flags.Listen)
+ exitOnErr(err)
+ defer os.Remove(flags.Listen)
+
+ err = os.Chmod(flags.Listen, os.ModePerm)
+ exitOnErr(err)
+
+ c := make(chan os.Signal, 1)
+ signal.Notify(c, syscall.SIGHUP, syscall.SIGINT)
+ go handleSignal(c, listenner)
+
+ err = ServeUnixSocket(listenner, srv)
+ exitOnErr(err)
+}