commit a68c2a9e6e3155304683624e77085a36104f63a2
parent 833670e06cd62500cfd4c6d212f27dcf7662ef59
Author: FRIGN <dev@frign.de>
Date: Wed, 18 Mar 2015 15:20:35 +0100
Remove apathmax() and implicitly agetcwd()
pathconf() is just an insane interface to use. All sane operating-
systems set sane values for PATH_MAX. Due to the by-runtime-nature of
pathconf(), it actually weakens the programs depending on its values.
Given over 3 years it has still not been possible to implement a sane
and easy to use apathmax()-utility-function, and after discussing this
on IRC, we'll dump this garbage.
We are careful enough not to overflow PATH_MAX and even if, any user
is able to set another limit in config.mk if he so desires.
Diffstat:
8 files changed, 17 insertions(+), 67 deletions(-)
diff --git a/Makefile b/Makefile
@@ -41,8 +41,6 @@ LIBUTFSRC =\
LIBUTIL = libutil.a
LIBUTILSRC =\
- libutil/agetcwd.c\
- libutil/apathmax.c\
libutil/concat.c\
libutil/cp.c\
libutil/crypt.c\
diff --git a/libutil/agetcwd.c b/libutil/agetcwd.c
@@ -1,18 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-#include <unistd.h>
-
-#include "../util.h"
-
-char *
-agetcwd(void)
-{
- char *buf;
- size_t size;
-
- apathmax(&buf, &size);
- if (!getcwd(buf, size))
- eprintf("getcwd:");
-
- return buf;
-}
-
diff --git a/libutil/apathmax.c b/libutil/apathmax.c
@@ -1,22 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-#include <errno.h>
-#include <limits.h>
-#include <unistd.h>
-
-#include "../util.h"
-
-void
-apathmax(char **p, size_t *size)
-{
- errno = 0;
- if ((*size = pathconf("/", _PC_PATH_MAX)) < 0) {
- if (errno == 0) {
- *size = PATH_MAX;
- } else {
- eprintf("pathconf:");
- }
- } else {
- (*size)++;
- }
- *p = emalloc(*size);
-}
diff --git a/libutil/cp.c b/libutil/cp.c
@@ -27,8 +27,7 @@ int
cp(const char *s1, const char *s2, int depth)
{
FILE *f1, *f2;
- char *ns1, *ns2;
- size_t size1, size2;
+ char ns1[PATH_MAX], ns2[PATH_MAX];
struct dirent *d;
struct stat st;
struct utimbuf ut;
@@ -71,17 +70,15 @@ cp(const char *s1, const char *s2, int depth)
if (mkdir(s2, st.st_mode) < 0 && errno != EEXIST)
eprintf("mkdir %s:", s2);
- apathmax(&ns1, &size1);
- apathmax(&ns2, &size2);
while ((d = readdir(dp))) {
if (strcmp(d->d_name, ".") && strcmp(d->d_name, "..")) {
- r = snprintf(ns1, size1, "%s/%s", s1, d->d_name);
- if (r >= size1 || r < 0) {
+ r = snprintf(ns1, sizeof(ns1), "%s/%s", s1, d->d_name);
+ if (r >= sizeof(ns1) || r < 0) {
eprintf("%s/%s: filename too long\n",
s1, d->d_name);
}
- r = snprintf(ns2, size2, "%s/%s", s2, d->d_name);
- if (r >= size2 || r < 0) {
+ r = snprintf(ns2, sizeof(ns2), "%s/%s", s2, d->d_name);
+ if (r >= sizeof(ns2) || r < 0) {
eprintf("%s/%s: filename too long\n",
s2, d->d_name);
}
@@ -89,8 +86,6 @@ cp(const char *s1, const char *s2, int depth)
}
}
closedir(dp);
- free(ns1);
- free(ns2);
goto preserve;
}
diff --git a/libutil/enmasse.c b/libutil/enmasse.c
@@ -12,9 +12,9 @@ void
enmasse(int argc, char *argv[], int (*fn)(const char *, const char *, int))
{
struct stat st;
- char *buf, *dir;
+ char buf[PATH_MAX], *dir;
int i, len;
- size_t size, dlen;
+ size_t dlen;
if (argc == 2 && !(stat(argv[1], &st) == 0 && S_ISDIR(st.st_mode))) {
fnck(argv[0], argv[1], fn, 0);
@@ -23,18 +23,16 @@ enmasse(int argc, char *argv[], int (*fn)(const char *, const char *, int))
dir = (argc == 1) ? "." : argv[--argc];
}
- apathmax(&buf, &size);
for (i = 0; i < argc; i++) {
dlen = strlen(dir);
if (dlen > 0 && dir[dlen - 1] == '/')
- len = snprintf(buf, size, "%s%s", dir, basename(argv[i]));
+ len = snprintf(buf, sizeof(buf), "%s%s", dir, basename(argv[i]));
else
- len = snprintf(buf, size, "%s/%s", dir, basename(argv[i]));
- if (len < 0 || len >= size) {
+ len = snprintf(buf, sizeof(buf), "%s/%s", dir, basename(argv[i]));
+ if (len < 0 || len >= sizeof(buf)) {
eprintf("%s/%s: filename too long\n", dir,
basename(argv[i]));
}
fnck(argv[i], buf, fn, 0);
}
- free(buf);
}
diff --git a/ls.c b/ls.c
@@ -192,9 +192,10 @@ lsdir(const char *path)
struct entry ent, *ents = NULL;
struct dirent *d;
size_t i, n = 0, len;
- char *cwd, *p, *q, *name;
+ char cwd[PATH_MAX], *p, *q, *name;
- cwd = agetcwd();
+ if (!getcwd(cwd, sizeof(cwd)))
+ eprintf("getcwd:");
if (!(dp = opendir(path)))
eprintf("opendir %s:", path);
if (chdir(path) < 0)
@@ -247,7 +248,6 @@ lsdir(const char *path)
if (chdir(cwd) < 0)
eprintf("chdir %s:", cwd);
free(ents);
- free(cwd);
}
static void
diff --git a/pwd.c b/pwd.c
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <unistd.h>
#include "util.h"
@@ -29,7 +30,7 @@ usage(void)
int
main(int argc, char *argv[])
{
- char *cwd;
+ char cwd[PATH_MAX];
char mode = 'L';
ARGBEGIN {
@@ -41,7 +42,8 @@ main(int argc, char *argv[])
usage();
} ARGEND;
- cwd = agetcwd();
+ if (!getcwd(cwd, sizeof(cwd)))
+ eprintf("getcwd:");
puts((mode == 'L') ? getpwd(cwd) : cwd);
return 0;
diff --git a/util.h b/util.h
@@ -20,9 +20,6 @@
extern char *argv0;
-char *agetcwd(void);
-void apathmax(char **, size_t *);
-
void *ecalloc(size_t, size_t);
void *emalloc(size_t);
void *erealloc(void *, size_t);