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/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* @file util/disk.c
* @return the new position on success, #GNUNET_SYSERR otherwise
*/
off_t
-GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle * h, off_t offset,
+GNUNET_DISK_file_seek (const struct GNUNET_DISK_FileHandle *h,
+ off_t offset,
enum GNUNET_DISK_Seek whence)
{
if (h == NULL)
* does not exist or stat'ed
*/
int
-GNUNET_DISK_directory_test (const char *fil, int is_readable)
+GNUNET_DISK_directory_test (const char *fil,
+ int is_readable)
{
struct stat filestat;
int ret;
}
if (!S_ISDIR (filestat.st_mode))
{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
+ LOG (GNUNET_ERROR_TYPE_INFO,
"A file already exits with the same name %s\n", fil);
return GNUNET_NO;
}
rdir = GNUNET_STRINGS_filename_expand (dir);
if (rdir == NULL)
+ {
+ GNUNET_break (0);
return GNUNET_SYSERR;
+ }
len = strlen (rdir);
#ifndef MINGW
ret = GNUNET_DISK_directory_test (rdir, GNUNET_NO);
if (GNUNET_NO == ret)
{
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Creating directory `%s' failed",
+ rdir);
GNUNET_free (rdir);
return GNUNET_SYSERR;
}
ret = GNUNET_DISK_directory_test (rdir, GNUNET_NO);
if (GNUNET_NO == ret)
{
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Creating directory `%s' failed",
+ rdir);
GNUNET_free (rdir);
return GNUNET_SYSERR;
}
errno = EINVAL;
return GNUNET_SYSERR;
}
+ if (0 == ACCESS (rdir, W_OK))
+ {
+ GNUNET_free (rdir);
+ return GNUNET_OK;
+ }
+
len = strlen (rdir);
while ((len > 0) && (rdir[len] != DIR_SEPARATOR))
len--;
*/
ssize_t
GNUNET_DISK_file_write (const struct GNUNET_DISK_FileHandle * h,
- const void *buffer, size_t n)
+ const void *buffer,
+ size_t n)
{
if (NULL == h)
{
return NULL;
}
if (flags & GNUNET_DISK_OPEN_FAILIFEXISTS)
- oflags |= (O_CREAT | O_EXCL);
+ oflags |= (O_CREAT | O_EXCL);
if (flags & GNUNET_DISK_OPEN_TRUNCATE)
oflags |= O_TRUNC;
if (flags & GNUNET_DISK_OPEN_APPEND)
oflags |= O_APPEND;
- if (flags & GNUNET_DISK_OPEN_CREATE)
- {
- (void) GNUNET_DISK_directory_create_for_file (expfn);
- oflags |= O_CREAT;
- mode = translate_unix_perms (perm);
+ if(GNUNET_NO == GNUNET_DISK_file_test(fn))
+ {
+ if (flags & GNUNET_DISK_OPEN_CREATE )
+ {
+ (void) GNUNET_DISK_directory_create_for_file (expfn);
+ oflags |= O_CREAT;
+ mode = translate_unix_perms (perm);
+ }
}
fd = open (expfn, oflags
/**
- * Remove the directory given under @a option in
- * section [PATHS] in configuration under @a cfg_filename
+ * Helper function for #GNUNET_DISK_purge_cfg_dir.
*
- * @param cfg_filename configuration file to parse
- * @param option option with the dir name to purge
+ * @param cls a `const char *` with the option to purge
+ * @param cfg our configuration
+ * @return #GNUNET_OK on success
*/
-void
-GNUNET_DISK_purge_cfg_dir (const char *cfg_filename,
- const char *option)
+static int
+purge_cfg_dir (void *cls,
+ const struct GNUNET_CONFIGURATION_Handle *cfg)
{
- struct GNUNET_CONFIGURATION_Handle *cfg;
+ const char *option = cls;
char *tmpname;
- cfg = GNUNET_CONFIGURATION_create ();
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_load (cfg,
- cfg_filename))
- {
- GNUNET_break (0);
- GNUNET_CONFIGURATION_destroy (cfg);
- return;
- }
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_filename (cfg,
"PATHS",
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"PATHS",
option);
- GNUNET_CONFIGURATION_destroy (cfg);
- return;
+ return GNUNET_NO;
}
- GNUNET_CONFIGURATION_destroy (cfg);
if (GNUNET_SYSERR ==
GNUNET_DISK_directory_remove (tmpname))
{
"remove",
tmpname);
GNUNET_free (tmpname);
- return;
+ return GNUNET_OK;
}
GNUNET_free (tmpname);
+ return GNUNET_OK;
}
+/**
+ * Remove the directory given under @a option in
+ * section [PATHS] in configuration under @a cfg_filename
+ *
+ * @param cfg_filename configuration file to parse
+ * @param option option with the dir name to purge
+ */
+void
+GNUNET_DISK_purge_cfg_dir (const char *cfg_filename,
+ const char *option)
+{
+ GNUNET_break (GNUNET_OK ==
+ GNUNET_CONFIGURATION_parse_and_run (cfg_filename,
+ &purge_cfg_dir,
+ (void *) option));
+}
+
/* end of disk.c */