// // Copyright 2018 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // // This software is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this // file was obtained (LICENSE.txt). A copy of the license may also be // found online at https://opensource.org/licenses/MIT. // #ifndef CORE_FILE_H #define CORE_FILE_H // File/Store Support // // Some transports require a persistent storage for things like configs, // key material, etc. Generally, these are all going to be relatively // small objects (such as certificates), so we only require a synchronous // implementation from platforms. We provide a very limited and simple // file API for these purposes; basic CRUD operations only, plus a way // to iterate over names. These are adequate for NNG's internal uses; // applications should use normal platform-specific APIs or those in the // standard C library. // nni_file_put writes the named file, with the provided data, // and the given size. If the file already exists it is overwritten. // The permissions on the file will allow the application to read and // write the file, but may (should) restrict anything else beyond that // where they can. If the name contains platform specific directory // separators, then any missing parent directories will be created if // possible. extern int nni_file_put(const char *, const void *, size_t); // nni_plat_file_get reads the entire named file, allocating storage // to receive the data and returning the data and the size in the // reference arguments. The data pointer should be freed with nni_free // using the supplied size when no longer needed. extern int nni_file_get(const char *, void **, size_t *); // nni_file_delete deletes the named file. extern int nni_file_delete(const char *); enum nni_file_type_val { NNI_FILE_TYPE_FILE, NNI_FILE_TYPE_DIR, NNI_FILE_TYPE_OTHER, }; // nni_file_exists checks if the named file exists. extern int nni_file_type(const char *, int *); // nni_file_walk walks a list of files. enum nni_file_walk_result { NNI_FILE_WALK_CONTINUE, NNI_FILE_WALK_STOP, NNI_FILE_WALK_PRUNE_SIB, NNI_FILE_WALK_PRUNE_CHILD, }; enum nni_file_walk_flags { NNI_FILE_WALK_DEPTH_FIRST = 0, // get children first NNI_FILE_WALK_BREADTH_FIRST = 1, // get siblings first (later) NNI_FILE_WALK_SHALLOW = 2, // do not descend into subdirectories NNI_FILE_WALK_FILES_ONLY = 4, // directory names are not reported }; typedef int (*nni_file_walker)(const char *, void *); extern int nni_file_walk(const char *, nni_file_walker, void *, int); // nni_file_join joins two path components to make a path name. // For example. on UNIX systems nni_file_join("/tmp", "a") returns // "/tmp/a". The pathname returned should be freed with nni_strfree(). extern char *nni_file_join(const char *, const char *); // nni_file_basename returns the "file" name, without the parent directory. // The returned value generally is within the supplied path name. extern const char *nni_file_basename(const char *); // nni_file_is_file returns true if the path references a file. It returns // false if an error occurs, or the path references something else. extern bool nni_file_is_file(const char *); // nni_file_is_dir returns true if the path references a directroy. It returns // false if an error occurs, or the path references something else. extern bool nni_file_is_dir(const char *); typedef struct nni_file_lockh nni_file_lockh; extern int nni_file_lock(const char *, nni_file_lockh **); extern void nni_file_unlock(nni_file_lockh *); #endif // CORE_FILE_H