83 lines
1.7 KiB
C
83 lines
1.7 KiB
C
// File created by Gigaset Elements GmbH
|
|
// All rights reserved.
|
|
#include "libbb.h"
|
|
#include "xmount.h"
|
|
|
|
#ifdef __linux__
|
|
|
|
/* xmount and xumount short-circuited to mount and umount2 in xmount.h */
|
|
|
|
#elif defined(__FreeBSD_kernel__)
|
|
|
|
static void build_iovec(struct iovec **iov, int *iovlen, const char *name,
|
|
void *val, size_t len)
|
|
{
|
|
int i;
|
|
|
|
if (*iovlen < 0)
|
|
return;
|
|
i = *iovlen;
|
|
*iov = realloc(*iov, sizeof **iov * (i + 2));
|
|
if (*iov == NULL) {
|
|
*iovlen = -1;
|
|
return;
|
|
}
|
|
(*iov)[i].iov_base = strdup(name);
|
|
(*iov)[i].iov_len = strlen(name) + 1;
|
|
i++;
|
|
(*iov)[i].iov_base = val;
|
|
if (len == (size_t)-1) {
|
|
if (val != NULL)
|
|
len = strlen(val) + 1;
|
|
else
|
|
len = 0;
|
|
}
|
|
(*iov)[i].iov_len = (int)len;
|
|
*iovlen = ++i;
|
|
}
|
|
|
|
int FAST_FUNC xmount(const char *source, const char *target,
|
|
const char *filesystemtype, unsigned long mountflags,
|
|
const void *data UNUSED_PARAM)
|
|
{
|
|
struct iovec *iov = NULL;
|
|
int iovlen = 0;
|
|
char *fspath /*, *from*/;
|
|
int ret;
|
|
|
|
fspath = realpath(target, NULL);
|
|
/* from = realpath(source, NULL); -- think `nodev' here */
|
|
|
|
build_iovec(&iov, &iovlen, "fstype", (void*)filesystemtype, (size_t)-1);
|
|
build_iovec(&iov, &iovlen, "fspath", fspath, (size_t)-1);
|
|
if (!strcmp(filesystemtype, "nullfs"))
|
|
/* nullfs uses a "target" instead of "from" */
|
|
build_iovec(&iov, &iovlen, "target", source, (size_t)-1);
|
|
else
|
|
build_iovec(&iov, &iovlen, "from", source, (size_t)-1);
|
|
|
|
ret = nmount(iov, iovlen, mountflags);
|
|
|
|
/*free(from);*/
|
|
free(fspath);
|
|
|
|
return ret;
|
|
}
|
|
|
|
int FAST_FUNC xumount(const char *target, int flags)
|
|
{
|
|
return unmount(target, flags);
|
|
}
|
|
|
|
int FAST_FUNC xswapon(const char *path, int swapflags UNUSED_PARAM)
|
|
{
|
|
return swapon(path);
|
|
}
|
|
|
|
int FAST_FUNC xswapoff(const char *path)
|
|
{
|
|
return swapoff(path);
|
|
}
|
|
|
|
#endif
|