u_int acl::parse_acl (vec<str> &credstrings) { str line; strbuf aclstrbuf = aclstr; suio *aclsuio = aclstrbuf.tosuio (); bool aclbegin = false; bool aclend = false; u_int p = 0; while (!aclbegin && (line = suio_getline (aclsuio))) { if (line == BEGINACL) { aclbegin = true; break; } else warn << "Beginning of acl not yet found: " << line << "\n"; } if (!aclbegin) { warn << "Couldn't find ACLBEGIN: \n" << aclstr << "\n"; return 0; } //beginning found while ((line = suio_getline (aclsuio)) && !aclend) { if (line == ENDACL) { aclend = true; break; } else { if (line.len () == 0) continue; aclline aline (line); if (!aline.parsed_ok ()) { warn << "Malformed acl line ignored: " << line << "\n"; continue; } if (aline.has_more (p)) { if (aline.is_member (credstrings)) p |= aline.get_permissions (); } } } if (!aclend) { warn << "Couldn't find ACLEND: \n" << aclstr << "\n"; return 0; } return p; }
bool authcursor_file::next (bool *pep) { if (fd < 0) return false; bool flush = false; str line; for (;;) { while (!(line = suio_getline (&buf))) { if (linemax && buf.resid () > linemax) { buf.clear (); flush = true; continue; } int n = buf.input (fd); if (n > 0) continue; if (n < 0) warn << path << ": " << strerror (errno) << "\n"; else if (buf.resid ()) { warn << path << ": " << lineno << ": incomplete last line\n"; if (pep) *pep = true; } return false; } lineno++; if (flush) { warn << path << ": " << lineno-1 << ": line too long\n"; if (pep) *pep = true; } else if (!str2authdbrec (&ae, line)) { warn << path << ": " << lineno-1 << ": syntax error\n"; if (pep) *pep = true; } else return true; } }