X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_disk_lib.h;h=91cc1587a58387a39fa4eef11c892b7190a26238;hb=211fd52268a5ae7856273dd8d8b3b3ed427beadb;hp=5f6a37840348bba62114b29a82f7b37032959fda;hpb=cddbdf5b928c68ab71b40c950b9f01ea68a9fbdb;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_disk_lib.h b/src/include/gnunet_disk_lib.h index 5f6a37840..91cc1587a 100644 --- a/src/include/gnunet_disk_lib.h +++ b/src/include/gnunet_disk_lib.h @@ -25,20 +25,31 @@ #ifndef GNUNET_DISK_LIB_H #define GNUNET_DISK_LIB_H -/** - * Opaque handle used to access files. - */ -struct GNUNET_DISK_FileHandle; +#if WINDOWS +#define OFF_T uint64_t +#else +#define OFF_T off_t +#endif /** * Handle used to manage a pipe. */ struct GNUNET_DISK_PipeHandle; - +/** + * Type of a handle. + */ enum GNUNET_FILE_Type { - GNUNET_DISK_FILE, GNUNET_PIPE + /** + * Handle represents a file. + */ + GNUNET_DISK_HANLDE_TYPE_FILE, + + /** + * Handle represents a pipe. + */ + GNUNET_DISK_HANLDE_TYPE_PIPE }; /** @@ -217,24 +228,25 @@ enum GNUNET_DISK_AccessPermissions /** - * Constants for specifying how to seek. + * Constants for specifying how to seek. Do not change values or order, + * some of the code depends on the specific numeric values! */ enum GNUNET_DISK_Seek { /** * Seek an absolute position (from the start of the file). */ - GNUNET_DISK_SEEK_SET, + GNUNET_DISK_SEEK_SET = 0, /** * Seek a relative position (from the current offset). */ - GNUNET_DISK_SEEK_CUR, + GNUNET_DISK_SEEK_CUR = 1, /** * Seek an absolute position from the end of the file. */ - GNUNET_DISK_SEEK_END + GNUNET_DISK_SEEK_END = 2 }; @@ -295,14 +307,14 @@ GNUNET_DISK_file_test (const char *fil); * @param whence specification to which position the offset parameter relates to * @return the new position on success, GNUNET_SYSERR otherwise */ -off_t -GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle *h, off_t offset, +OFF_T +GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle *h, OFF_T offset, enum GNUNET_DISK_Seek whence); /** - * Get the size of the file (or directory) - * of the given file (in bytes). + * Get the size of the file (or directory) of the given file (in + * bytes). * * @param filename name of the file or directory * @param size set to the size of the file (or, @@ -310,11 +322,13 @@ GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle *h, off_t offset, * of all sizes of files in the directory) * @param includeSymLinks should symbolic links be * included? - * @return GNUNET_OK on success, GNUNET_SYSERR on error + * @param singleFileMode GNUNET_YES to only get size of one file + * and return GNUNET_SYSERR for directories. + * @return GNUNET_SYSERR on error, GNUNET_OK on success */ int GNUNET_DISK_file_size (const char *filename, uint64_t * size, - int includeSymLinks); + int includeSymLinks, int singleFileMode); /** @@ -352,6 +366,19 @@ char * GNUNET_DISK_mktemp (const char *t); +/** + * Create an (empty) temporary directory on disk. If the given name is not an + * absolute path, the current 'TMPDIR' will be prepended. In any case, 6 + * random characters will be appended to the name to create a unique name. + * + * @param t component to use for the name; + * does NOT contain "XXXXXX" or "/tmp/". + * @return NULL on error, otherwise name of freshly created directory + */ +char * +GNUNET_DISK_mkdtemp (const char *t); + + /** * Open a file. Note that the access permissions will only be * used if a new file is created and if the underlying operating @@ -368,15 +395,44 @@ struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm); + +/** + * Get the size of an open file. + * + * @param fh open file handle + * @param size where to write size of the file + * @return GNUNET_OK on success, GNUNET_SYSERR on error + */ +int +GNUNET_DISK_file_handle_size (struct GNUNET_DISK_FileHandle *fh, + OFF_T *size); + + /** * Creates an interprocess channel - * @param blocking creates an asynchronous pipe if set to GNUNET_NO + * + * @param blocking_read creates an asynchronous pipe for reading if set to GNUNET_NO + * @param blocking_write creates an asynchronous pipe for writing if set to GNUNET_NO * @param inherit_read 1 to make read handle inheritable, 0 otherwise (NT only) * @param inherit_write 1 to make write handle inheritable, 0 otherwise (NT only) * @return handle to the new pipe, NULL on error */ struct GNUNET_DISK_PipeHandle * -GNUNET_DISK_pipe (int blocking, int inherit_read, int inherit_write); +GNUNET_DISK_pipe (int blocking_read, int blocking_write, int inherit_read, int inherit_write); + + +/** + * Creates a pipe object from a couple of file descriptors. + * Useful for wrapping existing pipe FDs. + * + * @param blocking_read creates an asynchronous pipe for reading if set to GNUNET_NO + * @param blocking_write creates an asynchronous pipe for writing if set to GNUNET_NO + * @param fd an array of two fd values. One of them may be -1 for read-only or write-only pipes + * + * @return handle to the new pipe, NULL on error + */ +struct GNUNET_DISK_PipeHandle * +GNUNET_DISK_pipe_from_fd (int blocking_read, int blocking_write, int fd[2]); /** @@ -387,6 +443,7 @@ GNUNET_DISK_pipe (int blocking, int inherit_read, int inherit_write); int GNUNET_DISK_pipe_close (struct GNUNET_DISK_PipeHandle *p); + /** * Closes one half of an interprocess channel * @@ -419,6 +476,17 @@ const struct GNUNET_DISK_FileHandle * GNUNET_DISK_pipe_handle (const struct GNUNET_DISK_PipeHandle *p, enum GNUNET_DISK_PipeEnd n); + +/** + * Get a handle from a native FD. + * + * @param fd native file descriptor + * @return file handle corresponding to the descriptor + */ +struct GNUNET_DISK_FileHandle * +GNUNET_DISK_get_handle_from_native (FILE *fd); + + /** * Read the contents of a binary file into a buffer. * @param h handle to an open file @@ -431,6 +499,21 @@ GNUNET_DISK_file_read (const struct GNUNET_DISK_FileHandle *h, void *result, size_t len); +/** + * Read the contents of a binary file into a buffer. + * Guarantees not to block (returns GNUNET_SYSERR and sets errno to EAGAIN + * when no data can be read). + * + * @param h handle to an open file + * @param result the buffer to write the result to + * @param len the maximum number of bytes to read + * @return the number of bytes read on success, GNUNET_SYSERR on failure + */ +ssize_t +GNUNET_DISK_file_read_non_blocking (const struct GNUNET_DISK_FileHandle * h, + void *result, size_t len); + + /** * Read the contents of a binary file into a buffer. * @@ -456,6 +539,17 @@ GNUNET_DISK_file_write (const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n); +/** + * Write a buffer to a file, blocking, if necessary. + * @param h handle to open file + * @param buffer the data to write + * @param n number of bytes to write + * @return number of bytes written on success, GNUNET_SYSERR on error + */ +ssize_t +GNUNET_DISK_file_write_blocking (const struct GNUNET_DISK_FileHandle * h, + const void *buffer, size_t n); + /** * Write a buffer to a file. If the file is longer than * the given buffer size, it will be truncated. @@ -546,8 +640,10 @@ GNUNET_DISK_directory_iterator_next (struct GNUNET_DISK_DirectoryIterator *iter, * @param dirName the name of the directory * @param callback the method to call for each file * @param callback_cls closure for callback + * @return GNUNET_YES if directory is not empty and 'callback' + * will be called later, GNUNET_NO otherwise, GNUNET_SYSERR on error. */ -void +int GNUNET_DISK_directory_iterator_start (enum GNUNET_SCHEDULER_Priority prio, const char *dirName, GNUNET_DISK_DirectoryIteratorCallback @@ -584,11 +680,11 @@ GNUNET_DISK_directory_test (const char *fil); * Remove all files in a directory (rm -rf). Call with * caution. * - * @param fileName the file to remove + * @param filename the file to remove * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int -GNUNET_DISK_directory_remove (const char *fileName); +GNUNET_DISK_directory_remove (const char *filename); /** @@ -611,8 +707,8 @@ GNUNET_DISK_directory_create (const char *dir); * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int -GNUNET_DISK_file_lock (struct GNUNET_DISK_FileHandle *fh, off_t lockStart, - off_t lockEnd, int excl); +GNUNET_DISK_file_lock (struct GNUNET_DISK_FileHandle *fh, OFF_T lockStart, + OFF_T lockEnd, int excl); /** @@ -623,8 +719,8 @@ GNUNET_DISK_file_lock (struct GNUNET_DISK_FileHandle *fh, off_t lockStart, * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int -GNUNET_DISK_file_unlock (struct GNUNET_DISK_FileHandle *fh, off_t unlockStart, - off_t unlockEnd); +GNUNET_DISK_file_unlock (struct GNUNET_DISK_FileHandle *fh, OFF_T unlockStart, + OFF_T unlockEnd); /** @@ -699,36 +795,6 @@ GNUNET_DISK_file_unmap (struct GNUNET_DISK_MapHandle *h); int GNUNET_DISK_file_sync (const struct GNUNET_DISK_FileHandle *h); -/** - * Creates a named pipe/FIFO and opens it - * @param fn pointer to the name of the named pipe or to NULL - * @param flags open flags - * @param perm access permissions - * @return pipe handle on success, NULL on error - */ -struct GNUNET_DISK_FileHandle * -GNUNET_DISK_npipe_create (char **fn, enum GNUNET_DISK_OpenFlags flags, - enum GNUNET_DISK_AccessPermissions perm); - -/** - * Opens already existing named pipe/FIFO - * - * @param fn name of an existing named pipe - * @param flags open flags - * @param perm access permissions - * @return pipe handle on success, NULL on error - */ -struct GNUNET_DISK_FileHandle * -GNUNET_DISK_npipe_open (const char *fn, enum GNUNET_DISK_OpenFlags flags, - enum GNUNET_DISK_AccessPermissions perm); - -/** - * Closes a named pipe/FIFO - * @param pipe named pipe - * @return GNUNET_OK on success, GNUNET_SYSERR otherwise - */ -int -GNUNET_DISK_npipe_close (struct GNUNET_DISK_FileHandle *pipe); #if 0 /* keep Emacsens' auto-indent happy */ {