lib: [strutils] general purpose string handling functions

This patch replaces a few functions used throughout the source:
* Renames getnum (from schedutils) to strtol_or_err
* Moves strtosize (from lib/strtosize.c)
* Moves xstrncpy (from include/xstrncpy.h)
* Adds strnlen, strnchr and strndup if not available (remove it from libmount utils)

A few Makefile.am files were modified to compile accordingly along with trivial renaming
in schedutils source code.

Signed-off-by: Davidlohr Bueso <dave@gnu.org>
This commit is contained in:
Davidlohr Bueso 2010-11-16 10:47:35 -03:00 committed by Karel Zak
parent e8fc977aba
commit 8abcf29002
35 changed files with 142 additions and 185 deletions

View File

@ -48,7 +48,7 @@
#include "linux_version.h"
#include "swapheader.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#include "blkdev.h"
#include "pathnames.h"

View File

@ -33,7 +33,7 @@
#include "c.h"
#include "writeall.h"
#include "swapheader.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#define SWAP_UUID_OFFSET (offsetof(struct swap_header_v1_2, uuid))

View File

@ -99,7 +99,7 @@
#include "nls.h"
#include "blkdev.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "common.h"
#include "gpt.h"
#include "mbsalign.h"

View File

@ -20,11 +20,10 @@ dist_noinst_HEADERS = \
nls.h \
pathnames.h \
setproctitle.h \
strtosize.h \
strutils.h \
swapheader.h \
tt.h \
usleep.h \
wholedisk.h \
widechar.h \
writeall.h \
xstrncpy.h
writeall.h

View File

@ -1,8 +0,0 @@
#ifndef UTIL_LINUX_STRTOSIZE
#define UTIL_LINUX_STRTOSIZE
#include <inttypes.h>
extern int strtosize(const char *str, uintmax_t *res);
#endif /* UTIL_LINUX_STRING_TO_NUMBE */

26
include/strutils.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef UTIL_LINUX_STRUTILS
#define UTIL_LINUX_STRUTILS
#include <inttypes.h>
#include <string.h>
extern int strtosize(const char *str, uintmax_t *res);
extern long strtol_or_err(const char *str, const char *errmesg);
#ifndef HAVE_STRNLEN
extern size_t strnlen(const char *s, size_t maxlen);
#endif
#ifndef HAVE_STRNDUP
extern char *strndup(const char *s, size_t n);
#endif
#ifndef HAVE_STRNCHR
extern char *strnchr(const char *s, size_t maxlen, int c);
#endif
/* caller guarantees n > 0 */
static inline void xstrncpy(char *dest, const char *src, size_t n)
{
strncpy(dest, src, n-1);
dest[n-1] = 0;
}
#endif

View File

@ -1,8 +0,0 @@
/* NUL-terminated version of strncpy() */
#include <string.h>
/* caller guarantees n > 0 */
static inline void xstrncpy(char *dest, const char *src, size_t n) {
strncpy(dest, src, n-1);
dest[n-1] = 0;
}

View File

@ -3,7 +3,7 @@ include $(top_srcdir)/config/include-Makefile.am
AM_CPPFLAGS += -DTEST_PROGRAM
noinst_PROGRAMS = test_blkdev test_ismounted test_wholedisk test_mangle \
test_strtosize test_tt test_canonicalize
test_tt test_canonicalize
if LINUX
if HAVE_CPU_SET_T
noinst_PROGRAMS += test_cpuset
@ -14,7 +14,6 @@ test_blkdev_SOURCES = blkdev.c
test_ismounted_SOURCES = ismounted.c
test_wholedisk_SOURCES = wholedisk.c
test_mangle_SOURCES = mangle.c
test_strtosize_SOURCES = strtosize.c
if LINUX
test_cpuset_SOURCES = cpuset.c
endif

View File

