src/hello.c
author Tero Marttila <terom@fixme.fi>
Thu, 25 Sep 2008 22:52:40 +0300
changeset 4 194888fc1055
parent 3 10b53719659c
child 5 dc86636257c2
permissions -rw-r--r--
working 'Hello World' fuse fs
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
     1
#include <string.h>
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
     2
#include <errno.h>
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
     3
#include <stdlib.h>
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
     4
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <event2/event.h>
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include <fuse/fuse_opt.h>
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include "lib/common.h"
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
     9
#include "lib/math.h"
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    10
#include "lib/signals.h"
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
#include "evfuse.h"
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    13
const char *file_name = "hello";
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    14
const char *file_data = "Hello World\n";
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    15
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    16
static struct hello {
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    struct event_base *ev_base;
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    19
    struct signals *signals;
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    20
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    struct evfuse *ev_fuse;
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    22
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
} ctx;
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
void hello_init (void *userdata, struct fuse_conn_info *conn) {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    INFO("[hello.init] userdata=%p, conn=%p", userdata, conn);
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
}
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
void hello_destroy (void *userdata) {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    INFO("[hello.destroy] userdata=%p", userdata);
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
}
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    33
void hello_lookup (fuse_req_t req, fuse_ino_t parent, const char *name) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    34
    struct fuse_entry_param e;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    35
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    36
    INFO("[hello.lookup] (uid=%d, pid=%d) parent=%lu name=%s", fuse_req_ctx(req)->uid, fuse_req_ctx(req)->pid, parent, name);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    37
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    38
    // the world is flat
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    39
    if (parent != 1 || strcmp(name, file_name)) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    40
        fuse_reply_err(req, ENOENT);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    41
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    42
        return;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    43
    }
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    44
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    45
    // set up the entry
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    46
    memset(&e, 0, sizeof(e));
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    47
    e.ino = 2;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    48
    e.attr_timeout = 1.0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    49
    e.entry_timeout = 1.0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    50
    e.attr.st_mode = S_IFREG | 0444;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    51
    e.attr.st_nlink = 1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    52
    e.attr.st_size = strlen(file_data);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    53
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    54
    // reply
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    55
    fuse_reply_entry(req, &e);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    56
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    57
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    58
void hello_getattr (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    59
    struct stat stbuf;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    60
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    61
    INFO("[hello.getattr] (uid=%d, pid=%d) ino=%lu, fi=%p", fuse_req_ctx(req)->uid, fuse_req_ctx(req)->pid, ino, fi);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    62
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    63
    memset(&stbuf, 0, sizeof(stbuf));
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    64
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    65
    // the root dir, or the file?
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    66
    if (ino == 1) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    67
        stbuf.st_mode = S_IFDIR | 0555;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    68
        stbuf.st_nlink = 2;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    69
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    70
    } else if (ino == 2) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    71
        stbuf.st_mode = S_IFREG | 0444;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    72
        stbuf.st_nlink = 1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    73
        stbuf.st_size = strlen(file_data);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    74
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    75
    } else {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    76
        fuse_reply_err(req, ENOENT);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    77
        return;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    78
    }
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    79
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    80
    // reply
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    81
    fuse_reply_attr(req, &stbuf, 1.0);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    82
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    83
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    84
struct dirbuf {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    85
    char *buf;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    86
    size_t len;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    87
    size_t off;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    88
};
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    89
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    90
#define DIRBUF_INITIAL_SIZE 1024
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    91
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    92
static int dirbuf_init (struct dirbuf *buf) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    93
    buf->len = DIRBUF_INITIAL_SIZE;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    94
    buf->off = 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    95
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    96
    // allocate the mem
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    97
    if ((buf->buf = malloc(buf->len)) == NULL)
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    98
        ERROR("malloc");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    99
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   100
    // ok
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   101
    return 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   102
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   103
error:
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   104
    return -1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   105
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   106
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   107
/*
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   108
 * Ensure that `new` bytes fit into the buf. If they already fit, update offset and set *retry = 0. If they don't fit,
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   109
 * grow buf and set *retry = 1.
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   110
 *
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   111
 * Returns 0 on success, -1 on failure (don't retry).
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   112
 */
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   113
static int dirbuf_update (struct dirbuf *buf, size_t new, int *retry) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   114
    if (buf->off + new <= buf->len) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   115
        INFO("\thello.dirbuf_update: update offset by %zu from %zu -> %zu", new, buf->off, buf->off + new);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   116
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   117
        // great, it fit, update offset and return
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   118
        buf->off += new;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   119
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   120
        *retry = 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   121
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   122
    } else {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   123
        size_t old_len = buf->len;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   124
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   125
        // calc new size
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   126
        do {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   127
            buf->len *= 2;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   128
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   129
        } while (buf->off + new > buf->len);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   130
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   131
        INFO("\thello.dirbuf_update: grow size for %zu from %zu -> %zu", new, old_len, buf->len);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   132
        
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   133
        // realloc
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   134
        if ((buf->buf = realloc(buf->buf, buf->len)) == NULL)
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   135
            ERROR("realloc");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   136
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   137
        // done, just retry
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   138
        *retry = 1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   139
    }
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   140
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   141
    // success
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   142
    return 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   143
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   144
error:
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   145
    return -1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   146
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   147
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   148
static int dirbuf_add (fuse_req_t req, size_t req_size, off_t req_off, struct dirbuf *buf, off_t ent_off, off_t next_off, const char *ent_name, fuse_ino_t ent_ino) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   149
    struct stat stbuf;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   150
    size_t ent_size;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   151
    int err, retry;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   152
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   153
    INFO("\thello.dirbuf_add: req_size=%zu, req_off=%zu, buf->len=%zu, buf->off=%zu, ent_off=%zu, next_off=%zu, ent_name=%s, ent_ino=%lu",
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   154
        req_size, req_off, buf->len, buf->off, ent_off, next_off, ent_name, ent_ino);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   155
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   156
    // skip entries as needed
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   157
    if (buf->len >= req_size || ent_off < req_off) 
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   158
        return 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   159
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   160
    // set ino
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   161
    stbuf.st_ino = ent_ino;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   162
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   163
    // add the dirent and update dirbuf until it fits
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   164
    do {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   165
        ent_size = fuse_add_direntry(req, buf->buf + buf->off, buf->len - buf->off, ent_name, &stbuf, next_off);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   166
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   167
    } while (!(err = dirbuf_update(buf, ent_size, &retry)) && retry);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   168
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   169
    if (err)
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   170
        return err;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   171
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   172
    // success
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   173
    return 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   174
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   175
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   176
static int dirbuf_done (fuse_req_t req, struct dirbuf *buf, size_t req_size) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   177
    int err;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   178
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   179
    // send the reply, return the error later
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   180
    err = fuse_reply_buf(req, buf->buf, MIN(buf->off, req_size));
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   181
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   182
    INFO("\thello.dirbuf_done: MIN(%zu, %zu)=%zu, err=%d", buf->off, req_size, MIN(buf->off, req_size), err);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   183
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   184
    // free the dirbuf
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   185
    free(buf->buf);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   186
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   187
    // return the error code
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   188
    return err;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   189
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   190
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   191
void hello_readdir (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   192
    int err = 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   193
    struct dirbuf buf;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   194
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   195
    INFO("[hello.readdir] ino=%lu, size=%zu, off=%zu, fi=%p", ino, size, off, fi);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   196
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   197
    // there exists only one dir
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   198
    if (ino != 1) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   199
        fuse_reply_err(req, ENOTDIR);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   200
        return;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   201
    }
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   202
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   203
    // fill in the dirbuf
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   204
    if (dirbuf_init(&buf))
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   205
        ERROR("failed to init dirbuf");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   206
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   207
    if (    dirbuf_add(req, size, off, &buf, 0, 1,  ".",        1)
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   208
        ||  dirbuf_add(req, size, off, &buf, 1, 2,  "..",       1)
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   209
        ||  dirbuf_add(req, size, off, &buf, 2, 3,  file_name,  2)
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   210
    ) ERROR("failed to add dirents to buf");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   211
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   212
    // send it
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   213
    if ((err = -dirbuf_done(req, &buf, size)))
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   214
        EERROR(-err, "failed to send buf");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   215
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   216
    // success
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   217
    return;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   218
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   219
error:
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   220
    if ((err = fuse_reply_err(req, err ? err : EIO)))
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   221
        EWARNING(err, "failed to send error reply");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   222
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   223
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   224
void hello_open (fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   225
    int err = 0;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   226
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   227
    INFO("[hello.open] ino=%lu, fi=%p, fi->flags=%08X", ino, fi, fi->flags);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   228
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   229
    if (ino != 2) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   230
        // must open our only file, not the dir
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   231
        fuse_reply_err(req, ino == 1 ? EISDIR : ENOENT);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   232
        return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   233
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   234
    } else if ((fi->flags & 0x03) != O_RDONLY) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   235
        // "permission denied"
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   236
        fuse_reply_err(req, EACCES);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   237
        return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   238
    }
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   239
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   240
    // XXX: update fi stuff?
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   241
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   242
    // open it!
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   243
    if ((err = fuse_reply_open(req, fi)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   244
        EERROR(err, "fuse_reply_open");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   245
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   246
    // success
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   247
    return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   248
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   249
error:
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   250
    if ((err = fuse_reply_err(req, err ? err : EIO)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   251
        EWARNING(err, "failed to send error reply");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   252
}
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   253
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   254
void hello_read (fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   255
    int err = 0;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   256
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   257
    // fi is unused
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   258
    (void) fi;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   259
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   260
    INFO("[hello.read] ino=%lu, size=%zu, off=%zu, fi=%p", ino, size, off, fi);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   261
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   262
    if (ino != 2) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   263
        // EEK!
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   264
        FATAL("wrong inode");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   265
    }
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   266
    
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   267
    // validate off
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   268
    if (off >= strlen(file_data) && (err = EIO))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   269
        ERROR("offset is out-of-bounds (%zu >= %zu)", off, strlen(file_data));
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   270
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   271
    // reply
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   272
    if ((err = fuse_reply_buf(req, file_data + off, MIN(strlen(file_data) - off, size))))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   273
        PERROR("fuse_reply_buf");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   274
    
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   275
    // success
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   276
    return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   277
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   278
error:
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   279
    if ((err = fuse_reply_err(req, err ? err : EIO)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   280
        EWARNING(err, "failed to send error reply");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   281
}
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   282
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
struct fuse_lowlevel_ops hello_llops = {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
    .init = &hello_init,
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
    .destroy = &hello_destroy,
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   286
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   287
    .lookup = &hello_lookup,
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   288
    .getattr = &hello_getattr,
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   289
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   290
    .open = &hello_open,
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   291
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   292
    .read = &hello_read,
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   293
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   294
    .readdir = &hello_readdir,
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
};
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
int main (int argc, char **argv) {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
    struct fuse_args fuse_args = FUSE_ARGS_INIT(argc, argv);
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   300
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   301
    // zero
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   302
    memset(&ctx, 0, sizeof(ctx));
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
    // init libevent
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
    if ((ctx.ev_base = event_base_new()) == NULL)
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   306
        ERROR("event_base_new");
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
    
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   308
    // setup signals
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   309
    if ((ctx.signals = signals_default(ctx.ev_base)) == NULL)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   310
        ERROR("signals_default");
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   311
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
    // open fuse
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
    if ((ctx.ev_fuse = evfuse_new(ctx.ev_base, &fuse_args, &hello_llops, &ctx)) == NULL)
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   314
        ERROR("evfuse_new");
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
    // run libevent
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
    INFO("running libevent loop");
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
    if (event_base_dispatch(ctx.ev_base))
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   320
        PERROR("event_base_dispatch");
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   321
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   322
    // clean shutdown
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   324
error :
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
    // cleanup
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   326
    if (ctx.ev_fuse)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   327
        evfuse_close(ctx.ev_fuse);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   328
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   329
    if (ctx.signals)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   330
        signals_free(ctx.signals);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   331
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   332
    if (ctx.ev_base)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   333
        event_base_free(ctx.ev_base);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   334
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   335
    fuse_opt_free_args(&fuse_args);
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
}
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337