编写定义方法

本文描述了定义设备方法的工作方式。 它还建议程序员编写自己的 Define 设备配置方法的准则。

语法

defDev -c Class -s SubClass -t Type [ -p Parent -w Connection ] [ -l Name ]

描述

"定义" 方法负责在 "定制" 数据库中创建定制设备。 它通过将设备的对象添加到定制设备 (CuDv) 对象类来执行此操作。 "定义" 方法由 姆杰夫 配置命令,节点配置程序或正在检测和定义子设备的设备的 配置方法 调用。

"定义" 方法使用作为输入提供的信息以及预定义数据库中的信息来填充 CuDv 对象。 如果该方法是为了支持单个设备而编写的,那么它可以忽略类,子类和类型选项。 相反,如果该方法支持多个设备,那么可能需要使用这些选项来获取要定制的设备类型的 PdDv 设备对象

按照约定, "定义" 方法的名称的前三个字符应该是 定义。 名称的其余部分 (开发) 可以是任何字符,这些字符标识使用该方法的设备或设备组,但受操作系统文件名限制的限制。

标志

描述
-c 指定正在定义的设备的类。 需要类,子类和类型来标识要为其创建定制设备实例的预定义设备 (PdDv) 对象类中的预定义设备对象。
-s SubClass 指定正在定义的设备的子类。 需要类,子类和类型来标识要为其创建定制设备实例的 PdDv 对象类中的预定义设备对象。
-t 类型 指定正在定义的设备的类型。 需要类,子类和类型来标识要为其创建定制设备实例的 PdDv 对象类中的预定义设备对象。
-p 父级 指定父级设备的逻辑名。 对于连接到父设备的设备,此逻辑名是必需的。 此选项不适用于不具有父设备的设备; 例如,大多数伪设备。
-w 连接 指定设备连接到父级的位置。 此选项仅适用于连接到父级设备的设备。
-l 名称 姆杰夫 命令传递,如果调用该命令的用户正在定义新设备并希望选择该设备的名称,那么指定该设备的名称。 "定义" 方法将此名称指定为定制设备 (CuDv) 对象中设备的逻辑名 (如果该名称尚未使用)。 如果未指定此选项,那么 "定义" 方法将为设备生成名称。 并非所有设备都支持或需要支持此选项。

编写定义方法的准则

此任务列表旨在充当编写 "定义" 方法的准则。 在为特定设备编写方法时,可能会省略一些任务。 例如,如果设备没有父级,那么不需要包括所有父级和连接验证任务。 此外,设备可能具有未在这些任务中列出的特殊需求。

