more bugs fixed -- found doing regression testing

-Erik
This commit is contained in:
Eric Andersen 2001-01-24 23:34:48 +00:00
parent 26439a2991
commit f5d5e77321
11 changed files with 114 additions and 126 deletions

View File

@ -258,17 +258,11 @@
//Turn on fbset readmode support //Turn on fbset readmode support
//#define BB_FEATURE_FBSET_READMODE //#define BB_FEATURE_FBSET_READMODE
// //
// You must enable one or both of these features // Support insmod/lsmod/rmmod for post 2.1 kernels
// Support installing modules from pre 2.1 kernels //#define BB_FEATURE_NEW_MODULE_INTERFACE
//#define BB_FEATURE_INSMOD_OLD_KERNEL
// Support installing modules from kernel versions after 2.1.18
#define BB_FEATURE_INSMOD_NEW_KERNEL
// //
// You must enable one or both of these features // Support insmod/lsmod/rmmod for pre 2.1 kernels
// Support modules status from pre 2.1 kernels //#define BB_FEATURE_OLD_MODULE_INTERFACE
//#define BB_FEATURE_LSMOD_OLD_KERNEL
// Support modules status from kernel versions after 2.1.18
#define BB_FEATURE_LSMOD_NEW_KERNEL
// //
// Support module version checking // Support module version checking
//#define BB_FEATURE_INSMOD_VERSION_CHECKING //#define BB_FEATURE_INSMOD_VERSION_CHECKING
@ -308,6 +302,8 @@
#ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT #ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT
#define BB_MTAB #define BB_MTAB
#endif #endif
#else
#undef BB_MTAB
#endif #endif
// //
#if defined BB_FEATURE_SH_COMMAND_EDITING && defined BB_SH #if defined BB_FEATURE_SH_COMMAND_EDITING && defined BB_SH
@ -320,12 +316,14 @@
#endif #endif
#endif #endif
// //
#ifdef BB_FEATURE_LINUXRC #if defined BB_FEATURE_LINUXRC || defined BB_LINUXRC
#ifndef BB_INIT #ifndef BB_INIT
#define BB_INIT #define BB_INIT
#endif #endif
#ifndef BB_LINUXRC
#define BB_LINUXRC #define BB_LINUXRC
#endif #endif
#endif
// //
#ifdef BB_GZIP #ifdef BB_GZIP
#ifndef BB_GUNZIP #ifndef BB_GUNZIP
@ -369,8 +367,8 @@
#endif #endif
#endif #endif
// //
#if defined BB_INSMOD #if defined BB_INSMOD || defined BB_LSMOD
#ifndef BB_FEATURE_INSMOD_OLD_KERNEL #ifndef BB_FEATURE_NEW_MODULE_INTERFACE
#define BB_FEATURE_INSMOD_NEW_KERNEL #define BB_FEATURE_NEW_MODULE_INTERFACE
#endif #endif
#endif #endif

View File

