+#define _GNU_SOURCE
+
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/ioctl.h>
#include "parser.h"
+#include "paths.h"
#include "petitboot-paths.h"
/* Define below to operate without the frontend */
#endif
}
-int mount_device(const char *dev_path, char *mount_path)
+int mount_device(const char *dev_path)
{
- char *dir;
- const char *basename;
+ const char *dir;
int pid, status, rc = -1;
+ struct stat statbuf;
- basename = strrchr(dev_path, '/');
- if (basename)
- basename++;
- else
- basename = dev_path;
-
- /* create a unique mountpoint */
- dir = malloc(strlen(TMP_DIR) + 13 + strlen(basename));
- sprintf(dir, "%s/mnt-%s-XXXXXX", TMP_DIR, basename);
-
- if (!mkdtemp(dir)) {
- pb_log("failed to create temporary directory in %s: %s",
- TMP_DIR, strerror(errno));
- goto out;
+ dir = mountpoint_for_device(dev_path);
+
+ if (stat(dir, &statbuf)) {
+ if (mkdir(dir, 0755)) {
+ pb_log("couldn't create directory %s: %s\n",
+ dir, strerror(errno));
+ goto out;
+ }
+ } else {
+ if (!S_ISDIR(statbuf.st_mode)) {
+ pb_log("mountpoint %s exists, "
+ "but isn't a directory\n", dir);
+ goto out;
+ }
}
+
pid = fork();
if (pid == -1) {
pb_log("%s: fork failed: %s\n", __FUNCTION__, strerror(errno));
goto out;
}
- if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
- strcpy(mount_path, dir);
+ if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
rc = 0;
- }
out:
- free(dir);
return rc;
}
static int found_new_device(const char *dev_path)
{
- char mountpoint[PATH_MAX];
+ const char *mountpoint = mountpoint_for_device(dev_path);
- if (mount_device(dev_path, mountpoint)) {
+ if (mount_device(dev_path)) {
pb_log("failed to mount %s\n", dev_path);
return EXIT_FAILURE;
}
action = getenv("ACTION");
- logf = fopen("/var/tmp/petitboot-udev-helpers.log", "a");
+ logf = fopen("/var/log/petitboot-udev-helpers.log", "a");
if (!logf)
logf = stdout;
pb_log("%d started\n", getpid());
return EXIT_FAILURE;
}
+ set_mount_base(TMP_DIR);
+
if (connect_to_socket())
return EXIT_FAILURE;