- struct audio_format_handler *af = NULL;
- int i, format;
- struct timeval *ret;
-again:
- format = mmd->audio_format;
- if (format >= 0)
- af = afl + format;
- else
- for (i = 0; senders[i].name; i++)
- senders[i].shutdown_clients();
- if (afs_next() && af) {
- afs_eof(af);
- return afs_compute_timeout();
- }
- if (afs_paused() || afs_repos()) {
- for (i = 0; senders[i].name; i++)
- senders[i].shutdown_clients();
- if (af) {
- struct timeval now;
- gettimeofday(&now, NULL);
- if (!afs_paused() || mmd->chunks_sent)
- tv_add(&af->eof_tv, &now, &eof_barrier);
- if (afs_repos())
- tv_add(&now, &announce_tv, &data_send_barrier);
- if (mmd->new_afs_status_flags & AFS_NOMORE)
- mmd->new_afs_status_flags = AFS_NEXT;
+ static struct sched s;
+ int i, ret;
+
+ register_signal_task();
+ INIT_LIST_HEAD(&afs_client_list);
+ for (i = 0; i < NUM_AFS_TABLES; i++)
+ afs_tables[i].init(&afs_tables[i]);
+ ret = open_afs_tables();
+ if (ret < 0)
+ goto out;
+ server_socket = socket_fd;
+ ret = mark_fd_nonblocking(server_socket);
+ if (ret < 0)
+ goto out_close;
+ PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
+ server_socket, (unsigned) cookie);
+ init_admissible_files(conf.afs_initial_mode_arg);
+ register_command_task(cookie);
+ s.default_timeout.tv_sec = 0;
+ s.default_timeout.tv_usec = 999 * 1000;
+ ret = schedule(&s);
+out_close:
+ close_afs_tables();
+out:
+ if (ret < 0)
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+ exit(EXIT_FAILURE);
+}
+
+static void create_tables_callback(int fd, const struct osl_object *query)
+{
+ uint32_t table_mask = *(uint32_t *)query->data;
+ int i, ret;
+ struct para_buffer pb = {.buf = NULL};
+
+ close_afs_tables();
+ for (i = 0; i < NUM_AFS_TABLES; i++) {
+ struct afs_table *t = &afs_tables[i];
+
+ if (!(table_mask & (1 << i)))
+ continue;
+ if (!t->create)
+ continue;
+ ret = t->create(database_dir);
+ if (ret < 0)
+ goto out;
+ para_printf(&pb, "successfully created %s table\n", t->name);
+ }
+ ret = open_afs_tables();
+out:
+ if (ret < 0)
+ para_printf(&pb, "%s\n", para_strerror(-ret));
+ if (pb.buf)
+ pass_buffer_as_shm(pb.buf, pb.offset, &fd);
+ free(pb.buf);
+}
+
+int com_init(struct stream_cipher_context *scc, int argc, char * const * const argv)
+{
+ int i, j, ret;
+ uint32_t table_mask = (1 << (NUM_AFS_TABLES + 1)) - 1;
+ struct osl_object query = {.data = &table_mask,
+ .size = sizeof(table_mask)};
+
+ ret = make_database_dir();
+ if (ret < 0)
+ return ret;
+ if (argc != 1) {
+ table_mask = 0;
+ for (i = 1; i < argc; i++) {
+ for (j = 0; j < NUM_AFS_TABLES; j++) {
+ struct afs_table *t = &afs_tables[j];
+
+ if (strcmp(argv[i], t->name))
+ continue;
+ table_mask |= (1 << j);
+ break;
+ }
+ if (j == NUM_AFS_TABLES)
+ return -E_BAD_TABLE_NAME;