Merge commit 'remotes/fml/master'
authorAndre Noll <maan@systemlinux.org>
Sat, 24 Nov 2007 11:00:25 +0000 (12:00 +0100)
committerAndre Noll <maan@systemlinux.org>
Sat, 24 Nov 2007 11:00:25 +0000 (12:00 +0100)
30 files changed:
Makefile.in
REQUIREMENTS
afs.c
audiod.c
client.c
client_common.c
command.c
command_util.sh
configure.ac
convert_0.2-0.3.sh
dccp_recv.c
dccp_send.c
fd.c
fd.h
filter.c
gui.c
gui_common.c
http_recv.c
http_send.c
mp3_afh.c
net.c
para.h
recv.c
sched.c
sched.h
server.c
signal.c
stdin.c
stdout.c
write.c

index 6b76b07..c5d5027 100644 (file)
@@ -26,7 +26,8 @@ DEBUG_CPPFLAGS += -Wredundant-decls
 # many warnings about trivial stuff
 # CPPFLAGS += -Wconversion
 
-LDFLAGS += -Wl,--gc-sections
+# uncomment this if your compiler supports it
+# LDFLAGS += -Wl,--gc-sections
 
 CPPFLAGS += -Os
 CPPFLAGS += -Wall
@@ -48,6 +49,7 @@ CPPFLAGS += -fdata-sections -ffunction-sections
 CPPFLAGS += -DMAIN_INPUT_FILE_IS_$(*F)
 CPPFLAGS += @SSL_CPPFLAGS@
 CPPFLAGS += @ncurses_cppflags@
+CPPFLAGS += @arch_cppflags@
 
 BINARIES = para_server para_client para_audioc para_recv \
        para_filter para_write para_fsck @extra_binaries@
index b8a0905..cec65ad 100644 (file)
@@ -38,8 +38,8 @@ Hacking the source:
 
        - gengetopt: ftp://ftp.gnu.org/pub/gnu/gengetopt/
        - autoconf: ftp://ftp.gnu.org/pub/gnu/autoconf/
-       - git
-       - grutatxt
-       - help2man
-       - doxygen
-       - global
+       - git http://git.or.cz/
+       - grutatxt http://www.triptico.com/software/grutatxt.html
+       - help2man ftp://ftp.gnu.org/pub/gnu/help2man
+       - doxygen http://www.stack.nl/~dimitri/doxygen/
+       - global ftp://ftp.gnu.org/pub/gnu/global
diff --git a/afs.c b/afs.c
index 8a60166..e84d9a8 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -541,7 +541,7 @@ static int activate_mood_or_playlist(char *arg, int *num_admissible)
                        ret = change_current_mood(arg + 2);
                        mode = PLAY_MODE_MOOD;
                } else
-                       ret = -E_AFS_SYNTAX;
+                       return -E_AFS_SYNTAX;
                if (ret < 0)
                        return ret;
        }
@@ -641,7 +641,7 @@ static int setup_command_socket_or_die(void)
                PARA_EMERG_LOG("can not listen on socket\n");
                exit(EXIT_FAILURE);
        }
-       ret = mark_fd_nonblock(socket_fd);
+       ret = mark_fd_nonblocking(socket_fd);
        if (ret < 0) {
                close(socket_fd);
                return ret;
@@ -936,7 +936,7 @@ static void command_post_select(struct sched *s, struct task *t)
                goto out;
        }
        fd = t->ret;
-       t->ret = mark_fd_nonblock(fd);
+       t->ret = mark_fd_nonblocking(fd);
        if (t->ret < 0) {
                PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret));
                close(fd);
@@ -990,7 +990,7 @@ __noreturn void afs_init(uint32_t cookie, int socket_fd)
                exit(EXIT_FAILURE);
        }
        server_socket = socket_fd;
-       ret = mark_fd_nonblock(server_socket);
+       ret = mark_fd_nonblocking(server_socket);
        if (ret < 0)
                exit(EXIT_FAILURE);
        PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
