/*
* Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
* Reserved. This file contains Original Code and/or Modifications of
* Original Code as defined in and that are subject to the Apple Public
* Source License Version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. Please obtain a copy of the
* License at http://www.apple.com/publicsource and read it before using
* this file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License."
*
* @APPLE_LICENSE_HEADER_END@
*/
#import "FileMap.h"
#import "Controller.h"
#import "AMVnode.h"
#import "Server.h"
#import "AMString.h"
#import "automount.h"
#import "log.h"
#import <stdio.h>
#import <stdlib.h>
#import <unistd.h>
#import <errno.h>
#import <string.h>
#import <syslog.h>
#import <sys/mount.h>
@implementation FileMap
- (void)newMount:(String *)src dir:(String *)dst opts:(Array *)opts vfsType:(String *)type
{
String *servername, *serversrc;
Vnode *v;
Server *server;
serversrc = [src postfix:':'];
if (serversrc == nil) return;
servername = [src prefix:':'];
if (servername == nil)
{
[serversrc release];
return;
}
server = [controller serverWithName:servername];
if (server == nil)
{
[servername release];
return;
}
if ([server isLocalHost])
{
[serversrc release];
serversrc = [String uniqueString:"/"];
}
if (![self acceptOptions:opts])
{
sys_msg(debug, LOG_DEBUG, "Rejected options for [src value], [dst value]);
[servername release];
[serversrc release];
return;
}
v = [self createVnodePath:dst from:root];
if ([v type] == NFLNK)
{
/* mount already exists - do not override! */
[servername release];
[serversrc release];
return;
}
[v setType:NFLNK];
[v setServer:server];
[v setSource:serversrc];
[v setVfsType:type];
[v setupOptions:opts];
[servername release];
[serversrc release];
[self setupLink:v];
}
- (void)loadMounts
{
FILE *fp;
char line[1024], cloc[1024], copts[1024], csrc[1024];
String *src, *loc, *opts;
Array *options;
int n;
if (dataStore == nil) return;
fp = fopen([dataStore value], "r");
if (fp == NULL)
{
sys_msg(debug, LOG_ERR, " return;
}
sys_msg(debug_proc, LOG_DEBUG, " FileMap/loadMounts: reading
while (fgets(line, 1024, fp) != NULL)
{
n = sscanf(line, " if ((n < 2) || (n > 3))
{
sys_msg(debug, LOG_ERR, "Bad input line in map [dataStore value], line);
continue;
}
loc = [String uniqueString:cloc];
if (n == 3)
{
opts = [String uniqueString:copts];
src = [String uniqueString:csrc];
}
else
{
/* n == 2 */
opts = [String uniqueString:""];
src = [String uniqueString:copts];
}
options = [opts explode:','];
[self newMount:src dir:loc opts:options vfsType:nil];
[src release];
[loc release];
[opts release];
[options release];
}
fclose(fp);
}
@end