src/hello.c
author Tero Marttila <terom@fixme.fi>
Fri, 26 Sep 2008 20:11:22 +0300
changeset 6 d2036d7799fd
parent 5 dc86636257c2
child 7 3a603d755bcb
permissions -rw-r--r--
new 'simple' module, plus hello_simple
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
6
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
     8
#include "lib/log.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
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    90
static int dirbuf_init (struct dirbuf *buf, size_t req_size) {
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    91
    buf->len = req_size;
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    92
    buf->off = 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    93
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    94
    // allocate the mem
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    95
    if ((buf->buf = malloc(buf->len)) == NULL)
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    96
        ERROR("malloc");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    97
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    98
    // ok
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    99
    return 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   100
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   101
error:
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   102
    return -1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   103
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   104
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   105
/*
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   106
 * Add an ent to the dirbuf. This will assume that the dirbuf is not already full
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   107
 * Returns 0 if the ent was added or skipped, -1 on error, 1 if the dirbuf is full
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   108
 */
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   109
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
   110
    struct stat stbuf;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   111
    size_t ent_size;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   112
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   113
    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",
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   114
        req_size, req_off, buf->len, buf->off, ent_off, next_off, ent_name, ent_ino);
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   115
    
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   116
    // skip entries as needed
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   117
    if (ent_off < req_off) 
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   118
        return 0;
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
    // set ino
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   121
    stbuf.st_ino = ent_ino;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   122
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   123
    // add the dirent and update dirbuf until it fits
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   124
    if ((ent_size = fuse_add_direntry(req, buf->buf + buf->off, buf->len - buf->off, ent_name, &stbuf, next_off)) > (buf->len - buf->off)) {
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   125
        // 'tis full
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   126
        return 1;
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   127
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   128
    } else {
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   129
        // it fit
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   130
        buf->off += ent_size;
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   131
    }
2
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
    // success
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   134
    return 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   135
}
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
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
   138
    int err;
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
    // send the reply, return the error later
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   141
    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
   142
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   143
    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
   144
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   145
    // free the dirbuf
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   146
    free(buf->buf);
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
    // return the error code
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   149
    return err;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   150
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   151
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   152
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
   153
    int err = 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   154
    struct dirbuf buf;
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
    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
   157
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   158
    // there exists only one dir
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   159
    if (ino != 1) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   160
        fuse_reply_err(req, ENOTDIR);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   161
        return;
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
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   164
    // fill in the dirbuf
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   165
    if (dirbuf_init(&buf, size))
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   166
        ERROR("failed to init dirbuf");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   167
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   168
    err =   dirbuf_add(req, size, off, &buf, 0, 1,  ".",        1)
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   169
        ||  dirbuf_add(req, size, off, &buf, 1, 2,  "..",       1)
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   170
        ||  dirbuf_add(req, size, off, &buf, 2, 3,  file_name,  2);
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   171
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   172
    if (err < 0)
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   173
        ERROR("failed to add dirents to buf");
2
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
    // send it
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   176
    if ((err = -dirbuf_done(req, &buf, size)))
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   177
        EERROR(-err, "failed to send buf");
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
    // success
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   180
    return;
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
error:
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   183
    if ((err = fuse_reply_err(req, err ? err : EIO)))
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   184
        EWARNING(err, "failed to send error reply");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   185
}
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   186
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   187
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
   188
    int err = 0;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   189
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   190
    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
   191
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   192
    if (ino != 2) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   193
        // must open our only file, not the dir
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   194
        fuse_reply_err(req, ino == 1 ? EISDIR : ENOENT);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   195
        return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   196
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   197
    } else if ((fi->flags & 0x03) != O_RDONLY) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   198
        // "permission denied"
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   199
        fuse_reply_err(req, EACCES);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   200
        return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   201
    }
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   202
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   203
    // XXX: update fi stuff?
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   204
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   205
    // open it!
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   206
    if ((err = fuse_reply_open(req, fi)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   207
        EERROR(err, "fuse_reply_open");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   208
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   209
    // success
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   210
    return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   211
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   212
error:
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   213
    if ((err = fuse_reply_err(req, err ? err : EIO)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   214
        EWARNING(err, "failed to send error reply");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   215
}
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   216
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   217
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
   218
    int err = 0;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   219
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   220
    // fi is unused
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   221
    (void) fi;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   222
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   223
    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
   224
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   225
    if (ino != 2) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   226
        // EEK!
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   227
        FATAL("wrong inode");
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
    
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   230
    if (off >= strlen(file_data)) {
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   231
        // offset is out-of-file, so return EOF
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   232
        err = fuse_reply_buf(req, NULL, 0);
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   233
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   234
    } else {
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   235
        // reply with the requested file data
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   236
        err = fuse_reply_buf(req, file_data + off, MIN(strlen(file_data) - off, size));
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   237
    }
4
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
    // reply
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   240
    if (err)
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   241
        PERROR("fuse_reply_buf");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   242
    
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   243
    // success
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   244
    return;
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
error:
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   247
    if ((err = fuse_reply_err(req, err ? err : EIO)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   248
        EWARNING(err, "failed to send error reply");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   249
}
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   250
6
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   251
void hello_getxattr (fuse_req_t req, fuse_ino_t ino, const char *name, size_t size) {
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   252
    INFO("[hello.getxattr] ino=%lu, name=`%s', size=%zu", ino, name, size);
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   253
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   254
    fuse_reply_err(req, ENOSYS);
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   255
}
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   256
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
struct fuse_lowlevel_ops hello_llops = {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
    .init = &hello_init,
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
    .destroy = &hello_destroy,
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   260
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   261
    .lookup = &hello_lookup,
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   262
    .getattr = &hello_getattr,
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   263
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   264
    .open = &hello_open,
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
    .read = &hello_read,
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   267
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   268
    .readdir = &hello_readdir,
6
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   269
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   270
    .getxattr = hello_getxattr,
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
};
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
int main (int argc, char **argv) {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
    struct fuse_args fuse_args = FUSE_ARGS_INIT(argc, argv);
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   276
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   277
    // zero
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   278
    memset(&ctx, 0, sizeof(ctx));
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
    // init libevent
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
    if ((ctx.ev_base = event_base_new()) == NULL)
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   282
        ERROR("event_base_new");
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
    
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   284
    // setup signals
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   285
    if ((ctx.signals = signals_default(ctx.ev_base)) == NULL)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   286
        ERROR("signals_default");
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   287
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
    // open fuse
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
    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
   290
        ERROR("evfuse_new");
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
    // run libevent
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
    INFO("running libevent loop");
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
    if (event_base_dispatch(ctx.ev_base))
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   296
        PERROR("event_base_dispatch");
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   297
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   298
    // clean shutdown
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   300
error :
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
    // cleanup
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   302
    if (ctx.ev_fuse)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   303
        evfuse_close(ctx.ev_fuse);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   304
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   305
    if (ctx.signals)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   306
        signals_free(ctx.signals);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   307
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   308
    if (ctx.ev_base)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   309
        event_base_free(ctx.ev_base);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   310
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   311
    fuse_opt_free_args(&fuse_args);
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
}
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313