VirtualBox

source: vbox/trunk/src/VBox/Installer/linux/routines.sh@ 32214

Last change on this file since 32214 was 31664, checked in by vboxsync, 14 years ago

Linux installer: header fixes

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 19.4 KB
Line 
1# Oracle VM VirtualBox
2# VirtualBox installer shell routines
3#
4
5# Copyright (C) 2007-2010 Oracle Corporation
6#
7# This file is part of VirtualBox Open Source Edition (OSE), as
8# available from http://www.virtualbox.org. This file is free software;
9# you can redistribute it and/or modify it under the terms of the GNU
10# General Public License (GPL) as published by the Free Software
11# Foundation, in version 2 as it comes in the "COPYING" file of the
12# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
13# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
14#
15
16ro_LOG_FILE=""
17ro_X11_AUTOSTART="/etc/xdg/autostart"
18ro_KDE_AUTOSTART="/usr/share/autostart"
19
20# Aborts the script and prints an error message to stderr.
21#
22# syntax: abort message
23
24abort() {
25 echo 1>&2 "$1"
26 exit 1
27}
28
29# Creates an empty log file and remembers the name for future logging
30# operations
31#
32# syntax: create_log logfile
33
34create_log() {
35 ro_LOG_FILE="$1"
36 if [ "$ro_LOG_FILE" = "" ]; then
37 abort "create_log called without an argument! Aborting..."
38 fi
39 # Create an empty file
40 echo > "$ro_LOG_FILE" 2> /dev/null
41 if [ ! -f "$ro_LOG_FILE" -o "`cat "$ro_LOG_FILE"`" != "" ]; then
42 abort "Error creating log file! Aborting..."
43 fi
44}
45
46# Writes text to standard error
47#
48# Syntax: info text
49
50info() {
51 echo 1>&2 "$1"
52}
53
54# Writes text to the log file
55#
56# Syntax: log text
57
58log() {
59 if [ "$ro_LOG_FILE" = "" ]; then
60 abort "Error! Logging has not been set up yet! Aborting..."
61 fi
62 echo "$1" >> $ro_LOG_FILE
63 return 0
64}
65
66# Writes test to standard output and to the log file
67#
68# Syntax: infolog text
69
70infolog() {
71 info "$1"
72 log "$1"
73}
74
75# Checks whether a module is loaded with a given string in its name.
76#
77# syntax: module_loaded string
78
79module_loaded() {
80 if [ "$1" = "" ]; then
81 log "module_loaded called without an argument. Aborting..."
82 abort "Error in installer. Aborting..."
83 fi
84 lsmod | grep -q $1
85}
86
87# Abort if we are not running as root
88
89check_root() {
90 if [ `id -u` -ne 0 ]; then
91 abort "This program must be run with administrator privileges. Aborting"
92 fi
93}
94
95# Abort if a copy of VirtualBox is already running
96
97check_running() {
98 if pidof VBoxSVC > /dev/null 2>&1; then
99 echo 1>&2 "A copy of VirtualBox is currently running. Please close it and try again."
100 abort "Please note that it can take up to ten seconds for VirtualBox to finish running."
101 fi
102}
103
104# Do we have bzip2?
105
106check_bzip2() {
107 if ! ls /bin/bzip2 /usr/bin/bzip2 /usr/local/bin/bzip2 2> /dev/null | grep bzip2 > /dev/null; then
108 echo 1>&2 "Please install the bzip2 utility."
109 log "Please install bzip2."
110 return 1
111 fi
112 return 0
113}
114
115# Do we have GNU make?
116
117check_gmake() {
118make --version 2>&1 | grep GNU > /dev/null
119 if [ ! $? = 0 ]; then
120 echo 1>&2 "Please install GNU make."
121 log "Please install GNU make."
122 return 1
123 fi
124 return 0
125}
126
127# Can we find the kernel source?
128
129check_ksource() {
130 ro_KBUILD_DIR=/lib/modules/`uname -r`/build
131 if [ ! -d $ro_KBUILD_DIR/include ]; then
132 ro_KBUILD_DIR=/usr/src/linux
133 if [ ! -d $ro_KBUILD_DIR/include ]; then
134 echo 1>&2 "Please install the build and header files for your current Linux kernel."
135 echo 1>&2 "The current kernel version is `uname -r`"
136 ro_KBUILD_DIR=""
137 log "Could not find the Linux kernel header files - the directories"
138 log " /lib/modules/`uname -r`/build/include and /usr/src/linux/include"
139 log " do not exist."
140 return 1
141 fi
142 fi
143 return 0
144}
145
146# Is GCC installed?
147
148check_gcc() {
149 ro_gcc_version=`gcc --version 2> /dev/null | head -n 1`
150 if [ "$ro_gcc_version" = "" ]; then
151 echo 1>&2 "Please install the GNU compiler."
152 log "Please install the GNU compiler."
153 return 1
154 fi # GCC installed
155 return 0
156}
157
158# Is bash installed? You never know...
159
160check_bash() {
161 if [ ! -x /bin/bash ]; then
162 echo 1>&2 "Please install GNU bash."
163 log "Please install GNU bash."
164 return 1
165 fi
166 return 0
167}
168
169# Is perl installed?
170
171check_perl() {
172 if [ ! `perl -e 'print "test"' 2> /dev/null` = "test" ]; then
173 echo 1>&2 "Please install perl."
174 echo "Please install perl."
175 return 1
176 fi
177 return 0
178}
179
180# What type of system are we running on?
181
182check_system_type() {
183 if [ ! "$ro_SYS_TYPE" = "" ]; then
184 return 0
185 elif [ -f /etc/debian_version ]; then
186 ro_SYS_TYPE=debian
187 ro_INIT_TYPE=sysv
188 elif [ -f /etc/gentoo-release ]; then
189 ro_SYS_TYPE=gentoo
190 ro_INIT_TYPE=sysv
191 elif [ -x /sbin/chkconfig ]; then
192 ro_SYS_TYPE=redhat
193 ro_INIT_TYPE=sysv
194 elif [ -x /sbin/insserv ]; then
195 ro_SYS_TYPE=suse
196 ro_INIT_TYPE=sysv
197 elif [ -f /etc/lfs-release -a -d /etc/rc.d/init.d ]; then
198 ro_SYS_TYPE=lfs
199 ro_INIT_TYPE=lfs
200 elif [ -f /etc/pardus-release ]; then
201 ro_SYS_TYPE=pardus
202 ro_INIT_TYPE=pardus
203 elif [ -f /etc/rc.d/rc.local ]; then
204 ro_SYS_TYPE=unknown
205 ro_INIT_TYPE=bsd
206 ro_RC_LOCAL=/etc/rc.d/rc.local
207 elif [ -f /etc/rc.local ]; then
208 ro_SYS_TYPE=unknown
209 ro_INIT_TYPE=bsd
210 ro_RC_LOCAL=/etc/rc.local
211 elif [ -d /etc/init.d ]; then
212 ro_SYS_TYPE=unknown
213 ro_INIT_TYPE=sysv
214 else # Perhaps we can determine what we need to know anyway though?
215 echo 1>&2 "Unable to determine your Linux distribution"
216 log "Unable to determine the Linux distribution"
217 return 1
218 fi
219 return 0
220}
221
222# Hack to handle Mandriva's speedboot runlevel
223copy_install_script() {
224 if [ "$ro_INIT_TYPE" = "sysv" -a -r /etc/sysconfig/speedboot ]; then
225 cp "$1" "$2" 2>/dev/null
226 else
227 sed -e 's/^\(#\s*chkconfig:\s*[0-9]*\)7/\1/' "$1" > "$2"
228 fi
229}
230
231# Installs a file containing a shell script as an init script
232#
233# syntax: install_init_script file name
234#
235# where file is the file to be installed and
236# name is the name of the new init script
237
238install_init_script() {
239 self="install_init_script"
240 script=$1
241 name=$2
242 pardus_script=$name-pardus.py
243 check_system_type
244 test $? -ne 1 || return 1
245 test -r "$script" || return 1
246 test ! "$name" = "" || \
247 { log "$self: invalid arguments" && return 1; }
248 if [ "$ro_INIT_TYPE" = "pardus" ];then
249 test -r "$pardus_script" || \
250 { log "$self: Pardus service script missing" && return 1; }
251 fi
252 if [ "$ro_INIT_TYPE" = "sysv" ]; then
253 copy_install_script "$script" "/etc/init.d/$name"
254 chmod 755 "/etc/init.d/$name" 2> /dev/null
255 elif [ "$ro_INIT_TYPE" = "bsd" ]; then
256 copy_install_script "$script" "/etc/rc.d/rc.$name"
257 chmod 755 "/etc/rc.d/rc.$name" 2> /dev/null
258 elif [ "$ro_INIT_TYPE" = "lfs" ]; then
259 copy_install_script "$script" "/etc/rc.d/init.d/$name"
260 chmod 755 "/etc/rc.d/init.d/$name" 2> /dev/null
261 elif [ "$ro_INIT_TYPE" = "pardus" ]; then
262 copy_install_script "$script" "/usr/sbin/$name"
263 chmod 755 "/usr/sbin/$name" 2> /dev/null
264 hav register $name System.Service $pardus_script
265 else
266 log "install_init_script: error: unknown init type"
267 return 1
268 fi
269 return 0
270}
271
272# Remove the init script "name"
273#
274# syntax: remove_init_script name
275
276remove_init_script() {
277 self="remove_init_script"
278 name=$1
279 check_system_type
280 test $? -ne 1 || return 1
281 test ! "$name" = "" || \
282 { log "$self: missing argument" && return 1; }
283 if [ "$ro_INIT_TYPE" = "sysv" ]; then
284 rm -f "/etc/init.d/$name" > /dev/null 2>&1
285 elif [ "$ro_INIT_TYPE" = "bsd" ]; then
286 rm -f "/etc/rc.d/rc.$name" > /dev/null 2>&1
287 elif [ "$ro_INIT_TYPE" = "lfs" ]; then
288 rm -f "/etc/rc.d/init.d/$name" > /dev/null 2>&1
289 elif [ "$ro_INIT_TYPE" = "pardus" ]; then
290 hav remove $name
291 rm -f "/usr/sbin/$name" > /dev/null 2>&1
292 else
293 log "remove_init_script: error: unknown init type"
294 return 1
295 fi
296 return 0
297}
298
299# Start the init script "name"
300#
301# syntax: start_init_script name
302
303start_init_script() {
304 self="start_init_script"
305 name=$1
306 check_system_type
307 test $? -ne 1 || return 1
308 test ! -z "$name" || \
309 { log "$self: missing argument" && return 1; }
310 if [ "$ro_INIT_TYPE" = "sysv" ]; then
311 "/etc/init.d/$name" start >> $ro_LOG_FILE 2>&1
312 elif [ "$ro_INIT_TYPE" = "bsd" ]; then
313 "/etc/rc.d/rc.$name" start >> $ro_LOG_FILE 2>&1
314 elif [ "$ro_INIT_TYPE" = "lfs" ]; then
315 "/etc/rc.d/init.d/$name" start >> $ro_LOG_FILE 2>&1
316 elif [ "$ro_INIT_TYPE" = "pardus" ]; then
317 service $name on
318 else
319 log "$self: error: unknown init type"
320 return 1
321 fi
322}
323
324# Stop the init script "name"
325#
326# syntax: start_init_script name
327
328stop_init_script() {
329 self=stop_init_script
330 name=$1
331 check_system_type
332 test $? -ne 1 || return 1
333 test ! -z "$name" || \
334 { log "$self: missing argument" && return 1; }
335 if [ "$ro_INIT_TYPE" = "sysv" ]; then
336 "/etc/init.d/$name" stop >> $ro_LOG_FILE 2>&1
337 elif [ "$ro_INIT_TYPE" = "bsd" ]; then
338 "/etc/rc.d/rc.$name" stop >> $ro_LOG_FILE 2>&1
339 elif [ "$ro_INIT_TYPE" = "lfs" ]; then
340 "/etc/rc.d/init.d/$name" stop >> $ro_LOG_FILE 2>&1
341 elif [ "$ro_INIT_TYPE" = "pardus" ]; then
342 service $name off
343 else
344 log "$self: error: unknown init type"
345 return 1
346 fi
347 return 0
348}
349
350# Add a service to a runlevel
351#
352# syntax: addrunlevel name start_order stop_order
353
354addrunlevel() {
355 test ! -z "$1" || \
356 { log "addrunlevel: missing argument(s)" && return 1; }
357 check_system_type
358 # Redhat based systems
359 if [ "$ro_SYS_TYPE" = "redhat" ]
360 then
361 test -x "/sbin/chkconfig" || \
362 { log "addrunlevel: /sbin/chkconfig not found" && return 1; }
363 /sbin/chkconfig --del $1 > /dev/null 2>&1
364
365 if /sbin/chkconfig -v > /dev/null 2>&1; then
366 /sbin/chkconfig --level 35 $1 on || {
367 log "Cannot add $1 to run levels: 35" && return 1
368 }
369 else
370 /sbin/chkconfig $1 35 || {
371 log "Cannot add $1 to run levels: 35" && return 1
372 }
373 fi
374 # SUSE-base systems
375 elif [ "$ro_SYS_TYPE" = "suse" ]
376 then
377 test -x /sbin/insserv || {
378 log "addrunlevel: insserv not found" && return 1;
379 }
380 /sbin/insserv -r $1 > /dev/null 2>&1
381 /sbin/insserv $1 > /dev/null
382 # Debian/Ubuntu-based systems
383 elif [ "$ro_SYS_TYPE" = "debian" ]; then
384 test -x `which update-rc.d` || \
385 { log "addrunlevel: update-rc.d not found" && return 1; }
386 test ! -z "$2" || \
387 { log "addrunlevel: missing second argument" && return 1; }
388 test ! -z "$3" || \
389 { log "addrunlevel: missing third argument" && return 1; }
390 # Debian does not support dependencies currently -- use argument $2
391 # for start sequence number and argument $3 for stop sequence number
392 update-rc.d -f $1 remove > /dev/null 2>&1
393 update-rc.d $1 defaults $2 $3 > /dev/null 2>&1
394 # Gentoo Linux
395 elif [ "$ro_SYS_TYPE" = "gentoo" ]; then
396 test -x `which rc-update` || \
397 { log "addrunlevel: update-rc.d not found" && return 1; }
398 rc-update del $1 > /dev/null 2>&1
399 rc-update add $1 default > /dev/null 2>&1
400 # Linux from scratch, by the book
401 elif [ "$ro_SYS_TYPE" = "lfs" ]; then
402 test -x /etc/rc.d/init.d/$1 || \
403 { log "addrunlevel: name argument must be a script in /etc/rc.d/init.d" && return 1; }
404 P2=$2
405 P3=$3
406 # add leading zero
407 if [ `expr length "$P2"` -eq 1 ]; then
408 P2=`expr 0$P2`
409 fi
410 if [ `expr length "$P3"` -eq 1 ]; then
411 P3=`expr 0$P3`
412 fi
413 expr "$P2" + 0 > /dev/null 2>&1 && expr 0 \<= "$P2" > /dev/null && \
414 [ `expr length "$P2"` -eq 2 ] || \
415 { log "addrunlevel: start sequence number must be between 00 and 99" && return 1; }
416 expr "$P3" + 0 > /dev/null 2>&1 && expr 0 \<= "$P3" > /dev/null && \
417 [ `expr length "$P3"` -eq 2 ] || \
418 { log "addrunlevel: stop sequence number must be between 00 and 99" && return 1; }
419 ln -fs "/etc/rc.d/init.d/$1" "/etc/rc.d/rc0.d/K`expr $P3`$1" > /dev/null 2>&1
420 ln -fs "/etc/rc.d/init.d/$1" "/etc/rc.d/rc1.d/K`expr $P3`$1" > /dev/null 2>&1
421 ln -fs "/etc/rc.d/init.d/$1" "/etc/rc.d/rc2.d/S`expr $P2`$1" > /dev/null 2>&1
422 ln -fs "/etc/rc.d/init.d/$1" "/etc/rc.d/rc3.d/S`expr $P2`$1" > /dev/null 2>&1
423 ln -fs "/etc/rc.d/init.d/$1" "/etc/rc.d/rc4.d/S`expr $P2`$1" > /dev/null 2>&1
424 ln -fs "/etc/rc.d/init.d/$1" "/etc/rc.d/rc5.d/S`expr $P2`$1" > /dev/null 2>&1
425 ln -fs "/etc/rc.d/init.d/$1" "/etc/rc.d/rc6.d/K`expr $P3`$1" > /dev/null 2>&1
426 # BSD-based systems require changing the rc.local file to start a new service.
427 elif [ "$ro_INIT_TYPE" = "bsd" ]; then
428 if ! grep -q $1 $ro_RC_LOCAL
429 then
430 echo "# Start $1" >> $ro_RC_LOCAL
431 echo "# If you do not wish this to be executed here then comment it out," >> $ro_RC_LOCAL
432 echo "# and the installer will skip it next time." >> $ro_RC_LOCAL
433 echo "if [ -x /etc/rc.d/rc.$1 ]; then" >> $ro_RC_LOCAL
434 echo " /etc/rc.d/rc.$1 start" >> $ro_RC_LOCAL
435 echo "fi" >> $ro_RC_LOCAL
436 echo "" >> $ro_RC_LOCAL
437 fi
438 # Probably most unknown Linux systems will be sysv type ones. These can theoretically
439 # be handled automatically if people give us information about them.
440 elif [ "$ro_INIT_TYPE" = "sysv" ]; then
441 echo 1>&2 "As our installer does not recognize your Linux distribution, we were unable to"
442 echo 1>&2 "set up the initialization script $1 correctly. The script has been copied"
443 echo 1>&2 "copied to the /etc/init.d directory. You should set up your system to start"
444 echo 1>&2 "it at system start, or start it manually before using VirtualBox."
445 echo 1>&2 ""
446 echo 1>&2 "If you would like to help us add support for your distribution, please open a"
447 echo 1>&2 "new ticket on http://www.virtualbox.org/wiki/Bugtracker."
448 fi
449 return 0
450}
451
452
453# Delete a service from a runlevel
454#
455# syntax: delrunlevel name
456
457delrunlevel() {
458 test ! -z "$1" || \
459 { log "delrunlevel: missing argument" && return 1; }
460 check_system_type
461 # Redhat-based systems
462 if [ "$ro_SYS_TYPE" = "redhat" ]
463 then
464 test -x "/sbin/chkconfig" || \
465 { log "addrunlevel: /sbin/chkconfig not found" && return 1; }
466 if /sbin/chkconfig --list $1 > /dev/null 2>&1; then
467 /sbin/chkconfig --del $1 > /dev/null 2>&1 || {
468 log "Cannot delete $1 from runlevels" && return 1
469 }
470 fi
471 # SUSE-based systems
472 elif [ "$ro_SYS_TYPE" = "suse" ]
473 then
474 test -x /sbin/insserv || {
475 log "addrunlevel: insserv not found" && return 1;
476 }
477 /sbin/insserv -r $1 > /dev/null 2>&1
478 # Debian/Ubuntu-based systems
479 elif [ "$ro_SYS_TYPE" = "debian" ]; then
480 test -x `which update-rc.d` || \
481 { log "addrunlevel: update-rc.d not found" && return 1; }
482 update-rc.d -f $1 remove > /dev/null 2>&1
483 # Gentoo Linux
484 elif [ "$ro_SYS_TYPE" = "gentoo" ]; then
485 test -x `which rc-update` || \
486 { log "addrunlevel: update-rc.d not found" && return 1; }
487 rc-update del "$1" > /dev/null 2>&1
488 # Linux from scratch, by the book
489 elif [ "$ro_SYS_TYPE" = "lfs" ]; then
490 rm "/etc/rc0.d/K??$1" > /dev/null 2>&1
491 rm "/etc/rc1.d/K??$1" > /dev/null 2>&1
492 rm "/etc/rc2.d/S??$1" > /dev/null 2>&1
493 rm "/etc/rc3.d/S??$1" > /dev/null 2>&1
494 rm "/etc/rc4.d/S??$1" > /dev/null 2>&1
495 rm "/etc/rc5.d/S??$1" > /dev/null 2>&1
496 rm "/etc/rc6.d/K??$1" > /dev/null 2>&1
497 # Unknown sysv-type system
498 elif [ "$ro_INIT_TYPE" = "sysv" ]; then
499 echo 1>&2 "Please remove remove references to the initialization script"
500 echo 1>&2 "/etc/init.d/$1 to complete the uninstallation."
501 fi
502 # BSD-type systems will just not start the script if it is not there.
503 # Assume that BSD users understand their system.
504 return 0
505}
506
507# Do initial setup of an installed service
508#
509# syntax: setup_init_script name
510
511setup_init_script()
512{
513 self=setup_init_script
514 name=$1
515 spaces=`printf " %b" "\t"`
516 check_system_type
517 test $? -ne 1 || return 1
518 test ! -z "$name" ||
519 { log "$self: missing argument" && return 1; }
520 if [ "$ro_INIT_TYPE" = "sysv" ]; then
521 scriptname="/etc/init.d/$name"
522 elif [ "$ro_INIT_TYPE" = "bsd" ]; then
523 scriptname="/etc/rc.d/rc.$name"
524 elif [ "$ro_INIT_TYPE" = "lfs" ]; then
525 scriptname="/etc/rc.d/init.d/$name"
526 elif [ "$ro_INIT_TYPE" = "pardus" ]; then
527 scriptname="/usr/sbin/$name"
528 else
529 log "$self: error: unknown init type"
530 return 1
531 fi
532 # Add the init script to the default runlevel
533 # This is complicated by the fact that we need to pass older Debian-based
534 # systems the start and stop order numbers, which we extract from the
535 # Redhat chkconfig information.
536 if test "$ro_INIT_TYPE" = "sysv" -a -r "$scriptname"; then
537 orders=`grep '^#['"$spaces"']*chkconfig:' "$scriptname" |
538 sed -e 's/^#['"$spaces"']*chkconfig:\s*[0-9]*['"$spaces"']*//'`
539 expr "$orders" : '[0-9]*['"$spaces"']*[0-9]*$' > /dev/null ||
540 {
541 log "$self: bad or missing chkconfig line in init script $scriptname"
542 return 1
543 }
544 # $orders is deliberately not quoted here
545 addrunlevel "$name" $orders
546 else
547 addrunlevel "$name"
548 fi
549 test -r "$scriptname" &&
550 grep -q '^#['"$spaces"']*setup_script['"$spaces"']*$' "$scriptname" &&
551 "$scriptname" setup
552 return 0
553}
554
555# Do pre-removal cleanup of an installed service
556#
557# syntax: cleanup_init_script name
558
559cleanup_init()
560{
561 self=cleanup_init_script
562 name=$1
563 spaces=`printf " %b" "\t"`
564 check_system_type
565 test $? -ne 1 || return 1
566 test ! -z "$name" || \
567 { log "$self: missing argument" && return 1; }
568 if [ "$ro_INIT_TYPE" = "sysv" ]; then
569 scriptname="/etc/init.d/$name"
570 elif [ "$ro_INIT_TYPE" = "bsd" ]; then
571 scriptname="/etc/rc.d/rc.$name"
572 elif [ "$ro_INIT_TYPE" = "lfs" ]; then
573 scriptname="/etc/rc.d/init.d/$name"
574 elif [ "$ro_INIT_TYPE" = "pardus" ]; then
575 scriptname="/usr/sbin/$name"
576 else
577 log "$self: error: unknown init type"
578 return 1
579 fi
580 test -r "$scriptname" &&
581 grep -q '^#['"$spaces"']*cleanup_script['"$spaces"']*$' "$scriptname" &&
582 "$scriptname" cleanup >> $ro_LOG_FILE 2>&1
583 delrunlevel "$name"
584 return 0
585}
586
587
588terminate_proc() {
589 PROC_NAME=$1
590 SERVER_PID=`pidof $PROC_NAME 2> /dev/null`
591 if [ "$SERVER_PID" != "" ]; then
592 killall -TERM $PROC_NAME > /dev/null 2>&1
593 sleep 2
594 fi
595}
596
597
598maybe_run_python_bindings_installer() {
599 VBOX_INSTALL_PATH=$1
600
601 PYTHON=python
602 if [ ! `python -c 'print "test"' 2> /dev/null` = "test" ]; then
603 echo 1>&2 "Python not available, skipping bindings installation."
604 return 1
605 fi
606
607 echo 1>&2 "Python found: $PYTHON, installing bindings..."
608 # Pass install path via environment
609 export VBOX_INSTALL_PATH
610 $SHELL -c "cd $VBOX_INSTALL_PATH/sdk/installer && $PYTHON vboxapisetup.py install"
611 # remove files created during build
612 rm -rf $VBOX_INSTALL_PATH/sdk/installer/build
613
614 return 0
615}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette