package server import ( "fmt" "io" "os" "strings" ) const ( // According to http://man7.org/linux/man-pages/man5/resolv.conf.5.html: // "The search list is currently limited to six domains with a total of 256 characters." maxDNSSearches = 6 ) func int64Ptr(i int64) *int64 { return &i } func int32Ptr(i int32) *int32 { return &i } func sPtr(s string) *string { return &s } func copyFile(src, dest string) error { in, err := os.Open(src) if err != nil { return err } defer in.Close() out, err := os.Create(dest) if err != nil { return err } defer out.Close() _, err = io.Copy(out, in) return err } func removeFile(path string) error { if _, err := os.Stat(path); err == nil { if err := os.Remove(path); err != nil { return err } } return nil } func parseDNSOptions(servers, searches, options []string, path string) error { nServers := len(servers) nSearches := len(searches) nOptions := len(options) if nServers == 0 && nSearches == 0 && nOptions == 0 { return copyFile("/etc/resolv.conf", path) } if nSearches > maxDNSSearches { return fmt.Errorf("DNSOption.Searches has more than 6 domains") } f, err := os.Create(path) if err != nil { return err } defer f.Close() if nSearches > 0 { data := fmt.Sprintf("search %s\n", strings.Join(searches, " ")) _, err = f.Write([]byte(data)) if err != nil { return err } } if nServers > 0 { data := fmt.Sprintf("nameserver %s\n", strings.Join(servers, "\nnameserver ")) _, err = f.Write([]byte(data)) if err != nil { return err } } if nOptions > 0 { data := fmt.Sprintf("options %s\n", strings.Join(options, " ")) _, err = f.Write([]byte(data)) if err != nil { return err } } return nil }