@@ -999,7 +999,7 @@ __noreturn void afs_init(uint32_t cookie, int socket_fd)
        register_tasks(cookie);
        s.default_timeout.tv_sec = 0;
        s.default_timeout.tv_usec = 999 * 1000;
-       ret = sched(&s);
+       ret = schedule(&s);
        if (ret < 0)
                PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
        close_afs_tables();
index b8c072d..dfb61db 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -119,7 +119,7 @@ int get_audio_format_num(char *name)
 {
        int i;
 
-       while (isspace(*name))
+       while (para_isspace(*name))
                name++;
        FOR_EACH_AUDIO_FORMAT(i)
                if (!strcmp(name, audio_formats[i]))
@@ -869,7 +869,7 @@ static int audiod_get_socket(void)
                PARA_EMERG_LOG("can not listen on socket\n");
                exit(EXIT_FAILURE); /* do not unlink socket */
        }
-       mark_fd_nonblock(fd);
+       mark_fd_nonblocking(fd);
        return fd;
 }
 
@@ -1168,7 +1168,7 @@ int main(int argc, char *argv[])
        register_task(audiod_task);
        s.default_timeout.tv_sec = 0;
        s.default_timeout.tv_usec = 99 * 1000;
-       ret = sched(&s);
+       ret = schedule(&s);
 
        PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
        return EXIT_FAILURE;
index 4ef458f..1506f65 100644 (file)
--- a/client.c
+++ b/client.c
@@ -77,7 +77,7 @@ int main(int argc, char *argv[])
        if (ret < 0) /* can not use PARA_LOG here */
                exit(EXIT_FAILURE);
        pcd->task.event_handler = client_event_handler;
-       ret = sched(&s);
+       ret = schedule(&s);
        if (ret < 0)
                PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
        client_close(pcd);
index 9574c36..4266ddb 100644 (file)
@@ -97,7 +97,7 @@ static int client_connect(struct private_client_data *pcd)
        if (ret < 0)
                goto err_out;
        pcd->status = CL_CONNECTED;
-       ret = mark_fd_nonblock(pcd->fd);
+       ret = mark_fd_nonblocking(pcd->fd);
        if (ret < 0)
                goto err_out;
        pcd->task.pre_select = client_pre_select;
index c1bbba9..ab948b0 100644 (file)
--- a/command.c
+++ b/command.c
@@ -698,6 +698,10 @@ int handle_connect(int fd, struct sockaddr_in *addr)
        signal(SIGHUP, SIG_DFL);
        signal(SIGUSR1, SIG_IGN);
 
+       /* we need a blocking fd here as recv() might return EAGAIN otherwise. */
+       ret = mark_fd_blocking(fd);
+       if (ret < 0)
+               goto err_out;
        challenge_nr = random();
        /* send Welcome message */
        ret = send_va_buffer(fd, "This is para_server, version "
index 822cad2..f0a861d 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 
 read_header()
index d06983c..2343053 100644 (file)
@@ -15,6 +15,12 @@ AC_MSG_CHECKING(os type)
 OSTYPE="`$UNAMEPATH -s`"
 AC_MSG_RESULT("$OSTYPE")
 
+if test "$OSTYPE" = "SunOS"; then
+       # needed on SunOS for socket magic
+       arch_cppflags="-D_XOPEN_SOURCE=500 -D__EXTENSIONS__"
+       AC_SUBST(arch_cppflags)
+fi
+
 AC_C_BIGENDIAN()
 
 AC_PROG_CC
index 47d4949..24c937b 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
 
 #-------------------------------------------------------------------------------
 ## Script to convert the database of paraslash 0.2.x to version 0.3.x.
index 47351af..f0d7d66 100644 (file)
@@ -92,7 +92,7 @@ static int dccp_recv_open(struct receiver_node *rn)
                ret = -E_DCCP_CONNECT;
                goto err_out;
        }
