src/hello.c
author Tero Marttila <terom@fixme.fi>
Sat, 13 Dec 2008 20:32:17 +0200
branchnew-evsql
changeset 54 7dc8ff496da1
parent 27 461be4cd34a3
permissions -rw-r--r--
evsql documentation further improved
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"
7
3a603d755bcb split off the dirbuf stuff into its own module
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    12
#include "dirbuf.h"
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    14
const char *file_name = "hello";
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    15
const char *file_data = "Hello World\n";
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    16
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    17
static struct hello {
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    struct event_base *ev_base;
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    20
    struct signals *signals;
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    21
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    struct evfuse *ev_fuse;
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    23
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
} ctx;
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
void hello_init (void *userdata, struct fuse_conn_info *conn) {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    INFO("[hello.init] userdata=%p, conn=%p", userdata, conn);
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
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
void hello_destroy (void *userdata) {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    INFO("[hello.destroy] userdata=%p", userdata);
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
}
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    34
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
    35
    struct fuse_entry_param e;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    36
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    37
    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
    38
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    39
    // the world is flat
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    40
    if (parent != 1 || strcmp(name, file_name)) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    41
        fuse_reply_err(req, ENOENT);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    42
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    43
        return;
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
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    46
    // set up the entry
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    47
    memset(&e, 0, sizeof(e));
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    48
    e.ino = 2;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    49
    e.attr_timeout = 1.0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    50
    e.entry_timeout = 1.0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    51
    e.attr.st_mode = S_IFREG | 0444;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    52
    e.attr.st_nlink = 1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    53
    e.attr.st_size = strlen(file_data);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    54
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    55
    // reply
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    56
    fuse_reply_entry(req, &e);
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
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    59
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
    60
    struct stat stbuf;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    61
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    62
    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
    63
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    64
    memset(&stbuf, 0, sizeof(stbuf));
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    65
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    66
    // the root dir, or the file?
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    67
    if (ino == 1) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    68
        stbuf.st_mode = S_IFDIR | 0555;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    69
        stbuf.st_nlink = 2;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    70
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    71
    } else if (ino == 2) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    72
        stbuf.st_mode = S_IFREG | 0444;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    73
        stbuf.st_nlink = 1;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    74
        stbuf.st_size = strlen(file_data);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    75
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    76
    } else {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    77
        fuse_reply_err(req, ENOENT);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    78
        return;
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
    
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    81
    // reply
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    82
    fuse_reply_attr(req, &stbuf, 1.0);
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
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    85
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    86
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
    87
    int err = 0;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    88
    struct dirbuf buf;
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
    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
    91
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    92
    // there exists only one dir
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    93
    if (ino != 1) {
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    94
        fuse_reply_err(req, ENOTDIR);
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    95
        return;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    96
    }
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
    // fill in the dirbuf
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    99
    if (dirbuf_init(&buf, size, off))
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   100
        ERROR("failed to init dirbuf");
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   101
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   102
    err =   dirbuf_add(req, &buf, 0, 1,  ".",        1,    S_IFDIR )
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   103
        ||  dirbuf_add(req, &buf, 1, 2,  "..",       1,    S_IFDIR )
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   104
        ||  dirbuf_add(req, &buf, 2, 3,  file_name,  2,    S_IFREG );
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   105
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   106
    if (err < 0)
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   107
        ERROR("failed to add dirents to buf");
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
    // send it
7
3a603d755bcb split off the dirbuf stuff into its own module
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   110
    if ((err = -dirbuf_done(req, &buf)))
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   111
        EERROR(-err, "failed to send buf");
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
    // success
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   114
    return;
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   115
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   116
error:
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   117
    if ((err = fuse_reply_err(req, err ? err : EIO)))
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   118
        EWARNING(err, "failed to send error reply");
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
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   121
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
   122
    int err = 0;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   123
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   124
    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
   125
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   126
    if (ino != 2) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   127
        // must open our only file, not the dir
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   128
        fuse_reply_err(req, ino == 1 ? EISDIR : ENOENT);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   129
        return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   130
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   131
    } else if ((fi->flags & 0x03) != O_RDONLY) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   132
        // "permission denied"
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   133
        fuse_reply_err(req, EACCES);
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   134
        return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   135
    }
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   136
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   137
    // XXX: update fi stuff?
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   138
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   139
    // open it!
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   140
    if ((err = fuse_reply_open(req, fi)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   141
        EERROR(err, "fuse_reply_open");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   142
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   143
    // success
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   144
    return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   145
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   146
error:
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   147
    if ((err = fuse_reply_err(req, err ? err : EIO)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   148
        EWARNING(err, "failed to send error reply");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   149
}
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   150
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   151
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
   152
    int err = 0;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   153
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   154
    // fi is unused
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   155
    (void) fi;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   156
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   157
    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
   158
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   159
    if (ino != 2) {
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   160
        // EEK!
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   161
        FATAL("wrong inode");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   162
    }
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   163
    
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   164
    if (off >= strlen(file_data)) {
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   165
        // offset is out-of-file, so return EOF
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   166
        err = fuse_reply_buf(req, NULL, 0);
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   167
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   168
    } else {
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   169
        // reply with the requested file data
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   170
        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
   171
    }
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   172
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   173
    // reply
5
dc86636257c2 simplify readdir
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   174
    if (err)
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   175
        PERROR("fuse_reply_buf");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   176
    
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   177
    // success
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   178
    return;
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   179
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   180
error:
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   181
    if ((err = fuse_reply_err(req, err ? err : EIO)))
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   182
        EWARNING(err, "failed to send error reply");
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   183
}
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   184
6
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   185
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
   186
    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
   187
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   188
    fuse_reply_err(req, ENOSYS);
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   189
}
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   190
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
struct fuse_lowlevel_ops hello_llops = {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
    .init = &hello_init,
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    .destroy = &hello_destroy,
2
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
    .lookup = &hello_lookup,
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   196
    .getattr = &hello_getattr,
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   197
4
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   198
    .open = &hello_open,
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   199
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   200
    .read = &hello_read,
194888fc1055 working 'Hello World' fuse fs
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
   201
2
11757d6b43a6 more functionality for hello
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
   202
    .readdir = &hello_readdir,
6
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   203
d2036d7799fd new 'simple' module, plus hello_simple
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   204
    .getxattr = hello_getxattr,
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
};
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
int main (int argc, char **argv) {
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
    struct fuse_args fuse_args = FUSE_ARGS_INIT(argc, argv);
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   210
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   211
    // zero
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   212
    memset(&ctx, 0, sizeof(ctx));
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
    // init libevent
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    if ((ctx.ev_base = event_base_new()) == NULL)
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   216
        ERROR("event_base_new");
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
    
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   218
    // setup signals
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   219
    if ((ctx.signals = signals_default(ctx.ev_base)) == NULL)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   220
        ERROR("signals_default");
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   221
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
    // open fuse
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
    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
   224
        ERROR("evfuse_new");
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
    // run libevent
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
    INFO("running libevent loop");
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
    if (event_base_dispatch(ctx.ev_base))
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   230
        PERROR("event_base_dispatch");
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   231
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   232
    // clean shutdown
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   234
error :
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
    // cleanup
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   236
    if (ctx.ev_fuse)
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   237
        evfuse_free(ctx.ev_fuse);
3
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   238
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   239
    if (ctx.signals)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   240
        signals_free(ctx.signals);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   241
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   242
    if (ctx.ev_base)
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   243
        event_base_free(ctx.ev_base);
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   244
    
10b53719659c signal handling
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   245
    fuse_opt_free_args(&fuse_args);
1
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
}
b31db3248246 a working hello
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247