Don't use CRYPTO_AES_CTR if it isn't defined.
[openssl.git] / VMS / mkshared.com
1 $! MKSHARED.COM -- Create shareable images.
2 $!
3 $! P1: "64" for 64-bit pointers.
4 $!
5 $! P2: Zlib object library path (optional).
6 $!
7 $! Input:       [.UTIL]LIBEAY.NUM,[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO[32].OLB
8 $!              [.UTIL]SSLEAY.NUM,[.xxx.EXE.SSL]SSL_LIBSSL[32].OLB
9 $!              [.CRYPTO.xxx]OPENSSLCONF.H
10 $! Output:      [.xxx.EXE.CRYPTO]SSL_LIBCRYPTO_SHR[32].OPT,.MAP,.EXE
11 $!              [.xxx.EXE.SSL]SSL_LIBSSL_SRH[32].OPT,.MAP,.EXE
12 $!
13 $! So far, tests have only been made on VMS for Alpha.  VAX will come in time.
14 $! ===========================================================================
15 $!
16 $! Announce/identify.
17 $!
18 $ proc = f$environment( "procedure")
19 $ write sys$output "@@@ "+ -
20    f$parse( proc, , , "name")+ f$parse( proc, , , "type")
21 $!
22 $! Save the original default device:[directory].
23 $!
24 $ def_orig = f$environment( "default")
25 $ on error then goto tidy
26 $ on control_c then goto tidy
27 $!
28 $! SET DEFAULT to the main kit directory.
29 $!
30 $ proc = f$environment("procedure")
31 $ proc = f$parse( "A.;", proc)- "A.;"
32 $ set default 'proc'
33 $ set default [-]
34 $!
35 $! ----- Prepare info for processing: version number and file info
36 $ gosub read_version_info
37 $ if libver .eqs. ""
38 $ then
39 $   write sys$error "ERROR: Couldn't find any library version info..."
40 $   go to tidy:
41 $ endif
42 $
43 $ if (f$getsyi("cpu") .lt. 128)
44 $ then
45 $   arch_vax = 1
46 $   arch = "VAX"
47 $ else
48 $   arch_vax = 0
49 $   arch = f$edit( f$getsyi( "ARCH_NAME"), "UPCASE")
50 $   if (arch .eqs. "") then arch = "UNK"
51 $ endif
52 $!
53 $ archd = arch
54 $ lib32 = "32"
55 $ shr = "SHR32"
56 $!
57 $ if (p1 .nes. "")
58 $ then
59 $   if (p1 .eqs. "64")
60 $   then
61 $     archd = arch+ "_64"
62 $     lib32 = ""
63 $     shr = "SHR"
64 $   else
65 $     if (p1 .nes. "32")
66 $     then
67 $       write sys$output "Second argument invalid."
68 $       write sys$output "It should be "32", "64", or nothing."
69 $       exit
70 $     endif
71 $   endif
72 $ endif
73 $!
74 $! ----- Prepare info for processing: disabled algorithms info
75 $ gosub read_disabled_algorithms_info
76 $!
77 $ ZLIB = p2
78 $ zlib_lib = ""
79 $ if (ZLIB .nes. "")
80 $ then
81 $   file2 = f$parse( ZLIB, "libz.olb", , , "syntax_only")
82 $   if (f$search( file2) .eqs. "")
83 $   then
84 $     write sys$output ""
85 $     write sys$output "The Option ", ZLIB, " Is Invalid."
86 $     write sys$output "    Can't find library: ''file2'"
87 $     write sys$output ""
88 $     goto tidy
89 $   endif
90 $   zlib_lib = ", ''file2' /library"
91 $ endif
92 $!
93 $ if (arch_vax)
94 $ then
95 $   libtit = "CRYPTO_TRANSFER_VECTOR"
96 $   libid  = "Crypto"
97 $   libnum = "[.UTIL]LIBEAY.NUM"
98 $   libdir = "[.''ARCHD'.EXE.CRYPTO]"
99 $   libmar = "''libdir'SSL_LIBCRYPTO_''shr'.MAR"
100 $   libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB"
101 $   libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT"
102 $   libobj = "''libdir'SSL_LIBCRYPTO_''shr'.OBJ"
103 $   libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP"
104 $   libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE"
105 $   libref = ""
106 $   libvec = "LIBCRYPTO"
107 $   if f$search( libolb) .nes. "" then gosub create_vax_shr
108 $   libtit = "SSL_TRANSFER_VECTOR"
109 $   libid  = "SSL"
110 $   libnum = "[.UTIL]SSLEAY.NUM"
111 $   libdir = "[.''ARCHD'.EXE.SSL]"
112 $   libmar = "''libdir'SSL_LIBSSL_''shr'.MAR"
113 $   libolb = "''libdir'SSL_LIBSSL''lib32'.OLB"
114 $   libopt = "''libdir'SSL_LIBSSL_''shr'.OPT"
115 $   libobj = "''libdir'SSL_LIBSSL_''shr'.OBJ"
116 $   libmap = "''libdir'SSL_LIBSSL_''shr'.MAP"
117 $   libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE"
118 $   libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE"
119 $   libvec = "LIBSSL"
120 $   if f$search( libolb) .nes. "" then gosub create_vax_shr
121 $ else
122 $   libid  = "Crypto"
123 $   libnum = "[.UTIL]LIBEAY.NUM"
124 $   libdir = "[.''ARCHD'.EXE.CRYPTO]"
125 $   libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB"
126 $   libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT"
127 $   libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP"
128 $   libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE"
129 $   libref = ""
130 $   if f$search( libolb) .nes. "" then gosub create_nonvax_shr
131 $   libid  = "SSL"
132 $   libnum = "[.UTIL]SSLEAY.NUM"
133 $   libdir = "[.''ARCHD'.EXE.SSL]"
134 $   libolb = "''libdir'SSL_LIBSSL''lib32'.OLB"
135 $   libopt = "''libdir'SSL_LIBSSL_''shr'.OPT"
136 $   libmap = "''libdir'SSL_LIBSSL_''shr'.MAP"
137 $   libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE"
138 $   libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE"
139 $   if f$search( libolb) .nes. "" then gosub create_nonvax_shr
140 $ endif
141 $!
142 $ tidy:
143 $!
144 $! Close any open files.
145 $!
146 $ if (f$trnlnm( "libnum", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
147    close libnum
148 $!
149 $ if (f$trnlnm( "mar", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
150    close mar
151 $!
152 $ if (f$trnlnm( "opt", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
153    close opt
154 $!
155 $ if (f$trnlnm( "vf", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
156    close vf
157 $!
158 $! Restore the original default device:[directory].
159 $!
160 $ set default 'def_orig'
161 $ exit
162 $
163 $! ----- Subroutines to build the shareable libraries
164 $! For each supported architecture, there's a main shareable library
165 $! creator, which is called from the main code above.
166 $! The creator will define a number of variables to tell the next levels of
167 $! subroutines what routines to use to write to the option files, call the
168 $! main processor, read_func_num, and when that is done, it will write version
169 $! data at the end of the .opt file, close it, and link the library.
170 $!
171 $! read_func_num reads through a .num file and calls the writer routine for
172 $! each line.  It's also responsible for checking that order is properly kept
173 $! in the .num file, check that each line applies to VMS and the architecture,
174 $! and to fill in "holes" with dummy entries.
175 $!
176 $! The creator routines depend on the following variables:
177 $! libnum       The name of the .num file to use as input
178 $! libolb       The name of the object library to build from
179 $! libid        The identification string of the shareable library
180 $! libopt       The name of the .opt file to write
181 $! libtit       The title of the assembler transfer vector file (VAX only)
182 $! libmar       The name of the assembler transfer vector file (VAX only)
183 $! libmap       The name of the map file to write
184 $! libgoal      The name of the shareable library to write
185 $! libref       The name of a shareable library to link in
186 $!
187 $! read_func_num depends on the following variables from the creator:
188 $! libwriter    The name of the writer routine to call for each .num file line
189 $! -----
190 $
191 $! ----- Subroutines for non-VAX
192 $! -----
193 $! The creator routine
194 $ create_nonvax_shr:
195 $   open /write opt 'libopt'
196 $   write opt "identification=""",libid," ",libverstr,""""
197 $   write opt libolb, " /library"
198 $   if libref .nes. "" then write opt libref,"/SHARE"
199 $   write opt "SYMBOL_VECTOR=(-"
200 $   libfirstentry := true
201 $   libwrch   := opt
202 $   libwriter := write_nonvax_transfer_entry
203 $   textcount = 0
204 $   gosub read_func_num
205 $   write opt ")"
206 $   write opt "GSMATCH=",libvmatch,",",libver
207 $   close opt
208 $   link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options -
209      'zlib_lib'
210 $   return
211 $
212 $! The record writer routine
213 $ write_nonvax_transfer_entry:
214 $   if libentry .eqs. ".dummy" then return
215 $   if info_kind .eqs. "VARIABLE"
216 $   then
217 $     pr:=DATA
218 $   else
219 $     pr:=PROCEDURE
220 $   endif
221 $   textcount_this = f$length(pr) + f$length(libentry) + 5
222 $   if textcount + textcount_this .gt. 1024
223 $   then
224 $     write opt ")"
225 $     write opt "SYMBOL_VECTOR=(-"
226 $     textcount = 16
227 $     libfirstentry := true
228 $   endif
229 $   if libfirstentry
230 $   then
231 $     write 'libwrch' "    ",libentry,"=",pr," -"
232 $   else
233 $     write 'libwrch' "    ,",libentry,"=",pr," -"
234 $   endif
235 $   libfirstentry := false
236 $   textcount = textcount + textcount_this
237 $   return
238 $
239 $! ----- Subroutines for VAX
240 $! -----
241 $! The creator routine
242 $ create_vax_shr:
243 $   open /write mar 'libmar'
244 $   type sys$input:/out=mar:
245 ;
246 ; Transfer vector for VAX shareable image
247 ;
248 $   write mar " .TITLE ",libtit
249 $   write mar " .IDENT /",libid,"/"
250 $   type sys$input:/out=mar:
251 ;
252 ; Define macro to assist in building transfer vector entries.  Each entry
253 ; should take no more than 8 bytes.
254 ;
255         .MACRO FTRANSFER_ENTRY routine
256         .ALIGN QUAD
257         .TRANSFER routine
258         .MASK   routine
259         JMP     routine+2
260         .ENDM FTRANSFER_ENTRY
261 ;
262 ; Place entries in own program section.
263 ;
264 $   write mar " .PSECT $$",libvec,",QUAD,PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT"
265 $   write mar libvec,"_xfer:"
266 $   libwrch   := mar
267 $   libwriter := write_vax_ftransfer_entry
268 $   gosub read_func_num
269 $   type sys$input:/out=mar:
270 ;
271 ; Allocate extra storage at end of vector to allow for expansion.
272 ;
273 $   write mar " .BLKB 32768-<.-",libvec,"_xfer> ; 64 pages total."
274 $!   libwriter := write_vax_vtransfer_entry
275 $!   gosub read_func_num
276 $   write mar " .END"
277 $   close mar
278 $   open /write opt 'libopt'
279 $   write opt "identification=""",libid," ",libverstr,""""
280 $   write opt libobj
281 $   write opt libolb, " /library"
282 $   if libref .nes. "" then write opt libref,"/SHARE"
283 $   type sys$input:/out=opt:
284 !
285 ! Ensure transfer vector is at beginning of image
286 !
287 CLUSTER=FIRST
288 $   write opt "COLLECT=FIRST,$$",libvec
289 $   write opt "GSMATCH=",libvmatch,",",libver
290 $   type sys$input:/out=opt:
291 !
292 ! make psects nonshareable so image can be installed.
293 !
294 PSECT_ATTR=$CHAR_STRING_CONSTANTS,NOWRT
295 $   libwrch   := opt
296 $   libwriter := write_vax_psect_attr
297 $   gosub read_func_num
298 $   close opt
299 $   macro/obj='libobj' 'libmar'
300 $   link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options -
301      'zlib_lib'
302 $   return
303 $
304 $! The record writer routine for VAX functions
305 $ write_vax_ftransfer_entry:
306 $   if info_kind .nes. "FUNCTION" then return
307 $   if libentry .eqs ".dummy"
308 $   then
309 $     write 'libwrch' " .BLKB 8" ! Dummy is zeroes...
310 $   else
311 $     write 'libwrch' " FTRANSFER_ENTRY ",libentry
312 $   endif
313 $   return
314 $! The record writer routine for VAX variables (should never happen!)
315 $ write_vax_psect_attr:
316 $   if info_kind .nes. "VARIABLE" then return
317 $   if libentry .eqs ".dummy" then return
318 $   write 'libwrch' "PSECT_ATTR=",libentry,",NOSHR"
319 $   return
320 $
321 $! ----- Common subroutines
322 $! -----
323 $! The .num file reader.  This one has great responsibility.
324 $ read_func_num:
325 $   open /read libnum 'libnum'
326 $   goto read_nums
327 $
328 $ read_nums:
329 $   libentrynum=0
330 $   liblastentry:=false
331 $   entrycount=0
332 $   loop:
333 $     read /end=loop_end /err=loop_end libnum line
334 $     lin = f$edit( line, "COMPRESS,TRIM")
335 $!    Skip a "#" comment line.
336 $     if (f$extract( 0, 1, lin) .eqs. "#") then goto loop
337 $     entrynum = f$int(f$element( 1, " ", lin))
338 $     entryinfo = f$element( 2, " ", lin)
339 $     curentry = f$element( 0, " ", lin)
340 $     info_exist = f$element( 0, ":", entryinfo)
341 $     info_platforms = ","+ f$element(1, ":", entryinfo)+ ","
342 $     info_kind = f$element( 2, ":", entryinfo)
343 $     info_algorithms = ","+ f$element( 3, ":", entryinfo)+ ","
344 $     if info_exist .eqs. "NOEXIST" then goto loop
345 $     truesum = 0
346 $     falsesum = 0
347 $     negatives = 1
348 $     plat_i = 0
349 $     loop1:
350 $       plat_entry = f$element( plat_i, ",", info_platforms)
351 $       plat_i = plat_i + 1
352 $       if plat_entry .eqs. "" then goto loop1
353 $       if plat_entry .nes. ","
354 $       then
355 $         if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0
356 $         if (arch_vax)
357 $         then
358 $           if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then -
359 $             truesum = truesum + 1
360 $           if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then -
361 $             falsesum = falsesum + 1
362 $         endif
363 $!
364 $         if ((plat_entry .eqs. "VMS") .or. -
365             ((plat_entry .eqs. "ZLIB") .and. (ZLIB .nes. "")) .or. -
366             (arch_vax .and. (plat_entry .eqs. "VMSVAX"))) then -
367             truesum = truesum + 1
368 $!
369 $         if ((plat_entry .eqs. "!VMS") .or. -
370             (arch_vax .and. (plat_entry .eqs. "!VMSVAX"))) then -
371             falsesum = falsesum + 1
372 $!
373 $         goto loop1
374 $       endif
375 $     endloop1:
376 $!DEBUG!$     if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
377 $!DEBUG!$     then
378 $!DEBUG!$       write sys$output line
379 $!DEBUG!$       write sys$output "        truesum = ",truesum,-
380 $!DEBUG!                ", negatives = ",negatives,", falsesum = ",falsesum
381 $!DEBUG!$     endif
382 $     if falsesum .ne. 0 then goto loop
383 $     if truesum+negatives .eq. 0 then goto loop
384 $     alg_i = 0
385 $     loop2:
386 $       alg_entry = f$element(alg_i,",",info_algorithms)
387 $       alg_i = alg_i + 1
388 $       if alg_entry .eqs. "" then goto loop2
389 $       if alg_entry .nes. ","
390 $       then
391 $         if disabled_algorithms - ("," + alg_entry + ",") .nes disabled_algorithms then goto loop
392 $         if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop
393 $         goto loop2
394 $       endif
395 $     endloop2:
396 $     if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
397 $     then
398 $!DEBUG!$     write sys$output curentry," ; ",entrynum," ; ",entryinfo
399 $     endif
400 $   redo:
401 $     next:=loop
402 $     tolibentry=curentry
403 $     if libentrynum .ne. entrynum
404 $     then
405 $       entrycount=entrycount+1
406 $       if entrycount .lt. entrynum
407 $       then
408 $!DEBUG!$         write sys$output "Info: entrycount: ''entrycount', entrynum: ''entrynum' => 0"
409 $         tolibentry=".dummy"
410 $         next:=redo
411 $       endif
412 $       if entrycount .gt. entrynum
413 $       then
414 $         write sys$error "Decreasing library entry numbers!  Can't continue"
415 $         write sys$error """",line,""""
416 $         close libnum
417 $         return
418 $       endif
419 $       libentry=tolibentry
420 $!DEBUG!$       write sys$output entrycount," ",libentry," ",entryinfo
421 $       if libentry .nes. "" .and. libwriter .nes. "" then gosub 'libwriter'
422 $     else
423 $       write sys$error "Info: ""''curentry'"" is an alias for ""''libentry'"".  Overriding..."
424 $     endif
425 $     libentrynum=entrycount
426 $     goto 'next'
427 $   loop_end:
428 $   close libnum
429 $   return
430 $
431 $! The version number reader
432 $ read_version_info:
433 $   libver = ""
434 $   open /read vf [.CRYPTO]OPENSSLV.H
435 $   loop_rvi:
436 $     read/err=endloop_rvi/end=endloop_rvi vf rvi_line
437 $     if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then -
438         goto loop_rvi
439 $     libverstr = f$element(1,"""",rvi_line)
440 $     libvmajor = f$element(0,".",libverstr)
441 $     libvminor = f$element(1,".",libverstr)
442 $     libvedit = f$element(2,".",libverstr)
443 $     libvpatch = f$cvui(0,8,f$extract(1,1,libvedit)+"@")-f$cvui(0,8,"@")
444 $     libvedit = f$extract(0,1,libvedit)
445 $     libver = f$string(f$int(libvmajor)*100)+","+-
446         f$string(f$int(libvminor)*100+f$int(libvedit)*10+f$int(libvpatch))
447 $     if libvmajor .eqs. "0"
448 $     then
449 $       libvmatch = "EQUAL"
450 $     else
451 $       ! Starting with the 1.0 release, backward compatibility should be
452 $       ! kept, so switch over to the following
453 $       libvmatch = "LEQUAL"
454 $     endif
455 $   endloop_rvi:
456 $   close vf
457 $   return
458 $
459 $! The disabled algorithms reader
460 $ read_disabled_algorithms_info:
461 $   disabled_algorithms = ","
462 $   open /read cf [.CRYPTO.'ARCH']OPENSSLCONF.H
463 $   loop_rci:
464 $     read/err=endloop_rci/end=endloop_rci cf rci_line
465 $     rci_line = f$edit(rci_line,"TRIM,COMPRESS")
466 $     rci_ei = 0
467 $     if f$extract(0,9,rci_line) .eqs. "# define " then rci_ei = 2
468 $     if f$extract(0,8,rci_line) .eqs. "#define " then rci_ei = 1
469 $     if rci_ei .eq. 0 then goto loop_rci
470 $     rci_e = f$element(rci_ei," ",rci_line)
471 $     if f$extract(0,11,rci_e) .nes. "OPENSSL_NO_" then goto loop_rci
472 $     disabled_algorithms = disabled_algorithms + f$extract(11,999,rci_e) + ","
473 $     goto loop_rci
474 $   endloop_rci:
475 $   close cf
476 $   return