Escribir un método de definición

Este artículo describe cómo funciona un método Definir dispositivo. También sugiere directrices para los programadores que escriben sus propios métodos de configuración de dispositivos de definición.

Sintaxis

defDev -c Clase -s SubClass -t Tipo [ -p Padre -w Conexión ] [ -l Nombre ]

Descripción

El método Define es responsable de crear un dispositivo personalizado en la base de datos personalizada. Lo hace añadiendo un objeto para el dispositivo en la clase de objeto Dispositivos personalizados (CuDv). El método Define se invoca mediante el mandato de configuración de mkdev , mediante un programa de configuración de nodo o mediante el Configurar método de un dispositivo que está detectando y definiendo dispositivos hijo.

El método Define utiliza la información proporcionada como entrada, así como la información de la base de datos predefinida, para rellenar el objeto CuDv . Si el método se escribe para dar soporte a un único dispositivo, puede ignorar las opciones de clase, subclase y tipo. Por el contrario, si el método da soporte a varios dispositivos, es posible que tenga que utilizar estas opciones para obtener el objeto de dispositivoPdDv para el tipo de dispositivo que se está personalizando.

Por convenio, los tres primeros caracteres del nombre del método Define deben ser def. El resto del nombre (Desarrollo) puede ser cualquier carácter que identifique el dispositivo o grupo de dispositivos que utilizan el método, sujeto a restricciones de nombre de archivo del sistema operativo.

Distintivos

Elemento Descripción
C. Clase Especifica la clase del dispositivo que se está definiendo. La clase, subclase y tipo son necesarios para identificar el objeto Dispositivo predefinido en la clase de objeto Dispositivo predefinido (PdDv) para la que se va a crear una instancia de dispositivo personalizada.
-s SubClass Especifica la subclase del dispositivo que se está definiendo. Se necesitan clase, subclase y tipo para identificar el objeto Dispositivo predefinido en la clase de objeto PdDv para la que se va a crear una instancia de dispositivo personalizada.
T Tipo Especifica el tipo de dispositivo que se está definiendo. La clase, subclase y tipo son necesarios para identificar el objeto de dispositivo predefinido en la clase de objeto PdDv para la que se va a crear una instancia de dispositivo personalizada.
-p Padre Especifica el nombre lógico del dispositivo padre. Este nombre lógico es necesario para los dispositivos que se conectan a un dispositivo padre. Esta opción no se aplica a los dispositivos que no tienen padres; por ejemplo, la mayoría de los pseudo-dispositivos.
-w Conexión Especifica dónde se conecta el dispositivo al padre. Esta opción sólo se aplica a los dispositivos que se conectan a un dispositivo padre.
-l Nombre Pasado por el mandato mkdev , especifica el nombre del dispositivo si el usuario que invoca el mandato define un nuevo dispositivo y desea seleccionar el nombre del dispositivo. El método Define asigna este nombre como el nombre lógico del dispositivo en el objeto Dispositivos personalizados (CuDv), si el nombre no está ya en uso. Si no se especifica esta opción, el método Define genera un nombre para el dispositivo. No todos los dispositivos soportan o necesitan dar soporte a esta opción.

Directrices para escribir un método de definición

Esta lista de tareas está destinada a servir como directriz para escribir un método Define. Al escribir un método para un dispositivo específico, se pueden omitir algunas tareas. Por ejemplo, si un dispositivo no tiene un padre, no es necesario incluir todas las tareas de validación de conexión y padre. Además, un dispositivo puede tener necesidades especiales que no se listan en estas tareas.

