if (do_lseek(map->fd,offset,SEEK_SET) != offset ||
(nread=read(map->fd,map->p,len)) != len) {
- fprintf(FERROR,"EOF in map_ptr! (offset=%d len=%d nread=%d errno=%d)\n",
+ rprintf(FERROR,"EOF in map_ptr! (offset=%d len=%d nread=%d errno=%d)\n",
(int)offset, len, nread, errno);
exit_cleanup(1);
}
if (pipe(to_child_pipe) < 0 ||
pipe(from_child_pipe) < 0) {
- fprintf(FERROR,"pipe: %s\n",strerror(errno));
+ rprintf(FERROR,"pipe: %s\n",strerror(errno));
exit_cleanup(1);
}
pid = do_fork();
if (pid < 0) {
- fprintf(FERROR,"fork: %s\n",strerror(errno));
+ rprintf(FERROR,"fork: %s\n",strerror(errno));
exit_cleanup(1);
}
close(to_child_pipe[1]) < 0 ||
close(from_child_pipe[0]) < 0 ||
dup2(from_child_pipe[1], STDOUT_FILENO) < 0) {
- fprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
+ rprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
exit_cleanup(1);
}
if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]);
if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]);
umask(orig_umask);
execvp(command[0], command);
- fprintf(FERROR,"Failed to exec %s : %s\n",
+ rprintf(FERROR,"Failed to exec %s : %s\n",
command[0],strerror(errno));
exit_cleanup(1);
}
if (close(from_child_pipe[1]) < 0 ||
close(to_child_pipe[0]) < 0) {
- fprintf(FERROR,"Failed to close : %s\n",strerror(errno));
+ rprintf(FERROR,"Failed to close : %s\n",strerror(errno));
exit_cleanup(1);
}
if (pipe(to_child_pipe) < 0 ||
pipe(from_child_pipe) < 0) {
- fprintf(FERROR,"pipe: %s\n",strerror(errno));
+ rprintf(FERROR,"pipe: %s\n",strerror(errno));
exit_cleanup(1);
}
pid = do_fork();
if (pid < 0) {
- fprintf(FERROR,"fork: %s\n",strerror(errno));
+ rprintf(FERROR,"fork: %s\n",strerror(errno));
exit_cleanup(1);
}
close(to_child_pipe[1]) < 0 ||
close(from_child_pipe[0]) < 0 ||
dup2(from_child_pipe[1], STDOUT_FILENO) < 0) {
- fprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
+ rprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
exit_cleanup(1);
}
if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]);
if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]);
- start_server(argc, argv);
+ start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv);
}
if (close(from_child_pipe[1]) < 0 ||
close(to_child_pipe[0]) < 0) {
- fprintf(FERROR,"Failed to close : %s\n",strerror(errno));
+ rprintf(FERROR,"Failed to close : %s\n",strerror(errno));
exit_cleanup(1);
}
void out_of_memory(char *str)
{
- fprintf(FERROR,"ERROR: out of memory in %s\n",str);
+ rprintf(FERROR,"ERROR: out of memory in %s\n",str);
exit_cleanup(1);
}
void overflow(char *str)
{
- fprintf(FERROR,"ERROR: buffer overflow in %s\n",str);
+ rprintf(FERROR,"ERROR: buffer overflow in %s\n",str);
exit_cleanup(1);
}
ifd = open(source, O_RDONLY);
if (ifd == -1) {
- fprintf(FERROR,"open %s: %s\n",
+ rprintf(FERROR,"open %s: %s\n",
source,strerror(errno));
return -1;
}
if (do_unlink(dest) && errno != ENOENT) {
- fprintf(FERROR,"unlink %s: %s\n",
+ rprintf(FERROR,"unlink %s: %s\n",
dest,strerror(errno));
return -1;
}
ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode);
if (ofd < 0) {
- fprintf(FERROR,"open %s: %s\n",
+ rprintf(FERROR,"open %s: %s\n",
dest,strerror(errno));
close(ifd);
return -1;
while ((len = safe_read(ifd, buf, sizeof(buf))) > 0) {
if (full_write(ofd, buf, len) < 0) {
- fprintf(FERROR,"write %s: %s\n",
+ rprintf(FERROR,"write %s: %s\n",
dest,strerror(errno));
close(ifd);
close(ofd);
close(ofd);
if (len < 0) {
- fprintf(FERROR,"read %s: %s\n",
+ rprintf(FERROR,"read %s: %s\n",
source,strerror(errno));
return -1;
}
kill(all_pids[i], sig);
}
}
+
+/* like strncpy but does not 0 fill the buffer and always null
+ terminates (thus it can use maxlen+1 space in d) */
+void strlcpy(char *d, char *s, int maxlen)
+{
+ int len = strlen(s);
+ if (len > maxlen) len = maxlen;
+ memcpy(d, s, len);
+ d[len] = 0;
+}
+
+/* turn a user name into a uid */
+int name_to_uid(char *name, uid_t *uid)
+{
+ struct passwd *pass;
+ if (!name || !*name) return 0;
+ pass = getpwnam(name);
+ if (pass) {
+ *uid = pass->pw_uid;
+ return 1;
+ }
+ return 0;
+}
+
+/* turn a group name into a gid */
+int name_to_gid(char *name, gid_t *gid)
+{
+ struct group *grp;
+ if (!name || !*name) return 0;
+ grp = getgrnam(name);
+ if (grp) {
+ *gid = grp->gr_gid;
+ return 1;
+ }
+ return 0;
+}
+
+