| /* |
| * Copyright (C) Tildeslash Ltd. All rights reserved. |
| * |
| * This program is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU Affero General Public License version 3. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Affero General Public License for more details. |
| * |
| * You should have received a copy of the GNU Affero General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| * |
| * In addition, as a special exception, the copyright holders give |
| * permission to link the code of portions of this program with the |
| * OpenSSL library under certain conditions as described in each |
| * individual source file, and distribute linked combinations |
| * including the two. |
| * |
| * You must obey the GNU Affero General Public License in all respects |
| * for all of the code used other than OpenSSL. |
| */ |
| |
| |
| #ifndef FILE_INCLUDED |
| #define FILE_INCLUDED |
| #include <sys/types.h> |
| |
| |
| /** |
| * A set of low-level class methods for operating on a file. |
| * |
| * @see http://www.mmonit.com/ |
| * @file |
| */ |
| |
| |
| /** |
| * The system-dependent filename separator character. On UNIX systems |
| * the value of this char is '/' on Win32 systems it is '\'. |
| */ |
| extern const char SEPARATOR_CHAR; |
| |
| /** |
| * The separator character, provided as a string for convenience. This |
| * string contains a single character, namely SEPARATOR_CHAR. |
| */ |
| extern const char *SEPARATOR; |
| |
| /** |
| * The system-dependent path-separator character. This character is |
| * used to separate filenames in a sequence of files given as a path |
| * list. On UNIX systems, this character is ':' on Win32 systems it is ';'. |
| */ |
| extern const char PATH_SEPARATOR_CHAR; |
| |
| /** |
| * The system-dependent path-separator character, provided as a string |
| * for convenience. This string contains a single character, namely |
| * PATH_SEPARATOR_CHAR. |
| */ |
| extern const char *PATH_SEPARATOR; |
| |
| |
| /** |
| * Open <code>file</code> and return its file descriptor. The file is |
| * opened in non-blocking mode, meaning that read and write operations |
| * will not block. Clients can pass the descriptor to an Input- and/or |
| * an OutputStream for reading/writing to the file. The mode parameter |
| * is used to specify the access requested for the file. The mode may |
| * be one of |
| * <ol> |
| * <li>"r" Open for reading. The stream is positioned at the beginning |
| * of the file</li> |
| * <li>"w" Open for writing. If the file does not exist it will be |
| * created, if it exist it is truncated to length 0. The stream is |
| * positioned at the beginning of the file</li> |
| * <li>"r+" Open for reading and writing. The stream is positioned |
| * at the beginning of the file</li> |
| * <li>"w+" Open for reading and writing. If the file does not exist it |
| * will be created, if it exist it is truncated to length 0. The stream is |
| * positioned at the beginning of the file</li> |
| * <li>"a" Open for writing at the end of the file (appending). If the |
| * file does not exist it will be created. The stream is positioned at |
| * the end of the file</li> |
| * <li>"a+" Open for reading and writing. If the file does not exist it |
| * will be created. The stream is positioned at the end of the file</li> |
| *</ol> |
| * @param file An absolute file path |
| * @param mode the file access mode |
| * @return A file descriptor or -1 if the file cannot be opened. Use |
| * System_getLastError() to get a description of the error that occurred |
| */ |
| int File_open(const char *file, const char *mode); |
| |
| |
| /** |
| * Close the file descriptor <code>fd</code> |
| * @param fd An open file descriptor |
| * @return true on success or false if an error occurred. |
| */ |
| int File_close(int fd); |
| |
| |
| /** |
| * Move the <code>read</code> position in the file to the beginning |
| * of input. |
| * @param fd An open file descriptor |
| * @return true if success otherwise false and errno is set accordingly |
| */ |
| int File_rewind(int fd); |
| |
| |
| /** |
| * Returns the last modified time stamp for the given <code>file</code>. |
| * A file's mtime is changed by a file write operation |
| * @param file An absolute file path |
| * @return the last modified time stamp or -1 if the file was not found. |
| */ |
| time_t File_mtime(const char *file); |
| |
| |
| /** |
| * Returns the time when the <code>file</code> status was last changed. |
| * A file ctime is changed by a file write, chmod, chown, rename, etc. |
| * @param file An absolute file path |
| * @return the last changed time stamp or -1 if the file was not found |
| */ |
| time_t File_ctime(const char *file); |
| |
| |
| /** |
| * Returns the time when <code>file</code> data was last accessed. |
| * A file atime is changed by a file read operation |
| * @param file An absolute file path |
| * @return the last accessed time stamp or -1 if the file was not found. |
| */ |
| time_t File_atime(const char *file); |
| |
| |
| /** |
| * Check if this is a regular <code>file</code>. |
| * @param file An absolute file path |
| * @return true if file exist and is a regular file, otherwise false |
| */ |
| int File_isFile(const char *file); |
| |
| |
| /** |
| * Check if <code>file</code> is a directory |
| * @param file An absolute file path |
| * @return true if file exist and is a directory, otherwise false |
| */ |
| int File_isDirectory(const char *file); |
| |
| |
| /** |
| * Check if the <code>file</code> exist |
| * @param file An absolute file path |
| * @return true if file exist otherwise false |
| */ |
| int File_exist(const char *file); |
| |
| |
| /** |
| * Returns the file type. The returned char is one of |
| * <ul> |
| * <li>r - regular file</li> |
| * <li>d - directory</li> |
| * <li>c - char special</li> |
| * <li>b - block special</li> |
| * <li>l - symbolic link</li> |
| * <li>p - fifo or socket</li> |
| * <li>s - socket</li> |
| * <li>? - file does not exist</li> |
| * </ul> |
| * @param file An absolute file path |
| * @return The file type |
| */ |
| char File_type(const char *file); |
| |
| |
| /** |
| * Returns the <code>file</code> size in bytes |
| * @param file An absolute file path |
| * @return The file size or -1 if it does not exist |
| */ |
| off_t File_size(const char *file); |
| |
| |
| /** |
| * Changes permission bits on the <code>file</code> to the bit pattern |
| * represented by <code>perm</code>. On POSIX systems, see chmod(1) for |
| * details. Example, <code>File_chmod(file, 0644);</code> sets read and |
| * write permission for the File owner and read-only permission for others. |
| * @param file An absolute file path |
| * @param perm An octal number specifying a permission bit pattern. |
| * @return true if success otherwise false if for instance the File does |
| * not exist in the file system. |
| */ |
| int File_chmod(const char *file, mode_t perm); |
| |
| |
| /** |
| * Returns the permission bit pattern for the <code>file</code>. See also |
| * File_chmod(). |
| * @param file An absolute file path |
| * @return An octal number specifying the permission set for this file |
| * or -1 if the file does not exist |
| */ |
| mode_t File_mod(const char *file); |
| |
| |
| /** |
| * Returns the current umask value for this process. Umask values are |
| * subtracted from the default permissions. Files and directories |
| * are created with default permission set to 0666 and 0777 respectively. |
| * |
| * Simply put, the umask value is a set of permission bits to turn back off |
| * a file creation mode. When a file or directory is created, the permission |
| * bits specified are <i>anded</i> with the complement of the umask value to |
| * determine the actual bits that will be set. For instance, when a file is |
| * created with File_open() the permission for the new file is set |
| * according to |
| * <pre> |
| * 0666 & ~File_umask(). If File_umask() is 022 then; 0666 & ~022 = 0644 |
| * </pre> |
| * If a new directory is created with Dir_mkdir() then permission is set |
| * according to, |
| * <pre> |
| * 0777 & ~File_umask(). If File_umask() is 022 then; 0777 & ~022 = 0755 |
| * </pre> |
| * Here is a ruby on-liner to play with, to see how umask modifies default |
| * permissions |
| * <pre> |
| * ruby -e 'printf("%#o\n", (0666 & ~0022))' |
| * </pre> |
| * See also http://en.wikipedia.org/wiki/Umask and umask(2) on Unix |
| * @return An octal number representing the umask value for this process |
| */ |
| mode_t File_umask(void); |
| |
| |
| /** |
| * Set the umask value for this process. The default value is 022, unless |
| * changed by the user. See also File_umask() |
| * @param mask The new umask value, as a 3 digit octal number, e.g. 007 |
| * @return The old umask value for this process |
| */ |
| mode_t File_setUmask(mode_t mask); |
| |
| |
| /** |
| * Check if the <code>file</code> is readable for the real user id (uid) of |
| * this process |
| * @param file An absolute path |
| * @return true if the file is readable, otherwise false |
| */ |
| int File_isReadable(const char *file); |
| |
| |
| /** |
| * Check if the <code>file</code> is writable for the real user id (uid) of |
| * this process |
| * @param file An absolute path |
| * @return true if the file is writable, otherwise false |
| */ |
| int File_isWritable(const char *file); |
| |
| |
| /** |
| * Check if the <code>file</code> is executable for the real user id (uid) of |
| * this process |
| * @param file An absolute path |
| * @return true if the file is executable, otherwise false |
| */ |
| int File_isExecutable(const char *file); |
| |
| |
| /** |
| * Delete <code>file</code> from the filesystem |
| * @param file An absolute path |
| * @return true if success otherwise false |
| */ |
| int File_delete(const char *file); |
| |
| |
| /** |
| * Renames the given <code>file</code> to the new <code>name</code> |
| * Both <code>file</code> and <code>name</code> should contain a full path. |
| * @param file The name of the file to be renamed |
| * @param name The new name for the file. |
| * @return true if success otherwise false |
| */ |
| int File_rename(const char *file, const char *name); |
| |
| |
| /** |
| * Returns only the filename with leading directory components |
| * removed. This function does not modify the path string. |
| * @param path A file path string |
| * @return A pointer to the base name in path |
| */ |
| const char *File_basename(const char *path); |
| |
| |
| /** |
| * Strip the filename and return only the path, including the last path |
| * separator. The path parameter is modified so if you need to preserve |
| * the path string, copy the string before it is passed to this function. |
| * If no file separator can be found in the given path the following string |
| * is returned "." meaning the current directory. |
| * @param path A file path string |
| * @return The dir name from the path |
| */ |
| char *File_dirname(char *path); |
| |
| |
| /** |
| * Returns only the file extension from the <code>path</code>. This |
| * function does not modify the path string. For instance given |
| * the file path: <code>zild/webapps/ROOT/hello.html</code> this method |
| * returns a pointer to the sub-string <code>html</code>. If the |
| * <code>path</code> string does not contain an extension this |
| * method returns NULL. |
| * @param path A file path string |
| * @return A pointer to the file extension in the <code>path</code> |
| * string or NULL if no extension is found. |
| */ |
| const char *File_extension(const char *path); |
| |
| |
| /** |
| * If path is a directory, remove the last SEPARATOR char if any. |
| * Example: |
| * <pre> |
| * File_removeTrailingSeparator("/tmp/") -> "/tmp" |
| * File_removeTrailingSeparator("/tmp") -> "/tmp" |
| * File_removeTrailingSeparator(".monitrc") -> ".monitrc" |
| * </pre> |
| * @param path A file path string |
| * @return A pointer to the path string |
| */ |
| char *File_removeTrailingSeparator(char *path); |
| |
| |
| /** |
| * Returns the canonicalized absolute pathname of the <code>path</code> |
| * parameter. The <code>resolved</code> buffer must have size equal to |
| * PATH_MAX |
| * @param path The file path to normalize |
| * @param resolved The buffer to write the real path too |
| * @return A pointer to the resolved buffer or NULL if an error occured |
| */ |
| char *File_getRealPath(const char *path, char *resolved); |
| |
| |
| #endif |