]> Zhao Yanbai Git Server - minix.git/commitdiff
kernel and servers send diagnostic messages to IS; IS sends them to TTY
authorBen Gras <ben@minix3.org>
Fri, 8 Jul 2005 17:30:01 +0000 (17:30 +0000)
committerBen Gras <ben@minix3.org>
Fri, 8 Jul 2005 17:30:01 +0000 (17:30 +0000)
and the new log driver if enabled.

new usyslogd is started from /usr/etc/rc. New device created by
MAKEDEV.sh. /var/log created by etc/mtree/minix.tree (on root for
now). Made select() slightly more generic, with less code duplication.

12 files changed:
commands/scripts/MAKEDEV.sh
etc/mtree/minix.tree
etc/usr/rc
kernel/klibc.c
kernel/table.c
lib/utils/kputc.c
servers/fs/device.c
servers/fs/dmap.c
servers/fs/select.c
servers/is/diag.c
test/select/test00.c
tools/Makefile

index 18f8693f8a908ab11b28b762fc7938396fc37687..cb62494d3f3dce526d6cd029fc5b9ec3db3c1bef 100755 (executable)
@@ -12,7 +12,7 @@ case $#:$1 in
     set -$- mem fd0 fd1 fd0p0 fd1p0 \
        c0d0 c0d0p0 c0d0p0s0 c0d1 c0d1p0 c0d1p0s0 \
        c0d2 c0d2p0 c0d2p0s0 c0d3 c0d3p0 c0d3p0s0 \
-       tty ttyc1 ttyc2 ttyc3 tty00 tty01 ttyp0 ttyp1 ttyp2 ttyp3 eth
+       tty ttyc1 ttyc2 ttyc3 tty00 tty01 ttyp0 ttyp1 ttyp2 ttyp3 eth klog
     ;;
 0:|1:-\?)
     cat >&2 <<EOF
@@ -32,6 +32,7 @@ Where key is one of the following:
   ttyp0 ... ttyq0 ...     # Make tty, pty pairs
   eth ip tcp udp         # One of these makes some TCP/IP devices
   audio mixer            # Make audio devices
+  klog                    # Make /dev/klog
   std                    # All standard devices
 EOF
     exit 1
@@ -217,6 +218,11 @@ do
        $e mknod mixer c 14 0
        $e chmod 666 audio mixer
        ;;
+    klog)
+       # IS devices.
+       $e mknod klog c 15 0
+       $e chmod 600 klog
+       ;;
     *)
        echo "$0: don't know about $dev" >&2
        ex=1
index 0ab0e737646f916e0fdd7a1fc823f9367ebdfc5c..d9e056ba48b4e40ad69d8daa15e472ac59e6e8b2 100644 (file)
@@ -62,3 +62,6 @@
 700  daemon  daemon    /usr/spool/lpd
 755  bin     operator  /usr/src
 1777 root    operator  /usr/tmp
+755  root    operator  /var
+755  root    operator  /var/log
+755  root    operator  /var/run
index 097f8f30e19fb5aa8ed4cf9d5b1229d3456b9276..ccccd13a12ae8a05b14ade2004f0fd1dfd0ffe82 100644 (file)
@@ -45,6 +45,7 @@ start)
 
     echo -n "Starting daemons:"
     daemonize update
+    daemonize usyslogd
 
     # Ugly error message when starting cron from CD.
     # (and cron unnecessary then so..)
index 07a5cb861715aeaa272e55f171bbb19afa2551c8..7d8bb8167565339a4f8c21065b3a2d1c536fafd0 100644 (file)
  *
  * This file contains the routines that take care of kernel messages, i.e.,
  * diagnostic output within the kernel. Kernel messages are not directly
- * displayed on the console, because this must be done by the TTY driver. 
+ * displayed on the console, because this must be done by the PRINT driver. 
  * Instead, the kernel accumulates characters in a buffer and notifies the
- * TTY driver when a new message is ready. 
+ * PRINT driver when a new message is ready. 
  */
 
 #include "kernel.h"
-#include <minix/com.h>         /* need TTY process number */
+
+#include <minix/com.h>
 
 #define isdigit(c)     ((unsigned) ((c) - '0') <  (unsigned) 10)
 #define END_OF_KMESS   -1
