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)) {