Fix - CVE-2013-1620 [nss] Not properly consider timing side-channel attacks
[platform/upstream/nss.git] / tests / header
1 #! /bin/sh
2
3 ########################################################################
4 #
5 # /u/sonmi/bin/header - /u/svbld/bin/init/nss/header
6 #
7 # variables, utilities and shellfunctions global to NSS QA
8 # needs to work on all Unix platforms
9 #
10 # included from (don't expect this to be up to date)
11 # --------------------------------------------------
12 #   qa_stat
13 #   mksymlinks 
14 #   nssqa 
15 #
16 # parameters
17 # ----------
18 #   nssversion (supported: 30b, 31, 332, tip 32)
19 #   builddate (default - today)
20 #
21 # options
22 # -------
23 #   -y answer all questions with y - use at your own risk... ignores warnings 
24 #   -s silent (only usefull with -y)
25 #   -h, -? - you guessed right - displays this text
26 #   -d debug
27 #   -f <filename> - write the (error)output to filename
28 #   -fcronfile produces the resultfiles in the same locations
29 #       as would have been produced with -cron
30 #   -m <mailinglist> - send filename to mailinglist (csl) only useful
31 #       with -f
32 #   -ml <mailinglist> - send link to filename to mailinglist (csl) 
33 #       only useful with -f
34 #   -cron equivalient to -y -s -d -f $RESULTDIR/$HOST.<scriptname>
35 #   -t  run on a tinderbox build that means: local, from the startlocation
36 #   -l <mozroot directory>  run on a local build mozroot
37 #   -ln <mozroot> copy a networkbuild to a local directory mozroot, 
38 #        used for networkindipendend QA
39 #   -lt try to copy a networkbuild to a local directory, if not possible
40 #        run on the network
41 #        used for networkindipendend QA
42 #
43 # special strings
44 # ---------------
45 #   FIXME ... known problems, search for this string
46 #   NOTE .... unexpected behavior
47 #
48 # moduls (not yet)
49 # ----------------
50 #   --# INIT
51 #   --# USERCOM
52 #   --# UTILS
53 #
54 # FIXME - split in init / usercom / utils
55 #
56 ########################################################################
57
58 #------------------------------# INIT #------------------------------
59
60 # below the option flags get initialized
61
62 if [ -z "$QASCRIPT_DIR" ]
63 then
64     QASCRIPT_DIR=`dirname $0`
65     if [ "$QASCRIPT_DIR" = '.' ]
66     then
67         QASCRIPT_DIR=`pwd`
68     fi
69 fi
70 export QASCRIPT_DIR
71
72 O_HWACC=OFF
73 if [ -z "$O_ALWAYS_YES" ] ; then
74     O_ALWAYS_YES=OFF    # turned on by -y answer all questions with y 
75 fi
76
77 if [ -z "$O_INIT" ] # header is global, some including scripts may not
78 then                # want the init to run, the others don't need to bother
79     O_INIT=ON
80 fi
81 if [ -z "$O_PARAM" ] # header is global, some including scripts may not
82 then                 # require parameters, the others don't need to bother
83     O_PARAM=ON
84 fi
85 if [ -z "$O_OPTIONS" ] # header is global, some including scripts may not
86 then                # permit options, they don't need to bother
87     O_OPTIONS=OFF
88 fi
89 O_SILENT=OFF        # turned on by -s silent (only usefull with -y)
90 if  [ -z "$O_DEBUG" ] ; then
91     O_DEBUG=OFF     # turned on by -d - calls to Debug produce output when ON
92 fi
93 O_FILE=OFF          # turned on by -f echo all output to a file $FILENAME
94 O_CRON=OFF          # turned on by -cron cron use only
95 O_CRONFILE=OFF      # turned on by -cron cron and -fcron
96 O_LOCAL=OFF         # turned on by -l* run on a local build in $LOCAL_MOZROOT
97 O_LN=OFF            # turned on by -ln and -lt, test a networkbuild locally
98 O_MAIL=OFF          # turned on by -m - sends email
99 O_MAIL_LINK=OFF     # turned on by -ml - sends email
100 O_TBX=OFF           # turned on by -t run on a tinderbox build
101                     # that means: local, from the startlocation
102
103 if  [ -z "$DOMSUF" ]
104 then
105     
106     DOMSUF=red.iplanet.com
107     DS_WAS_SET=FALSE
108 else
109     DS_WAS_SET=TRUE
110 fi
111
112 TMPFILES=""
113
114 WAIT_FOR=600  # if waiting for an event sleep n seconds before rechecking 
115               # recomended value 10 minutes 600
116 WAIT_TIMES=30 # recheck n times before giving up - recomended 30 - total of 5h
117
118 if [ -z "$QAYEAR" ]   # may I introduce - the y2k+1 bug? QA for last year 
119 then                  # might not work
120     QAYEAR=`date +%Y`
121 fi
122
123 if [ -z "$TMP" ]        
124 then
125     if [  -z "$TEMP" ]
126     then
127         TMP="/tmp"
128     else
129         TMP=$TEMP
130     fi
131 fi
132 if [ ! -w "$TMP" ]        
133 then
134     echo "Can't write to tmp directory $TMP - exiting"
135     echo "Can't write to tmp directory $TMP - exiting" >&2
136     exit 1
137 fi
138
139 KILLPIDS="$TMP/killpids.$$"
140 export KILLERPIDS
141 TMPFILES="$TMPFILES $KILLPIDS"
142
143 KILL_SELFSERV=OFF   # if sourcing script sets this to on cleanup will also 
144                     # kill the running selfserv processes
145
146                     # Set the masterbuilds 
147 if [ -z "$UX_MASTERBUILD" ]
148 then                     
149     UX_MASTERBUILD=booboo_Solaris8
150     #if [ ! -d $UX_MASTERBUILD ] ; then
151         #UX_MASTERBUILD=booboo_Solaris8_forte6
152     #fi
153     UX_MB_WAS_SET=FALSE
154 else
155     UX_MB_WAS_SET=TRUE
156 fi
157 if [ -z "$NT_MASTERBUILD" ]
158 then                     
159     NT_MASTERBUILD=blowfish_NT4.0_Win95
160     NT_MB_WAS_SET=FALSE      # in this case later functions can override if
161                              # they find a different build that looks like NT
162 else
163     NT_MB_WAS_SET=TRUE
164 fi
165 if [ -z "$MASTERBUILD" ]    
166 then
167     MASTERBUILD=$UX_MASTERBUILD
168 fi
169
170                     # Set the default build
171 if [ -z "$BUILDNUMBER" ]    
172 then
173     BUILDNUMBER=1
174 fi
175 export BUILDNUMBER
176 O_LDIR=OFF          #local QA dir for NT, temporary
177
178 if [ -z "$WIN_WAIT_FOREVER" ]    # header is global, some including scripts 
179 then                # want the init to wait forever for directories to
180                     # appear (windows only) if OFF exit, if ON wait forever
181     WIN_WAIT_FOREVER=OFF
182 fi
183
184                           # NOTE: following variables have to change 
185                           # from release to release
186 if [ -z "$BC_MASTER" ]    # master directory for backwardscompatibility testing
187 then
188     RH="NO"
189     grep 7.1 /etc/redhat-release > /dev/null 2>/dev/null && RH="YES"
190     grep 7.2 /etc/redhat-release > /dev/null 2>/dev/null && RH="YES"
191
192     if [ "$RH" = "YES" ] 
193     then                      # NSS-3-3-1RTM
194         BC_UX_MASTER=nss331/builds/20010928.2.331-RTM/booboo_Solaris8
195         BC_NT_MASTER=nss331/builds/20010928.2.331-RTM/blowfish_NT4.0_Win95
196     else                      # NSS-3-2-2RTM
197         BC_UX_MASTER=nss322/builds/20010820.1/y2sun2_Solaris8
198         BC_NT_MASTER=nss322/builds/20010820.1/blowfish_NT4.0_Win95
199     fi
200     BC_MASTER=$BC_UX_MASTER
201     BC_MASTER_WAS_SET=FALSE
202 else
203     BC_MASTER_WAS_SET=TRUE
204 fi
205 BC_RELEASE=3.2
206 export BC_RELEASE
207
208 EARLY_EXIT=TRUE     #before the report file has been created, causes Exit to 
209                     #create it
210
211 UX_D0=/share/builds/mccrel3/nss
212
213 ################################### glob_init ##########################
214 # global shell function, main initialisation function
215 ########################################################################
216 glob_init()
217 {
218     if [ $O_PARAM = "ON" ] ; then
219         eval_opts $*    # parse parameters and options - set flags
220     fi
221                         # if running from cron HOST needs to be known early, 
222     init_host            # so the output file name can be constructed. 
223     Debug "Setting up environment...( $QASCRIPT_DIR/set_environment) "
224     . $QASCRIPT_DIR/set_environment #finds out if we are running on Windows
225     Debug "OPerating system: $os_name $os_full"
226     umask 0    
227     init_dirs
228     init_files
229     init_vars
230 }
231
232 ################################### init_vars ###########################
233 # global shell function, sets the environment variables, part of init 
234 ########################################################################
235 init_vars()
236 {
237     if [ -z "$LOGNAME" ]
238     then
239         if [ $O_WIN = "ON" ]
240         then
241             LOGNAME=$USERNAME
242         else
243             LOGNAME=$USER
244         fi
245         if [ -z "$LOGNAME" ]
246         then
247             LOGNAME=$UNAME
248             if [ -z "$LOGNAME" ]
249             then
250                 LOGNAME=`basename $HOME`
251             fi
252         fi
253     fi
254     if [ -z "$LOGNAME" ]
255     then
256         Exit "Can't determine current user"
257     fi
258     case $HOST in
259         iws-perf)
260             O_HWACC=ON
261             HWACC_LIST="rainbow ncipher"
262             #MODUTIL="-add rainbow -libfile /usr/lib/libcryptoki22.so"
263             export HWACC_LIST
264             ;;
265         *)
266             O_HWACC=OFF
267             ;;
268     esac
269    export O_HWACC
270 }
271
272 ########################################################################
273 # functions below deal with setting up the directories and PATHs for
274 # all different flavors of OS (Unix, Linux, NT MKS, NT Cygnus) and QA
275 # (Standard, local tinderbox)
276 ########################################################################
277
278 ########################## find_nt_masterbuild #########################
279 # global shell function, sets the nt masterbuild directories, part of init 
280 ########################################################################
281 find_nt_masterbuild()
282 {
283     NT_MASTERDIR=${DAILY_BUILD}/${NT_MASTERBUILD}
284     if [ "${NT_MB_WAS_SET}" = "FALSE" -a ! -d $NT_MASTERDIR ] ; then
285         if [ -d ${DAILY_BUILD}/*NT4* ] ; then
286             NT_MASTERBUILD=` cd ${DAILY_BUILD}; ls -d *NT4* `
287             Debug "NT_MASTERBUILD $NT_MASTERBUILD"
288             NT_MASTERDIR=${DAILY_BUILD}/${NT_MASTERBUILD}
289         fi
290     fi
291     Debug "NT_MASTERDIR $NT_MASTERDIR"
292 }
293
294 ################################### set_daily_build_dirs ###########################
295 # global shell function, sets directories 
296 ########################################################################
297 set_daily_build_dirs()
298 {
299     if [ "$O_LOCAL" = "ON" -a "$O_LN" = "OFF" ] ; then
300         DAILY_BUILD=${LOCAL_MOZROOT}        # on local builds NSS_VER_DIR and DAILY_BUILD are 
301                              # set to the LOCAL_MOZROOT, since it is not sure
302                              # if ../.. (DAILY_BUILD) even exists
303         LOCALDIST=${LOCAL_MOZROOT}/dist
304     elif [ "$O_TBX" = "ON" ] ; then
305         DAILY_BUILD="$TBX_DAILY_BUILD"
306         LOCALDIST=${UXDIST}
307     else
308         DAILY_BUILD=${NSS_VER_DIR}/builds/${QAYEAR}${BUILDDATE}.${BUILDNUMBER}
309         LOCALDIST=${DAILY_BUILD}/${MASTERBUILD}/mozilla/dist
310     fi
311 }
312
313 map_os64()
314 {
315   IS_64=""
316   case `uname -s` in
317       #OSF1) has been done already - always 64 bit
318       SunOS)
319           MAPPED_OS=Solaris*8
320           IS_64=`(isainfo -v | grep 64)>/dev/null 2>/dev/null && echo 64 bit`
321           if [ "$O_TBX" = "OFF" ] ; then
322               set_osdir
323               if [ -n "$IS_64" ]
324               then #Wait for the 64 bit build to finish...
325                   Debug Testing build for $MAPPED_OS in $OSDIR
326                   Wait ${OSDIR}/SVbuild.InProgress.1 0
327               fi
328           fi
329           ;;
330       AIX)
331           IS_64=`lslpp -l | grep "bos.64bit"> /dev/null && echo 64 bit`
332           ;;
333       HP-UX)
334           IS_64=`getconf KERNEL_BITS | grep 64 >/dev/null && echo 64 bit`
335           ;;
336   esac
337   Debug "Mapped OS to $MAPPED_OS"
338 }
339
340
341
342 ################################### copy_to_local ########################
343 # global shell function, copies the necessary directories from the 
344 # daily build aerea to the local disk
345 ########################################################################
346 copy_to_local()
347 {
348     Debug "Copy network directories to local directories"
349     C2L_ERROR=0
350     if [ ! -d ${LOCAL_MOZROOT}/dist ] ; then
351         mkdir -p ${LOCAL_MOZROOT}/dist || C2L_ERROR=1
352     fi
353     if [ ! -d ${LOCAL_MOZROOT}/security/nss ] ; then
354         mkdir -p ${LOCAL_MOZROOT}/security/nss || C2L_ERROR=2
355     fi
356     if [ $C2L_ERROR != 0 ] ; then
357         Exit "copy_to_local: Can t make necesssary directories ($C2L_ERROR ) "
358     fi
359     if [ ! -d ${LOCAL_MOZROOT}/security/nss/tests ] ; then
360         cp -r ${TESTSCRIPTDIR} ${LOCAL_MOZROOT}/security/nss || C2L_ERROR=1
361     fi
362     if [ ! -d ${LOCAL_MOZROOT}/security/coreconf ] ; then
363         cp -r ${MOZILLA_ROOT}/security/coreconf ${LOCAL_MOZROOT}/security || C2L_ERROR=2
364     fi
365     
366     NO_DIRS=0;
367     if [ "$O_WIN" = "ON" ] ; then
368         OS_TARGET=WINNT;export OS_TARGET
369     fi
370     unset BUILD_OPT;export BUILD_OPT;
371     unset USE_64;export USE_64;
372 #FIXME only tested on 64 bit Solaris and only got 32 bit builds
373     while [ $NO_DIRS -lt 4 ] ; do
374                                                   # first time thru: Debug 32 bit NT
375         set_objdir
376         Debug "Copying ${OBJDIR}..."
377         if [ ! -d ${LOCAL_MOZROOT}/dist/${OBJDIR} ] ; then
378             cp -r ${LOCALDIST}/${OBJDIR} ${LOCAL_MOZROOT}/dist || C2L_ERROR=3
379         fi
380         NO_DIRS=`expr $NO_DIRS + 1`
381         if [ $NO_DIRS = 1 ] ; then                # 2nd time: OPT 32 bit NT
382             BUILD_OPT=1; export BUILD_OPT;
383         elif [ $NO_DIRS = 2 ] ; then              # 3rd time: OPT, either 64 bit or Win95 or force exit
384             if [ "$O_WIN" = "ON" ] ; then
385                 OS_TARGET=WIN95;export OS_TARGET
386             else
387                 map_os64
388                 if [ -z "$IS_64" ] ; then #32 bit platform
389                     NO_DIRS=4
390                 else
391                     USE_64=1; export USE_64
392                 fi
393             fi
394         elif [ $NO_DIRS = 3 ] ; then              # 4th time:  Debug either 64 bit or Win95
395             unset BUILD_OPT;export BUILD_OPT;
396         fi
397      
398             
399     done
400     if [ $C2L_ERROR != 0 ] ; then
401         Exit "copy_to_local: Can t copy necesssary directories ($C2L_ERROR ) "
402     fi
403     unset TESTSCRIPTDIR
404     unset TESTDIR
405     unset RESULTDIR
406     O_LN=OFF       #from here on pretend it is regular -l local QA FIXME, might cause 
407                    #problems with the backwardcompatibility tests
408     Debug "Successfully copied network directories to local directories"
409 }
410
411 ################################### local_dirs ###########################
412 # global shell function, sets the directories for local QA
413 ########################################################################
414 local_dirs()
415 {
416     Debug "Set directories for local QA"
417     #if [ "$O_WIN" = "ON" ] ; then
418         #win_set_tmp
419     #fi
420     NSS_VER_DIR=${LOCAL_MOZROOT}        # on local builds NSS_VER_DIR and DAILY_BUILD are 
421                          # set to the LOCAL_MOZROOT, since it is not sure
422                          # if ../../../.. (NSS_VER_DIR) even exists
423     if [ -z "${RESULTDIR}" ] ; then # needs to be local as well
424         Debug "Setting RESULTDIR for local QA"
425         RESULTDIR="${LOCAL_MOZROOT}/tests_results/security/${HOST}-`date +%Y%m%d-%H.%M`"
426     fi
427     set_daily_build_dirs
428     UX_MASTERDIR=`dirname ${LOCAL_MOZROOT}`
429     NT_MASTERDIR=$UX_MASTERDIR
430     MOZILLA_ROOT=${LOCAL_MOZROOT}
431
432     UXDIST=${MOZILLA_ROOT}/dist
433     NTDIST=${UXDIST}
434
435     if [ -z "${TESTDIR}" ] ; then 
436         Debug "Setting TESTDIR for local QA"
437         TESTDIR=${RESULTDIR}
438     fi
439     if [ -n "$TESTDIR" ] ; then
440         if [ ! -d $TESTDIR ] ; then
441             Debug "Making TESTDIR for local QA"
442             mkdir -p $TESTDIR
443         fi
444     fi
445     export TESTDIR
446     Debug "RESULTDIR $RESULTDIR TESTDIR $TESTDIR"
447
448     TESTSCRIPTDIR=${LOCAL_MOZROOT}/security/nss/tests
449     COMMON=${TESTSCRIPTDIR}/common
450
451     set_objdir
452     debug_dirs
453     export_dirs
454 }
455
456
457 ################################### tbx_dirs ###########################
458 # global shell function, sets the directories for tinderbox QA
459 ########################################################################
460 tbx_dirs()
461 {
462     Debug "Set directories for tinderbox"
463     if [ "$O_WIN" = "ON" ] ; then
464         win_set_d1 # we need the NSS_VER_DIR later
465     else
466         NSS_VER_DIR="$UX_D0"/nss$NSSVER
467     fi
468     if [ -z "${RESULTDIR}" ] ; then # needs to be different for tinderbox
469         Debug "Setting RESULTDIR for tinderbox"
470         TBX_NOBITS=""
471         echo $QASCRIPT_DIR | grep 64  >/dev/null && TBX_NOBITS=64
472         TRD="${HOST}${TBX_NOBITS}-`date +%Y%m%d-%H.%M`"
473         RESULTDIR="${NSS_VER_DIR}/tinderbox/tests_results/security/${TRD}"
474         if [ ${DOMSUF} = "mcom.com" -o  ${DOMSUF} = "netscape.com" -o ${DOMSUF} = "nscp.aoltw.net" ] ; then
475             URL="sbs-rel.nscp.aoltw.net"
476         else
477             URL="cindercone.red.iplanet.com"
478         fi
479         if [ "$O_WIN" = "ON" ] ; then
480             RESULTDIRURL="<a title=\"QA Results\" href=\"http://${URL}${UX_D0}/nsstip/tinderbox/tests_results/security/${TRD}\">QA</a>"
481         else
482             RESULTDIRURL="<a title=\"QA Results\" href=\"http://${URL}${RESULTDIR}\">QA</a>"
483         fi
484         Debug "RESULTDIRURL TinderboxPrint:$RESULTDIRURL"
485     fi
486     TBX_DAILY_BUILD=`cd ../../../../..;pwd`
487     NSS_VER_DIR="${TBX_DAILY_BUILD}/../.." 
488     TBX_LOGFILE_DIR=`ls ${NSS_VER_DIR}/logs/tinderbox | sed -e 's/ .*//g'`
489     if [ -z "$TBX_LOGFILE_DIR" ] ; then
490         TBX_LOGFILE_DIR=`ls ${NSS_VER_DIR}/logs/tbx | sed -e 's/ .*//g'`
491         TBX_LOGFILE_DIR="${NSS_VER_DIR}/logs/tbx/${TBX_LOGFILE_DIR}"
492     else
493         TBX_LOGFILE_DIR="${NSS_VER_DIR}/logs/tinderbox/${TBX_LOGFILE_DIR}"
494     fi
495     Debug "Set TBX_LOGFILE_DIR ${TBX_LOGFILE_DIR}"
496     
497     set_daily_build_dirs
498     UX_MASTERDIR=`cd ../../../..;pwd`
499     NT_MASTERDIR=$UX_MASTERDIR
500     MOZILLA_ROOT=$UX_MASTERDIR/mozilla
501
502     UXDIST=${MOZILLA_ROOT}/dist
503     NTDIST=${UXDIST}
504
505     if [ -z "${TESTDIR}" ] ; then 
506         Debug "Setting TESTDIR for tinderbox"
507         TESTDIR=${RESULTDIR}
508     fi
509     if [ -n "$TESTDIR" ] ; then
510         if [ ! -d $TESTDIR ] ; then
511             Debug "Making TESTDIR for tinderbox"
512             mkdir -p $TESTDIR
513         fi
514     fi
515     Debug "Making QAstatus file"
516     echo "QA running" >${TESTDIR}/QAstatus
517     export TESTDIR
518     Debug "RESULTDIR $RESULTDIR TESTDIR $TESTDIR"
519
520     TESTSCRIPTDIR=`pwd`
521     COMMON=${TESTSCRIPTDIR}/common
522
523     set_objdir
524     debug_dirs
525     export_dirs
526 }
527
528 ################################### init_mcom ###########################
529 # global shell function, sets domain specific variables for AOL's 
530 # domains according to Bishakha's instructions
531 ########################################################################
532 init_mcom()
533 {
534     Debug "Running in mcom or netscape domain - changing directories..."
535     if [ "${UX_MB_WAS_SET}" = "FALSE" ] ; then #in case it was set
536         # before script was called use these values 
537         UX_MASTERBUILD=spd04_Solaris8
538     fi
539     if [ "${NT_MB_WAS_SET}" = "FALSE" ] ; then 
540         NT_MASTERBUILD=spd06_NT4
541     fi
542  
543     MASTERBUILD=$UX_MASTERBUILD
544     if [ "${BC_MASTER_WAS_SET}" = "FALSE" ] ; then
545         BC_UX_MASTER=nss322/builds/20010820.1/y2sun2_Solaris8
546         BC_NT_MASTER=nss322/builds/20010820.1/blowfish_NT4.0_Win95
547         BC_MASTER=$BC_UX_MASTER
548     fi
549     UX_D0=/share/builds/sbsrel2/nss
550     URL="sbs-rel.nscp.aoltw.net"
551 }
552 ################################### init_dirs ###########################
553 # global shell function, sets the directories for standard QA
554 # calls special functions for tinderbox, windows or local QA, part of init 
555 ########################################################################
556 init_dirs()
557 {
558     if [ ${DOMSUF} = "mcom.com" -o  ${DOMSUF} = "netscape.com" -o ${DOMSUF} = "nscp.aoltw.net" ] ; then
559         init_mcom
560     fi
561     if [ $O_WIN = "ON" ] ; then
562         win_set_tmp
563         write_to_tmpfile
564         MASTERBUILD=$NT_MASTERBUILD
565         BC_MASTER=$BC_NT_MASTER
566     fi
567     if [ "$O_LOCAL" = "ON" -a $O_LN = "OFF" ] ; then  # if it is a LN we need to know
568                        # all the directories off the network first to copy them
569         local_dirs     # O_LOCAL alone assumes that all the directories are already there 
570         return
571     elif [ "$O_TBX" = "ON" ] ; then
572         tbx_dirs
573         return
574     elif [ "$O_WIN" = "ON" ] ; then
575         win_set_d1
576     else
577         NSS_VER_DIR="$UX_D0"/nss$NSSVER
578     fi
579     #set -x
580
581     set_daily_build_dirs
582
583     if [ -z "${BCDIST}" ] ; then
584         #BCDIST=/share/builds/mccrel3/nss/${BC_MASTER}/mozilla/dist
585         BCDIST=${NSS_VER_DIR}/../${BC_MASTER}/mozilla/dist
586         if [ ! -d $BCDIST -a `basename $0` != jssqa ] ; then
587             ask "Backward compatibility directory $BCDIST does not exist, continue" "y" "n" || Exit
588         fi
589     fi
590
591     UX_MASTERDIR=${DAILY_BUILD}/${UX_MASTERBUILD}
592     find_nt_masterbuild
593
594     if [ "$O_WIN" = "ON" ]
595     then
596         MOZILLA_ROOT=${NT_MASTERDIR}/mozilla
597     else
598         MOZILLA_ROOT=${UX_MASTERDIR}/mozilla
599     fi
600
601     UXDIST=${UX_MASTERDIR}/mozilla/dist
602     NTDIST=${NT_MASTERDIR}/mozilla/dist
603
604     if [ -z "${RESULTDIR}" ] ; then 
605         RESULTDIR=${UX_MASTERDIR}/mozilla/tests_results/security
606     fi
607
608     if [ -n "$PRODUCT_TO_TEST" -a "$PRODUCT_TO_TEST" = "JSS" ] ; then
609
610         if [ "$O_WIN" = "ON" ] ; then
611             JSS_NSS_SRC_DIR=$JSS_NSS_NT_SRC_DIR
612         fi
613         TESTSCRIPTDIR=${NSS_VER_DIR}/../${JSS_NSS_SRC_DIR}/mozilla/security/nss/tests
614     else
615         TESTSCRIPTDIR=${MOZILLA_ROOT}/security/nss/tests
616     fi
617
618     if [ ! -d $TESTSCRIPTDIR -a `basename $0` != jssqa ] ; then
619         if [ "$O_WIN" = "ON" -a "$WIN_WAIT_FOREVER" = "ON" ]
620         then
621             WaitForever $TESTSCRIPTDIR/all.sh 1
622         else
623             Exit "Test directory $TESTSCRIPTDIR does not exist"
624         fi
625     fi
626
627     COMMON=${TESTSCRIPTDIR}/common
628     if [ "$O_LOCAL" = "ON" -a $O_LN = "ON" ] ; then  # if it is a LN we need to know
629                        # all the directories off the network first to copy them
630         copy_to_local
631         local_dirs     
632     fi
633     #set +x
634
635
636     set_objdir
637     debug_dirs
638     export_dirs
639 }
640
641 debug_dirs()
642 {
643     Debug "NTDIST $NTDIST"
644     Debug "UXDIST $UXDIST"
645     Debug "TESTSCRIPTDIR $TESTSCRIPTDIR"
646     Debug "RESULTDIR $RESULTDIR"
647     Debug "TMP $TMP"
648     Debug "LOCALDIST_BIN $LOCALDIST_BIN"
649     Debug "COMMON $COMMON"
650     Debug "MOZILLA_ROOT $MOZILLA_ROOT"
651     Debug "BCDIST $BCDIST"
652 }
653
654 export_dirs()
655 {
656     export NSS_VER_DIR DAILY_BUILD NTDIST UXDIST RESULTDIR TESTSCRIPTDIR BCDIST
657     export UX_MASTERDIR NT_MASTERDIR COMMON MOZILLA_ROOT
658 }
659
660 set_osdir()
661 {
662     OSDIR=${DAILY_BUILD}/*${MAPPED_OS}*
663 }
664
665 ################################### init_files ###########################
666 # global shell function, sets filenames, initializes files, part of init 
667 ########################################################################
668 init_files()
669 {
670     if [ $O_CRONFILE = "ON" ]
671     then
672         Debug "attempting to create resultfiles"
673         if [ "$O_TBX" = "ON" ] ; then
674             NEWFILENAME=${TBX_LOGFILE_DIR}/qa.log
675             if [ ! -w ${TBX_LOGFILE_DIR} ] ; then
676                 Exit "can't touch $NEWFILENAME"
677             fi
678         else
679             NEWFILENAME=$RESULTDIR/$HOST.`basename $0`
680         fi
681         if [ ! -d $RESULTDIR ]
682         then
683             mkdir -p $RESULTDIR || Exit "Error: can't make $RESULTDIR"
684         fi
685         if [ ! -w $RESULTDIR ] ; then
686             Exit "can't touch $NEWFILENAME"
687         fi
688         Debug "About to touch $NEWFILENAME "
689         touch $NEWFILENAME || Exit "Error: can't touch $NEWFILENAME"
690         if [ "$O_TBX" = "ON" ] ; then
691              echo "QA results in $RESULTDIR" >>$NEWFILENAME || Exit "Error: can't write to $NEWFILENAME"
692         fi
693         Debug "About to cat $FILENAME >>$NEWFILENAME "
694         cat $FILENAME >>$NEWFILENAME || Exit "Error: can't append $FILENAME to $NEWFILENAME"
695         TMPFILES="$TMPFILES $FILENAME"
696         FILENAME=$NEWFILENAME
697         Debug "Writing output to $FILENAME"
698     fi
699
700 }
701
702 ################################### write_to_tmpfile ##########################
703 # global shell function, for NT and cron operation, first a tmpfile 
704 # needs to be created
705 ########################################################################
706 write_to_tmpfile()
707 {
708     O_CRONFILE=ON
709     O_FILE=ON
710     FILENAME=${TMP}/nsstmp.$$    # for now write to the temporary file
711                                  # since we don't know the hostname yet
712                                  # will be inserted to the real file later
713     TMPFILES="$TMPFILES nsstmp.$$"        
714     touch $FILENAME || Exit "Error: can't touch $FILENAME"
715     Debug "Writing output to $FILENAME"
716 }
717
718 ############################# turn_on_cronoptions ######################
719 # global shell function, turns on options needed for cron and tinderbox
720 ########################################################################
721 turn_on_cronoptions()
722 {
723     O_CRON=ON
724     O_SILENT=ON
725     O_DEBUG=ON                # FIXME take out!
726     O_ALWAYS_YES=ON
727     write_to_tmpfile
728 }
729
730 ########################## test_mozroot ##########################
731 # global shell function, determines if the variable LOCAL_MOZROOT is set, 
732 # and is usable as mozilla root diretory for a local QA
733 ###################################################################
734 test_mozroot()
735 {
736   PWD=`pwd`
737   Debug "LOCAL_MOZROOT = $LOCAL_MOZROOT"
738   case "$LOCAL_MOZROOT" in
739       [0-9-]*|tip)
740           glob_usage "Error: -"$1" requires a directoryname to follow (start with a letter) "
741           ;;
742       \.\.)
743           LOCAL_MOZROOT=`dirname $PWD`
744           ;;
745       \.)
746           LOCAL_MOZROOT=$PWD
747           ;;
748       \.\/*)
749           LOCAL_MOZROOT=`echo $LOCAL_MOZROOT | sed -e "s/^\.//"`
750           LOCAL_MOZROOT="${PWD}${LOCAL_MOZROOT}"
751           ;;
752       \.\.\/*)
753           LOCAL_MOZROOT="${PWD}/${LOCAL_MOZROOT}"
754           ;;
755       \/*|[a-zA-Z]:\/*)
756           ;;
757       ?*)
758           LOCAL_MOZROOT="${PWD}/${LOCAL_MOZROOT}"
759           ;;
760       *)
761           glob_usage "Error: -"$1" requires a directoryname to follow"
762           ;;
763   esac
764   Debug "Reformated MOZROOT to $LOCAL_MOZROOT"
765   if [ "$1" = "ln" ] ; then
766       LOCAL_MOZROOT_PARENT=`dirname $LOCAL_MOZROOT`
767       if [ ! -d $LOCAL_MOZROOT_PARENT -o ! -w $LOCAL_MOZROOT_PARENT -o \
768            ! -x $LOCAL_MOZROOT_PARENT ] ; then
769               Exit "Error: Can't create $LOCAL_MOZROOT (permissions)"
770       fi
771       if [ ! -d "$LOCAL_MOZROOT" ] ; then
772           mkdir $LOCAL_MOZROOT ||
773               Exit "Error: Can't create mozroot $LOCAL_MOZROOT (mkdir failed)"
774       else
775           ask "mozroot $LOCAL_MOZROOT exists - continue (y will remove dir) ?" \
776                "y" "n" || Exit
777           rm -rf $LOCAL_MOZROOT/dist $LOCAL_MOZROOT/security $LOCAL_MOZROOT/tests_results ||
778               Exit "Error: Can't clean mozroot $LOCAL_MOZROOT"
779       fi
780   fi
781   if [ ! -d "$LOCAL_MOZROOT" ] ; then
782       glob_usage "Error: mozilla root $LOCAL_MOZROOT not a valid directory"
783   fi
784 }
785
786 ################################### eval_opts ##########################
787 # global shell function, evapuates options and parameters, sets flags
788 # variables and defaults
789 ########################################################################
790 eval_opts()
791 {
792   while [ -n "$1" ]
793   do
794     case $1 in
795         -cron)
796             turn_on_cronoptions
797             ;;
798         -T*|-t*)
799             O_TBX=ON
800             turn_on_cronoptions
801             O_SILENT=OFF        #FIXME debug only
802             ;;
803         -S*|-s*)
804             O_SILENT=ON
805             ;;
806         -Y*|-y)
807             Debug "Option -y dedectet"
808             O_ALWAYS_YES=ON
809             ;;
810         -d*|-D)
811             O_DEBUG=ON
812             #set -x
813             ;;
814         -ml|-ML)
815             O_MAIL_LINK=ON
816             shift
817             MAILINGLIST=$1
818             if [ -z "$MAILINGLIST" ]
819             then
820                 glob_usage "Error: -m requires a mailinglist to follow, for example sonmi,wtc,nelsonb "
821             fi
822             Debug "Sending link to result to $MAILINGLIST"
823             ;;
824         -m|-M)
825             O_MAIL=ON
826             shift
827             MAILINGLIST=$1
828             if [ -z "$MAILINGLIST" ]
829             then
830                 glob_usage "Error: -m requires a mailinglist to follow, for example sonmi,wtc,nelsonb "
831             fi
832             Debug "Sending result to $MAILINGLIST"
833             ;;
834         -fcron*|-F[Cc][Rr][Oo][Nn]*)
835             write_to_tmpfile
836             ;;
837         -f|-F)
838             O_FILE=ON
839             shift
840             FILENAME=$1
841             if [ -z "$FILENAME" ]
842             then
843                 glob_usage "Error: -f requires a filename to follow"
844             fi
845             #rm -f $FILENAME 2>/dev/null
846             touch $FILENAME || Exit "Error: can't touch $FILENAME"
847                                     #NOTE we append rather that creating
848             Debug "Writing output to $FILENAME"
849             ;;
850         -h|-help|"-?")
851             glob_usage
852             ;;
853         -ln)
854             if [ `basename $0` != nssqa ] ; then
855                 glob_usage "Error: Can't handle option $1"
856             fi
857             O_LOCAL=ON
858             O_LN=ON
859             shift
860             LOCAL_MOZROOT=$1
861             test_mozroot ln
862             ;;
863         -lt)
864             if [ `basename $0` != nssqa ] ; then
865                 glob_usage "Error: Can't handle option $1"
866             fi
867             O_LN=ON
868             O_LOCAL=ON
869             ;;
870         -l)
871             if [ `basename $0` != nssqa ] ; then
872                 glob_usage "Error: Can't handle option $1"
873             fi
874             O_LOCAL=ON
875             shift
876             LOCAL_MOZROOT=$1
877             test_mozroot l
878             ;;
879         -p)
880             shift
881             PORT=$1
882             export PORT
883             ;;
884         -*)
885             glob_usage "Error: Can't handle option $1"
886             ;;
887         tip|3.|3..)
888             NSSVER=$1
889             if [ -z "$NSSVER" ] ; then
890                 glob_usage "Error: illegal parameter"
891             fi
892             ;;
893         [01][0-9][0123][0-9])
894             BUILDDATE=$1
895             if [ -z "$BUILDDATE" ] ; then
896                 glob_usage "Error: illegal parameter"
897             fi
898             ;;
899         ?*)
900             glob_usage "Error: Can't handle parameter $1"
901             ;;
902     esac
903     shift
904   done
905
906   if [ -z "$PORT" -a "$O_TBX" = "ON" ] ; then
907       PORT=8444
908       export PORT
909       if [ -z "$NSSVER" ] ; then
910           NSSVER="tip"
911           Debug "NSS Version: Parameters missing - defaulting to tip!"
912       fi
913   elif [ -z "$NSSVER" ] ; then
914       NSSVER="tip"
915       Debug "NSS Version: Parameters missing - defaulting to tip!"
916   fi
917   if [ -z "$BUILDDATE" ] ; then
918       BUILDDATE=`date +%m%d`
919       Debug "Builddate: Parameters missing - defaulting to today!"
920   fi
921   
922   Debug "Builddate $BUILDDATE NssVersion $NSSVER"
923   export BUILDDATE NSSVER
924   export O_CRON O_SILENT O_DEBUG O_ALWAYS_YES O_TBX
925 }
926
927 win_set_tmp()
928 {
929     TMP=`echo "$TMP" | sed -e 's/       /\/t/g' -e 's/\ 2/\/b/' -e 's/\\\/\//g'`
930     Debug "TMP reformated to $TMP"
931 }
932
933 ######################### win_set_d1 ################################
934 # global shell function, interactively finds the directories in case
935 # windows can't get to the default
936 ########################################################################
937 win_set_d1()
938 {
939     Debug "set Windows Directories..."
940     #win_set_tmp
941     if [ "$O_CYGNUS" = ON ]
942     then
943         NSS_VER_DIR=/cygdrive/w/nss/nss$NSSVER
944     else
945         NSS_VER_DIR=w:/nss/nss$NSSVER
946     fi
947     if [ ! -w $NSS_VER_DIR ]
948     then
949         Echo "Windows special... can't write in $NSS_VER_DIR"
950         if [ "$O_CYGNUS" = ON ]
951         then
952             NSS_VER_DIR=/cygdrive/u/nss/nss$NSSVER
953         else
954             NSS_VER_DIR="u:/nss/nss$NSSVER"
955         fi
956     else
957         Debug "NSS_VER_DIR set to $NSS_VER_DIR"
958         return
959     fi
960
961     while [ ! -w $NSS_VER_DIR ]
962     do
963         if [ "$O_CRONFILE" = "ON" ] 
964         then
965             Exit "cant write in $NSS_VER_DIR" 
966         fi
967         Warning "cant write in $NSS_VER_DIR" 
968         Echo "input start directory (u:/nss, d:/src/nss, f:/shared/nss) "
969         read D
970         if [ -n "$D" ]
971         then
972             NSS_VER_DIR=$D/nss$NSSVER
973         fi
974     done
975     Debug "NSS_VER_DIR set to $NSS_VER_DIR"
976 }
977
978 ########################### init_host ##################################
979 # global shell function, sets required variables HOST and DOMSUF, and asks
980 # the user if it has been set right
981 ########################################################################
982 set_host()
983 {
984     init_host
985 }
986 init_host()
987 {
988     if [ `basename $0` != nssqa ] ; then
989         return
990     fi
991
992     init_host_done=0
993
994     if [ $DS_WAS_SET = FALSE ] #give chance to overwrite, espec. for NT
995     then
996         Debug "Domainname was not set..."
997         DOMSUF=`domainname 2>/dev/null`
998         if [ -z "$DOMSUF" ]
999         then
1000             Debug "domainname command did not work ..."
1001             DOMSUF=`echo $HOST | grep '\.' | sed -e "s/[^\.]*\.//"`
1002     
1003             if [ -z "$DOMSUF" ]
1004             then
1005                 Debug "Domainname not part of the hostname"
1006                 DOMSUF=`cat /etc/defaultdomain 2>/dev/null`
1007                 if [ -z "$DOMSUF" ]
1008                 then
1009                     Debug "Domainname needs to be hardcoded to red.iplanet.com"
1010                     DOMSUF="red.iplanet.com"
1011                 fi
1012             fi
1013         fi
1014     fi
1015     case $HOST in
1016         *\.*)
1017             Debug "HOSTNAME $HOST contains Dot"
1018             HOST=`echo $HOST | sed -e "s/\..*//"`
1019             ;;
1020     esac
1021     if [ -z "$HOST" ]
1022     then
1023         HOST=`uname -n`
1024         case $HOST in
1025             *\.*)
1026                 Debug "HOSTNAME $HOST contains Dot"
1027                 HOST=`echo $HOST | sed -e "s/\..*//"`
1028                 ;;
1029         esac
1030     fi
1031     if [ $O_DEBUG = "ON" ]
1032     then
1033         while [ $init_host_done -eq 0 ]
1034         do
1035             Echo
1036             ask "DOMSUF=$DOMSUF, HOST=$HOST - OK", "y" "n" &&
1037                 init_host_done=1
1038             if [ $init_host_done -eq 0 ]
1039             then
1040                 Echo "input DOMSUF: "
1041                 read D
1042                 if [ -n "$D" ]
1043                 then
1044                     DOMSUF=$D
1045                 fi
1046                 Echo "input HOST: "
1047                 read H
1048                 if [ -n "$H" ]
1049                 then
1050                     HOST=$H
1051                 fi
1052             fi
1053         done
1054     fi
1055     export HOST DOMSUF
1056     Debug "HOST: $HOST, DOMSUF: $DOMSUF"
1057 }
1058
1059 #-----------------------------# UTILS #----------------------------------
1060
1061 ########################### qa_stat_get_sysinfo ########################
1062 # local shell function, tries to determine the QA operating system
1063 ########################################################################
1064 qa_stat_get_sysinfo()
1065 {
1066     case $1 in
1067         ?*) REM_SYS=$1
1068             GET_SYSINFO="rsh $1"
1069             ;;
1070         *)  REM_SYS=""
1071             GET_SYSINFO=""
1072             ;;
1073     esac
1074     QA_SYS=`$GET_SYSINFO uname -sr`
1075     echo $QA_SYS | grep Linux >/dev/null &&
1076               QA_RHVER=`$GET_SYSINFO cat /etc/redhat-release`
1077     if [ -n "$QA_RHVER" ]
1078     then
1079         QA_OS=`echo $REM_SYS $QA_RHVER | sed -e "s/Red Hat /RH /" \
1080                     -e "s/ release//"`
1081     else
1082         case $QA_SYS in
1083             *SunOS*5.[89]*)
1084                 ISAINFO=`$GET_SYSINFO isainfo -v`
1085                 IS_64=`echo $ISAINFO | grep 64 >/dev/null && \
1086                     echo 64 bit`
1087                 IS_I386=`echo $ISAINFO | grep i386 >/dev/null && \
1088                     echo i86pc`
1089                 if [ -n "$IS_I386" ] ; then IS_64="$IS_I386"; fi;
1090                 if [ -z "$IS_64" ] ; then IS_64="32 bit"; fi;
1091                 ;;
1092             *HP*)
1093                 IS_64=`$GET_SYSINFO getconf KERNEL_BITS |
1094                     grep 64 >/dev/null && echo 64 bit`
1095                 if [ -z "$IS_64" ] ; then IS_64="32 bit"; fi;
1096                 ;;
1097             *AIX*)
1098                 IS_64=`$GET_SYSINFO lslpp -l |
1099                     grep "bos.64bit"> /dev/null && echo 64 bit`
1100                 if [ -z "$IS_64" ] ; then IS_64="32 bit"; fi;
1101                 ;;
1102         esac
1103         QA_OS=`echo "$REM_SYS $QA_SYS $IS_64"`
1104     fi
1105     if [ "$O_SILENT" != ON ] ; then
1106         echo $QA_OS
1107     fi
1108     QA_OS_STRING=`echo $QA_OS | sed -e "s/^[_ ]//" -e "s/ /_/g"`
1109 }
1110
1111 ################################### set_objdir #########################
1112 # global shell function, sets the object directories and DIST
1113 ########################################################################
1114 set_objdir()
1115 {
1116     Debug "set object dir"
1117     OBJDIR=`cd ${TESTSCRIPTDIR}/common; gmake objdir_name`
1118     OS_ARCH=`cd ${TESTSCRIPTDIR}/common; gmake os_arch`
1119     
1120     #at this point $MASTERBUILD needs to be either NT or unix
1121
1122     set_daily_build_dirs
1123     LOCALDIST_BIN=${LOCALDIST}/${OBJDIR}/bin
1124     DIST=$LOCALDIST
1125
1126     if [ -z "${TEST_LEVEL}" ] ; then 
1127         TEST_LEVEL=0
1128     fi
1129     bc ${TEST_LEVEL}   #set the path for the backward compatibility test
1130
1131     PATH_CONTAINS_BIN="TRUE"
1132     export PATH_CONTAINS_BIN
1133
1134     export OBJDIR OS_ARCH LOCALDIST LOCALDIST_BIN DIST PATH 
1135 }
1136
1137 ########################### bc #########################################
1138 # global shell function , sets paths for the backward compatibility test
1139 ########################################################################
1140 bc()
1141 {
1142   if [ -n "$PRODUCT_TO_TEST" -a "$PRODUCT_TO_TEST" = "JSS" ] ; then
1143       TESTDIR=${RESULTDIR}
1144       BC_ACTION=""
1145       DON_T_SET_PATHS="FALSE" #let init.sh override - FIXME - check if necessary
1146       return
1147   fi
1148   DON_T_SET_PATHS="TRUE"
1149   case $1 in
1150     0)
1151       #unset TESTDIR
1152       TESTDIR=${RESULTDIR}
1153       if [ "$O_WIN" = "ON" -a "$O_CYGNUS" != ON ] ; then
1154           PATH="$TESTSCRIPTDIR;$LOCALDIST_BIN;$BASEPATH"
1155       else
1156           PATH=$TESTSCRIPTDIR:$LOCALDIST_BIN:$BASEPATH
1157       fi
1158       BC_ACTION=""
1159       DON_T_SET_PATHS="FALSE" #let init.sh override - FIXME - check if necessary
1160       ;;
1161     *)
1162       if [ "$O_LOCAL" = "ON" ] ; then
1163           Exit "FIXME Can't run backwardcompatibility tests locally yet"
1164       fi
1165       TESTSCRIPTDIR=${BCDIST}/../security/nss/tests
1166       COMMON=${TESTSCRIPTDIR}/common
1167       TESTDIR=${RESULTDIR}/bct
1168       BC_ACTION="backward compatibility of binaries in $BC_MASTER to new libs"
1169       BCDIST_BIN=${BCDIST}/${OBJDIR}/bin
1170       LD_LIBRARY_PATH=${LOCALDIST}/${OBJDIR}/lib
1171       if [ "$O_WIN" = "ON" ] ; then
1172           if [ "$O_CYGNUS" = ON ] ; then
1173               PATH=$TESTSCRIPTDIR:$BCDIST_BIN:$BASEPATH:$LD_LIBRARY_PATH
1174           else
1175               PATH="$TESTSCRIPTDIR;$BCDIST_BIN;$BASEPATH;$LD_LIBRARY_PATH"
1176           fi
1177       else
1178           PATH=$TESTSCRIPTDIR:$BCDIST_BIN:$BASEPATH
1179       fi
1180       Debug "1st stage of backward compatibility test"
1181       ;;
1182   esac
1183   if [ -n "$TESTDIR" ] ; then
1184       if [ ! -d $TESTDIR ] ; then
1185           mkdir -p $TESTDIR
1186       fi
1187       export TESTDIR
1188   fi
1189   SHLIB_PATH=${LD_LIBRARY_PATH}
1190   LIBPATH=${LD_LIBRARY_PATH}
1191   Debug "PATH $PATH"
1192   Debug "LD_LIBRARY_PATH $LD_LIBRARY_PATH"
1193   export PATH LD_LIBRARY_PATH SHLIB_PATH LIBPATH
1194   export DON_T_SET_PATHS BC_ACTION
1195   export TESTSCRIPTDIR COMMON
1196 }
1197
1198 ########################### Ps #########################################
1199 # global shell function , attempts a platform specific ps
1200 ########################################################################
1201 Ps()
1202 {
1203 #AIX, OSF ps -ef, solaris /usr/5bin/ps -ef, win ps -ef but no user id
1204 #linux ps -ef, HP
1205
1206     if [ $os_name = "SunOS" ]
1207     then
1208         /usr/5bin/ps -ef
1209     else
1210         ps -ef
1211     fi
1212 }
1213
1214 ########################### kill_by_name ################################
1215 # global shell function , kills the process whose name is given as 
1216 # parameter 
1217 ########################################################################
1218 kill_by_name()
1219 {
1220     for PID in `Ps | grep "$1" | grep -v grep | \
1221         sed -e "s/^ *//g" -e "s/^[^ ]* //" -e "s/^ *//g" -e "s/ .*//g"`
1222     do
1223         if [ $O_WIN = "ON" -a $O_CYGNUS = "ON" ]
1224         then
1225             ask "Do you want to kill Process $PID (`Ps | grep $PID | \
1226                 grep -v grep | awk '{ print $1, $2, $6, $7, $8, $9 }' | \
1227                 sed -e "s/[0-9]:[0-6][0-9]//g" | grep $PID `)" \
1228                 "y" "n" && {
1229                 kill $PID
1230                 sleep 1
1231                 kill -9 $PID 2>/dev/null
1232             }
1233         else
1234             ask "Do you want to kill Process $PID (`Ps | grep $PID | \
1235                 grep -v grep | awk '{ print $1, $2, $8, $9, $10, $11 }' | \
1236                 sed -e "s/[0-9]:[0-6][0-9]//g" | grep $PID `)" \
1237                 "y" "n" && {
1238                 kill $PID
1239                 sleep 1
1240                 kill -9 $PID 2>/dev/null
1241             }
1242         fi
1243     done
1244 }
1245
1246 ############################### early_exit ###################################
1247 # global shell function , attempts a little more usefull user notification
1248 # of a complete failure
1249 ########################################################################
1250
1251 early_exit()
1252 {
1253     if [ -z "$DOCDIR" ]
1254     then
1255         DOCDIR=`dirname $0`/../doc
1256     fi
1257     if [ -f $DOCDIR/QAerror.html ]
1258     then
1259         Debug "Found QA errorheader"
1260         rm ${FILENAME}.err 2>/dev/null
1261         cp $DOCDIR/QAerror.html ${FILENAME}.err
1262         echo "$1" >>${FILENAME}.err
1263         echo '</font></b></h1>' >>${FILENAME}.err
1264         if [ -n "$FILENAME" -a -f "$FILENAME" ]
1265         then
1266             cat $FILENAME | sed -e "s/^/<br>/" >>${FILENAME}.err
1267         fi
1268         echo '</body></html>' >>${FILENAME}.err
1269         cat ${FILENAME}.err | $RMAIL $MAILINGLIST
1270         
1271         rm ${FILENAME}.err 2>/dev/null
1272         #echo "cat ${FILENAME}.err | $RMAIL $MAILINGLIST "
1273     fi
1274 }
1275
1276 ############################### Exit ###################################
1277 # global shell function , central exiting point
1278 # cleanup: temporary files, kill the remaining selfservers if sourcing
1279 # script sets KILL_SELFSERV 
1280 ########################################################################
1281 Exit()
1282 {
1283     Echo $1    
1284     if [ "$O_CRON" = "OFF" ] 
1285     then
1286         echo $1 >&2
1287     fi
1288     if [ -f "${KILLPIDS}" ]
1289     then
1290         Debug "Attempting to kill background processes...`cat ${KILLPIDS}`"
1291         kill `cat "${KILLPIDS}"` 
1292         sleep 1
1293         kill -9  `cat "${KILLPIDS}"`
1294     fi
1295     if [ -n "${TMPFILES}" ]
1296     then
1297         Debug "rm -f ${TMPFILES}"
1298         rm -f $TMPFILES 2>/dev/null
1299     fi
1300     O_ALWAYS_YES=ON # set to non-interactive - don't ask anymore questions here
1301     if [ $KILL_SELFSERV = "ON" ]
1302     then
1303         kill_by_name selfserv
1304     fi
1305     if [ $O_MAIL_LINK = "ON" -a $O_FILE = "ON" ]
1306     then
1307         if [ $EARLY_EXIT = TRUE ]    #before the report file has been created
1308         then
1309             early_exit "$1"
1310         else
1311             head -3  $FILENAME >$ML_FILE
1312             echo "Content-Type: text/plain; charset=us-ascii; format=flowed
1313     Content-Transfer-Encoding: 7bit
1314
1315 " >>$ML_FILE
1316             echo $HREF_TMP_HTML_FILE >>$ML_FILE
1317             cat $ML_FILE | $RMAIL $MAILINGLIST
1318         fi
1319
1320 #FIXME - early exit etc
1321     elif [ $O_MAIL = "ON" -a $O_FILE = "ON" ]
1322     then
1323         if [ $EARLY_EXIT = TRUE ]    #before the report file has been created
1324         then
1325             early_exit "$1"
1326         elif [ -n "$FILENAME" -a -f "$FILENAME" ]
1327         then
1328             cat $FILENAME | $RMAIL $MAILINGLIST
1329         fi
1330         #rm $FILENAME 2>/dev/null
1331     elif  [ $O_MAIL = "ON" -a $EARLY_EXIT = TRUE ]
1332     then
1333         early_exit "$1"
1334         rm $FILENAME 2>/dev/null
1335     fi
1336     #chmod a+rw ${RESULTDIR} ${RESULTDIR}/* ${RESULTDIR}/*/* &
1337     if [ -n "$O_TBX" -a "$O_TBX" = "ON" ] ; then
1338         rm ${TESTDIR}/QAstatus
1339
1340         if [ "$1" = "killed... cleaning up..." ] ; then
1341             echo "QA killed" >${TESTDIR}/QAstatus
1342         elif [ "$TBX_EXIT" = 0 ] ; then
1343             echo "QA passed" >${TESTDIR}/QAstatus
1344         else
1345             echo "QA failed" >${TESTDIR}/QAstatus
1346         fi
1347
1348         exit $TBX_EXIT
1349          
1350     else
1351         exit
1352     fi
1353 }
1354
1355 trap "rm -f ${TMPFILES} 2>/dev/null; Exit 'killed... cleaning up...'" 2 3 15
1356
1357 ################################ Wait ##################################
1358 # global shell function to wait for an event to happen, 1st parameter
1359 # filename to watch, 2nd parameter 0 - wait for it to disappear, 1 wait
1360 # for it to be created.
1361 # uses the variables WAIT_FOR and WAIT_TIMES
1362 # WAIT_FOR: if waiting for an event sleep n seconds before rechecking 
1363 #     recomended value 10 minutes 600
1364 # WAIT_TIMES: recheck n times before giving up to prevent endless loop
1365 #     recomended 30 - total of 5h
1366 ########################################################################
1367
1368 Wait()
1369 {
1370     i=0
1371     Debug "Waiting for $1"
1372     while [ $i -lt $WAIT_TIMES ]
1373     do
1374         i=`expr $i + 1`
1375         if [ -f "$1" -a $2 -eq 1 ]   # if file exists and is supposed to 
1376         then
1377             return
1378         fi
1379         if [ ! -f "$1" -a $2 -eq 0 ] # not exists and not supposed to exist
1380         then
1381             return
1382         fi
1383         Debug "Waiting for $1, loop #$i, about to sleep $WAIT_FOR seconds zzzz..."
1384         sleep $WAIT_FOR
1385     done
1386     TOTAL=`expr $WAIT_TIMES \* $WAIT_FOR / 60`
1387     Exit "I HAVE WAITED LONG ENOUGH FOR $1 NOW, I'M GONE! (THAT WAS A TOTAL OF $TOTAL MINUTES) I have better things to do... "
1388 }
1389
1390 ################################ WaitForever ##################################
1391 # global shell function to wait for an event to happen, 1st parameter
1392 # filename to watch, 2nd parameter 0 - wait for it to disappear, 1 wait
1393 # for it to be created.
1394 # because we daon't have any relyable cron on NT...
1395 ########################################################################
1396
1397 WaitForever()
1398 {
1399     i=0
1400     Debug "Waiting for $1"
1401     TOTAL=0
1402     while [ 1 ]
1403     do
1404         i=`expr $i + 1`
1405         if [ -f "$1" -a $2 -eq 1 ] # if file exists and is supposed to 
1406         then
1407             return
1408         fi
1409         if [ ! -f "$1" -a $2 -eq 0 ] # not exists and not supposed to exist
1410         then
1411             return
1412         fi
1413         Debug "Waiting for $1, loop #$i, about to sleep $WAIT_FOR seconds Total $TOTAL"
1414         sleep $WAIT_FOR
1415         TOTAL=`expr $i \* $WAIT_FOR / 60`
1416         if [ -n "$MAX_FOREVER" ] # we are cheating. Forever can be very short...
1417         then
1418             if [ "$TOTAL" -gt "$MAX_FOREVER" ] 
1419             then
1420                 Exit "I HAVE WAITED LONG ENOUGH FOR $1 NOW, I'M GONE! (THAT WAS A TOTAL OF $TOTAL MINUTES) I have better things to do... "
1421             fi
1422         fi
1423     done
1424 }
1425 ################################### is_running #########################
1426 # global shell function , implements primitive locking mechanism
1427 # filename is passed as a parameter, if filename.* exists we assume calling
1428 # script is running already and exit, otherwise filename.processid is 
1429 # created 
1430 ########################################################################
1431 is_running()
1432 {
1433     Debug "Testing if $0 is already running... file ${1} - ${1}.$$"
1434     if [ -f ${1}.* ]
1435     then
1436         Exit "$0 seems to be running already ($1 exists) - Exiting"
1437     fi
1438     TMPFILES="$TMPFILES ${1}.$$"
1439     echo "running $0 on `date` PID $$" >${1}.$$
1440     Debug "wrote \"running $0 on `date` PID $$\" to ${1}.$$"
1441     
1442 }
1443
1444 #---------------------------# USERCOM #---------------------------------
1445 ############################## Echo #####################################
1446 # global shell function , depending on the options the output gets written 
1447 # to a file, or is being discarded
1448 # FIXME  \n and \c are mistreates by differnet shells, and linux has /bin/echo
1449 # instead of /usr/bin/echo
1450 ########################################################################
1451 Echo ()
1452 {
1453     if [ $O_SILENT = OFF ]
1454     then
1455         echo "$*"
1456         #/usr/bin/echo "$*"
1457     fi
1458     if [ $O_FILE = ON ]
1459     then
1460         echo "$*" >>$FILENAME
1461     fi
1462 }
1463
1464 ################################### ask ################################
1465 # global shell function, Asks the a question, and gives the returns 0
1466 # on the 1st choice, 1 on the 2nd choice
1467 #
1468 # PARAMETERS:
1469 #    $1 question text
1470 #    $2 1st choice
1471 #    $3 2nd choice
1472 #
1473 # MODIFIERS:
1474 #    -y O_ALWAYS_YES will assume a first choice always (not neccessaryly "y")
1475 #
1476 # RETURN:
1477 #    0 - User picked 1st choice
1478 #    1 - User picked 2nd choice
1479 #
1480 # EXAMPLE
1481 #    ask "Would you like to continue" "y" "n" || Exit
1482 #        will produce the string "Would you like to continue (y/n) ?",
1483 #        read input from keyboard (or assume a yes with option -y)
1484 #        - on a yes it will return 0, on a no it will return 1, the 
1485 #        shell interprets it as error and the || Exit will be executed
1486 #
1487 # NOTE: NEVER use "n" as the second parameter - it will mess up -y
1488 #    don't ask "Continue" "n" "y" || Exit # it will Exit on a "y"
1489 #
1490 ########################################################################
1491 Ask()
1492 {
1493     ask $*
1494 }
1495
1496 ask()
1497 {
1498     if [ $O_ALWAYS_YES = ON ]
1499     then
1500         Echo "$1 ($2/$3) ?"
1501         Echo "YES!"
1502         return 0
1503     fi
1504     A=""
1505     while [ 1 ]
1506     do
1507     
1508         Echo "$1 ($2/$3) ?"
1509         read A
1510         if [ -n "$A" ]
1511         then
1512             if [ $A = $2 ]
1513             then
1514                 return 0
1515             elif [ $A = $3 ]
1516             then
1517                 return 1
1518             fi
1519         fi
1520     done
1521     return 0
1522 }
1523
1524 ################################### Warning ############################
1525 # global shell function, Asks the user a "... continue? (y/n)" question, 
1526 # and exits when the user answers with no
1527 # NOTE -y will answer the warnings always with yes
1528 ########################################################################
1529 Warning ()
1530 {
1531     ask "WARNING: $0: \n $* continue " "y" "n" || Exit 
1532 }
1533
1534 ################################### Debug ############################
1535 # global shell function, when option -d Debugging output is written
1536 ########################################################################
1537 Debug()
1538 {
1539     if [ $O_DEBUG = ON ]
1540     then
1541         Echo "DEBUG: (`date +%H:%M`) $0: $*"
1542     fi
1543 }
1544
1545 ################################### line ###############################
1546 # global shell function, supposed to make output more readable...
1547 ########################################################################
1548 line()
1549 {
1550 Echo
1551 #Echo "======================================================================="
1552 #Echo
1553 }
1554
1555 ################################### opt_usage ##########################
1556 # global shell function, tells user about available options
1557 ########################################################################
1558 opt_usage()
1559 {
1560   if [ $O_OPTIONS = "ON" ]
1561   then
1562     Echo
1563     line
1564     Echo
1565     Echo "    -y answer all questions with y - use at your own risk..."
1566     Echo "    -s silent (only usefull with -y)"
1567     Echo "    -h, -? - you guessed right - displays this text"
1568     Echo "    -d debug"
1569     Echo "    -f <filename> - write the (error)output to filename"
1570     Echo "    -fcronfile produces the resultfiles in the same locations"
1571     Echo "        as would have been produced with -cron"
1572     Echo "    -m <mailinglist> - send filename to mailinglist (csl "
1573     Echo "         example sonmi,nelsonb,wtc) only useful with -f"
1574     Echo "    -ml <mailinglist> - send link to filename to mailinglist "
1575     Echo "         (csl example sonmi,nelsonb,wtc) only useful with -f"
1576     Echo "    -cron equivalient to -y -s -d -f \$RESULTDIR/\$HOST.nssqa"
1577     Echo "    -t run on a tinderbox build (included -cron)"
1578     if [ `basename $0` = nssqa ] ; then
1579         Echo "    -l <mozroot> run on a local build"
1580         Echo "    -ln <mozroot> copy a networkbuild to a local directory "
1581         Echo "        mozroot,  used for networkindipendend QA "
1582         Echo "    -lt try to copy a networkbuild to a local directory, if"
1583         Echo "        not possible run on the network
1584         Echo "        used for networkindipendend QA
1585     fi
1586 #
1587 # special strings
1588   fi
1589     
1590 }
1591
1592 ################################### glob_usage #########################
1593 # global shell function, how to use the calling script (parameters, options)
1594 ########################################################################
1595 glob_usage()
1596 {
1597     line
1598     Echo $1
1599     Echo
1600     if [ $O_OPTIONS = "ON" ]
1601     then
1602         Echo "usage $0 [options] nssversion builddate"
1603     else
1604         Echo "usage $0 nssversion builddate"
1605     fi
1606         
1607     Echo " for example: $0 30b 0926"
1608     Echo "     $0 31 1002"
1609     opt_usage
1610     Echo
1611     Exit "$1"
1612 }
1613
1614 tell()
1615 {
1616     if [ $O_SILENT = OFF ]
1617     then
1618         line
1619         pwd
1620         ls -CF
1621         line
1622     fi
1623     if [ $O_FILE = ON ]
1624     then
1625         line
1626         pwd >>$FILENAME
1627         ls -CF >>$FILENAME
1628         line 
1629     fi
1630 }
1631
1632 if [ $O_INIT = "ON" ]
1633 then
1634     glob_init $*
1635 fi
1636 EARLY_EXIT=FALSE