CSRIDAC IBM Window Services (DWS) с недопустимой длиной DSNAME
Я работаю в z/OS и пытаюсь использовать Windows Services, предоставляемые IBM. Все работает отлично, кроме создания объекта его DSNAME.
Когда я вызываю CSRIDAC с DSNAME, у меня появляется ошибка:"Системе не удалось выделить или нераспределить набор данных, указанный как имя_объекта. Значение rrrr - это код возврата из динамического распределения. Значение nnnn - это двухбайтовый код причины из динамическое распределение. Информацию о кодах возврата и причин динамического распределения см. в разделе Программирование MVS для z/OS.
Поэтому я искал значение кода причины 037c и обнаружил: "В текстовой единице указан неверный LEN. В сопроводительном сообщении IKJ56231I указывается номер ошибочной текстовой единицы".
Таким образом, кажется, что Window Services вызывает службу динамического выделения для создания объекта по его DSNAME и делает ошибку, когда подсчитывает количество символов в DSNAME, которое я предоставил.
Мое имя DSNAME является допустимым именем файла VSAM, и я успешно прочитал этот набор данных другим способом с тем же именем DSNAME.
Итак, вот код моей функции, вызывающей функцию CSRIDAC:
ozwinsrvObject *ozwinsrvObjectCreate(uint32_t uiFlags, int32_t iObjectSize, uint8_t *pcObjectName, int32_t *piHighOffset, int32_t *piRc)
{
ozwinsrvObject *pobject = __malloc31(sizeof(ozwinsrvObject));
*piRc = OZWINSRV_NO_ERROR;
pobject->pheap = __malloc31(18*4);
pobject->pparmList = __malloc31(11 * sizeof(int32_t));
memcpy(&pobject->parmObject.acOpType[0] , "BEGIN", 5);
pobject->parmObject.iObjectSize = iObjectSize;
pobject->parmObject.iHighOffset = *piHighOffset;
if(uiFlags & OZWINSRV_OBJECT_F_TYPE_DDNAME)
{
memcpy(&pobject->parmObject.acObjectType[0], "DDNAME ", 9);
}
else {
if(uiFlags & OZWINSRV_OBJECT_F_TYPE_DSNAME)
{
memcpy(&pobject->parmObject.acObjectType[0], "DSNAME ", 9);
}
else
{
memcpy(&pobject->parmObject.acObjectType[0], "TEMPSPACE", 9);
}
}
if(uiFlags & OZWINSRV_OBJECT_F_SCROLL_AREA_YES)
{
memcpy(&pobject->parmObject.acScrollArea[0], "YES", 3);
}
else
{
memcpy(&pobject->parmObject.acScrollArea[0], "NO ", 3);
}
if(uiFlags & OZWINSRV_OBJECT_F_STATE_NEW)
{
memcpy(&pobject->parmObject.acObjectState[0], "NEW", 3);
}
else
{
memcpy(&pobject->parmObject.acObjectState[0], "OLD", 3);
}
if(uiFlags & OZWINSRV_OBJECT_F_ACCESS_MODE_UPDATE)
{
memcpy(&pobject->parmObject.acAccessMode[0], "UPDATE", 6);
}
else
{
memcpy(&pobject->parmObject.acAccessMode[0], "READ ", 6);
}
memcpy(&pobject->acObjectName[0], pcObjectName, strlen(pcObjectName));
if(strlen(pcObjectName) < 45)
{
pobject->acObjectName[strlen(pcObjectName)] = ' ';
}
memset(pobject->pparmList, 0, 11 * sizeof(int32_t));
pobject->pparmList[0] = (int32_t) &pobject->parmObject.acOpType[0];
pobject->pparmList[1] = (int32_t) &pobject->parmObject.acObjectType[0];
pobject->pparmList[2] = (int32_t) &pobject->parmObject.acObjectName[0];
pobject->pparmList[3] = (int32_t) &pobject->parmObject.acScrollArea[0];
pobject->pparmList[4] = (int32_t) &pobject->parmObject.acObjectState[0];
pobject->pparmList[5] = (int32_t) &pobject->parmObject.acAccessMode[0];
pobject->pparmList[6] = (int32_t) &pobject->parmObject.iObjectSize;
pobject->pparmList[7] = (int32_t) &pobject->acObjectId[0];
pobject->pparmList[8] = (int32_t) &pobject->parmObject.iHighOffset;
pobject->pparmList[9] = (int32_t) &pobject->parmObject.iRc;
pobject->pparmList[10] = (int32_t) &pobject->parmObject.iReasonC;
x6csridac(pobject->pparmList, pobject->pheap);
if(pobject->parmObject.iRc != 0)
{
printf("Error creating object (csridac) Rc=0x%x, ReasonC=0x%x\n", pobject->parmObject.iRc, pobject->parmObject.iReasonC);
*piRc = OZWINSRV_ERROR_WINDOW_OBJECT_CREATE;
}
*piHighOffset = pobject->parmObject.iHighOffset;
pobject->iObjectSize = iObjectSize;
pobject->uiFlags = uiFlags;
pobject->uiNbViews = 0;
return pobject;
}
Затем вот код, вызывающий эту функцию:
int32_t iRc = 0;
int32_t iPageSize = 32*1024;
int32_t iPageOffset = iPageSize/4/1024;
int32_t iSize = 1;
int32_t iRealSize = 1;
ozwinsrvObject *pObject;
ozwinsrvWindow *pWindow;
uint8_t acFileName[] = "DSNB10.DSNDBC.DBTLS00.TS1449.I0001.A001";
pObject = ozwinsrvObjectCreate(OZWINSRV_OBJECT_F_ACCESS_MODE_READ | OZWINSRV_OBJECT_F_SCROLL_AREA_NO | OZWINSRV_OBJECT_F_STATE_OLD | OZWINSRV_OBJECT_F_TYPE_DSNAME,
iSize, &acFileName[0], &iRealSize, &iRc);
Я надеюсь, что мое объяснение проблемы ясно. Не стесняйтесь задавать вопросы, если это не так. Спасибо!
1 ответ
Я нашел свою ошибку и опубликовал ответ. Я использую следующую строку, чтобы скопировать имя в массиве:
memcpy(&pobject->acObjectName[0], pcObjectName, strlen(pcObjectName));
Но! Когда я помещаю этот массив в свой список параметров, я использую эту строку кода:
pobject->pparmList[2] = (int32_t) &pobject->parmObject.acObjectName[0];
Это означает, что имя находится в pobject->acObjectName, и я поместил pobject->parmObject.acObjectName в список параметров. Эти два массива не являются одинаковыми переменными...
Я прошу прощения за мою ошибку и подтверждаю, что DWS работает хорошо.