I had a C program which opened a dataset and read from it. I enhanced it, by adding comments and other stuff, and after lunch it failed to open
I undid all my changes, and it still it failed to open! Weird.
I got message
- An error occurred when attempting to define a file to the system. (errno2=0xC00B0403)
- Programmer response : Check the __amrc structure for more information. See z/OS XL C/C++ Programming Guide for more information on the __amrc structure.
- The filename argument passed to fopen() or freopen() specified dsname syntax. Allocation of a ddname for the dsname was attempted, but failed.
- Programmer response: Failure information returned from SVC 99 was recorded in the AMRC structure. Use the information there to determine the cause of the failure.
This feels like the unhelpful messages Ive seen. “An error has occurred – we know what the error is – but we wont tell you” type messages.
To find the reason I had to add some code to my program.
file = fopen(fileName, mode ); __amrc_type save_amrc; memcpy(&save_amrc,__amrc,sizeof(__amrc)); printf("AMRC __svc99_info %hd error %hd\n", save_amrc.__code.__alloc.__svc99_info, save_amrc.__code.__alloc.__svc99_error);
and it printed
AMRC __svc99_info 0 528
The DYNALLOC (dynamic allocation) which uses SVC 99 to allocate data sets, has a section Interpreting error reason codes from DYNALLOC. The meaning of 528 is Requested data set unavailable. The data set is allocated to another job and its usage attribute conflicts with this request.
And true enough, in one of the ISPF sessions in one of my TSO userid I was editing the file.
It looks like
printf(“__errno2 = %08x\n”, __errno2());
Would print the same information.
It appears that you cannot tell fopen to open it for read even if it has a write lock on it.
For DYNALLOC, if the request worked, these fields may have garbage in them – as I got undocumented values.
It would be nice if the developer of the fopen code produced messages like
EDC5061I: An error occurred when attempting to define a file to the system. (errno2=0xC00B0403) (AMRC=0x00000210)
Then it would be more obvious!