// +build linux

package main

import (
	"log"
	"net"
	"os"
	"os/user"
	"strconv"
)

const sockAddr = "/tmp/echo.sock"

func main() {

	// Get UID of current user
	uidStr, err := user.Current()
	if err != nil {
		log.Fatal(err)
	}

	uid, err := strconv.Atoi(uidStr.Uid)
	if err != nil {
		log.Fatal(err)
	}

	// Make sure no stale sockets present
	os.Remove(sockAddr)

	// Create new Unix domain socket
	server, err := net.Listen("unix", sockAddr)
	if err != nil {
		log.Fatal(err)
	}
	defer server.Close()

	// Loop to process client connections
	for {
		client, err := server.Accept()
		if err != nil {
			log.Printf("Accept() failed: %s", err)
			continue
		}

		creds, err := readCreds(client)
		if err != nil {
			log.Printf("Error reading credentials: %s", err)
			continue
		}

		if creds.Uid != uint32(uid) {
			log.Printf("UID mismatch (%d != %d). Closing connection.\n", creds.Uid, uid)
			client.Write([]byte("Unauthorized access\n"))
			client.Close()
			continue
		}

		go handleConn(client)
	}
}
