Control: retitle -1 fuse2fs: please provide fuseext2 interface and transitional package to replace src:fuse-umfuse-ext2
Control: reassign -1 fuse2fs
Control: tags -1 = patch
As discussed on -devel, here's a patch that adds
Package: fuse-ext2
Build-Profiles: <!pkg.e2fsprogs.no-fuse2fs>
Depends: fuse2fs (>= 1.47.1-2), ${misc:Depends}
Section: oldlibs
Description: transitional package
This is a transitional package. It can safely be removed.
and makes fuse2fs
Breaks: fuseext2 (<< 0.4-1.5~)
Replaces: fuseext2 (<< 0.4-1.5~)
and adds
/usr/bin/fuse-ext2
/usr/share/man/man1/fuse-ext2.1
with appropriate links to provide a drop-in replacement
for fuseext2 0.4-1.5 from src:fuse-umfuse-ext2.
I expect the shell script to be functionally equivalent to the option parsing in
https://sources.debian.org/src/fuse-umfuse-ext2/0.4-1.5/fuse-ext2/fuse-ext2.c/
and I'm also attaching an intermediate parser in C which I believe to be identical.
Not that I think it really matters if fuse-ext2 or fuse2fs rejects a
nonexistent image, so long as the ro/rw/rw+/force thing behaves the same,
which it does in both.
Users are encouraged to migrate to fuse2fs in both the manual
and the usage string.
$ debdiff fuse2fs_1.47.1-1_amd64.deb fuse2fs_1.47.1-2_amd64.deb
Files in second .deb but not in first
-------------------------------------
-rw-r--r-- root/root /usr/share/man/man1/fuse-ext2.1.gz
-rwxr-xr-x root/root /usr/bin/fuse-ext2
lrwxrwxrwx root/root /usr/bin/fuseext2 -> fuse-ext2
lrwxrwxrwx root/root /usr/sbin/mount.fuse-ext2 -> ../bin/fuse-ext2
lrwxrwxrwx root/root /usr/sbin/mount.fuseext2 -> mount.fuse-ext2
lrwxrwxrwx root/root /usr/share/man/man1/fuseext2.1.gz -> fuse-ext2.1.gz
lrwxrwxrwx root/root /usr/share/man/man8/mount.fuse-ext2.8.gz -> ../man1/fuse-ext2.1.gz
lrwxrwxrwx root/root /usr/share/man/man8/mount.fuseext2.8.gz -> mount.fuse-ext2.8.gz
$ debdiff fuseext2_0.4-1.5_amd64.deb fuse2fs_1.47.1-2_amd64.deb
Files in second .deb but not in first
-------------------------------------
-rw-r--r-- root/root /usr/share/doc/fuse2fs/changelog.Debian.gz
-rw-r--r-- root/root /usr/share/doc/fuse2fs/copyright
-rw-r--r-- root/root /usr/share/man/man1/fuse2fs.1.gz
-rwxr-xr-x root/root /usr/bin/fuse2fs
Files in first .deb but not in second
-------------------------------------
-rw-r--r-- root/root /usr/share/doc/fuseext2/AUTHORS
-rw-r--r-- root/root /usr/share/doc/fuseext2/README
-rw-r--r-- root/root /usr/share/doc/fuseext2/changelog.Debian.gz
-rw-r--r-- root/root /usr/share/doc/fuseext2/changelog.gz
-rw-r--r-- root/root /usr/share/doc/fuseext2/copyright
/** SPDX-License-Identifier: GPL-2.0-or-later
* adapted from src:fuse-umfuse-ext2 0.4-1.5 fuse-ext2/fuse-ext2.c
*
* Copyright (c) 2008-2010 Alper Akcan <alper.akcan@gmail.com>
* Copyright (c) 2009-2010 Renzo Davoli <renzo@cs.unibo.it>
*/
#include <err.h>
#include <getopt.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
static char * options;
static void append(const char * str) {
if((options = realloc(options, strlen(options ?: "") + 1 + strlen(str) + 1))) {
strcat(options, ",");
strcat(options, str);
}
}
enum sopt { SOPT_VERBATIM = -1, SOPT_RO, SOPT_RW, SOPT_RWPLUS, SOPT_DEBUG, SOPT_SILENT, SOPT_FORCE };
static char * const sopt[] = {[SOPT_RO] = "ro", //
[SOPT_RW] = "rw", //
[SOPT_RWPLUS] = "rw+", //
[SOPT_DEBUG] = "debug", //
[SOPT_SILENT] = "silent", //
[SOPT_FORCE] = "force", //
NULL};
static const struct option lopt[] = {{"options", required_argument, NULL, 'o'}, //
{"help", no_argument, NULL, 'h'},
{"verbose", no_argument, NULL, 'v'},
{}};
int main(int argc, char ** argv) {
bool debug = false, readonly = false, force = false;
for(int c; (c = getopt_long(argc, argv, "o:hv", lopt, NULL)) != -1;)
switch(c) {
case 'o':
append(optarg);
break;
case 'h':
usage:
printf("usage: %s [-hv] [-o ro|force|allow_others[,...]]... device|image mountpoint\n"
"\n"
"Use fuse2fs instead.\n",
argv[0]);
return 9;
case 'v':
/*
* We must handle the 'verbose' option even if
* we don't use it because mount(8) passes it.
*/
debug = true;
break;
default:
return -1;
}
if(argc != optind + 2)
goto usage;
const char * device = argv[optind];
const char * mountpoint = argv[optind + 1];
if(access(device, F_OK))
err(-3, "%s", device);
char * original_options = options ? options + 1 : "";
options = NULL;
char * val;
for(enum sopt o; *original_options && (o = getsubopt(&original_options, sopt, &val));) {
printf("%p\n", val);
printf("%d != %d\n", o , SOPT_VERBATIM);
if(val && o != SOPT_VERBATIM)
errx(-2, "%s: value given but not allowed", sopt[o]);
switch(o) {
case SOPT_RO: /* Read-only mount. */
readonly = true;
break;
case SOPT_RW: /* Read-write mount */
readonly = false;
break;
case SOPT_RWPLUS: /* Read-write mount */
readonly = false;
force = true;
break;
case SOPT_DEBUG: /* enable debug */
debug = true;
append("debug");
break;
case SOPT_SILENT: /* keep silent */
// no-op in this implementation
break;
case SOPT_FORCE: /* enable read/write */
force = true;
break;
case SOPT_VERBATIM: /* Probably FUSE option. */
append(val);
break;
}
}
if(!readonly && !force) {
warnx("Mounting %s Read-Only. Use \'force\' or \'rw+\' options to enable Read-Write mode", device);
readonly = true;
}
append(readonly ? "ro" : "rw");
execl("/usr/bin/fuse2fs", "fuse2fs", device, mountpoint, "-o", options ? options + 1 : "", (char *)NULL);
err(-5, "fuse2fs");
}
From c4e0dcc8a3cea7a8f74251ec93611a92008b764f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Thu, 24 Oct 2024 13:57:11 +0200
Subject: [PATCH] debian: provide fuse-ext2 in fuse2fs. add fuseext2
transitional package (Closes: #1085590)
X-Mutt-PGP: OS
---
debian/control | 11 +++++++
debian/copyright | 40 +++++++++++++++++++++++++
debian/fuse-ext2 | 65 ++++++++++++++++++++++++++++++++++++++++
debian/fuse-ext2.1 | 67 ++++++++++++++++++++++++++++++++++++++++++
debian/fuse2fs.install | 3 ++
debian/fuse2fs.links | 7 +++++
6 files changed, 193 insertions(+)
create mode 100755 debian/fuse-ext2
create mode 100644 debian/fuse-ext2.1
create mode 100644 debian/fuse2fs.links
diff --git a/debian/control b/debian/control
index e641b371..bc582cd8 100644
--- a/debian/control
+++ b/debian/control
@@ -13,12 +13,23 @@ Package: fuse2fs
Build-Profiles: <!pkg.e2fsprogs.no-fuse2fs>
Priority: optional
Depends: ${shlibs:Depends}, ${misc:Depends}
+Breaks: fuseext2 (<< 1.47.1-2~)
+Replaces: fuseext2 (<< 1.47.1-2~)
Architecture: linux-any kfreebsd-any
Description: ext2 / ext3 / ext4 file system driver for FUSE
fuse2fs is a FUSE file system client that supports reading and
writing from devices or image files containing ext2, ext3, and ext4
file systems.
+Package: fuseext2
+Build-Profiles: <!pkg.e2fsprogs.no-fuse2fs>
+Depends: fuse2fs (>= 1.47.1-2), ${misc:Depends}
+Architecture: all
+Priority: optional
+Section: oldlibs
+Description: transitional package
+ This is a transitional package. It can safely be removed.
+
Package: logsave
Priority: optional
Depends: ${shlibs:Depends}, ${misc:Depends}
diff --git a/debian/copyright b/debian/copyright
index 77bd5ea1..1619b1f3 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -21,6 +21,15 @@ Copyright: 2003-2007 Theodore Ts'o <tytso@mit.edu>
1995-1996 Michael Nonweiler <mrn20@cam.ac.uk>
License: GPL-2
+Files: debian/fuse-ext2
+Copyright: 2008-2010 Alper Akcan <alper.akcan@gmail.com>
+ 2009-2010 Renzo Davoli <renzo@cs.unibo.it>
+License: GPL-2+
+
+Files: debian/fuse-ext2.1
+Copyright: 2024 наб <nabijaczleweli@nabijaczleweli.xyz>
+License: 0BSD
+
Files: lib/et/*
lib/ss/*
Copyright: 1987-1988 MIT Student Information Processing Board
@@ -471,6 +480,37 @@ Comment:
On Debian systems, the complete text of the GNU General
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
+License: GPL-2+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program (in the main directory of the fuse-ext2
+ distribution in the file COPYING); if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+Comment:
+ On Debian systems, the complete text of the GNU General
+ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
+
+License: 0BSD
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
License: LGPL-2
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
diff --git a/debian/fuse-ext2 b/debian/fuse-ext2
new file mode 100755
index 00000000..ebd3b8a5
--- /dev/null
+++ b/debian/fuse-ext2
@@ -0,0 +1,65 @@
+#!/bin/sh
+usage() {
+ printf 'usage: %s [-hv] [-o ro|force|allow_others[,...]]... device|image mountpoint\n\nUse fuse2fs instead.\n' "${0##*/}"
+ exit 9
+}
+
+args="$(getopt -o 'hvo:' --long 'help,verbose,options:' -n "${0##*/}" -s 'sh' -- "$@")" || exit
+eval set -- "$args"
+
+original_options=
+readonly=
+force=
+while :; do
+ case "$1" in
+ -o|--options)
+ original_options="$original_options,$2"
+ shift 2
+ ;;
+ -h|--help)
+ usage
+ shift
+ ;;
+ -v|--verbose)
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ esac
+done
+
+[ $# -eq 2 ] || usage
+device="$1"
+mountpoint="$2"
+
+# let fuse2fs check $device
+
+options=
+while [ -n "${original_options#,}" ]; do
+ original_options="${original_options#,}"
+ full="${original_options%%,*}"
+ original_options="${original_options#*,},"
+ case "${full%%=*}" in
+ "ro" ) readonly=y ;; # Read-only mount.
+ "rw" ) readonly= ;; # Read-write mount
+ "rw+" ) readonly=; force=y ;; # Read-write mount
+ "silent") ;; # keep silent
+ "force" ) force=y ;; # enable read/write
+ * ) options="$options,$full"; continue ;;
+ esac
+ [ "$full" = "${full%=*}" ] || {
+ printf '%s: %s: value given but not allowed\n' "${0##*/}" "$full" >&2
+ exit 254
+ }
+done
+
+[ -z "$readonly" ] && [ -z "$force" ] && {
+ printf '%s: Mounting %s Read-Only. Use '\''force'\'' or '\''rw+'\'' options to enable Read-Write mode\n' "${0##*/}" "$device" >&2
+ readonly=y
+}
+
+[ -n "$readonly" ] && options="$options,ro" || options="$options,rw"
+
+exec /usr/bin/fuse2fs "$device" "$mountpoint" -o "${options#,}"
diff --git a/debian/fuse-ext2.1 b/debian/fuse-ext2.1
new file mode 100644
index 00000000..b24ab56e
--- /dev/null
+++ b/debian/fuse-ext2.1
@@ -0,0 +1,67 @@
+.\" SPDX-License-Identifier: 0BSD
+.\"
+.Dd October 24, 2024
+.Dt FUSE-EXT2 1
+.Os fuse2fs
+.
+.Sh NAME
+.Nm fuse-ext2
+.Nd fuse2fs compatibility wrapper
+.Sh SYNOPSIS
+.Nm
+.Op Fl hv
+.Oo Fl o Cm ro Ns \&| Ns Cm force Ns \&| Ns Cm allow_others Ns Oo ,… Oc Oc Ns …
+.Ar device Ns \&| Ns Ar image
+.Ar mountpoint
+.
+.Sh DESCRIPTION
+This wrapper provides the
+.Nm
+interface via
+.Xr fuse2fs 1 ,
+which you should migrate to instead.
+.
+.Sh OPTIONS
+.Bl -tag -compact -width ".Fl o , -options Ar option Ns Op ,…"
+.It Fl h , -help
+Show usage string.
+.
+.It Fl v , -verbose
+Ignored.
+.
+.It Fl o , -options Ar option Ns Op ,…
+.Xr mount.fuse3 8
+options, of which these are handled specially:
+.Bl -tag -compact -offset 4n -width ".Cm silent"
+.It Cm ro
+Mount read-only.
+.
+.It Cm rw
+Mount read-write
+.Em if
+.Cm force
+also given.
+This is the default.
+.
+.It Cm rw+
+Same as
+.Fl o Cm rw , Ns Cm force
+.It Cm silent
+Ignored.
+.It Cm force
+If
+.Cm rw ,
+mount read-write.
+.El
+all other
+.Ar option Ns s
+are forwarded to
+.Nm fuse2fs
+directly.
+.Pp
+If
+.Cm rw
+but not
+.Cm force ,
+the mount is read-only and a warning is issued.
+.El
diff --git a/debian/fuse2fs.install b/debian/fuse2fs.install
index 2ed4c3c0..5ff8792d 100644
--- a/debian/fuse2fs.install
+++ b/debian/fuse2fs.install
@@ -1,2 +1,5 @@
/usr/bin/fuse2fs
/usr/share/man/man1/fuse2fs.1
+
+debian/fuse-ext2 /usr/bin/
+debian/fuse-ext2.1 /usr/share/man/man1/
diff --git a/debian/fuse2fs.links b/debian/fuse2fs.links
new file mode 100644
index 00000000..71cb0b6b
--- /dev/null
+++ b/debian/fuse2fs.links
@@ -0,0 +1,7 @@
+/usr/bin/fuse-ext2 /usr/bin/fuseext2
+/usr/bin/fuse-ext2 /usr/sbin/mount.fuse-ext2
+/usr/sbin/mount.fuse-ext2 /usr/sbin/mount.fuseext2
+
+/usr/share/man/man1/fuse-ext2.1 /usr/share/man/man1/fuseext2.1
+/usr/share/man/man1/fuse-ext2.1 /usr/share/man/man8/mount.fuse-ext2.8
+/usr/share/man/man8/mount.fuse-ext2.8 /usr/share/man/man8/mount.fuseext2.8
--
2.39.2
Attachment:
signature.asc
Description: PGP signature