Define 方法必须:

  1. 验证输入参数。 通常,对调用子设备定义方法的 Configure 方法进行编码,以传递子设备定义方法所期望的选项。 但是, 姆杰夫 命令始终传递类,子类和类型选项,而仅将基于用户输入的其他选项传递到 姆杰夫 命令。 因此, "定义" 方法可能需要确保它需要的所有选项都已提供。 例如,如果 "定义" 方法期望所定义设备的父代和连接选项,那么必须确保提供这些选项。 此外,如果提供了 -我 名称规范选项,那么不支持该选项的 Define 方法将退出并返回错误。
  2. 使用 odm_initialize 子例程初始化对象数据管理器 (ODM) ,并使用 odm_lock 子例程锁定配置数据库。 以下代码片段说明了此过程:
    #include <cf.h>
     
    if (odm_initialize() < 0)
            exit(E_ODMINIT);         /* initialization failed */
     
    if (odm_lock("/etc/objrepos/config_lock",0) == -1) {
            odm_terminate();
            exit(E_ODMLOCK);        /* database lock failed */
    }
  3. 检索要定义的设备类型的预定义 PdDv 对象。 这是通过从 PdDv 对象类获取对象来完成的,该对象类的类,子类和类型描述符与提供给定义方法的类,子类和类型选项相匹配。 如果找不到匹配项,那么 "定义" 方法将退出并返回错误。 将从 PdDv 设备对象获取信息,以便创建 CuDv 设备对象。
  4. 请确保父设备存在。 如果正在定义的设备连接到父设备,并且已提供父设备的名称,那么 "定义" 方法必须确保指定的设备实际存在。 它通过检索其 "设备名" 描述符与使用 -p 标志提供的父设备的名称相匹配的 CuDv 对象来执行此操作。 如果找不到匹配项,那么 "定义" 方法将退出并返回错误。
  5. 如果设备具有父设备并且该父设备存在于 CuDv 对象类中,请验证正在定义的设备是否可以连接到指定的父设备。 要执行此操作,请从预定义连接 (PdCn) 对象类中检索预定义连接对象,该对象类的唯一类型,连接键和连接位置描述符与上一步中获取的父代 CuDv 对象的预定义设备对象类描述符的链接相匹配,并将子类和连接选项分别输入到 "定义" 方法中。 如果找不到匹配项,那么将指定无效连接。 发生这种情况的原因可能是,指定的父设备不是中间设备,不接受正在定义的设备类型 (如子类所述) ,或者没有连接选项所标识的连接位置。
  6. 将逻辑名分配给设备。 每个新分配的逻辑名必须对系统唯一。 如果已使用 -我 标志提供名称,请确保该名称是唯一的,然后再将其分配给设备。 通过检查 CuDv 对象类以查找其 "设备名" 描述符与所需名称匹配的任何对象来完成此操作。 如果找到匹配项,那么已使用该名称,并且 "定义" 方法必须退出并返回错误。

    如果定义方法要生成名称,那么它可以通过从设备的 PdDv 设备对象的前缀名称描述符获取前缀名称,并调用 genseq 子例程来获取此前缀的唯一序号来执行此操作。 将序号附加到前缀名称后,会产生唯一名称。 genseq 例程在 CuDv 对象类中进行查找,以确保它分配未与指定前缀一起使用的序号来构成设备名。

    在某些情况下, "定义" 方法可能需要确保只定义了一个特定类型的设备。 例如,只能有一个在 CuDv 对象类中定制的 pty 设备。 pty 定义方法通过查询 CuDv 对象类来执行此操作,以查看设备是否具有名称pty0。 如果是,那么表示已经定义了 pty 设备。 否则, "定义" 方法将继续使用名称 pty0来定义 pty 设备。

  7. 确定设备的位置码。 如果正在定义的设备是物理设备,那么它具有位置码。
  8. 创建新的 CuDv 对象。

    按如下所示设置 CuDv 对象描述符:

    描述信息 设置
    设备名 请使用步骤 6 中确定的名称。
    设备状态标志 设置为 "已定义" 状态。
    更改状态标志 设置为与在设备的 PdDv 对象中的 "更改状态标志" 描述符中找到的值相同的值。
    设备驱动程序实例 设置为与设备的 PdDv 对象中的 "设备驱动程序名称" 描述符相同的值。 此值稍后可由 "配置" 方法使用。
    设备位置码 如果设备不具有位置码,那么设置为空字符串。 否则,请将其设置为计算的值。
    父设备逻辑名 如果设备没有父级,那么设置为空字符串。 否则,请将此描述符设置为父选项指定的父名称。
    父设备上连接的位置 如果设备没有父级,那么设置为空字符串。 否则,将此描述符设置为连接选项指定的值。
    指向预定义设备对象类的链接 设置为从设备的 PdDv 对象的唯一类型描述符获取的值。
  9. 将设备的名称写至标准输出。 如果其他方法将设备名称写入标准输出,那么应该在设备名称后面追加一个空格以用作分隔符。 调用 "定义" 方法的 姆杰夫 命令或 "配置" 方法将拦截标准输出以获取分配给设备的设备名。
  10. 关闭所有对象类并终止 ODM。 如果没有错误,那么退出并返回退出代码 0。