On Thu, Mar 06, 2025 at 07:01:44PM +0000, Stuart Henderson wrote:
> On 2025/03/06 18:45, Hiltjo Posthuma wrote:
> > In the following commit the sysctl kern.usermount=1 was removed:
> >     
> > https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/kern/kern_sysctl.c?rev=1.306&content-type=text/x-cvsweb-markup
> > 
> > What is the alternative to run FUSE safely as non-root now?  It seems ports
> > like sshfs, curlftps etc cannot run as a user now?
> 
> There isn't one. (And fuse is a bit of a dead-end on OpenBSD anyway, we
> have always been a bit incompatible anyway, and the fuse 3 compatible
> code that was written never made it into the tree).
> 
> > Feel free to use the above changes into usmb if you want.
> 
> a set of "I changed this and this and this" instructions isn't
> particularly helpful for getting something into a port..

Yes, sorry, below is a patch that changes the following:

* Change the block size from the 512 bytes default to 32768 for files (struct
  stat.st_blksize).
* Remove max_read FUSE limit option.
* Remove the maximum 32768 bytes per write limitation (the smbclient code
  handles this just fine).

Thank you,


diff --git a/sysutils/usmb/Makefile b/sysutils/usmb/Makefile
index f10c062979a..3f7fcc47264 100644
--- a/sysutils/usmb/Makefile
+++ b/sysutils/usmb/Makefile
@@ -1,7 +1,7 @@
 COMMENT=       mount SMB shares from userland via FUSE
 
 DISTNAME=      usmb-20130204
-REVISION=      7
+REVISION=      8
 
 CATEGORIES=    sysutils
 
diff --git a/sysutils/usmb/patches/patch-options_c 
b/sysutils/usmb/patches/patch-options_c
new file mode 100644
index 00000000000..e293d27457b
--- /dev/null
+++ b/sysutils/usmb/patches/patch-options_c
@@ -0,0 +1,21 @@
+Index: options.c
+--- options.c.orig
++++ options.c
+@@ -149,7 +149,6 @@
+   static char MINUS_D[] = "-d";
+   static char MINUS_F[] = "-f";
+   static char MINUS_O[] = "-o";
+-  static char MAX_READ[] = "max_read=32768";
+ 
+   assert (NULL != mountpoint);
+   static char *argv[MAXARGS];
+@@ -167,9 +166,6 @@
+   if (nofork)
+ #endif
+     argv[argc++] = MINUS_F;
+-
+-  argv[argc++] = MINUS_O;
+-  argv[argc++] = MAX_READ;
+ 
+   if ((NULL != options) && ('\0' != options[0]))
+   {
diff --git a/sysutils/usmb/patches/patch-usmb_file_c 
b/sysutils/usmb/patches/patch-usmb_file_c
index 8e16874813c..714eaf71cbf 100644
--- a/sysutils/usmb/patches/patch-usmb_file_c
+++ b/sysutils/usmb/patches/patch-usmb_file_c
@@ -1,10 +1,75 @@
 Index: usmb_file.c
 --- usmb_file.c.orig
 +++ usmb_file.c
-@@ -202,6 +202,30 @@ int usmb_write (const char *filename UNUSED, const cha
+@@ -60,7 +60,18 @@
+   return (NULL == dirent);
  }
  
++static bool change_blksiz(struct stat *st)
++{
++  if (st == NULL)
++    return false;
+ 
++  if (S_ISREG(st->st_mode)) {
++    st->st_blksize = 32768;
++    return true;
++  }
++  return false;
++}
++
+ int usmb_getattr (const char *filename, struct stat *st)
+ {
+   char *url = make_url (filename);
+@@ -74,6 +85,8 @@
+   if ((0 > ret) || !fix_nlink (url, st))
+     ret = -errno;
+ 
++  change_blksiz(st);
++
+   free (url);
+   return ret;
+ }
+@@ -101,6 +114,8 @@
+       return -errno;
+   }
+ 
++  change_blksiz(st);
++
+   return 0;
+ }
+ 
+@@ -147,8 +162,6 @@
+ int usmb_read (const char *filename UNUSED, char *buff, size_t len, off_t off,
+                struct fuse_file_info *fi)
+ {
+-  assert (32768 >= len);
+-
+   SMBCFILE *file = fd_to_smbcfile (fi->fh);
+   DEBUG (fprintf (stderr, "read (%p, %p, %llu, %lld) ",
+                   (void *)file, buff, (unsigned long long)len, (long 
long)off));
+@@ -178,14 +191,11 @@
+   size_t written = 0;
+   int bytes = 0;
+ 
+-  // No idea whether Windows servers don't like > 32768 byte writes
+-  // (cf. usmb_read), but taking no chances...
+-
+   const smbc_write_fn write_fn = smbc_getFunctionWrite (ctx);
+ 
+   while (written < len)
+   {
+-    bytes = write_fn (ctx, file, (char *)buff, (len > 32768) ? 32768 : len);
++    bytes = write_fn (ctx, file, (char *)buff, len);
+     if (0 > bytes)
+       break;
+ 
+@@ -199,6 +209,30 @@
  
+   DEBUG (fprintf (stderr, "= %d\n", (0 > bytes) ? -errno : (int)written));
+   return (0 > bytes) ? -errno : (int)written;
++}
++
++
 +/* File systems must support mknod on OpenBSD */
 +int usmb_mknod (const char *filename, mode_t mode, __attribute__((unused)) 
dev_t dev)
 +{
@@ -26,9 +91,4 @@ Index: usmb_file.c
 +    smbc_getFunctionClose (ctx) (ctx, file);
 +  free (url);
 +  return ret;
-+}
-+
-+
- int usmb_create (const char *filename, mode_t mode, struct fuse_file_info *fi)
- {
-   char *url = make_url (filename);
+ }

-- 
Kind regards,
Hiltjo

Reply via email to