mount_cd9660: change to FreeBSD-like behaviour.
authorAlexander Polakov <polachok@gmail.com>
Sat, 12 Sep 2009 17:09:17 +0000 (21:09 +0400)
committerAlexander Polakov <polachok@gmail.com>
Sat, 12 Sep 2009 17:18:45 +0000 (21:18 +0400)
 * fix a segfault
 * change -L to -C
 * add -C to manpage

Reported-by: Simon Schubert
Dragonfly-bug: http://bugs.dragonflybsd.org/issue1501

sbin/mount_cd9660/mount_cd9660.8
sbin/mount_cd9660/mount_cd9660.c

index 26d6efe..c77191a 100644 (file)
@@ -126,6 +126,10 @@ It is possible to mount an arbitrary session of a multi-session CD by specifying
 the correct
 .Ar startsector
 here.
+.It Fl C Ar charset
+Specify local
+.Ar charset
+to convert Unicode file names when using Joliet extensions.
 .It Fl v
 Be verbose about the starting sector decisions made.
 .El
index 1e68732..e996209 100644 (file)
@@ -86,15 +86,13 @@ main(int argc, char **argv)
        char *dev, *dir, mntpath[MAXPATHLEN];
        struct vfsconf vfc;
        int error, verbose;
-       char *csp;
        const char *quirk;
        char *cs_local = NULL;
-        char *cs_disk = NULL;
 
        mntflags = opts = verbose = 0;
        memset(&args, 0, sizeof args);
        args.ssector = -1;
-       while ((ch = getopt(argc, argv, "begjo:rs:L:v")) != -1)
+       while ((ch = getopt(argc, argv, "begjo:rs:C:v")) != -1)
                switch (ch) {
                case 'b':
                        opts |= ISOFSMNT_BROKENJOLIET;
@@ -108,14 +106,11 @@ main(int argc, char **argv)
                case 'j':
                        opts |= ISOFSMNT_NOJOLIET;
                        break;
-               case 'L':
-                       if (setlocale(LC_CTYPE, optarg) == NULL)
-                                err(EX_CONFIG, "%s", optarg);
-                        csp = strchr(optarg,'.');
-                        if (!csp)
-                                err(EX_CONFIG, "%s", optarg);
-                        quirk = kiconv_quirkcs(csp + 1, KICONV_VENDOR_MICSFT);
-                        cs_local = strdup(quirk);
+               case 'C':
+                       quirk = kiconv_quirkcs(optarg, KICONV_VENDOR_MICSFT);
+                       cs_local = strdup(quirk);
+                       if (set_charset(&args, cs_local, NULL) == -1)
+                               err(EX_OSERR, "cd9660_iconv");
                        opts |= ISOFSMNT_KICONV;
                        break;
                case 'o':
@@ -160,9 +155,6 @@ main(int argc, char **argv)
        args.export.ex_root = DEFAULT_ROOTUID;
        args.flags = opts;
 
-       if (set_charset(&args, cs_local, cs_disk) == -1)
-               err(EX_OSERR, "msdos_iconv");
-
        if (args.ssector == -1) {
                /*
                 * The start of the session has not been specified on
@@ -227,7 +219,7 @@ static void
 usage(void)
 {
        fprintf(stderr,
-           "usage: mount_cd9660 [-egrv] [-o options] [-s startsector] special node\n");
+           "usage: mount_cd9660 [-egrv] [-C charset] [-o options] [-s startsector] special node\n");
        exit(EX_USAGE);
 }