pm

barely a pack manager
git clone git://z3bra.org/pm
Log | Files | Refs | README | LICENSE

commit d66413a9f2f5c91fb4f7e7b5e147e71f6478a881
parent 166af82b0e517d8d199c9d63ef09739729b3c007
Author: z3bra <willyatmailoodotorg>
Date:   Sat Jan 30 10:27:16 +0100

Replace fgets() with in-house lread()

Diffstat:
pm.c | 36+++++++++++++++++++++++++++---------
1 file changed, 27 insertions(+), 9 deletions(-)
diff --git a/pm.c b/pm.c @@ -49,6 +49,7 @@ void usage(char *name); int is_empty(char *dir); int mkdir_parents(char *dir, mode_t mode); char *base_name(char *path); +char *lread(int fd, char *buf, size_t len); struct pack *pack_load(char *path); void pack_free(struct pack *p); @@ -62,7 +63,7 @@ int write_metadata(char *datadir, struct pack *pack); int write_entry(struct archive *a, struct archive *w); int unpack(char *rootfs, char *datadir, struct pack *p); int install(char *rootfs, char *datadir, struct pack *p); -int delete_content(FILE *metafile); +int delete_content(int fd); int delete(const char *rootfs, const char *datadir, const char *name); char *argv0; @@ -140,6 +141,23 @@ base_name(char *path) /* + * Reads a line which is at least 'len' bytes long. It will load + * the line into "buf". The user has to ensure the addressed + * pointed to by 'buf' is big enough to contain the line. + */ +char * +lread(int fd, char *buf, size_t len) +{ + size_t i; + int r, c = 0; + while ((r = read(fd, &c, 1)) > 0 && c != '\n' && i < len) { + buf[i++] = c; + } + buf[i] = '\0'; + return r > 0 ? buf : NULL; +} + +/* * Check for collisions between the filesystem and the tarball */ int @@ -436,15 +454,15 @@ install(char *rootfs, char *datadir, struct pack *p) * if the entry doesn't exist, it will be ignored */ int -delete_content(FILE *f) +delete_content(int fd) { int r = 0; char file[PATH_MAX] = ""; struct stat st; size_t len = 0; - if (fgets(file, PATH_MAX, f)) - if ((r = delete_content(f)) < 0) + if (lread(fd, file, PATH_MAX)) + if ((r = delete_content(fd)) < 0) return r; /* remove trailing '\n' */ @@ -488,7 +506,7 @@ delete_content(FILE *f) int delete(const char *rootfs, const char *datadir, const char *packname) { - FILE *f; + int fd; char tmp[PATH_MAX]; struct stat st; @@ -499,7 +517,7 @@ delete(const char *rootfs, const char *datadir, const char *packname) } snprintf(tmp, PATH_MAX, "%s/%s/files", datadir, packname); - if ((f = fopen(tmp, "r")) == NULL) { + if ((fd = open(tmp, O_RDONLY)) < 0) { perror(tmp); return ERR_DELETE; } @@ -512,12 +530,12 @@ delete(const char *rootfs, const char *datadir, const char *packname) } /* ignore errors so everything gets deleted */ - if (delete_content(f) < 0) { + if (delete_content(fd) < 0) { fprintf(stderr, "%s: cannot remove pack\n", packname); - fclose(f); + close(fd); return ERR_DELETE; } - fclose(f); + close(fd); if (verbose == 1) printf("%s: removing metadata\n", packname);