summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e19e6cd)
- Use absolute path for directory name instead of base name. This avoids issues
with multiple directories with the same name, with trailing slashes on the
directory name, and with symbolic links.
- Substitute slashes in the directory path with character 0xff to form a valid
message queue name and avoid possible conflicts with real pathnames.
- Truncate the message queue name if it comes out to more than NAME_MAX bytes.
#include "xml.h"
#include "io.h"
#include "timestamp.h"
#include "xml.h"
#include "io.h"
#include "timestamp.h"
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
-/* Simple function that returns the concatenation of 4 strings. */
-static char *strcat_dup(const char *s1, const char *s2, const char *s3,
- const char *s4)
+/* Simple function that returns the concatenation of 2 strings. */
+static char *strcat_dup(const char *s1, const char *s2, size_t max_len)
- size_t len = strlen(s1) + strlen(s2) + strlen(s3) + strlen(s4) + 1;
- char *p = MALLOC(len);
+ size_t len = strlen(s1) + strlen(s2);
+ if (len > max_len)
+ len = max_len;
+ char *p = MALLOC(len + 1);
- p = strcpy(p, s1);
- p = strcat(p, s2);
- p = strcat(p, s3);
- return strcat(p, s4);
+ snprintf(p, len + 1, "%s%s", s1, s2);
+ return p;
-/* Removes trailing forward slashes in a string. */
-static void remove_trailing_slashes(char *s)
+static int set_message_queue_names(struct wimfs_context *ctx,
+ const char *mount_dir)
- long len = strlen(s);
- for (long i = len - 1; i >= 1; i--) {
- if (s[i] == '/')
- s[i] = '\0';
- else
- break;
- }
-}
+ static const char *u2d_prefix = "/wimlib-unmount-to-daemon-mq";
+ static const char *d2u_prefix = "/wimlib-daemon-to-unmount-mq";
+ char *dir_path;
+ char *p;
+ int ret;
-/* Changes forward slashes to underscores in a string. */
-static void s_slashes_underscores_g(char *s)
-{
- while (*s) {
- if (*s == '/')
- *s = '_';
- s++;
+ dir_path = realpath(mount_dir, NULL);
+ if (!dir_path) {
+ ERROR_WITH_ERRNO("Failed to resolve path \"%s\"", mount_dir);
+ return WIMLIB_ERR_NOTDIR;
-static int set_message_queue_names(struct wimfs_context *ctx,
- const char *mount_dir)
-{
- static const char *slash = "/";
- static const char *prefix = "wimlib-";
- static const char *u2d_suffix = "unmount-to-daemon-mq";
- static const char *d2u_suffix = "daemon-to-unmount-mq";
+ DEBUG("Using absolute dir_path = `%s'", dir_path);
- const char *mount_dir_basename = path_basename(mount_dir);
- ctx->unmount_to_daemon_mq_name = strcat_dup(slash, mount_dir_basename,
- prefix, u2d_suffix);
+ p = dir_path;
+ while (*p) {
+ if (*p == '/')
+ *p = 0xff;
+ p++;
+ }
+
+ ctx->unmount_to_daemon_mq_name = strcat_dup(u2d_prefix, dir_path,
+ NAME_MAX);
if (!ctx->unmount_to_daemon_mq_name) {
if (!ctx->unmount_to_daemon_mq_name) {
- ERROR("Out of memory");
- return WIMLIB_ERR_NOMEM;
+ ret = WIMLIB_ERR_NOMEM;
+ goto out_free_dir_path;
- ctx->daemon_to_unmount_mq_name = strcat_dup(slash, mount_dir_basename,
- prefix, d2u_suffix);
+ ctx->daemon_to_unmount_mq_name = strcat_dup(d2u_prefix, dir_path,
+ NAME_MAX);
if (!ctx->daemon_to_unmount_mq_name) {
if (!ctx->daemon_to_unmount_mq_name) {
- ERROR("Out of memory");
- FREE(ctx->unmount_to_daemon_mq_name);
- ctx->unmount_to_daemon_mq_name = NULL;
- return WIMLIB_ERR_NOMEM;
+ ret = WIMLIB_ERR_NOMEM;
+ goto out_free_unmount_to_daemon_mq_name;
- remove_trailing_slashes(ctx->unmount_to_daemon_mq_name);
- remove_trailing_slashes(ctx->daemon_to_unmount_mq_name);
- s_slashes_underscores_g(ctx->unmount_to_daemon_mq_name + 1);
- s_slashes_underscores_g(ctx->daemon_to_unmount_mq_name + 1);
- return 0;
+ ret = 0;
+ goto out_free_dir_path;
+out_free_unmount_to_daemon_mq_name:
+ FREE(ctx->unmount_to_daemon_mq_name);
+ ctx->unmount_to_daemon_mq_name = NULL;
+out_free_dir_path:
+ FREE(dir_path);
+ return ret;
}
static void free_message_queue_names(struct wimfs_context *ctx)
}
static void free_message_queue_names(struct wimfs_context *ctx)
else
flags = O_WRONLY | O_CREAT;
else
flags = O_WRONLY | O_CREAT;
+ DEBUG("Opening message queue \"%s\"", ctx->unmount_to_daemon_mq_name);
ctx->unmount_to_daemon_mq = mq_open(ctx->unmount_to_daemon_mq_name,
flags, 0700, NULL);
ctx->unmount_to_daemon_mq = mq_open(ctx->unmount_to_daemon_mq_name,
flags, 0700, NULL);
else
flags = O_RDONLY | O_CREAT;
else
flags = O_RDONLY | O_CREAT;
+ DEBUG("Opening message queue \"%s\"", ctx->daemon_to_unmount_mq_name);
ctx->daemon_to_unmount_mq = mq_open(ctx->daemon_to_unmount_mq_name,
flags, 0700, NULL);
ctx->daemon_to_unmount_mq = mq_open(ctx->daemon_to_unmount_mq_name,
flags, 0700, NULL);
ctx.wim = wim;
ctx.mount_flags = flags;
ctx.wim = wim;
ctx.mount_flags = flags;
+ DEBUG("Calling fuse_main()");
+
ret = fuse_main(argc, argv, &wimfs_operations, &ctx);
ret = fuse_main(argc, argv, &wimfs_operations, &ctx);
+
+ DEBUG("Returned from fuse_main() (ret = %d)", ret);
if (ret)
ret = WIMLIB_ERR_FUSE;
out_free_dir_copy:
if (ret)
ret = WIMLIB_ERR_FUSE;
out_free_dir_copy: