1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Add dm_split_words() and dm_split_lvm_name() to libdevmapper.

This commit is contained in:
Alasdair Kergon 2006-08-21 12:07:03 +00:00
parent 4af059bd85
commit 7d7736b7b4
13 changed files with 133 additions and 97 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.10 - Version 2.02.10 -
================================== ==================================
Move split_words() and split_dm_name() into libdevmapper.
Add lvconvert man page. Add lvconvert man page.
Add mirror options to man pages. Add mirror options to man pages.
Prevent mirror renames. Prevent mirror renames.

View File

@ -1,5 +1,6 @@
Version 1.02.10 - Version 1.02.10 -
============================== ==============================
Add dm_split_words() and dm_split_lvm_name() to libdevmapper.
Reorder mm bounds_check code to reduce window for a dmeventd race. Reorder mm bounds_check code to reduce window for a dmeventd race.
Version 1.02.09 - 15 Aug 2006 Version 1.02.09 - 15 Aug 2006

View File

@ -48,7 +48,7 @@ static int _get_mirror_event(char *params)
char *p; char *p;
int log_argc, num_devs, num_failures=0; int log_argc, num_devs, num_failures=0;
if (max_args <= split_words(params, max_args, args)) { if (max_args <= dm_split_words(params, max_args, 0, args)) {
syslog(LOG_ERR, "Unable to split mirror parameters: Arg list too long"); syslog(LOG_ERR, "Unable to split mirror parameters: Arg list too long");
return -E2BIG; return -E2BIG;
} }
@ -121,7 +121,7 @@ static int _remove_failed_devices(const char *device)
if (strlen(device) > 200) if (strlen(device) > 200)
return -ENAMETOOLONG; return -ENAMETOOLONG;
if (!split_dm_name(mem_pool, device, &vg, &lv, &layer)) { if (!dm_split_lvm_name(mem_pool, device, &vg, &lv, &layer)) {
syslog(LOG_ERR, "Unable to determine VG name from %s", syslog(LOG_ERR, "Unable to determine VG name from %s",
device); device);
return -ENOMEM; return -ENOMEM;

View File

@ -48,7 +48,7 @@ static int _get_mirror_event(char *params)
char *p; char *p;
int log_argc, num_devs, num_failures=0; int log_argc, num_devs, num_failures=0;
if (max_args <= split_words(params, max_args, args)) { if (max_args <= dm_split_words(params, max_args, 0, args)) {
syslog(LOG_ERR, "Unable to split mirror parameters: Arg list too long"); syslog(LOG_ERR, "Unable to split mirror parameters: Arg list too long");
return -E2BIG; return -E2BIG;
} }
@ -121,7 +121,7 @@ static int _remove_failed_devices(const char *device)
if (strlen(device) > 200) if (strlen(device) > 200)
return -ENAMETOOLONG; return -ENAMETOOLONG;
if (!split_dm_name(mem_pool, device, &vg, &lv, &layer)) { if (!dm_split_lvm_name(mem_pool, device, &vg, &lv, &layer)) {
syslog(LOG_ERR, "Unable to determine VG name from %s", syslog(LOG_ERR, "Unable to determine VG name from %s",
device); device);
return -ENOMEM; return -ENOMEM;

View File

@ -912,7 +912,7 @@ static int _create_lv_symlinks(struct dev_manager *dm, struct dm_tree_node *root
name = dm_tree_node_get_name(child); name = dm_tree_node_get_name(child);
if (name && lvlayer->old_name && *lvlayer->old_name && strcmp(name, lvlayer->old_name)) { if (name && lvlayer->old_name && *lvlayer->old_name && strcmp(name, lvlayer->old_name)) {
if (!split_dm_name(dm->mem, lvlayer->old_name, &vgname, &lvname, &layer)) { if (!dm_split_lvm_name(dm->mem, lvlayer->old_name, &vgname, &lvname, &layer)) {
log_error("_create_lv_symlinks: Couldn't split up old device name %s", lvlayer->old_name); log_error("_create_lv_symlinks: Couldn't split up old device name %s", lvlayer->old_name);
return 0; return 0;
} }
@ -938,7 +938,7 @@ static int _clean_tree(struct dev_manager *dm, struct dm_tree_node *root)
if (!(uuid = dm_tree_node_get_uuid(child))) if (!(uuid = dm_tree_node_get_uuid(child)))
continue; continue;
if (!split_dm_name(dm->mem, name, &vgname, &lvname, &layer)) { if (!dm_split_lvm_name(dm->mem, name, &vgname, &lvname, &layer)) {
log_error("_clean_tree: Couldn't split up device name %s.", name); log_error("_clean_tree: Couldn't split up device name %s.", name);
return 0; return 0;
} }

View File

@ -44,7 +44,7 @@ static int _locate_sysfs_blocks(const char *proc, char *path, size_t len)
} }
while (fgets(buffer, sizeof(buffer), fp)) { while (fgets(buffer, sizeof(buffer), fp)) {
if (split_words(buffer, 4, split) == 4 && if (dm_split_words(buffer, 4, 0, split) == 4 &&
!strcmp(split[2], "sysfs")) { !strcmp(split[2], "sysfs")) {
if (lvm_snprintf(path, len, "%s/%s", split[1], if (lvm_snprintf(path, len, "%s/%s", split[1],
"block") >= 0) { "block") >= 0) {

View File

@ -17,8 +17,6 @@
#include "lvm-types.h" #include "lvm-types.h"
#include "lvm-string.h" #include "lvm-string.h"
#include <ctype.h>
/* /*
* On error, up to glibc 2.0.6, snprintf returned -1 if buffer was too small; * On error, up to glibc 2.0.6, snprintf returned -1 if buffer was too small;
* From glibc 2.1 it returns number of chars (excl. trailing null) that would * From glibc 2.1 it returns number of chars (excl. trailing null) that would
@ -58,47 +56,6 @@ int emit_to_buffer(char **buffer, size_t *size, const char *fmt, ...)
return 1; return 1;
} }
/*
* consume characters while they match the predicate function.
*/
static char *_consume(char *buffer, int (*fn) (int))
{
while (*buffer && fn(*buffer))
buffer++;
return buffer;
}
static int _isword(int c)
{
return !isspace(c);
}
/*
* Split buffer into NULL-separated words in argv.
* Returns number of words.
*/
int split_words(char *buffer, unsigned max, char **argv)
{
unsigned arg;
for (arg = 0; arg < max; arg++) {
buffer = _consume(buffer, isspace);
if (!*buffer)
break;
argv[arg] = buffer;
buffer = _consume(buffer, _isword);
if (*buffer) {
*buffer = '\0';
buffer++;
}
}
return arg;
}
/* /*
* Device layer names are all of the form <vg>-<lv>-<layer>, any * Device layer names are all of the form <vg>-<lv>-<layer>, any
* other hyphens that appear in these names are quoted with yet * other hyphens that appear in these names are quoted with yet
@ -169,47 +126,6 @@ char *build_dm_name(struct dm_pool *mem, const char *vgname,
return r; return r;
} }
/*
* Remove hyphen quoting from a component of a name.
* NULL-terminates the component and returns start of next component.
*/
static char *_unquote(char *component)
{
char *c = component;
char *o = c;
char *r;
while (*c) {
if (*(c + 1)) {
if (*c == '-') {
if (*(c + 1) == '-')
c++;
else
break;
}
}
*o = *c;
o++;
c++;
}
r = (*c) ? c + 1 : c;
*o = '\0';
return r;
}
int split_dm_name(struct dm_pool *mem, const char *dmname,
char **vgname, char **lvname, char **layer)
{
if (!(*vgname = dm_pool_strdup(mem, dmname)))
return 0;
_unquote(*layer = _unquote(*lvname = _unquote(*vgname)));
return 1;
}
int validate_name(const char *n) int validate_name(const char *n)
{ {
register char c; register char c;

View File

@ -34,14 +34,9 @@ int lvm_snprintf(char *buf, size_t bufsize, const char *format, ...);
int emit_to_buffer(char **buffer, size_t *size, const char *fmt, ...); int emit_to_buffer(char **buffer, size_t *size, const char *fmt, ...);
int split_words(char *buffer, unsigned max, char **argv);
char *build_dm_name(struct dm_pool *mem, const char *vg, char *build_dm_name(struct dm_pool *mem, const char *vg,
const char *lv, const char *layer); const char *lv, const char *layer);
int split_dm_name(struct dm_pool *mem, const char *dmname,
char **vgname, char **lvname, char **layer);
int validate_name(const char *n); int validate_name(const char *n);
#endif #endif

View File

@ -109,3 +109,5 @@ dm_hash_get_first
dm_hash_get_next dm_hash_get_next
dm_set_selinux_context dm_set_selinux_context
dm_task_set_geometry dm_task_set_geometry
dm_split_lvm_name
dm_split_words

View File

@ -23,6 +23,7 @@ SOURCES =\
libdm-common.c \ libdm-common.c \
libdm-file.c \ libdm-file.c \
libdm-deptree.c \ libdm-deptree.c \
libdm-string.c \
mm/dbg_malloc.c \ mm/dbg_malloc.c \
mm/pool.c \ mm/pool.c \
$(interface)/libdm-iface.c $(interface)/libdm-iface.c

View File

@ -582,4 +582,23 @@ struct dm_hash_node *dm_hash_get_next(struct dm_hash_table *t, struct dm_hash_no
*********/ *********/
int dm_set_selinux_context(const char *path, mode_t mode); int dm_set_selinux_context(const char *path, mode_t mode);
/*********************
* string manipulation
*********************/
/*
* Break up the name of a mapped device into its constituent
* Volume Group, Logical Volume and Layer (if present).
*/
int dm_split_lvm_name(struct dm_pool *mem, const char *dmname,
char **vgname, char **lvname, char **layer);
/*
* Destructively split buffer into NULL-separated words in argv.
* Returns number of words.
*/
int dm_split_words(char *buffer, unsigned max,
unsigned ignore_comments, /* Not implemented */
char **argv);
#endif /* LIB_DEVICE_MAPPER_H */ #endif /* LIB_DEVICE_MAPPER_H */

101
libdm/libdm-string.c Normal file
View File

@ -0,0 +1,101 @@
/*
* Copyright (C) 2006 Red Hat, Inc. All rights reserved.
*
* This file is part of the device-mapper userspace tools.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU General Public License v.2.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "lib.h"
#include "libdevmapper.h"
#include <ctype.h>
/*
* consume characters while they match the predicate function.
*/
static char *_consume(char *buffer, int (*fn) (int))
{
while (*buffer && fn(*buffer))
buffer++;
return buffer;
}
static int _isword(int c)
{
return !isspace(c);
}
/*
* Split buffer into NULL-separated words in argv.
* Returns number of words.
*/
int dm_split_words(char *buffer, unsigned max, unsigned ignore_comments,
char **argv)
{
unsigned arg;
for (arg = 0; arg < max; arg++) {
buffer = _consume(buffer, isspace);
if (!*buffer)
break;
argv[arg] = buffer;
buffer = _consume(buffer, _isword);
if (*buffer) {
*buffer = '\0';
buffer++;
}
}
return arg;
}
/*
* Remove hyphen quoting from a component of a name.
* NULL-terminates the component and returns start of next component.
*/
static char *_unquote(char *component)
{
char *c = component;
char *o = c;
char *r;
while (*c) {
if (*(c + 1)) {
if (*c == '-') {
if (*(c + 1) == '-')
c++;
else
break;
}
}
*o = *c;
o++;
c++;
}
r = (*c) ? c + 1 : c;
*o = '\0';
return r;
}
int dm_split_lvm_name(struct dm_pool *mem, const char *dmname,
char **vgname, char **lvname, char **layer)
{
if (!(*vgname = dm_pool_strdup(mem, dmname)))
return 0;
_unquote(*layer = _unquote(*lvname = _unquote(*vgname)));
return 1;
}

View File

@ -17,7 +17,7 @@ top_srcdir = @top_srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
MAN5=lvm.conf.5 MAN5=lvm.conf.5
MAN8=lvchange.8 lvconvert.8 lvcreate.8 lvdisplay.8 lvextend.8 lvm.8 MAN8=lvchange.8 lvconvert.8 lvcreate.8 lvdisplay.8 lvextend.8 lvm.8 \
lvmchange.8 \ lvmchange.8 \
lvmdiskscan.8 lvreduce.8 lvremove.8 lvrename.8 lvresize.8 lvs.8 \ lvmdiskscan.8 lvreduce.8 lvremove.8 lvrename.8 lvresize.8 lvs.8 \
lvscan.8 pvchange.8 pvcreate.8 pvdisplay.8 pvmove.8 pvremove.8 \ lvscan.8 pvchange.8 pvcreate.8 pvdisplay.8 pvmove.8 pvremove.8 \