main.c revision 62224350e5355e6834f7deb9d8a7d062a50cb7c2
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * CDDL HEADER START
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * The contents of this file are subject to the terms of the
080575042aba2197b425ebfd52061dea061a9aa1xy * Common Development and Distribution License (the "License").
080575042aba2197b425ebfd52061dea061a9aa1xy * You may not use this file except in compliance with the License.
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
080575042aba2197b425ebfd52061dea061a9aa1xy * See the License for the specific language governing permissions
080575042aba2197b425ebfd52061dea061a9aa1xy * and limitations under the License.
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * When distributing Covered Code, include this CDDL HEADER in each
080575042aba2197b425ebfd52061dea061a9aa1xy * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
080575042aba2197b425ebfd52061dea061a9aa1xy * If applicable, add the following below this CDDL HEADER, with the
080575042aba2197b425ebfd52061dea061a9aa1xy * fields enclosed by brackets "[]" replaced with your own identifying
080575042aba2197b425ebfd52061dea061a9aa1xy * information: Portions Copyright [yyyy] [name of copyright owner]
080575042aba2197b425ebfd52061dea061a9aa1xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * CDDL HEADER END
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy
d5c3073dbbd835e1e9b7dca0c6c770cf3cc20afachenlu chen - Sun Microsystems - Beijing China/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
080575042aba2197b425ebfd52061dea061a9aa1xy * Use is subject to license terms.
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/* unix system includes */
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy#include <stdio.h>
25f2d433de915875c8393f0b0dc14aa155997ad0xy#include <stdarg.h>
080575042aba2197b425ebfd52061dea061a9aa1xy#include <stdlib.h>
080575042aba2197b425ebfd52061dea061a9aa1xy#include <string.h>
080575042aba2197b425ebfd52061dea061a9aa1xy#include <sys/types.h>
080575042aba2197b425ebfd52061dea061a9aa1xy#include <unistd.h>
080575042aba2197b425ebfd52061dea061a9aa1xy#include <locale.h>
080575042aba2197b425ebfd52061dea061a9aa1xy#include <sys/param.h>
25f2d433de915875c8393f0b0dc14aa155997ad0xy#include <openssl/bio.h>
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy#include <pkglib.h>
25f2d433de915875c8393f0b0dc14aa155997ad0xy#include <pkgerr.h>
25f2d433de915875c8393f0b0dc14aa155997ad0xy#include <keystore.h>
25f2d433de915875c8393f0b0dc14aa155997ad0xy#include "pkgadm.h"
25f2d433de915875c8393f0b0dc14aa155997ad0xy#include "pkgadm_msgs.h"
25f2d433de915875c8393f0b0dc14aa155997ad0xy#include "libadm.h"
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/* initial error message buffer size */
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy#define ERR_BUFSIZE 2048
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy/* Local Function Prototypes */
25f2d433de915875c8393f0b0dc14aa155997ad0xy
080575042aba2197b425ebfd52061dea061a9aa1xystatic void print_version();
25f2d433de915875c8393f0b0dc14aa155997ad0xyint get_dbstatus(int argc, char **argv);
25f2d433de915875c8393f0b0dc14aa155997ad0xyint sync_server(int argc, char **argv);
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy/* holds subcommands and their definitions */
080575042aba2197b425ebfd52061dea061a9aa1xystruct cmd {
080575042aba2197b425ebfd52061dea061a9aa1xy char *c_name;
080575042aba2197b425ebfd52061dea061a9aa1xy int (*c_func)(int, char **);
080575042aba2197b425ebfd52061dea061a9aa1xy};
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xystruct cmd cmds[] = {
25f2d433de915875c8393f0b0dc14aa155997ad0xy { "dbstatus", get_dbstatus},
080575042aba2197b425ebfd52061dea061a9aa1xy { "lock", admin_lock},
25f2d433de915875c8393f0b0dc14aa155997ad0xy { "sync", sync_server},
080575042aba2197b425ebfd52061dea061a9aa1xy /* last one must be all NULLs */
080575042aba2197b425ebfd52061dea061a9aa1xy { NULL, NULL }
080575042aba2197b425ebfd52061dea061a9aa1xy};
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xystruct cmd cert_cmds[] = {
25f2d433de915875c8393f0b0dc14aa155997ad0xy { "addcert", addcert},
25f2d433de915875c8393f0b0dc14aa155997ad0xy { "listcert", listcert},
080575042aba2197b425ebfd52061dea061a9aa1xy { "removecert", removecert},
080575042aba2197b425ebfd52061dea061a9aa1xy /* last one must be all NULLs */
080575042aba2197b425ebfd52061dea061a9aa1xy { NULL, NULL }
080575042aba2197b425ebfd52061dea061a9aa1xy};
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * Function: main
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
080575042aba2197b425ebfd52061dea061a9aa1xy * Return: 0 - subprocessing successful
080575042aba2197b425ebfd52061dea061a9aa1xy * scripts and reboot
080575042aba2197b425ebfd52061dea061a9aa1xy * [other] - subprocessing-specific failure
080575042aba2197b425ebfd52061dea061a9aa1xy */
080575042aba2197b425ebfd52061dea061a9aa1xyint
080575042aba2197b425ebfd52061dea061a9aa1xymain(int argc, char **argv)
080575042aba2197b425ebfd52061dea061a9aa1xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy char cur_cmd;
25f2d433de915875c8393f0b0dc14aa155997ad0xy int newargc;
080575042aba2197b425ebfd52061dea061a9aa1xy char **newargv;
080575042aba2197b425ebfd52061dea061a9aa1xy int i;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /* Should be defined by cc -D */
25f2d433de915875c8393f0b0dc14aa155997ad0xy#if !defined(TEXT_DOMAIN)
080575042aba2197b425ebfd52061dea061a9aa1xy#define TEXT_DOMAIN "SYS_TEST"
080575042aba2197b425ebfd52061dea061a9aa1xy#endif
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /* set the default text domain for messaging */
080575042aba2197b425ebfd52061dea061a9aa1xy (void) setlocale(LC_ALL, "");
25f2d433de915875c8393f0b0dc14aa155997ad0xy (void) textdomain(TEXT_DOMAIN);
592a4d85662412bade15f3d9e9e0cbcf8514348ccc
080575042aba2197b425ebfd52061dea061a9aa1xy if (getenv("PKGADM_VERBOSE")) {
080575042aba2197b425ebfd52061dea061a9aa1xy set_verbose(B_TRUE);
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /* Superficial check of the arguments. */
080575042aba2197b425ebfd52061dea061a9aa1xy if (argc <= 1) {
080575042aba2197b425ebfd52061dea061a9aa1xy log_msg(LOG_MSG_INFO, MSG_USAGE);
080575042aba2197b425ebfd52061dea061a9aa1xy return (1);
47b7744cbea59975a6b583125b7ed1ff2ac45313yy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy /* first, process any arguments that can appear before the subcommand */
25f2d433de915875c8393f0b0dc14aa155997ad0xy while ((i = getopt(argc, argv, "vV?")) != EOF) {
080575042aba2197b425ebfd52061dea061a9aa1xy switch (i) {
25f2d433de915875c8393f0b0dc14aa155997ad0xy case 'v': /* verbose mode enabled */
080575042aba2197b425ebfd52061dea061a9aa1xy set_verbose(B_TRUE);
080575042aba2197b425ebfd52061dea061a9aa1xy break;
25f2d433de915875c8393f0b0dc14aa155997ad0xy case 'V':
080575042aba2197b425ebfd52061dea061a9aa1xy print_version();
080575042aba2197b425ebfd52061dea061a9aa1xy return (0);
25f2d433de915875c8393f0b0dc14aa155997ad0xy case '?':
080575042aba2197b425ebfd52061dea061a9aa1xy log_msg(LOG_MSG_INFO, MSG_USAGE);
080575042aba2197b425ebfd52061dea061a9aa1xy return (0);
25f2d433de915875c8393f0b0dc14aa155997ad0xy }
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* OK, hand it off to the subcommand processors */
080575042aba2197b425ebfd52061dea061a9aa1xy for (cur_cmd = 0; cmds[cur_cmd].c_name != NULL; cur_cmd++) {
080575042aba2197b425ebfd52061dea061a9aa1xy if (ci_streq(argv[optind], cmds[cur_cmd].c_name)) {
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* make subcommand the first option */
080575042aba2197b425ebfd52061dea061a9aa1xy newargc = argc - optind;
080575042aba2197b425ebfd52061dea061a9aa1xy newargv = argv + optind;
47b7744cbea59975a6b583125b7ed1ff2ac45313yy opterr = optind = 1; optopt = 0;
080575042aba2197b425ebfd52061dea061a9aa1xy return (cmds[cur_cmd].c_func(newargc, newargv));
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* initialize security library */
25f2d433de915875c8393f0b0dc14aa155997ad0xy sec_init();
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* OK, hand it off to the subcommand processors */
25f2d433de915875c8393f0b0dc14aa155997ad0xy for (cur_cmd = 0; cert_cmds[cur_cmd].c_name != NULL; cur_cmd++) {
080575042aba2197b425ebfd52061dea061a9aa1xy if (ci_streq(argv[optind], cert_cmds[cur_cmd].c_name)) {
080575042aba2197b425ebfd52061dea061a9aa1xy /* make subcommand the first option */
25f2d433de915875c8393f0b0dc14aa155997ad0xy newargc = argc - optind;
080575042aba2197b425ebfd52061dea061a9aa1xy newargv = argv + optind;
080575042aba2197b425ebfd52061dea061a9aa1xy opterr = optind = 1; optopt = 0;
25f2d433de915875c8393f0b0dc14aa155997ad0xy return (cert_cmds[cur_cmd].c_func(newargc, newargv));
25f2d433de915875c8393f0b0dc14aa155997ad0xy }
25f2d433de915875c8393f0b0dc14aa155997ad0xy }
25f2d433de915875c8393f0b0dc14aa155997ad0xy
080575042aba2197b425ebfd52061dea061a9aa1xy /* bad subcommand */
080575042aba2197b425ebfd52061dea061a9aa1xy log_msg(LOG_MSG_ERR, MSG_BAD_SUB, argv[optind]);
080575042aba2197b425ebfd52061dea061a9aa1xy log_msg(LOG_MSG_INFO, MSG_USAGE);
080575042aba2197b425ebfd52061dea061a9aa1xy return (1);
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * Name: set_verbose
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Description: Turns on verbose output
080575042aba2197b425ebfd52061dea061a9aa1xy * Scope: public
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Arguments: verbose = B_TRUE indicates verbose mode
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Returns: none
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xyvoid
25f2d433de915875c8393f0b0dc14aa155997ad0xyset_verbose(boolean_t setting)
25f2d433de915875c8393f0b0dc14aa155997ad0xy{
080575042aba2197b425ebfd52061dea061a9aa1xy log_set_verbose(setting);
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy/*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Name: get_verbose
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Description: Returns whether or not to output verbose messages
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Scope: public
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Arguments: none
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Returns: B_TRUE - verbose messages should be output
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xyboolean_t
25f2d433de915875c8393f0b0dc14aa155997ad0xyget_verbose()
25f2d433de915875c8393f0b0dc14aa155997ad0xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy return (log_get_verbose());
25f2d433de915875c8393f0b0dc14aa155997ad0xy}
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy/*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Name: log_pkgerr
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Description: Outputs pkgerr messages to logging facility.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Scope: public
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Arguments: type - the severity of the message
25f2d433de915875c8393f0b0dc14aa155997ad0xy * err - error stack to dump to facility
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Returns: none
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xyvoid
25f2d433de915875c8393f0b0dc14aa155997ad0xylog_pkgerr(LogMsgType type, PKG_ERR *err)
25f2d433de915875c8393f0b0dc14aa155997ad0xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy int i;
25f2d433de915875c8393f0b0dc14aa155997ad0xy for (i = 0; i < pkgerr_num(err); i++) {
25f2d433de915875c8393f0b0dc14aa155997ad0xy log_msg(type, "%s", pkgerr_get(err, i));
25f2d433de915875c8393f0b0dc14aa155997ad0xy }
25f2d433de915875c8393f0b0dc14aa155997ad0xy}
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy/*
080575042aba2197b425ebfd52061dea061a9aa1xy * Name: print_Version
080575042aba2197b425ebfd52061dea061a9aa1xy * Desc: Prints Version of packaging tools
080575042aba2197b425ebfd52061dea061a9aa1xy * Arguments: none
080575042aba2197b425ebfd52061dea061a9aa1xy * Returns: none
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xystatic void
25f2d433de915875c8393f0b0dc14aa155997ad0xyprint_version()
25f2d433de915875c8393f0b0dc14aa155997ad0xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* ignore any and all arguments, print version only */
25f2d433de915875c8393f0b0dc14aa155997ad0xy (void) fprintf(stdout, "%s\n", SUNW_PKGVERS);
25f2d433de915875c8393f0b0dc14aa155997ad0xy}
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy/*
4d7379630d53d9992780329b674af8c85935e858xiangtao you - Sun Microsystems - Beijing China * usage
4d7379630d53d9992780329b674af8c85935e858xiangtao you - Sun Microsystems - Beijing China *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Outputs the usage string.
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
47b7744cbea59975a6b583125b7ed1ff2ac45313yy * Return:1
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Side effects: none
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xystatic int
25f2d433de915875c8393f0b0dc14aa155997ad0xyusage()
25f2d433de915875c8393f0b0dc14aa155997ad0xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy log_msg(LOG_MSG_INFO, MSG_USAGE);
25f2d433de915875c8393f0b0dc14aa155997ad0xy return (1);
25f2d433de915875c8393f0b0dc14aa155997ad0xy}
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy/*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * get_dbstatus
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Return 'text' as the db status.
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Use the command line to determine if there is an alternate root.
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Return: 0 on success, nonzero on failure
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Side effects: none
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
25f2d433de915875c8393f0b0dc14aa155997ad0xyint
25f2d433de915875c8393f0b0dc14aa155997ad0xyget_dbstatus(int argc, char **argv)
25f2d433de915875c8393f0b0dc14aa155997ad0xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy /* Either accept 1 argument or 3 arguments where the second is -R */
25f2d433de915875c8393f0b0dc14aa155997ad0xy if (argc != 1 && (argc != 3 || strcmp(argv[1], "-R")))
25f2d433de915875c8393f0b0dc14aa155997ad0xy return (usage());
25f2d433de915875c8393f0b0dc14aa155997ad0xy
47b7744cbea59975a6b583125b7ed1ff2ac45313yy (void) printf("%s\n", PKGADM_DBSTATUS_TEXT);
25f2d433de915875c8393f0b0dc14aa155997ad0xy
080575042aba2197b425ebfd52061dea061a9aa1xy return (0);
25f2d433de915875c8393f0b0dc14aa155997ad0xy}
25f2d433de915875c8393f0b0dc14aa155997ad0xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy/*
25f2d433de915875c8393f0b0dc14aa155997ad0xy * sync
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Use the command line to determine if there is an alternate root.
25f2d433de915875c8393f0b0dc14aa155997ad0xy *
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Return: 0 on success, nonzero on failure
25f2d433de915875c8393f0b0dc14aa155997ad0xy * Flush the pkgserv's log.
25f2d433de915875c8393f0b0dc14aa155997ad0xy */
080575042aba2197b425ebfd52061dea061a9aa1xyint
25f2d433de915875c8393f0b0dc14aa155997ad0xysync_server(int argc, char **argv)
25f2d433de915875c8393f0b0dc14aa155997ad0xy{
25f2d433de915875c8393f0b0dc14aa155997ad0xy int c;
25f2d433de915875c8393f0b0dc14aa155997ad0xy char *root = NULL;
25f2d433de915875c8393f0b0dc14aa155997ad0xy boolean_t quit = B_FALSE;
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy while ((c = getopt(argc, argv, "R:q")) != EOF) {
080575042aba2197b425ebfd52061dea061a9aa1xy switch (c) {
080575042aba2197b425ebfd52061dea061a9aa1xy case 'R':
080575042aba2197b425ebfd52061dea061a9aa1xy root = optarg;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
25f2d433de915875c8393f0b0dc14aa155997ad0xy case 'q':
25f2d433de915875c8393f0b0dc14aa155997ad0xy quit = B_TRUE;
080575042aba2197b425ebfd52061dea061a9aa1xy break;
080575042aba2197b425ebfd52061dea061a9aa1xy default:
080575042aba2197b425ebfd52061dea061a9aa1xy return (usage());
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
25f2d433de915875c8393f0b0dc14aa155997ad0xy if (!pkgsync_needed(root, NULL, quit))
25f2d433de915875c8393f0b0dc14aa155997ad0xy return (0);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy set_PKGpaths(root);
080575042aba2197b425ebfd52061dea061a9aa1xy set_cfdir(NULL);
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy if (pkgWlock(1) == 1) {
080575042aba2197b425ebfd52061dea061a9aa1xy /* Flush the log file */
25f2d433de915875c8393f0b0dc14aa155997ad0xy (void) pkgsync(root, NULL, quit);
25f2d433de915875c8393f0b0dc14aa155997ad0xy (void) relslock();
080575042aba2197b425ebfd52061dea061a9aa1xy return (0);
080575042aba2197b425ebfd52061dea061a9aa1xy }
080575042aba2197b425ebfd52061dea061a9aa1xy
080575042aba2197b425ebfd52061dea061a9aa1xy return (1);
080575042aba2197b425ebfd52061dea061a9aa1xy}
080575042aba2197b425ebfd52061dea061a9aa1xy