summaryrefslogtreecommitdiff
path: root/src/volumesfs.c
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2017-07-16 17:24:34 +0200
committerJavier <dev.git@javispedro.com>2017-07-16 17:24:34 +0200
commit54e7d8476ca3b41cbb38226e58241e1920ad357a (patch)
tree0cb38942404ac0d8b3529f7c93958065edc1a4f8 /src/volumesfs.c
parent48cf22d3af28386ad853c30d3e389570e3cdca6e (diff)
downloadvolumefs-54e7d8476ca3b41cbb38226e58241e1920ad357a.tar.gz
volumefs-54e7d8476ca3b41cbb38226e58241e1920ad357a.zip
rename to volumefs/userfs and add systemd unit files
Diffstat (limited to 'src/volumesfs.c')
-rw-r--r--src/volumesfs.c174
1 files changed, 0 insertions, 174 deletions
diff --git a/src/volumesfs.c b/src/volumesfs.c
deleted file mode 100644
index acf991b..0000000
--- a/src/volumesfs.c
+++ /dev/null
@@ -1,174 +0,0 @@
-#define FUSE_USE_VERSION 30
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include <fuse.h>
-
-#include <udisks/udisks.h>
-
-static GMainLoop *main_loop;
-static GThread *sub_thread;
-static UDisksClient *client;
-
-static GHashTable *mounts;
-G_LOCK_DEFINE_STATIC(mounts);
-
-static void udisks_changed(UDisksClient *client, gpointer user_data)
-{
- GDBusObjectManager *manager = udisks_client_get_object_manager(client);
- GList *objs = g_dbus_object_manager_get_objects(manager);
-
- G_LOCK(mounts);
-
- g_debug("udisks changed");
-
- g_hash_table_remove_all(mounts);
-
- for (GList *l = objs; l; l = g_list_next(l)) {
- UDisksObject *obj = UDISKS_OBJECT(l->data);
- UDisksFilesystem *filesys = udisks_object_get_filesystem(obj);
- UDisksBlock *block = udisks_object_get_block(obj);
- if (block && filesys) {
- const gchar *name = udisks_block_get_id_label(block);
- if (!name || strlen(name) == 0) {
- name = udisks_block_get_id_uuid(block);
- }
-
- const gchar * const * mpoints = udisks_filesystem_get_mount_points(filesys);
- const gchar * mountpoint = mpoints && mpoints[0] ? mpoints[0] : NULL;
-
- if (name && mountpoint) {
- g_debug("%s -> %s", name, mountpoint);
- g_hash_table_insert(mounts, g_strdup(name), g_strdup(mountpoint));
- }
- }
- if (filesys) g_object_unref(filesys);
- if (block) g_object_unref(block);
- }
-
- G_UNLOCK(mounts);
-
- g_list_free_full(objs, g_object_unref);
-}
-
-static gpointer sub_thread_main(gpointer user_data)
-{
- GError *error = NULL;
-
- client = udisks_client_new_sync(NULL, &error);
- if (!client) {
- g_printerr("Could not connect to UDisks2 service: %s", error->message);
- g_error_free(error);
- }
-
- g_signal_connect(client, "changed",
- G_CALLBACK(udisks_changed), NULL);
-
- udisks_changed(client, NULL);
-
- g_main_loop_run(main_loop);
-
- return NULL;
-}
-
-static void * volumesfs_init(struct fuse_conn_info *conn)
-{
- main_loop = g_main_loop_new(NULL, FALSE);
-
- mounts = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
-
- sub_thread = g_thread_new("volumesfs-sub-thread", sub_thread_main, NULL);
-
- return NULL;
-}
-
-static void volumesfs_destroy(void *user_data)
-{
- g_main_loop_quit(main_loop);
-
- g_thread_join(sub_thread);
-
- g_object_unref(client);
- g_hash_table_destroy(mounts);
- g_object_unref(main_loop);
-}
-
-static int volumesfs_getattr(const char *path, struct stat *stbuf)
-{
- if (strcmp(path, "/") == 0) {
- stbuf->st_mode = S_IFDIR | 0755;
- stbuf->st_nlink = 2;
- } else {
- G_LOCK(mounts);
- const gchar *mountpoint = g_hash_table_lookup(mounts, path + 1);
- G_UNLOCK(mounts);
- if (mountpoint) {
- stbuf->st_mode = S_IFLNK | 0444;
- stbuf->st_nlink = 1;
- } else {
- return -ENOENT;
- }
- }
- return 0;
-}
-
-static int volumesfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
- off_t offset, struct fuse_file_info *fi)
-{
- if (strcmp(path, "/") != 0) {
- return -ENOENT;
- }
-
- G_LOCK(mounts);
-
- (void) offset;
- (void) fi;
-
- filler(buf, ".", NULL, 0);
- filler(buf, "..", NULL, 0);
-
- GHashTableIter iter;
- gchar *name;
- g_hash_table_iter_init(&iter, mounts);
- while (g_hash_table_iter_next(&iter, (void**)&name, NULL)) {
- filler(buf, name, NULL, 0);
- }
-
- G_UNLOCK(mounts);
-
- return 0;
-}
-
-static int volumesfs_readlink(const char *path, char *buf, size_t size)
-{
- if (strcmp(path, "/") == 0) {
- return -EINVAL;
- }
-
- G_LOCK(mounts);
- gchar *mountpoint = g_hash_table_lookup(mounts, path + 1);
- G_UNLOCK(mounts);
-
- if (mountpoint) {
- strcpy(buf, mountpoint);
- return 0;
- } else {
- return -ENOENT;
- }
-}
-
-static struct fuse_operations volumesfs_oper = {
- .init = volumesfs_init,
- .destroy = volumesfs_destroy,
- .getattr = volumesfs_getattr,
- .readdir = volumesfs_readdir,
- .readlink = volumesfs_readlink
-};
-
-int main(int argc, char *argv[])
-{
- return fuse_main(argc, argv, &volumesfs_oper, NULL);
-}