#include #include #include #include #include #include #include #include #include "util.h" extern const char *progname; void die(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "%s: ", progname); vfprintf(stderr, fmt, ap); va_end(ap); exit(1); } void warn(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "%s: ", progname); vfprintf(stderr, fmt, ap); va_end(ap); } void setprogname(const char *name) { const char *slash=strrchr(name, '/'); progname=slash? slash+1 : name; } void usage(FILE *stream, int status) { fprintf(stream, "Usage: %s pid fd filename\n", progname); if (ferror(stream) || fclose(stream)) status=1; exit(status); } pid_t str_to_pid_or_pgrp(const char *s) { char *endptr; long value; pid_t pid; errno=0; value=strtol(s, &endptr, 10); if (!*s || *endptr) die("Invalid pid: %s\n", s); if ((value==LONG_MIN || value==LONG_MAX) && errno==ERANGE) die("pid out of range for long: %s\n", s); pid=value; if (pid!=value) die("pid out of range: %s\n", s); return pid; } pid_t str_to_pid(const char *s) { pid_t pid; pid=str_to_pid_or_pgrp(s); if (pid<=0) die("Invalid pid: %s\n", s); return pid; } int str_to_fd(const char *s) { char *endptr; long value; int fd; errno=0; value=strtol(s, &endptr, 10); if (!*s || *endptr) die("Invalid fd: %s\n"); if ((value==LONG_MIN || value==LONG_MAX) && errno==ERANGE) die("fd out of range for long: %s\n", s); if (value<0) die("Invalid fd: %s\n", s); fd=value; if (fd!=value) die("fd out of range: %s\n", s); return fd; }