xref: /illumos-gate/usr/src/lib/libpkg/common/devtype.c (revision 3970c098)
15c51f124SMoriah Waterland /*
25c51f124SMoriah Waterland  * CDDL HEADER START
35c51f124SMoriah Waterland  *
45c51f124SMoriah Waterland  * The contents of this file are subject to the terms of the
55c51f124SMoriah Waterland  * Common Development and Distribution License (the "License").
65c51f124SMoriah Waterland  * You may not use this file except in compliance with the License.
75c51f124SMoriah Waterland  *
85c51f124SMoriah Waterland  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95c51f124SMoriah Waterland  * or http://www.opensolaris.org/os/licensing.
105c51f124SMoriah Waterland  * See the License for the specific language governing permissions
115c51f124SMoriah Waterland  * and limitations under the License.
125c51f124SMoriah Waterland  *
135c51f124SMoriah Waterland  * When distributing Covered Code, include this CDDL HEADER in each
145c51f124SMoriah Waterland  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155c51f124SMoriah Waterland  * If applicable, add the following below this CDDL HEADER, with the
165c51f124SMoriah Waterland  * fields enclosed by brackets "[]" replaced with your own identifying
175c51f124SMoriah Waterland  * information: Portions Copyright [yyyy] [name of copyright owner]
185c51f124SMoriah Waterland  *
195c51f124SMoriah Waterland  * CDDL HEADER END
205c51f124SMoriah Waterland  */
215c51f124SMoriah Waterland 
225c51f124SMoriah Waterland /*
235c51f124SMoriah Waterland  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
245c51f124SMoriah Waterland  * Use is subject to license terms.
255c51f124SMoriah Waterland  */
265c51f124SMoriah Waterland 
275c51f124SMoriah Waterland /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
285c51f124SMoriah Waterland /* All Rights Reserved */
295c51f124SMoriah Waterland 
305c51f124SMoriah Waterland 
315c51f124SMoriah Waterland 
325c51f124SMoriah Waterland #include <stdio.h>
335c51f124SMoriah Waterland #include <string.h>
345c51f124SMoriah Waterland #include <stdlib.h>
355c51f124SMoriah Waterland #include <unistd.h>
365c51f124SMoriah Waterland #include "pkgdev.h"
375c51f124SMoriah Waterland #include "pkglib.h"
385c51f124SMoriah Waterland 
39*3970c098SToomas Soome extern char	*devattr(char *device, char *attribute);	/* libadm.a */
405c51f124SMoriah Waterland 
415c51f124SMoriah Waterland int
devtype(char * alias,struct pkgdev * devp)425c51f124SMoriah Waterland devtype(char *alias, struct pkgdev *devp)
435c51f124SMoriah Waterland {
445c51f124SMoriah Waterland 	char *name;
455c51f124SMoriah Waterland 	devp->mntflg = 0;
465c51f124SMoriah Waterland 	devp->name = alias;
475c51f124SMoriah Waterland 	devp->dirname = devp->pathname = devp->mount = NULL;
485c51f124SMoriah Waterland 	devp->fstyp = devp->cdevice = devp->bdevice = devp->norewind = NULL;
495c51f124SMoriah Waterland 	devp->rdonly = 0;
505c51f124SMoriah Waterland 	devp->capacity = 0;
515c51f124SMoriah Waterland 
525c51f124SMoriah Waterland 	/* see if alias represents an existing file */
535c51f124SMoriah Waterland 	if (alias[0] == '/') {
545c51f124SMoriah Waterland 		if (!isdir(alias)) {
555c51f124SMoriah Waterland 			devp->dirname = devp->name;
565c51f124SMoriah Waterland 			return (0);
575c51f124SMoriah Waterland 		}
585c51f124SMoriah Waterland 	}
595c51f124SMoriah Waterland 
605c51f124SMoriah Waterland 	/* see if alias represents a mountable device (e.g., a floppy) */
615c51f124SMoriah Waterland 	if ((devp->mount = devattr(alias, "mountpt")) != NULL &&
62*3970c098SToomas Soome 	    devp->mount[0] != '\0') {
635c51f124SMoriah Waterland 		devp->bdevice = devattr(alias, "bdevice");
645c51f124SMoriah Waterland 		if (!devp->bdevice || !devp->bdevice[0]) {
655c51f124SMoriah Waterland 			if (devp->bdevice) {
665c51f124SMoriah Waterland 				free(devp->bdevice);
675c51f124SMoriah Waterland 				devp->bdevice = NULL;
685c51f124SMoriah Waterland 			}
695c51f124SMoriah Waterland 			return (-1);
705c51f124SMoriah Waterland 		}
715c51f124SMoriah Waterland 		devp->dirname = devp->mount;
725c51f124SMoriah Waterland 	} else if (devp->mount) {
735c51f124SMoriah Waterland 		free(devp->mount);
745c51f124SMoriah Waterland 		devp->mount = NULL;
755c51f124SMoriah Waterland 	}
765c51f124SMoriah Waterland 
775c51f124SMoriah Waterland 	devp->cdevice = devattr(alias, "cdevice");
785c51f124SMoriah Waterland 	if (devp->cdevice && devp->cdevice[0])  {
795c51f124SMoriah Waterland 		/* check for capacity */
805c51f124SMoriah Waterland 		if (name = devattr(alias, "capacity")) {
815c51f124SMoriah Waterland 			if (name[0])
825c51f124SMoriah Waterland 				devp->capacity = atoll(name);
835c51f124SMoriah Waterland 			free(name);
845c51f124SMoriah Waterland 		}
855c51f124SMoriah Waterland 		/* check for norewind device */
865c51f124SMoriah Waterland 		devp->norewind = devattr(alias, "norewind");
875c51f124SMoriah Waterland 		if (devp->norewind && !devp->norewind[0]) {
885c51f124SMoriah Waterland 			free(devp->norewind);
895c51f124SMoriah Waterland 			devp->norewind = NULL;
905c51f124SMoriah Waterland 		}
915c51f124SMoriah Waterland 
925c51f124SMoriah Waterland 		/* mountable devices will always have associated raw device */
935c51f124SMoriah Waterland 		return (0);
945c51f124SMoriah Waterland 	}
955c51f124SMoriah Waterland 	if (devp->cdevice) {
965c51f124SMoriah Waterland 		free(devp->cdevice);
975c51f124SMoriah Waterland 		devp->cdevice = NULL;
985c51f124SMoriah Waterland 	}
995c51f124SMoriah Waterland 	/*
1005c51f124SMoriah Waterland 	 * if it is not a raw device, it must be a directory or a regular file
1015c51f124SMoriah Waterland 	 */
1025c51f124SMoriah Waterland 	name = devattr(alias, "pathname");
1035c51f124SMoriah Waterland 	if (!name || !name[0]) {
1045c51f124SMoriah Waterland 		/* Assume a regular file */
1055c51f124SMoriah Waterland 		if (name)
1065c51f124SMoriah Waterland 			free(name);
1075c51f124SMoriah Waterland 		devp->pathname = alias;
1085c51f124SMoriah Waterland 		return (0);
1095c51f124SMoriah Waterland 	}
1105c51f124SMoriah Waterland 	if (!isdir(name))
1115c51f124SMoriah Waterland 		devp->dirname = name;
1125c51f124SMoriah Waterland 	else
1135c51f124SMoriah Waterland 		devp->pathname = name;
1145c51f124SMoriah Waterland 	return (0);
1155c51f124SMoriah Waterland }
116