Alias *read_alias_table( char *alias_file ) { FILE *f; char *line = NULL; size_t buffer_size = 0; ssize_t n; Alias *result = NULL; List *words; char *lhs; char *rhs; f = fopen( alias_file, "r" ); if ( f != NULL ) { while ( (n = getline( &line, &buffer_size, f )) > 0 ) { /* When reading a file using getline, we are given the '\n' characters, but in this case we're not interested in them. */ if ( (n > 0) && (line[n-1] == '\n') ) { line[n-1] = '\0'; } /* Splitting the line between the first and second words, gives us the alias and what it should expand to. */ words = split_after_first_word( line ); if ( list_length( words ) == 2 ) { lhs = get_nth_word( words, 0 ); rhs = get_nth_word( words, 1 ); /* What the alias expands to is often enclosed in "()", but we don't need the brackets. Similary we can strip out any unescaped quotes, i.e. '"'.*/ rhs = get_string_in_brackets( rhs ); rhs = remove_quotes( rhs ); result = new_alias( result, lhs, rhs ); } else { fprintf( stderr, "Ignoring unexpected entry in alias table: %s\n", line ); } free_list( words ); } free( line ); fclose( f ); } else { warn( "Unable to open file %s", alias_file ); } return result; }
int add_new_alias(t_aliases **aliases, char *name, char *cmd) { t_aliases *new_als; t_aliases *last_alias; if ((new_als = new_alias(name, cmd)) == NULL) return (-1); if (*aliases == NULL) *aliases = new_als; else { last_alias = *aliases; while (last_alias->next != NULL) last_alias = last_alias->next; last_alias->next = new_als; new_als->prev = last_alias; } return (0); }
/******************************************************************** * FUNCTION handle_alias_parm * * alias def * alias def=def-value * * Handle the alias command, based on the parameter * * INPUTS: * varstr == alias command line * setonly == TRUE if expecting set version only; ignore show alias * FALSE if expecting show alias or set alias * loginfo == TRUE if log-level=info should be used * FALSE if log-level=debug2 should be used * RETURNS: * status *********************************************************************/ static status_t handle_alias_parm (const xmlChar *varstr, boolean setonly, boolean loginfo) { const xmlChar *valptr = NULL; uint32 nlen = 0; status_t res; res = parse_alias(varstr, &nlen, &valptr); if (res == NO_ERR) { if (valptr) { /* setting an alias */ alias_cb_t *alias = find_alias(varstr, nlen); if (alias) { if (LOGDEBUG3) { log_debug3("\nAbout to replace alias '%s'" "\n old value: '%s'" "\n new value: '%s'", alias->name, alias->value ? alias->value : EMPTY_STRING, valptr); } /* modify an existing alias */ res = set_alias(alias, valptr); if (res == NO_ERR) { if (loginfo) { log_info("\nUpdated alias '%s'\n", alias->name); } else { log_debug2("\nUpdated alias '%s'", alias->name); } } else { log_error("\nError: invalid alias value '%s'\n", valptr); } } else { /* create a new alias */ alias = new_alias(varstr, nlen); if (alias == NULL) { res = ERR_INTERNAL_MEM; } else { res = set_alias(alias, valptr); if (res == NO_ERR) { res = add_alias(alias); if (res == NO_ERR) { if (loginfo) { log_info("\nAdded alias '%s'\n", alias->name); } else { log_debug2("\nAdded alias '%s'", alias->name); } } else { log_error("\nError: alias was not added '%s'\n", get_error_string(res)); } } else { log_error("\nError: invalid alias value '%s'\n", valptr); free_alias(alias); } } } } else if (!setonly) { /* just provided a name; show alias */ show_alias_name(varstr, nlen); } else if (LOGDEBUG) { log_debug("\nSkipping alias '%s' because no value set", varstr); } } else if (res == ERR_NCX_INVALID_NAME) { log_error("\nError: invalid alias (%s)", get_error_string(res)); } else { log_error("\nError: invalid alias '%s' (%s)", varstr, get_error_string(res)); } return res; } /* handle_alias_parm */
static int add_devs(di_node_t node, di_minor_t minor, void *arg) { struct search_args *args; int result = DI_WALK_CONTINUE; args = (struct search_args *)arg; if (dm_debug > 1) { /* This is all just debugging code */ char *devpath; char dev_name[MAXPATHLEN]; devpath = di_devfs_path(node); (void) snprintf(dev_name, sizeof (dev_name), "%s:%s", devpath, di_minor_name(minor)); di_devfs_path_free((void *) devpath); (void) fprintf(stderr, "INFO: dev: %s, node: %s%d, minor: 0x%x, type: %s\n", dev_name, di_node_name(node), di_instance(node), di_minor_spectype(minor), (di_minor_nodetype(minor) != NULL ? di_minor_nodetype(minor) : "NULL")); } if (bus_type(node, minor, args->ph) != NULL) { if (add_bus(args, node, minor, NULL) == NULL) { args->dev_walk_status = ENOMEM; result = DI_WALK_TERMINATE; } } else if (is_ctrl(node, minor)) { if (add_controller(args, node, minor) == NULL) { args->dev_walk_status = ENOMEM; result = DI_WALK_TERMINATE; } } else if (di_minor_spectype(minor) == S_IFCHR && (is_drive(minor) || is_zvol(node, minor))) { char *devidstr; char kernel_name[MAXPATHLEN]; disk_t *diskp; (void) snprintf(kernel_name, sizeof (kernel_name), "%s%d", di_node_name(node), di_instance(node)); devidstr = get_str_prop(DEVICE_ID_PROP, node); args->node = node; args->minor = minor; /* * Check if we already got this disk and * this is another slice. */ if (!have_disk(args, devidstr, kernel_name, &diskp)) { args->dev_walk_status = 0; /* * This is a newly found disk, create the * disk structure. */ diskp = create_disk(devidstr, kernel_name, args); if (diskp == NULL) { args->dev_walk_status = ENOMEM; } if (diskp->drv_type != DM_DT_FLOPPY) { /* add the controller relationship */ if (args->dev_walk_status == 0) { if (add_disk2controller(diskp, args) != 0) { args->dev_walk_status = ENOMEM; } } } } if (is_zvol(node, minor)) { char zvdsk[MAXNAMELEN]; char *str; alias_t *ap; if (di_prop_lookup_strings(di_minor_devt(minor), node, "name", &str) == -1) return (DI_WALK_CONTINUE); (void) snprintf(zvdsk, MAXNAMELEN, "/dev/zvol/rdsk/%s", str); if ((ap = find_alias(diskp, kernel_name)) == NULL) { if (new_alias(diskp, kernel_name, zvdsk, args) != 0) { args->dev_walk_status = ENOMEM; } } else { /* * It is possible that we have already added * this devpath. * Do not add it again. new_devpath will * return a 0 if found, and not add the path. */ if (new_devpath(ap, zvdsk) != 0) { args->dev_walk_status = ENOMEM; } } } /* Add the devpaths for the drive. */ if (args->dev_walk_status == 0) { char *devpath; char slice_path[MAXPATHLEN]; char *pattern; /* * We will come through here once for each of * the raw slice device names. */ devpath = di_devfs_path(node); (void) snprintf(slice_path, sizeof (slice_path), "%s:%s", devpath, di_minor_name(minor)); di_devfs_path_free((void *) devpath); if (libdiskmgt_str_eq(di_minor_nodetype(minor), DDI_NT_FD)) { pattern = DEVLINK_FLOPPY_REGEX; } else { pattern = DEVLINK_REGEX; } /* Walk the /dev tree to get the devlinks. */ (void) di_devlink_walk(args->handle, pattern, slice_path, DI_PRIMARY_LINK, arg, add_devpath); } if (args->dev_walk_status != 0) { result = DI_WALK_TERMINATE; } } return (result); }
static int add_devpath(di_devlink_t devlink, void *arg) { struct search_args *args; char *devidstr; disk_t *diskp; char kernel_name[MAXPATHLEN]; args = (struct search_args *)arg; /* * Get the diskp value from calling have_disk. Can either be found * by kernel name or devid. */ diskp = NULL; devidstr = get_str_prop(DEVICE_ID_PROP, args->node); (void) snprintf(kernel_name, sizeof (kernel_name), "%s%d", di_node_name(args->node), di_instance(args->node)); (void) have_disk(args, devidstr, kernel_name, &diskp); /* * The devlink_path is usually of the form /dev/rdsk/c0t0d0s0. * For diskettes it is /dev/rdiskette*. * On Intel we would also get each fdisk partition as well * (e.g. /dev/rdsk/c0t0d0p0). */ if (diskp != NULL) { alias_t *ap; char *devlink_path; if (diskp->drv_type != DM_DT_FLOPPY) { /* * Add other controllers for multipath disks. * This will have no effect if the controller * relationship is already set up. */ if (add_disk2controller(diskp, args) != 0) { args->dev_walk_status = ENOMEM; } } (void) snprintf(kernel_name, sizeof (kernel_name), "%s%d", di_node_name(args->node), di_instance(args->node)); devlink_path = (char *)di_devlink_path(devlink); if (dm_debug > 1) { (void) fprintf(stderr, "INFO: devpath %s\n", devlink_path); } if ((ap = find_alias(diskp, kernel_name)) == NULL) { if (new_alias(diskp, kernel_name, devlink_path, args) != 0) { args->dev_walk_status = ENOMEM; } } else { /* * It is possible that we have already added this * devpath. Do not add it again. new_devpath will * return a 0 if found, and not add the path. */ if (new_devpath(ap, devlink_path) != 0) { args->dev_walk_status = ENOMEM; } } } return (DI_WALK_CONTINUE); }