#49: I found one memory overflow and memory leak in "ln" applet. Last patch reduced also 54 bytes. ;) #50: I found bug in loginutils/Makefile.in. New patch have also new function to libbb and aplied this to applets and other cosmetic changes.
This commit is contained in:
parent
88947dd05e
commit
d378c3149c
2
Makefile
2
Makefile
@ -47,7 +47,7 @@ endif
|
|||||||
|
|
||||||
|
|
||||||
busybox: depend $(libraries-y)
|
busybox: depend $(libraries-y)
|
||||||
$(CC) $(LDFLAGS) $(libraries-y) $(LIBRARIES) -o $@
|
$(CC) $(LDFLAGS) -o $@ $(libraries-y) $(LIBRARIES)
|
||||||
$(STRIPCMD) $@
|
$(STRIPCMD) $@
|
||||||
|
|
||||||
busybox.links: applets/busybox.mkll
|
busybox.links: applets/busybox.mkll
|
||||||
|
@ -119,8 +119,7 @@ static int gunzip_file (const char *path, int flags)
|
|||||||
} else {
|
} else {
|
||||||
error_msg_and_die("Invalid extension");
|
error_msg_and_die("Invalid extension");
|
||||||
}
|
}
|
||||||
out_path = (char *) xcalloc(sizeof(char), length + 1);
|
out_path = xstrndup(path, length);
|
||||||
strncpy(out_path, path, length);
|
|
||||||
|
|
||||||
/* Open output file */
|
/* Open output file */
|
||||||
out_file = xfopen(out_path, "w");
|
out_file = xfopen(out_path, "w");
|
||||||
|
@ -91,8 +91,7 @@ file_header_t *get_header_ar(FILE *src_stream)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* short filenames */
|
/* short filenames */
|
||||||
typed->name = xcalloc(1, 16);
|
typed->name = xstrndup(ar.formated.name, 16);
|
||||||
strncpy(typed->name, ar.formated.name, 16);
|
|
||||||
}
|
}
|
||||||
typed->name[strcspn(typed->name, " /")]='\0';
|
typed->name[strcspn(typed->name, " /")]='\0';
|
||||||
|
|
||||||
|
@ -58,9 +58,7 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f
|
|||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
full_name = xmalloc(strlen(prefix) + strlen(path) + 1);
|
bb_asprintf(&full_name, "%s%s", prefix, path);
|
||||||
strcpy(full_name, prefix);
|
|
||||||
strcat(full_name, path);
|
|
||||||
} else {
|
} else {
|
||||||
full_name = file_entry->name;
|
full_name = file_entry->name;
|
||||||
}
|
}
|
||||||
|
@ -146,12 +146,8 @@ static int null (VALUE *v)
|
|||||||
|
|
||||||
static void tostring (VALUE *v)
|
static void tostring (VALUE *v)
|
||||||
{
|
{
|
||||||
char *temp;
|
|
||||||
|
|
||||||
if (v->type == integer) {
|
if (v->type == integer) {
|
||||||
temp = xmalloc (4 * (sizeof (int) / sizeof (char)));
|
bb_asprintf (&(v->u.s), "%d", v->u.i);
|
||||||
sprintf (temp, "%d", v->u.i);
|
|
||||||
v->u.s = temp;
|
|
||||||
v->type = string;
|
v->type = string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -377,9 +373,7 @@ static VALUE *eval6 (void)
|
|||||||
else {
|
else {
|
||||||
v = xmalloc (sizeof(VALUE));
|
v = xmalloc (sizeof(VALUE));
|
||||||
v->type = string;
|
v->type = string;
|
||||||
v->u.s = strncpy ((char *) xmalloc (i2->u.i + 1),
|
v->u.s = xstrndup(l->u.s + i1->u.i - 1, i2->u.i);
|
||||||
l->u.s + i1->u.i - 1, i2->u.i);
|
|
||||||
v->u.s[i2->u.i] = 0;
|
|
||||||
}
|
}
|
||||||
freev (l);
|
freev (l);
|
||||||
freev (i1);
|
freev (i1);
|
||||||
|
@ -43,45 +43,47 @@ static int fs_link(const char *link_destname, const char *link_srcname,
|
|||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
int src_is_dir;
|
int src_is_dir;
|
||||||
char *src_name;
|
char *src_name = 0;
|
||||||
|
const char *src;
|
||||||
|
|
||||||
if (link_destname==NULL)
|
if (link_destname==NULL)
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
|
|
||||||
src_name = (char *) xmalloc(strlen(link_srcname)+strlen(link_destname)+1);
|
|
||||||
|
|
||||||
if (link_srcname==NULL)
|
if (link_srcname==NULL)
|
||||||
strcpy(src_name, link_destname);
|
src = link_destname;
|
||||||
else
|
else
|
||||||
strcpy(src_name, link_srcname);
|
src = link_srcname;
|
||||||
|
|
||||||
if (flag&LN_NODEREFERENCE)
|
if (flag&LN_NODEREFERENCE)
|
||||||
src_is_dir = is_directory(src_name, TRUE, NULL);
|
src_is_dir = is_directory(src, TRUE, NULL);
|
||||||
else
|
else
|
||||||
src_is_dir = is_directory(src_name, FALSE, NULL);
|
src_is_dir = is_directory(src, FALSE, NULL);
|
||||||
|
|
||||||
if ((src_is_dir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) {
|
if ((src_is_dir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) {
|
||||||
char* srcdir_name;
|
char* srcdir_name;
|
||||||
|
|
||||||
srcdir_name = xstrdup(link_destname);
|
srcdir_name = xstrdup(link_destname);
|
||||||
strcat(src_name, "/");
|
src_name = concat_path_file(src, get_last_path_component(srcdir_name));
|
||||||
strcat(src_name, get_last_path_component(srcdir_name));
|
src = src_name;
|
||||||
free(srcdir_name);
|
free(srcdir_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag&LN_FORCE)
|
if (flag&LN_FORCE)
|
||||||
unlink(src_name);
|
unlink(src);
|
||||||
|
|
||||||
if (flag&LN_SYMLINK)
|
if (flag&LN_SYMLINK)
|
||||||
status = symlink(link_destname, src_name);
|
status = symlink(link_destname, src);
|
||||||
else
|
else
|
||||||
status = link(link_destname, src_name);
|
status = link(link_destname, src);
|
||||||
|
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
perror_msg(src_name);
|
perror_msg(src);
|
||||||
return(FALSE);
|
status = FALSE;
|
||||||
|
} else {
|
||||||
|
status = TRUE;
|
||||||
}
|
}
|
||||||
return(TRUE);
|
free(src_name);
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int ln_main(int argc, char **argv)
|
extern int ln_main(int argc, char **argv)
|
||||||
|
@ -321,6 +321,8 @@ void reset_ino_dev_hashtable(void);
|
|||||||
extern size_t xstrlen(const char *string);
|
extern size_t xstrlen(const char *string);
|
||||||
#define strlen(x) xstrlen(x)
|
#define strlen(x) xstrlen(x)
|
||||||
|
|
||||||
|
void bb_asprintf(char **string_ptr, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
|
||||||
|
|
||||||
|
|
||||||
#define FAIL_DELAY 3
|
#define FAIL_DELAY 3
|
||||||
extern void change_identity ( const struct passwd *pw );
|
extern void change_identity ( const struct passwd *pw );
|
||||||
|
@ -41,7 +41,7 @@ LIBBB_SRC:= \
|
|||||||
simplify_path.c inet_common.c inode_hash.c obscure.c pwd2spwd.c xfuncs.c \
|
simplify_path.c inet_common.c inode_hash.c obscure.c pwd2spwd.c xfuncs.c \
|
||||||
correct_password.c change_identity.c setup_environment.c run_shell.c \
|
correct_password.c change_identity.c setup_environment.c run_shell.c \
|
||||||
pw_encrypt.c restricted_shell.c xgethostbyname2.c create_icmp6_socket.c \
|
pw_encrypt.c restricted_shell.c xgethostbyname2.c create_icmp6_socket.c \
|
||||||
xconnect.c
|
xconnect.c bb_asprintf.c
|
||||||
|
|
||||||
LIBBB_OBJS=$(patsubst %.c,$(LIBBB_DIR)%.o, $(LIBBB_SRC))
|
LIBBB_OBJS=$(patsubst %.c,$(LIBBB_DIR)%.o, $(LIBBB_SRC))
|
||||||
|
|
||||||
|
@ -38,8 +38,7 @@ extern char *concat_path_file(const char *path, const char *filename)
|
|||||||
lc = last_char_is(path, '/');
|
lc = last_char_is(path, '/');
|
||||||
while (*filename == '/')
|
while (*filename == '/')
|
||||||
filename++;
|
filename++;
|
||||||
outbuf = xmalloc(strlen(path)+strlen(filename)+1+(lc==NULL));
|
bb_asprintf(&outbuf, "%s%s%s", path, (lc==NULL)? "/" : "", filename);
|
||||||
sprintf(outbuf, "%s%s%s", path, (lc==NULL)? "/" : "", filename);
|
|
||||||
|
|
||||||
return outbuf;
|
return outbuf;
|
||||||
}
|
}
|
||||||
|
@ -60,9 +60,8 @@ void run_shell ( const char *shell, int loginshell, const char *command, const c
|
|||||||
args [0] = get_last_path_component ( xstrdup ( shell ));
|
args [0] = get_last_path_component ( xstrdup ( shell ));
|
||||||
|
|
||||||
if ( loginshell ) {
|
if ( loginshell ) {
|
||||||
char *args0 = xmalloc ( xstrlen ( args [0] ) + 2 );
|
char *args0;
|
||||||
args0 [0] = '-';
|
bb_asprintf ( &args0, "-%s", args [0] );
|
||||||
strcpy ( args0 + 1, args [0] );
|
|
||||||
args [0] = args0;
|
args [0] = args0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "inet_common.h"
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -24,7 +24,7 @@ extern char *xreadlink(const char *path)
|
|||||||
buf = xrealloc(buf, bufsize += GROWBY);
|
buf = xrealloc(buf, bufsize += GROWBY);
|
||||||
readsize = readlink(path, buf, bufsize); /* 1st try */
|
readsize = readlink(path, buf, bufsize); /* 1st try */
|
||||||
if (readsize == -1) {
|
if (readsize == -1) {
|
||||||
perror_msg("%s:%s", applet_name, path);
|
perror_msg("%s", path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -34,4 +34,3 @@ extern char *xreadlink(const char *path)
|
|||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ needcrypt-$(CONFIG_LOGIN) := y
|
|||||||
needcrypt-$(CONFIG_SU) := y
|
needcrypt-$(CONFIG_SU) := y
|
||||||
|
|
||||||
ifeq ($(needcrypt-y),y)
|
ifeq ($(needcrypt-y),y)
|
||||||
libraries-y +=-lcrypt
|
LIBRARIES += -lcrypt
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(LOGINUTILS_DIR)$(LOGINUTILS_AR): $(patsubst %,$(LOGINUTILS_DIR)%, $(LOGINUTILS-y))
|
$(LOGINUTILS_DIR)$(LOGINUTILS_AR): $(patsubst %,$(LOGINUTILS_DIR)%, $(LOGINUTILS-y))
|
||||||
|
@ -232,7 +232,7 @@ static void termio_final(struct options *op, struct termio *tp,
|
|||||||
struct chardata *cp);
|
struct chardata *cp);
|
||||||
static int caps_lock(const char *s);
|
static int caps_lock(const char *s);
|
||||||
static int bcode(const char *s);
|
static int bcode(const char *s);
|
||||||
static void error(const char *fmt, ...);
|
static void error(const char *fmt, ...) __attribute__ ((noreturn));
|
||||||
|
|
||||||
/* The following is used for understandable diagnostics. */
|
/* The following is used for understandable diagnostics. */
|
||||||
|
|
||||||
@ -299,8 +299,7 @@ int getty_main(int argc, char **argv)
|
|||||||
int iv;
|
int iv;
|
||||||
|
|
||||||
iv = getpid();
|
iv = getpid();
|
||||||
if (ioctl(0, TIOCSPGRP, &iv) < 0)
|
ioctl(0, TIOCSPGRP, &iv);
|
||||||
perror_msg("ioctl() TIOCSPGRP call failed");
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Initialize the termio settings (raw mode, eight-bit, blocking i/o). */
|
/* Initialize the termio settings (raw mode, eight-bit, blocking i/o). */
|
||||||
@ -368,7 +367,6 @@ int getty_main(int argc, char **argv)
|
|||||||
|
|
||||||
(void) execl(options.login, options.login, "--", logname, (char *) 0);
|
(void) execl(options.login, options.login, "--", logname, (char *) 0);
|
||||||
error("%s: can't exec %s: %m", options.tty, options.login);
|
error("%s: can't exec %s: %m", options.tty, options.login);
|
||||||
return (0); /* quiet GCC */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse-args - parse command-line arguments */
|
/* parse-args - parse command-line arguments */
|
||||||
@ -382,10 +380,9 @@ static void parse_args(int argc, char **argv, struct options *op)
|
|||||||
while (isascii(c = getopt(argc, argv, "I:LH:f:hil:mt:wn"))) {
|
while (isascii(c = getopt(argc, argv, "I:LH:f:hil:mt:wn"))) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'I':
|
case 'I':
|
||||||
if (!(op->initstring = strdup(optarg))) {
|
if (!(op->initstring = strdup(optarg)))
|
||||||
error("can't malloc initstring");
|
error("can't malloc initstring");
|
||||||
break;
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
char ch, *p, *q;
|
char ch, *p, *q;
|
||||||
int i;
|
int i;
|
||||||
|
@ -173,7 +173,7 @@ extern int passwd_main(int argc, char **argv)
|
|||||||
ruid = getuid();
|
ruid = getuid();
|
||||||
pw = (struct passwd *) getpwuid(ruid);
|
pw = (struct passwd *) getpwuid(ruid);
|
||||||
if (!pw) {
|
if (!pw) {
|
||||||
error_msg_and_die("Cannot determine your user name.\n");
|
error_msg_and_die("Cannot determine your user name.");
|
||||||
}
|
}
|
||||||
myname = (char *) xstrdup(pw->pw_name);
|
myname = (char *) xstrdup(pw->pw_name);
|
||||||
if (optind < argc) {
|
if (optind < argc) {
|
||||||
|
@ -233,7 +233,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.87 2002/07/02 19:14:23 andersen Exp $"
|
#ident "$Id: insmod.c,v 1.88 2002/07/19 00:05:48 sandman 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
|
||||||
@ -454,7 +454,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.87 2002/07/02 19:14:23 andersen Exp $"
|
#ident "$Id: insmod.c,v 1.88 2002/07/19 00:05:48 sandman Exp $"
|
||||||
|
|
||||||
/* The relocatable object is manipulated using elfin types. */
|
/* The relocatable object is manipulated using elfin types. */
|
||||||
|
|
||||||
@ -740,7 +740,7 @@ static int n_ext_modules_used;
|
|||||||
extern int delete_module(const char *);
|
extern int delete_module(const char *);
|
||||||
|
|
||||||
static char *m_filename;
|
static char *m_filename;
|
||||||
static char m_fullName[FILENAME_MAX];
|
static char *m_fullName;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -3503,10 +3503,8 @@ extern int insmod_main( int argc, char **argv)
|
|||||||
tmp[len] = '\0';
|
tmp[len] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len > (sizeof(m_fullName)-3))
|
bb_asprintf(&m_fullName, "%s.o", tmp, ".o");
|
||||||
error_msg_and_die("%s: module name too long", tmp);
|
|
||||||
|
|
||||||
strcat(strcpy(m_fullName, tmp), ".o");
|
|
||||||
if (!m_name) {
|
if (!m_name) {
|
||||||
m_name = tmp;
|
m_name = tmp;
|
||||||
} else {
|
} else {
|
||||||
@ -3522,25 +3520,32 @@ extern int insmod_main( int argc, char **argv)
|
|||||||
/* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
|
/* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
|
||||||
* but do not error out yet if we fail to find it... */
|
* but do not error out yet if we fail to find it... */
|
||||||
if (uname(&myuname) == 0) {
|
if (uname(&myuname) == 0) {
|
||||||
char module_dir[FILENAME_MAX];
|
char *module_dir;
|
||||||
|
char *tmdn;
|
||||||
char real_module_dir[FILENAME_MAX];
|
char real_module_dir[FILENAME_MAX];
|
||||||
snprintf (module_dir, sizeof(module_dir), "%s/%s",
|
|
||||||
_PATH_MODULES, myuname.release);
|
tmdn = concat_path_file(_PATH_MODULES, myuname.release);
|
||||||
/* Jump through hoops in case /lib/modules/`uname -r`
|
/* Jump through hoops in case /lib/modules/`uname -r`
|
||||||
* is a symlink. We do not want recursive_action to
|
* is a symlink. We do not want recursive_action to
|
||||||
* follow symlinks, but we do want to follow the
|
* follow symlinks, but we do want to follow the
|
||||||
* /lib/modules/`uname -r` dir, So resolve it ourselves
|
* /lib/modules/`uname -r` dir, So resolve it ourselves
|
||||||
* if it is a link... */
|
* if it is a link... */
|
||||||
if (realpath (module_dir, real_module_dir) == NULL)
|
if (realpath (tmdn, real_module_dir) == NULL)
|
||||||
strcpy(real_module_dir, module_dir);
|
module_dir = tmdn;
|
||||||
recursive_action(real_module_dir, TRUE, FALSE, FALSE,
|
else
|
||||||
|
module_dir = real_module_dir;
|
||||||
|
recursive_action(module_dir, TRUE, FALSE, FALSE,
|
||||||
check_module_name_match, 0, m_fullName);
|
check_module_name_match, 0, m_fullName);
|
||||||
|
free(tmdn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we have found anything yet */
|
/* Check if we have found anything yet */
|
||||||
if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL))
|
if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL))
|
||||||
{
|
{
|
||||||
char module_dir[FILENAME_MAX];
|
char module_dir[FILENAME_MAX];
|
||||||
|
|
||||||
|
free(m_filename);
|
||||||
|
m_filename = 0;
|
||||||
if (realpath (_PATH_MODULES, module_dir) == NULL)
|
if (realpath (_PATH_MODULES, module_dir) == NULL)
|
||||||
strcpy(module_dir, _PATH_MODULES);
|
strcpy(module_dir, _PATH_MODULES);
|
||||||
/* No module found under /lib/modules/`uname -r`, this
|
/* No module found under /lib/modules/`uname -r`, this
|
||||||
|
@ -611,8 +611,7 @@ static char **username_tab_completion(char *ud, int *num_matches)
|
|||||||
/* Null usernames should result in all users as possible completions. */
|
/* Null usernames should result in all users as possible completions. */
|
||||||
if ( /*!userlen || */ !strncmp(ud, entry->pw_name, userlen)) {
|
if ( /*!userlen || */ !strncmp(ud, entry->pw_name, userlen)) {
|
||||||
|
|
||||||
temp = xmalloc(3 + strlen(entry->pw_name));
|
bb_asprintf(&temp, "~%s/", entry->pw_name);
|
||||||
sprintf(temp, "~%s/", entry->pw_name);
|
|
||||||
matches = xrealloc(matches, (nm + 1) * sizeof(char *));
|
matches = xrealloc(matches, (nm + 1) * sizeof(char *));
|
||||||
|
|
||||||
matches[nm++] = temp;
|
matches[nm++] = temp;
|
||||||
|
@ -96,9 +96,7 @@ const char *normalize(const char *arg)
|
|||||||
free(BUFFER);
|
free(BUFFER);
|
||||||
|
|
||||||
if (!quote) { /* Just copy arg */
|
if (!quote) { /* Just copy arg */
|
||||||
BUFFER=xmalloc(strlen(arg)+1);
|
BUFFER=xstrdup(arg);
|
||||||
|
|
||||||
strcpy(BUFFER,arg);
|
|
||||||
return BUFFER;
|
return BUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +202,6 @@ static const int LONG_OPTIONS_INCR = 10;
|
|||||||
/* Register a long option. The contents of name is copied. */
|
/* Register a long option. The contents of name is copied. */
|
||||||
void add_longopt(const char *name,int has_arg)
|
void add_longopt(const char *name,int has_arg)
|
||||||
{
|
{
|
||||||
char *tmp;
|
|
||||||
if (!name) { /* init */
|
if (!name) { /* init */
|
||||||
free(long_options);
|
free(long_options);
|
||||||
long_options=NULL;
|
long_options=NULL;
|
||||||
@ -228,9 +225,7 @@ void add_longopt(const char *name,int has_arg)
|
|||||||
long_options[long_options_nr-1].has_arg=has_arg;
|
long_options[long_options_nr-1].has_arg=has_arg;
|
||||||
long_options[long_options_nr-1].flag=NULL;
|
long_options[long_options_nr-1].flag=NULL;
|
||||||
long_options[long_options_nr-1].val=LONG_OPT;
|
long_options[long_options_nr-1].val=LONG_OPT;
|
||||||
tmp = xmalloc(strlen(name)+1);
|
long_options[long_options_nr-1].name=xstrdup(name);
|
||||||
strcpy(tmp,name);
|
|
||||||
long_options[long_options_nr-1].name=tmp;
|
|
||||||
}
|
}
|
||||||
long_options_nr++;
|
long_options_nr++;
|
||||||
}
|
}
|
||||||
@ -326,7 +321,7 @@ int getopt_main(int argc, char *argv[])
|
|||||||
/* For some reason, the original getopt gave no error
|
/* For some reason, the original getopt gave no error
|
||||||
when there were no arguments. */
|
when there were no arguments. */
|
||||||
printf(" --\n");
|
printf(" --\n");
|
||||||
exit(0);
|
return 0;
|
||||||
} else
|
} else
|
||||||
error_msg_and_die("missing optstring argument");
|
error_msg_and_die("missing optstring argument");
|
||||||
}
|
}
|
||||||
@ -336,7 +331,7 @@ int getopt_main(int argc, char *argv[])
|
|||||||
optstr=xmalloc(strlen(argv[1])+1);
|
optstr=xmalloc(strlen(argv[1])+1);
|
||||||
strcpy(optstr,argv[1]+strspn(argv[1],"-+"));
|
strcpy(optstr,argv[1]+strspn(argv[1],"-+"));
|
||||||
argv[1]=argv[0];
|
argv[1]=argv[0];
|
||||||
exit(generate_output(argv+1,argc-1,optstr,long_options));
|
return (generate_output(argv+1,argc-1,optstr,long_options));
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((opt=getopt_long(argc,argv,shortopts,longopts,NULL)) != EOF)
|
while ((opt=getopt_long(argc,argv,shortopts,longopts,NULL)) != EOF)
|
||||||
@ -347,8 +342,7 @@ int getopt_main(int argc, char *argv[])
|
|||||||
case 'o':
|
case 'o':
|
||||||
if (optstr)
|
if (optstr)
|
||||||
free(optstr);
|
free(optstr);
|
||||||
optstr=xmalloc(strlen(optarg)+1);
|
optstr=xstrdup(optarg);
|
||||||
strcpy(optstr,optarg);
|
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
add_long_options(optarg);
|
add_long_options(optarg);
|
||||||
@ -356,8 +350,7 @@ int getopt_main(int argc, char *argv[])
|
|||||||
case 'n':
|
case 'n':
|
||||||
if (name)
|
if (name)
|
||||||
free(name);
|
free(name);
|
||||||
name=xmalloc(strlen(optarg)+1);
|
name=xstrdup(optarg);
|
||||||
strcpy(name,optarg);
|
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
quiet_errors=1;
|
quiet_errors=1;
|
||||||
@ -369,7 +362,7 @@ int getopt_main(int argc, char *argv[])
|
|||||||
set_shell(optarg);
|
set_shell(optarg);
|
||||||
break;
|
break;
|
||||||
case 'T':
|
case 'T':
|
||||||
exit(4);
|
return 4;
|
||||||
case 'u':
|
case 'u':
|
||||||
quote=0;
|
quote=0;
|
||||||
break;
|
break;
|
||||||
@ -381,8 +374,7 @@ int getopt_main(int argc, char *argv[])
|
|||||||
if (optind >= argc)
|
if (optind >= argc)
|
||||||
error_msg_and_die("missing optstring argument");
|
error_msg_and_die("missing optstring argument");
|
||||||
else {
|
else {
|
||||||
optstr=xmalloc(strlen(argv[optind])+1);
|
optstr=xstrdup(argv[optind]);
|
||||||
strcpy(optstr,argv[optind]);
|
|
||||||
optind++;
|
optind++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -390,7 +382,7 @@ int getopt_main(int argc, char *argv[])
|
|||||||
argv[optind-1]=name;
|
argv[optind-1]=name;
|
||||||
else
|
else
|
||||||
argv[optind-1]=argv[0];
|
argv[optind-1]=argv[0];
|
||||||
exit(generate_output(argv+optind-1,argc-optind+1,optstr,long_options));
|
return (generate_output(argv+optind-1,argc-optind+1,optstr,long_options));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user