From 0a217a8df1657b4334b55b0e4a6c7837a8dbcfd9 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 29 May 2009 00:46:26 +0000 Subject: ng --- src/include/gnunet_disk_lib.h | 279 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 src/include/gnunet_disk_lib.h (limited to 'src/include/gnunet_disk_lib.h') diff --git a/src/include/gnunet_disk_lib.h b/src/include/gnunet_disk_lib.h new file mode 100644 index 000000000..3886be7c9 --- /dev/null +++ b/src/include/gnunet_disk_lib.h @@ -0,0 +1,279 @@ +/* + This file is part of GNUnet. + (C) 2001, 2002, 2003, 2004, 2005, 2006 Christian Grothoff (and other contributing authors) + + GNUnet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2, or (at your + option) any later version. + + GNUnet 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/** + * @file include/gnunet_disk_lib.h + * @brief disk IO apis + */ + +#ifndef GNUNET_DISK_LIB_H +#define GNUNET_DISK_LIB_H + +#include "gnunet_configuration_lib.h" +#include "gnunet_scheduler_lib.h" + +/* we need size_t, and since it can be both unsigned int + or unsigned long long, this IS platform dependent; + but "stdlib.h" should be portable 'enough' to be + unconditionally available... */ +#include + +#ifdef __cplusplus +extern "C" +{ +#if 0 /* keep Emacsens' auto-indent happy */ +} +#endif +#endif + +/** + * Get the number of blocks that are left on the partition that + * contains the given file (for normal users). + * + * @param part a file on the partition to check + * @return -1 on errors, otherwise the number of free blocks + */ +long GNUNET_DISK_get_blocks_available (const char *part); + + +/** + * Check that fil corresponds to a filename + * (of a file that exists and that is not a directory). + * + * @returns GNUNET_YES if yes, GNUNET_NO if not a file, GNUNET_SYSERR if something + * else (will print an error message in that case, too). + */ +int GNUNET_DISK_file_test (const char *fil); + + +/** + * Get the size of the file (or directory) + * of the given file (in bytes). + * + * @param includeSymLinks should symbolic links be + * included? + * + * @return GNUNET_OK on success, GNUNET_SYSERR on error + */ +int GNUNET_DISK_file_size (const char *filename, + unsigned long long *size, int includeSymLinks); + + +/** + * Wrapper around "open()". Opens a file. + * + * @return file handle, -1 on error + */ +int GNUNET_DISK_file_open (const char *filename, int oflag, ...); + + +/** + * Wrapper around "close()". Closes a file. + */ +void GNUNET_DISK_file_close (const char *filename, int fd); + + +/** + * Read the contents of a binary file into a buffer. + * @param fileName the name of the file, not freed, + * must already be expanded! + * @param len the maximum number of bytes to read + * @param result the buffer to write the result to + * @return the number of bytes read on success, -1 on failure + */ +int GNUNET_DISK_file_read (const char *fileName, int len, void *result); + + +/** + * Write a buffer to a file. + * @param fileName the name of the file, NOT freed! + * @param buffer the data to write + * @param n number of bytes to write + * @param mode the mode for file permissions + * @return GNUNET_OK on success, GNUNET_SYSERR on error + */ +int GNUNET_DISK_file_write (const char *fileName, + const void *buffer, unsigned int n, + const char *mode); + + +/** + * Copy a file. + * @return GNUNET_OK on success, GNUNET_SYSERR on error + */ +int GNUNET_DISK_file_copy (const char *src, const char *dst); + + +/** + * Scan a directory for files. The name of the directory + * must be expanded first (!). + * + * @param dirName the name of the directory + * @param callback the method to call for each file + * @param data argument to pass to callback + * @return the number of files found, -1 on error + */ +int GNUNET_DISK_directory_scan (const char *dirName, + GNUNET_FileNameCallback callback, void *data); + + +/** + * Opaque handle used for iterating over a directory. + */ +struct GNUNET_DISK_DirectoryIterator; + + +/** + * Function called to iterate over a directory. + * + * @param cls closure + * @param di argument to pass to "GNUNET_DISK_directory_iterator_next" to + * get called on the next entry (or finish cleanly) + * @param filename complete filename (absolute path) + * @param dirname directory name (absolute path) + */ +typedef void (*GNUNET_DISK_DirectoryIteratorCallback) (void *cls, + struct + GNUNET_DISK_DirectoryIterator + * di, + const char *filename, + const char *dirname); + + +/** + * This function must be called during the DiskIteratorCallback + * (exactly once) to schedule the task to process the next + * filename in the directory (if there is one). + * + * @param iter opaque handle for the iterator + * @param can set to GNUNET_YES to terminate the iteration early + * @return GNUNET_YES if iteration will continue, + * GNUNET_NO if this was the last entry (and iteration is complete), + * GNUNET_SYSERR if "can" was YES + */ +int GNUNET_DISK_directory_iterator_next (struct GNUNET_DISK_DirectoryIterator + *iter, int can); + + +/** + * Scan a directory for files using the scheduler to run a task for + * each entry. The name of the directory must be expanded first (!). + * If a scheduler does not need to be used, GNUNET_DISK_directory_scan + * may provide a simpler API. + * + * @param sched scheduler to use + * @param prio priority to use + * @param dirName the name of the directory + * @param callback the method to call for each file + * @param callback_cls closure for callback + */ +void GNUNET_DISK_directory_iterator_start (struct GNUNET_SCHEDULER_Handle + *sched, + enum GNUNET_SCHEDULER_Priority + prio, const char *dirName, + GNUNET_DISK_DirectoryIteratorCallback + callback, void *callback_cls); + + +/** + * Create the directory structure for storing + * a file. + * + * @param filename name of a file in the directory + * @returns GNUNET_OK on success, GNUNET_SYSERR on failure, + * GNUNET_NO if directory exists but is not writeable + */ +int GNUNET_DISK_directory_create_for_file (const char *filename); + + +/** + * Test if fil is a directory that can be accessed. + * Will not print an error message if the directory + * does not exist. Will log errors if GNUNET_SYSERR is + * returned. + * + * @return GNUNET_YES if yes, GNUNET_NO if does not exist, GNUNET_SYSERR + * on any error and if exists but not directory + */ +int GNUNET_DISK_directory_test (const char *fil); + + +/** + * Remove all files in a directory (rm -rf). Call with + * caution. + * + * @param fileName the file to remove + * @return GNUNET_OK on success, GNUNET_SYSERR on error + */ +int GNUNET_DISK_directory_remove (const char *fileName); + + +/** + * Implementation of "mkdir -p" + * + * @param dir the directory to create + * @returns GNUNET_SYSERR on failure, GNUNET_OK otherwise + */ +int GNUNET_DISK_directory_create (const char *dir); + + +/** + * @brief Removes special characters as ':' from a filename. + * @param fn the filename to canonicalize + */ +void GNUNET_DISK_filename_canonicalize (char *fn); + + +/** + * @brief Change owner of a file + * @param filename file to change + * @param user new owner of the file + * @return GNUNET_OK on success, GNUNET_SYSERR on failure + */ +int GNUNET_DISK_file_change_owner (const char *filename, const char *user); + + +/** + * Construct full path to a file inside of the private + * directory used by GNUnet. Also creates the corresponding + * directory. If the resulting name is supposed to be + * a directory, end the last argument in '/' (or pass + * DIR_SEPARATOR_STR as the last argument before NULL). + * + * @param serviceName name of the service asking + * @param varargs is NULL-terminated list of + * path components to append to the + * private directory name. + * @return the constructed filename + */ +char *GNUNET_DISK_get_home_filename (struct GNUNET_CONFIGURATION_Handle *cfg, + const char *serviceName, ...); + +#if 0 /* keep Emacsens' auto-indent happy */ +{ +#endif +#ifdef __cplusplus +} +#endif + + +/* ifndef GNUNET_DISK_LIB_H */ +#endif +/* end of gnunet_disk_lib.h */ -- cgit v1.2.3