svc99() - 監視プログラム呼び出しのアクセス

標準

標準/拡張機能 C/C++ 依存項目
Language Environment® 両方  

形式

#include <stdio.h>

int svc99(__S99parms *string);

機能説明

z/OS の SVC99 へのアクセスが提供されますが、これで 次のような機能が用意されます。
  • リソースの動的割り振りまたは割り振り解除
  • データ・セットの動的連結または連結解除
  • データ・セットに関する情報の動的検索

ユーザーのネーム・スペースが侵害されるのを回避するため、この非標準関数には 2 つの名前があります。1 つの名前の接頭部には 2 つの下線文字が付き、もう 1 つの名前の接頭部には付きません。接頭部下線文字が付いていない名前は、LANGLVL(EXTENDED) を使用する場合にのみ表示されます。

この関数を使用するには、その外部エントリー・ポイント名を使用する関数 (つまり、2 つの下線文字で始まる名前) を呼び出すか、または LANGLVL(EXTENDED) で コンパイルする必要があります。LANGLVL(EXTENDED) を使用すると、ヘッダー内の関連情報も表示されます。

__S99parms 構造体は、31 ビットのアドレス可能ストレージ内にあることが必要です。64 ビットのアドレス可能ストレージを指定して svc99() を呼び出すと、-1 の戻りコードが出されます。

__S99TXTPP エレメントは、テキスト・ユニット・ポインターの配列を含む 31 ビットのアドレス可能ストレージを指す、32 ビット幅のポインターであることが必要です。 テキスト・ユニット・ポインターはそれぞれ、32 ビット幅のポインターであることが必要です。それぞれのポインターは、テキスト・ユニットを含む 31 ビットのアドレス可能ストレージを指すか、または NULL ポインターであっても構いません。 最後のテキスト・ユニット・ポインターの高位ビット (従来型の 31 ビット amode 高位ビット) をオンにして、テキスト・ユニットの最後に達したことを示す必要があります。

__S99S99X エレメントは、__S99rbx 構造体を含む 31 ビットのアドレス可能ストレージ (必要な場合) を指す、32 ビット幅のポインターであることが必要です。 このことは、前に概説した __dyn_t 構造体のエレメント __rbx の要件と整合します。

__S99parms 構造体は、stdio.h で 定義されます。これは、ブロック拡張要求のアドレスをインクルードするために、変更 されました。ブロック拡張要求およびエラー・メッセージ・パラメーター・リスト を使用して、エラーが発生したときに、SVC99 で戻されたメッセージ を処理できます。このフィーチャーを使用するには、これらの構造体の割り振りおよび初期設定する必要があります。

表 1. __S99parms 構造体により含まれるエレメント
フィールド 保管済みの値
__S99RBLN 符号なし char 要求ブロックの SVC99 の長さ
__S99VERB 符号なし char SVC99 動詞コード
__S99FLAG1 符号なし short SVC99 フラグ 1 フィールド
__S99ERROR 符号なし short SVC99 エラー・コード・フィールド
__S99INFO 符号なし short SVC99 情報コード
__S99TXTPP void * __ptr32 テキスト単位ポインターのリストの SVC99 ポインター
__S99S99X void * __ptr32 拡張要求ブロックの SVC99 ポインター
__S99FLAG2 unsigned int APF 許可プログラムの SVC99 フラグ 2 フィールド

戻り値

入力ポインターが NULL 以外の場合、svc99() は、CICS® で実行中のときは 0 を、そうでないときはゼロ以外の値を戻します。ゼロ以外の値は、svc99() が現行のオペレーティング・システム (つまり、z/OS の CICS 以外) の環境でサポートされることを示しています。入力が NULL 以外の場合、CICS のもとで実行中の場合は、svc99() は -1 (エラーを 示す) を戻し、そうでない場合には、svc99() からの結果であるコードを 戻します。

入力が NULL 以外で、svc99() がシステムでサポートされていない場合には、-1 を戻します。

CELEBS58
⁄* CELEBS58

   This example uses the svc99() function to dynamically allocate a data
   set called USERID.EXAMPLE.

 *⁄
#define MASK 0x80000000
#define _EXT

#include <stdio.h>
#include <string.h>