@@ -151,7 +152,7 @@ PRIVATE void kputc(c)
 int c;                                 /* character to append */
 {
 /* Accumulate a single character for a kernel message. Send a notification
- * the to TTY driver if an END_OF_KMESS is encountered. 
+ * the to PRINTF_PROC driver if an END_OF_KMESS is encountered. 
  */
   message m;
   if (c != END_OF_KMESS) {
@@ -161,7 +162,7 @@ int c;                                      /* character to append */
       kmess.km_next = (kmess.km_next + 1) % KMESS_BUF_SIZE;
   } else {
       m.NOTIFY_TYPE = NEW_KMESS;
-      lock_notify(TTY, &m);
+      lock_notify(PRINTF_PROC, &m);
   }
 }
 
index 823c2dac5f2f1341441d881a7e5c22316e5d982d..ca2401052dd5a1f534662da4e5352791607b448e 100755 (executable)
@@ -96,6 +96,7 @@ PUBLIC struct system_image image[] = {
 #if ENABLE_DPETH
  { DPETH, 0,              SYS_F, SYS_T, 2, 0,           SYSTEM_CALL_MASK,  ALLOW_ALL_MASK,  "DPETH" },
 #endif
+ { LOG_PROC_NR, 0,     SYS_F, SYS_T, 2, 0,           SYSTEM_CALL_MASK,  ALLOW_ALL_MASK,  "LOG" },
  { INIT_PROC_NR, 0,    USER_F, USER_T, USER_Q, 0,         USER_CALL_MASK,    USER_PROC_SENDMASK,    "INIT"    },
 };
 
index 1c4f4ed7d426704f1599dbeb152305de86699d13..62db5326faabb2f9d8fe4ae84db7c2bc31eb34ef 100644 (file)
@@ -32,7 +32,7 @@ int c;
        m.DIAG_PRINT_BUF = print_buf;
        m.DIAG_PROC_NR = SELF;
        m.m_type = DIAGNOSTICS;
