Jump to content

ReiserFS Support (Read-only for now)


  • Please log in to reply
10 replies to this topic

#1
d11wtq

d11wtq

    InsanelyMac Protégé

  • Members
  • Pip
  • 35 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

#2
d11wtq

d11wtq

    InsanelyMac Protégé

  • Members
  • Pip
  • 35 posts
*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.

#3
domino

domino

    Retired

  • Members
  • PipPipPipPipPipPipPipPipPipPip
  • 1,958 posts
  • Gender:Male
  • Location:/tmp
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.

#4
crazyJAT

crazyJAT

    InsanelyMac Sage

  • Members
  • PipPipPipPipPip
  • 298 posts
  • Gender:Male
  • Location:US
Been almost a year. Any progress here?

#5
AiFiLTr0

AiFiLTr0

    InsanelyMac Protégé

  • Members
  • Pip
  • 9 posts
  • Gender:Male
Any progress?

#6
webs

webs

    InsanelyMac Protégé

  • Just Joined
  • Pip
  • 2 posts
  • Gender:Male
  • Location:Paris, France.
  • Interests:Internet, Ruby, Ruby on Rails, Camping (the macro framework), Mac OS X, Linux/Gentoo, IRC, devel...
I work on it :)

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

more soon :P

#7
OoOoOoO

OoOoOoO

    InsanelyMac Geek

  • Members
  • PipPipPipPip
  • 222 posts
maybe it's will be easy to make fuse driver?
as example - ext2fuse

#8
webs

webs

    InsanelyMac Protégé

  • Just Joined
  • Pip
  • 2 posts
  • Gender:Male
  • Location:Paris, France.
  • Interests:Internet, Ruby, Ruby on Rails, Camping (the macro framework), Mac OS X, Linux/Gentoo, IRC, devel...
Hmm, why not. I will look how to make a Fuse driver:)

#9
Corwin06

Corwin06

    InsanelyMac Protégé

  • Members
  • Pip
  • 8 posts
Bump! Any news? I'm going to need to buy a new HD just to move data around without a ReiserFS driver. Maybe I can help?

#10
albertz

albertz

    InsanelyMac Protégé

  • Members
  • Pip
  • 9 posts
I am just curious, what is the state here?

#11
DVSoftware

DVSoftware

    InsanelyMac Protégé

  • Members
  • Pip
  • 25 posts
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...





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

© 2014 InsanelyMac  |   News  |   Forum  |   Downloads  |   OSx86 Wiki  |   Mac Netbook  |   PHP hosting by CatN  |   Designed by Ed Gain  |   Logo by irfan  |   Privacy Policy