-       mark_fd_nonblock(pdd->fd);
+       mark_fd_nonblocking(pdd->fd);
        return 1;
 err_out:
        dccp_recv_close(rn);
index 1ea8de2..2762323 100644 (file)
@@ -78,7 +78,7 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds)
        dc->fd = ret;
        para_list_add(&dc->node, &clients);
        add_close_on_fork_list(dc->fd);
-       mark_fd_nonblock(dc->fd);
+       mark_fd_nonblocking(dc->fd);
        dc->cq = cq_new(DCCP_MAX_PENDING_BYTES);
 }
 
@@ -109,7 +109,7 @@ static int dccp_open(void)
        }
        PARA_DEBUG_LOG("listening on fd %d\n", listen_fd);
        add_close_on_fork_list(listen_fd);
-       mark_fd_nonblock(listen_fd);
+       mark_fd_nonblocking(listen_fd);
        return 1;
 }
 
diff --git a/fd.c b/fd.c
index ecd87cd..0adab0f 100644 (file)
--- a/fd.c
+++ b/fd.c
@@ -60,6 +60,24 @@ int para_select(int n, fd_set *readfds, fd_set *writefds,
        return ret;
 }
 
+/**
+ * Set a file descriptor to blocking mode.
+ *
+ * \param fd The file descriptor.
+ *
+ * \return Standard.
+ */
+int mark_fd_blocking(int fd)
+{
+       int flags = fcntl(fd, F_GETFL);
+       if (flags < 0)
+               return -ERRNO_TO_PARA_ERROR(errno);
+       flags = fcntl(fd, F_SETFL, ((long)flags) & ~O_NONBLOCK);
+       if (flags < 0)
+               return -ERRNO_TO_PARA_ERROR(errno);
+       return 1;
+}
+
 /**
  * Set a file descriptor to non-blocking mode.
  *
@@ -67,7 +85,7 @@ int para_select(int n, fd_set *readfds, fd_set *writefds,
  *
  * \return Standard.
  */
-int mark_fd_nonblock(int fd)
+int mark_fd_nonblocking(int fd)
 {
        int flags = fcntl(fd, F_GETFL);
        if (flags < 0)
diff --git a/fd.h b/fd.h
index 224f832..cdfd198 100644 (file)
--- a/fd.h
+++ b/fd.h
@@ -9,7 +9,8 @@
 int file_exists(const char *);
 int para_select(int n, fd_set *readfds, fd_set *writefds,
                struct timeval *timeout_tv);
-int mark_fd_nonblock(int fd);
+int mark_fd_nonblocking(int fd);
+int mark_fd_blocking(int fd);
 void para_fd_set(int fd, fd_set *fds, int *max_fileno);
 __must_check int para_fgets(char *line, int size, FILE *f);
 void *para_mmap(size_t length, int prot, int flags, int fd, off_t offset);
index 842e030..52a1ce5 100644 (file)
--- a/filter.c
+++ b/filter.c
@@ -167,7 +167,7 @@ int main(int argc, char *argv[])
        register_task(&sot->task);
        s.default_timeout.tv_sec = 1;
        s.default_timeout.tv_usec = 0;
-       ret = sched(&s);
+       ret = schedule(&s);
 out:
        free(sit->buf);
        close_filters(fc);
diff --git a/gui.c b/gui.c
index 126b40f..d080946 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -986,7 +986,7 @@ static int client_cmd_cmdline(char *cmd)
        if (ret < 0)
                return -1;
        command_pipe = fds[1];
-       mark_fd_nonblock(command_pipe);
+       mark_fd_nonblocking(command_pipe);
        return send_output();
 }
 
@@ -1002,7 +1002,7 @@ static int display_cmd(char *cmd)
        if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0)
                return -1;
        command_pipe = fds[1];
-       mark_fd_nonblock(command_pipe);
+       mark_fd_nonblocking(command_pipe);
        return send_output();
 }
 