@ -1,3 +1,24 @@
/*
* Copyright (C) 2010 Karel Zak <kzak@redhat.com>
* Copyright (C) 2010 Davidlohr Bueso <dave@gnu.org>
*/
#include <stdlib.h>
#include <inttypes.h>
#include <ctype.h>
#include <errno.h>
#include <err.h>
static int do_scale_by_power (uintmax_t *x, int base, int power)
{
while (power--) {
if (UINTMAX_MAX / base < *x)
return -2;
*x *= base;
}
return 0;
}
/*
* strtosize() - convert string to size (uintmax_t).
*
@ -17,26 +38,7 @@
*
* Note that the function does not accept numbers with '-' (negative sign)
* prefix.
*
* Returns 0 on success, -1 in case of error, -2 in case of overflow.
*
* Copyright (C) 2010 Karel Zak <kzak@redhat.com>
*/
#include <stdio.h>
#include <inttypes.h>
#include <ctype.h>
#include <errno.h>
static int do_scale_by_power (uintmax_t *x, int base, int power)
{
while (power--) {
if (UINTMAX_MAX / base < *x)
return -2;
*x *= base;
}
return 0;
}
int strtosize(const char *str, uintmax_t *res)
{
char *p;
@ -123,26 +125,62 @@ err:
return -1;
}
#ifdef TEST_PROGRAM
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
int main(int argc, char *argv[])
#ifndef HAVE_STRNLEN
size_t strnlen(const char *s, size_t maxlen)
{
uintmax_t size = 0;
int i;
if (argc < 2) {
fprintf(stderr, "usage: %s <number>[suffix]\n", argv[0]);
exit(EXIT_FAILURE);
}
if (strtosize(argv[1], &size))
errx(EXIT_FAILURE, "invalid size '%s' value", argv[1]);
printf("%25s : %20ju\n", argv[1], size);
return EXIT_FAILURE;
for (i = 0; i < maxlen; i++) {
if (s[i] == '\0')
return i + 1;
}
return maxlen;
}
#endif /* TEST_PROGRAM */
#endif
#ifndef HAVE_STRNCHR
char *strnchr(const char *s, size_t maxlen, int c)
{
for (; maxlen-- && *s != '\0'; ++s)
if (*s == (char)c)
return (char *)s;
return NULL;
}
#endif
#ifndef HAVE_STRNDUP
char *strndup(const char *s, size_t n)
{
size_t len = strnlen(s, n);
char *new = (char *) malloc((len + 1) * sizeof(char));
if (!new)
return NULL;
new[len] = '\0';
return (char *) memcpy(new, s, len);
}
#endif
/*
* same as strtol(3) but exit on failure instead of returning crap
*/
long strtol_or_err(const char *str, const char *errmesg)
{
long num;
char *end = NULL;
if (str == NULL || *str == '\0')
goto err;
errno = 0;
num = strtol(str, &end, 10);
if (errno || (end && *end))
goto err;
return num;
err:
if (errno)
err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
else
errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
return 0;
}

View File

@ -32,7 +32,7 @@
#include <sys/socket.h>
#include <netdb.h>
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#include "pathnames.h"

View File

@ -31,7 +31,7 @@
#include "pathnames.h"
#include "login.h"
#include "xstrncpy.h"
#include "strutils.h"
#ifndef TTY_MAJOR
#define TTY_MAJOR 4

View File

@ -36,7 +36,7 @@
#include "my_crypt.h"
#include "islocal.h"
#include "setpwnam.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#include "env.h"

View File

@ -113,7 +113,7 @@
#include "pathnames.h"
#include "my_crypt.h"
#include "login.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"

View File

@ -74,7 +74,7 @@
#include <sys/utsname.h>
#include "linux_reboot.h"
#include "pathnames.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#include "usleep.h"

View File

@ -45,7 +45,7 @@
#include "my_crypt.h"
#include "pathnames.h"
#include "linux_reboot.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#include "simpleinit.h"

View File

@ -64,7 +64,7 @@ static char version_string[] = "vipw 1.4";
#include <unistd.h>
#include "setpwnam.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#ifdef HAVE_LIBSELINUX

View File

@ -58,7 +58,7 @@
#include <utmp.h>
#include "nls.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "ttymsg.h"
#include "pathnames.h"
#include "carefulputc.h"

View File

@ -37,12 +37,12 @@ if BUILD_LIBBLKID
sbin_PROGRAMS += blkid findfs wipefs
dist_man_MANS += blkid.8 findfs.8 wipefs.8
blkid_SOURCES = blkid.c $(top_srcdir)/lib/ismounted.c \
$(top_srcdir)/lib/strtosize.c
$(top_srcdir)/lib/strutils.c
blkid_LDADD = $(ul_libblkid_la)
blkid_CFLAGS = $(AM_CFLAGS) -I$(ul_libblkid_incdir)
findfs_LDADD = $(ul_libblkid_la)
findfs_CFLAGS = $(AM_CFLAGS) -I$(ul_libblkid_incdir)
wipefs_SOURCES = wipefs.c $(top_srcdir)/lib/strtosize.c
wipefs_SOURCES = wipefs.c $(top_srcdir)/lib/strutils.c
wipefs_LDADD = $(ul_libblkid_la)
wipefs_CFLAGS = $(AM_CFLAGS) -I$(ul_libblkid_incdir)
if HAVE_STATIC_BLKID

