Cobol has been a thorn in my side for a long time. Working for software vendors, it’s not a given that Cobol is installed because they don’t always need to run payroll and don’t have production instances.
It’s been a while since I have played with OpenCOBOL. It’s been so long that they have renamed it to GnuCobol instead.
I’ve gotten closer so far, but I still can’t get past the database connection. Here’s my notes.
Setup
First, I added the eth1 interface. The PUM comes with a host only connect by default. I didn’t want to affect the host only connection, so I added a second interface to the Virtualbox machine settings.
Next, I added the Oracle yum repository to make installing required packages easier.
cd /etc/yum.repos.d wget http://public-yum.oracle.com/public-yum-el5.repo yum list
These are the prerequisites needed for building…
yum install gmp-devel libtool db4 db4-devel
Note: If you look ahead, you’ll also want to install ncurses-devel and subversion as well.
Install
I downloaded Open Cobol. Now, it is actually called Gnu Cobol.
cp gnu-cobol-2.0_rc-2.tar.gz /opt cd /opt tar -xzvf gnu-cobol-2.0_rc-2.tar.gz cd gnu-cobol-2.0 ./configure make make install
Note, I just ran it all as root. The last make install line you would need sudo in front of.
At this point, I got a compile error, and it didn’t install. This is the end of the make output:
libtool: compile: gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -I.. -O2 -pipe -finline-functions -fsigned-char -Wall -Wwrite-strings -Wmissing-prototypes -Wno-format-y2k -U_FORTIFY_SOURCE -MT libcob_la-screenio.lo -MD -MP -MF .deps/libcob_la-screenio.Tpo -c screenio.c -fPIC -DPIC -o .libs/libcob_la-screenio.o screenio.c:2505: error: conflicting types for ‘cob_field_display’ ../libcob/common.h:1562: error: previous declaration of ‘cob_field_display’ was here screenio.c:2523: error: conflicting types for ‘cob_field_accept’ ../libcob/common.h:1566: error: previous declaration of ‘cob_field_accept’ was here screenio.c:2550: error: conflicting types for ‘cob_screen_accept’ ../libcob/common.h:1559: error: previous declaration of ‘cob_screen_accept’ was here make[2]: *** [libcob_la-screenio.lo] Error 1 make[2]: Leaving directory `/opt/gnu-cobol-2.0/libcob' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/opt/gnu-cobol-2.0' make: *** [all] Error 2 [/sorucecode] Fix: install ncurse development package: [sourcecode] yum install ncurses-devel
Ran configure and make again. It worked this time.
Compiling
Created compile script (using the script from the old post)
su - psadm1 cd $PS_HOME/setup vi gnucbl.sh chmod +x gnucbl.sh
Here’s the script that I have so far. I do need to change it to accomodate the PS_APP_HOME. Right now, it only compiles the COBOL in the PS_HOME.
#!/bin/sh if [ ! -e "$PS_HOME" ]; then BASEDIR=$(dirname "$0") PSCONFIG="$BASEDIR/../psconfig.sh" if [ -e "$PSCONFIG" ]; then . $PSCONFIG fi fi if [ -e "$PS_HOME" ]; then echo "PS_HOME = $PS_HOME" else echo "Error -- PS_HOME not set or does not exist" fi LOGDIR=$PS_HOME/cblout OUTDIR=$PS_HOME/cblopen if [ ! -e "$LOGDIR" ]; then mkdir "$LOGDIR" fi if [ ! -e "$OUTDIR" ]; then mkdir "$OUTDIR" fi cd $PS_HOME/src/cbl rm $LOGDIR/success.txt rm $LOGDIR/fail.txt for cbl in $(ls *.cbl); do echo "Compiling $cbl..." BASENAME=$(echo "$cbl" | sed 's/\..*$//') cobc -std=mf $cbl -o "$OUTDIR/$BASENAME.so" -t "$LOGDIR/$BASENAME.lis" > $LOGDIR/$BASENAME.out 2>&1 if [ "$?" == 0 ]; then echo "$cbl" >> $LOGDIR/success.txt echo " success" else echo "$cbl" >> $LOGDIR/fail.txt echo " fail" fi done
Updating
I found several compile errors with programs. As best I could tell, the fixes were coded but were not in the release. So, I decided to give the current development code a try. That seemed to fix the compile errors.
yum install subversion svn checkout https://svn.code.sf.net/p/open-cobol/code/trunk open-cobol-code
The svn command downloads the code. I ran the configure, make, and make install commands the way I did earlier.
OS Info Issue
The next issue is that it wouldn’t compile the COBOL because of a CBL_GET_OS_INFO procedure. As best I can tell, that is something that Microfocus COBOL has. Here’s the error message:
libcob: Cannot find module 'CBL_GET_OS_INFO'
I found it in:
- PTPNETRT.cbl
- PTPSQLRT.cbl
To fix it, I just commented out the call.
vi $PS_HOME/src/cbl/PTPSQLRT.cbl
Updated to:
* Skp -- Removed to use with GnuCobol * CALL 'CBL_GET_OS_INFO' USING PRMOS
To test, I ran it with this:
cobcrun PTPDBTST ORACLE/HR92U022/PS/PS/TST/167916//0
Required Library Errors
My next error was this:
libcob: Cannot find module 'C_SQLCNC'
I searched for a COBOL program that matched, but I didn’t find one:
find ../src/cbl -exec grep -il C_SQLCNC {} \;
So, I created this script to find the library:
#!/bin/bash function searchLib() { results=$(nm -D "$1" | grep -i "$2") found=$? if [ $found -eq 0 ]; then echo "Found: $1" echo "$results" echo echo fi } #searchLib ./bin/libpssqlapi.so "$1" find $PS_HOME -name \*.so | while read line; do searchLib $line "$1" \; done
Here was the output:
$ ./setup/libSearch.sh C_SQLCNC Found: /opt/oracle/psft/pt/ps_home8.55.14/bin/libpssqlapi.so 000000000000fb40 T C_SQLCNC Found: /opt/oracle/psft/pt/ps_home8.55.14/bin/libpssqlapi_ansi.so 000000000000e4f0 T C_SQLCNC
I attempted to include that path on the library path environment
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/opt/oracle/psft/pt/ps_home8.55.14/bin/
Next, I attempted to call the COBOL from a C program.
Here’s the source to gnurun.c (I put it into cblopen:
#include <libcob.h> extern int PTPDBTST(); int main(int argc, char **argv) { int ret; cob_init(argc, argv); ret = PTPDBTST(); return ret; }
I added the code to the cblopen directory, compiled it, and linked it together.
vi gnurun.c cc -c `cob-config --cflags` gnurun.c cobc -x -o gnurun gnurun.o PTPDBTST.so ./gnurun ORACLE/HR92U022/PS/PS/TST/167916//0
I linked in the library that I found earlier:
cobc -x -o gnurun gnurun.o PTPDBTST.so /opt/oracle/psft/pt/ps_home8.55.14/bin/libpssqlapi_ansi.so /opt/oracle/psft/pt/ps_home8.55.14/bin/libpssqlapi_ansi.so: undefined reference to `PS_sqlsil'
With that message, I searched for that library:
setup/libSearch.sh PS_sqlsil
It found this library:
/opt/oracle/psft/pt/ps_home8.55.14/bin/libpsora_ansi64.so
So, I tried to link it like this:
cobc -x -o gnurun gnurun.o PTPDBTST.so /opt/oracle/psft/pt/ps_home8.55.14/bin/libpssqlapi_ansi.so /opt/oracle/psft/pt/ps_home8.55.14/bin/libpsora_ansi64.so
I attempted these two environment variables as well. The first one worked great as far as making it so that I could run it from anywhere and not have to be in the “cblopen” directory where I had compiled the open cobol output. The 2nd variable didn’t help at all. I’m not sure why it wasn’t working.
COB_LIBRARY_PATH=/opt/oracle/psft/pt/ps_home8.55.14/cblopen COB_PRE_LOAD=/opt/oracle/psft/pt/ps_home8.55.14/bin/libpssqlapi_ansi.so
After adding the libpsora_ansi64.so library to the link command, I got this error message:
Application Program Failed Action Type : SQL CONNEC In Pgm Section : SQLRT:GG100 SQL-CONNECT With Return Code: 09977 Error Message : SQLRT: Attempting to use Ansi API for a Unicode DB FAIL TO CONNECT PTPDBTST: Application Program Failed In Pgm Section : CONNECT FAILED With Return Code: 09977 Error Message : SQLRT: Attempting to use Ansi API for a Unicode DB
This fixed the problem:
cobc -x -o gnurun gnurun.o PTPDBTST.so /opt/oracle/psft/pt/ps_home8.55.14/bin/libpssqlapi.so /opt/oracle/psft/pt/ps_home8.55.14/bin/libpsora64.so
Running through Process Scheduler
To get it to run from the process scheduler, I had to create the PSRUN script. I put it into $PS_HOME/bin/PSRUN
#!/bin/sh echo $* >> $PS_HOME/cblout.log echo $* export COB_LIBRARY_PATH=$PS_HOME/cblopen export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:$PS_HOME/cblopen $PS_HOME/cblopen/gnurun $2 | tee -a $PS_HOME/cblout.log
I can run it from the command line like this:
$ ./PSRUN PTPDBTST ORACLE/HR92U022/PS/PS/TST/167916//0PTPDBTST ORACLE/HR92U022/PS/PS/TST/167916//0 Application Program Failed Action Type : SQL CONNEC In Pgm Section : SQLRT:GG100 SQL-CONNECT With Return Code: 01045 Error Message : ORA-01045: user PS lacks CREATE SESSION privilege; logon denied FAIL TO CONNECT PTPDBTST: Application Program Failed In Pgm Section : CONNECT FAILED With Return Code: 01045 Error Message : ORA-01045: user PS lacks CREATE SESSION privilege; logon denied
I haven’t figured this issue out yet!
For the last issue you ran into, I do believe that you need to be using the connect id/password instead of PS credentials. The PS user does have a DB account, but it’s db logon privileges are revoked on tools installation. I looked at a COBOL process that peoplesoft starts, and the command line parameters passed in have the connect id and password and the PeopleSoft OPRID (with no password).
Here is an example of what I saw:
/path/to/PSRUNRMT COBOLNAME REMOTEUN/DBTYPE/DBNAME/OPRID/////0/connectid/connectpwd/a0769c7e-85ec-11eb-9904-9b4881102f20
An alternative solution to fix the CBL_GET_OS_INFO issue, is to apply this patch to your gnu cobol:
https://github.com/opensourcecobol/gnucobol-osscons-patch/commit/6158888142c4551ba9100e86ab4d9f43cf6c48a0
Then the files can be fully compiled without having to leave anything out.