Date: Wed, 2 Feb 2005 16:23:07 +0100 From: Ruben de Groot <mail25@bzerk.org> To: FreeBSD Questions <freebsd-questions@freebsd.org> Subject: Re: library call for directory path creation? Message-ID: <20050202152307.GA62361@ei.bzerk.org> In-Reply-To: <20050201213920.GE71726@keyslapper.net> References: <20050201193507.GD71726@keyslapper.net> <200502011258.59704.reso3w83@verizon.net> <20050201213920.GE71726@keyslapper.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 01, 2005 at 04:39:21PM -0500, Louis LeBlanc typed:
> On 02/01/05 12:58 PM, Michael C. Shultz sat at the `puter and typed:
> > On Tuesday 01 February 2005 11:35 am, Louis LeBlanc wrote:
> > > I know there might be a better place for this question, but here
> > > goes.
> > >
> > > I'm working on a utility that has to, among many other things, create
> > > directory paths, often with a series of parent directories that may
> > > not already exist. Solaris has mkdirp(3GEN) in the libgen library,
> > > but I can't find a library call that will do this in FreeBSD. Kind
> > > of like `mkdir -p` would.
> > >
> > > I know it would be pretty trivial to roll my own, and if I can't find
> > > it I will. I'm just curious if anyone knows of an *existing* library
> > > call that would do this.
> > >
> > > TIA
> > > Lou
> >
> > Assuming your working in C what is wrong with:
> >
> > char command[] = "mkdir -p /path/to/whatever";
> >
> > system( command );
>
> Nothing, except that calling a system command from C when you can roll
> your own method in about 18 lines of code is usually not ideal.
> Particularly when speed is important. And yes, it is definitely
> important - disk access can be an insurmountable bottleneck for high
> volume systems if it is neglected at the implemenation stage.
>
> I only wanted a system lib call because I trust FreeBSDs implementation
> to be faster than my quick throw together.
>
> I've already written it. It's not pretty, and probably not as fast as a
> system lib would be (it has to make 1 system call per directory in the
> path, rather than just one system call for the whole path). It is,
> however, much faster than a call to system() would be.
Actually, the mkdirp(3GEN) library routine in Solaris probably makes the
same amount of system calls as your implementation:
> uname -sr
SunOS 5.9
> cat mkdirp.c
#include <libgen.h>
#include <sys/stat.h>
#define path "/tmp/a/b/c/d"
int main(void) {
mkdirp(path,S_IRWXU);
}
> gcc -lgen -o mkdirp mkdirp.c
> truss ./mkdirp |& tail -10
mkdir("/tmp/a/b/c/d", 0700) Err#2 ENOENT
access("/tmp/a/b/c", 0) Err#2 ENOENT
access("/tmp/a/b", 0) Err#2 ENOENT
access("/tmp/a", 0) Err#2 ENOENT
access("/tmp", 0) = 0
mkdir("/tmp/a", 0700) = 0
mkdir("/tmp/a/b", 0700) = 0
mkdir("/tmp/a/b/c", 0700) = 0
mkdir("/tmp/a/b/c/d", 0700) = 0
_exit(-13163152)
cheers,
Ruben
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050202152307.GA62361>