index 607a88e..6bd5408 100644 (file)
@@ -21,7 +21,7 @@ int para_open_audiod_pipe(char *cmd)
        int ret = para_exec_cmdline_pid(&pid, cmd, fds);
        if (ret < 0)
                return ret;
-       ret = mark_fd_nonblock(fds[1]);
+       ret = mark_fd_nonblocking(fds[1]);
        if (ret > 0)
                return fds[1];
        close(fds[1]);
index 71aef76..0a460ad 100644 (file)
@@ -190,7 +190,7 @@ static int http_recv_open(struct receiver_node *rn)
                close(phd->fd);
                goto err_out;
        }
-       mark_fd_nonblock(phd->fd);
+       mark_fd_nonblocking(phd->fd);
        phd->status = HTTP_CONNECTED;
        return 1;
 err_out:
index 7035f27..f3ae608 100644 (file)
@@ -286,7 +286,7 @@ static void http_post_select(fd_set *rfds, fd_set *wfds)
        numclients++;
        para_list_add(&hc->node, &clients);
        add_close_on_fork_list(hc->fd);
-       mark_fd_nonblock(hc->fd);
+       mark_fd_nonblocking(hc->fd);
        return;
 err_out:
        PARA_WARNING_LOG("ignoring connect request from %s (%s)\n",
@@ -340,7 +340,7 @@ static int open_tcp_port(int port)
                self->status = SENDER_OFF;
                return server_fd;
        }
-       ret = mark_fd_nonblock(server_fd);
+       ret = mark_fd_nonblocking(server_fd);
        if (ret < 0) {
                PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
                exit(EXIT_FAILURE);
index fe174ea..f5fc711 100644 (file)
--- a/mp3_afh.c
+++ b/mp3_afh.c
@@ -163,7 +163,7 @@ static void write_info_str(struct afh_info *afhi)
 static char *unpad(char *string)
 {
        char *pos = string + strlen(string) - 1;
-       while (isspace(pos[0]))
+       while (para_isspace(pos[0]))
                (pos--)[0] = 0;
        return string;
 }
diff --git a/net.c b/net.c
index f896f56..c7bb8b4 100644 (file)
--- a/net.c
+++ b/net.c
@@ -232,7 +232,7 @@ __must_check int recv_bin_buffer(int fd, char *buf, size_t size)
        } else
                n = recv(fd, buf, size, 0);
        if (n == -1)
-               n = -E_RECV;
+               return -ERRNO_TO_PARA_ERROR(errno);
        return n;
 }
 
diff --git a/para.h b/para.h
index 9ee318e..0cb1538 100644 (file)
--- a/para.h
+++ b/para.h
@@ -217,3 +217,18 @@ static inline long int para_random(unsigned max)
 
 /** Get the size of an array */
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+/**
+ * Wrapper for isspace.
+ * NetBSD needs this.
+ */
+/*
+ * The values should be cast to an unsigned char first, then to int.
+ * Why? Because the isdigit (as do all other is/to functions/macros)
+ * expect a number from 0 upto and including 255 as their (int) argument.
+ * Because char is signed on most systems, casting it to int immediately
+ * gives the functions an argument between -128 and 127 (inclusive),
+ * which they will use as an array index, and which will thus fail
+ * horribly for characters which have their most significant bit set.
+ */
+#define para_isspace(c) isspace((int)(unsigned char)(c))
diff --git a/recv.c b/recv.c
index 3a3d142..0fe4641 100644 (file)
--- a/recv.c
+++ b/recv.c
@@ -104,7 +104,7 @@ int main(int argc, char *argv[])
        sprintf(rn.task.status, "receiver node");
        register_task(&rn.task);
 
-       ret = sched(&s);
+       ret = schedule(&s);
 out:
        if (r_opened)
                r->close(&rn);
diff --git a/sched.c b/sched.c
index a7660f5..ba43b10 100644 (file)
--- a/sched.c
+++ b/sched.c
@@ -68,7 +68,7 @@ static void sched_post_select(struct sched *s)
  *
  * \sa task, now.
  */
