Sous-routine srcsrqt

Objectif

Envoie une demande à un sous-système.

Bibliothèque

Bibliothèque du contrôleur de ressources système (libsrc.a)

Syntaxe

#include <spc.h> srcsrqt(Host, SubsystemName, SubsystemPID,
RequestLength, SubsystemRequest, ReplyLength, ReplyBuffer, StartItAlso, Continued)

char * Host, * SubsystemName;

char * SubsystemRequest, * ReplyBuffer;

int  SubsystemPID,  StartItAlso, * Continued;

short  RequestLength, * ReplyLength;

Descriptif

La sous-routine srcsrqt envoie une demande à un sous-système, attend une réponse et renvoie une ou plusieurs réponses à l'appelant. Le format de la demande et de la réponse est déterminé par l'appelant et le sous-système.

Remarque: La sous-routine srcsrqt crée son propre socket pour envoyer une demande au sous-système. Le socket ouvert par cette fonction reste ouvert jusqu'à la réception d'une erreur ou d'un paquet de fin.

Deux types de continuation sont renvoyés par la sous-routine srcsrqt :

Article Descriptif
Pas de continuation ReplyBuffer->srchdr.continuedest définie sur la constante END .
Continuation de la réponse ReplyBuffer->srchdr.continuedn'est pas définie sur la constante END , mais sur une valeur positive convenue par le processus appelant et le sous-système. Le paquet est renvoyé à l'appelant.

Paramètres

Article Descriptif
SubsystemPID ID de processus du sous-système.
Hôte Indique l'hôte externe sur lequel cette demande de sous-système doit être envoyée. Si l'hôte est null, la demande est envoyée au sous-système sur l'hôte local. L'utilisateur local doit s'exécuter en tant que "root". Le système distant doit être configuré pour accepter les demandes du contrôleur de ressources système distant. Autrement dit, le démon srcmstr (voir /etc/inittab) doit être démarré avec l'indicateur -r et le fichier /etc/hosts.equiv ou .rhosts doit être configuré pour autoriser les demandes à distance.
SubsystemName Indique le nom du sous-système auquel cette demande doit être envoyée. Vous devez spécifier un SubsystemName si vous ne spécifiez pas de SubsystemPID.
RequestLength Indique la longueur, en octets, de la demande à envoyer au sous-système. La valeur maximale en octets pour ce paramètre est de 2000 octets.
SubsystemRequest Pointe vers le paquet de demande du sous-système.
ReplyLength Indique la longueur maximale, en octets, de la réponse à recevoir du sous-système. Lors du retour de la sous-routine srcsrqt , le paramètre ReplyLength est défini sur la longueur réelle du paquet de réponse du sous-système.
ReplyBuffer Pointe vers une mémoire tampon pour la réception du paquet de réponse du sous-système.
StartItAlso Indique si le sous-système doit être démarré s'il n'est pas actif. Lorsque cette valeur est différente de zéro, le contrôleur de ressources système (SRC) tente de démarrer un sous-système inactif, puis transmet la demande au sous-système.
Continué Indique si cet appel à la sous-routine srcsrqt est la suite d'une demande précédente. Si le paramètre Suite est défini sur NEWREQUEST, une demande est envoyée au sous-système et ce dernier est averti qu'une autre réponse est attendue. Le processus appelant ne doit jamais définir Suite sur une valeur autre que NEWREQUEST. La dernière réponse du sous-système définira Suite sur END.

Valeurs renvoyées

Si la sous-routine srcsrqt aboutit, la valeur SRC_OK est renvoyée.

Codes d'erreur

La sous-routine srcsrqt échoue si une ou plusieurs des conditions suivantes sont remplies:

Article Descriptif
SRC_BADSOCK La demande n'a pas pu être transmise au sous-système en raison d'un échec de socket.
CONT SRC Le sous-système utilise des signaux. La demande ne peut pas aboutir.
SRC_DMNA Le démon SRC n'est pas actif.
SRC_INET_AUTHORIZED_HOST L'hôte local ne se trouve pas dans le fichier /etc/hosts.equiv distant.
SRC_INET_INVALID_HOST Sur l'hôte distant, l'hôte local est inconnu.
UTILISATEUR_IN_SRC_valide L'utilisateur n'est pas un superutilisateur ou un système de groupe.
SRC_MMRY Un composant SRC n'a pas pu allouer la mémoire dont il a besoin.
SRC_NOCONTINUE Le paramètre Suite n'a pas été défini sur NEWREQUESTet aucune continuation n'est actuellement active.
SRC_NORPLY La demande a expiré lors de l'attente d'une réponse.
SRC_NSVR Le sous-système n'est pas actif.
SRC_REQLEN2BIG La valeur de RequestLength est supérieure à la valeur maximale de 2000 octets.
SRC_SOCK Un incident s'est produit au niveau des communications de socket SRC.
SRC_STPG La demande n'a pas été transmise au sous-système. Le sous-système est en cours d'arrêt.
SRC_UDP Le port SRC n'est pas défini dans le fichier /etc/services .
SRC_UHOST L'hôte étranger est inconnu.

Exemples

  1. Pour demander le statut du sous-système long, entrez:
    int cont=NEWREQUEST;
    int rc;
    short replen;
    short reqlen;
    struct
    {
        struct srchdr srchdr;
        struct statcode statcode[20];
    } statbuf;
    struct subreq subreq;
     
    subreq.action=STATUS;
    subreq.object=SUBSYSTEM;
    subreq.parm1=LONGSTAT;
    strcpy(subreq.objname,"srctest");
    replen=sizeof(statbuf);
    reqlen=sizeof(subreq);
    rc=srcsrqt("MaryC", "srctest", 0, reqlen, &subreq, &replen,
    &statbuf, SRC_NO, &cont);

    Cette entrée obtient le statut long du sous-systèmesrctestleMaryCvirtuelle. Le sous-système continue d'envoyer des paquets d'état jusqu'àstatbuf.srchdr.cont=END.

  2. Pour démarrer un sous-serveur, entrez:
    int cont=NEWREQUEST;
    int rc;
    short replen;
    short reqlen;
    struct
    {
        struct srchdr srchdr;
        struct statcode statcode[20];
    } statbuf;
    struct subreq subreq;
     
    subreq.action=START;
    subreq.object=1234;
    replen=sizeof(statbuf);
    reqlen=sizeof(subreq);
    rc=srcsrqt("", "", 987, reqlen, &subreq, &replen, &statbuf,
    SRC_NO, &cont);

    Cette entrée démarre le sous-serveur avec le point de code de1234, mais uniquement si le sous-système est déjà actif.

  3. Pour démarrer un sous-serveur et un sous-système, entrez:
    int cont=NEWREQUEST;
    int rc;
    short replen;
    short reqlen;
    struct
    {
        struct srchdr srchdr;
        struct statcode statcode[20];
    } statbuf;
    struct subreq subreq;
    subreq.action=START;
    subreq.object=1234;
    replen=sizeof(statbuf);
    reqlen=sizeof(subreq);
    rc=srcsrqt("", "", 987, reqlen, &subreq, &replen, &statbuf, SRC_YES, &cont);

    Cette entrée démarre le sous-serveur avec le point de code de1234.Si le sous-système auquel appartient ce sous-serveur n'est pas actif, le sous-système est démarré.

Fichiers

Article Descriptif
/etc/services Définit les sockets et les protocoles utilisés pour les services Internet.
/dev/SRC Indique le fichier socket AF_UNIX .
/dev/.SRC-unix Indique l'emplacement des fichiers de socket temporaires.