| $! MKSHARED.COM -- Create shareable images. |
| $! |
| $! P1: "64" for 64-bit pointers. |
| $! |
| $! P2: Zlib object library path (optional). |
| $! |
| $! Input: [.UTIL]LIBEAY.NUM,[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO[32].OLB |
| $! [.UTIL]SSLEAY.NUM,[.xxx.EXE.SSL]SSL_LIBSSL[32].OLB |
| $! [.CRYPTO.xxx]OPENSSLCONF.H |
| $! Output: [.xxx.EXE.CRYPTO]SSL_LIBCRYPTO_SHR[32].OPT,.MAP,.EXE |
| $! [.xxx.EXE.SSL]SSL_LIBSSL_SRH[32].OPT,.MAP,.EXE |
| $! |
| $! So far, tests have only been made on VMS for Alpha. VAX will come in time. |
| $! =========================================================================== |
| $! |
| $! Announce/identify. |
| $! |
| $ proc = f$environment( "procedure") |
| $ write sys$output "@@@ "+ - |
| f$parse( proc, , , "name")+ f$parse( proc, , , "type") |
| $! |
| $! Save the original default device:[directory]. |
| $! |
| $ def_orig = f$environment( "default") |
| $ on error then goto tidy |
| $ on control_c then goto tidy |
| $! |
| $! SET DEFAULT to the main kit directory. |
| $! |
| $ proc = f$environment("procedure") |
| $ proc = f$parse( "A.;", proc)- "A.;" |
| $ set default 'proc' |
| $ set default [-] |
| $! |
| $! ----- Prepare info for processing: version number and file info |
| $ gosub read_version_info |
| $ if libver .eqs. "" |
| $ then |
| $ write sys$error "ERROR: Couldn't find any library version info..." |
| $ go to tidy: |
| $ endif |
| $ |
| $ if (f$getsyi("cpu") .lt. 128) |
| $ then |
| $ arch_vax = 1 |
| $ arch = "VAX" |
| $ else |
| $ arch_vax = 0 |
| $ arch = f$edit( f$getsyi( "ARCH_NAME"), "UPCASE") |
| $ if (arch .eqs. "") then arch = "UNK" |
| $ endif |
| $! |
| $ archd = arch |
| $ lib32 = "32" |
| $ shr = "SHR32" |
| $! |
| $ if (p1 .nes. "") |
| $ then |
| $ if (p1 .eqs. "64") |
| $ then |
| $ archd = arch+ "_64" |
| $ lib32 = "" |
| $ shr = "SHR" |
| $ else |
| $ if (p1 .nes. "32") |
| $ then |
| $ write sys$output "Second argument invalid." |
| $ write sys$output "It should be "32", "64", or nothing." |
| $ exit |
| $ endif |
| $ endif |
| $ endif |
| $! |
| $! ----- Prepare info for processing: disabled algorithms info |
| $ gosub read_disabled_algorithms_info |
| $! |
| $ ZLIB = p2 |
| $ zlib_lib = "" |
| $ if (ZLIB .nes. "") |
| $ then |
| $ file2 = f$parse( ZLIB, "libz.olb", , , "syntax_only") |
| $ if (f$search( file2) .eqs. "") |
| $ then |
| $ write sys$output "" |
| $ write sys$output "The Option ", ZLIB, " Is Invalid." |
| $ write sys$output " Can't find library: ''file2'" |
| $ write sys$output "" |
| $ goto tidy |
| $ endif |
| $ zlib_lib = ", ''file2' /library" |
| $ endif |
| $! |
| $ if (arch_vax) |
| $ then |
| $ libtit = "CRYPTO_TRANSFER_VECTOR" |
| $ libid = "Crypto" |
| $ libnum = "[.UTIL]LIBEAY.NUM" |
| $ libdir = "[.''ARCHD'.EXE.CRYPTO]" |
| $ libmar = "''libdir'SSL_LIBCRYPTO_''shr'.MAR" |
| $ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB" |
| $ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT" |
| $ libobj = "''libdir'SSL_LIBCRYPTO_''shr'.OBJ" |
| $ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP" |
| $ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE" |
| $ libref = "" |
| $ libvec = "LIBCRYPTO" |
| $ if f$search( libolb) .nes. "" then gosub create_vax_shr |
| $ libtit = "SSL_TRANSFER_VECTOR" |
| $ libid = "SSL" |
| $ libnum = "[.UTIL]SSLEAY.NUM" |
| $ libdir = "[.''ARCHD'.EXE.SSL]" |
| $ libmar = "''libdir'SSL_LIBSSL_''shr'.MAR" |
| $ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB" |
| $ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT" |
| $ libobj = "''libdir'SSL_LIBSSL_''shr'.OBJ" |
| $ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP" |
| $ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE" |
| $ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE" |
| $ libvec = "LIBSSL" |
| $ if f$search( libolb) .nes. "" then gosub create_vax_shr |
| $ else |
| $ libid = "Crypto" |
| $ libnum = "[.UTIL]LIBEAY.NUM" |
| $ libdir = "[.''ARCHD'.EXE.CRYPTO]" |
| $ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB" |
| $ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT" |
| $ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP" |
| $ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE" |
| $ libref = "" |
| $ if f$search( libolb) .nes. "" then gosub create_nonvax_shr |
| $ libid = "SSL" |
| $ libnum = "[.UTIL]SSLEAY.NUM" |
| $ libdir = "[.''ARCHD'.EXE.SSL]" |
| $ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB" |
| $ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT" |
| $ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP" |
| $ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE" |
| $ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE" |
| $ if f$search( libolb) .nes. "" then gosub create_nonvax_shr |
| $ endif |
| $! |
| $ tidy: |
| $! |
| $! Close any open files. |
| $! |
| $ if (f$trnlnm( "libnum", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - |
| close libnum |
| $! |
| $ if (f$trnlnm( "mar", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - |
| close mar |
| $! |
| $ if (f$trnlnm( "opt", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - |
| close opt |
| $! |
| $ if (f$trnlnm( "vf", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - |
| close vf |
| $! |
| $! Restore the original default device:[directory]. |
| $! |
| $ set default 'def_orig' |
| $ exit |
| $ |
| $! ----- Subroutines to build the shareable libraries |
| $! For each supported architecture, there's a main shareable library |
| $! creator, which is called from the main code above. |
| $! The creator will define a number of variables to tell the next levels of |
| $! subroutines what routines to use to write to the option files, call the |
| $! main processor, read_func_num, and when that is done, it will write version |
| $! data at the end of the .opt file, close it, and link the library. |
| $! |
| $! read_func_num reads through a .num file and calls the writer routine for |
| $! each line. It's also responsible for checking that order is properly kept |
| $! in the .num file, check that each line applies to VMS and the architecture, |
| $! and to fill in "holes" with dummy entries. |
| $! |
| $! The creator routines depend on the following variables: |
| $! libnum The name of the .num file to use as input |
| $! libolb The name of the object library to build from |
| $! libid The identification string of the shareable library |
| $! libopt The name of the .opt file to write |
| $! libtit The title of the assembler transfer vector file (VAX only) |
| $! libmar The name of the assembler transfer vector file (VAX only) |
| $! libmap The name of the map file to write |
| $! libgoal The name of the shareable library to write |
| $! libref The name of a shareable library to link in |
| $! |
| $! read_func_num depends on the following variables from the creator: |
| $! libwriter The name of the writer routine to call for each .num file line |
| $! ----- |
| $ |
| $! ----- Subroutines for non-VAX |
| $! ----- |
| $! The creator routine |
| $ create_nonvax_shr: |
| $ open /write opt 'libopt' |
| $ write opt "identification=""",libid," ",libverstr,"""" |
| $ write opt libolb, " /library" |
| $ if libref .nes. "" then write opt libref,"/SHARE" |
| $ write opt "SYMBOL_VECTOR=(-" |
| $ libfirstentry := true |
| $ libwrch := opt |
| $ libwriter := write_nonvax_transfer_entry |
| $ textcount = 0 |
| $ gosub read_func_num |
| $ write opt ")" |
| $ write opt "GSMATCH=",libvmatch,",",libver |
| $ close opt |
| $ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options - |
| 'zlib_lib' |
| $ return |
| $ |
| $! The record writer routine |
| $ write_nonvax_transfer_entry: |
| $ if libentry .eqs. ".dummy" then return |
| $ if info_kind .eqs. "VARIABLE" |
| $ then |
| $ pr:=DATA |
| $ else |
| $ pr:=PROCEDURE |
| $ endif |
| $ textcount_this = f$length(pr) + f$length(libentry) + 5 |
| $ if textcount + textcount_this .gt. 1024 |
| $ then |
| $ write opt ")" |
| $ write opt "SYMBOL_VECTOR=(-" |
| $ textcount = 16 |
| $ libfirstentry := true |
| $ endif |
| $ if libfirstentry |
| $ then |
| $ write 'libwrch' " ",libentry,"=",pr," -" |
| $ else |
| $ write 'libwrch' " ,",libentry,"=",pr," -" |
| $ endif |
| $ libfirstentry := false |
| $ textcount = textcount + textcount_this |
| $ return |
| $ |
| $! ----- Subroutines for VAX |
| $! ----- |
| $! The creator routine |
| $ create_vax_shr: |
| $ open /write mar 'libmar' |
| $ type sys$input:/out=mar: |
| ; |
| ; Transfer vector for VAX shareable image |
| ; |
| $ write mar " .TITLE ",libtit |
| $ write mar " .IDENT /",libid,"/" |
| $ type sys$input:/out=mar: |
| ; |
| ; Define macro to assist in building transfer vector entries. Each entry |
| ; should take no more than 8 bytes. |
| ; |
| .MACRO FTRANSFER_ENTRY routine |
| .ALIGN QUAD |
| .TRANSFER routine |
| .MASK routine |
| JMP routine+2 |
| .ENDM FTRANSFER_ENTRY |
| ; |
| ; Place entries in own program section. |
| ; |
| $ write mar " .PSECT $$",libvec,",QUAD,PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT" |
| $ write mar libvec,"_xfer:" |
| $ libwrch := mar |
| $ libwriter := write_vax_ftransfer_entry |
| $ gosub read_func_num |
| $ type sys$input:/out=mar: |
| ; |
| ; Allocate extra storage at end of vector to allow for expansion. |
| ; |
| $ write mar " .BLKB 32768-<.-",libvec,"_xfer> ; 64 pages total." |
| $! libwriter := write_vax_vtransfer_entry |
| $! gosub read_func_num |
| $ write mar " .END" |
| $ close mar |
| $ open /write opt 'libopt' |
| $ write opt "identification=""",libid," ",libverstr,"""" |
| $ write opt libobj |
| $ write opt libolb, " /library" |
| $ if libref .nes. "" then write opt libref,"/SHARE" |
| $ type sys$input:/out=opt: |
| ! |
| ! Ensure transfer vector is at beginning of image |
| ! |
| CLUSTER=FIRST |
| $ write opt "COLLECT=FIRST,$$",libvec |
| $ write opt "GSMATCH=",libvmatch,",",libver |
| $ type sys$input:/out=opt: |
| ! |
| ! make psects nonshareable so image can be installed. |
| ! |
| PSECT_ATTR=$CHAR_STRING_CONSTANTS,NOWRT |
| $ libwrch := opt |
| $ libwriter := write_vax_psect_attr |
| $ gosub read_func_num |
| $ close opt |
| $ macro/obj='libobj' 'libmar' |
| $ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options - |
| 'zlib_lib' |
| $ return |
| $ |
| $! The record writer routine for VAX functions |
| $ write_vax_ftransfer_entry: |
| $ if info_kind .nes. "FUNCTION" then return |
| $ if libentry .eqs ".dummy" |
| $ then |
| $ write 'libwrch' " .BLKB 8" ! Dummy is zeroes... |
| $ else |
| $ write 'libwrch' " FTRANSFER_ENTRY ",libentry |
| $ endif |
| $ return |
| $! The record writer routine for VAX variables (should never happen!) |
| $ write_vax_psect_attr: |
| $ if info_kind .nes. "VARIABLE" then return |
| $ if libentry .eqs ".dummy" then return |
| $ write 'libwrch' "PSECT_ATTR=",libentry,",NOSHR" |
| $ return |
| $ |
| $! ----- Common subroutines |
| $! ----- |
| $! The .num file reader. This one has great responsibility. |
| $ read_func_num: |
| $ open /read libnum 'libnum' |
| $ goto read_nums |
| $ |
| $ read_nums: |
| $ libentrynum=0 |
| $ liblastentry:=false |
| $ entrycount=0 |
| $ loop: |
| $ read /end=loop_end /err=loop_end libnum line |
| $ lin = f$edit( line, "COMPRESS,TRIM") |
| $! Skip a "#" comment line. |
| $ if (f$extract( 0, 1, lin) .eqs. "#") then goto loop |
| $ entrynum = f$int(f$element( 1, " ", lin)) |
| $ entryinfo = f$element( 2, " ", lin) |
| $ curentry = f$element( 0, " ", lin) |
| $ info_exist = f$element( 0, ":", entryinfo) |
| $ info_platforms = ","+ f$element(1, ":", entryinfo)+ "," |
| $ info_kind = f$element( 2, ":", entryinfo) |
| $ info_algorithms = ","+ f$element( 3, ":", entryinfo)+ "," |
| $ if info_exist .eqs. "NOEXIST" then goto loop |
| $ truesum = 0 |
| $ falsesum = 0 |
| $ negatives = 1 |
| $ plat_i = 0 |
| $ loop1: |
| $ plat_entry = f$element( plat_i, ",", info_platforms) |
| $ plat_i = plat_i + 1 |
| $ if plat_entry .eqs. "" then goto loop1 |
| $ if plat_entry .nes. "," |
| $ then |
| $ if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0 |
| $ if (arch_vax) |
| $ then |
| $ if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then - |
| $ truesum = truesum + 1 |
| $ if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then - |
| $ falsesum = falsesum + 1 |
| $ endif |
| $! |
| $ if ((plat_entry .eqs. "VMS") .or. - |
| ((plat_entry .eqs. "ZLIB") .and. (ZLIB .nes. "")) .or. - |
| (arch_vax .and. (plat_entry .eqs. "VMSVAX"))) then - |
| truesum = truesum + 1 |
| $! |
| $ if ((plat_entry .eqs. "!VMS") .or. - |
| (arch_vax .and. (plat_entry .eqs. "!VMSVAX"))) then - |
| falsesum = falsesum + 1 |
| $! |
| $ goto loop1 |
| $ endif |
| $ endloop1: |
| $!DEBUG!$ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms |
| $!DEBUG!$ then |
| $!DEBUG!$ write sys$output line |
| $!DEBUG!$ write sys$output " truesum = ",truesum,- |
| $!DEBUG! ", negatives = ",negatives,", falsesum = ",falsesum |
| $!DEBUG!$ endif |
| $ if falsesum .ne. 0 then goto loop |
| $ if truesum+negatives .eq. 0 then goto loop |
| $ alg_i = 0 |
| $ loop2: |
| $ alg_entry = f$element(alg_i,",",info_algorithms) |
| $ alg_i = alg_i + 1 |
| $ if alg_entry .eqs. "" then goto loop2 |
| $ if alg_entry .nes. "," |
| $ then |
| $ if disabled_algorithms - ("," + alg_entry + ",") .nes disabled_algorithms then goto loop |
| $ if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop |
| $ goto loop2 |
| $ endif |
| $ endloop2: |
| $ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms |
| $ then |
| $!DEBUG!$ write sys$output curentry," ; ",entrynum," ; ",entryinfo |
| $ endif |
| $ redo: |
| $ next:=loop |
| $ tolibentry=curentry |
| $ if libentrynum .ne. entrynum |
| $ then |
| $ entrycount=entrycount+1 |
| $ if entrycount .lt. entrynum |
| $ then |
| $!DEBUG!$ write sys$output "Info: entrycount: ''entrycount', entrynum: ''entrynum' => 0" |
| $ tolibentry=".dummy" |
| $ next:=redo |
| $ endif |
| $ if entrycount .gt. entrynum |
| $ then |
| $ write sys$error "Decreasing library entry numbers! Can't continue" |
| $ write sys$error """",line,"""" |
| $ close libnum |
| $ return |
| $ endif |
| $ libentry=tolibentry |
| $!DEBUG!$ write sys$output entrycount," ",libentry," ",entryinfo |
| $ if libentry .nes. "" .and. libwriter .nes. "" then gosub 'libwriter' |
| $ else |
| $ write sys$error "Info: ""''curentry'"" is an alias for ""''libentry'"". Overriding..." |
| $ endif |
| $ libentrynum=entrycount |
| $ goto 'next' |
| $ loop_end: |
| $ close libnum |
| $ return |
| $ |
| $! The version number reader |
| $ read_version_info: |
| $ libver = "" |
| $ open /read vf [.CRYPTO]OPENSSLV.H |
| $ loop_rvi: |
| $ read/err=endloop_rvi/end=endloop_rvi vf rvi_line |
| $ if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then - |
| goto loop_rvi |
| $ libverstr = f$element(1,"""",rvi_line) |
| $ libvmajor = f$element(0,".",libverstr) |
| $ libvminor = f$element(1,".",libverstr) |
| $ libvedit = f$element(2,".",libverstr) |
| $ libvpatch = f$cvui(0,8,f$extract(1,1,libvedit)+"@")-f$cvui(0,8,"@") |
| $ libvedit = f$extract(0,1,libvedit) |
| $ libver = f$string(f$int(libvmajor)*100)+","+- |
| f$string(f$int(libvminor)*100+f$int(libvedit)*10+f$int(libvpatch)) |
| $ if libvmajor .eqs. "0" |
| $ then |
| $ libvmatch = "EQUAL" |
| $ else |
| $ ! Starting with the 1.0 release, backward compatibility should be |
| $ ! kept, so switch over to the following |
| $ libvmatch = "LEQUAL" |
| $ endif |
| $ endloop_rvi: |
| $ close vf |
| $ return |
| $ |
| $! The disabled algorithms reader |
| $ read_disabled_algorithms_info: |
| $ disabled_algorithms = "," |
| $ open /read cf [.CRYPTO.'ARCH']OPENSSLCONF.H |
| $ loop_rci: |
| $ read/err=endloop_rci/end=endloop_rci cf rci_line |
| $ rci_line = f$edit(rci_line,"TRIM,COMPRESS") |
| $ rci_ei = 0 |
| $ if f$extract(0,9,rci_line) .eqs. "# define " then rci_ei = 2 |
| $ if f$extract(0,8,rci_line) .eqs. "#define " then rci_ei = 1 |
| $ if rci_ei .eq. 0 then goto loop_rci |
| $ rci_e = f$element(rci_ei," ",rci_line) |
| $ if f$extract(0,11,rci_e) .nes. "OPENSSL_NO_" then goto loop_rci |
| $ disabled_algorithms = disabled_algorithms + f$extract(11,999,rci_e) + "," |
| $ goto loop_rci |
| $ endloop_rci: |
| $ close cf |
| $ return |