#include <unistd.h>
#include <mntopts.h>
#include <syslog.h>
#include <CoreFoundation/CoreFoundation.h>
#include <NetFS/URLMount.h>
#define ALT_SOFT 0x00000001
static const struct mntopt mopts_std[] = {
MOPT_STDOPTS,
{ "soft", 0, ALT_SOFT, 1 },
{ NULL, 0, 0, 0 }
};
static void usage(void);
int
main(int argc, char **argv)
{
int c;
uint32_t urlmount_flags;
mntoptparse_t mp;
int flags, altflags;
CFURLRef URL;
CFStringRef mountdir_CFString;
CFArrayRef mountpoints;
int res;
urlmount_flags = kMountAtMountdir | kSuppressAllUI;
while ((c = getopt(argc, argv, "o:rw")) != -1) {
switch (c) {
case 'o':
flags = altflags = 0;
getmnt_silent = 1;
mp = getmntopts(optarg, mopts_std, &flags, &altflags);
freemntopts(mp);
if (flags & MNT_AUTOMOUNTED)
urlmount_flags |= kMarkAutomounted;
if (flags & MNT_DONTBROWSE)
urlmount_flags |= kMarkDontBrowse;
if (flags & MNT_NOSUID)
urlmount_flags |= kNoSetUID;
if (flags & MNT_NODEV)
urlmount_flags |= kNoDevices;
if (flags & MNT_RDONLY)
urlmount_flags |= kReadOnlyMount;
if (flags & MNT_QUARANTINE)
urlmount_flags |= kQuarantine;
if (altflags & ALT_SOFT)
urlmount_flags |= kSoftMount;
break;
case 'r':
urlmount_flags |= kReadOnlyMount;
break;
case 'w':
urlmount_flags &= ~kReadOnlyMount;
break;
case '?':
default:
usage();
break;
}
}
argc -= optind;
argv += optind;
if (argc != 2)
usage();
URL = CFURLCreateWithBytes(kCFAllocatorDefault, (const UInt8 *)argv[0],
strlen(argv[0]), kCFStringEncodingUTF8, NULL);
if (URL == NULL)
exit(ENOMEM);
mountdir_CFString = CFStringCreateWithCString(kCFAllocatorDefault,
argv[1], kCFStringEncodingUTF8);
if (mountdir_CFString == NULL)
exit(ENOMEM);
res = netfs_MountURLDirectSync(URL, NULL, NULL, mountdir_CFString,
urlmount_flags, &mountpoints);
CFRelease(mountdir_CFString);
CFRelease(URL);
if (res == 0)
CFRelease(mountpoints);
else {
if ((res & 0xFFFFFF00) != 0) {
syslog(LOG_ERR,
"mount_url: Mount of %s on %s gives status %d",
argv[0], argv[1], res);
switch (res) {
case ENETFSACCOUNTRESTRICTED:
case ENETFSPWDNEEDSCHANGE:
case ENETFSPWDPOLICY:
res = EAUTH;
break;
default:
res = EIO;
break;
}
}
}
exit(res);
}
static void
usage(void)
{
fprintf(stderr, "Usage: mount_url [-rw] [-o options] url node\n");
exit(1);
}