Jump to content

ReiserFS Support (Read-only for now)


d11wtq
 Share

11 posts in this topic

Recommended Posts

I'm just looking at what BSD are doing to port ReiserFS support to BSD. The source is extremely small so I'm hoping that it can be ported to OS X. I for one have a few Linux drives which I cannot read from within OSx86 so this is something I'm desparate for.

 

I'll have a stab at the myself but I'm not a C developer, although I can do little bits so it may take me a long time and be scrappy/wrong.

 

I have the docs from developer.apple about porting *UNIX* apps to OS X (yes, yes I know) so I'm hoping most of the principles still apply to BSD.

 

The required source (unless I'm wrong), is:

 

mount_reiserfs.c

/*-
* Copyright (c) 2005 Jean-S?bastien P?dron
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*	notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*	notice, this list of conditions and the following disclaimer in the
*	documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD: src/sbin/mount_reiserfs/mount_reiserfs.c,v 1.3 2005/06/10 09:51:42 delphij Exp $
*/

#include <sys/param.h>
#include <sys/mount.h>
#include <sys/uio.h>

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>

#include "mntopts.h"

struct mntopt mopts[] = {
	MOPT_STDOPTS,
	MOPT_END
};

void	usage(void);

int
main(int argc, char *argv[])
{
	struct iovec *iov;
	int ch, mntflags, iovlen;
	char *dev, *dir, mntpath[MAXPATHLEN];

	mntflags = 0;
	while ((ch = getopt(argc, argv, "o:")) != -1) {
			switch(ch) {
			case 'o':
					getmntopts(optarg, mopts, &mntflags, 0);
					break;
			case '?':
			default:
					usage();
			}
	}
	argc -= optind;
	argv += optind;

	if (argc != 2)
			usage();

	dev = argv[0];
	dir = argv[1];

	/*
	 * Resolve the mountpoint with realpath(3) and remove unnecessary
	 * slashes from the devicename if there are any.
	 */
	(void)checkpath(dir, mntpath);
	(void)rmslashes(dev, dev);

	/* Read-only support for now */
	mntflags |= MNT_RDONLY;

	/* Prepare the options vector for nmount(). build_iovec() is declared
	 * in mntopts.h. */
	iov = NULL;
	iovlen = 0;
	build_iovec(&iov, &iovlen, "fstype", "reiserfs", -1);
	build_iovec(&iov, &iovlen, "fspath", mntpath, -1);
	build_iovec(&iov, &iovlen, "from", dev, -1);

	if (nmount(iov, iovlen, mntflags) < 0)
			err(EX_OSERR, "%s", dev);

	exit(0);
}

void
usage(void)
{
	fprintf(stderr,
		"usage: mount_reiserfs [-o options] special node\n");
	exit(EX_USAGE);
}

 

mntopts.h

/*	  $NetBSD: mntopts.h,v 1.7 2006/02/12 01:32:06 chs Exp $  */

/*-
* Copyright (c) 1994
*	  The Regents of the University of California.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*	notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*	notice, this list of conditions and the following disclaimer in the
*	documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
*	may be used to endorse or promote products derived from this software
*	without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*	  @(#)mntopts.h   8.7 (Berkeley) 3/29/95
*/
#ifndef _MNTOPTS_H_
#define _MNTOPTS_H_

struct mntopt {
	const char *m_option;   /* option name */
	int m_inverse;		  /* if a negative option, eg "dev" */
	int m_flag;			 /* bit to set, eg. MNT_RDONLY */
	int m_altloc;		   /* 1 => set bit in altflags */
};

/* User-visible MNT_ flags. */
#define MOPT_ASYNC			  { "async",	  0, MNT_ASYNC, 0 }
#define MOPT_NOCOREDUMP		 { "coredump",   1, MNT_NOCOREDUMP, 0 }
#define MOPT_NODEV			  { "dev",		1, MNT_NODEV, 0 }
#define MOPT_NODEVMTIME		 { "devmtime",   1, MNT_NODEVMTIME, 0 }
#define MOPT_NOEXEC			 { "exec",	   1, MNT_NOEXEC, 0 }
#define MOPT_NOSUID			 { "suid",	   1, MNT_NOSUID, 0 }
#define MOPT_RDONLY			 { "rdonly",	 0, MNT_RDONLY, 0 }
#define MOPT_SYNC			   { "sync",	   0, MNT_SYNCHRONOUS, 0 }
#define MOPT_UNION			  { "union",	  0, MNT_UNION, 0 }
#define MOPT_USERQUOTA		  { "userquota",  0, 0, 0 }
#define MOPT_GROUPQUOTA		 { "groupquota", 0, 0, 0 }
#define MOPT_NOATIME			{ "atime",	  1, MNT_NOATIME, 0 }
#define MOPT_SYMPERM			{ "symperm",	0, MNT_SYMPERM, 0 }
#define MOPT_SOFTDEP			{ "softdep",	0, MNT_SOFTDEP, 0 }
#define MOPT_IGNORE			 { "hidden",	 0, MNT_IGNORE, 0 }

/* Control flags. */
#define MOPT_FORCE			  { "force",	  0, MNT_FORCE, 0 }
#define MOPT_UPDATE			 { "update",	 0, MNT_UPDATE, 0 }
#define MOPT_RELOAD			 { "reload",	 0, MNT_RELOAD, 0 }
#define MOPT_GETARGS			{ "getargs",	0, MNT_GETARGS, 0 }

/* Support for old-style "ro", "rw" flags. */
#define MOPT_RO				 { "ro",		 0, MNT_RDONLY, 0 }
#define MOPT_RW				 { "rw",		 1, MNT_RDONLY, 0 }

/* This is parsed by mount(8), but is ignored by specific mount_*(8)s. */
#define MOPT_AUTO			   { "auto",	   0, 0, 0 }

#define MOPT_FSTAB_COMPAT											   \
	MOPT_RO,														\
	MOPT_RW,														\
	MOPT_AUTO

/* Standard options which all mounts can understand. */
#define MOPT_STDOPTS													\
	MOPT_USERQUOTA,												 \
	MOPT_GROUPQUOTA,												\
	MOPT_FSTAB_COMPAT,											  \
	MOPT_NOCOREDUMP,												\
	MOPT_NODEV,													 \
	MOPT_NOEXEC,													\
	MOPT_NOSUID,													\
	MOPT_RDONLY,													\
	MOPT_UNION,													 \
	MOPT_IGNORE,													\
	MOPT_SYMPERM

__BEGIN_DECLS
typedef struct mntoptparse *mntoptparse_t;
mntoptparse_t getmntopts(const char *, const struct mntopt *, int *, int *);
const char *getmntoptstr(mntoptparse_t, const char *);
long getmntoptnum(mntoptparse_t, const char *);
void freemntopts(mntoptparse_t);

extern int getmnt_silent;
__END_DECLS

#endif /* _MNTOPTS_H_ */

 

If anyone wants to help me out, or wants to tell me I'm going about this all wrong do so please :D

 

Thanks,

 

d11

Link to comment
Share on other sites

*Yawn*

 

I'm going to bed cos I'm really tired but I've worked on this a bit tonight. The code I posted above is a little old and the include is the wrong one :( Got the newer ones now though. Had to do a bit of hacking at the code just to get the thing to compile with gcc ... I keep getting undefined symbol errors from the linker even though, as far as I can see, they're defined fine. From what I've read on Google this happens a lot when porting apps to OS X and people have worked around it by passing various flags to gcc. When I run it with "-undefined define_a_way" I get an executable out OK... it runs but whatever options I seem to pass to it I just get "Bus Error". I'll pick this up tomorrow.

Link to comment
Share on other sites

It would be great if you or someone can get this to work with R/W. So then we can format our spare disk or partition in ReiserFS. Windows has an application that will mount this type of fs so this would aliminate the 4gig size limit using Fat.

Link to comment
Share on other sites

  • 10 months later...
  • 3 months later...

I work on it :)

 

I have just one problem with the nmount(), wich is not in Mac OS X.

 

more soon :P

Link to comment
Share on other sites

Hmm, why not. I will look how to make a Fuse driver:)

Link to comment
Share on other sites

  • 2 months later...
  • 1 year later...
  • 3 months later...

Since i could not find working reiserfs driver for osx, i used minimalistic linux distribution (arch in my case) in vmware, mounted my reiserfs external disks in it, and shared them via samba to osx host. Now i'm able to use my files from reiserfs disks...

Link to comment
Share on other sites

 Share

×
×
  • Create New...