static struct pakfire_cgroup* pakfire_cgroup_parent(struct pakfire_cgroup* cgroup) {
struct pakfire_cgroup* parent = NULL;
+ char path[PATH_MAX];
int r;
// Cannot return parent for root group
return NULL;
// Determine the path of the parent
- const char* path = pakfire_dirname(cgroup->path);
- if (!path) {
+ r = pakfire_dirname(path, cgroup->path);
+ if (r) {
ERROR(cgroup->pakfire, "Could not determine path for parent cgroup: %m\n");
return NULL;
}
// dirname() returns . if no directory component could be found
if (strcmp(path, ".") == 0)
- path = NULL;
+ *path = '\0';
// Open the cgroup
r = pakfire_cgroup_open(&parent, cgroup->pakfire, path, 0);
static int pakfire_makefile_set_defaults(struct pakfire* pakfire,
struct pakfire_parser* parser, const char* path) {
+ char dirname[PATH_MAX];
char buffer[1024];
int r;
}
// Set BASEDIR
- const char* dirname = pakfire_dirname(path);
- if (dirname) {
+ r = pakfire_dirname(dirname, path);
+ if (r)
+ return r;
+
+ if (*dirname) {
const char* root = pakfire_get_path(pakfire);
pakfire_parser_set(parser, NULL, "BASEDIR",
return r;
}
-static const char* pakfire_dist_find_root(struct pakfire* pakfire, const char* file) {
+#define pakfire_dist_find_root(root, file) \
+ __pakfire_dist_find_root(root, sizeof(root), file)
+
+static int __pakfire_dist_find_root(char* root, const size_t length, const char* file) {
char path[PATH_MAX];
// Find the absolute path of the makefile
char* p = realpath(file, path);
- if (!p) {
- ERROR(pakfire, "realpath(%s) failed: %m\n", file);
- return NULL;
- }
+ if (!p)
+ return -errno;
// Return the parent directory
- return pakfire_dirname(p);
+ return __pakfire_dirname(root, length, p);
}
static int pakfire_dist_add_files(struct pakfire* pakfire,
struct pakfire_packager* packager, const char* file) {
struct pakfire_filelist* filelist = NULL;
- int r = 1;
+ char root[PATH_MAX];
+ int r;
// Find the package directory
- const char* root = pakfire_dist_find_root(pakfire, file);
- if (!root)
- return 1;
+ r = pakfire_dist_find_root(root, file);
+ if (r) {
+ ERROR_ERRNO(pakfire, r, "Could not find package root directory: %m\n");
+ return r;
+ }
DEBUG(pakfire, "Adding all files in '%s' to package...\n", root);
const size_t expected_digest_length,
enum pakfire_transfer_flags flags) {
struct pakfire_config* config = NULL;
+ char filename[PATH_MAX];
+ int r;
DEBUG(downloader->pakfire, "Adding download of %s\n", url);
// Or use the filename
} else {
- const char* filename = pakfire_basename(url);
- if (filename)
+ r = pakfire_basename(filename, url);
+ if (r)
+ goto ERROR;
+
+ if (*filename)
pakfire_string_set(transfer->title, filename);
}
__pakfire_path_replace_extension(path, sizeof(path), extension)
int __pakfire_path_replace_extension(char* path, const size_t length, const char* extension);
-const char* pakfire_basename(const char* path);
-const char* pakfire_dirname(const char* path);
+#define pakfire_basename(basename, path) \
+ __pakfire_basename(basename, sizeof(basename), path)
+int __pakfire_basename(char* basename, const size_t length, const char* path);
+
+#define pakfire_dirname(dirname, path) \
+ __pakfire_dirname(dirname, sizeof(dirname), path)
+int __pakfire_dirname(char* dirname, const size_t length, const char* path);
char* pakfire_remove_trailing_newline(char* str);
}
// Determine the basename of the file
- r = pakfire_string_set(basename, pakfire_basename(path));
+ r = pakfire_basename(basename, path);
if (r)
return r;
PAKFIRE_EXPORT int pakfire_package_set_string(
struct pakfire_package* pkg, const enum pakfire_package_key key, const char* value) {
+ char basename[PATH_MAX];
+ char dirname[PATH_MAX];
Id id = ID_NULL;
+ int r;
Pool* pool = pakfire_get_solv_pool(pkg->pakfire);
Solvable* s = get_solvable(pkg);
- const char* basename = NULL;
- const char* dirname = NULL;
-
switch (key) {
// Do not allow to change name, evr, or arch
case PAKFIRE_PKG_NAME:
case PAKFIRE_PKG_PATH:
if (value) {
- basename = pakfire_basename(value);
- dirname = pakfire_dirname(value);
+ r = pakfire_basename(basename, value);
+ if (r)
+ return r;
+
+ r = pakfire_dirname(dirname, value);
+ if (r)
+ return r;
}
- if (basename)
+ if (*basename)
solvable_set_str(s, SOLVABLE_MEDIAFILE, basename);
else
solvable_unset(s, SOLVABLE_MEDIAFILE);
- if (dirname)
+ if (*dirname)
solvable_set_str(s, SOLVABLE_MEDIADIR, dirname);
else
solvable_unset(s, SOLVABLE_MEDIADIR);
}
int pakfire_package_append_file(struct pakfire_package* pkg, const char* path) {
+ char basename[PATH_MAX];
+ char dirname[PATH_MAX];
+ int r;
+
// Fetch repodata
struct pakfire_repo* repo = pakfire_package_get_repo(pkg);
if (!repo) {
Repodata* repodata = pakfire_repo_get_repodata(repo);
- const char* basename = pakfire_basename(path);
- const char* dirname = pakfire_dirname(path);
+ // Get filename part
+ r = pakfire_basename(basename, path);
+ if (r)
+ return r;
+
+ // Get directory part
+ r = pakfire_dirname(dirname, path);
+ if (r)
+ return r;
// Convert directory into ID
Id did = repodata_str2dir(repodata, dirname, 1);
return r;
}
-const char* pakfire_basename(const char* path) {
- static char buffer[PATH_MAX];
+int __pakfire_basename(char* __basename, const size_t length, const char* path) {
+ char buffer[PATH_MAX];
int r;
- // Copy string
+ // Copy the path into the buffer
r = pakfire_string_set(buffer, path);
if (r)
- return NULL;
+ return r;
+
+ // Run basename()
+ char* p = basename(buffer);
+ if (!p)
+ return -errno;
- return basename(buffer);
+ return __pakfire_string_set(__basename, length, p);
}
-const char* pakfire_dirname(const char* path) {
- static char buffer[PATH_MAX];
+int __pakfire_dirname(char* __dirname, const size_t length, const char* path) {
+ char buffer[PATH_MAX];
int r;
- // Copy string
+ // Copy the path into the buffer
r = pakfire_string_set(buffer, path);
if (r)
- return NULL;
+ return r;
- return dirname(buffer);
+ // Run dirname()
+ char* p = dirname(buffer);
+ if (!p)
+ return -errno;
+
+ return __pakfire_string_set(__dirname, length, p);
}
char* pakfire_remove_trailing_newline(char* str) {
}
int pakfire_mkparentdir(const char* path, mode_t mode) {
- const char* dirname = pakfire_dirname(path);
- if (!dirname)
- return 1;
+ char dirname[PATH_MAX];
+ int r;
+
+ r = pakfire_dirname(dirname, path);
+ if (r)
+ return r;
+
+ if (!*dirname)
+ return 0;
return pakfire_mkdir(dirname, mode);
}
#include "../testsuite.h"
static int test_basename(const struct test* t) {
+ char basename[PATH_MAX];
const char* dir = "/a/b/c";
- ASSERT_STRING_EQUALS(pakfire_basename(dir), "c");
+ ASSERT_SUCCESS(pakfire_basename(basename, dir));
+ ASSERT_STRING_EQUALS(basename, "c");
return EXIT_SUCCESS;
}
static int test_dirname(const struct test* t) {
+ char dirname[PATH_MAX];
const char* dir = "/a/b/c";
- ASSERT_STRING_EQUALS(pakfire_dirname(dir), "/a/b");
+ ASSERT_SUCCESS(pakfire_dirname(dirname, dir));
+ ASSERT_STRING_EQUALS(dirname, "/a/b");
return EXIT_SUCCESS;