# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License. 

# Depends upon core.schema and cosine.schema

# OID Base is 1.3.6.1.4.1.2312.4
#
# Attribute types are under 1.3.6.1.4.1.2312.4.1
# Object classes are under 1.3.6.1.4.1.2312.4.2
# Syntaxes are under 1.3.6.1.4.1.2312.4.3

# Attribute Type Definitions

attributetype ( 1.3.6.1.4.1.2312.4.1.2 NAME 'automountInformation'
	DESC 'Information used by the autofs automounter'
	EQUALITY caseExactMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

# malformed: superior top and class type STRUCTURAL were in front of DESC
objectclass ( 1.3.6.1.4.1.2312.4.2.3 NAME 'automount'
	DESC 'An entry in an automounter map'
	SUP top STRUCTURAL
	MUST ( cn $ automountInformation )
	MAY ( description ) )

# malformed: superior top and class type STRUCTURAL were in front of DESC
objectclass ( 1.3.6.1.4.1.2312.4.2.2 NAME 'automountMap'
	DESC 'An group of related automount objects'
	SUP top STRUCTURAL
	MUST ( ou ) )
