I have an updated C run time library. How do I test it on z/OS, bearing in mind the libraries are in the linklist (dataset available to every one), and I want to use them from Unix.
You can refresh the Linklist, by creating a new definition using console commands, and activating it.
Because you may need to update more that one library as part of the update, you update the definitions, then activate them. If you update linklist one data set at a time, you could get inconsistent libraries in the link list for a short period.
You have one active (current list) and can have multiple other list definitions.
You can
- copy the current definitions
- add data sets
- remove data sets
- activate a definition
To display what is in the current link list you can use the SDSF option LNK, or use the operator command D PROG,LNKLST
D PROG,LNKLST
CSV470I 12.06.05 LNKLST DISPLAY 605
LNKLST SET LNKLST00 LNKAUTH=LNKLST
ENTRY APF VOLUME DSNAME
1 A B3RES1 SYS1.LINKLIB
2 A B3RES1 SYS1.MIGLIB
3 A B3RES1 SYS1.CSSLIB
4 A B3RES1 SYS1.SIEALNKE
5 A B3RES1 SYS1.SIEAMIGE
6 A B3RES1 SYS1.SHASLNKE
7 A B3RES1 SYS1.SERBLNKE
8 A B3RES1 SYS1.SGRBLINK
9 A B3RES1 SYS1.SHASMIG
10 B3RES1 SYS1.SCBDHENU
...
Note: Some of these are APF authorised.
You can display what lists are active using the command
D PROG,LNKLST,NAMES
This gave
CSV472I 19.25.26 LNKLST DISPLAY 848
LNKLST SET LNKLST SET LNKLST SET LNKLST SET
LNKLST00 COLIN
To create a new definition called MY based on my current defintion; and activate it
SETPROG LNKLST,DEFINE,NAME=MY,COPYFROM=CURRENT
bSETPROG LNKLST,ADD,NAME=MY,DSN=CEE.SCEERUN.NEW
SETPROG LNKLST,delete,NAME=MY,dsname=CEE.SCEERUN
SETPROG LNKLST,ADD,NAME=MY,DSN=CEE.SCEERUN2.NEW
SETPROG LNKLST,delete,NAME=MY,dsname=CEE.SCEERUN2
SETPROG LNKLST,ACTIVATE,NAME=MY
You can put these statements in a parmlib member PROGxx see here, and then activate them using the operator command
t prog=xx
How do jobs get the new libraries
This is a more subtle than I first thought.
From my TSO userid COLIN, I went into Unix and issued a Python command, and the command now worked, so I was picking up the libraries. Round of applause – job done.
I then checked my ISPF session. The command ISRDDN displays the datasets allocated to ISPF. The lnk command, shows what is defined in the lnklst. This showed
B3RES1 > LINKLIST SYS1.LINKLIB
B3RES1 > SYS1.MIGLIB
...
B3RES2 > CEE.SCEERUN
...
B3RES2 > CEE.SCEERUN2
so my main ISPF task was unchanged.
I used the command
setprog LNKLST,UPDATE,JOB=COLIN
CSV504I JOB COLIN IS NOW USING THE CURRENT LNKLST SET
to update the COLIN job, and then the ISRDDN LNK gave
B3PRD1 > LINKLIST FAN140.SEAGLMD
...
USER08 *SMS > CEE.SCEERUN.NEW
B3USR1 *SMS > CEE.SCEERUN2.NEW
which has update the COLIN job.
Logging on with a different userid, it got the updated definitions.
I tried to logon using SSH, and this failed with messages on the console
BPXP024I BPXAS INITIATOR STARTED ON BEHALF OF JOB SSHD1 RUNNING I
004B
ICH408I USER(OMVSKERN) GROUP(OMVSGRP ) NAME(OMVSKERN )
CSFIQA CL(CSFSERV )
WARNING: INSUFFICIENT AUTHORITY - TEMPORARY ACCESS ALLOWED
FROM CSF* (G)
ACCESS INTENT(READ ) ACCESS ALLOWED(NONE )
ICH420I PROGRAM CEEBINIT FROM LIBRARY CEE.SCEERUN.NEW CAUSED THE
ENVIRONMENT TO BECOME UNCONTROLLED.
BPXP014I ENVIRONMENT MUST BE CONTROLLED FOR DAEMON (BPX.DAEMON)
PROCESSING.
ICH420I PROGRAM CEEBINIT FROM LIBRARY CEE.SCEERUN.NEW CAUSED THE
ENVIRONMENT TO BECOME UNCONTROLLED.
BPXP014I ENVIRONMENT MUST BE CONTROLLED FOR DAEMON (BPX.DAEMON)
PROCESSING.
This is because the CEE.SCEERUN was APF authorised, and CEE.SCEERUN.NEW was not APF authorised.
I dynamically APF authorised them
SETPROG APF,add,DSN=CEE.SCEERUN2.NEW,SMS
SETPROG APF,add,DSN=CEE.SCEERUN.NEW,SMS
SSH failed the same way.
The easiest thing for me to do on my system was Re-IPL.
Once you’ve done the activate
Thanks to Todd Burch for reminding me that you need to refresh the Link List Lookaside(LLA).
f lla,refresh
Any new jobs will use the updated LNKLST.
Previously running jobs will continue to use the old LNKLST, unless you tell the the jobs, they can use the new LNKLIST, with the UPDATE option.
setprog LNKLST,UPDATE,JOB=*
It is still not that simple…
Todd Birch told me
The process documented by IBM leaves some room for interpretation, unfortunately. After a COPYFROM=CURRENT, I DELETE the old DSNAME and then ADD the new DSNAME. I prefer to use BEFORE or AFTER to put the new DSNAME back in the same place, otherwise, the ADD defaults to the end of the linklist concat.
Also, we use shared dasd, so we tend to use the same dataset names when we delete and re-add. Our process is to IEBCOPY w/replace the old library from our build system (via shared dasd), then on the testing system, stop LLA, define a new LL with COPYFROM=CURRENT, then delete the old DSNAME lib, then re-add the same name using BEFORE or AFTER to keep the concatenation as before**, and then activate and update and then restart LLA.
**it’s typical for us to have both a test library allocated just prior to a production library, akin to
MY.TEST.PRODUCT.LIB
MY.PROD.PRODUCT.LIB
and since we are testing a new test lib, we delete MY.TEST.PRODUCT.LIB and then add it back BEFORE MY.PROD.PRODUCT.LIB.
If you use LLA, be sure to refresh it too.
LikeLike
Thank you, I’ve updated it, and given you the credit
LikeLike
You have some duplicate lines in your example. You add twice and delete twice. There’s no need to delete at all. You should also issue the LNKLST,UPDATE JOB=* command at the end.
LikeLike
Thank you, I mis-copied I had sceerun and screerun2… If I didnt delete there were
CEE.SCEERUN and
CEE.SCEERUN.NEW in the list.
The doc is not clear as to which would be used is it the first in the list or the last in the list.
Doing a delete makes it obvious.
If you say the last is the list takes precedence, I’ll raise a doc commment on this.
LikeLike
I see now you are using 2 distinct dataset names. I missed that before.
The process documented by IBM leaves some room for interpretation, unfortunately. After a COPYFROM=CURRENT, I DELETE the old DSNAME and then ADD the new DSNAME. I prefer to use BEFORE or AFTER to put the new DSNAME back in the same place, otherwise, the ADD defaults to the end of the linklist concat.
Also, we use shared dasd, so we tend to use the same dataset names when we delete and re-add. Our process is to IEBCOPY w/replace the old library from our build system (via shared dasd), then on the testing system, stop LLA, define a new LL with COPYFROM=CURRENT, then delete the old DSNAME lib, then re-add the same name using BEFORE or AFTER to keep the concatenation as before**, and then activate and update and then restart LLA.
**it’s typical for us to have both a test library allocated just prior to a production library, akin to
MY.TEST.PRODUCT.LIB
MY.PROD.PRODUCT.LIB
and since we are testing a new test lib, we delete MY.TEST.PRODUCT.LIB and then add it back BEFORE MY.PROD.PRODUCT.LIB.
LikeLike