1
2
3
4
5
6
7
8
9
|
1
2
3
4
5
6
7
8
9
|
-
+
|
/*
* Copyright (c) 2014 Roy Keene
* Copyright (c) 2014, 2015 Roy Keene
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
|
︙ | | |
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
|
530
531
532
533
534
535
536
537
538
539
540
541
542
543
|
-
-
|
}
return(ctx->uid);
}
/*
* Determine the GID for the user making the current FUSE filesystem request.
* This will be used to lookup the user's home directory so we can search for
* locally modified files.
*/
static gid_t appfs_get_fsgid(void) {
struct fuse_context *ctx;
if (!appfs_fuse_started) {
return(getgid());
}
|
︙ | | |
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
|
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
|
+
+
|
APPFS_DEBUG("error: open failed");
return(errno * -1);
}
fi->fh = fh;
APPFS_DEBUG("Opened \"%s\" (for \"%s\") with file descriptor %i", real_path, path, fh);
return(0);
}
static int appfs_fuse_close(const char *path, struct fuse_file_info *fi) {
int close_ret;
appfs_get_path_info_cache_rm(path, appfs_get_fsuid());
|
︙ | | |
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
|
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
|
-
+
|
return(0);
}
static int appfs_fuse_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) {
ssize_t read_ret;
int retval;
APPFS_DEBUG("Enter (path = %s, buf, %lli, %lli, fd=%lli)", path, (long long) size, (long long) offset, (long long) fi->fh);
APPFS_DEBUG("Enter (path = %s, buf, size = %lli, offset = %lli, fd = %lli)", path, (long long) size, (long long) offset, (long long) fi->fh);
retval = 0;
while (size != 0) {
read_ret = pread(fi->fh, buf, size, offset);
if (read_ret < 0) {
|
︙ | | |
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
|
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
|
-
+
|
#else
appfs_threaded_tcl = 0;
#endif
/**
** Add FUSE arguments which we always supply
**/
fuse_opt_add_arg(args, "-odefault_permissions,fsname=appfs,subtype=appfsd,use_ino,direct_io,entry_timeout=0,attr_timeout=0,big_writes,intr,hard_remove");
fuse_opt_add_arg(args, "-odefault_permissions,fsname=appfs,subtype=appfsd,use_ino,entry_timeout=0,attr_timeout=0,big_writes,intr,hard_remove");
if (getuid() == 0) {
fuse_opt_parse(args, NULL, NULL, NULL);
fuse_opt_add_arg(args, "-oallow_other");
/*
* This should generally be avoided, but if there are security
|
︙ | | |
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
|
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
|
-
+
|
APPFS_DEBUG("Passing option to FUSE: -s");
fuse_opt_parse(args, NULL, NULL, NULL);
fuse_opt_add_arg(args, "-s");
appfs_threaded_tcl = 0;
} else if (strcmp(optstr, "allow_other") == 0) {
APPFS_DEBUG("Passing option to FUSE: -o allow_Other");
APPFS_DEBUG("Passing option to FUSE: -o allow_other");
fuse_opt_parse(args, NULL, NULL, NULL);
fuse_opt_add_arg(args, "-oallow_other");
} else if (strcmp(optstr, "rw") == 0) {
/* Ignored */
} else {
fprintf(stderr, "appfsd: invalid option: \"-o %s\"\n", optstr);
|
︙ | | |