/*
- * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
int ret, fd = -1, query_shmid, result_shmid;
void *query_shm, *result_shm;
char buf[sizeof(afs_socket_cookie) + sizeof(int)];
- struct sockaddr_un unix_addr;
size_t query_shm_size = sizeof(*cq);
if (query)
*(uint32_t *) buf = afs_socket_cookie;
*(int *) (buf + sizeof(afs_socket_cookie)) = query_shmid;
- ret = get_stream_socket(PF_UNIX);
+ ret = create_remote_socket(conf.afs_socket_arg);
if (ret < 0)
goto out;
fd = ret;
- ret = init_unix_addr(&unix_addr, conf.afs_socket_arg);
- if (ret < 0)
- goto out;
- ret = PARA_CONNECT(fd, &unix_addr);
- if (ret < 0)
- goto out;
ret = send_bin_buffer(fd, buf, sizeof(buf));
if (ret < 0)
goto out;
if (ret < 0)
goto out;
if (ret != sizeof(int)) {
- ret = -E_RECV;
+ ret = -E_AFS_SHORT_READ;
goto out;
}
ret = *(int *) buf;
/* Sum of the length of all control messages in the buffer */
msg.msg_controllen = cmsg->cmsg_len;
- PARA_NOTICE_LOG("passing %zu bytes and fd %d\n", size, fd);
+ PARA_DEBUG_LOG("passing %zu bytes and fd %d\n", size, fd);
ret = sendmsg(server_socket, &msg, 0);
if (ret < 0) {
ret = -ERRNO_TO_PARA_ERROR(errno);
struct audio_file_data afd;
int ret, shmid;
char buf[8];
-
- PARA_NOTICE_LOG("getting next af\n");
- ret = score_get_best(&aft_row, &afd.score);
- if (ret < 0)
- return ret;
- ret = open_and_update_audio_file(aft_row, &afd);
- if (ret < 0)
- return ret;
+ long score;
+again:
+ PARA_NOTICE_LOG("getting next audio file\n");
+ ret = score_get_best(&aft_row, &score);
+ if (ret < 0) {
+ PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+ goto no_admissible_files;
+ }
+ ret = open_and_update_audio_file(aft_row, score, &afd);
+ if (ret < 0) {
+ PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+ ret = score_delete(aft_row);
+ if (ret < 0) {
+ PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+ goto no_admissible_files;
+ }
+ goto again;
+ }
shmid = ret;
- PARA_NOTICE_LOG("shmid: %u\n", shmid);
if (!write_ok(server_socket)) {
- PARA_EMERG_LOG("afs_socket not writable\n");
+ ret = -E_AFS_SOCKET;
goto destroy;
}
*(uint32_t *)buf = NEXT_AUDIO_FILE;
close(afd.fd);
if (ret >= 0)
return ret;
- PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
destroy:
shm_destroy(shmid);
return ret;
+no_admissible_files:
+ *(uint32_t *)buf = NO_ADMISSIBLE_FILES;
+ *(uint32_t *)(buf + 4) = (uint32_t)0;
+ return send_bin_buffer(server_socket, buf, 8);
}
/* Never fails if arg == NULL */
ret = change_current_mood(NULL); /* always successful */
mode = PLAY_MODE_MOOD;
} else {
- if (!strncmp(arg, "p:", 2)) {
+ if (!strncmp(arg, "p/", 2)) {
ret = playlist_open(arg + 2);
mode = PLAY_MODE_PLAYLIST;
- } else if (!strncmp(arg, "m:", 2)) {
+ } else if (!strncmp(arg, "m/", 2)) {
ret = change_current_mood(arg + 2);
mode = PLAY_MODE_MOOD;
} else
- ret = -E_AFS_SYNTAX;
+ return -E_AFS_SYNTAX;
if (ret < 0)
return ret;
}
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();
playlist_close();
ret = activate_mood_or_playlist(arg, &num_admissible);
if (ret < 0) {
- para_printf(&pb, "%s\n", PARA_STRERROR(-ret));
+ para_printf(&pb, "%s\n", para_strerror(-ret));
para_printf(&pb, "switching back to %s\n", current_mop?
current_mop : "dummy");
ret = activate_mood_or_playlist(current_mop, &num_admissible);
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;
ret = create_local_socket(socket_name, &unix_addr,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH);
if (ret < 0) {
- PARA_EMERG_LOG("%s: %s\n", PARA_STRERROR(-ret), socket_name);
+ 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_nonblocking(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)
int i, ret;
get_database_dir();
+ PARA_NOTICE_LOG("opening %u osl tables in %s\n", NUM_AFS_TABLES,
+ database_dir);
for (i = 0; i < NUM_AFS_TABLES; i++) {
ret = afs_tables[i].open(database_dir);
if (ret >= 0)
continue;
PARA_ERROR_LOG("%s init: %s\n", afs_tables[i].name,
- PARA_STRERROR(-ret));
+ para_strerror(-ret));
break;
}
if (ret >= 0)
}
t->ret = -E_AFS_SIGNAL;
err:
- PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret));
+ PARA_NOTICE_LOG("%s\n", para_strerror(-t->ret));
unregister_tasks();
}
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;
};
if (ret <= 0) {
if (ret < 0)
- PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+ PARA_ERROR_LOG("%s\n", para_strerror(-ret));
return;
}
buf[ret] = '\0';
- PARA_NOTICE_LOG("received: %s\n", buf);
+ PARA_DEBUG_LOG("received: %s\n", buf);
if (!strcmp(buf, "new")) {
ret = open_next_audio_file();
- if (ret < 0)
- PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+ if (ret < 0) {
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+ unregister_tasks();
+ }
return;
}
PARA_ERROR_LOG("unknown command\n");
int ret = recv_bin_buffer(fd, buf, sizeof(buf));
if (ret < 0) {
- PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-ret));
+ PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
return;
}
if (ret != sizeof(buf)) {
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();
goto out;
t->ret = para_accept(ct->fd, &unix_addr, sizeof(unix_addr));
if (t->ret < 0) {
- PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret));
+ PARA_NOTICE_LOG("%s\n", para_strerror(-t->ret));
+ goto out;
+ }
+ fd = t->ret;
+ t->ret = mark_fd_nonblocking(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:
ret = open_afs_tables();
if (ret < 0) {
- PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
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",
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));
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
close_afs_tables();
exit(EXIT_FAILURE);
}
continue;
ret = t->event_handler(event, pb, data);
if (ret < 0)
- PARA_CRIT_LOG("%s\n", PARA_STRERROR(-ret));
+ PARA_CRIT_LOG("%s\n", para_strerror(-ret));
}
}