Overview
| Comment: | Added basic write support |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | tcl-ops |
| Files: | files | file ages | folders |
| SHA1: |
db5fcbef28a6ac294a70d06d5c7506ad |
| User & Date: | rkeene on 2014-11-07 12:26:49 |
| Other Links: | branch diff | manifest | tags |
Context
|
2014-11-07
| ||
| 13:04 | Added validity checking for various types check-in: 5685a8f9a8 user: rkeene tags: tcl-ops | |
| 12:26 | Added basic write support check-in: db5fcbef28 user: rkeene tags: tcl-ops | |
| 12:13 | Added basic "open" support check-in: ebbca87b7e user: rkeene tags: tcl-ops | |
Changes
Modified appfsd.c from [a228e5eaeb] to [5b32138d43].
| ︙ | ︙ | |||
376 377 378 379 380 381 382 |
/* Get information about a path, and optionally list children */
static int appfs_get_path_info(const char *path, struct appfs_pathinfo *pathinfo) {
Tcl_Interp *interp;
Tcl_Obj *attrs_dict, *attr_value;
const char *attr_value_str;
Tcl_WideInt attr_value_wide;
int attr_value_int;
| | | 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 |
/* Get information about a path, and optionally list children */
static int appfs_get_path_info(const char *path, struct appfs_pathinfo *pathinfo) {
Tcl_Interp *interp;
Tcl_Obj *attrs_dict, *attr_value;
const char *attr_value_str;
Tcl_WideInt attr_value_wide;
int attr_value_int;
static __thread Tcl_Obj *attr_key_type = NULL, *attr_key_perms = NULL, *attr_key_size = NULL, *attr_key_time = NULL, *attr_key_source = NULL, *attr_key_childcount = NULL, *attr_key_packaged = NULL;
int tcl_ret;
interp = appfs_TclInterp();
if (interp == NULL) {
return(-EIO);
}
|
| ︙ | ︙ | |||
399 400 401 402 403 404 405 406 407 408 409 410 411 412 |
if (attr_key_type == NULL) {
attr_key_type = Tcl_NewStringObj("type", -1);
attr_key_perms = Tcl_NewStringObj("perms", -1);
attr_key_size = Tcl_NewStringObj("size", -1);
attr_key_time = Tcl_NewStringObj("time", -1);
attr_key_source = Tcl_NewStringObj("source", -1);
attr_key_childcount = Tcl_NewStringObj("childcount", -1);
}
attrs_dict = Tcl_GetObjResult(interp);
tcl_ret = Tcl_DictObjGet(interp, attrs_dict, attr_key_type, &attr_value);
if (tcl_ret != TCL_OK) {
APPFS_DEBUG("[dict get \"type\"] failed");
APPFS_DEBUG("Tcl Error is: %s", Tcl_GetStringResult(interp));
| > | 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 |
if (attr_key_type == NULL) {
attr_key_type = Tcl_NewStringObj("type", -1);
attr_key_perms = Tcl_NewStringObj("perms", -1);
attr_key_size = Tcl_NewStringObj("size", -1);
attr_key_time = Tcl_NewStringObj("time", -1);
attr_key_source = Tcl_NewStringObj("source", -1);
attr_key_childcount = Tcl_NewStringObj("childcount", -1);
attr_key_packaged = Tcl_NewStringObj("packaged", -1);
}
attrs_dict = Tcl_GetObjResult(interp);
tcl_ret = Tcl_DictObjGet(interp, attrs_dict, attr_key_type, &attr_value);
if (tcl_ret != TCL_OK) {
APPFS_DEBUG("[dict get \"type\"] failed");
APPFS_DEBUG("Tcl Error is: %s", Tcl_GetStringResult(interp));
|
| ︙ | ︙ | |||
473 474 475 476 477 478 479 480 481 482 483 484 485 486 |
memcpy(pathinfo->typeinfo.symlink.source, attr_value_str, attr_value_int);
}
}
break;
default:
return(-EIO);
}
Tcl_DictObjGet(interp, attrs_dict, attr_key_time, &attr_value);
if (attr_value != NULL) {
tcl_ret = Tcl_GetWideIntFromObj(NULL, attr_value, &attr_value_wide);
if (tcl_ret == TCL_OK) {
pathinfo->time = attr_value_wide;
}
| > > > > > | 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 |
memcpy(pathinfo->typeinfo.symlink.source, attr_value_str, attr_value_int);
}
}
break;
default:
return(-EIO);
}
Tcl_DictObjGet(interp, attrs_dict, attr_key_packaged, &attr_value);
if (attr_value != NULL) {
pathinfo->packaged = 1;
}
Tcl_DictObjGet(interp, attrs_dict, attr_key_time, &attr_value);
if (attr_value != NULL) {
tcl_ret = Tcl_GetWideIntFromObj(NULL, attr_value, &attr_value_wide);
if (tcl_ret == TCL_OK) {
pathinfo->time = attr_value_wide;
}
|
| ︙ | ︙ | |||
563 564 565 566 567 568 569 |
case APPFS_PATHTYPE_INVALID:
retval = -EIO;
break;
}
if (pathinfo.packaged) {
| < | < | 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 |
case APPFS_PATHTYPE_INVALID:
retval = -EIO;
break;
}
if (pathinfo.packaged) {
stbuf->st_mode |= 0222;
}
return(retval);
}
static int appfs_fuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) {
Tcl_Interp *interp;
|
| ︙ | ︙ | |||
697 698 699 700 701 702 703 704 705 706 707 708 709 710 |
return(-EIO);
}
read_ret = read(fi->fh, buf, size);
return(read_ret);
}
/*
* SQLite3 mode: Execute raw SQL and return success or failure
*/
static int appfs_sqlite3(const char *sql) {
Tcl_Interp *interp;
const char *sql_ret;
| > > > > > > > > > > > > > > > > | 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 |
return(-EIO);
}
read_ret = read(fi->fh, buf, size);
return(read_ret);
}
static int appfs_fuse_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) {
off_t lseek_ret;
ssize_t write_ret;
APPFS_DEBUG("Enter (path = %s, ...)", path);
lseek_ret = lseek(fi->fh, offset, SEEK_SET);
if (lseek_ret != offset) {
return(-EIO);
}
write_ret = write(fi->fh, buf, size);
return(write_ret);
}
/*
* SQLite3 mode: Execute raw SQL and return success or failure
*/
static int appfs_sqlite3(const char *sql) {
Tcl_Interp *interp;
const char *sql_ret;
|
| ︙ | ︙ | |||
788 789 790 791 792 793 794 |
*/
static struct fuse_operations appfs_operations = {
.getattr = appfs_fuse_getattr,
.readdir = appfs_fuse_readdir,
.readlink = appfs_fuse_readlink,
.open = appfs_fuse_open,
.release = appfs_fuse_close,
| | > | 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 |
*/
static struct fuse_operations appfs_operations = {
.getattr = appfs_fuse_getattr,
.readdir = appfs_fuse_readdir,
.readlink = appfs_fuse_readlink,
.open = appfs_fuse_open,
.release = appfs_fuse_close,
.read = appfs_fuse_read,
.write = appfs_fuse_write
};
/*
* FUSE option parsing callback
*/
static int appfs_fuse_opt_cb(void *data, const char *arg, int key, struct fuse_args *outargs) {
static int seen_cachedir = 0;
|
| ︙ | ︙ |
Modified appfsd.tcl from [23568748fe] to [1c94a0206c].
| ︙ | ︙ | |||
481 482 483 484 485 486 487 488 489 490 491 492 493 494 |
switch -- $pathinfo(_type) {
"toplevel" - "sites" - "packages" - "os-cpu" - "versions" {
set retval(type) directory
set retval(childcount) 2;
}
"files" {
set localpath [_localpath $pathinfo(package) $pathinfo(hostname) $pathinfo(file)]
if {[file exists $localpath]} {
catch {
file lstat $localpath localpathinfo
set retval(time) $localpathinfo(mtime)
switch -- $localpathinfo(type) {
| > > | 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 |
switch -- $pathinfo(_type) {
"toplevel" - "sites" - "packages" - "os-cpu" - "versions" {
set retval(type) directory
set retval(childcount) 2;
}
"files" {
set retval(packaged) 1
set localpath [_localpath $pathinfo(package) $pathinfo(hostname) $pathinfo(file)]
if {[file exists $localpath]} {
catch {
file lstat $localpath localpathinfo
set retval(time) $localpathinfo(mtime)
switch -- $localpathinfo(type) {
|
| ︙ | ︙ |