X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=2fb28b71eeabca63194400731ef19499b83806ca;hp=e491e30791f309b27a9ba8873e262323204f41d5;hb=28ea59db9b3cd2bd9d6be0f304d951aa550ea4d6;hpb=fecbff83c4ca773815965f4ebdc7e6d9769a87dc diff --git a/afs.c b/afs.c index e491e307..2fb28b71 100644 --- a/afs.c +++ b/afs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -233,7 +233,7 @@ int send_callback_request(callback_function *f, struct osl_object *query, *(uint32_t *) buf = afs_socket_cookie; *(int *) (buf + sizeof(afs_socket_cookie)) = query_shmid; - ret = create_remote_socket(conf.afs_socket_arg); + ret = connect_local_socket(conf.afs_socket_arg); if (ret < 0) goto out; fd = ret; @@ -843,57 +843,56 @@ static int call_callback(int fd, int query_shmid) return shm_detach(query_shm); } -static int execute_server_command(void) +static int execute_server_command(fd_set *rfds) { char buf[8]; - int ret = recv_bin_buffer(server_socket, buf, sizeof(buf) - 1); + size_t n; + int ret = read_nonblock(server_socket, buf, sizeof(buf) - 1, rfds, &n); - if (ret <= 0) { - if (!ret) - ret = -ERRNO_TO_PARA_ERROR(ECONNRESET); - goto err; - } - buf[ret] = '\0'; - PARA_DEBUG_LOG("received: %s\n", buf); - ret = -E_BAD_CMD; + if (ret < 0 || n == 0) + return ret; + buf[n] = '\0'; if (strcmp(buf, "new")) - goto err; - ret = open_next_audio_file(); -err: - return ret; + return -E_BAD_CMD; + return open_next_audio_file(); } -static void execute_afs_command(int fd, uint32_t expected_cookie) +/* returns 0 if no data available, 1 else */ +static int execute_afs_command(int fd, fd_set *rfds, uint32_t expected_cookie) { uint32_t cookie; int query_shmid; char buf[sizeof(cookie) + sizeof(query_shmid)]; - int ret = recv_bin_buffer(fd, buf, sizeof(buf)); + size_t n; + int ret = read_nonblock(fd, buf, sizeof(buf), rfds, &n); if (ret < 0) goto err; - if (ret != sizeof(buf)) { + if (n == 0) + return 0; + if (n != sizeof(buf)) { PARA_NOTICE_LOG("short read (%d bytes, expected %lu)\n", ret, (long unsigned) sizeof(buf)); - return; + return 1; } cookie = *(uint32_t *)buf; if (cookie != expected_cookie) { - PARA_NOTICE_LOG("received invalid cookie(got %u, expected %u)\n", + PARA_NOTICE_LOG("received invalid cookie (got %u, expected %u)\n", (unsigned)cookie, (unsigned)expected_cookie); - return; + return 1; } query_shmid = *(int *)(buf + sizeof(cookie)); if (query_shmid < 0) { PARA_WARNING_LOG("received invalid query shmid %d)\n", query_shmid); - return; + return 1; } ret = call_callback(fd, query_shmid); if (ret >= 0) - return; + return 1; err: PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); + return 1; } /** Shutdown connection if query has not arrived until this many seconds. */ @@ -906,20 +905,16 @@ static void command_post_select(struct sched *s, struct task *t) struct afs_client *client, *tmp; int fd, ret; - if (FD_ISSET(server_socket, &s->rfds)) { - ret = execute_server_command(); - if (ret < 0) { - PARA_EMERG_LOG("%s\n", para_strerror(-ret)); - sched_shutdown(); - return; - } + ret = execute_server_command(&s->rfds); + if (ret < 0) { + PARA_EMERG_LOG("%s\n", para_strerror(-ret)); + sched_shutdown(); + return; } - /* Check the list of connected clients. */ list_for_each_entry_safe(client, tmp, &afs_client_list, node) { - if (FD_ISSET(client->fd, &s->rfds)) - execute_afs_command(client->fd, ct->cookie); - else { /* prevent bogus connection flooding */ + ret = execute_afs_command(client->fd, &s->rfds, ct->cookie); + if (ret == 0) { /* prevent bogus connection flooding */ struct timeval diff; tv_diff(now, &client->connect_time, &diff); if (diff.tv_sec < AFS_CLIENT_TIMEOUT)