@ -89,7 +89,37 @@ int main(int argc, char **argv)
{ {
struct BB_applet search_applet, *applet; struct BB_applet search_applet, *applet;
const char *s; const char *s;
applet_name = "busybox";
for (s = applet_name = argv[0]; *s != '\0';) {
if (*s++ == '/')
applet_name = s;
}
#ifdef BB_SH
/* Add in a special case hack -- whenever **argv == '-'
* (i.e. '-su' or '-sh') always invoke the shell */
if (**argv == '-' && *(*argv+1)!= '-') {
exit(((*(shell_main)) (argc, argv)));
}
#endif
/* Do a binary search to find the applet entry given the name. */
search_applet.name = applet_name;
applet = bsearch(&search_applet, applets, NUM_APPLETS,
sizeof(struct BB_applet), applet_name_compare);
if (applet != NULL) {
if (applet->usage && argv[1] && strcmp(argv[1], "--help") == 0)
usage(applet->usage);
exit((*(applet->main)) (argc, argv));
}
error_msg_and_die("applet not found\n");
}
int busybox_main(int argc, char **argv)
{
int col = 0, len, i;
#ifdef BB_FEATURE_INSTALLER #ifdef BB_FEATURE_INSTALLER
/* /*
@ -121,37 +151,6 @@ int main(int argc, char **argv)
} }
#endif /* BB_FEATURE_INSTALLER */ #endif /* BB_FEATURE_INSTALLER */
for (s = applet_name = argv[0]; *s != '\0';) {
if (*s++ == '/')
applet_name = s;
}
#ifdef BB_SH
/* Add in a special case hack -- whenever **argv == '-'
* (i.e. '-su' or '-sh') always invoke the shell */
if (**argv == '-' && *(*argv+1)!= '-') {
exit(((*(shell_main)) (argc, argv)));
}
#endif
/* Do a binary search to find the applet entry given the name. */
search_applet.name = applet_name;
applet = bsearch(&search_applet, applets, NUM_APPLETS,
sizeof(struct BB_applet), applet_name_compare);
if (applet != NULL) {
if (applet->usage && argv[1] && strcmp(argv[1], "--help") == 0)
usage(applet->usage);
exit((*(applet->main)) (argc, argv));
}
return(busybox_main(argc, argv));
}
int busybox_main(int argc, char **argv)
{
int col = 0, len, i;
argc--; argc--;
/* If we've already been here once, exit now */ /* If we've already been here once, exit now */

View File

@ -89,7 +89,37 @@ int main(int argc, char **argv)
{ {
struct BB_applet search_applet, *applet; struct BB_applet search_applet, *applet;
const char *s; const char *s;
applet_name = "busybox";
for (s = applet_name = argv[0]; *s != '\0';) {
if (*s++ == '/')
applet_name = s;
}
#ifdef BB_SH
/* Add in a special case hack -- whenever **argv == '-'
* (i.e. '-su' or '-sh') always invoke the shell */
if (**argv == '-' && *(*argv+1)!= '-') {
exit(((*(shell_main)) (argc, argv)));
}
#endif
/* Do a binary search to find the applet entry given the name. */
search_applet.name = applet_name;
applet = bsearch(&search_applet, applets, NUM_APPLETS,
sizeof(struct BB_applet), applet_name_compare);
if (applet != NULL) {
if (applet->usage && argv[1] && strcmp(argv[1], "--help") == 0)
usage(applet->usage);
exit((*(applet->main)) (argc, argv));
}
error_msg_and_die("applet not found\n");
}
int busybox_main(int argc, char **argv)
{
int col = 0, len, i;
#ifdef BB_FEATURE_INSTALLER #ifdef BB_FEATURE_INSTALLER
/* /*
@ -121,37 +151,6 @@ int main(int argc, char **argv)
} }
#endif /* BB_FEATURE_INSTALLER */ #endif /* BB_FEATURE_INSTALLER */
for (s = applet_name = argv[0]; *s != '\0';) {
if (*s++ == '/')
applet_name = s;
}
#ifdef BB_SH
/* Add in a special case hack -- whenever **argv == '-'
* (i.e. '-su' or '-sh') always invoke the shell */
if (**argv == '-' && *(*argv+1)!= '-') {
exit(((*(shell_main)) (argc, argv)));
}
#endif
/* Do a binary search to find the applet entry given the name. */
search_applet.name = applet_name;
applet = bsearch(&search_applet, applets, NUM_APPLETS,
sizeof(struct BB_applet), applet_name_compare);
if (applet != NULL) {
if (applet->usage && argv[1] && strcmp(argv[1], "--help") == 0)
usage(applet->usage);
exit((*(applet->main)) (argc, argv));
}
return(busybox_main(argc, argv));
}
int busybox_main(int argc, char **argv)
{
int col = 0, len, i;
argc--; argc--;
/* If we've already been here once, exit now */ /* If we've already been here once, exit now */

View File

@ -171,6 +171,8 @@ static unsigned short column = 0;
static unsigned short terminal_width; static unsigned short terminal_width;
static unsigned short column_width; static unsigned short column_width;
static unsigned short tabstops; static unsigned short tabstops;
#else
# define column_width COLUMN_WIDTH
#endif #endif
static int status = EXIT_SUCCESS; static int status = EXIT_SUCCESS;
@ -429,8 +431,10 @@ void showfiles(struct dnode **dn, int nfiles)
; ;
if (column_width < len) column_width= len; if (column_width < len) column_width= len;
} }
#endif
ncols= (int)(terminal_width / (column_width + COLUMN_GAP)); ncols= (int)(terminal_width / (column_width + COLUMN_GAP));
#else
ncols= TERMINAL_WIDTH;
#endif
switch (style_fmt) { switch (style_fmt) {
case STYLE_LONG: /* one record per line, extended info */ case STYLE_LONG: /* one record per line, extended info */
case STYLE_SINGLE: /* one record per line */ case STYLE_SINGLE: /* one record per line */

View File

@ -78,7 +78,7 @@
#ifndef MODUTILS_MODULE_H #ifndef MODUTILS_MODULE_H
static const int MODUTILS_MODULE_H = 1; static const int MODUTILS_MODULE_H = 1;
#ident "$Id: insmod.c,v 1.37 2001/01/24 19:07:09 andersen Exp $" #ident "$Id: insmod.c,v 1.38 2001/01/24 23:34:48 andersen Exp $"
/* This file contains the structures used by the 2.0 and 2.1 kernels. /* This file contains the structures used by the 2.0 and 2.1 kernels.
We do not use the kernel headers directly because we do not wish We do not use the kernel headers directly because we do not wish
@ -284,7 +284,7 @@ int delete_module(const char *);
#ifndef MODUTILS_OBJ_H #ifndef MODUTILS_OBJ_H
static const int MODUTILS_OBJ_H = 1; static const int MODUTILS_OBJ_H = 1;
#ident "$Id: insmod.c,v 1.37 2001/01/24 19:07:09 andersen Exp $" #ident "$Id: insmod.c,v 1.38 2001/01/24 23:34:48 andersen Exp $"
/* The relocatable object is manipulated using elfin types. */ /* The relocatable object is manipulated using elfin types. */
@ -519,10 +519,6 @@ int arch_init_module (struct obj_file *f, struct new_module *);
#define _PATH_MODULES "/lib/modules" #define _PATH_MODULES "/lib/modules"
static const int STRVERSIONLEN = 32; static const int STRVERSIONLEN = 32;
#if !defined(BB_FEATURE_INSMOD_NEW_KERNEL) && !defined(BB_FEATURE_INSMOD_OLD_KERNEL)
#error "Must have ether BB_FEATURE_INSMOD_NEW_KERNEL or BB_FEATURE_INSMOD_OLD_KERNEL defined"
#endif
/*======================================================================*/ /*======================================================================*/
int flag_force_load = 0; int flag_force_load = 0;
@ -615,7 +611,7 @@ extern int delete_module(const char *);
-- Bryan Rittmeyer <bryan@ixiacom.com> */ -- Bryan Rittmeyer <bryan@ixiacom.com> */
#ifdef BB_FEATURE_INSMOD_OLD_KERNEL #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
_syscall1(int, get_kernel_syms, struct old_kernel_sym *, ks) _syscall1(int, get_kernel_syms, struct old_kernel_sym *, ks)
#endif #endif
@ -1549,7 +1545,7 @@ old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
#ifdef BB_FEATURE_INSMOD_OLD_KERNEL #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
/* Fetch all the symbols and divvy them up as appropriate for the modules. */ /* Fetch all the symbols and divvy them up as appropriate for the modules. */
@ -1757,7 +1753,7 @@ old_init_module(const char *m_name, struct obj_file *f,
#define old_create_mod_use_count(x) TRUE #define old_create_mod_use_count(x) TRUE
#define old_init_module(x, y, z) TRUE #define old_init_module(x, y, z) TRUE
#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ #endif /* BB_FEATURE_OLD_MODULE_INTERFACE */
@ -2036,7 +2032,7 @@ new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
#ifdef BB_FEATURE_INSMOD_NEW_KERNEL #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
/* Fetch the loaded modules, and all currently exported symbols. */ /* Fetch the loaded modules, and all currently exported symbols. */
@ -2310,7 +2306,7 @@ new_init_module(const char *m_name, struct obj_file *f,
#define new_create_module_ksymtab(x) #define new_create_module_ksymtab(x)
#define query_module(v, w, x, y, z) -1 #define query_module(v, w, x, y, z) -1
#endif /* BB_FEATURE_INSMOD_NEW_KERNEL */ #endif /* BB_FEATURE_NEW_MODULE_INTERFACE */
/*======================================================================*/ /*======================================================================*/
@ -2997,7 +2993,7 @@ extern int insmod_main( int argc, char **argv)
k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL); k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL);
if (k_new_syscalls) { if (k_new_syscalls) {
#ifdef BB_FEATURE_INSMOD_NEW_KERNEL #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
if (!new_get_kernel_symbols()) if (!new_get_kernel_symbols())
goto out; goto out;
k_crcs = new_is_kernel_checksummed(); k_crcs = new_is_kernel_checksummed();
@ -3006,7 +3002,7 @@ extern int insmod_main( int argc, char **argv)
goto out; goto out;
#endif #endif
} else { } else {
#ifdef BB_FEATURE_INSMOD_OLD_KERNEL #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
if (!old_get_kernel_symbols(m_name)) if (!old_get_kernel_symbols(m_name))
goto out; goto out;
k_crcs = old_is_kernel_checksummed(); k_crcs = old_is_kernel_checksummed();

6
ls.c
View File

@ -171,6 +171,8 @@ static unsigned short column = 0;
static unsigned short terminal_width; static unsigned short terminal_width;
static unsigned short column_width; static unsigned short column_width;
static unsigned short tabstops; static unsigned short tabstops;
#else
# define column_width COLUMN_WIDTH
#endif #endif
static int status = EXIT_SUCCESS; static int status = EXIT_SUCCESS;
@ -429,8 +431,10 @@ void showfiles(struct dnode **dn, int nfiles)
; ;
if (column_width < len) column_width= len; if (column_width < len) column_width= len;
} }
#endif
ncols= (int)(terminal_width / (column_width + COLUMN_GAP)); ncols= (int)(terminal_width / (column_width + COLUMN_GAP));
#else
ncols= TERMINAL_WIDTH;
#endif
switch (style_fmt) { switch (style_fmt) {
case STYLE_LONG: /* one record per line, extended info */ case STYLE_LONG: /* one record per line, extended info */
case STYLE_SINGLE: /* one record per line */ case STYLE_SINGLE: /* one record per line */

10
lsmod.c
View File

@ -40,11 +40,7 @@
#if !defined(BB_FEATURE_LSMOD_NEW_KERNEL) && !defined(BB_FEATURE_LSMOD_OLD_KERNEL) #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
#error "Must have ether BB_FEATURE_LSMOD_NEW_KERNEL or BB_FEATURE_LSMOD_OLD_KERNEL defined"
#endif
#ifdef BB_FEATURE_LSMOD_NEW_KERNEL
struct module_info struct module_info
{ {
@ -132,7 +128,7 @@ extern int lsmod_main(int argc, char **argv)
return( 0); return( 0);
} }
#else /*BB_FEATURE_LSMOD_OLD_KERNEL*/ #else /*BB_FEATURE_OLD_MODULE_INTERFACE*/
#if ! defined BB_FEATURE_USE_PROCFS #if ! defined BB_FEATURE_USE_PROCFS
#error Sorry, I depend on the /proc filesystem right now. #error Sorry, I depend on the /proc filesystem right now.
@ -157,4 +153,4 @@ extern int lsmod_main(int argc, char **argv)
return 1; return 1;
} }
#endif /*BB_FEATURE_LSMOD_OLD_KERNEL*/ #endif /*BB_FEATURE_OLD_MODULE_INTERFACE*/

View File

@ -78,7 +78,7 @@
#ifndef MODUTILS_MODULE_H #ifndef MODUTILS_MODULE_H
static const int MODUTILS_MODULE_H = 1; static const int MODUTILS_MODULE_H = 1;
#ident "$Id: insmod.c,v 1.37 2001/01/24 19:07:09 andersen Exp $" #ident "$Id: insmod.c,v 1.38 2001/01/24 23:34:48 andersen Exp $"
/* This file contains the structures used by the 2.0 and 2.1 kernels. /* This file contains the structures used by the 2.0 and 2.1 kernels.
We do not use the kernel headers directly because we do not wish We do not use the kernel headers directly because we do not wish
@ -284,7 +284,7 @@ int delete_module(const char *);
#ifndef MODUTILS_OBJ_H #ifndef MODUTILS_OBJ_H
static const int MODUTILS_OBJ_H = 1; static const int MODUTILS_OBJ_H = 1;
#ident "$Id: insmod.c,v 1.37 2001/01/24 19:07:09 andersen Exp $" #ident "$Id: insmod.c,v 1.38 2001/01/24 23:34:48 andersen Exp $"
/* The relocatable object is manipulated using elfin types. */ /* The relocatable object is manipulated using elfin types. */
@ -519,10 +519,6 @@ int arch_init_module (struct obj_file *f, struct new_module *);
#define _PATH_MODULES "/lib/modules" #define _PATH_MODULES "/lib/modules"
static const int STRVERSIONLEN = 32; static const int STRVERSIONLEN = 32;
#if !defined(BB_FEATURE_INSMOD_NEW_KERNEL) && !defined(BB_FEATURE_INSMOD_OLD_KERNEL)
#error "Must have ether BB_FEATURE_INSMOD_NEW_KERNEL or BB_FEATURE_INSMOD_OLD_KERNEL defined"
#endif
/*======================================================================*/ /*======================================================================*/
int flag_force_load = 0; int flag_force_load = 0;
@ -615,7 +611,7 @@ extern int delete_module(const char *);
-- Bryan Rittmeyer <bryan@ixiacom.com> */ -- Bryan Rittmeyer <bryan@ixiacom.com> */
#ifdef BB_FEATURE_INSMOD_OLD_KERNEL #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
_syscall1(int, get_kernel_syms, struct old_kernel_sym *, ks) _syscall1(int, get_kernel_syms, struct old_kernel_sym *, ks)
#endif #endif
@ -1549,7 +1545,7 @@ old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
#ifdef BB_FEATURE_INSMOD_OLD_KERNEL #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
/* Fetch all the symbols and divvy them up as appropriate for the modules. */ /* Fetch all the symbols and divvy them up as appropriate for the modules. */
@ -1757,7 +1753,7 @@ old_init_module(const char *m_name, struct obj_file *f,
#define old_create_mod_use_count(x) TRUE #define old_create_mod_use_count(x) TRUE
#define old_init_module(x, y, z) TRUE #define old_init_module(x, y, z) TRUE
#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ #endif /* BB_FEATURE_OLD_MODULE_INTERFACE */
@ -2036,7 +2032,7 @@ new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
#ifdef BB_FEATURE_INSMOD_NEW_KERNEL #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
/* Fetch the loaded modules, and all currently exported symbols. */ /* Fetch the loaded modules, and all currently exported symbols. */
@ -2310,7 +2306,7 @@ new_init_module(const char *m_name, struct obj_file *f,
#define new_create_module_ksymtab(x) #define new_create_module_ksymtab(x)
#define query_module(v, w, x, y, z) -1 #define query_module(v, w, x, y, z) -1
#endif /* BB_FEATURE_INSMOD_NEW_KERNEL */ #endif /* BB_FEATURE_NEW_MODULE_INTERFACE */
/*======================================================================*/ /*======================================================================*/
@ -2997,7 +2993,7 @@ extern int insmod_main( int argc, char **argv)
k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL); k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL);
if (k_new_syscalls) { if (k_new_syscalls) {
#ifdef BB_FEATURE_INSMOD_NEW_KERNEL #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
if (!new_get_kernel_symbols()) if (!new_get_kernel_symbols())
goto out; goto out;
k_crcs = new_is_kernel_checksummed(); k_crcs = new_is_kernel_checksummed();
@ -3006,7 +3002,7 @@ extern int insmod_main( int argc, char **argv)
goto out; goto out;
#endif #endif
} else { } else {
#ifdef BB_FEATURE_INSMOD_OLD_KERNEL #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
if (!old_get_kernel_symbols(m_name)) if (!old_get_kernel_symbols(m_name))
goto out; goto out;
k_crcs = old_is_kernel_checksummed(); k_crcs = old_is_kernel_checksummed();

View File

@ -40,11 +40,7 @@
#if !defined(BB_FEATURE_LSMOD_NEW_KERNEL) && !defined(BB_FEATURE_LSMOD_OLD_KERNEL) #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
#error "Must have ether BB_FEATURE_LSMOD_NEW_KERNEL or BB_FEATURE_LSMOD_OLD_KERNEL defined"
#endif
#ifdef BB_FEATURE_LSMOD_NEW_KERNEL
struct module_info struct module_info
{ {
@ -132,7 +128,7 @@ extern int lsmod_main(int argc, char **argv)
return( 0); return( 0);
} }
#else /*BB_FEATURE_LSMOD_OLD_KERNEL*/ #else /*BB_FEATURE_OLD_MODULE_INTERFACE*/
#if ! defined BB_FEATURE_USE_PROCFS #if ! defined BB_FEATURE_USE_PROCFS
#error Sorry, I depend on the /proc filesystem right now. #error Sorry, I depend on the /proc filesystem right now.
@ -157,4 +153,4 @@ extern int lsmod_main(int argc, char **argv)
return 1; return 1;
} }
#endif /*BB_FEATURE_LSMOD_OLD_KERNEL*/ #endif /*BB_FEATURE_OLD_MODULE_INTERFACE*/

Binary file not shown.

View File

@ -137,7 +137,7 @@ extern void perror_msg_and_die(const char *s, ...)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
#if defined BB_INIT || defined BB_MKSWAP || defined BB_MOUNT #if defined BB_INIT || defined BB_MKSWAP || defined BB_MOUNT || defined BB_NFSMOUNT
/* Returns kernel version encoded as major*65536 + minor*256 + patch, /* Returns kernel version encoded as major*65536 + minor*256 + patch,
* so, for example, to check if the kernel is greater than 2.2.11: * so, for example, to check if the kernel is greater than 2.2.11:
* if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> } * if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> }
@ -1386,7 +1386,7 @@ extern void *xcalloc(size_t nmemb, size_t size)
} }
#endif #endif
#if defined BB_FEATURE_NFSMOUNT || defined BB_LS || defined BB_SH || defined BB_WGET #if defined BB_NFSMOUNT || defined BB_LS || defined BB_SH || defined BB_WGET
# ifndef DMALLOC # ifndef DMALLOC
extern char * xstrdup (const char *s) { extern char * xstrdup (const char *s) {
char *t; char *t;
@ -1404,7 +1404,7 @@ extern char * xstrdup (const char *s) {
# endif # endif
#endif #endif
#if defined BB_FEATURE_NFSMOUNT #if defined BB_NFSMOUNT
extern char * xstrndup (const char *s, int n) { extern char * xstrndup (const char *s, int n) {
char *t; char *t;