* \sa send_standard_callback_request(), send_callback_request().
*/
int send_option_arg_callback_request(struct osl_object *options,
- int argc, const char **argv, callback_function *f,
+ int argc, char * const * const argv, callback_function *f,
struct osl_object *result)
{
char *p;
* \return The return value of the underlying call to
* send_option_arg_callback_request().
*/
-int send_standard_callback_request(int argc, const char **argv,
+int send_standard_callback_request(int argc, char * const * const argv,
callback_function *f, struct osl_object *result)
{
return send_option_arg_callback_request(NULL, argc, argv, f, result);
}
static int server_socket;
+static struct command_task command_task_struct;
+static struct signal_task signal_task_struct;
-void loop(void)
+static void unregister_tasks(void)
{
- for (;;)
- sleep(1);
+ unregister_task(&command_task_struct.task);
+ unregister_task(&signal_task_struct.task);
}
static void afs_shutdown(enum osl_close_flags flags)
t->ret = 1;
if (st->signum == SIGUSR1)
return; /* ignore SIGUSR1 */
- afs_shutdown(OSL_MARK_CLEAN);
t->ret = -E_SIGNAL_CAUGHT;
+ unregister_tasks();
}
static void register_signal_task(void)
{
- static struct signal_task signal_task_struct;
struct signal_task *st = &signal_task_struct;
st->fd = para_signal_init();
PARA_INFO_LOG("signal pipe: fd %d\n", st->fd);
goto out;
}
if (t->ret != sizeof(buf)) {
- PARA_NOTICE_LOG("short read (%d bytes, expected %d)\n",
+ PARA_NOTICE_LOG("short read (%d bytes, expected %u)\n",
t->ret, sizeof(buf));
t->ret = 1;
goto out;
static void register_command_task(uint32_t cookie)
{
- static struct command_task command_task_struct;
struct command_task *ct = &command_task_struct;
ct->fd = setup_command_socket_or_die();
ct->cookie = cookie;
register_command_task(cookie);
}
-__noreturn int afs_init(uint32_t cookie, int socket_fd)
+static int open_afs_tables(void)
{
int ret;
- enum play_mode current_play_mode;
- struct sched s;
-
- server_socket = socket_fd;
- PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
- server_socket, (unsigned) cookie);
-
- ret = attribute_init(&afs_tables[TBLNUM_ATTRIBUTES]);
+ char *db;
+
+ if (conf.afs_database_dir_given)
+ db = conf.afs_database_dir_arg;
+ else {
+ char *home = para_homedir();
+ db = make_message("%s/.paraslash/afs_database", home);
+ free(home);
+ }
+ PARA_INFO_LOG("afs_database dir %s\n", db);
+ ret = para_mkdir(db, 0777);
+ if (ret < 0 && ret != -E_EXIST)
+ goto err;
+ ret = attribute_init(&afs_tables[TBLNUM_ATTRIBUTES], db);
if (ret < 0)
- goto attribute_init_error;
- ret = moods_init(&afs_tables[TBLNUM_MOODS]);
+ goto err;
+ ret = moods_init(&afs_tables[TBLNUM_MOODS], db);
if (ret < 0)
goto moods_init_error;
- ret = playlists_init(&afs_tables[TBLNUM_PLAYLIST]);
+ ret = playlists_init(&afs_tables[TBLNUM_PLAYLIST], db);
if (ret < 0)
goto playlists_init_error;
- ret = lyrics_init(&afs_tables[TBLNUM_LYRICS]);
+ ret = lyrics_init(&afs_tables[TBLNUM_LYRICS], db);
if (ret < 0)
goto lyrics_init_error;
- ret = images_init(&afs_tables[TBLNUM_IMAGES]);
+ ret = images_init(&afs_tables[TBLNUM_IMAGES], db);
if (ret < 0)
goto images_init_error;
- ret = score_init(&afs_tables[TBLNUM_SCORES]);
+ ret = score_init(&afs_tables[TBLNUM_SCORES], db);
if (ret < 0)
goto score_init_error;
- ret = aft_init(&afs_tables[TBLNUM_AUDIO_FILES]);
+ ret = aft_init(&afs_tables[TBLNUM_AUDIO_FILES], db);
if (ret < 0)
goto aft_init_error;
-
- current_play_mode = init_admissible_files();
- register_tasks(cookie);
- s.default_timeout.tv_sec = 0;
- s.default_timeout.tv_usec = 99 * 1000;
- sched(&s);
+ if (!conf.afs_database_dir_given)
+ free(db);
+ return 1;
aft_init_error:
score_shutdown(OSL_MARK_CLEAN);
moods_shutdown(OSL_MARK_CLEAN);
moods_init_error:
attribute_shutdown(OSL_MARK_CLEAN);
-attribute_init_error:
+err:
+ if (!conf.afs_database_dir_given)
+ free(db);
+ return ret;
+}
+
+__noreturn int afs_init(uint32_t cookie, int socket_fd)
+{
+ enum play_mode current_play_mode;
+ struct sched s;
+ int ret = open_afs_tables();
+
+ if (ret < 0) {
+ PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
+ exit(EXIT_FAILURE);
+ }
+ server_socket = socket_fd;
+ PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
+ server_socket, (unsigned) cookie);
+ current_play_mode = init_admissible_files();
+ register_tasks(cookie);
+ s.default_timeout.tv_sec = 0;
+ s.default_timeout.tv_usec = 99 * 1000;
+ ret = sched(&s);
+ if (ret < 0)
+ PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
+ afs_shutdown(OSL_MARK_CLEAN);
exit(EXIT_FAILURE);
}
return 1;
}
-/* TODO load tables after init */
-int com_init(__a_unused int fd, int argc, const char **argv)
+int com_init(int fd, int argc, char * const * const argv)
{
int i, j, ret;
- if (argc == 1)
- return create_all_tables();
+
+ if (argc == 1) {
+ ret = create_all_tables();
+ if (ret < 0)
+ return ret;
+ return open_afs_tables();
+ }
for (i = 1; i < argc; i++) {
for (j = 0; j < NUM_AFS_TABLES; j++) {
struct table_info *ti = afs_tables + j;
continue;
if (strcmp(argv[i], ti->desc->name))
continue;
- PARA_NOTICE_LOG("creating table %s\n", argv[i]);
+ ret = send_va_buffer(fd, "creating table %s\n", argv[i]);
+ if (ret < 0)
+ return ret;
ret = osl_create_table(ti->desc);
if (ret < 0)
return ret;
if (j == NUM_AFS_TABLES)
return -E_BAD_TABLE_NAME;
}
- return 1;
+ return open_afs_tables();
}