-int sched(struct sched *s)
+int schedule(struct sched *s)
 {
        if (!initialized)
                return -E_NOT_INITIALIZED;
@@ -148,7 +148,7 @@ void unregister_task(struct task *t)
 /**
  * unregister all tasks
  *
- * This will cause \a sched() to return immediately because both the
+ * This will cause \a schedule() to return immediately because both the
  * \a pre_select_list and the \a post_select_list are empty.
  */
 void sched_shutdown(void)
diff --git a/sched.h b/sched.h
index a6ea5b3..7ab8308 100644 (file)
--- a/sched.h
+++ b/sched.h
@@ -83,6 +83,6 @@ extern struct timeval *now;
 
 void register_task(struct task *t);
 void unregister_task(struct task *t);
-int sched(struct sched *s);
+int schedule(struct sched *s);
 char *get_task_list(void);
 int kill_task(char *id);
index 479b6b2..bb80738 100644 (file)
--- a/server.c
+++ b/server.c
@@ -308,7 +308,7 @@ static unsigned init_network(void)
        if (ret < 0)
                goto err;
        fd = ret;
-       ret = mark_fd_nonblock(fd);
+       ret = mark_fd_nonblocking(fd);
        if (ret < 0)
                goto err;
        add_close_on_fork_list(fd); /* child doesn't need the listener */
@@ -363,7 +363,7 @@ static void init_afs(void)
        }
        close(afs_server_socket[1]);
        afs_socket = afs_server_socket[0];
-       ret = mark_fd_nonblock(afs_socket);
+       ret = mark_fd_nonblocking(afs_socket);
        if (ret < 0)
                exit(EXIT_FAILURE);
        add_close_on_fork_list(afs_socket);
index 33449c6..3f3dbf6 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -40,10 +40,10 @@ int para_signal_init(void)
                ret = -ERRNO_TO_PARA_ERROR(errno);
                goto err_out;
        }
-       ret = mark_fd_nonblock(signal_pipe[0]);
+       ret = mark_fd_nonblocking(signal_pipe[0]);
        if (ret < 0)
                goto err_out;
-       ret = mark_fd_nonblock(signal_pipe[1]);
+       ret = mark_fd_nonblocking(signal_pipe[1]);
        if (ret < 0)
                goto err_out;
        return signal_pipe[0];
diff --git a/stdin.c b/stdin.c
index 4b7a962..649d464 100644 (file)
--- a/stdin.c
+++ b/stdin.c
@@ -97,6 +97,6 @@ void stdin_set_defaults(struct stdin_task *sit)
        sit->task.post_select = stdin_post_select;
        sit->task.event_handler = stdin_default_event_handler;
        sit->task.private_data = sit;
-       mark_fd_nonblock(STDIN_FILENO);
+       mark_fd_nonblocking(STDIN_FILENO);
        sprintf(sit->task.status, "stdin reader");
 }
index f39de10..fe188c9 100644 (file)
--- a/stdout.c
+++ b/stdout.c
@@ -100,6 +100,6 @@ void stdout_set_defaults(struct stdout_task *sot)
        sot->task.post_select = stdout_post_select;
        sot->task.event_handler = stdout_default_event_handler;
        sot->eof = 0;
-       mark_fd_nonblock(STDOUT_FILENO);
+       mark_fd_nonblocking(STDOUT_FILENO);
        sprintf(sot->task.status, "stdout writer");
 }
diff --git a/write.c b/write.c
index 7b95d6b..512f8fc 100644 (file)
--- a/write.c
+++ b/write.c
@@ -240,7 +240,7 @@ int main(int argc, char *argv[])
 
        s.default_timeout.tv_sec = 1;
        s.default_timeout.tv_usec = 0;
-       ret = sched(&s);
+       ret = schedule(&s);
 
 out:
        if (ret < 0) {