afc88851eb
to run the file server as root for most uses.
144 lines
3.6 KiB
Text
144 lines
3.6 KiB
Text
$NetBSD: patch-ab,v 1.3 2007/03/16 08:21:16 pooka Exp $
|
|
|
|
--- LZOlayer_fs.c.orig 2006-05-18 22:23:35.000000000 +0300
|
|
+++ LZOlayer_fs.c 2007-03-16 09:00:48.000000000 +0200
|
|
@@ -21,6 +21,15 @@
|
|
#define __USE_UNIX98
|
|
#include <unistd.h>
|
|
#include <zlib.h>
|
|
+#ifndef __NetBSD__
|
|
+#define ordwr O_RDWR|O_LARGEFILE
|
|
+#define ordonly O_RDONLY|O_LARGEFILE
|
|
+#define owronly O_WRONLY|O_LARGEFILE
|
|
+#else
|
|
+#define ordwr O_RDWR
|
|
+#define ordonly O_RDONLY
|
|
+#define owronly O_WRONLY
|
|
+#endif
|
|
|
|
#include "minilzo.h"
|
|
#define HEAP_ALLOC(var, size) \
|
|
@@ -124,7 +133,7 @@
|
|
|
|
if (S_ISREG(stbuf->st_mode))
|
|
{
|
|
- int fd = open(xPath, O_RDONLY|O_LARGEFILE);
|
|
+ int fd = open(xPath, ordonly);
|
|
read(fd, &stbuf->st_size, sizeof(off_t));
|
|
close(fd);
|
|
}
|
|
@@ -143,15 +152,26 @@
|
|
|
|
static int LZOlayer_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi)
|
|
{
|
|
+ char dpath[MAXPATHLEN+1];
|
|
char *xPath = LZOlayer_makePath(path);
|
|
+ char *p;
|
|
|
|
DIR *dp = opendir(xPath);
|
|
struct dirent *dirp;
|
|
+ struct stat sb;
|
|
+
|
|
+ strcpy(dpath, path);
|
|
+ p = dpath + strlen(path);
|
|
|
|
while(dp)
|
|
{
|
|
- if ((dirp = readdir(dp)) != NULL)
|
|
- filler(buf, dirp->d_name, NULL, 0);
|
|
+ if ((dirp = readdir(dp)) != NULL) {
|
|
+ strcpy(p, dirp->d_name);
|
|
+ if (LZOlayer_getattr(dpath, &sb))
|
|
+ filler(buf, dirp->d_name, NULL, 0);
|
|
+ else
|
|
+ filler(buf, dirp->d_name, &sb, 0);
|
|
+ }
|
|
else break;
|
|
}
|
|
|
|
@@ -166,7 +186,7 @@
|
|
{
|
|
char *xPath = LZOlayer_makePath(path);
|
|
|
|
- int fd = open(xPath, O_RDONLY|O_LARGEFILE);
|
|
+ int fd = open(xPath, ordonly);
|
|
off_t outLen = 0;
|
|
read(fd, &outLen, sizeof(off_t));
|
|
close(fd);
|
|
@@ -193,7 +213,7 @@
|
|
char *xPath = filePtr->path;
|
|
|
|
int done = 0;
|
|
- int fd = open(xPath, O_RDONLY|O_LARGEFILE);
|
|
+ int fd = open(xPath, ordonly);
|
|
|
|
while(1)
|
|
{
|
|
@@ -249,7 +269,7 @@
|
|
off_t block_start = (float)filePtr->packets[min_offset].offset / (float)block_size;
|
|
|
|
char *xPath = filePtr->path;
|
|
- int fd = open(xPath, O_RDWR|O_LARGEFILE);
|
|
+ int fd = open(xPath, ordwr);
|
|
LZOlayer_block_seek(fd, block_start);
|
|
|
|
off_t alloc_size = (filePtr->size-(block_start*block_size)
|
|
@@ -315,10 +335,10 @@
|
|
{
|
|
LZOlayer_packet_sync(path, fi);
|
|
|
|
- int fd = open(filePtr->path, O_WRONLY|O_LARGEFILE);
|
|
+ int fd = open(filePtr->path, owronly);
|
|
if(fd == -1)
|
|
{
|
|
- open(filePtr->path, O_CREAT|O_WRONLY|O_LARGEFILE);
|
|
+ open(filePtr->path, O_CREAT|owronly);
|
|
chown(filePtr->path, fuse_get_context()->uid, fuse_get_context()->gid);
|
|
}
|
|
// old open/create for write
|
|
@@ -357,15 +377,25 @@
|
|
static int LZOlayer_mknod(const char *path, mode_t mode, dev_t rdev)
|
|
{
|
|
char *xPath = LZOlayer_makePath(path);
|
|
- int res = mknod(xPath, mode, rdev);
|
|
-
|
|
+ int res;
|
|
+
|
|
+ if (S_ISREG(mode)) {
|
|
+ res = open(xPath, owronly | O_CREAT | O_TRUNC, 0700);
|
|
+ if (res != -1) {
|
|
+ close(res);
|
|
+ res = 0;
|
|
+ }
|
|
+ } else {
|
|
+ res = mknod(xPath, mode, rdev);
|
|
+ }
|
|
+
|
|
if (res == -1)
|
|
{
|
|
res = -errno;
|
|
}
|
|
else
|
|
{
|
|
- int fd = open(xPath, O_WRONLY|O_LARGEFILE);
|
|
+ int fd = open(xPath, owronly);
|
|
off_t null = 0;
|
|
write(fd, &null, sizeof(off_t));
|
|
write(fd, &null, sizeof(off_t));
|
|
@@ -373,6 +403,7 @@
|
|
close(fd);
|
|
|
|
chown(xPath, fuse_get_context()->uid, fuse_get_context()->gid);
|
|
+ chmod(xPath, mode);
|
|
}
|
|
free(xPath);
|
|
|
|
@@ -383,7 +414,7 @@
|
|
{
|
|
char *xPath = LZOlayer_makePath(path);
|
|
|
|
- int fd = open(xPath, O_RDWR|O_LARGEFILE);
|
|
+ int fd = open(xPath, ordwr);
|
|
off_t file_size = 0;
|
|
read(fd, &file_size, sizeof(off_t));
|
|
|