From: Andre Noll Date: Sat, 24 Nov 2007 11:00:25 +0000 (+0100) Subject: Merge commit 'remotes/fml/master' X-Git-Tag: v0.3.0~103 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=5c556c52f1196cea4536d36b683372de532943a9;hp=1dc5f16f83fd4758d2cb3661016b3f6d3ab4b6d8 Merge commit 'remotes/fml/master' --- diff --git a/Makefile.in b/Makefile.in index 6b76b075..c5d5027a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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@ diff --git a/REQUIREMENTS b/REQUIREMENTS index b8a09058..cec65ada 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -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 8a60166f..e84d9a88 100644 --- 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(); diff --git a/audiod.c b/audiod.c index b8c072d5..dfb61db4 100644 --- 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; diff --git a/client.c b/client.c index 4ef458f8..1506f656 100644 --- 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); diff --git a/client_common.c b/client_common.c index 9574c36f..4266ddb2 100644 --- a/client_common.c +++ b/client_common.c @@ -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; diff --git a/command.c b/command.c index c1bbba9a..ab948b09 100644 --- 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 " diff --git a/command_util.sh b/command_util.sh index 822cad2a..f0a861d6 100755 --- a/command_util.sh +++ b/command_util.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash read_header() diff --git a/configure.ac b/configure.ac index d06983c3..2343053e 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/convert_0.2-0.3.sh b/convert_0.2-0.3.sh index 47d4949b..24c937b9 100755 --- a/convert_0.2-0.3.sh +++ b/convert_0.2-0.3.sh @@ -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. diff --git a/dccp_recv.c b/dccp_recv.c index 47351afb..f0d7d66e 100644 --- a/dccp_recv.c +++ b/dccp_recv.c @@ -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); diff --git a/dccp_send.c b/dccp_send.c index 1ea8de25..27623237 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -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 ecd87cdc..0adab0f2 100644 --- 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 224f832c..cdfd1983 100644 --- 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); diff --git a/filter.c b/filter.c index 842e030f..52a1ce5b 100644 --- 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 126b40fe..d080946a 100644 --- 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(); } diff --git a/gui_common.c b/gui_common.c index 607a88e8..6bd54081 100644 --- a/gui_common.c +++ b/gui_common.c @@ -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]); diff --git a/http_recv.c b/http_recv.c index 71aef76a..0a460adf 100644 --- a/http_recv.c +++ b/http_recv.c @@ -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: diff --git a/http_send.c b/http_send.c index 7035f279..f3ae608b 100644 --- a/http_send.c +++ b/http_send.c @@ -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); diff --git a/mp3_afh.c b/mp3_afh.c index fe174ea8..f5fc7113 100644 --- 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 f896f564..c7bb8b4b 100644 --- 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 9ee318e5..0cb1538d 100644 --- 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 3a3d1426..0fe46411 100644 --- 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 a7660f59..ba43b10c 100644 --- 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 a6ea5b34..7ab83086 100644 --- 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); diff --git a/server.c b/server.c index 479b6b2d..bb807386 100644 --- 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); diff --git a/signal.c b/signal.c index 33449c63..3f3dbf69 100644 --- 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 4b7a962d..649d464b 100644 --- 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"); } diff --git a/stdout.c b/stdout.c index f39de109..fe188c9a 100644 --- 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 7b95d6b3..512f8fcc 100644 --- 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) {