}
-struct map_struct *map_file(int fd,off_t len)
+struct map_struct *map_file(int fd,OFF_T len)
{
struct map_struct *ret;
ret = (struct map_struct *)malloc(sizeof(*ret));
ret->p_len = 0;
#ifdef HAVE_MMAP
- if (len < MAX_MAP_SIZE)
- ret->map = (char *)mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0);
+ if (len < MAX_MAP_SIZE) {
+ ret->map = (char *)mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0);
+ if (ret->map == (char *)-1) {
+ ret->map = NULL;
+ }
+ }
#endif
return ret;
}
-char *map_ptr(struct map_struct *map,off_t offset,int len)
+char *map_ptr(struct map_struct *map,OFF_T offset,int len)
{
int nread = -2;
map->p_size = len;
}
- if (lseek(map->fd,offset,SEEK_SET) != offset ||
+ 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);
}
p = fname;
while ((p=strchr(p,'/'))) {
*p = 0;
- mkdir(fname,0777 & ~orig_umask);
+ do_mkdir(fname,0777 & ~orig_umask);
*p = '/';
p++;
}
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;
+}
+
+
+/****************************************************************************
+check if a process exists.
+****************************************************************************/
+int process_exists(int pid)
+{
+ return(kill(pid,0) == 0 || errno != ESRCH);
+}
+
+/* lock a byte range in a open file */
+int lock_range(int fd, int offset, int len)
+{
+ struct flock lock;
+
+ lock.l_type = F_WRLCK;
+ lock.l_whence = SEEK_SET;
+ lock.l_start = offset;
+ lock.l_len = len;
+ lock.l_pid = 0;
+
+ return fcntl(fd,F_SETLK,&lock) == 0;
+}
+
+
+void glob_expand(char **argv, int *argc, int maxargs)
+{
+#ifndef HAVE_GLOB
+ (*argc)++;
+ return;
+#else
+ glob_t globbuf;
+ int i;
+
+ memset(&globbuf, 0, sizeof(globbuf));
+ glob(argv[*argc], 0, NULL, &globbuf);
+ if (globbuf.gl_pathc == 0) {
+ (*argc)++;
+ globfree(&globbuf);
+ return;
+ }
+ for (i=0; i<(maxargs - (*argc)) && i<globbuf.gl_pathc;i++) {
+ if (i == 0) free(argv[*argc]);
+ argv[(*argc) + i] = strdup(globbuf.gl_pathv[i]);
+ if (!argv[(*argc) + i]) out_of_memory("glob_expand");
+ }
+ globfree(&globbuf);
+ (*argc) += i;
+#endif
+}
+
+
+/*******************************************************************
+ convert a string to lower case
+********************************************************************/
+void strlower(char *s)
+{
+ while (*s) {
+ if (isupper(*s)) *s = tolower(*s);
+ s++;
+ }
+}