Print this page
4833 Remove volrmmount
4845 rm(u)mount don't always print mount/unmount errors
4846 HAL partition names don't match real parition names
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
*** 15,29 ****
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
! */
!
! /*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* rmf_misc.c :
* Miscelleneous routines for rmformat.
--- 15,30 ----
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
! *
! *
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2014 Andrew Stormont.
*/
/*
* rmf_misc.c :
* Miscelleneous routines for rmformat.
*** 85,95 ****
/*
* Function prototypes.
*/
static int my_umount(char *mountp);
- static int my_volrmmount(char *real_name);
static int vol_name_to_dev_node(char *vname, char *found);
static int vol_lookup(char *supplied, char *found);
static device_t *get_device(char *user_supplied, char *node);
static char *get_physical_name(char *path);
static int lookup_device(char *supplied, char *found);
--- 86,95 ----
*** 221,335 ****
if (echo_off)
(void) tcsetattr(fileno(in), TCSAFLUSH, &tio);
}
- int32_t
- check_and_unmount_vold(char *device_name, int32_t flag)
- {
- char *real_name;
- char *nm;
- char tmp_path_name[PATH_MAX];
- struct stat stat_buf;
- int32_t ret_val = 0;
- struct mnttab *mntp;
- FILE *fp;
- int nl;
-
- DPRINTF1("Device name %s\n", device_name);
-
- if (volmgt_running() == 0) {
- DPRINTF("Vold not running\n");
- return (0);
- }
- if ((nm = volmgt_symname(device_name)) == NULL) {
- DPRINTF("path not managed\n");
- real_name = media_findname(device_name);
- } else {
- DPRINTF1("path managed as %s\n", nm);
- real_name = media_findname(nm);
- DPRINTF1("real name %s\n", real_name);
- }
-
- if (real_name == NULL)
- return (-1);
-
- /*
- * To find out whether the device has been mounted by
- * volume manager...
- *
- * Convert the real name to a block device address.
- * Do a partial match with the mnttab entries.
- * Make sure the match is in the beginning to avoid if
- * anybody puts a label similiar to volume manager path names.
- * Then use "volrmmount -e <dev_name>" if -U flag is set.
- */
-
- nl = strlen("/vol/dev/");
-
- if (strncmp(real_name, "/vol/dev/", nl) != 0)
- return (0);
- if (real_name[nl] == 'r') {
- (void) snprintf(tmp_path_name, PATH_MAX, "%s%s", "/vol/dev/",
- &real_name[nl + 1]);
- } else {
- (void) snprintf(tmp_path_name, PATH_MAX, "%s", real_name);
- }
- DPRINTF1("%s \n", tmp_path_name);
- ret_val = stat(tmp_path_name, &stat_buf);
- if (ret_val < 0) {
- PERROR("Could not stat");
- return (-1);
- }
-
- fp = fopen("/etc/mnttab", "r");
-
- if (fp == NULL) {
- PERROR("Could not open /etc/mnttab");
- return (-1);
- }
-
- mntp = (struct mnttab *)malloc(sizeof (struct mnttab));
- if (mntp == NULL) {
- PERROR("malloc failed");
- (void) fclose(fp);
- return (-1);
- }
- errno = 0;
- while (getmntent(fp, mntp) == 0) {
- if (errno != 0) {
- PERROR("Error with mnttab");
- (void) fclose(fp);
- return (-1);
- }
- /* Is it a probable entry? */
- DPRINTF1(" %s \n", mntp->mnt_special);
- if (strstr(mntp->mnt_special, tmp_path_name) !=
- mntp->mnt_special) {
- /* Skip to next entry */
- continue;
- } else {
- DPRINTF1("Found!! %s\n", mntp->mnt_special);
- ret_val = 1;
- break;
- }
- }
-
- if (ret_val == 1) {
- if (flag) {
- if (my_volrmmount(real_name) < 0) {
- ret_val = -1;
- }
- } else {
- ret_val = -1;
- }
- }
- (void) fclose(fp);
- free(mntp);
- return (ret_val);
- }
-
/*
* This routine checks if a device has mounted partitions. The
* device name is assumed to be /dev/rdsk/cNtNdNsN. So, this can
* be used for SCSI and PCMCIA cards.
* Returns
--- 221,230 ----
*** 1065,1119 ****
}
}
return (-1);
}
- static int
- my_volrmmount(char *real_name)
- {
- int pid, rval;
-
- /* Turn on the privileges. */
- (void) __priv_bracket(PRIV_ON);
-
- pid = fork();
-
- /* Turn off the privileges. */
- (void) __priv_bracket(PRIV_OFF);
-
- /* create a child to unmount the path */
- if (pid < 0) {
- PERROR("fork failed");
- exit(0);
- }
-
- if (pid == 0) {
- /* the child */
- /* get rid of those nasty err messages */
- DPRINTF1("call_unmount_prog: calling %s \n",
- "/usr/bin/volrmmount");
-
- /* Turn on the privileges. */
- (void) __priv_bracket(PRIV_ON);
- if (execl("/usr/bin/volrmmount", "/usr/bin/volrmmount", "-e",
- real_name, NULL) < 0) {
- PERROR("volrmmount exec failed");
- /* Turn off the privileges */
- (void) __priv_bracket(PRIV_OFF);
- exit(-1);
- }
- } else if (waitpid(pid, &rval, 0) == pid) {
- if (WIFEXITED(rval)) {
- if (WEXITSTATUS(rval) == 0) {
- DPRINTF("volrmmount: Success\n");
- return (1);
- }
- }
- }
- return (-1);
- }
-
int
find_device(int defer, char *tmpstr)
{
DIR *dir;
struct dirent *dirent;
--- 960,969 ----
*** 1158,1168 ****
continue;
}
total_devices_found++;
if ((!defer) && !found) {
! char *sn, *tmpbuf;
/*
* dev_name is an optional command line input.
*/
if (dev_name) {
if (strstr(dirent->d_name, tmpstr)) {
--- 1008,1018 ----
continue;
}
total_devices_found++;
if ((!defer) && !found) {
! char *sn, *tmpbuf = NULL;
/*
* dev_name is an optional command line input.
*/
if (dev_name) {
if (strstr(dirent->d_name, tmpstr)) {