#include <sys/mman.h>
#include <sys/vfs.h>
#include <linux/magic.h>
+#include <limits.h>
#include "macro.h"
#include "util.h"
int saved_argc = 0;
char **saved_argv = NULL;
+static int parsed_columns = 0;
+
size_t page_size(void) {
static __thread size_t pgsz = 0;
long r;
* chars, in \xFF style escaping. May be reversed with
* cunescape. */
- if (!(r = new(char, strlen(s)*4+1)))
+ r = new(char, strlen(s) * 4 + 1);
+ if (!r)
return NULL;
for (f = s, t = r; *f; f++) {
}
static unsigned columns_cached(bool cached) {
- static __thread int parsed_columns = 0, env_columns = -1;
+ static __thread int env_columns = -1;
const char *e;
if (_likely_(parsed_columns > 0 && cached))
return columns_cached(false);
}
+/* intended to be used as a SIGWINCH sighandler */
+void columns_cache_reset(int signum) {
+ parsed_columns = 0;
+}
+
int fd_lines(int fd) {
struct winsize ws;
zero(ws);
void umaskp(mode_t *u) {
umask(*u);
}
+
+bool filename_is_safe(const char *p) {
+
+ if (isempty(p))
+ return false;
+
+ if (strchr(p, '/'))
+ return false;
+
+ if (streq(p, "."))
+ return false;
+
+ if (streq(p, ".."))
+ return false;
+
+ if (strlen(p) > FILENAME_MAX)
+ return false;
+
+ return true;
+}
+
+bool string_is_safe(const char *p) {
+ const char *t;
+
+ assert(p);
+
+ for (t = p; *t; t++) {
+ if (*p < ' ')
+ return false;
+
+ if (strchr("\\\"\'", *p))
+ return false;
+ }
+
+ return true;
+}