Some accrued fixes/updates.
* cp/mv now accepts (and ignores) the -f flag, since it always does force anyway * tail can now accept -<num> commands (e.g. -10) for better compatibility with the standard tail command * added a simple id implementation; doesn't support supp. groups yet
This commit is contained in:
parent
28c49b6c9c
commit
94f5e0ba7c
@ -2,6 +2,7 @@
|
|||||||
* added the -v option (inverted search) to grep,
|
* added the -v option (inverted search) to grep,
|
||||||
updated docs/busybox.pod accordingly. -beppu
|
updated docs/busybox.pod accordingly. -beppu
|
||||||
* Added mktemp, contributed by Daniel Jacobowitz <dan@debian.org>
|
* Added mktemp, contributed by Daniel Jacobowitz <dan@debian.org>
|
||||||
|
* Added setkeycodes, for those that have wierd keyboard buttons.
|
||||||
* Fix for ping warnings from Sascha Ziemann <szi@aibon.ping.de>
|
* Fix for ping warnings from Sascha Ziemann <szi@aibon.ping.de>
|
||||||
* Fixed update segfault
|
* Fixed update segfault
|
||||||
* Fixed mknod -- minor number was always 0
|
* Fixed mknod -- minor number was always 0
|
||||||
@ -9,6 +10,12 @@
|
|||||||
that wanted "tar cf foo.tar foo" (i.e. no "-" before options)
|
that wanted "tar cf foo.tar foo" (i.e. no "-" before options)
|
||||||
I broke creation of tarballs. I reverted the change (so tar needs
|
I broke creation of tarballs. I reverted the change (so tar needs
|
||||||
the "-" for all options).
|
the "-" for all options).
|
||||||
|
* Several contributions from Randolph Chung <tausq@debian.org>.
|
||||||
|
* cp/mv now accepts (and ignores) the -f flag, since it always
|
||||||
|
does force anyway
|
||||||
|
* tail can now accept -<num> commands (e.g. -10) for better
|
||||||
|
compatibility with the standard tail command
|
||||||
|
* added a simple id implementation; doesn't support supp. groups yet
|
||||||
* More doc updates
|
* More doc updates
|
||||||
|
|
||||||
-Erik
|
-Erik
|
||||||
|
2
TODO
2
TODO
@ -4,7 +4,7 @@ or that doing so is even a good idea. It just means that I _might_ get
|
|||||||
around to it some time. If you have any good ideas, please let me know.
|
around to it some time. If you have any good ideas, please let me know.
|
||||||
|
|
||||||
* login/sulogin/passwd/getty/etc are part of tinylogin, and so are not
|
* login/sulogin/passwd/getty/etc are part of tinylogin, and so are not
|
||||||
needed or wanted in busybox (or else I'd have to link in libcrypt).
|
needed or wanted in busybox (or else I'd have to link to libcrypt).
|
||||||
|
|
||||||
* Networking apps are probably going to be split out some time soon into a
|
* Networking apps are probably going to be split out some time soon into a
|
||||||
separate package (named perhaps tiny-netkit?). This currently includes
|
separate package (named perhaps tiny-netkit?). This currently includes
|
||||||
|
@ -134,6 +134,9 @@ static const struct Applet applets[] = {
|
|||||||
#ifdef BB_HOSTNAME
|
#ifdef BB_HOSTNAME
|
||||||
{"hostname", hostname_main, _BB_DIR_BIN},
|
{"hostname", hostname_main, _BB_DIR_BIN},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef BB_ID
|
||||||
|
{"id", id_main, _BB_DIR_USR_BIN},
|
||||||
|
#endif
|
||||||
#ifdef BB_INIT
|
#ifdef BB_INIT
|
||||||
{"init", init_main, _BB_DIR_SBIN},
|
{"init", init_main, _BB_DIR_SBIN},
|
||||||
#endif
|
#endif
|
||||||
|
@ -134,6 +134,9 @@ static const struct Applet applets[] = {
|
|||||||
#ifdef BB_HOSTNAME
|
#ifdef BB_HOSTNAME
|
||||||
{"hostname", hostname_main, _BB_DIR_BIN},
|
{"hostname", hostname_main, _BB_DIR_BIN},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef BB_ID
|
||||||
|
{"id", id_main, _BB_DIR_USR_BIN},
|
||||||
|
#endif
|
||||||
#ifdef BB_INIT
|
#ifdef BB_INIT
|
||||||
{"init", init_main, _BB_DIR_SBIN},
|
{"init", init_main, _BB_DIR_SBIN},
|
||||||
#endif
|
#endif
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#define BB_HEAD
|
#define BB_HEAD
|
||||||
#define BB_HOSTID
|
#define BB_HOSTID
|
||||||
#define BB_HOSTNAME
|
#define BB_HOSTNAME
|
||||||
|
#define BB_ID
|
||||||
#define BB_INIT
|
#define BB_INIT
|
||||||
// Don't bother turning BB_INSMOD on. It doesn't work yet.
|
// Don't bother turning BB_INSMOD on. It doesn't work yet.
|
||||||
//#define BB_INSMOD
|
//#define BB_INSMOD
|
||||||
|
@ -51,6 +51,7 @@ int loadkmap_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
read(0, buff, 7);
|
read(0, buff, 7);
|
||||||
|
printf("buff='%s'\n", buff);
|
||||||
if (0 != strncmp(buff, magic, 7)) {
|
if (0 != strncmp(buff, magic, 7)) {
|
||||||
fprintf(stderr, "This is not a valid binary keymap.\n");
|
fprintf(stderr, "This is not a valid binary keymap.\n");
|
||||||
exit(FALSE);
|
exit(FALSE);
|
||||||
|
92
coreutils/id.c
Normal file
92
coreutils/id.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/* vi: set sw=4 ts=4: */
|
||||||
|
/*
|
||||||
|
* Mini id implementation for busybox
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* 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 "internal.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
static const char id_usage[] =
|
||||||
|
"id [OPTIONS]... [USERNAME]\n\n"
|
||||||
|
"Print information for USERNAME or the current user\n\n"
|
||||||
|
"\t-g\tprints only the group ID\n"
|
||||||
|
"\t-u\tprints only the user ID\n"
|
||||||
|
"\t-r\tprints the real user ID instead of the effective ID (with -ug)\n\n";
|
||||||
|
|
||||||
|
extern int id_main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int no_user = 0, no_group = 0, print_real = 0;
|
||||||
|
char *cp, *user, *group;
|
||||||
|
gid_t gid;
|
||||||
|
|
||||||
|
cp = user = group = NULL;
|
||||||
|
|
||||||
|
argc--; argv++;
|
||||||
|
|
||||||
|
while (argc > 0) {
|
||||||
|
cp = *argv;
|
||||||
|
if (*cp == '-') {
|
||||||
|
switch (*++cp) {
|
||||||
|
case 'u': no_group = 1; break;
|
||||||
|
case 'g': no_user = 1; break;
|
||||||
|
case 'r': print_real = 1; break;
|
||||||
|
default: usage(id_usage);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
user = cp;
|
||||||
|
}
|
||||||
|
argc--; argv++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_user && no_group) usage(id_usage);
|
||||||
|
|
||||||
|
if (user == NULL) {
|
||||||
|
user = xmalloc(9);
|
||||||
|
group = xmalloc(9);
|
||||||
|
if (print_real) {
|
||||||
|
my_getpwuid(user, getuid());
|
||||||
|
my_getgrgid(group, getgid());
|
||||||
|
} else {
|
||||||
|
my_getpwuid(user, geteuid());
|
||||||
|
my_getgrgid(group, getegid());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
group = xmalloc(9);
|
||||||
|
gid = my_getpwnamegid(user);
|
||||||
|
my_getgrgid(group, gid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_group) printf("%u\n", my_getpwnam(user));
|
||||||
|
else if (no_user) printf("%u\n", my_getgrnam(group));
|
||||||
|
else
|
||||||
|
printf("uid=%u(%s) gid=%u(%s)\n",
|
||||||
|
my_getpwnam(user), user, my_getgrnam(group), group);
|
||||||
|
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* END CODE */
|
@ -368,8 +368,10 @@ extern int tail_main(int argc, char **argv)
|
|||||||
case 'h':
|
case 'h':
|
||||||
usage(tail_usage);
|
usage(tail_usage);
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "tail: invalid option -- %c\n", opt);
|
if ((n_units = atoi(&argv[i][1])) < 1) {
|
||||||
usage(tail_usage);
|
fprintf(stderr, "tail: invalid option -- %c\n", opt);
|
||||||
|
usage(tail_usage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
4
cp_mv.c
4
cp_mv.c
@ -56,6 +56,7 @@ static const char *cp_mv_usage[] = /* .rodata */
|
|||||||
"\t-a\tSame as -dpR\n"
|
"\t-a\tSame as -dpR\n"
|
||||||
"\t-d\tPreserves links\n"
|
"\t-d\tPreserves links\n"
|
||||||
"\t-p\tPreserves file attributes if possible\n"
|
"\t-p\tPreserves file attributes if possible\n"
|
||||||
|
"\t-f\tforce (implied; ignored) - always set\n"
|
||||||
"\t-R\tCopies directories recursively\n"
|
"\t-R\tCopies directories recursively\n"
|
||||||
#endif
|
#endif
|
||||||
,
|
,
|
||||||
@ -218,6 +219,9 @@ extern int cp_mv_main(int argc, char **argv)
|
|||||||
case 'R':
|
case 'R':
|
||||||
recursiveFlag = TRUE;
|
recursiveFlag = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'f':
|
||||||
|
/* for compatibility; busybox cp/mv always does force */
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(cp_mv_usage[is_cp]);
|
usage(cp_mv_usage[is_cp]);
|
||||||
}
|
}
|
||||||
|
92
id.c
Normal file
92
id.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/* vi: set sw=4 ts=4: */
|
||||||
|
/*
|
||||||
|
* Mini id implementation for busybox
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* 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 "internal.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
static const char id_usage[] =
|
||||||
|
"id [OPTIONS]... [USERNAME]\n\n"
|
||||||
|
"Print information for USERNAME or the current user\n\n"
|
||||||
|
"\t-g\tprints only the group ID\n"
|
||||||
|
"\t-u\tprints only the user ID\n"
|
||||||
|
"\t-r\tprints the real user ID instead of the effective ID (with -ug)\n\n";
|
||||||
|
|
||||||
|
extern int id_main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int no_user = 0, no_group = 0, print_real = 0;
|
||||||
|
char *cp, *user, *group;
|
||||||
|
gid_t gid;
|
||||||
|
|
||||||
|
cp = user = group = NULL;
|
||||||
|
|
||||||
|
argc--; argv++;
|
||||||
|
|
||||||
|
while (argc > 0) {
|
||||||
|
cp = *argv;
|
||||||
|
if (*cp == '-') {
|
||||||
|
switch (*++cp) {
|
||||||
|
case 'u': no_group = 1; break;
|
||||||
|
case 'g': no_user = 1; break;
|
||||||
|
case 'r': print_real = 1; break;
|
||||||
|
default: usage(id_usage);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
user = cp;
|
||||||
|
}
|
||||||
|
argc--; argv++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_user && no_group) usage(id_usage);
|
||||||
|
|
||||||
|
if (user == NULL) {
|
||||||
|
user = xmalloc(9);
|
||||||
|
group = xmalloc(9);
|
||||||
|
if (print_real) {
|
||||||
|
my_getpwuid(user, getuid());
|
||||||
|
my_getgrgid(group, getgid());
|
||||||
|
} else {
|
||||||
|
my_getpwuid(user, geteuid());
|
||||||
|
my_getgrgid(group, getegid());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
group = xmalloc(9);
|
||||||
|
gid = my_getpwnamegid(user);
|
||||||
|
my_getgrgid(group, gid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (no_group) printf("%u\n", my_getpwnam(user));
|
||||||
|
else if (no_user) printf("%u\n", my_getgrnam(group));
|
||||||
|
else
|
||||||
|
printf("uid=%u(%s) gid=%u(%s)\n",
|
||||||
|
my_getpwnam(user), user, my_getgrnam(group), group);
|
||||||
|
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* END CODE */
|
15
internal.h
15
internal.h
@ -129,6 +129,7 @@ extern int halt_main(int argc, char** argv);
|
|||||||
extern int head_main(int argc, char** argv);
|
extern int head_main(int argc, char** argv);
|
||||||
extern int hostid_main(int argc, char** argv);
|
extern int hostid_main(int argc, char** argv);
|
||||||
extern int hostname_main(int argc, char** argv);
|
extern int hostname_main(int argc, char** argv);
|
||||||
|
extern int id_main(int argc, char** argv);
|
||||||
extern int init_main(int argc, char** argv);
|
extern int init_main(int argc, char** argv);
|
||||||
extern int insmod_main(int argc, char** argv);
|
extern int insmod_main(int argc, char** argv);
|
||||||
extern int kill_main(int argc, char** argv);
|
extern int kill_main(int argc, char** argv);
|
||||||
@ -233,10 +234,7 @@ extern int createPath (const char *name, int mode);
|
|||||||
extern int parse_mode( const char* s, mode_t* theMode);
|
extern int parse_mode( const char* s, mode_t* theMode);
|
||||||
|
|
||||||
extern int get_kernel_revision(void);
|
extern int get_kernel_revision(void);
|
||||||
extern uid_t my_getpwnam(char *name);
|
|
||||||
extern gid_t my_getgrnam(char *name);
|
|
||||||
extern void my_getpwuid(char* name, uid_t uid);
|
|
||||||
extern void my_getgrgid(char* group, gid_t gid);
|
|
||||||
extern int get_console_fd(char* tty_name);
|
extern int get_console_fd(char* tty_name);
|
||||||
extern struct mntent *findMountPoint(const char *name, const char *table);
|
extern struct mntent *findMountPoint(const char *name, const char *table);
|
||||||
extern void write_mtab(char* blockDevice, char* directory,
|
extern void write_mtab(char* blockDevice, char* directory,
|
||||||
@ -253,6 +251,15 @@ extern void *xmalloc (size_t size);
|
|||||||
extern int find_real_root_device_name(char* name);
|
extern int find_real_root_device_name(char* name);
|
||||||
extern char *cstring_lineFromFile(FILE *f);
|
extern char *cstring_lineFromFile(FILE *f);
|
||||||
|
|
||||||
|
/* These parse entries in /etc/passwd and /etc/group. This is desirable
|
||||||
|
* for BusyBox since we want to avoid using the glibc NSS stuff, which
|
||||||
|
* increases target size and is often not needed embedded systems. */
|
||||||
|
extern uid_t my_getpwnam(char *name);
|
||||||
|
extern gid_t my_getgrnam(char *name);
|
||||||
|
extern void my_getpwuid(char *name, uid_t uid);
|
||||||
|
extern void my_getgrgid(char *group, gid_t gid);
|
||||||
|
extern gid_t my_getpwnamegid(char *name);
|
||||||
|
|
||||||
|
|
||||||
#if defined BB_INIT || defined BB_SYSLOGD
|
#if defined BB_INIT || defined BB_SYSLOGD
|
||||||
extern int device_open(char *device, int mode);
|
extern int device_open(char *device, int mode);
|
||||||
|
@ -51,6 +51,7 @@ int loadkmap_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
read(0, buff, 7);
|
read(0, buff, 7);
|
||||||
|
printf("buff='%s'\n", buff);
|
||||||
if (0 != strncmp(buff, magic, 7)) {
|
if (0 != strncmp(buff, magic, 7)) {
|
||||||
fprintf(stderr, "This is not a valid binary keymap.\n");
|
fprintf(stderr, "This is not a valid binary keymap.\n");
|
||||||
exit(FALSE);
|
exit(FALSE);
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/* vi: set sw=4 ts=4: */
|
|
||||||
/*
|
/*
|
||||||
* $Id: telnet.c,v 1.1 2000/02/22 17:17:45 erik Exp $
|
* $Id: telnet.c,v 1.2 2000/05/01 19:10:52 erik Exp $
|
||||||
* Mini telnet implementation for busybox
|
* Mini telnet implementation for busybox
|
||||||
*
|
*
|
||||||
* Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
|
* Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
|
||||||
@ -102,15 +101,15 @@ static inline void telnet_senddont(int s, int c) { SENDCOMMAND(DONT, c); }
|
|||||||
static void telnet_setoptions(int s)
|
static void telnet_setoptions(int s)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
telnet_senddo(s, TELOPT_SGA); TFLAG_SET(TELOPT_SGA, DO);
|
|
||||||
telnet_sendwill(s, TELOPT_NAWS); TFLAG_SET(TELOPT_NAWS, WILL);
|
telnet_sendwill(s, TELOPT_NAWS); TFLAG_SET(TELOPT_NAWS, WILL);
|
||||||
telnet_sendwill(s, TELOPT_TSPEED); TFLAG_SET(TELOPT_TSPEED, WILL);
|
telnet_sendwill(s, TELOPT_TSPEED); TFLAG_SET(TELOPT_TSPEED, WILL);
|
||||||
telnet_sendwill(s, TELOPT_LFLOW); TFLAG_SET(TELOPT_LFLOW, WILL);
|
|
||||||
telnet_sendwill(s, TELOPT_LINEMODE); TFLAG_SET(TELOPT_LINEMODE, WILL);
|
|
||||||
telnet_sendwill(s, TELOPT_NEW_ENVIRON); TFLAG_SET(TELOPT_NEW_ENVIRON, WILL);
|
telnet_sendwill(s, TELOPT_NEW_ENVIRON); TFLAG_SET(TELOPT_NEW_ENVIRON, WILL);
|
||||||
telnet_senddo(s, TELOPT_STATUS); TFLAG_SET(TELOPT_STATUS, DO);
|
telnet_senddo(s, TELOPT_STATUS); TFLAG_SET(TELOPT_STATUS, DO);
|
||||||
telnet_sendwill(s, TELOPT_TTYPE); TFLAG_SET(TELOPT_TTYPE, WILL);
|
telnet_sendwill(s, TELOPT_TTYPE); TFLAG_SET(TELOPT_TTYPE, WILL);
|
||||||
*/
|
*/
|
||||||
|
telnet_senddo(s, TELOPT_SGA); TFLAG_SET(TELOPT_SGA, DO);
|
||||||
|
telnet_sendwill(s, TELOPT_LFLOW); TFLAG_SET(TELOPT_LFLOW, WILL);
|
||||||
|
telnet_sendwill(s, TELOPT_LINEMODE); TFLAG_SET(TELOPT_LINEMODE, WILL);
|
||||||
telnet_senddo(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, DO);
|
telnet_senddo(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, DO);
|
||||||
telnet_sendwill(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, WILL);
|
telnet_sendwill(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, WILL);
|
||||||
}
|
}
|
||||||
@ -457,16 +456,16 @@ int main(int argc, char **argv)
|
|||||||
int telnet_main(int argc, char **argv)
|
int telnet_main(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
int port = TELNETPORT;
|
int port = TELNETPORT;
|
||||||
|
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
if (argc < 1) usage(telnet_usage);
|
if (argc < 1) usage(telnet_usage);
|
||||||
if (argc > 1) port = atoi(argv[1]);
|
if (argc > 1) port = atoi(argv[1]);
|
||||||
telnet_init();
|
telnet_init();
|
||||||
atexit(telnet_shutdown);
|
atexit(telnet_shutdown);
|
||||||
|
|
||||||
telnet_start(argv[0], port);
|
telnet_start(argv[0], port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
6
tail.c
6
tail.c
@ -368,8 +368,10 @@ extern int tail_main(int argc, char **argv)
|
|||||||
case 'h':
|
case 'h':
|
||||||
usage(tail_usage);
|
usage(tail_usage);
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "tail: invalid option -- %c\n", opt);
|
if ((n_units = atoi(&argv[i][1])) < 1) {
|
||||||
usage(tail_usage);
|
fprintf(stderr, "tail: invalid option -- %c\n", opt);
|
||||||
|
usage(tail_usage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
21
telnet.c
21
telnet.c
@ -1,6 +1,5 @@
|
|||||||
/* vi: set sw=4 ts=4: */
|
|
||||||
/*
|
/*
|
||||||
* $Id: telnet.c,v 1.1 2000/02/22 17:17:45 erik Exp $
|
* $Id: telnet.c,v 1.2 2000/05/01 19:10:52 erik Exp $
|
||||||
* Mini telnet implementation for busybox
|
* Mini telnet implementation for busybox
|
||||||
*
|
*
|
||||||
* Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
|
* Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
|
||||||
@ -102,15 +101,15 @@ static inline void telnet_senddont(int s, int c) { SENDCOMMAND(DONT, c); }
|
|||||||
static void telnet_setoptions(int s)
|
static void telnet_setoptions(int s)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
telnet_senddo(s, TELOPT_SGA); TFLAG_SET(TELOPT_SGA, DO);
|
|
||||||
telnet_sendwill(s, TELOPT_NAWS); TFLAG_SET(TELOPT_NAWS, WILL);
|
telnet_sendwill(s, TELOPT_NAWS); TFLAG_SET(TELOPT_NAWS, WILL);
|
||||||
telnet_sendwill(s, TELOPT_TSPEED); TFLAG_SET(TELOPT_TSPEED, WILL);
|
telnet_sendwill(s, TELOPT_TSPEED); TFLAG_SET(TELOPT_TSPEED, WILL);
|
||||||
telnet_sendwill(s, TELOPT_LFLOW); TFLAG_SET(TELOPT_LFLOW, WILL);
|
|
||||||
telnet_sendwill(s, TELOPT_LINEMODE); TFLAG_SET(TELOPT_LINEMODE, WILL);
|
|
||||||
telnet_sendwill(s, TELOPT_NEW_ENVIRON); TFLAG_SET(TELOPT_NEW_ENVIRON, WILL);
|
telnet_sendwill(s, TELOPT_NEW_ENVIRON); TFLAG_SET(TELOPT_NEW_ENVIRON, WILL);
|
||||||
telnet_senddo(s, TELOPT_STATUS); TFLAG_SET(TELOPT_STATUS, DO);
|
telnet_senddo(s, TELOPT_STATUS); TFLAG_SET(TELOPT_STATUS, DO);
|
||||||
telnet_sendwill(s, TELOPT_TTYPE); TFLAG_SET(TELOPT_TTYPE, WILL);
|
telnet_sendwill(s, TELOPT_TTYPE); TFLAG_SET(TELOPT_TTYPE, WILL);
|
||||||
*/
|
*/
|
||||||
|
telnet_senddo(s, TELOPT_SGA); TFLAG_SET(TELOPT_SGA, DO);
|
||||||
|
telnet_sendwill(s, TELOPT_LFLOW); TFLAG_SET(TELOPT_LFLOW, WILL);
|
||||||
|
telnet_sendwill(s, TELOPT_LINEMODE); TFLAG_SET(TELOPT_LINEMODE, WILL);
|
||||||
telnet_senddo(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, DO);
|
telnet_senddo(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, DO);
|
||||||
telnet_sendwill(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, WILL);
|
telnet_sendwill(s, TELOPT_BINARY); TFLAG_SET(TELOPT_BINARY, WILL);
|
||||||
}
|
}
|
||||||
@ -457,16 +456,16 @@ int main(int argc, char **argv)
|
|||||||
int telnet_main(int argc, char **argv)
|
int telnet_main(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
int port = TELNETPORT;
|
int port = TELNETPORT;
|
||||||
|
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
if (argc < 1) usage(telnet_usage);
|
if (argc < 1) usage(telnet_usage);
|
||||||
if (argc > 1) port = atoi(argv[1]);
|
if (argc > 1) port = atoi(argv[1]);
|
||||||
telnet_init();
|
telnet_init();
|
||||||
atexit(telnet_shutdown);
|
atexit(telnet_shutdown);
|
||||||
|
|
||||||
telnet_start(argv[0], port);
|
telnet_start(argv[0], port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
57
utility.c
57
utility.c
@ -783,18 +783,27 @@ extern int parse_mode(const char *s, mode_t * theMode)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined BB_CHMOD_CHOWN_CHGRP || defined BB_PS || defined BB_LS || defined BB_TAR || defined BB_ID
|
||||||
|
|
||||||
|
/* This parses entries in /etc/passwd and /etc/group. This is desirable
|
||||||
#if defined BB_CHMOD_CHOWN_CHGRP || defined BB_PS || defined BB_LS || defined BB_TAR
|
* for BusyBox, since we want to avoid using the glibc NSS stuff, which
|
||||||
|
* increases target size and is often not needed or wanted for embedded
|
||||||
/* Use this to avoid needing the glibc NSS stuff
|
* systems.
|
||||||
* This uses storage buf to hold things.
|
*
|
||||||
* */
|
* /etc/passwd entries look like this:
|
||||||
uid_t my_getid(const char *filename, char *name, uid_t id)
|
* root:x:0:0:root:/root:/bin/bash
|
||||||
|
* and /etc/group entries look like this:
|
||||||
|
* root:x:0:
|
||||||
|
*
|
||||||
|
* This uses buf as storage to hold things.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
uid_t my_getid(const char *filename, char *name, uid_t id, gid_t *gid)
|
||||||
{
|
{
|
||||||
FILE *file;
|
FILE *file;
|
||||||
char *rname, *start, *end, buf[128];
|
char *rname, *start, *end, buf[128];
|
||||||
uid_t rid;
|
id_t rid;
|
||||||
|
gid_t rgid = 0;
|
||||||
|
|
||||||
file = fopen(filename, "r");
|
file = fopen(filename, "r");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
@ -806,6 +815,7 @@ uid_t my_getid(const char *filename, char *name, uid_t id)
|
|||||||
if (buf[0] == '#')
|
if (buf[0] == '#')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* username/group name */
|
||||||
start = buf;
|
start = buf;
|
||||||
end = strchr(start, ':');
|
end = strchr(start, ':');
|
||||||
if (end == NULL)
|
if (end == NULL)
|
||||||
@ -813,24 +823,32 @@ uid_t my_getid(const char *filename, char *name, uid_t id)
|
|||||||
*end = '\0';
|
*end = '\0';
|
||||||
rname = start;
|
rname = start;
|
||||||
|
|
||||||
|
/* password */
|
||||||
start = end + 1;
|
start = end + 1;
|
||||||
end = strchr(start, ':');
|
end = strchr(start, ':');
|
||||||
if (end == NULL)
|
if (end == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* uid in passwd, gid in group */
|
||||||
start = end + 1;
|
start = end + 1;
|
||||||
rid = (uid_t) strtol(start, &end, 10);
|
rid = (uid_t) strtol(start, &end, 10);
|
||||||
if (end == start)
|
if (end == start)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* gid in passwd */
|
||||||
|
start = end + 1;
|
||||||
|
rgid = (gid_t) strtol(start, &end, 10);
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
if (0 == strcmp(rname, name)) {
|
if (0 == strcmp(rname, name)) {
|
||||||
|
if (gid) *gid = rgid;
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return (rid);
|
return (rid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (id != -1 && id == rid) {
|
if (id != -1 && id == rid) {
|
||||||
strncpy(name, rname, 8);
|
strncpy(name, rname, 8);
|
||||||
|
if (gid) *gid = rgid;
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return (TRUE);
|
return (TRUE);
|
||||||
}
|
}
|
||||||
@ -839,30 +857,39 @@ uid_t my_getid(const char *filename, char *name, uid_t id)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* returns a uid given a username */
|
||||||
uid_t my_getpwnam(char *name)
|
uid_t my_getpwnam(char *name)
|
||||||
{
|
{
|
||||||
return my_getid("/etc/passwd", name, -1);
|
return my_getid("/etc/passwd", name, -1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* returns a gid given a group name */
|
||||||
gid_t my_getgrnam(char *name)
|
gid_t my_getgrnam(char *name)
|
||||||
{
|
{
|
||||||
return my_getid("/etc/group", name, -1);
|
return my_getid("/etc/group", name, -1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* gets a username given a uid */
|
||||||
void my_getpwuid(char *name, uid_t uid)
|
void my_getpwuid(char *name, uid_t uid)
|
||||||
{
|
{
|
||||||
my_getid("/etc/passwd", name, uid);
|
my_getid("/etc/passwd", name, uid, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* gets a groupname given a gid */
|
||||||
void my_getgrgid(char *group, gid_t gid)
|
void my_getgrgid(char *group, gid_t gid)
|
||||||
{
|
{
|
||||||
my_getid("/etc/group", group, gid);
|
my_getid("/etc/group", group, gid, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* gets a gid given a user name */
|
||||||
|
gid_t my_getpwnamegid(char *name)
|
||||||
|
{
|
||||||
|
gid_t gid;
|
||||||
|
my_getid("/etc/passwd", name, -1, &gid);
|
||||||
|
return gid;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* BB_CHMOD_CHOWN_CHGRP || BB_PS || BB_LS || BB_TAR */
|
#endif /* BB_CHMOD_CHOWN_CHGRP || BB_PS || BB_LS || BB_TAR || BB_ID */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if (defined BB_CHVT) || (defined BB_DEALLOCVT)
|
#if (defined BB_CHVT) || (defined BB_DEALLOCVT)
|
||||||
|
Loading…
Reference in New Issue
Block a user