El método Define debe:

  1. Validar los parámetros de entrada. Generalmente, un método de configuración que invoca el método de definición de dispositivo hijo está codificado para pasar las opciones esperadas por el método de definición de dispositivo hijo. Sin embargo, el mandato mkdev siempre pasa las opciones de clase, subclase y tipo, mientras que sólo pasa las otras opciones basándose en la entrada de usuario en el mandato mkdev . Por lo tanto, es posible que el método Define tenga que asegurarse de que se han suministrado todas las opciones que necesita. Por ejemplo, si el método Define espera que se definan las opciones padre y de conexión para el dispositivo, debe asegurarse de que se proporcionan las opciones. Además, un método Define que no da soporte a la opción de especificación de nombre de -l saldrá con un error si se proporciona la opción.
  2. Inicializar el gestor de datos de objeto (ODM) utilizando la subrutina odm_initialize y bloquear la base de datos de configuración utilizando la subrutina odm_lock . El fragmento de código siguiente ilustra este proceso:
    #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. Recupere el objeto PdDv predefinido para el tipo de dispositivo que se está definiendo. Esto se realiza obteniendo el objeto de la clase de objeto PdDv cuya clase, subclase y descriptores de tipo coinciden con las opciones de clase, subclase y tipo proporcionadas al método Define. Si no se encuentra ninguna coincidencia, el método Define saldrá con un error. La información se tomará del objeto de dispositivo PdDv para crear el objeto de dispositivo CuDv .
  4. Asegúrese de que el dispositivo padre existe. Si el dispositivo que se está definiendo se conecta a un dispositivo padre y se ha proporcionado el nombre del padre, el método Define debe asegurarse de que el dispositivo especificado existe realmente. Lo hace recuperando el objeto CuDv cuyo descriptor de nombre de dispositivo coincide con el nombre del dispositivo padre proporcionado utilizando el distintivo -p . Si no se encuentra ninguna coincidencia, el método Define saldrá con un error.
  5. Si el dispositivo tiene un padre y ese dispositivo padre existe en la clase de objeto CuDv , valide que el dispositivo que se está definiendo se pueda conectar al dispositivo padre especificado. Para ello, recupere el objeto de conexión predefinido de la clase de objeto de conexión predefinida (PdCn) cuyo tipo exclusivo, clave de conexión y descriptores de ubicación de conexión coinciden con el descriptor de clase de objeto de enlace a dispositivos predefinidos del objeto CuDv del padre obtenido en el paso anterior y la entrada de subclase y opciones de conexión en el método Definir, respectivamente. Si no se encuentra ninguna coincidencia, se especifica una conexión no válida. Esto puede ocurrir porque el padre especificado no es un dispositivo intermedio, no acepta el tipo de dispositivo que se está definiendo (como se describe en la subclase) o no tiene la ubicación de conexión identificada por la opción de conexión.
  6. Asignar un nombre lógico al dispositivo. Cada nombre lógico recién asignado debe ser exclusivo en el sistema. Si se ha proporcionado un nombre utilizando el distintivo -l , asegúrese de que es exclusivo antes de asignarlo al dispositivo. Esto se realiza comprobando la clase de objeto CuDv para cualquier objeto cuyo descriptor de nombre de dispositivo coincida con el nombre deseado. Si se encuentra una coincidencia, el nombre ya se utiliza y el método Define debe salir con un error.

    Si el método Definir es generar un nombre, puede hacerlo obteniendo el nombre de prefijo del descriptor Nombre de prefijo del objeto de dispositivo PdDv del dispositivo e invocando la subrutina genseq para obtener un número de secuencia exclusivo para este prefijo. La adición del número de secuencia al nombre de prefijo da como resultado un nombre exclusivo. La rutina genseq busca en la clase de objeto CuDv para asegurarse de que asigna un número de secuencia que no se ha utilizado con el prefijo especificado para formar un nombre de dispositivo.

    En algunos casos, es posible que un método Define tenga que asegurarse de que sólo se ha definido un dispositivo de un tipo determinado. Por ejemplo, sólo puede haber un dispositivo pty personalizado en la clase de objeto CuDv . El método pty Define lo hace consultando la clase de objeto CuDv para ver si un dispositivo por el nombrepty0existe. Si lo hace, el dispositivo pty ya se ha definido. De lo contrario, el método Define continúa para definir el dispositivo pty utilizando el nombre pty0.

  7. Determinar el código de ubicación del dispositivo. Si el dispositivo que se está definiendo es un dispositivo físico, tiene un código de ubicación.
  8. Cree el nuevo objeto CuDv .

    Establezca los descriptores de objeto CuDv como se indica a continuación:

    Descriptor Valor
    Nombre de dispositivo Utilice el nombre tal como se determina en el paso 6.
    Distintivo de estado de dispositivo Se establece en el estado Definido.
    Cambiar distintivo de estado Establézcalo en el mismo valor que el que se encuentra en el descriptor Cambiar distintivo de estado en el objeto PdDv del dispositivo.
    Instancia del controlador de dispositivo Establézcalo en el mismo valor que el descriptor de nombre de controlador de dispositivo en el objeto PdDv del dispositivo. Este valor puede ser utilizado posteriormente por el método Configure.
    Código de ubicación de dispositivo Se establece en una serie nula si el dispositivo no tiene un código de ubicación. De lo contrario, establézcale en el valor calculado.
    Nombre lógico de dispositivo padre Se establece en una serie nula si el dispositivo no tiene un padre. De lo contrario, establezca este descriptor en el nombre padre especificado por la opción padre.
    Ubicación donde se ha conectado en el dispositivo padre Se establece en una serie nula si el dispositivo no tiene un padre. De lo contrario, establezca este descriptor en el valor especificado por la opción de conexión.
    Enlace a la clase de objeto de dispositivos predefinidos Establézcalo en el valor obtenido del descriptor de tipo exclusivo del objeto PdDv del dispositivo.
  9. Escriba el nombre del dispositivo en la salida estándar. Se debe añadir un espacio en blanco al nombre de dispositivo para que sirva como separador en caso de que otros métodos escriban nombres de dispositivo en la salida estándar. El mandato mkdev o el método Configure que ha invocado el método Define interceptará la salida estándar para obtener el nombre de dispositivo asignado al dispositivo.
  10. Cierre todas las clases de objeto y termine ODM. Salga con un código de salida de 0 si no hay errores.