Как в z/OS определить, какой продукт безопасности активен (RACF, ACF2 или Top Secret) в C?
В z/OS операционная система не требует наличия в системе определенного продукта безопасности, но позволяет людям выбирать свой собственный. Их 3 и они имеют разные возможности.
Для справки: для Java есть соответствующие вопросы и ответы , но мне нужно сделать это на C: Как с помощью Java определить, какой менеджер безопасности активен в z/OS?
2 ответа
Информацию можно найти в RCVT (который в документации также называется CVTRAC). «Идентификатор» в начале указывает на поставщика безопасности:
#ifdef _LP64
#error "This code is 31-bit addressing mode specific"
#endif
typedef struct {
char id[4];
} CVTRAC;
typedef struct {
char unk[0x3E0];
CVTRAC* cvtrac;
} CVT;
typedef struct {
char unk[0x10];
CVT* cvt;
} PSA;
typedef enum {
SAFUnk=0,
RACF=1,
TopSecret=2,
ACF2=3
} SAFProvider;
static SAFProvider saf_provider()
{
PSA* psa = (void*) 0;
char* id = psa->cvt->cvtrac->id;
if (!memcmp(id, "RCVT", 4)) {
return RACF;
} else if (!memcmp(id, "RTSS", 4)) {
return TopSecret;
} else if (!memcmp(id, "ACF2", 4)) {
return ACF2;
} else {
return SAFUnk;
}
}
Обратите внимание, что приведенный выше код будет работать только в том случае, если он создан для 31-битного режима адресации и скомпилирован без опции -qascii (строки, с которыми сравниваются, находятся в формате EBCDIC).
Вот пример кода REXX, который может помочь:
CVT = C2d(Storage(10,4)) /* point to CVT */
CVTRAC = C2d(Storage(D2x(CVT + 992),4)) /* point to RACF CVT */
RCVTID = Storage(D2x(CVTRAC),4) /* point to RCVTID */
select ;
when (RCVTID="RTSS") then secss="TOPSECRET" /* RTSS is TopSecret */
when (RCVTID="RCVT") then secss="RACF" /* RCVT is RACF */
otherwise secss=RCVTID /* ACF2 SECNAME = RCVTID*/
end;