f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * CDDL HEADER START
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * The contents of this file are subject to the terms of the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Common Development and Distribution License (the "License").
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * You may not use this file except in compliance with the License.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * or http://www.opensolaris.org/os/licensing.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * See the License for the specific language governing permissions
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * and limitations under the License.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * When distributing Covered Code, include this CDDL HEADER in each
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * If applicable, add the following below this CDDL HEADER, with the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * fields enclosed by brackets "[]" replaced with your own identifying
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * information: Portions Copyright [yyyy] [name of copyright owner]
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * CDDL HEADER END
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Use is subject to license terms.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <errno.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <pwd.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <stdio.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <stdlib.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <string.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <unistd.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <sys/param.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <sys/types.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <sys/wait.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <tsol/label.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <zone.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include <sys/stat.h>
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#include "setupfiles.h"
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define dperror(s) if (flags & DIAG) perror(s)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define dprintf(s, v) if (flags & DBUG) (void) printf(s, v)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica#define dprintf2(s, v1, v2) if (flags & DBUG) (void) printf(s, v1, v2)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int mkdirs(const char *dir, const char *target, int flags);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int copyfile(const char *min_home, const char *home, const char *target,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int flags);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int linkfile(const char *min_home, const char *home, const char *target,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int flags);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * __setupfiles - Process copy and link files directions in min $HOME.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Entry pwd = user's password file entry.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * min_sl = user's minimum SL.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * flags = DBUG, if print debug messages.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * DIAG, if print diagnostics (perrors).
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * IGNE, continue rather than abort on failures.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REPC, if replace existing file.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REPL, if replace existing symbolic link.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * process is running as user at correct label.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Exit None.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Returns 0, if success.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * errno, if failure.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Uses COPY, CP, LINK, MAXPATHLEN.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire * Calls blequal, copyfile, feof, fgets, fopen,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * mkdirs, getzoneid, getzonelabelbyid, linkfile, strcat, strcpy,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * strlen.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * This program assumes the /zone is the autofs mountpoint for
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * cross-zone mounts.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * It also assumes that the user's home directory path is the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * the same in each zone, relative to the zone's root.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * At this point, the cross-zone automounter only supports home
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * directories starting with /home
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaint
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire__setupfiles(const struct passwd *pwd, const m_label_t *min_sl, int flags)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
7b0bedd42192a2f6bcd6fc4b637d23892303a962Ric Aleshire m_label_t *plabel; /* process label */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char home[MAXPATHLEN]; /* real path to current $HOME */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char min_home[MAXPATHLEN]; /* real path to min $HOME */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char cl_file[MAXPATHLEN]; /* real path to .copy/.link_files */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char file[MAXPATHLEN]; /* file to copy/link */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica FILE *clf; /* .copy/.link_file stream */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char zoneroot[MAXPATHLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica zoneid_t zoneid;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica zoneid_t min_zoneid;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica zoneid = getzoneid();
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((plabel = getzonelabelbyid(zoneid)) == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles can't get process label");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (blequal(plabel, min_sl)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* at min SL no files to setup */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* get current home real path */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strlcpy(home, pwd->pw_dir, MAXPATHLEN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* Get zone id from min_sl */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((min_zoneid = getzoneidbylabel(min_sl)) == -1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles can't get zoneid for min sl");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Since the global zone home directories aren't public
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * information, we don't support copy and link files there.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (min_zoneid == GLOBAL_ZONEID)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Get zone root path from zone id
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Could have used getzonenamebyid() but this assumes that /etc/zones
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * directory is available, which is not true in labeled zones
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (zone_getattr(min_zoneid, ZONE_ATTR_ROOT, zoneroot,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica sizeof (zoneroot)) == -1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles can't get zone root path for min sl");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) snprintf(min_home, MAXPATHLEN, "%s%s",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica zoneroot, pwd->pw_dir);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* process copy files */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((strlen(min_home) + strlen(COPY)) > (MAXPATHLEN - 1)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy path %s", min_home);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("%s ", COPY);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("greater than %d\n", MAXPATHLEN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica errno = ENAMETOOLONG;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy path");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcpy(cl_file, min_home);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcat(cl_file, COPY);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((clf = fopen(cl_file, "r")) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while (fgets(file, MAXPATHLEN, clf) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!feof(clf)) /* remove trailing \n */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica file[strlen(file) - 1] = '\0';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("copy file %s requested\n", file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* make any needed subdirectories */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (mkdirs(home, file, flags) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((flags & IGNE) == 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica continue;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* copy the file */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (copyfile(min_home, home, file, flags) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((flags & IGNE) == 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica continue;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } /* while (fgets( ... ) != NULL) */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (errno != ENOENT)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy file open");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles no copyfile %s\n", cl_file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } /* process copy files */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* process link files */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((strlen(min_home) + strlen(LINK)) > (MAXPATHLEN - 1)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles link path %s", min_home);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("%s ", LINK);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("greater than %d\n", MAXPATHLEN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica errno = ENAMETOOLONG;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles link path");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcpy(cl_file, min_home);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcat(cl_file, LINK);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((clf = fopen(cl_file, "r")) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while (fgets(file, MAXPATHLEN, clf) != NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (!feof(clf)) /* remove trailing \n */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica file[strlen(file) - 1] = '\0';
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("link file %s requested\n", file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* make any needed subdirectories */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (mkdirs(home, file, flags) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((flags & IGNE) == 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica continue;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* link the file */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (linkfile(min_home, home, file, flags) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((flags & IGNE) == 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica continue;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } /* while (fgets ... ) != NULL) */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (errno != ENOENT)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles link file open");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles no linkfile %s\n", cl_file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } /* process link files */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica} /* setupfiles() */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * mkdirs - Make any needed subdirectories in target's path.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Entry home = base directory.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * file = file to create with intermediate subdirectories.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * flags = from __setupfiles -- for dprintf and dperror.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Exit Needed subdirectories made.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Returns 0, if success.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * errno, if failure.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Uses MAXPATHLEN.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Calls mkdir, strcat, strcpy, strlen, strtok.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricamkdirs(const char *home, const char *file, int flags)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char path[MAXPATHLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char dir[MAXPATHLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char *tok;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((strlen(home) + strlen(file)) > (MAXPATHLEN - 2)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles mkdirs path %s", home);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("/%s ", file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("greater than %d\n", MAXPATHLEN);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica errno = ENAMETOOLONG;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles mkdirs");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcpy(dir, file);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((tok = strrchr(dir, '/')) == NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles no dirs to make in %s\n", dir);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *tok = '\000'; /* drop last component, it's the target */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcpy(path, home);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica for (tok = dir; tok = strtok(tok, "/"); tok = NULL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcat(path, "/");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) strcat(path, tok);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((mkdir(path, 0777) != 0) && (errno != EEXIST)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles mkdir");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles mkdir path %s\n", path);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles dir %s made or already exists\n", path);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica} /* mkdirs() */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * copyfile - Copy a file from the base home directory to the current.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Entry min_home = from home directory.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * home = current (to) home directory.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * target = file to copy.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * flags = from __setupfiles.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REPC, if replace existing file.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Exit File copied.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Returns 0, if success.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * errno, if failure.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Uses CP, MAXPATHLEN.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Calls access, execlp, exit, lstat, strcat, strcpy, strlen, unlink,
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * vfork, waitpid.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricacopyfile(const char *min_home, const char *home, const char *target, int flags)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char src[MAXPATHLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char dest[MAXPATHLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica struct stat buf;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica pid_t child;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* prepare target */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (snprintf(dest, sizeof (dest), "%s/%s", home, target) >
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica sizeof (dest) - 1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy dest %s", dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("greater than %d\n", sizeof (dest));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica errno = ENAMETOOLONG;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy to home");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (lstat(dest, &buf) == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* target exists */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (flags & REPC) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* unlink and replace */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (unlink(dest) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy unlink");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy unable to unlink %s\n",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* target exists and is not to be replaced */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (errno != ENOENT) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* error on target */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy lstat %s\n", dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* prepare source */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (snprintf(src, sizeof (src), "%s/%s", min_home, target) >
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica sizeof (src) - 1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy path %s", src);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("greater than %d\n", sizeof (src));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica errno = ENAMETOOLONG;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy from home");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (access(src, R_OK) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* can't access source */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy source access");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy unable to access %s\n", src);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* attempt the copy */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles attempting to copy %s\n", src);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("\tto %s\n", dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if ((child = vfork()) != 0) { /* parent, wait for child status */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica int status; /* child status */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica (void) waitpid(child, &status, 0); /* wait for child */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy child returned %x\n", status);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* execute "cp -p min_home home" */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (execlp(CP, CP, "-p", src, dest, 0) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* can't execute cp */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles copy exec");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles copy couldn't exec \"%s -p\"\n",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica CP);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica exit(2);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica} /* copyfile() */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/*
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * linkfile - Make a symlink from the the current directory to the base
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * home directory.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Entry min_home = from home directory.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * home = current (to) home directory.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * target = file to copy.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * flags = from __setupfiles.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REPL, if replace existing symlink.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Exit File symlinked.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Returns 0, if success.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * errno, if failure.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Uses MAXPATHLEN.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica *
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Calls lstat, symlink, strcat, strcpy, strlen, unlink.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic int
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricalinkfile(const char *min_home, const char *home, const char *target, int flags)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica{
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char src[MAXPATHLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica char dest[MAXPATHLEN];
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica struct stat buf;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* prepare target */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (snprintf(dest, sizeof (dest), "%s/%s", home, target) >
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica sizeof (dest) - 1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles link dest %s", dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("greater than %d\n", sizeof (dest));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica errno = ENAMETOOLONG;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles link to home");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (lstat(dest, &buf) == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* target exists */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (flags & REPL) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* unlink and replace */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (unlink(dest) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles link unlink");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles link unable to unlink %s\n",
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* target exists and is not to be replaced */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (errno != ENOENT) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* error on target */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles link");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles link lstat %s\n", dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (snprintf(src, sizeof (src), "%s/%s", min_home, target) >
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica sizeof (src) - 1) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles link path %s", src);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("greater than %d\n", sizeof (src));
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica errno = ENAMETOOLONG;
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles link from home");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* attempt the copy */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles attempting to link %s\n", dest);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("\tto %s\n", src);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (symlink(src, dest) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dperror("setupfiles link symlink");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica dprintf("setupfiles link unable to symlink%s\n", "");
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (errno);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica }
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica} /* linkfile */