5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
b46ec01af51b4e66dbdba8ceb0a8e5ed36241df9ok * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
bd93c05dbd9b8f1e8d2edf48c777bc881f927608Alexander Eremin * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* All Rights Reserved */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdio.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/types.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <sys/stat.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <archives.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <errno.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <fcntl.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <limits.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <string.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglocale.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include "pkglibmsgs.h"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Defines for cpio/compression checks.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define BIT_MASK 0x1f
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define BLOCK_MASK 0x80
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MASK_CK(x, y) (((x) & (y)) == (y))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ISCOMPCPIO ((unsigned char) cm.c_mag[0] == m_h[0] && \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (unsigned char) cm.c_mag[1] == m_h[1] && \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (MASK_CK((unsigned char) cm.c_mag[2], BLOCK_MASK) || \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland MASK_CK((unsigned char) cm.c_mag[2], BIT_MASK)))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define ISCPIO (cm.b_mag != CMN_BIN && \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(cm.c_mag, CMS_ASC) == 0) && \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(cm.c_mag, CMS_CHR) == 0) && \
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(cm.c_mag, CMS_CRC) == 0))
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* location of distributed file system types database */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define REMOTE_FS_DBFILE "/etc/dfs/fstypes"
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* character array used to hold dfs types database contents */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic long numRemoteFstypes = -1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic char **remoteFstypes = (char **)NULL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/* forward declarations */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void _InitRemoteFstypes(void);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint isFdRemote(int a_fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint isPathRemote(char *a_path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint isFstypeRemote(char *a_fstype);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint isdir(char *path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint isfile(char *dir, char *file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint iscpio(char *path, int *iscomp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: isdir
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if specified path exists and is a directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: path - pointer to string representing the path to verify
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * returns: 0 - directory exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - directory does not exist or is not a directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: errno is set appropriately
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandisdir(char *path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if path does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(path, &statbuf) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if path is not a directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = ENOTDIR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: isfile
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if specified path exists and is a directory
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: dir - pointer to string representing the directory where
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the file is located
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * == NULL - use "file" argument only
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file - pointer to string representing the file to verify
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: 0 - success - file exists
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - failure - file does not exist OR is not a file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * NOTE: errno is set appropriately
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandisfile(char *dir, char *file)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char path[PATH_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* construct full path if directory specified */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (dir) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(path, sizeof (path), "%s/%s", dir, file);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland file = path;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if path does not exist */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (stat(file, &statbuf) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if path is a directory */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((statbuf.st_mode & S_IFMT) == S_IFDIR) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = EISDIR;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return error if path is not a file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((statbuf.st_mode & S_IFMT) != S_IFREG) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland errno = EINVAL;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandiscpio(char *path, int *iscomp)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Compressed File Header.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland unsigned char m_h[] = { "\037\235" }; /* 1F 9D */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static union {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland short int b_mag;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char c_mag[CMS_LEN];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } cm;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statb;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int fd;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *iscomp = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fd = open(path, O_RDONLY, 0)) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (errno != ENOENT) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland perror("");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, pkg_gt(ERR_ISCPIO_OPEN), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fstat(fd, &statb) == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland perror("");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr, pkg_gt(ERR_ISCPIO_FSTAT), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (S_ISREG(statb.st_mode)) { /* Must be a file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (read(fd, cm.c_mag, sizeof (cm.c_mag)) !=
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland sizeof (cm.c_mag)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland perror("");
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_ISCPIO_READ), path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Try to determine if the file is a compressed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file, if that fails, try to determine if it
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * is a cpio archive, if that fails, then we
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fail!
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (ISCOMPCPIO) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *iscomp = 1;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (ISCPIO) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fprintf(stderr,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland pkg_gt(ERR_ISCPIO_NOCPIO),
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland path);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) close(fd);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: isPathRemote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if a path object is local or remote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_path - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to string representing the path to check
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - the path is remote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - the path is local to this system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -1 - cannot determine if path is remote or local
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandisPathRemote(char *a_path)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = lstat(a_path, &statbuf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (isFstypeRemote(statbuf.st_fstype));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: isFdRemote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if an open file is local or remote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_fd - [RO, *RO] - (int)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Integer representing open file to check
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - the path is remote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - the path is local to this system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * -1 - cannot determine if path is remote or local
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandisFdRemote(int a_fd)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int r;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland struct stat statbuf;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland r = fstat(a_fd, &statbuf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (r < 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (isFstypeRemote(statbuf.st_fstype));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: isFstypeRemote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: determine if a file system type is remote (distributed)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: a_fstype - [RO, *RO] - (char *)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Pointer to string representing the file system type
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * to check
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: int
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 1 - the file system type is remote
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * 0 - the file system type is local to this system
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandint
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah WaterlandisFstypeRemote(char *a_fstype)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* initialize the list if it is not yet initialized */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland _InitRemoteFstypes();
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* scan the list looking for the specified type */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < numRemoteFstypes; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(remoteFstypes[i], a_fstype) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* type not found in remote file system type list - is not remote */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (0);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: _InitRemoteFstypes
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: initialize table of remote file system type names
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: none
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: none
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Side Effects:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - The global array "(char **)remoteFstypes" is set to the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * address of an array of string pointers, each of which represents
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * a single remote file system type
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - The global variable "(long) numRemoteFstypes" is set to the total
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * number of remote file system type strings (names) that are
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * contained in the "remoteFstypes" global array.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * - numRemoteFstypes is initialized to "-1" before any attempt has been
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * made to read the remote file system type name database.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic void
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland_InitRemoteFstypes(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland FILE *fp;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char line_buf[LINE_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* return if already initialized */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (numRemoteFstypes > 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* if list is uninitialized, start with zero */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (numRemoteFstypes == -1) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland numRemoteFstypes = 0;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* open the remote file system type database file */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((fp = fopen(REMOTE_FS_DBFILE, "r")) == NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* no remote type database: use predefined remote types */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland remoteFstypes = (char **)realloc(remoteFstypes,
bd93c05dbd9b8f1e8d2edf48c777bc881f927608Alexander Eremin sizeof (char *) * (numRemoteFstypes+2));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland remoteFstypes[numRemoteFstypes++] = "nfs"; /* +1 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland remoteFstypes[numRemoteFstypes++] = "autofs"; /* +2 */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Read the remote file system type database; from fstypes(4):
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fstypes resides in directory /etc/dfs and lists distributed file
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * system utilities packages installed on the system. For each installed
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * distributed file system type, there is a line that begins with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file system type name (for example, ``nfs''), followed by white space
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and descriptive text.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Lines will look at lot like this:
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * nfs NFS Utilities
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * autofs AUTOFS Utilities
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland while (fgets(line_buf, sizeof (line_buf), fp) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char buf[LINE_MAX];
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland static char format[128] = {'\0'};
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (format[0] == '\0') {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* create bounded format: %ns */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) snprintf(format, sizeof (format),
bd93c05dbd9b8f1e8d2edf48c777bc881f927608Alexander Eremin "%%%ds", sizeof (buf)-1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sscanf(line_buf, format, buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland remoteFstypes = realloc(remoteFstypes,
bd93c05dbd9b8f1e8d2edf48c777bc881f927608Alexander Eremin sizeof (char *) * (numRemoteFstypes+1));
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland remoteFstypes[numRemoteFstypes++] = strdup(buf);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland /* close database file and return */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) fclose(fp);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}