/* * This file is part of libbluray * Copyright (C) 2014 Petri Hintukainen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #if HAVE_CONFIG_H #include "config.h" #endif #include "file.h" #include "util/logging.h" #include "util/macro.h" #include "util/strutl.h" #include // SEEK_* #include // strchr int64_t file_size(BD_FILE_H *fp) { int64_t pos = file_tell(fp); int64_t res1 = file_seek(fp, 0, SEEK_END); int64_t length = file_tell(fp); int64_t res2 = file_seek(fp, pos, SEEK_SET); if (res1 < 0 || res2 < 0 || pos < 0 || length < 0) { return -1; } return length; } int file_mkdirs(const char *path) { int result = 0; char *dir = str_dup(path); char *end = dir; char *p; if (!dir) { return -1; } /* strip file name */ if (!(end = strrchr(end, DIR_SEP_CHAR))) { X_FREE(dir); return -1; } *end = 0; /* tokenize, stop to first existing dir */ while ((p = strrchr(dir, DIR_SEP_CHAR))) { if (!file_path_exists(dir)) { break; } *p = 0; } /* create missing dirs */ p = dir; while (p < end) { /* concatenate next non-existing dir */ while (*p) p++; if (p >= end) break; *p = DIR_SEP_CHAR; result = file_mkdir(dir); if (result < 0) { BD_DEBUG(DBG_FILE | DBG_CRIT, "Error creating directory %s\n", dir); break; } BD_DEBUG(DBG_FILE, " created directory %s\n", dir); } X_FREE(dir); return result; }