diff options
Diffstat (limited to 'nvidia-installer.c')
-rw-r--r-- | nvidia-installer.c | 770 |
1 files changed, 770 insertions, 0 deletions
diff --git a/nvidia-installer.c b/nvidia-installer.c new file mode 100644 index 0000000..124d526 --- /dev/null +++ b/nvidia-installer.c @@ -0,0 +1,770 @@ +/* + * nvidia-installer: A tool for installing NVIDIA software packages on + * Unix and Linux systems. + * + * Copyright (C) 2003 NVIDIA Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + * + * nv_installer.c + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <limits.h> +#include <string.h> + +#include <sys/types.h> +#include <sys/stat.h> + +#include <errno.h> + +#define _GNU_SOURCE /* XXX not very portable */ +#include <getopt.h> + +#include "nvidia-installer.h" +#include "kernel.h" +#include "user-interface.h" +#include "backup.h" +#include "files.h" +#include "misc.h" +#include "update.h" +#include "format.h" +#include "sanity.h" + +#define TAB " " + +static void print_version(void); +static void print_help(void); +static void print_advanced_options(void); +static void print_help_args_only(int args_only); +static void print_advanced_options_args_only(int args_only); + + + +/* + * print_version() - print the current nvidia-installer version number + */ + +extern const char *pNV_ID; + +static void print_version(void) +{ + fmtout(""); + fmtout(pNV_ID); + fmtoutp(TAB, "The NVIDIA Software Installer for Unix/Linux."); + fmtout(""); + fmtoutp(TAB, "This program is used to install and upgrade " + "The NVIDIA Accelerated Graphics Driver Set for %s-%s.", + INSTALLER_OS, INSTALLER_ARCH); + fmtout(""); + fmtoutp(TAB, "Copyright (C) 2003 NVIDIA Corporation."); + fmtout(""); +} + + + +/* + * print_help() - print usage information + */ + +static void print_help(void) +{ + print_version(); + + fmtout(""); + fmtout("nvidia-installer [options]"); + fmtout(""); + + print_help_args_only(FALSE); + +} /* print_help() */ + + + +static void print_advanced_options(void) +{ + print_version(); + + fmtout(""); + fmtout("nvidia-installer [options]"); + fmtout(""); + + fmtout(""); + fmtout("COMMON OPTIONS:"); + fmtout(""); + + print_help_args_only(FALSE); + + fmtout(""); + fmtout("ADVANCED OPTIONS:"); + fmtout(""); + + print_advanced_options_args_only(FALSE); + +} /* print_advanced_options() */ + + + +static void print_help_args_only(int args_only) +{ + /* + * the args_only parameter is used by makeself.sh to get our + * argument list and description; in this case we don't want to + * format to the width of the terminal, so hardcode the width to + * 65. + */ + + if (args_only) reset_current_terminal_width(65); + + fmtout("-a, --accept-license"); + fmtoutp(TAB, "Bypass the display and prompting for acceptance of the " + "NVIDIA Software License Agreement. By passing this option to " + "nvidia-installer, you indicate that you have read and accept the " + "License Agreement contained in the file 'LICENSE' (in the top " + "level directory of the driver package)."); + fmtout(""); + + fmtout("--update"); + fmtoutp(TAB, "Connect to the NVIDIA ftp server '%s' and determine the " + "latest available driver version. If there is a more recent " + "driver available, automatically download and install it. Any " + "other options given on the commandline will be passed on to the " + "downloaded driver package when installing it.", DEFAULT_FTP_SITE); + fmtout(""); + + fmtout("-v, --version"); + fmtoutp(TAB, "Print the nvidia-installer version and exit."); + fmtout(""); + + fmtout("-h, --help"); + fmtoutp(TAB, "Print usage information for the common commandline options " + "and exit."); + fmtout(""); + + fmtout("-A, --advanced-options"); + fmtoutp(TAB, "Print usage information for the common commandline options " + "as well as the advanced options, and then exit."); + fmtout(""); + +} /* print_help_args_only() */ + + +static void print_advanced_options_args_only(int args_only) +{ + /* + * the args_only parameter is used by makeself.sh to get our + * argument list and description; in this case we don't want to + * format to the width of the terminal, so hardcode the width to + * 65. + */ + + if (args_only) reset_current_terminal_width(65); + + fmtout("-i, --driver-info"); + fmtoutp(TAB, "Print information about the currently installed NVIDIA " + "driver version."); + fmtout(""); + + fmtout("--uninstall"); + fmtoutp(TAB, "Uninstall the currently installed NVIDIA driver."); + fmtout(""); + + fmtout("--sanity"); + fmtoutp(TAB, "Perform basic sanity tests on an existing NVIDIA " + "driver installation."); + fmtout(""); + + fmtout("-e, --expert"); + fmtoutp(TAB, "Enable 'expert' installation mode; more detailed questions " + "will be asked, and more verbose output will be printed; " + "intended for expert users. The questions may be suppressed " + "with the '--no-questions' commandline option."); + fmtout(""); + + fmtout("-q, --no-questions"); + fmtoutp(TAB, "Do not ask any questions; the default (normally 'yes') " + "is assumed for " + "all yes/no questions, and the default string is assumed in " + "any situation where the user is prompted for string input. " + "The one question that is not bypassed by this option is " + "license acceptance; the license may be accepted with the " + "commandline option '--accept-license'."); + fmtout(""); + + fmtout("-s, --silent"); + fmtoutp(TAB, "Run silently; no questions are asked and no output is " + "printed, except for error messages to stderr. This option " + "implies '--ui=none --no-questions --accept-license'."); + fmtout(""); + + fmtout("--x-prefix=[X PREFIX]"); + fmtoutp(TAB, "The prefix under which the X components of the " + "NVIDIA driver will be installed; the default is: '%s'. Only " + "under rare circumstances should this option be used.", + DEFAULT_XFREE86_INSTALLATION_PREFIX); + fmtout(""); + + fmtout("--opengl-prefix=[OPENGL PREFIX]"); + fmtoutp(TAB, "The prefix under which the OpenGL components of the " + "NVIDIA driver will be installed; the default is: '%s'. Only ", + "under rare circumstances should this option be used. The Linux " + "OpenGL ABI (http://oss.sgi.com/projects/ogl-sample/ABI/) " + "mandates this default value.", + DEFAULT_OPENGL_INSTALLATION_PREFIX); + fmtout(""); + + fmtout("--installer-prefix=[INSTALLER PREFIX]"); + fmtoutp(TAB, "The prefix under which the installer binary will be " + "installed; the default is: '%s'. Note: use the " + "\"--utility-prefix\" option instead.", + DEFAULT_INSTALLER_INSTALLATION_PREFIX); + fmtout(""); + + fmtout("--utility-prefix=[UTILITY PREFIX]"); + fmtoutp(TAB, "The prefix under which the various NVIDIA utilities " + "(nvidia-installer, nvidia-settings, nvidia-bug-report.sh) will " + "be installed; the default is: '%s'.", + DEFAULT_UTILITY_INSTALLATION_PREFIX); + fmtout(""); + + fmtout("--kernel-include-path=[KERNEL INCLUDE PATH]"); + fmtoutp(TAB, "The directory containing the kernel include files that " + "should be used when compiling the NVIDIA kernel module. " + "This option is deprecated; please use '--kernel-source-path' " + "instead."); + fmtout(""); + + fmtout("--kernel-source-path=[KERNEL SOURCE PATH]"); + fmtoutp(TAB, "The directory containing the kernel source files that " + "should be used when compiling the NVIDIA kernel module. " + "When not specified, the installer will use " + "'/lib/modules/`uname -r`/build', if that " + "directory exists. Otherwise, it will use " + "'/usr/src/linux'."); + fmtout(""); + + fmtout("--kernel-install-path=[KERNEL INSTALL PATH]"); + fmtoutp(TAB, "The directory in which the NVIDIA kernel module should be " + "installed. The default value is either '/lib/modules/`uname " + "-r`/kernel/drivers/video' (if '/lib/modules/`uname -r`/kernel' " + "exists) or '/lib/modules/`uname -r`/video'."); + fmtout(""); + + fmtout("--proc-mount-point=[PROC FILESYSTEM MOUNT POINT]"); + fmtoutp(TAB, "The mount point for the proc file system; if not " + "specified, then this value defaults to '%s' (which is normally " + "correct). The mount point of the proc filesystem is needed " + "because the contents of '<proc filesystem>/version' is used when " + "identifying if a precompiled kernel interface is available for " + "the currently running kernel. This option should only be needed " + "in very rare circumstances.", DEFAULT_PROC_MOUNT_POINT); + fmtout(""); + + fmtout("--log-file-name=[LOG FILE NAME]"); + fmtoutp(TAB, "File name of the installation log file (the default is: " + "'%s').", DEFAULT_LOG_FILE_NAME); + fmtout(""); + + fmtout("--tmpdir=[TMPDIR]"); + fmtoutp(TAB, "Use the specified directory as a temporary directory when " + "downloading files from the NVIDIA ftp site; " + "if not given, then the following list will be searched, and " + "the first one that exists will be used: $TMPDIR, /tmp, ., " + "$HOME."); + fmtout(""); + + fmtout("-m, --ftp-mirror=[FTP MIRROR]"); + fmtoutp(TAB, "Use the specified ftp mirror rather than the default '%s' " + "when downloading driver updates.", DEFAULT_FTP_SITE); + fmtout(""); + + fmtout("-l, --latest"); + fmtoutp(TAB, "Connect to the NVIDIA ftp server %s (or use the ftp mirror " + "specified with the '--ftp-mirror' option) and query the most " + "recent %s-%s driver version number.", DEFAULT_FTP_SITE, + INSTALLER_OS, INSTALLER_ARCH); + fmtout(""); + + fmtout("-f, --force-update"); + fmtoutp(TAB, "Forces an update to proceed, even if the installer " + "thinks the latest driver is already installed; this option " + "implies '--update'."); + fmtout(""); + + fmtout("--ui=[USER INTERFACE]"); + fmtoutp(TAB, "Specify what user interface to use, if available. " + "Valid values are 'ncurses' (the default) or 'none'. " + "If the ncurses interface fails to initialize, or 'none' " + "is specified, then a simple printf/scanf interface will " + "be used."); + fmtout(""); + + fmtout("-c, --no-ncurses-color"); + fmtoutp(TAB, "Disable use of color in the ncurses user interface."); + fmtout(""); + + fmtout("--opengl-headers"); + fmtoutp(TAB, "Normally, installation does not install NVIDIA's OpenGL " + "header files. This option enables installation of the NVIDIA " + "OpenGL header files."); + fmtout(""); + + fmtout("--force-tls=[TLS TYPE]"); + fmtoutp(TAB, "NVIDIA's OpenGL libraries are compiled with one of two " + "different thread local storage (TLS) mechanisms: 'classic tls' " + "which is used on systems with glibc 2.2 or older, and 'new tls' " + "which is used on systems with tls-enabled glibc 2.3 or newer. " + "The nvidia-installer will select the OpenGL " + "libraries appropriate for your system; however, you may use " + "this option to force the installer to install one library " + "type or another. Valid values for [TLS TYPE] are 'new' and " + "'classic'."); + fmtout(""); + + fmtout("-k, --kernel-name=[KERNELNAME]"); + fmtoutp(TAB, "Build and install the NVIDIA kernel module for the " + "non-running kernel specified by [KERNELNAME] ([KERNELNAME] " + "should be the output of `uname -r` when the target kernel is " + "actually running). This option implies " + "'--no-precompiled-interface'. If the options " + "'--kernel-install-path' and '--kernel-source-path' are not " + "given, then they will be inferred from [KERNELNAME]; eg: " + "'/lib/modules/[KERNELNAME]/kernel/drivers/video/' and " + "'/lib/modules/[KERNELNAME]/build/', respectively."); + fmtout(""); + + fmtout("-n, --no-precompiled-interface"); + fmtoutp(TAB, "Disable use of precompiled kernel interfaces."); + fmtout(""); + + fmtout("--no-runlevel-check"); + fmtoutp(TAB, "Normally, the installer checks the current runlevel and " + "warns users if they are in runlevel 1: in runlevel 1, some " + "services that are normally active are disabled (such as devfs), " + "making it difficult for the installer to properly setup the " + "kernel module configuration files. This option disables the " + "runlevel check."); + fmtout(""); + + fmtout("--no-abi-note"); + fmtoutp(TAB, "The NVIDIA OpenGL libraries contain an OS ABI note tag, " + "which identifies the minimum kernel version needed to use the " + "library. This option causes the installer to remove this note " + "from the OpenGL libraries during installation."); + fmtout(""); + + fmtout("--no-rpms"); + fmtoutp(TAB, "Normally, the installer will check for several rpms that " + "conflict with the driver (specifically: NVIDIA_GLX and " + "NVIDIA_kernel), and remove them if present. This option " + "disables this check."); + fmtout(""); + + fmtout("-b, --no-backup"); + fmtoutp(TAB, "During driver installation, conflicting files are backed " + "up, so that they can be restored when the driver is " + "uninstalled. This option causes the installer to simply delete " + "conflicting files, rather than back them up."); + fmtout(""); + + fmtout("--no-network"); + fmtoutp(TAB, "This option instructs the installer to not attempt to " + "connect to the NVIDIA ftp site (for updated precompiled kernel " + "interfaces, for example)."); + fmtout(""); + + fmtout("-K, --kernel-module-only"); + fmtoutp(TAB, "Install a kernel module only, and don't uninstall the " + "existing driver. This is intended to be used to install kernel " + "modules for additional kernels (in cases where you might boot " + "between several different kernels). To use this option, you " + "must already have a driver installed, and the version of the " + "installed driver must match the version of this kernel " + "module."); + fmtout(""); + + fmtout("--precompiled-kernel-interfaces-path"); + fmtoutp(TAB, "Before searching for a precompiled kernel interface in the " + ".run file, search in the specified directory."); + fmtout(""); + +} /* print_advanced_options_args_only() */ + + +/* + * parse_commandline() - malloc an Options structure, initialize it, + * and fill in any pertinent data from the commandline arguments; it + * is intended that this function do only minimal sanity checking -- + * just enough error trapping to ensure correct syntax of the + * commandline options. Validation of the actual data specified + * through the options is left for the functions that use this data. + * + * XXX Would it be better to do more validation now? + * + * XXX this implementation uses getopt_long(), which isn't portable to + * non-glibc based systems... + */ + +Options *parse_commandline(int argc, char *argv[]) +{ + Options *op; + int c, option_index = 0; + +#define XFREE86_PREFIX_OPTION 1 +#define OPENGL_PREFIX_OPTION 2 +#define KERNEL_INCLUDE_PATH_OPTION 3 +#define KERNEL_INSTALL_PATH_OPTION 4 +#define UNINSTALL_OPTION 5 +#define PROC_MOUNT_POINT_OPTION 6 +#define USER_INTERFACE_OPTION 7 +#define LOG_FILE_NAME_OPTION 8 +#define HELP_ARGS_ONLY_OPTION 9 +#define TMPDIR_OPTION 10 +#define OPENGL_HEADERS_OPTION 11 +#define INSTALLER_PREFIX_OPTION 12 +#define FORCE_TLS_OPTION 13 +#define SANITY_OPTION 14 +#define ADVANCED_OPTIONS_ARGS_ONLY_OPTION 15 +#define UTILITY_PREFIX_OPTION 16 +#define ADD_THIS_KERNEL_OPTION 17 +#define RPM_FILE_LIST_OPTION 18 +#define NO_RUNLEVEL_CHECK_OPTION 19 +#define NO_NETWORK_OPTION 20 +#define PRECOMPILED_KERNEL_INTERFACES_PATH 21 +#define NO_ABI_NOTE_OPTION 22 +#define KERNEL_SOURCE_PATH_OPTION 23 +#define NO_RPMS_OPTION 24 +#define X_PREFIX_OPTION 25 + + + static struct option long_options[] = { + { "accept-license", 0, NULL, 'a' }, + { "update", 0, NULL, 'u' }, + { "force-update", 0, NULL, 'f' }, + { "expert", 0, NULL, 'e' }, + { "version", 0, NULL, 'v' }, + { "debug", 0, NULL, 'd' }, + { "driver-info", 0, NULL, 'i' }, + { "no-precompiled-interface", 0, NULL, 'n' }, + { "no-ncurses-color", 0, NULL, 'c' }, + { "latest", 0, NULL, 'l' }, + { "ftp-mirror", 1, NULL, 'm' }, + { "no-questions", 0, NULL, 'q' }, + { "kernel-name", 1, NULL, 'k' }, + { "silent", 0, NULL, 's' }, + { "help", 0, NULL, 'h' }, + { "advanced-options", 0, NULL, 'A' }, + { "no-backup", 0, NULL, 'b' }, + { "kernel-module-only", 0, NULL, 'K' }, + { "xfree86-prefix", 1, NULL, XFREE86_PREFIX_OPTION }, + { "x-prefix", 1, NULL, X_PREFIX_OPTION }, + { "opengl-prefix", 1, NULL, OPENGL_PREFIX_OPTION }, + { "installer-prefix", 1, NULL, INSTALLER_PREFIX_OPTION }, + { "utility-prefix", 1, NULL, UTILITY_PREFIX_OPTION }, + { "kernel-include-path", 1, NULL, KERNEL_INCLUDE_PATH_OPTION }, + { "kernel-source-path", 1, NULL, KERNEL_SOURCE_PATH_OPTION }, + { "kernel-install-path", 1, NULL, KERNEL_INSTALL_PATH_OPTION }, + { "uninstall", 0, NULL, UNINSTALL_OPTION }, + { "proc-mount-point", 1, NULL, PROC_MOUNT_POINT_OPTION }, + { "ui", 1, NULL, USER_INTERFACE_OPTION }, + { "log-file-name", 1, NULL, LOG_FILE_NAME_OPTION }, + { "help-args-only", 0, NULL, HELP_ARGS_ONLY_OPTION }, + { "tmpdir", 1, NULL, TMPDIR_OPTION }, + { "opengl-headers", 0, NULL, OPENGL_HEADERS_OPTION }, + { "force-tls", 1, NULL, FORCE_TLS_OPTION }, + { "sanity", 0, NULL, SANITY_OPTION }, + { "add-this-kernel", 0, NULL, ADD_THIS_KERNEL_OPTION }, + { "rpm-file-list", 1, NULL, RPM_FILE_LIST_OPTION }, + { "no-runlevel-check", 0, NULL, NO_RUNLEVEL_CHECK_OPTION }, + { "no-network", 0, NULL, NO_NETWORK_OPTION }, + { "no-abi-note", 0, NULL, NO_ABI_NOTE_OPTION }, + { "no-rpms", 0, NULL, NO_RPMS_OPTION }, + { "precompiled-kernel-interfaces-path", 1, NULL, + PRECOMPILED_KERNEL_INTERFACES_PATH }, + { "advanced-options-args-only", 0, NULL, + ADVANCED_OPTIONS_ARGS_ONLY_OPTION }, + { 0, 0, NULL, 0 } + }; + + op = (Options *) nvalloc(sizeof(Options)); + + /* statically initialized strings */ + + op->xfree86_prefix = DEFAULT_XFREE86_INSTALLATION_PREFIX; + op->opengl_prefix = DEFAULT_OPENGL_INSTALLATION_PREFIX; + op->installer_prefix = NULL; + op->utility_prefix = DEFAULT_UTILITY_INSTALLATION_PREFIX; + op->proc_mount_point = DEFAULT_PROC_MOUNT_POINT; + op->log_file_name = DEFAULT_LOG_FILE_NAME; + op->ftp_site = DEFAULT_FTP_SITE; + op->tmpdir = get_tmpdir(op); + op->no_runlevel_check = FALSE; + op->no_backup = FALSE; + op->no_network = FALSE; + op->kernel_module_only = FALSE; + op->no_abi_note = FALSE; + + op->logging = TRUE; /* log by default */ + + while (1) { + + c = getopt_long(argc, argv, "afg:evdinclm:qk:shAbK", + long_options, &option_index); + if (c == -1) + break; + + switch (c) { + + case 'a': op->accept_license = TRUE; break; + case 'u': op->update = TRUE; break; + case 'e': op->expert = TRUE; break; + case 'v': print_version(); exit(0); break; + case 'd': op->debug = TRUE; break; + case 'i': + op->driver_info = TRUE; + op->ui_str = "none"; + break; + + case 'n': op->no_precompiled_interface = TRUE; break; + case 'c': op->no_ncurses_color = TRUE; break; + case 'l': op->latest = TRUE; break; + case 'm': op->ftp_site = optarg; break; + case 'f': op->update = op->force_update = TRUE; break; + case 'h': print_help(); exit(0); break; + case 'A': print_advanced_options(); exit(0); break; + case 'q': op->no_questions = TRUE; break; + case 'b': op->no_backup = TRUE; break; + case 'K': op->kernel_module_only = TRUE; break; + case 's': + op->silent = op->no_questions = op->accept_license = TRUE; + op->ui_str = "none"; + break; + + case 'k': + op->kernel_name = optarg; + op->no_precompiled_interface = TRUE; + break; + + case XFREE86_PREFIX_OPTION: + case X_PREFIX_OPTION: + op->xfree86_prefix = optarg; break; + case OPENGL_PREFIX_OPTION: + op->opengl_prefix = optarg; break; + case INSTALLER_PREFIX_OPTION: + op->installer_prefix = optarg; break; + case UTILITY_PREFIX_OPTION: + op->utility_prefix = optarg; break; + case KERNEL_SOURCE_PATH_OPTION: + op->kernel_source_path = optarg; break; + case KERNEL_INCLUDE_PATH_OPTION: + op->kernel_include_path = optarg; break; + case KERNEL_INSTALL_PATH_OPTION: + op->kernel_module_installation_path = optarg; break; + case UNINSTALL_OPTION: + op->uninstall = TRUE; break; + case PROC_MOUNT_POINT_OPTION: + op->proc_mount_point = optarg; break; + case USER_INTERFACE_OPTION: + op->ui_str = optarg; break; + case LOG_FILE_NAME_OPTION: + op->log_file_name = optarg; break; + case HELP_ARGS_ONLY_OPTION: + print_help_args_only(TRUE); exit(0); break; + case TMPDIR_OPTION: + op->tmpdir = optarg; break; + case OPENGL_HEADERS_OPTION: + op->opengl_headers = TRUE; break; + case FORCE_TLS_OPTION: + if (strcasecmp(optarg, "new") == 0) + op->which_tls = FORCE_NEW_TLS; + else if (strcasecmp(optarg, "classic") == 0) + op->which_tls = FORCE_CLASSIC_TLS; + else { + fmterr(""); + fmterr("Invalid parameter for '--force-tls'; please " + "run `%s --help` for usage information.", argv[0]); + fmterr(""); + exit(1); + } + break; + case SANITY_OPTION: + op->sanity = TRUE; + break; + case ADD_THIS_KERNEL_OPTION: + op->add_this_kernel = TRUE; + break; + case ADVANCED_OPTIONS_ARGS_ONLY_OPTION: + print_advanced_options_args_only(TRUE); exit(0); + break; + case RPM_FILE_LIST_OPTION: + op->rpm_file_list = optarg; + break; + case NO_RUNLEVEL_CHECK_OPTION: + op->no_runlevel_check = TRUE; + break; + case NO_NETWORK_OPTION: + op->no_network = TRUE; + break; + case PRECOMPILED_KERNEL_INTERFACES_PATH: + op->precompiled_kernel_interfaces_path = optarg; + break; + case NO_ABI_NOTE_OPTION: + op->no_abi_note = TRUE; + break; + case NO_RPMS_OPTION: + op->no_rpms = TRUE; + break; + + default: + fmterr(""); + fmterr("Invalid commandline, please run `%s --help` " + "for usage information.", argv[0]); + fmterr(""); + exit(1); + } + + op->update_arguments = append_update_arguments(op->update_arguments, + c, optarg, + long_options); + } + + if (optind < argc) { + fmterr(""); + fmterr("Unrecognized arguments:"); + while (optind < argc) + fmterrp(" ", argv[optind++]); + fmterr("Invalid commandline, please run `%s --help` for " + "usage information.", argv[0]); + fmterr(""); + exit(1); + } + + op->distro = get_distribution(op); + + /* + * if the installer prefix was not specified, default it to the + * utility prefix; this is done so that the installer prefix is + * preferred, but if not specified, we default to what was + * specified for the utility prefix. + */ + + if (!op->installer_prefix) { + op->installer_prefix = op->utility_prefix; + } + + return (op); + +} /* parse_commandline() */ + + + +/* + * main program entry point + */ + +int main(int argc, char *argv[]) +{ + Options *op; + int ret = FALSE; + + /* parse the commandline options */ + + op = parse_commandline(argc, argv); + + /* init the log file */ + + log_init(op); + + /* chdir() to the directory containing the binary */ + + if (!adjust_cwd(op, argv[0])) return 1; + + /* initialize the user interface */ + + if (!ui_init(op)) return 1; + + /* check that we're running as root */ + + if (!check_euid(op)) goto done; + + /* check that we're in a safe runlevel */ + + if (!check_runlevel(op)) goto done; + + /* + * find the system utilities we'll need + * + * XXX we won't always need all of these... should only look for + * the ones we need. + */ + + if (!find_system_utils(op)) goto done; + + /* get the latest available driver version */ + + if (op->latest) { + ret = report_latest_driver_version(op); + } + + /* get driver information */ + + else if (op->driver_info) { + ret = report_driver_information(op); + } + + /* perform sanity tests */ + + else if (op->sanity) { + ret = sanity(op); + } + + /* uninstall */ + + else if (op->uninstall) { + ret = uninstall_existing_driver(op, TRUE); + } + + /* update */ + + else if (op->update) { + ret = update(op); + } + + /* add this kernel */ + + else if (op->add_this_kernel) { + ret = add_this_kernel(op); + } + + /* install from the cwd */ + + else { + ret = install_from_cwd(op); + } + + done: + + ui_close(op); + + return (ret ? 0 : 1); + +} /* main() */ |