#ifndef OS_H_ #define OS_H_ typedef enum { FS_NON_EXISTENT, FS_FILE, FS_DIRECTORY, FS_OTHER } FsType; enum { FS_PERMISSION_READ = 0x01, FS_PERMISSION_WRITE = 0x02, }; typedef u8 FsPermission; typedef struct { FsType type; char name[]; } FsDirectoryEntry; // returns what kind of thing this is. FsType fs_path_type(char const *path); FsPermission fs_path_permission(char const *path); // Does this file exist? Returns false for directories. bool fs_file_exists(char const *path); // Returns a NULL-terminated array of the files/directories in this directory, or NULL if the directory does not exist/out of memory. // When you're done with the entries, call fs_dir_entries_free (or call free on each entry, then on the whole array). // NOTE: The files/directories aren't returned in any particular order! FsDirectoryEntry **fs_list_directory(char const *dirname); // Create the directory specified by `path` // Returns: // 1 if the directory was created successfully // 0 if the directory already exists // -1 if the path already exists, but it's not a directory, or if there's another error (e.g. don't have permission to create directory). int fs_mkdir(char const *path); // Puts the current working directory into buf, including a null-terminator, writing at most buflen bytes. // Returns: // 1 if the working directory was inserted into buf successfully // 0 if buf is too short to hold the cwd // -1 if we can't get the cwd for whatever reason. int fs_get_cwd(char *buf, size_t buflen); struct timespec time_last_modified(char const *filename); struct timespec time_get(void); // sleep for a certain number of nanoseconds void time_sleep_ns(u64 ns); // free the entries generated by fs_list_directory. static void fs_dir_entries_free(FsDirectoryEntry **entries) { for (int i = 0; entries[i]; ++i) free(entries[i]); free(entries); } static double time_get_seconds(void) { return timespec_to_seconds(time_get()); } // sleep for microseconds static void time_sleep_us(u64 us) { time_sleep_ns(us * 1000); } // sleep for milliseconds static void time_sleep_ms(u64 ms) { time_sleep_ns(ms * 1000000); } // sleep for seconds static void time_sleep_s(u64 s) { time_sleep_ns(s * 1000000000); } #endif // OS_H_