commit 9203ee6788b8c9927dbf21db9b8036580676aad6
parent 72781f4fb731184263cca9cf52dca23a7ce72fe9
Author: Jacob R. Edwards <jacobouno@protonmail.com>
Date: Sun, 20 Dec 2020 23:59:27 -0800
Organize functions and document cgoto() and cback()
The functions are organized as such:
1. warning wrapper
2. general utility
3. specific utility
4. network utility
5. pipe
6. command
7. central
Diffstat:
M | main.c | | | 186 | +++++++++++++++++++++++++++++++++++++++++-------------------------------------- |
1 file changed, 97 insertions(+), 89 deletions(-)
diff --git a/main.c b/main.c
@@ -45,6 +45,30 @@ static char *gphfmt[] = { "gophmt", NULL };
int gawk(int depth, const char *tmpdir, const char *host, const char *path, const char *port);
+FILE *
+wfopen(const char *path, const char *mode)
+{
+ FILE *fp;
+
+ fp = fopen(path, mode);
+ if (fp == NULL)
+ warn("unable to open '%s' ('%s')", path, mode);
+ return fp;
+}
+
+int
+wfclose(FILE *fp)
+{
+ int error;
+
+ error = ferror(fp);
+ if (fclose(fp) || error) {
+ warn("unable to close file");
+ return EOF;
+ }
+ return 0;
+}
+
void
wunused(int max, int argc, const char **ap)
{
@@ -53,6 +77,23 @@ wunused(int max, int argc, const char **ap)
}
int
+argsplit(char **argv, int arg_max, char *s, const char *sep)
+{
+ int argc;
+
+ for (argc = 0; argc < arg_max &&
+ (argv[argc] = strsep(&s, sep)) != NULL;) {
+ if (*argv[argc] != '\0')
+ ++argc;
+ }
+
+ if (argc == arg_max &&
+ argv[argc - 1][strcspn(argv[argc - 1], sep)] == '\0')
+ return -1;
+ return argc;
+}
+
+int
exists(const char *path)
{
struct stat sb;
@@ -64,28 +105,45 @@ exists(const char *path)
return 1;
}
-FILE *
-wfopen(const char *path, const char *mode)
+int
+strtorange(unsigned int min, int max, const char *s)
{
- FILE *fp;
+ unsigned long n;
+ char *ep;
- fp = fopen(path, mode);
- if (fp == NULL)
- warn("unable to open '%s' ('%s')", path, mode);
- return fp;
+ n = strtoul(s, &ep, 0);
+ if (*s == '\0' || *ep != '\0') {
+ warnc(EINVAL, "not a number '%s'", s);
+ return -1;
+ } else if ((errno == ERANGE && n == ULONG_MAX) ||
+ n < min || n > max) {
+ warnc(ERANGE, "'%s'", s);
+ return -1;
+ }
+
+ return n;
}
-int
-wfclose(FILE *fp)
+/* `path` old path, `newpath` new path. Result put into `path`. */
+void
+newpath(char *path, const char *newpath)
{
- int error;
+ char tmp[PATH_MAX];
- error = ferror(fp);
- if (fclose(fp) || error) {
- warn("unable to close file");
- return EOF;
+ if (*newpath == '/') {
+ strlcpy(path, newpath, PATH_MAX);
+ } else {
+ snprintf(tmp, PATH_MAX, "%s/%s", path, newpath);
+ strlcpy(path, tmp, PATH_MAX);
}
- return 0;
+}
+
+void
+tr(char *s, int orig, int repl)
+{
+ for (; *s != '\0'; ++s)
+ if (*s == orig)
+ *s = repl;
}
int
@@ -164,53 +222,14 @@ too_big:
return 0;
}
-/* `path` old path, `newpath` new path. Result put into `path`. */
-void
-newpath(char *path, const char *newpath)
-{
- char tmp[PATH_MAX];
-
- if (*newpath == '/') {
- strlcpy(path, newpath, PATH_MAX);
- } else {
- snprintf(tmp, PATH_MAX, "%s/%s", path, newpath);
- strlcpy(path, tmp, PATH_MAX);
- }
-}
-
-void
-tr(char *s, int orig, int repl)
-{
- for (; *s != '\0'; ++s)
- if (*s == orig)
- *s = repl;
-}
-
-void
-getcache(char *cache, const char *tmpdir, const char *host, const char *port, const char *path)
-{
- char tmp[PATH_MAX];
-
- strlcpy(tmp, path, PATH_MAX);
- tr(tmp, '/', '-');
- snprintf(cache, PATH_MAX, "%s/%s-%s-%s", tmpdir, host, port, tmp);
-}
-
int
-argsplit(char **argv, int arg_max, char *s, const char *sep)
+gphsend(int sock, const char *request)
{
- int argc;
-
- for (argc = 0; argc < arg_max &&
- (argv[argc] = strsep(&s, sep)) != NULL;) {
- if (*argv[argc] != '\0')
- ++argc;
+ if (send(sock, request, strlen(request), 0) == -1) {
+ warn("unable to send request");
+ return 1;
}
-
- if (argc == arg_max &&
- argv[argc - 1][strcspn(argv[argc - 1], sep)] == '\0')
- return -1;
- return argc;
+ return 0;
}
int
@@ -249,16 +268,6 @@ fetch(int sock, const char *path)
}
int
-gphsend(int sock, const char *request)
-{
- if (send(sock, request, strlen(request), 0) == -1) {
- warn("unable to send request");
- return 1;
- }
- return 0;
-}
-
-int
selwrite(const char *host, const char *port, const char *selector, const char *file)
{
int sock;
@@ -330,6 +339,11 @@ exfmt(int (*putter)(const char *, int, const char **), const char *path, int arg
return 0;
}
+/* if lacking arguments goes to the root (`/') keeping the host and
+ * port. If one argument is given it is taken as a path, if more
+ * than one is given argv[0] is the host, argv[1] is the path, and
+ * if present argv[2] is the port.
+ */
int
cgoto(int argc, const char **argv, int depth, const char *tmpdir, const char *host,
const char *path, const char *port)
@@ -357,25 +371,9 @@ cgoto(int argc, const char **argv, int depth, const char *tmpdir, const char *ho
return gawk(depth, tmpdir, nhost, npath, nport);
}
-int
-strtorange(unsigned int min, int max, const char *s)
-{
- unsigned long n;
- char *ep;
-
- n = strtoul(s, &ep, 0);
- if (*s == '\0' || *ep != '\0') {
- warnc(EINVAL, "not a number '%s'", s);
- return -1;
- } else if ((errno == ERANGE && n == ULONG_MAX) ||
- n < min || n > max) {
- warnc(ERANGE, "'%s'", s);
- return -1;
- }
-
- return n;
-}
-
+/* argv[0], if present, is the number of backtracks to make which
+ * is by default 1.
+ */
int
cback(int argc, const char **argv)
{
@@ -431,7 +429,7 @@ cmatch(const char *path, int argc, const char **argv)
* download. If present argv[1] is the location to write the file
* to, otherwise it is written to the basename(3) of it's selector
* string.
-*/
+ */
int
cfetch(int argc, const char **argv, const char *cache, const char *host, const char *port)
{
@@ -522,6 +520,16 @@ execute(int command, int argc, const char **argv, int depth, const char *cache,
}
}
+void
+getcache(char *cache, const char *tmpdir, const char *host, const char *port, const char *path)
+{
+ char tmp[PATH_MAX];
+
+ strlcpy(tmp, path, PATH_MAX);
+ tr(tmp, '/', '-');
+ snprintf(cache, PATH_MAX, "%s/%s-%s-%s", tmpdir, host, port, tmp);
+}
+
int
gawk(int depth, const char *tmpdir, const char *host, const char *path, const char *port)
{