+ 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 rc4_context *rc4c, 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;
+ }
+ }
+ ret = send_callback_request(create_tables_callback, &query,
+ rc4_send_result, rc4c);
+ if (ret < 0)
+ return rc4_send_va_buffer(rc4c, "%s\n", para_strerror(-ret));
+ return ret;