X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=passwd.go;h=2698765212e0975738ebc8d8273140daee528816;hb=c6b898ea9ab372c58c59658c2acf17ea831d71db;hp=1b4939c63ac6a1a9b2c634bdd0a74a2def5f0419;hpb=d7eb5ee1a910303f38904e604aea9cf0b1372d7b;p=nsscash%2Fnsscash.git diff --git a/passwd.go b/passwd.go index 1b4939c..2698765 100644 --- a/passwd.go +++ b/passwd.go @@ -44,13 +44,19 @@ type Passwd struct { } // ParsePasswds parses a file in the format of /etc/passwd and returns all -// entries as Passwd structs. +// entries as slice of Passwd structs. func ParsePasswds(r io.Reader) ([]Passwd, error) { var res []Passwd - s := bufio.NewScanner(r) - for s.Scan() { - t := s.Text() + s := bufio.NewReader(r) + for { + t, err := s.ReadString('\n') + if err != nil { + if err == io.EOF { + break + } + return nil, err + } x := strings.Split(t, ":") if len(x) != 7 { @@ -73,14 +79,10 @@ func ParsePasswds(r io.Reader) ([]Passwd, error) { Gid: gid, Gecos: x[4], Dir: x[5], - Shell: x[6], + // ReadString() contains the delimiter + Shell: strings.TrimSuffix(x[6], "\n"), }) } - err := s.Err() - if err != nil { - return nil, err - } - return res, nil } @@ -134,12 +136,7 @@ func SerializePasswd(p Passwd) []byte { res.Write(data.Bytes()) // We must pad each entry so that all uint64 at the beginning of the // struct are 8 byte aligned - l := res.Len() - if l%8 != 0 { - for i := 0; i < 8-l%8; i++ { - res.Write([]byte{'0'}) - } - } + alignBufferTo(&res, 8) return res.Bytes() }