int main(void)
{
    int rc;
    struct __S99struc parmlist;
    char *s[10] = {                      ⁄* array of text pointers *⁄
    ⁄* text units follow *⁄
        "¥0¥x02¥0¥x01¥0¥x0E""USERID.EXAMPLE", ⁄* DSN=EXAMPLE *⁄
        "¥0¥x05¥0¥x01¥0¥x01¥x02",             ⁄* DISP=(,CATLG) *⁄
        "¥0¥x07¥0¥0",                         ⁄* SPACE=(TRK,.. *⁄
        "¥0¥x0A¥0¥x01¥0¥x03¥0¥0¥x14",         ⁄* primary=20 *⁄
        "¥0¥x0B¥0¥x01¥0¥x03¥0¥0¥x01",         ⁄* secondary=1 *⁄
        "¥0¥x15¥0¥x01¥0¥x05SYSDA",            ⁄* UNIT=SYSDA *⁄
        "¥0¥x30¥0¥x01¥0¥x02¥0¥x50",           ⁄* BLKSIZE=80 *⁄
        "¥0¥x3C¥0¥x01¥0¥x02¥x40¥0",           ⁄* DSORG=PS *⁄
        "¥0¥x42¥0¥x01¥0¥x02¥0¥x50",           ⁄* LRECL=80 *⁄
        "¥0¥x49¥0¥x01¥0¥x01¥x80"};            ⁄* RECFM=F *⁄

    memset(&parmlist, 0, sizeof(parmlist));
    parmlist.__S99RBLN = 20;
    parmlist.__S99VERB = 1;            ⁄* verb for dsname allocation       *⁄
    parmlist.__S99FLAG1 = 0x4000;      ⁄* do not use existing allocation   *⁄
    parmlist.__S99TXTPP = s;           ⁄* pointer to pointer to text units *⁄
    s[9] = (char *)((long unsigned) (s[9]) | MASK);

    rc = svc99(&parmlist);
    if (rc != 0)
       printf(" Error code = %d   Information code = %d¥n",
           parmlist.__S99ERROR, parmlist.__S99INFO);
}

ユーザー ID が A から F の文字いずれかで開始する場合には、ユーザー ID の先頭文字が 16 進数字以外の文字として解釈されるように、ユーザー ID の前に 2 つの二重引用符 (") を追加することが必要です。

前述の例は、シンボル名およびデータ構造体を使用して、以下で示された例より読みやすくなっています。SYS1.MACLIB のメンバー IEFZB4DBIEFZB4D0、および IEFZB4D2 には、ほとんどのアセンブラー言語プログラムでなじみのシンボル名が 含まれています。

次の例では、これらのメンバーから取得したシンボル名を使用して、z/OS® XL C/C++ で、primary=20 または s[3] を表示するテキスト単位が定義されます。残りのテキスト単位に対して 似た定義をできますが、ここでは例示しません。
#include <stdio.h>
#include <string.h>

#define MASK 0x80000000
#define CHAR_BIT 4
/* Defines one text unit with an integer of size 'bytes' */

#define __S99TUNIT_INT(bytes) struct {
    short unsigned __S99TUKEY;    /* KEY                        */
    short unsigned __S99TUNUM;    /* NO. OF LENGTH+PARM ENTRIES */
    struct {                      /* TEXT ENTRY OF LENGTH+PARM  */
      short unsigned __S99TULNG;  /* LENGTH OF 1ST (ONLY) PARM  */
      unsigned int   __S99TUPAR :     /*           PARAMETER    */
                                  (bytes) * CHAR_BIT;
     } __S99TUENT;
    }
/* initialize by: __S99TUNUM = 1;                                */
/*               __S99TUENT.__S99TULNG = <bytes>;                */
/*               __S99TUENT.__S99TUPAR = <value>;                */

#define __DALPRIME 0x000A           /*PRIMARY SPACE QUANTITY     */

static const __S99TUNIT_INT(3) primary = {__DALPRIME, 1, 3, 20};

int main(void)
{
    int rc;
    struct __S99struc parmlist;
    memset(&parmlist, 0, sizeof(parmlist));
    void *s[10] = {            /* array of text pointers */
    /* text units follow */
                     .    ,                     /* DSN=EXAMPLE  */
                     .    ,                     /* DISP=(,CATLG)*/
                     .    ,                     /* SPACE=(TRK,..*/
                  &primary,                     /* primary=20   */
                     .    ,                     /* secondary=1  */
                     .    ,                     /* UNIT=SYSDA   */
                     .    ,                     /* BLKSIZE=80   */
                     .    ,                     /* DSORG=PS     */
                     .    ,                     /* LRECL=80     */
                     .    };                    /* RECFM=F      */

    parmlist.__S99RBLN = 20;
    parmlist.__S99VERB = 01;      /* verb for dsname allocation       */
    parmlist.__S99FLAG1 = 0x4000; /* do not use existing allocation   */
    parmlist.__S99TXTPP = s;      /* pointer to pointer to text units */
    s[9] = (char *)((long unsigned) (s[9]) │ MASK);

    rc = svc99(&parmlist);
    if (rc != 0)
       printf(" Error code = %d   Information code = %d¥n",
           parmlist.__S99ERROR, parmlist.__S99INFO);
}

関連情報