main.go - fingered - Fingerd protocol daemon, allowing custom responses.
 (HTM) git clone git://jay.scot/fingered
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       main.go (1668B)
       ---
            1 package main
            2 
            3 import (
            4         "fmt"
            5         "net"
            6         "path/filepath"
            7         "strings"
            8 
            9         "fingered/config"
           10         "fingered/utils"
           11 )
           12 
           13 type Config struct {
           14         Threads int
           15         Port    int
           16         Path    string
           17 }
           18 
           19 const bufferSize = 1024
           20 
           21 func handleRequest(conn net.Conn, dir string, index string) {
           22         defer conn.Close()
           23 
           24         // Read the incoming request
           25         buffer := make([]byte, bufferSize)
           26         n, err := conn.Read(buffer)
           27         if err != nil {
           28                 utils.LogMsg("ERROR: %v", err)
           29                 return
           30         }
           31 
           32         request := strings.TrimSpace(string(buffer[:n]))
           33 
           34         // Sanitize the request
           35         if len(request) > 0 && !utils.IsValidWord(request) {
           36                 utils.LogMsg("INFO: Invalid username")
           37                 _, err = utils.WriteResponse(conn, "Invaild user\n")
           38                 if err != nil {
           39                         utils.LogMsg("ERROR: %s", err)
           40                         return
           41                 }
           42 
           43                 return
           44         }
           45 
           46         if len(request) == 0 {
           47                 request = index
           48         }
           49 
           50         response, err := utils.GetContent(filepath.Join(dir, request))
           51         if err != nil {
           52                 utils.LogMsg("ERROR: %s", err)
           53                 return
           54         }
           55 
           56         _, err = utils.WriteResponse(conn, response)
           57         if err != nil {
           58                 utils.LogMsg("ERROR: %s", err)
           59                 return
           60         }
           61 
           62 }
           63 
           64 func main() {
           65 
           66         cfg := config.ParseFlags()
           67 
           68         connectionChannel := make(chan net.Conn, cfg.Threads)
           69 
           70         for i := 0; i < cfg.Threads; i++ {
           71                 go func() {
           72                         for conn := range connectionChannel {
           73                                 handleRequest(conn, cfg.Dir, cfg.Index)
           74                         }
           75                 }()
           76         }
           77 
           78         listener, err := net.Listen("tcp", fmt.Sprintf(":%d", cfg.Port))
           79         if err != nil {
           80                 utils.LogMsg("ERROR: %v", err)
           81                 return
           82         }
           83         defer listener.Close()
           84 
           85         utils.LogMsg("Starting with threads: %d, port: %d, dir: %s", cfg.Threads, cfg.Port, cfg.Dir)
           86 
           87         for {
           88                 conn, err := listener.Accept()
           89                 if err != nil {
           90                         utils.LogMsg("ERROR: %v", err)
           91                         continue
           92                 }
           93                 connectionChannel <- conn
           94         }
           95 }