/* Read a packing list from a file */ void read_plist(Package *pkg, FILE *fp) { char *cp, pline[FILENAME_MAX]; int cmd, major, minor; pkg->fmtver_maj = 1; pkg->fmtver_mnr = 0; pkg->origin = NULL; while (fgets(pline, FILENAME_MAX, fp)) { int len = strlen(pline); while (len && isspace(pline[len - 1])) pline[--len] = '\0'; if (!len) continue; cp = pline; if (pline[0] != CMD_CHAR) { cmd = PLIST_FILE; goto bottom; } cmd = plist_cmd(pline + 1, &cp); if (cmd == FAIL) { warnx("%s: unknown command '%s' (package tools out of date?)", __func__, pline); goto bottom; } if (*cp == '\0') { cp = NULL; if (cmd == PLIST_PKGDEP) { warnx("corrupted record for package %s (pkgdep line without " "argument), ignoring", pkg->name); cmd = FAIL; } goto bottom; } if (cmd == PLIST_COMMENT && sscanf(cp, "PKG_FORMAT_REVISION:%d.%d\n", &major, &minor) == 2) { pkg->fmtver_maj = major; pkg->fmtver_mnr = minor; if (verscmp(pkg, PLIST_FMT_VER_MAJOR, PLIST_FMT_VER_MINOR) <= 0) goto bottom; warnx("plist format revision (%d.%d) is higher than supported" "(%d.%d)", pkg->fmtver_maj, pkg->fmtver_mnr, PLIST_FMT_VER_MAJOR, PLIST_FMT_VER_MINOR); if (pkg->fmtver_maj > PLIST_FMT_VER_MAJOR) { cleanup(0); exit(2); } } bottom: add_plist(pkg, cmd, cp); } }
/* * Parse a packaging list from a memory buffer. */ void parse_plist(package_t *pkg, const char *buf) { int cmd; char *line, *cp; const char *eol, *next; size_t len; pkg->head = NULL; pkg->tail = NULL; for (; *buf; buf = next) { /* Until add_plist can deal with trailing whitespace. */ if ((eol = strchr(buf, '\n')) != NULL) { next = eol + 1; len = eol - buf; } else { len = strlen(buf); next = buf + len; } while (len && isspace((unsigned char)buf[len - 1])) --len; if (len == 0) continue; line = xmalloc(len + 1); memcpy(line, buf, len); line[len] = '\0'; if (*(cp = line) == CMD_CHAR) { if ((cmd = plist_cmd(line + 1, &cp)) == FAIL) { warnx("Unrecognised PLIST command `%s'", line); continue; } if (*cp == '\0') { free(cp); cp = NULL; } } else { cmd = PLIST_FILE; } add_plist(pkg, cmd, cp); free(cp); } }
/* * Read a packing list from a file */ void append_plist(package_t *pkg, FILE * fp) { char pline[MaxPathSize]; char *cp; int cmd; int len; int free_cp; while (fgets(pline, MaxPathSize, fp) != (char *) NULL) { for (len = strlen(pline); len && isspace((unsigned char) pline[len - 1]);) { pline[--len] = '\0'; } if (len == 0) { continue; } free_cp = 0; if (*(cp = pline) == CMD_CHAR) { if ((cmd = plist_cmd(pline + 1, &cp)) == FAIL) { warnx("Unrecognised PLIST command `%s'", pline); continue; } if (*cp == '\0') { free(cp); cp = NULL; } free_cp = 1; } else { cmd = PLIST_FILE; } add_plist(pkg, cmd, cp); if (free_cp) free(cp); } }