QUSLOBJ
はジョブのリストをユーザー・スペース(*USESPC
)に出力する API であるが
ここでは QUSLOBJ
の使い方と同時に、ジョブの一覧の意味の解説もかねて
QUSLOBJ
を紹介する目的がある。
必須パラメータ・グループ:
1. | 修飾ユーザー・スペース名 | 入力 | Char(20) |
2. | 形式名 | 入力 | Char(8) |
3. | 修飾ジョブ名 | 入力 | Char(26) |
4. | 状況 | 入力 | Char(10) |
任意パラメータ・グループ1:
5. | エラー・コード | 入出力 | Char(*) |
任意パラメータ・グループ2 :
6. | ジョブ・タイプ | 入力 | Char(1) |
7. | 返されるフィールド数 | 入出力 | Bynary(4) |
8. | 返されるフィールドのキー | 入力 | Bynary(4)の配列 |
QUSLJOB
API は修飾ユーザー・スペース名 ( *USRSPC
) として指定されたユーザー・スペース,
例えば 「USLOBJ QTEMP
」に指定されたジョブの一覧のリストを出力する。
・修飾ジョブ名
ここで指定する修飾ジョブ名とは、
ジョブ名 | : | * ,*CURRENT , *ALL またはジョブ名 |
ユーザー名 | : | ユーザーは、指定された特殊権限を所有していない。 |
ジョブ番号 | : | *ALL またはジョブ番号 |
である。
つまり、あるユーザーのジョブ情報 ( ジョブ名+ユーザー名+ジョブ番号 ) を調べるには
*ALL
+ (ユーザー名) + *ALL
のジョブ情報で QUSLJOB
を使って検索することができる。
またジョブ名だけでも検索することができる。
ジョブを特定するにはジョブ番号まで含めて正確に特定しなければならないので
ジョブ番号の検索に QUSLJOB
は役に立つAPIである。
・状況
| ・・・・・・ | 活動ジョブ。ただしここで言う活動ジョブとは |
*JOBQ | ・・・・・・ | 現在、ジョブ待ち行列にあるジョブ |
*OUTQ | ・・・・・・ | 実行は完了したものの、その出力がまだ出力待ち行列にあるジョブ |
*ALL | ・・・・・・ | 状況にかかわらず、すべてのジョブ |
0001.00 #include <stdio.h> 0002.00 #include <stdlib.h> 0003.00 #include <string.h> 0004.00 #include <QUSCRTUS.h> 0005.00 #include <QUSLJOB.h> 0006.00 #include <QUSRTVUS.h> 0007.00 #include <micomput.h> /* triml */ 0008.00 #include <QMHRTVM.h> 0009.00 #include <QMHSNDPM.h> 0010.00 0011.00 #define TRUE 0 0012.00 #define FALSE -1 0013.00 typedef struct { 0014.00 int BYTESPRO; 0015.00 int BYTESAVL; 0016.00 char MSGID[7]; 0017.00 char RESRVD; 0018.00 char EXCPDATA[100]; 0019.00 } ERRSTRUCTURE; /* Define the error return structure */ 0020.00 ERRSTRUCTURE errcode;/* API Error Code Structure */ 0021.00 typedef struct { 0022.00 char NM[10]; 0023.00 char LIB[10]; 0024.00 } QNAME; /* Define the qualified name */ 0025.00 QNAME inname; /* Qualified user space name */ 0026.00 typedef struct { 0027.00 char JOB[10]; 0028.00 char USER[10]; 0029.00 char JOBNBR[6]; 0030.00 } JOBINFO; 0031.00 JOBINFO jobinfo; 0032.00 int offset, size, entries; 0033.00 typedef _Packed struct header_struct { 0034.00 char user_data[64]; 0035.00 int generic_header_size; 0036.00 char header_version[4]; 0037.00 char format_name[8]; 0038.00 char program_name[10]; 0039.00 char time_generated[13]; 0040.00 char information_status; 0041.00 int usrspc_used; 0042.00 int parm_section_offset; 0043.00 int parm_section_size; 0044.00 int header_section_offset; 0045.00 int header_section_size; 0046.00 int list_section_offset; 0047.00 int list_section_size; 0048.00 int number_of_entries; 0049.00 int size_of_entry; 0050.00 } header_struct; 0051.00 header_struct inspace; 0052.00 char ref[132]; 0053.00 0054.00 /*************************************************************/ 0055.00 /* 内 部 使 用 関 数 */ 0056.00 /*************************************************************/ 0057.00 void CreateUsrSpace(char* space, char* lib); 0058.00 void ApiError(char* place); 0059.00 void SendMessage(char* Message, char* Status, char* Pgmque); 0060.00 0061.00 void main(void){ 0062.00 int i; 0063.00 char Job[11], User[11], Nbr[7]; 0064.00 Qus_JOBL0100_t jobl0100; 0065.00 0066.00 printf("** TESTUSLJOB : QUSLJOB のテスト **n"); 0067.00 getchar(); 0068.00 0069.00 /*(1) QUSCRTUS: ユーザー・スペースの作成 */ 0070.00 CreateUsrSpace("USLJOB ", "QTEMP "); 0071.00 0072.00 /*(2) QUSLJOB: ユーザー QTMHHTTP のジョブ一覧を出力する */ 0073.00 memcpy(jobinfo.JOB, "*ALL ", 10); 0074.00 memcpy(jobinfo.USER, "QTMHHTTP ", 10); 0075.00 memcpy(jobinfo.JOBNBR, "*ALL ", 6); 0076.00 0077.00 QUSLJOB((char*)&inname, "JOBL0100", (char*)&jobinfo, "*ACTIVE ", 0078.00 &errcode); 0079.00 if(errcode.BYTESAVL != 0){/*APIERR*/ 0080.00 ApiError("MAIN-QUSLJOB"); exit(0); 0081.00 }/*APIERR*/ 0082.00 0083.00 /*(3) QUSRTVUS: ユーザー・スペースを読んで初期情報を取得する */ 0084.00 QUSRTVUS("USLJOB QTEMP ", 0x01,sizeof(inspace), &inspace, 0085.00 (char*)&errcode); 0086.00 if(errcode.BYTESAVL != 0){/*APIERR*/ 0087.00 sprintf(ref, "QUSRTVUS-%d", __LINE__); 0088.00 ApiError(ref); 0089.00 return; 0090.00 }/*APIERR*/ 0091.00 offset = inspace.list_section_offset +1; 0092.00 size = inspace.size_of_entry; 0093.00 entries = inspace.number_of_entries; 0094.00 0095.00 /*(4) QUSRTVUS: ユーザー・スペースを LOOP して読み取る */ 0096.00 for(i = 0; i<inspace.number_of_entries; i++){/*for-loop*/ 0097.00 QUSRTVUS((char*)&inname, offset, size, (char*)&jobl0100, 0098.00 (char*)&errcode); 0099.00 /*--------------( 処理の開始 )-----------------*/ 0100.00 memcpy(Job, jobl0100.Job_Name_Used, 10); 0101.00 Job[10] = 0x00; 0102.00 memcpy(User, jobl0100.User_Name_Used, 10); 0103.00 User[10] = 0x00; 0104.00 memcpy(Nbr, jobl0100.Job_Number_Used, 6); 0105.00 Nbr[6] = 0x00; 0106.00 printf("[%d] Job = %10s, User = %10s, Nbr = %06sn", 0107.00 i, Job, User, Nbr); 0108.00 /*--------------( 処理の終了 )-----------------*/ 0109.00 offset += inspace.size_of_entry; 0110.00 }/*for-loop*/ 0111.00 getchar(); 0112.00 0113.00 0114.00 } 0115.00 /*******************************************/ 0116.00 void CreateUsrSpace(char* space, char* lib) 0117.00 /*******************************************/ 0118.00 { 0119.00 char extattrib[10]; /* External attributes */ 0120.00 long int initialsize; 0121.00 char initialvalue; 0122.00 char authority[10]; 0123.00 char description[50]; 0124.00 char replace[10]; 0125.00 0126.00 memset(&inname, 0, sizeof(QNAME)); 0127.00 memcpy(inname.NM, space, 10); 0128.00 memcpy(inname.LIB, lib, 10); 0129.00 initialsize = 1000; 0130.00 initialvalue = '0'; 0131.00 memcpy(authority, "*ALL ", sizeof(authority)); 0132.00 memset(description, ' ', sizeof(description)); 0133.00 memcpy(replace, "*YES ", sizeof(replace)); 0134.00 memcpy(extattrib, "PF ", sizeof(extattrib)); 0135.00 QUSCRTUS((char *)(&inname), extattrib, initialsize, 0136.00 &initialvalue, authority, description, replace, 0137.00 (char *)(&errcode));/* create user space at QTEMP )*/ 0138.00 } 0139.00 /**************************/ 0140.00 void ApiError(char* place) 0141.00 /**************************/ 0142.00 { 0143.00 char msgid[8], msgdta[100], Message[512], msg[512]; 0144.00 int msglen, msgdtalen, pos; 0145.00 char* ptr; 0146.00 typedef struct { 0147.00 Qmh_Rtvm_RTVM0100_t rtvm0100; 0148.00 char msg[512]; 0149.00 } ERRMSG; 0150.00 ERRMSG errmsg; 0151.00 0152.00 memset(msgid, 0, sizeof(msgid)); 0153.00 memcpy(msgid, errcode.MSGID, 7); 0154.00 memset(msgdta, 0, sizeof(msgdta)); 0155.00 memcpy(msgdta, errcode.EXCPDATA, 100); 0156.00 msglen = sizeof(Qmh_Rtvm_RTVM0100_t); 0157.00 msgdtalen = strlen(msgdta); 0158.00 memset(&errmsg, 0, sizeof(ERRMSG)); 0159.00 QMHRTVM(&errmsg, msglen, "RTVM0100", msgid, "QCPFMSG *LIBL ", 0160.00 msgdta, msgdtalen, "*YES ", "*YES ", &errcode); 0161.00 memset(Message, 0, sizeof(Message)); 0162.00 memcpy(Message, errmsg.msg, 512); 0163.00 ptr = strstr(Message, "&N"); 0164.00 if(ptr != NULL){ 0165.00 pos = (int)(ptr - Message); 0166.00 Message[pos] = 0x00; 0167.00 } 0168.00 sprintf(msg, "%s-%s:%s", place, msgid, Message); 0169.00 SendMessage(msg, "*COMP ", "*PGMBDY "); 0170.00 } 0171.00 /**********************************************************/ 0172.00 void SendMessage(char* Message, char* Status, char* Pgmque) 0173.00 /**********************************************************/ 0174.00 { 0175.00 char msg_id[7]; 0176.00 char msg_fl_name[20]; 0177.00 char msg_data[3000]; 0178.00 int msg_data_len; 0179.00 char msg_type[10]; 0180.00 int pgm_stk_cnt; 0181.00 char msg_key[4]; 0182.00 char pgm_que[10]; 0183.00 0184.00 memset(msg_id, 0, sizeof(msg_id)); 0185.00 strcpy(msg_id, "CPF9897"); 0186.00 memset(msg_fl_name, 0, sizeof(msg_fl_name)); 0187.00 strcpy(msg_fl_name, "QCPFMSG QSYS "); 0188.00 memset(msg_data, 0, sizeof(msg_data)); 0189.00 strcpy(msg_data, Message); 0190.00 msg_data_len = triml(Message, ' '); 0191.00 strcpy(msg_type, Status); 0192.00 strcpy(pgm_que, Pgmque); 0193.00 if(strncmp(Pgmque, "*EXT ", 10) == 0) 0194.00 pgm_stk_cnt = 0; 0195.00 else pgm_stk_cnt = 1; 0196.00 memset(msg_key, 0x40, sizeof(msg_key)); 0197.00 errcode.BYTESPRO = 160; 0198.00 errcode.BYTESAVL = 0; 0199.00 QMHSNDPM(msg_id, msg_fl_name, msg_data, msg_data_len, msg_type, 0200.00 pgm_que, pgm_stk_cnt, msg_key, &errcode); 0201.00 }
最初に CreateUsrSpace
関数で QUSCRTUS
API を使って QTEMP/USLJOB *USRSPC
を作成しておく。
次に QUSLJOB
API によって
0073.00 memcpy(jobinfo.JOB, "*ALL ", 10); 0074.00 memcpy(jobinfo.USER, "QTMHHTTP ", 10); 0075.00 memcpy(jobinfo.JOBNBR, "*ALL ", 6); 0076.00 0077.00 QUSLJOB((char*)&inname, "JOBL0100", (char*)&jobinfo, "*ACTIVE ", 0078.00 &errcode);
のようにしてユーザー QTMHHTTP
のジョブをユーザー・スペース QTEMP/USLJOB
に出力する。
ただし出力されたジョブは活動中のジョブだけでなく異常終了したジョブも含まれている場合が
ある。
異常終了したジョブの見分け方は次のAPI : QUSRJOBI
で解説することとする。