El método xfnts_start invoca el método svc_start(), definido en xfnts.c para iniciar el daemon xfs. Esta sección describe svc_start().
La orden para ejecutar el daemon xfs es la siguiente:
xfs -config directorio_config/fontserver.cfg -port número_puerto |
La propiedad de extensión Confdir_list identifica el directorio_config y la propiedad de sistema Port_list identifica el número_puerto. Cuando el administrador del clúster configura el servicio de datos, proporciona valores específicos para estas propiedades.
El método xfnts_start declara estas propiedades como matrices de secuencias y obtiene los valores que fija el administrador con las funciones scds_get_ext_confdir_list() y scds_get_port_list() (descritas en scds_property_functions(3HA)), como sigue:
scha_str_array_t *confdirs;
scds_port_list_t *portlist;
scha_err_t err;
/* obtener el directorio de configuración de la propiedad confdir_list */
confdirs = scds_get_ext_confdir_list(scds_handle);
(void) sprintf(xfnts_conf, "%s/fontserver.cfg", confdirs->str_array[0]);
/* obtener el puerto que va a usar XFS de la propiedad Port_list */
err = scds_get_port_list(scds_handle, &portlist);
if (err != SCHA_ERR_NOERR) {
scds_syslog(LOG_ERR,
"No se puede acceder a la propiedad Port_list.");
return (1);
}
Observe que la variable confdirs apunta al primer elemento (0) de la matriz.
El método xfnts_start utiliza sprintf para formar la línea de órdenes para xfs como se muestra a continuación.
/* Construir la orden para que inicie el daemon xfs. */
(void) sprintf(cmd,
"/usr/openwin/bin/xfs -config %s -port %d 2>/dev/null",
xfnts_conf, portlist->ports[0].port);
Observe que la salida se redirige a dev/null para suprimir los mensajes que genera el daemon.
El método xfnts_start pasa la línea de órdenes xfs a scds_pmf_start() para iniciar el servicio de datos controlado por PMF, como se indica a continuación.
scds_syslog(LOG_INFO, "Emitir una solicitud de inicio.");
err = scds_pmf_start(scds_handle, SCDS_PMF_TYPE_SVC,
SCDS_PMF_SINGLE_INSTANCE, cmd, -1);
if (err == SCHA_ERR_NOERR) {
scds_syslog(LOG_INFO,
"Orden de inicio completada satisfactoriamente.");
} else {
scds_syslog(LOG_ERR,
"No se ha podido iniciar HA-XFS ");
}
Observe los siguientes aspectos de la llamada a scds_pmf_start().
El parámetro SCDS_PMF_TYPE_SVC identifica el programa que se va a iniciar como aplicación de servicio de datos; este método también puede iniciar un supervisor de fallos u otro tipo de aplicación.
El parámetro SCDS_PMF_SINGLE_INSTANCE lo identifica como un recurso de una sola instancia.
El parámetro cmd es la línea de órdenes generada previamente.
El parámetro final, -1, especifica el nivel de supervisión de secundarios. El -1 especifica que PMF supervisa todos los secundarios y el proceso original.
Antes de volver, svc_pmf_start() libera la memoria asignada para la estructura portlist como se muestra a continuación.
scds_free_port_list(portlist); return (err); |