void list (int flag, int non_priv) { FILE *in = NULL; FILE *out = NULL; int socket = -1; if (opensock (&socket, &in, &out)) { client_type_t ctt = DBCTL; fwrite (&ctt, sizeof (client_type_t), 1, out); fflush (out); DbCtlCommand command = { 0 }; command.command = LIST; strcpy (command.parameter, ""); strcpy (command.options.username, ""); command.options.cpu = 0; command.options.level = 0; command.options.read = 0; command.options.write = 0; command.options.timeout = 0; command.options.user_max_connections = 0; fwrite_wrapper (&command, sizeof (DbCtlCommand), 1, out); fflush (out); print_list (in, flag, non_priv); closesock (socket, in, out); } else { closesock (socket, in, out); } }
reg_t kFPuts(EngineState *s, int funct_nr, int argc, reg_t *argv) { int handle = argv[0].toUint16(); char *data = kernel_dereference_char_pointer(s, argv[1], 0); fwrite_wrapper(s, handle, data, strlen(data)); return s->r_acc; }
GList * read_info (FILE * in) { GList *recv_accounts = NULL; Account *ac; int new_record; int tester = 1; while (fread_wrapper (&new_record, sizeof (int), 1, in)) { if (new_record == 1) { fwrite_wrapper (&tester, sizeof (int), 1, in); } else if (new_record == 0) { ac = malloc (sizeof (Account)); ac->id = malloc (sizeof (username_t)); ac->users = NULL; dbtop_exch dt; if (fread_wrapper (&dt, sizeof (dbtop_exch), 1, in)) { strncpy (ac->id, dt.id, sizeof (username_t)); memcpy (&ac->current, &dt.current, sizeof (Stats)); memcpy (&ac->short_average, &dt.short_average, sizeof (Stats)); memcpy (&ac->mid_average, &dt.mid_average, sizeof (Stats)); memcpy (&ac->long_average, &dt.long_average, sizeof (Stats)); memcpy (&ac->restricted, &dt.restricted, sizeof (int)); memcpy (&ac->timeout, &dt.timeout, sizeof (int)); memcpy (&ac->info, &dt.info, sizeof (restrict_info)); memcpy (&ac->start_count, &dt.start_count, sizeof (time_t)); recv_accounts = g_list_append (recv_accounts, ac); } else { perror ("Done"); exit (0); } } else return recv_accounts; } return recv_accounts; }
void *read_info() { Account *ac; int new_record; int tester = 1; while (fread_wrapper(&new_record, sizeof(int), 1, in)) { if (new_record == 1) { reset_recv_accounts(); fwrite_wrapper(&tester, sizeof(int), 1, in); } else if (new_record == 0) { ac = malloc(sizeof(Account)); ac->id = malloc(sizeof(username_t)); ac->users = NULL; dbtop_exch dt; if (fread_wrapper(&dt, sizeof(dbtop_exch), 1, in)) { strncpy(ac->id, dt.id, sizeof(username_t)); memcpy(&ac->current, &dt.current, sizeof(Stats)); memcpy(&ac->short_average, &dt.short_average, sizeof(Stats)); memcpy(&ac->mid_average, &dt.mid_average, sizeof(Stats)); memcpy(&ac->long_average, &dt.long_average, sizeof(Stats)); memcpy(&ac->restricted, &dt.restricted, sizeof(int)); memcpy(&ac->timeout, &dt.timeout, sizeof(int)); memcpy(&ac->info, &dt.info, sizeof(restrict_info)); memcpy(&ac->start_count, &dt.start_count, sizeof(time_t)); recv_accounts = g_list_append(recv_accounts, ac); } else { perror("Done"); exit(0); } } else { reset_accounts(); if (recv_accounts != NULL) g_list_foreach(recv_accounts, (GFunc) _copy_to_showed_accounts, NULL); sort_accounts(); } } return NULL; }
reg_t kFileIO(EngineState *s, int funct_nr, int argc, reg_t *argv) { int func_nr = argv[0].toUint16(); switch (func_nr) { case K_FILEIO_OPEN : { char *name = kernel_dereference_char_pointer(s, argv[1], 0); int mode = argv[2].toUint16(); file_open(s, name, mode); debug(3, "K_FILEIO_OPEN(%s,0x%x)", name, mode); break; } case K_FILEIO_CLOSE : { int handle = argv[1].toUint16(); debug(3, "K_FILEIO_CLOSE(%d)", handle); file_close(s, handle); break; } case K_FILEIO_READ_RAW : { int handle = argv[1].toUint16(); char *dest = kernel_dereference_char_pointer(s, argv[2], 0); int size = argv[3].toUint16(); debug(3, "K_FILEIO_READ_RAW(%d,%d)", handle, size); fread_wrapper(s, dest, size, handle); break; } case K_FILEIO_WRITE_RAW : { int handle = argv[1].toUint16(); char *buf = kernel_dereference_char_pointer(s, argv[2], 0); int size = argv[3].toUint16(); debug(3, "K_FILEIO_WRITE_RAW(%d,%d)", handle, size); fwrite_wrapper(s, handle, buf, size); break; } case K_FILEIO_UNLINK : { char *name = kernel_dereference_char_pointer(s, argv[1], 0); debug(3, "K_FILEIO_UNLINK(%s)", name); Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); const Common::String wrappedName = ((Sci::SciEngine*)g_engine)->wrapFilename(name); saveFileMan->removeSavefile(wrappedName); // TODO/FIXME: Should we return something (like, a bool indicating // whether deleting the save succeeded or failed)? break; } case K_FILEIO_READ_STRING : { char *dest = kernel_dereference_char_pointer(s, argv[1], 0); int size = argv[2].toUint16(); int handle = argv[3].toUint16(); debug(3, "K_FILEIO_READ_STRING(%d,%d)", handle, size); fgets_wrapper(s, dest, size, handle); return argv[1]; } case K_FILEIO_WRITE_STRING : { int handle = argv[1].toUint16(); int size = argv[3].toUint16(); char *buf = kernel_dereference_char_pointer(s, argv[2], size); debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size); // FIXME: What is the difference between K_FILEIO_WRITE_STRING and // K_FILEIO_WRITE_RAW? Normally, I would expect the difference to // be that the former doesn't receive a 'size' parameter. But here // it does. Are we missing something? if (buf) fwrite_wrapper(s, handle, buf, size); break; } case K_FILEIO_SEEK : { int handle = argv[1].toUint16(); int offset = argv[2].toUint16(); int whence = argv[3].toUint16(); debug(3, "K_FILEIO_SEEK(%d,%d,%d)", handle, offset, whence); fseek_wrapper(s, handle, offset, whence); break; } case K_FILEIO_FIND_FIRST : { char *mask = kernel_dereference_char_pointer(s, argv[1], 0); reg_t buf = argv[2]; int attr = argv[3].toUint16(); // We won't use this, Win32 might, though... debug(3, "K_FILEIO_FIND_FIRST(%s,0x%x)", mask, attr); #ifndef WIN32 if (strcmp(mask, "*.*") == 0) strcpy(mask, "*"); // For UNIX #endif s->_dirseeker.firstFile(mask, buf); break; } case K_FILEIO_FIND_NEXT : { debug(3, "K_FILEIO_FIND_NEXT()"); s->_dirseeker.nextFile(); break; } case K_FILEIO_FILE_EXISTS : { char *name = kernel_dereference_char_pointer(s, argv[1], 0); // Check for regular file bool exists = Common::File::exists(name); if (!exists) { // TODO: Transform the name given by the scripts to us, e.g. by // prepending TARGET- Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager(); exists = !saveFileMan->listSavefiles(name).empty(); } debug(3, "K_FILEIO_FILE_EXISTS(%s) -> %d", name, exists); return make_reg(0, exists); } default : error("Unknown FileIO() sub-command: %d", func_nr); } return s->r_acc; }