-       if (_sendrec(IS_PROC_NR, &m) != 0) {
+       if (_sendrec(PRINT_PROC, &m) != 0) {
                m.m1_i1 = 2;
                m.m1_i2 = buf_count;
                m.m1_p1 = print_buf;
index aa810547523aed6ca1af63d6e66630805c7939b6..ca0c213a4d8e04fffd4c5de4f660056eebdff4d1 100644 (file)
@@ -25,6 +25,9 @@
 #include "inode.h"
 #include "param.h"
 
+#define ELEMENTS(a) (sizeof(a)/sizeof((a)[0]))
+
+extern int dmap_size;
 
 /*===========================================================================*
  *                             dev_open                                     *
@@ -59,7 +62,6 @@ dev_t dev;                    /* device to close */
   (void) (*dmap[(dev >> MAJOR) & BYTE].dmap_opcl)(DEV_CLOSE, dev, 0, 0);
 }
 
-
 /*===========================================================================*
  *                             dev_io                                       *
  *===========================================================================*/
@@ -297,7 +299,7 @@ message *mess_ptr;          /* pointer to message for task */
        /* Otherwise it should be a REVIVE. */
        if (local_m.m_type != REVIVE) {
                printf(
-               "fs: strange device reply from %d, type = %d, proc = %d\n",
+               "fs: strange device reply from %d, type = %d, proc = %d (1)\n",
                        local_m.m_source,
                        local_m.m_type, local_m.REP_PROC_NR);
                continue;
@@ -320,15 +322,19 @@ message *mess_ptr;                /* pointer to message for task */
                break;
        }
 
-       /* Otherwise it should be a REVIVE. */
-       if (mess_ptr->m_type != REVIVE) {
+       if(mess_ptr->m_type == DEV_SELECTED) {
+               /* select() became possible.. This can happen. */
+               select_notified(mess_ptr);
+       } else if(mess_ptr->m_type == REVIVE) {
+               /* Otherwise it should be a REVIVE. */
+               revive(mess_ptr->REP_PROC_NR, mess_ptr->REP_STATUS);
+       } else {
                printf(
-               "fs: strange device reply from %d, type = %d, proc = %d\n",
+               "fs: strange device reply from %d, type = %d, proc = %d (2)\n",
                        mess_ptr->m_source,
                        mess_ptr->m_type, mess_ptr->REP_PROC_NR);
-               continue;
+               continue;       /* XXX should this be a continue?? */
        }
-       revive(mess_ptr->REP_PROC_NR, mess_ptr->REP_STATUS);
 
        r = receive(task_nr, mess_ptr);
   }
index 3c4e3f7c53c5542c55487d9bfb2b410de051412b..542ff3a0c20aaba7cf9b0d54eb41d8eeba72a73f 100644 (file)
@@ -51,10 +51,10 @@ struct dmap dmap[NR_DEVICES] = {
   DT(NR_CTRLRS >= 4, gen_opcl, gen_io, CTRLR(3),   DMAP_MUTABLE)     /*12 = /dev/c3    */
   DT(ENABLE_SB16,    gen_opcl, gen_io, NONE,   0)     /*13 = /dev/audio */
   DT(ENABLE_SB16,    gen_opcl, gen_io, NONE,   0)    /*14 = /dev/mixer */
+  DT(1,                     gen_opcl, gen_io, LOG_PROC_NR,   0)  /* 15 = /dev/klog    */
 #endif /* IBM_PC */
 };
 
-
 /*===========================================================================*
  *                             map_driver                                   *
  *===========================================================================*/
index 67f9129d6279458ab31cf127c1083632ed53d4e2..4706b3a170197f40f8501dacdaf409c8429da0ec 100644 (file)
@@ -4,6 +4,9 @@
  *   do_select:               perform the SELECT system call
  *   select_callback:  notify select system of possible fd operation 
  *   select_notified:  low-level entry for device notifying select
+ * 
+ * Changes:
+ *   6 june 2005  Created (Ben Gras)
  */
 
 
   * make select cancel disappearing fp's
   */
 
-#define DEBUG_SELECT 1
+#define DEBUG_SELECT 0
 
 #include "fs.h"
 #include "select.h"
 #include "file.h"
 #include "inode.h"
 #include "fs_timers.h"
+#include "dmap.h"
 
 #include <sys/time.h>
 #include <sys/select.h>
@@ -48,7 +52,8 @@ PRIVATE struct selectentry {
 #define SELFD_PIPE     1
 #define SELFD_TTY      2
 #define SELFD_INET     3
-#define SEL_FDS                4
+#define SELFD_LOG      4
+#define SEL_FDS                5
 
 FORWARD _PROTOTYPE(int select_reevaluate, (struct filp *fp));
 
@@ -56,10 +61,9 @@ FORWARD _PROTOTYPE(int select_request_file, (struct filp *f, int *ops, int block
 FORWARD _PROTOTYPE(int select_match_file, (struct filp *f));
 
 FORWARD _PROTOTYPE(int select_request_tty, (struct filp *f, int *ops, int block));
-FORWARD _PROTOTYPE(int select_match_tty, (struct filp *f));
-
 FORWARD _PROTOTYPE(int select_request_inet, (struct filp *f, int *ops, int block));
-FORWARD _PROTOTYPE(int select_match_inet, (struct filp *f));
+FORWARD _PROTOTYPE(int select_request_log, (struct filp *f, int *ops, int block));
+FORWARD _PROTOTYPE(int select_major_match, (int match_major, struct filp *file));
 
 FORWARD _PROTOTYPE(void select_cancel_all, (struct selectentry *e));
 FORWARD _PROTOTYPE(int select_wakeup, (struct selectentry *e));
@@ -73,15 +77,18 @@ FORWARD _PROTOTYPE(int select_wakeup, (struct selectentry *e));
 PRIVATE struct fdtype {
        int (*select_request)(struct filp *, int *ops, int block);      
        int (*select_match)(struct filp *);
+       int select_major;
 } fdtypes[SEL_FDS] = {
                /* SELFD_FILE */
-       { select_request_file, select_match_file },
+       { select_request_file, select_match_file, 0 },
                /* SELFD_TTY (also PTY) */
-       { select_request_tty, select_match_tty },
+       { select_request_tty, NULL, TTY_MAJOR },
                /* SELFD_INET */
-       { select_request_inet, select_match_inet },
+       { select_request_inet, NULL, INET_MAJOR },
                /* SELFD_PIPE (pipe(2) pipes and FS FIFOs) */
-       { select_request_pipe, select_match_pipe },
+       { select_request_pipe, select_match_pipe, 0 },
+               /* SELFD_LOG (/dev/klog) */
+       { select_request_log, NULL, LOG_MAJOR },
 };
 
 /* Open Group:
@@ -123,56 +130,50 @@ PRIVATE int select_request_tty(struct filp *f, int *ops, int block)
 }
 
 /*===========================================================================*
- *                             select_match_tty                             *
+ *                             select_request_inet                          *
  *===========================================================================*/
-PRIVATE int select_match_tty(struct filp *file)
+PRIVATE int select_request_inet(struct filp *f, int *ops, int block)
 {
-       int major;
-       if(!(file && file->filp_ino &&
-               (file->filp_ino->i_mode & I_TYPE) == I_CHAR_SPECIAL))
-               return 0;
-       major = (file->filp_ino->i_zone[0] >> MAJOR) & BYTE;
-       if(major == TTY_MAJOR || major == CTTY_MAJOR)
-               return 1;
-       return 0;
+       int r, rops;
+       rops = *ops;
+       if(block) rops |= SEL_NOTIFY;
+       *ops = dev_io(DEV_SELECT, f->filp_ino->i_zone[0], rops, NULL, 0, 0, 0);
+       printf("select_request_inet: got reply %d from inet for %d on %d\n",
+               *ops, rops, f->filp_ino->i_zone[0]);
+       if(*ops < 0)
+               return SEL_ERR;
+       return SEL_OK;
 }
 
 /*===========================================================================*
- *                             select_request_inet                          *
+ *                             select_request_log                           *
  *===========================================================================*/
-PRIVATE int select_request_inet(struct filp *f, int *ops, int block)
+PRIVATE int select_request_log(struct filp *f, int *ops, int block)
 {
        int r, rops;
        rops = *ops;
        if(block) rops |= SEL_NOTIFY;
        *ops = dev_io(DEV_SELECT, f->filp_ino->i_zone[0], rops, NULL, 0, 0, 0);
-       printf("select_request_inet: got reply %d from inet for %d on %d\n",
-               *ops, rops, f->filp_ino->i_zone[0]);
        if(*ops < 0)
                return SEL_ERR;
        return SEL_OK;
 }
 
 /*===========================================================================*
- *                             select_match_inet                            *
+ *                             select_major_match                           *
  *===========================================================================*/
-PRIVATE int select_match_inet(struct filp *file)
+PRIVATE int select_major_match(int match_major, struct filp *file)
 {
        int major;
        if(!(file && file->filp_ino &&
                (file->filp_ino->i_mode & I_TYPE) == I_CHAR_SPECIAL))
                return 0;
        major = (file->filp_ino->i_zone[0] >> MAJOR) & BYTE;
-       if(major == INET_MAJOR)
-       {
-               printf("inet minor: %d\n", 
-                       (file->filp_ino->i_zone[0] & BYTE));
+       if(major == match_major)
                return 1;
-       }
        return 0;
 }
 
-
 PRIVATE int tab2ops(int fd, struct selectentry *e)
 {
        return (FD_ISSET(fd, &e->readfds) ? SEL_RD : 0) |
@@ -183,7 +184,7 @@ PRIVATE int tab2ops(int fd, struct selectentry *e)
 PRIVATE void ops2tab(int ops, int fd, struct selectentry *e)
 {
        if((ops & SEL_RD) && e->vir_readfds && FD_ISSET(fd, &e->readfds)
-               && !FD_ISSET(fd, &e->ready_readfds)) {
+               && !FD_ISSET(fd, &e->ready_readfds)) {
                FD_SET(fd, &e->ready_readfds);
                e->nreadyfds++;
        }
@@ -249,6 +250,7 @@ PUBLIC int do_select(void)
        FD_ZERO(&selecttab[s].ready_writefds);
        FD_ZERO(&selecttab[s].ready_errorfds);
 
+
        selecttab[s].vir_readfds = (fd_set *) m_in.SEL_READFDS;
        selecttab[s].vir_writefds = (fd_set *) m_in.SEL_WRITEFDS;
        selecttab[s].vir_errorfds = (fd_set *) m_in.SEL_ERRORFDS;
@@ -300,18 +302,21 @@ PUBLIC int do_select(void)
                        continue;
                if(!(filp = selecttab[s].filps[fd] = get_filp(fd))) {
                        select_cancel_all(&selecttab[s]);
-                       printf("do_select: get_filp failed\n");
                        return EBADF;
                }
 
                for(t = 0; t < SEL_FDS; t++) {
-                       if(fdtypes[t].select_match(filp)) {
+                       if(fdtypes[t].select_match) {
+                          if(fdtypes[t].select_match(filp)) {
 #if DEBUG_SELECT
                                printf("select: fd %d is type %d ", fd, t);
 #endif
                                if(type != -1)
                                        printf("select: double match\n");
                                type = t;
+                         }
+                       } else if(select_major_match(fdtypes[t].select_major, filp)) {
+                               type = t;
                        }
                }
 
@@ -327,7 +332,9 @@ PUBLIC int do_select(void)
                 */
                if(type == -1)
                {
+#if DEBUG_SELECT
                        printf("do_select: bad type\n");
+#endif
                        return EBADF;
                }
 
@@ -396,9 +403,15 @@ PUBLIC int do_select(void)
                 * functions shall return the total number of bits
                 * set in the bit masks."
                 */
+#if DEBUG_SELECT
+               printf("returning\n");
+#endif
 
                return selecttab[s].nreadyfds;
        }
+#if DEBUG_SELECT
+               printf("not returning (%d, %d)\n", selecttab[s].nreadyfds, block);
+#endif
  
        /* Convert timeval to ticks and set the timer. If it fails, undo
         * all, return error.
@@ -563,58 +576,43 @@ restart_callback:
  *===========================================================================*/
 PUBLIC int select_notified(message *m)
 {
-       int s, f;
+       int s, f, d, t;
 
-       switch(m->m_source) {
-               case TTY:
-#if DEBUG_SELECT
-                       printf("fs: select: tty notification\n");
-#endif
-                       for(s = 0; s < MAXSELECTS; s++) {
-                               int line, ops;
-                               if(!selecttab[s].requestor)
-                                       continue;
-                               for(f = 0; f < selecttab[s].nfds; f++) {
-                                       if(!selecttab[s].filps[f] ||
-                                          !select_match_tty(selecttab[s].filps[f]))
-                                               continue;
-                                       ops = tab2ops(f, &selecttab[s]);
-                                       line = selecttab[s].filps[f]->filp_ino->i_zone[0] & BYTE;
-                                       if((line == m->NOTIFY_ARG) &&
-                                               (m->NOTIFY_FLAGS & ops)) {
-#if DEBUG_SELECT
-                                               printf("fs: select: tty notification matched\n");
-#endif
-                                               select_callback(selecttab[s].filps[f], ops);
-                                       }
-                               }
-                       }
+       for(d = 0; d < NR_DEVICES; d++)
+               if(dmap[d].dmap_driver == m->m_source)
                        break;
-               default:
-#if DEBUG_SELECT
-                       printf("fs: select: default notification\n");
-#endif
-                       for(s = 0; s < MAXSELECTS; s++) {
-                               int line, ops;
-                               if(!selecttab[s].requestor)
-                                       continue;
-                               for(f = 0; f < selecttab[s].nfds; f++) {
-                                       if(!selecttab[s].filps[f] ||
-                                          !select_match_inet(selecttab[s].filps[f]))
-                                               continue;
-                                       ops = tab2ops(f, &selecttab[s]);
-                                       line = selecttab[s].filps[f]->filp_ino->i_zone[0] & BYTE;
-                                       if((line == m->NOTIFY_ARG) &&
-                                               (m->NOTIFY_FLAGS & ops)) {
-#if DEBUG_SELECT
-                                               printf("fs: select: inet notification matched\n");
-#endif
-                                               select_callback(selecttab[s].filps[f], ops);
-                                       }
-                               }
+
+       if(d >= NR_DEVICES)
+               return OK;
+
+       for(t = 0; t < SEL_FDS; t++)
+               if(!fdtypes[t].select_match && fdtypes[t].select_major == d)
+                       break;
+
+       if(t >= SEL_FDS)
+               return OK;
+
+       /* We have a select callback from major device no.
+        * d, which corresponds to our select type t.
+        */
+
+       for(s = 0; s < MAXSELECTS; s++) {
+               int line, ops;
+               if(!selecttab[s].requestor)
+                       continue;
+               for(f = 0; f < selecttab[s].nfds; f++) {
+                       if(!selecttab[s].filps[f] ||
+                          !select_major_match(d, selecttab[s].filps[f]))
+                               continue;
+                       ops = tab2ops(f, &selecttab[s]);
+                       line = selecttab[s].filps[f]->filp_ino->i_zone[0] & BYTE;
+                       if((line == m->NOTIFY_ARG) &&
+                               (m->NOTIFY_FLAGS & ops)) {
+                               select_callback(selecttab[s].filps[f], ops);
                        }
-                       break;
+               }
        }
+
        return OK;
 }
 
@@ -637,7 +635,9 @@ PUBLIC void select_forget(int proc)
        }
 
        if(s >= MAXSELECTS) {
+#if DEBUG_SELECT
                printf("select: cancelled select() not found");
+#endif
                return;
        }
 
@@ -658,17 +658,23 @@ PUBLIC void select_timeout_check(timer_t *timer)
        s = tmr_arg(timer)->ta_int;
 
        if(s < 0 || s >= MAXSELECTS) {
+#if DEBUG_SELECT
                printf("select: bogus slot arg to watchdog %d\n", s);
+#endif
                return;
        }
 
        if(!selecttab[s].requestor) {
+#if DEBUG_SELECT
                printf("select: no requestor in watchdog\n");
+#endif
                return;
        }
 
        if(selecttab[s].expiry <= 0) {
+#if DEBUG_SELECT
                printf("select: strange expiry value in watchdog\n", s);
+#endif
                return;
        }
 
index 96d34d9383eb77ccda9ebab78cef04ccdb7cb50f..5dd0b6e609bc205f390c50b32a2900282ce09803 100644 (file)
@@ -1,7 +1,30 @@
+
+#include <stdio.h>
+#include <fcntl.h>
+
 #include "is.h"
 #include "../../kernel/const.h"
 #include "../../kernel/type.h"
 
+/*==========================================================================*
+ *                             log_message                                 *
+ *==========================================================================*/
+PRIVATE void log_message(char *buf)
+{
+#if ENABLE_LOG
+       message m;
+
+       m.m_type = DIAGNOSTICS;
+       m.DIAG_PRINT_BUF = buf;
+       m.DIAG_BUF_COUNT = strlen(buf);
+
+       _sendrec(LOG_PROC_NR, &m);
+#endif
+
+       return;
+}
+
+
 /*==========================================================================*
  *                             do_new_kmess                                *
  *==========================================================================*/
@@ -42,6 +65,9 @@ message *m;                                   /* notification message */
       /* Now terminate the new message and print it. */
       print_buf[i] = 0;
       printf(print_buf);
+
+       /* Also send message to log device. */
+       log_message(print_buf);
   }
 
   /* Almost done, store 'next' so that we can determine what part of the
@@ -67,6 +93,8 @@ PUBLIC int do_diagnostics(message *m)
   vir_bytes src;
   int count;
   char c;
+  int i = 0;
+  static char diagbuf[1024];
 
   /* Forward the message to the TTY driver. Inform the TTY driver about the
    * original sender, so that it knows where the buffer to be printed is.
@@ -87,6 +115,20 @@ PUBLIC int do_diagnostics(message *m)
       diag_putc(c);            /* accumulate character */
       src ++;
       count --;
+      diagbuf[i++] = c;
+      if(i == sizeof(diagbuf) - 1) {
+       diagbuf[i] = '\0';
+       log_message(diagbuf);
+       i = 0;
+      }
+  }
+
+  if(i > 0) {
+       /* This is safe; if i were too large,
+        * this would have been done above.
+        */
+       diagbuf[i] = '\0';
+       log_message(diagbuf);
   }
 
   return result;
index c49fb89d93d4f4410785253c8f56d061ca2dfce7..f25a9cd8c3eea64e226deea760cc0b231c103a83 100644 (file)
@@ -23,6 +23,18 @@ int main(int argc, char *argv[]) {
        int i,j;        
 
        FD_ZERO(&fds);
+       for (i=0;i<FD_SETSIZE;i++) {
+               /* see if SET works */
+               FD_SET(i, &fds);
+               if(!FD_ISSET(i, &fds))
+                       return 1;
+       }
+       FD_ZERO(&fds);
+       for (i=0;i<FD_SETSIZE;i++) {
+               /* see if ZERO works */
+               if(FD_ISSET(i, &fds))
+                       return 1;
+       }
        for (i=0;i<FD_SETSIZE;i++) {
                FD_SET(i, &fds);
                for(j = 0; j <= i; j++)
index fff78145be14f587dd6bfae407aa5bec9e2c993c..bb161d9954ef83463d940bbbc116fe3154fe0910 100755 (executable)
@@ -19,6 +19,7 @@ PROGRAMS=     ../kernel/kernel \
        ../drivers/rtl8139/rtl8139 \
        ../drivers/fxp/fxp \
        ../drivers/dpeth/dpeth \
+       ../drivers/log/log \
        ../servers/init/init \
 #      bootdev.img