View File

@ -41,7 +41,7 @@ extern int optind;
#include <blkid.h>
#include "ismounted.h"
#include "strtosize.h"
#include "strutils.h"
const char *progname = "blkid";

View File

@ -35,7 +35,7 @@
#include "nls.h"
#include "xalloc.h"
#include "strtosize.h"
#include "strutils.h"
struct wipe_desc {
loff_t offset; /* magic string offset */

View File

@ -28,12 +28,12 @@ cflags_common = $(AM_CFLAGS)
ldflags_static = -all-static
mount_SOURCES = mount.c $(srcs_mount) $(top_srcdir)/lib/setproctitle.c \
$(top_srcdir)/lib/strtosize.c
$(top_srcdir)/lib/strutils.c
mount_CFLAGS = $(SUID_CFLAGS) $(cflags_common)
mount_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
mount_LDADD = $(ldadd_common)
umount_SOURCES = umount.c $(srcs_mount) $(top_srcdir)/lib/strtosize.c
umount_SOURCES = umount.c $(srcs_mount) $(top_srcdir)/lib/strutils.c
umount_CFLAGS = $(SUID_CFLAGS) $(cflags_common)
umount_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
umount_LDADD = $(ldadd_common)
@ -45,7 +45,7 @@ swapon_CFLAGS = $(cflags_common)
swapon_LDADD = $(ldadd_common)
losetup_SOURCES = lomount.c $(srcs_common) loop.h lomount.h \
$(top_srcdir)/lib/strtosize.c
$(top_srcdir)/lib/strutils.c
losetup_CPPFLAGS = -DMAIN $(AM_CPPFLAGS)
mount_static_LDADD =

View File

@ -18,7 +18,7 @@
#include "loop.h"
#include "lomount.h"
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#include "sundries.h"
#include "xmalloc.h"
@ -886,7 +886,7 @@ find_unused_loop_device (void) {
#include <getopt.h>
#include <stdarg.h>
#include "strtosize.h"
#include "strutils.h"
static void
usage(FILE *f) {

View File

@ -41,7 +41,7 @@
#include "env.h"
#include "nls.h"
#include "blkdev.h"
#include "strtosize.h"
#include "strutils.h"
#define DO_PS_FIDDLING

View File

@ -20,7 +20,7 @@
#include "fstab.h"
#include "env.h"
#include "nls.h"
#include "strtosize.h"
#include "strutils.h"
#if defined(MNT_FORCE)
/* Interesting ... it seems libc knows about MNT_FORCE and presumably

View File

@ -2,7 +2,7 @@ include $(top_srcdir)/config/include-Makefile.am
if BUILD_SCHEDUTILS
srcs_common = schedutils.c schedutils.h
srcs_common = $(top_srcdir)/lib/strutils.c
usrbin_exec_PROGRAMS = chrt
dist_man_MANS = chrt.1

View File

@ -32,7 +32,7 @@
#include "c.h"
#include "nls.h"
#include "schedutils.h"
#include "strutils.h"
/* the SCHED_BATCH is supported since Linux 2.6.16
* -- temporary workaround for people with old glibc headers
@ -240,7 +240,7 @@ int main(int argc, char *argv[])
break;
case 'p':
errno = 0;
pid = getnum(argv[argc - 1], _("failed to parse pid"));
pid = strtol_or_err(argv[argc - 1], _("failed to parse pid"));
break;
case 'r':
policy = SCHED_RR;
@ -268,7 +268,7 @@ int main(int argc, char *argv[])
}
errno = 0;
priority = getnum(argv[optind], _("failed to parse priority"));
priority = strtol_or_err(argv[optind], _("failed to parse priority"));
#ifdef SCHED_RESET_ON_FORK
/* sanity check */

View File

@ -18,7 +18,7 @@
#include "nls.h"
#include "schedutils.h"
#include "strutils.h"
static int tolerant;
@ -105,15 +105,15 @@ int main(int argc, char *argv[])
while ((c = getopt(argc, argv, "+n:c:p:th")) != EOF) {
switch (c) {
case 'n':
ioprio = getnum(optarg, _("failed to parse class data"));
ioprio = strtol_or_err(optarg, _("failed to parse class data"));
set |= 1;
break;
case 'c':
ioclass = getnum(optarg, _("failed to parse class"));
ioclass = strtol_or_err(optarg, _("failed to parse class"));
set |= 2;
break;
case 'p':
pid = getnum(optarg, _("failed to parse pid"));
pid = strtol_or_err(optarg, _("failed to parse pid"));
break;
case 't':
tolerant = 1;
@ -147,7 +147,7 @@ int main(int argc, char *argv[])
ioprio_print(pid);
for(; argv[optind]; ++optind) {
pid = getnum(argv[optind], _("failed to parse pid"));
pid = strtol_or_err(argv[optind], _("failed to parse pid"));
ioprio_print(pid);
}
} else {
@ -156,7 +156,7 @@ int main(int argc, char *argv[])
for(; argv[optind]; ++optind)
{
pid = getnum(argv[optind], _("failed to parse pid"));
pid = strtol_or_err(argv[optind], _("failed to parse pid"));
ioprio_setpid(pid, ioprio, ioclass);
}
}

View File

@ -1,34 +0,0 @@
/*
* Copyright (C) 2010 Karel Zak <kzak@redhat.com>
*
* Released under the terms of the GNU General Public License version 2
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <err.h>
#include "nls.h"
long getnum(const char *str, const char *errmesg)
{
long num;
char *end = NULL;
if (str == NULL || *str == '\0')
goto err;
errno = 0;
num = strtol(str, &end, 10);
if (errno || (end && *end))
goto err;
return num;
err:
if (errno)
err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
else
errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
return 0;
}

View File

@ -1,7 +0,0 @@
#ifndef UTIL_LINUX_SCHED_UTILS
#define UTIL_LINUX_SCHED_UTILS
extern long getnum(const char *str, const char *errmesg);
#endif

View File

@ -32,7 +32,7 @@
#include "cpuset.h"
#include "nls.h"
#include "schedutils.h"
#include "strutils.h"
static void __attribute__((__noreturn__)) usage(FILE *out)
{
@ -89,7 +89,7 @@ int main(int argc, char *argv[])
while ((opt = getopt_long(argc, argv, "+pchV", longopts, NULL)) != -1) {
switch (opt) {
case 'p':
pid = getnum(argv[argc - 1], _("failed to parse pid"));
pid = strtol_or_err(argv[argc - 1], _("failed to parse pid"));
break;
case 'c':
c_opt = 1;

View File

@ -60,15 +60,6 @@ extern int mnt_run_test(struct mtest *tests, int argc, char *argv[]);
/* utils.c */
extern char *mnt_getenv_safe(const char *arg);
#ifndef HAVE_STRNLEN
extern size_t strnlen(const char *s, size_t maxlen);
#endif
#ifndef HAVE_STRNDUP
extern char *strndup(const char *s, size_t n);
#endif
#ifndef HAVE_STRNCHR
extern char *strnchr(const char *s, size_t maxlen, int c);
#endif
extern char *mnt_get_username(const uid_t uid);
/*

View File

@ -51,45 +51,6 @@ char *mnt_getenv_safe(const char *arg)
#endif
}
/* TODO: move strn<...> functions to top-level lib/strn.c */
#ifndef HAVE_STRNLEN
size_t strnlen(const char *s, size_t maxlen)
{
int i;
for (i = 0; i < maxlen; i++) {
if (s[i] == '\0')
return i + 1;
}
return maxlen;
}
#endif
#ifndef HAVE_STRNCHR
char *strnchr(const char *s, size_t maxlen, int c)
{
for (; maxlen-- && *s != '\0'; ++s)
if (*s == (char)c)
return (char *)s;
return NULL;
}
#endif
#ifndef HAVE_STRNDUP
char *strndup(const char *s, size_t n)
{
size_t len = strnlen (s, n);
char *new = (char *) malloc (len + 1);
if (new == NULL)
return NULL;
new[len] = '\0';
return (char *) memcpy (new, s, len);
}
#endif
/**
* mnt_fstype_is_pseudofs:
* @type: filesystem name

View File

@ -31,7 +31,7 @@ tunelp_SOURCES = tunelp.c lp.h
if BUILD_FALLOCATE
usrbin_exec_PROGRAMS += fallocate
fallocate_SOURCES = fallocate.c $(top_srcdir)/lib/strtosize.c
fallocate_SOURCES = fallocate.c $(top_srcdir)/lib/strutils.c
dist_man_MANS += fallocate.1
endif

View File

@ -44,7 +44,7 @@
#endif
#include "nls.h"
#include "strtosize.h"
#include "strutils.h"
static void __attribute__((__noreturn__)) usage(FILE *out)

View File

@ -56,7 +56,7 @@
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/wait.h>
#include "xstrncpy.h"
#include "strutils.h"
#include "nls.h"
#include "xalloc.h"