$NetBSD: patch-ab,v 1.4 2012/08/17 15:11:57 marino 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>
+#if !defined (__NetBSD__) && !defined (__DragonFly__)
+#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));
   
