summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/dietlibc/dietfeatures.h2
-rw-r--r--mdk-stage1/dietlibc/include/netdb.h15
-rw-r--r--mdk-stage1/dietlibc/include/termios.h1
-rw-r--r--mdk-stage1/dietlibc/lib/cfgetospeed.c6
-rw-r--r--mdk-stage1/dietlibc/lib/speed.c67
-rw-r--r--mdk-stage1/dietlibc/lib/tcflush.c23
-rw-r--r--mdk-stage1/dietlibc/lib/tcsetattr.c4
-rw-r--r--mdk-stage1/dietlibc/libshell/glob.c10
8 files changed, 113 insertions, 15 deletions
diff --git a/mdk-stage1/dietlibc/dietfeatures.h b/mdk-stage1/dietlibc/dietfeatures.h
index 4552599ea..e1de38577 100644
--- a/mdk-stage1/dietlibc/dietfeatures.h
+++ b/mdk-stage1/dietlibc/dietfeatures.h
@@ -22,7 +22,7 @@
/* #define WANT_FASTER_STRING_ROUTINES */
/* do you want ungetc? makes fgetc more complex */
-// #define WANT_UNGETC
+#define WANT_UNGETC
// #define WANT_LINKER_WARNINGS
diff --git a/mdk-stage1/dietlibc/include/netdb.h b/mdk-stage1/dietlibc/include/netdb.h
index 887faa999..e90ea81ac 100644
--- a/mdk-stage1/dietlibc/include/netdb.h
+++ b/mdk-stage1/dietlibc/include/netdb.h
@@ -72,4 +72,19 @@ struct protoent *getprotobynumber(int proto) __THROW;
void setprotoent(int stayopen) __THROW;
void endprotoent(void) __THROW;
+
+/* Description of data base entry for a single network. NOTE: here a
+ poor assumption is made. The network number is expected to fit
+ into an unsigned long int variable. */
+struct netent
+{
+ char *n_name; /* Official name of network. */
+ char **n_aliases; /* Alias list. */
+ int n_addrtype; /* Net address type. */
+ uint32_t n_net; /* Network number. */
+};
+
+extern struct netent *getnetbyname (__const char *__name) __THROW;
+
+
#endif
diff --git a/mdk-stage1/dietlibc/include/termios.h b/mdk-stage1/dietlibc/include/termios.h
index 4c4b8f4dc..f10909c1b 100644
--- a/mdk-stage1/dietlibc/include/termios.h
+++ b/mdk-stage1/dietlibc/include/termios.h
@@ -17,5 +17,6 @@ speed_t cfgetospeed(struct termios *termios_p) __THROW;
int cfsetospeed(struct termios *termios_p, speed_t speed) __THROW;
speed_t cfgetispeed(struct termios *termios_p) __THROW;
int cfsetispeed(struct termios *termios_p, speed_t speed) __THROW;
+int tcflush(int fd, int queue_selector) __THROW;
#endif
diff --git a/mdk-stage1/dietlibc/lib/cfgetospeed.c b/mdk-stage1/dietlibc/lib/cfgetospeed.c
deleted file mode 100644
index 4d70888f7..000000000
--- a/mdk-stage1/dietlibc/lib/cfgetospeed.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <termios.h>
-#include <sys/types.h>
-
-speed_t cfgetospeed(struct termios *termios_p) {
- return ((termios_p->c_iflag & (CBAUD|CBAUDEX)));
-}
diff --git a/mdk-stage1/dietlibc/lib/speed.c b/mdk-stage1/dietlibc/lib/speed.c
new file mode 100644
index 000000000..a7fcca7c9
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/speed.c
@@ -0,0 +1,67 @@
+#include <unistd.h>
+#include <termios.h>
+#include <sys/types.h>
+
+#include <asm/errno.h>
+
+extern int errno;
+
+/* Hack around a kernel bug; value must correspond to the one used in tcsetattr.c */
+#define IBAUD0 020000000000
+
+
+/* Return the output baud rate stored in *TERMIOS_P. */
+speed_t cfgetospeed (struct termios *termios_p)
+{
+ return termios_p->c_cflag & (CBAUD | CBAUDEX);
+}
+
+
+/* Return the input baud rate stored in *TERMIOS_P.
+ Although for Linux there is no difference between input and output
+ speed, the numerical 0 is a special case for the input baud rate. It
+ should set the input baud rate to the output baud rate. */
+speed_t cfgetispeed (struct termios *termios_p)
+{
+ return ((termios_p->c_iflag & IBAUD0)
+ ? 0 : termios_p->c_cflag & (CBAUD | CBAUDEX));
+}
+
+
+/* Set the output baud rate stored in *TERMIOS_P to SPEED. */
+int cfsetospeed (struct termios *termios_p, speed_t speed)
+{
+ if ((speed & ~CBAUD) != 0 && (speed < B57600 || speed > B460800)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
+ termios_p->c_cflag |= speed;
+
+ return 0;
+}
+
+
+/* Set the input baud rate stored in *TERMIOS_P to SPEED.
+ Although for Linux there is no difference between input and output
+ speed, the numerical 0 is a special case for the input baud rate. It
+ should set the input baud rate to the output baud rate. */
+int cfsetispeed (struct termios *termios_p, speed_t speed)
+{
+ if ((speed & ~CBAUD) != 0 && (speed < B57600 || speed > B460800)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (speed == 0)
+ termios_p->c_iflag |= IBAUD0;
+ else
+ {
+ termios_p->c_iflag &= ~IBAUD0;
+ termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
+ termios_p->c_cflag |= speed;
+ }
+
+ return 0;
+}
diff --git a/mdk-stage1/dietlibc/lib/tcflush.c b/mdk-stage1/dietlibc/lib/tcflush.c
new file mode 100644
index 000000000..a19fe11d1
--- /dev/null
+++ b/mdk-stage1/dietlibc/lib/tcflush.c
@@ -0,0 +1,23 @@
+#include <unistd.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+
+#include <asm/errno.h>
+
+extern int errno;
+
+/* Flush pending data on FD. */
+int tcflush(int fd, int queue_selector)
+{
+ switch (queue_selector) {
+ case TCIFLUSH:
+ return ioctl(fd, TCFLSH, 0);
+ case TCOFLUSH:
+ return ioctl(fd, TCFLSH, 1);
+ case TCIOFLUSH:
+ return ioctl(fd, TCFLSH, 2);
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
diff --git a/mdk-stage1/dietlibc/lib/tcsetattr.c b/mdk-stage1/dietlibc/lib/tcsetattr.c
index 642588d47..cf70354d2 100644
--- a/mdk-stage1/dietlibc/lib/tcsetattr.c
+++ b/mdk-stage1/dietlibc/lib/tcsetattr.c
@@ -7,8 +7,12 @@
extern int errno;
+/* Hack around a kernel bug; value must correspond to the one used in speed.c */
+#define IBAUD0 020000000000
+
int tcsetattr(int fildes, int optional_actions, struct termios *termios_p)
{
+ termios_p->c_iflag &= ~IBAUD0;
switch (optional_actions) {
case TCSANOW:
return ioctl(fildes, TCSETS, termios_p);
diff --git a/mdk-stage1/dietlibc/libshell/glob.c b/mdk-stage1/dietlibc/libshell/glob.c
index e8c9e8a79..34d09d87a 100644
--- a/mdk-stage1/dietlibc/libshell/glob.c
+++ b/mdk-stage1/dietlibc/libshell/glob.c
@@ -174,14 +174,8 @@ int glob(const char *pattern, int flags, int errfunc(const char * epath, int eer
ptr = strchr(ptr2, '/');
if (ptr != NULL)
*ptr = '\0';
- setpwent();
- while (((p = getpwent()) != NULL)) {
- if (!strcmp(p->pw_name, ptr2)) {
- home_dir = p->pw_dir;
- break;
- }
- }
- endpwent();
+ if (((p = getpwnam(ptr2)) != NULL))
+ home_dir = p->pw_dir;
}
if (home_dir != NULL) {
i = strlen(home_dir) + strlen(pattern_); /* pessimistic (the ~ case) */