src/dbfs/attr.c
author Tero Marttila <terom@fixme.fi>
Tue, 18 Nov 2008 01:55:13 +0200
changeset 41 6abda2fa4579
parent 36 56427f22e969
child 48 8b019d191353
permissions -rw-r--r--
touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "dbfs.h"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include "../lib/log.h"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include "../lib/misc.h"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
// max. size for a setattr UPDATE query
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#define DBFS_SETATTR_SQL_MAX 512
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
// for building the setattr UPDATE
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#define FIELD(to_set, flag, field, value) ((to_set) & (flag)) ? (field " = " value ", ") : ""
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
void _dbfs_attr_res (const struct evsql_result_info *res, void *arg) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    struct fuse_req *req = arg;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    struct stat st; ZINIT(st);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    int err = 0;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    uint32_t ino;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    // check the results
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    if ((err = _dbfs_check_res(res, 1, 5)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        SERROR(err = (err ==  1 ? ENOENT : EIO));
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    // get our data
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    if (0
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        ||  evsql_result_uint32(res, 0, 0, &ino,        0 ) // inodes.ino
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        EERROR(err = EIO, "invalid db data");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
 
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        
36
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    30
    INFO("\t[dbfs.getattr %p] -> ino=%lu, stat follows", req, (unsigned long int) ino);
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    
32
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    32
    // inode
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    33
    st.st_ino = ino;
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    34
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    // stat attrs
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    if ((err = _dbfs_stat_info(&st, res, 0, 1)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        goto error;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    // reply
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    if ((err = fuse_reply_attr(req, &st, st.st_nlink ? CACHE_TIMEOUT : 0)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        EERROR(err, "fuse_reply_entry");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
error:
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    if (err && (err = fuse_reply_err(req, err)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        EWARNING(err, "fuse_reply_err");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    // free
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    evsql_result_free(res);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
}
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
void dbfs_getattr (struct fuse_req *req, fuse_ino_t ino, struct fuse_file_info *fi) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    struct dbfs *ctx = fuse_req_userdata(req);
41
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    53
    struct evsql_query *query;
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    int err;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    (void) fi;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    INFO("[dbfs.getattr %p] ino=%lu", req, ino);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    const char *sql =
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        "SELECT"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        " inodes.ino, " DBFS_STAT_COLS
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        " FROM inodes"
33
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    64
        " WHERE inodes.ino = $1::int4";
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    static struct evsql_query_params params = EVSQL_PARAMS(EVSQL_FMT_BINARY) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        EVSQL_PARAM ( UINT32 ),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        EVSQL_PARAMS_END
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    };
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    // build params
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    if (0
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        ||  evsql_param_uint32(&params, 0, ino)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    // query
41
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    79
    if ((query = evsql_query_params(ctx->db, NULL, sql, &params, _dbfs_attr_res, req)) == NULL)
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
41
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    82
    // handle interrupts
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    83
    fuse_req_interrupt_func(req, dbfs_interrupt_query, query);
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    // wait
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    return;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
error:
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    if ((err = fuse_reply_err(req, err)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        EWARNING(err, "fuse_reply_err");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
}
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
void dbfs_setattr (struct fuse_req *req, fuse_ino_t ino, struct stat *attr, int to_set, struct fuse_file_info *fi) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    struct dbfs *ctx = fuse_req_userdata(req);
41
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
    96
    struct evsql_query *query;
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    int err;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
    int ret;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    char sql_buf[DBFS_SETATTR_SQL_MAX];
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    static struct evsql_query_params params = EVSQL_PARAMS(EVSQL_FMT_BINARY) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        EVSQL_PARAM ( UINT16 ), // inodes.mode
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        EVSQL_PARAM ( UINT32 ), // inodes.uid
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        EVSQL_PARAM ( UINT32 ), // inodes.gid
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        EVSQL_PARAM ( UINT32 ), // data size
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        EVSQL_PARAM ( UINT32 ), // ino
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        EVSQL_PARAMS_END
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    };
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
    // log
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    INFO("[dbfs.setattr %p] ino=%lu, fileop=%p: ", req, ino, fi && fi->fh ? (void*) fi->fh : NULL);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    if (to_set & FUSE_SET_ATTR_MODE) {
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        // ignore the S_IFMT
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
        attr->st_mode &= 07777;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        INFO("\tmode    = %08o", attr->st_mode);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    }
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    if (to_set & FUSE_SET_ATTR_UID)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        INFO("\tuid     = %u", attr->st_uid);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    if (to_set & FUSE_SET_ATTR_GID)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
        INFO("\tgid     = %u", attr->st_gid);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    if (to_set & FUSE_SET_ATTR_SIZE)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
        INFO("\tsize    = %lu", attr->st_size);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
    if (to_set & FUSE_SET_ATTR_ATIME)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
        INFO("\tatime   = %lu", attr->st_atime);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    if (to_set & FUSE_SET_ATTR_MTIME)
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        INFO("\tmtime   = %lu", attr->st_mtime);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
    // the SQL
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    if ((ret = snprintf(sql_buf, DBFS_SETATTR_SQL_MAX,
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
        "UPDATE inodes SET"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        " %s%s%s%s ino = ino"
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        " WHERE inodes.ino = $5::int4"
33
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
   142
        " RETURNING inodes.ino, " DBFS_STAT_COLS,
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        FIELD(to_set, FUSE_SET_ATTR_MODE,   "mode", "$1::int2"),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        FIELD(to_set, FUSE_SET_ATTR_UID,    "uid",  "$2::int4"),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        FIELD(to_set, FUSE_SET_ATTR_GID,    "gid",  "$3::int4"),
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        FIELD(to_set, FUSE_SET_ATTR_SIZE,   "data", "lo_otruncate(data, $4::int4)")
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    )) >= DBFS_SETATTR_SQL_MAX && (err = EIO))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
        ERROR("sql_buf is too small: %i", ret);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
    // the params...
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
    if (0
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        || (                                  evsql_params_clear(&params)                    )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        || ((to_set & FUSE_SET_ATTR_MODE ) && evsql_param_uint16(&params, 0, attr->st_mode)  )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
        || ((to_set & FUSE_SET_ATTR_UID  ) && evsql_param_uint32(&params, 1, attr->st_uid)   )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        || ((to_set & FUSE_SET_ATTR_GID  ) && evsql_param_uint32(&params, 2, attr->st_gid)   )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
        || ((to_set & FUSE_SET_ATTR_SIZE ) && evsql_param_uint32(&params, 3, attr->st_size)  )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
        || (                                  evsql_param_uint32(&params, 4, ino)            )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    )
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    // trace the query
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    evsql_query_debug(sql_buf, &params);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    // query... we can pretend it's a getattr :)
41
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
   166
    if ((query = evsql_query_params(ctx->db, NULL, sql_buf, &params, _dbfs_attr_res, req)) == NULL)
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
        SERROR(err = EIO);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
41
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
   169
    // handle interrupts
6abda2fa4579 touch up the Makefile, define err_t as unsigned int in error.h, and add some preliminary interrupt support, although it will always deadlock due to a bug in libfuse
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
   170
    fuse_req_interrupt_func(req, dbfs_interrupt_query, query);
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    // wait
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    return;
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
error:
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    if ((err = fuse_reply_err(req, err)))
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
        EWARNING(err, "fuse_reply_err");
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
}