X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=355400874377a82cd1b5c085f6d3c729411ce540;hp=c2ac0e4110e15ceac8f677947894e2a1afd057b4;hb=192417698d9dab017ef6108fa6e9fd5ea1dc5633;hpb=b3ee0fa979a74e9d7a1497ec5a3ac8fa7cc7472b diff --git a/afs.c b/afs.c index c2ac0e41..35540087 100644 --- a/afs.c +++ b/afs.c @@ -486,12 +486,13 @@ int open_next_audio_file(void) struct audio_file_data afd; int ret, shmid; char buf[8]; + long score; PARA_NOTICE_LOG("getting next audio file\n"); - ret = score_get_best(&aft_row, &afd.score); + ret = score_get_best(&aft_row, &score); if (ret < 0) return ret; - ret = open_and_update_audio_file(aft_row, &afd); + ret = open_and_update_audio_file(aft_row, &afd, score); if (ret < 0) return ret; shmid = ret; @@ -540,7 +541,9 @@ static int activate_mood_or_playlist(char *arg, int *num_admissible) if (arg) { current_mop = para_strdup(arg); mmd_lock(); - strcpy(mmd->afs_mode_string, arg); /* FIXME: check length */ + strncpy(mmd->afs_mode_string, arg, + sizeof(mmd->afs_mode_string)); + mmd->afs_mode_string[sizeof(mmd->afs_mode_string) - 1] = '\0'; mmd_unlock(); } else { mmd_lock(); @@ -610,7 +613,7 @@ static void init_admissible_files(char *arg) static int setup_command_socket_or_die(void) { - int ret; + int ret, socket_fd; char *socket_name = conf.afs_socket_arg; struct sockaddr_un unix_addr; @@ -621,13 +624,18 @@ static int setup_command_socket_or_die(void) PARA_EMERG_LOG("%s: %s\n", PARA_STRERROR(-ret), socket_name); exit(EXIT_FAILURE); } - if (listen(ret , 5) < 0) { - PARA_EMERG_LOG("%s", "can not listen on socket\n"); + socket_fd = ret; + if (listen(socket_fd , 5) < 0) { + PARA_EMERG_LOG("can not listen on socket\n"); exit(EXIT_FAILURE); } - PARA_INFO_LOG("listening on command socket %s (fd %d)\n", socket_name, - ret); - return ret; + ret = mark_fd_nonblock(socket_fd); + if (ret < 0) { + close(socket_fd); + return ret; + } + PARA_INFO_LOG("listening on socket %s (fd %d)\n", socket_name, ret); + return socket_fd; } static void close_afs_tables(void) @@ -747,9 +755,13 @@ static void register_signal_task(void) static struct list_head afs_client_list; +/** Describes on connected afs client. */ struct afs_client { + /** Position in the afs client list. */ struct list_head node; + /** The socket file descriptor for this client. */ int fd; + /** The time the client connected. */ struct timeval connect_time; }; @@ -882,7 +894,7 @@ static void command_post_select(struct sched *s, struct task *t) struct command_task *ct = t->private_data; struct sockaddr_un unix_addr; struct afs_client *client, *tmp; - + int fd; if (FD_ISSET(server_socket, &s->rfds)) execute_server_command(); @@ -909,8 +921,15 @@ static void command_post_select(struct sched *s, struct task *t) PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret)); goto out; } + fd = t->ret; + t->ret = mark_fd_nonblock(fd); + if (t->ret < 0) { + PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret)); + close(fd); + goto out; + } client = para_malloc(sizeof(*client)); - client->fd = t->ret; + client->fd = fd; client->connect_time = *now; para_list_add(&client->node, &afs_client_list); out: