X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=passwd.go;h=2698765212e0975738ebc8d8273140daee528816;hb=c6b898ea9ab372c58c59658c2acf17ea831d71db;hp=c07e9c73914d378d8964756994542f92eeefb3b1;hpb=92afde4e875a96e1ab865e29b9f0d11b08d7db1c;p=nsscash%2Fnsscash.git diff --git a/passwd.go b/passwd.go index c07e9c7..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() } @@ -191,7 +188,8 @@ func SerializePasswds(w io.Writer, pws []Passwd) error { } // Sanity check - if indexOrig.Len() != indexId.Len() || + if len(pws)*8 != indexOrig.Len() || + indexOrig.Len() != indexId.Len() || indexId.Len() != indexName.Len() { return fmt.Errorf("indexes have inconsistent length") }