| 214 | } |
| 215 | |
| 216 | func newSerialNumberSetFromReader(r io.Reader, bad func(error)) (*serialNumberSet, error) { |
| 217 | set := make(map[serialNumberKey]struct{}) |
| 218 | scanner := bufio.NewScanner(r) |
| 219 | for scanner.Scan() { |
| 220 | line, _, _ := bytes.Cut(scanner.Bytes(), []byte{'#'}) |
| 221 | line = bytes.TrimSpace(line) |
| 222 | if len(line) == 0 { |
| 223 | continue |
| 224 | } |
| 225 | serial, err := parseSerialBytes(line) |
| 226 | if err != nil { |
| 227 | if bad != nil { |
| 228 | bad(fmt.Errorf("bad serial number line %q: %w", line, err)) |
| 229 | } |
| 230 | continue |
| 231 | } |
| 232 | set[us.Make(cutLeadingZeroes(serial))] = struct{}{} |
| 233 | } |
| 234 | |
| 235 | if err := scanner.Err(); err != nil { |
| 236 | return nil, fmt.Errorf("unable to load serial number set: %w", err) |
| 237 | } |
| 238 | |
| 239 | return &serialNumberSet{ |
| 240 | sns: set, |
| 241 | }, nil |
| 242 | } |
| 243 | |
| 244 | func parseSerialBytes(serial []byte) ([]byte, error) { |
| 245 | res := make([]byte, (len(serial)+2)/3) |