I attempted to make the earlier version of mathopd run on uClinux.  The
HTTP POST requests are yet to be fixed.

Would these 2 new files and the patch be of any interest to mathopd
developers?

Ilguiz


new file: Makefile
====================================================================
.EXPORT_ALL_VARIABLES:

all:  src/mathopd

src/mathopd:
        $(MAKE) -C src

clean:
        -$(MAKE) -C src clean

distclean: clean
        -rm -rf autom4te*.cache 
        -rm -f configure config.h config.h.in \
                config.status config.cache config.log


new file: configure.in
====================================================================
AC_INIT(mathopd, 1.1)

AC_CONFIG_HEADER(config.h)

dnl uClinux has only a stub fork() which calls vfork().  This fact
dnl is not reflected in autoconf-2.53.
AC_DEFUN([AC_FORK_IS_A_STUB_IN_UCLINUX],
[AC_BEFORE([$0], [AC_FUNC_FORK])dnl
case $host in
    (*-uClinux | *-uclinux)
        ac_cv_func_fork=no
        AC_MSG_NOTICE([uClinux has only a stub fork() that calls vfork()])
        AC_DEFINE(HAVE_VFORK, 1, 
                [indicates that the vfork() call is available])dnl
        AC_DEFINE(HAVE_WORKING_VFORK, 1, 
                [indicates that the vfork() call works as expected])dnl
        ;;
    (*)
        # Check for presence of fork() and vfork() in the C library
        # and define HAVE_FORK and HAVE_VFORK accordingly.
        # Also, run tests if compiling native code or make assumptions
        # to determine if fork() and vfork() work when they exist.
        # Set or unset HAVE_WORKING_FORK and HAVE_WORKING_VFORK.
        AC_FUNC_FORK[]dnl
        ;;
esac
])# AC_FORK_IS_A_STUB_IN_UCLINUX
AC_FORK_IS_A_STUB_IN_UCLINUX

AH_BOTTOM([
#ifdef HAVE_WORKING_FORK

/* fork() exists and works */
#  define FINISHVOID(code)    _exit(code)
#  define FINISH(code)        _exit(code)

#elif defined(HAVE_WORKING_VFORK)

#  define fork                vfork
#  define FINISHVOID(code)    return
#  define FINISH(code)        return (!code)

#else

#  error fork() or vfork() are not found in the standard C library \
         or are not working or are assumed to not work on the target \
         platform.
#endif])

AC_OUTPUT

====================================================================


---------- Forwarded message ----------
Date: Thu, 11 Jul 2002 10:49:18 -0400 (EDT)
From: Ilguiz Latypov <[EMAIL PROTECTED]>
To: uClinux <[EMAIL PROTECTED]>
Subject: Re: [uClinux-dev] Problem execute CGI with boa on uClinux


This can be related to no-mmu specifics:

   a) memory not belonging to the process can be corrupted by the process
   b) vfork usage assumes that the data segment is shared by the parent 
      and the child
   c) only _exit() or exec..() are allowed in the end of the child process
   d) the parent will be activated only after the child _exit()s or passes 
      control to another program through exec..()

I believe the user/boa module in Greg Ungerer's uClinux distribution
contains all the necessary fixes.

I myself only tried a different embedded web server from
http://www.mathopd.org/.  I adjusted it to no-mmu case, but succeeded only
in making it serve the HTTP GET requests.  No HTTP POST requests would
work for me with mathopd on m68k-nommu platform.  I attached my
adjustments.

Ilguiz

On Thu, 11 Jul 2002, Van Duc Uy wrote:

> now the boa can run seem well with HTML file. but with CGI it encounter 
> problem. when i browse a cgi file I can see the result on the browser. but 
> After  executed a CGI program the kernel halt on (dead).


Index: src/Makefile
===================================================================
RCS file: /usr/local/cvsroot/user/mathopd/src/Makefile,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- src/Makefile        21 Apr 2002 22:54:48 -0000      1.1.1.1
+++ src/Makefile        22 Apr 2002 22:30:05 -0000      1.2
@@ -1,10 +1,10 @@
 BIN = mathopd
-CC = gcc
-CFLAGS = -O -Wall
-CPPFLAGS = 
-LDFLAGS = 
-LIBS = -lcrypt
-PREFIX = /usr/local
+# CC = gcc
+CFLAGS += -O -Wall
+CPPFLAGS += -I.. -DIGNORE_SECURITY=1 -DIGNORE_SIGHUP
+# LDFLAGS = 
+LIBS += -lcrypt
+PREFIX = /usr
 SBINDIR = $(PREFIX)/sbin
 
 # On Solaris, uncomment the following
@@ -12,7 +12,7 @@
 # LIBS = -lsocket -lnsl
 
 # On Linux, uncomment the following
-# CPPFLAGS = -DHAVE_CRYPT_H
+CPPFLAGS += -DHAVE_CRYPT_H
 
 OBJS = base64.o cgi.o config.o core.o dump.o imap.o log.o main.o \
        request.o util.o
@@ -26,13 +26,20 @@
 # CPPFLAGS += -DNEED_SOCKLEN_T
 
 all: $(BIN)
+
 install: $(BIN)
        install -c $(BIN) $(SBINDIR)
+
 $(BIN): $(OBJS)
        $(CC) $(LDFLAGS) -o $(BIN) $(OBJS) $(LIBS)
+
 $(OBJS): $(DEPENDS)
+
 .c.o:
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
+
 clean:
-       rm -f $(BIN) $(OBJS)
+       rm -f $(BIN) $(OBJS) *.gdb
+
 .PHONY: install clean
+
Index: src/cgi.c
===================================================================
RCS file: /usr/local/cvsroot/user/mathopd/src/cgi.c,v
retrieving revision 1.1.1.1
retrieving revision 1.3
diff -u -r1.1.1.1 -r1.3
--- src/cgi.c   21 Apr 2002 22:54:48 -0000      1.1.1.1
+++ src/cgi.c   24 Apr 2002 00:52:32 -0000      1.3
@@ -35,7 +35,7 @@
 
 /* Peg */
 
-static const char rcsid[] = "$Id: cgi.c,v 1.1.1.1 2002/04/21 22:54:48 ilatypov Exp $";
+static const char rcsid[] = "$Id: cgi.c,v 1.3 2002/04/24 00:52:32 ilatypov Exp $";
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -72,7 +72,7 @@
        if (name == 0) {
                if (value == 0)
                        cp->cgi_envp[cp->cgi_envc] = 0;
-               else if ((cp->cgi_envp[cp->cgi_envc] = strdup(value)) == 0)
+               else if ((cp->cgi_envp[cp->cgi_envc] = xstrdup(value)) == 0)
                        return -1;
        } else {
                namelen = strlen(name);
@@ -83,7 +83,7 @@
                        else
                                valuelen = 0;
                }
-               tmp = malloc(namelen + valuelen + 2);
+               tmp = xmalloc(namelen + valuelen + 2);
                if (tmp == 0) {
                        cp->cgi_envp[cp->cgi_envc] = 0;
                        return -1;
@@ -112,14 +112,14 @@
                cp->cgi_argv[cp->cgi_argc] = 0;
        else {
                s = b ? b - a : strlen(a);
-               tmp = malloc(s + 1);
+               tmp = xmalloc(s + 1);
                if (tmp == 0) {
                        cp->cgi_argv[cp->cgi_argc] = 0;
                        return -1;
                }
                if (decode) {
                        if (unescape_url_n(a, tmp, s)) {
-                               free(tmp);
+                               xfree(tmp);
                                cp->cgi_argv[cp->cgi_argc] = 0;
                                return -1;
                        }
@@ -143,7 +143,7 @@
        h = gethostbyaddr((char *) &ia, sizeof ia, AF_INET);
        if (h == 0 || h->h_name == 0)
                return 0;
-       tmp = strdup(h->h_name);
+       tmp = xstrdup(h->h_name);
        if (tmp == 0) {
                log_d("dnslookup: strdup failed");
                return 0;
@@ -168,7 +168,7 @@
                        }
        if (message) {
                log_d("dnslookup: %s, address=%s, name=%s", message, inet_ntoa(ia), 
tmp);
-               free(tmp);
+               xfree(tmp);
                return 0;
        }
        return tmp;
@@ -214,15 +214,15 @@
        if (add("QUERY_STRING", r->args, 0, cp) == -1)
                return -1;
        if (r->args) {
-               tmp = malloc(strlen(r->url) + strlen(r->args) + 2);
+               tmp = xmalloc(strlen(r->url) + strlen(r->args) + 2);
                if (tmp == 0)
                        return -1;
                sprintf(tmp, "%s?%s", r->url, r->args);
                if (add("REQUEST_URI", tmp, 0, cp) == -1) {
-                       free(tmp);
+                       xfree(tmp);
                        return -1;
                }
-               free(tmp);
+               xfree(tmp);
        } else if (add("REQUEST_URI", r->url, 0, cp) == -1)
                return -1;
        sprintf(t, "%s", inet_ntoa(r->cn->peer.sin_addr));
@@ -235,10 +235,10 @@
                tmp = dnslookup(r->cn->peer.sin_addr);
                if (tmp) {
                        if (add("REMOTE_HOST", tmp, 0, cp) == -1) {
-                               free(tmp);
+                               xfree(tmp);
                                return -1;
                        }
-                       free(tmp);
+                       xfree(tmp);
                }
        }
        if (add("REQUEST_METHOD", r->method_s, 0, cp) == -1)
@@ -340,6 +340,7 @@
        return 0;
 }
 
+#ifndef IGNORE_SECURITY
 static int become_user(const char *name)
 {
        struct passwd *pw;
@@ -394,6 +395,7 @@
        }
        return 0;
 }
+#endif
 
 static void destroy_parameters(struct cgi_parameters *cp)
 {
@@ -402,22 +404,23 @@
        if (cp->cgi_envp) {
                for (i = 0; i < cp->cgi_envc; i++)
                        if (cp->cgi_envp[i])
-                               free(cp->cgi_envp[i]);
-               free(cp->cgi_envp);
+                               xfree(cp->cgi_envp[i]);
+               xfree(cp->cgi_envp);
        }
        if (cp->cgi_argv) {
                for (i = 0; i < cp->cgi_argc; i++)
                        if (cp->cgi_argv[i])
-                               free(cp->cgi_argv[i]);
-               free(cp->cgi_argv);
+                               xfree(cp->cgi_argv[i]);
+               xfree(cp->cgi_argv);
        }
-       free(cp);
+       xfree(cp);
 }
 
 static int exec_cgi(struct request *r)
 {
        struct cgi_parameters *cp;
 
+#ifndef IGNORE_SECURITY
        if (setuid(0) != -1) {
                if (r->c->script_user) {
                        if (become_user(r->c->script_user) == -1)
@@ -434,7 +437,8 @@
                log_d("cannot run scripts as the super-user");
                return cgi_error(r, 500);
        }
-       cp = malloc(sizeof *cp);
+#endif
+       cp = xmalloc(sizeof *cp);
        if (cp == 0)
                return cgi_error(r, 500);
        cp->cgi_envc = 0;
Index: src/config.c
===================================================================
RCS file: /usr/local/cvsroot/user/mathopd/src/config.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- src/config.c        21 Apr 2002 22:54:48 -0000      1.1.1.1
+++ src/config.c        24 Apr 2002 00:52:32 -0000      1.2
@@ -35,7 +35,7 @@
 
 /* House of Games */
 
-static const char rcsid[] = "$Id: config.c,v 1.1.1.1 2002/04/21 22:54:48 ilatypov Exp 
$";
+static const char rcsid[] = "$Id: config.c,v 1.2 2002/04/24 00:52:32 ilatypov Exp $";
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -313,7 +313,7 @@
 
        if ((t = gettoken(p)) != t_string)
                return t;
-       if ((*a = strdup(p->tokbuf)) == 0)
+       if ((*a = xstrdup(p->tokbuf)) == 0)
                return e_memory;
        return 0;
 }
@@ -371,9 +371,9 @@
        while ((t = gettoken(p)) != t_close) {
                if (t != t_string)
                        return t;
-               if ((l = malloc(sizeof *l)) == 0)
+               if ((l = xmalloc(sizeof *l)) == 0)
                        return e_memory;
-               if ((l->name = strdup(p->tokbuf)) == 0)
+               if ((l->name = xstrdup(p->tokbuf)) == 0)
                        return e_memory;
                l->next = *ls;
                *ls = l;
@@ -450,20 +450,20 @@
        while ((t = gettoken(p)) != t_close) {
                if (t != t_string)
                        return t;
-               if ((name = strdup(p->tokbuf)) == 0)
+               if ((name = xstrdup(p->tokbuf)) == 0)
                        return e_memory;
                if ((t = gettoken(p)) != t_open)
                        return t;
                while ((t = gettoken(p)) != t_close) {
                        if (t != t_string)
                                return t;
-                       if ((m = malloc(sizeof *m)) == 0)
+                       if ((m = xmalloc(sizeof *m)) == 0)
                                return e_memory;
                        m->class = class;
                        m->name = name;
                        if (!strcasecmp(p->tokbuf, c_all))
                                m->ext = 0;
-                       else if ((m->ext = strdup(p->tokbuf)) == 0)
+                       else if ((m->ext = xstrdup(p->tokbuf)) == 0)
                                return e_memory;
                        m->next = *ms;
                        *ms = m;
@@ -524,7 +524,7 @@
        while ((t = gettoken(p)) != t_close) {
                if (t != t_string)
                        return t;
-               if ((l = malloc(sizeof *l)) == 0)
+               if ((l = xmalloc(sizeof *l)) == 0)
                        return e_memory;
                l->next = *ls;
                *ls = l;
@@ -590,7 +590,7 @@
        b = *as;
        while (b && b->locations)
                b = b->next;
-       if ((a = malloc(sizeof *a)) == 0)
+       if ((a = xmalloc(sizeof *a)) == 0)
                return e_memory;
        a->locations = 0;
        a->alias = 0;
@@ -644,12 +644,12 @@
                if (t != t_string)
                        return t;
                if (!strcasecmp(p->tokbuf, c_location)) {
-                       if ((l = malloc(sizeof *l)) == 0)
+                       if ((l = xmalloc(sizeof *l)) == 0)
                                return e_memory;
                        if ((t = gettoken(p)) != t_string)
                                return t;
                        chopslash(p->tokbuf);
-                       if ((l->name = strdup(p->tokbuf)) == 0)
+                       if ((l->name = xstrdup(p->tokbuf)) == 0)
                                return e_memory;
                        if (a->locations) {
                                l->next = a->locations->next;
@@ -663,7 +663,7 @@
                        if ((t = gettoken(p)) != t_string)
                                return t;
                        chopslash(p->tokbuf);
-                       if ((a->alias = strdup(p->tokbuf)) == 0)
+                       if ((a->alias = xstrdup(p->tokbuf)) == 0)
                                return e_memory;
                        continue;
                } else if (!strcasecmp(p->tokbuf, c_path_args))
@@ -726,12 +726,12 @@
 {
        struct virtual *v;
 
-       if ((v = malloc(sizeof *v)) == 0)
+       if ((v = xmalloc(sizeof *v)) == 0)
                return e_memory;
        if (host == 0)
                v->host = 0;
        else {
-               if ((v->host = strdup(host)) == 0)
+               if ((v->host = xstrdup(host)) == 0)
                        return e_memory;
                sanitize_host(v->host);
        }
@@ -750,7 +750,7 @@
        struct vserver *v;
        const char *t;
 
-       if ((v = malloc(sizeof *v)) == 0)
+       if ((v = xmalloc(sizeof *v)) == 0)
                return e_memory;
        v->server = parent;
        v->controls = parent->controls;
@@ -785,7 +785,7 @@
        struct server *s;
        const char *t;
 
-       if ((s = malloc(sizeof *s)) == 0)
+       if ((s = xmalloc(sizeof *s)) == 0)
                return e_memory;
        s->port = 80;
        s->addr.s_addr = 0;
@@ -840,7 +840,7 @@
                                if (s->port == 80)
                                        v->fullname = name;
                                else {
-                                       v->fullname = malloc(strlen(name) + 
sprintf(buf, ":%lu", s->port) + 1);
+                                       v->fullname = xmalloc(strlen(name) + 
+sprintf(buf, ":%lu", s->port) + 1);
                                        if (v->fullname == 0)
                                                return e_memory;
                                        strcpy(v->fullname, name);
@@ -927,12 +927,12 @@
        char *t;
        struct pool *p;
 
-       p = malloc(sizeof *p);
+       p = xmalloc(sizeof *p);
        if (p == 0)
                return 0;
-       t = malloc(s);
+       t = xmalloc(s);
        if (t == 0) {
-               free(p);
+               xfree(p);
                return 0;
        }
        p->floor = t;
@@ -947,21 +947,21 @@
        struct connection *cn;
        struct configuration *p;
 
-       p = malloc(sizeof *p);
+       p = xmalloc(sizeof *p);
        if (p == 0)
                return e_memory;
        p->size = TOKEN_LENGTH_INCREMENT;
-       p->tokbuf = malloc(p->size);
+       p->tokbuf = xmalloc(p->size);
        if (p->tokbuf == 0) {
-               free(p);
+               xfree(p);
                return e_memory;
        }
        if (config_filename) {
                p->config_file = fopen(config_filename, "r");
                if (p->config_file == 0) {
                        fprintf(stderr, "Cannot open configuration file %s\n", 
config_filename);
-                       free(p->tokbuf);
-                       free(p);
+                       xfree(p->tokbuf);
+                       xfree(p);
                        return e_noinput;
                }
        } else
@@ -984,12 +984,12 @@
                if (config_filename)
                        fprintf(stderr, "In configuration file: %s\n", 
config_filename);
                fprintf(stderr, "Error at token '%s' around line %d\n", p->tokbuf, 
p->line);
-               free(p->tokbuf);
-               free(p);
+               xfree(p->tokbuf);
+               xfree(p);
                return s;
        }
-       free(p->tokbuf);
-       free(p);
+       xfree(p->tokbuf);
+       xfree(p);
        if (log_column == 0) {
                log_column = default_log_column;
                log_columns = sizeof default_log_column / sizeof default_log_column[0];
@@ -1000,9 +1000,9 @@
        if (init_pollfds(tuning.num_connections + num_servers) == -1)
                return e_memory;
        for (n = 0; n < tuning.num_connections; n++) {
-               if ((cn = malloc(sizeof *cn)) == 0)
+               if ((cn = xmalloc(sizeof *cn)) == 0)
                        return e_memory;
-               if ((cn->r = malloc(sizeof *cn->r)) == 0)
+               if ((cn->r = xmalloc(sizeof *cn->r)) == 0)
                        return e_memory;
                if ((cn->input = new_pool(tuning.input_buf_size)) == 0)
                        return e_memory;
Index: src/log.c
===================================================================
RCS file: /usr/local/cvsroot/user/mathopd/src/log.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- src/log.c   21 Apr 2002 22:54:48 -0000      1.1.1.1
+++ src/log.c   22 Apr 2002 22:32:34 -0000      1.2
@@ -35,7 +35,7 @@
 
 /* Piece Of My Luck */
 
-static const char rcsid[] = "$Id: log.c,v 1.1.1.1 2002/04/21 22:54:48 ilatypov Exp $";
+static const char rcsid[] = "$Id: log.c,v 1.2 2002/04/22 22:32:34 ilatypov Exp $";
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -179,7 +179,9 @@
        }
        b[-1] = '\n';
        if (write(log_file, log_buffer, b - log_buffer) == -1) {
+#ifndef EMBED
                gotsigterm = 1;
+#endif
                log_d("log_request: cannot write to log file");
                lerror("write");
        }
@@ -249,8 +251,11 @@
        n = vsnprintf(log_line + l, m, fmt, ap);
        l += n < m ? n : m - 1;
        log_line[l++] = '\n';
-       if (error_file != -1 && write(error_file, log_line, l) == -1)
+       if (error_file != -1 && write(error_file, log_line, l) == -1) {
+#ifndef EMBED
                gotsigterm = 1;
+#endif
+       }
        if (am_daemon == 0 && forked == 0)
                write(2, log_line, l);
        errno = saved_errno;
Index: src/main.c
===================================================================
RCS file: /usr/local/cvsroot/user/mathopd/src/main.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- src/main.c  21 Apr 2002 22:54:48 -0000      1.1.1.1
+++ src/main.c  22 Apr 2002 22:38:24 -0000      1.2
@@ -35,7 +35,7 @@
 
 /* Once Around */
 
-static const char rcsid[] = "$Id: main.c,v 1.1.1.1 2002/04/21 22:54:48 ilatypov Exp 
$";
+static const char rcsid[] = "$Id: main.c,v 1.2 2002/04/22 22:38:24 ilatypov Exp $";
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -220,8 +220,10 @@
                pwd = getpwnam(user_name);
                if (pwd == 0)
                        die(0, "%s: Unknown user.", user_name);
+#ifndef IGNORE_SECURITY
                if (pwd->pw_uid == 0)
                        die(0, "%s: Invalid user.", user_name);
+#endif
                if (initgroups(user_name, pwd->pw_gid) == -1)
                        die("initgroups", 0);
                if (setgid(pwd->pw_gid) == -1)
@@ -261,14 +263,22 @@
        }
        close(null_fd);
        if (am_daemon) {
+#if HAVE_WORKING_FORK - 0
                if (fork())
                        _exit(0);
+#endif
                setsid();
+#if HAVE_WORKING_FORK - 0
                if (fork())
                        _exit(0);
+#endif
        }
        mysignal(SIGCHLD, sighandler);
+#ifndef IGNORE_SIGHUP
        mysignal(SIGHUP, sighandler);
+#else
+       mysignal(SIGHUP, SIG_IGN);
+#endif
        mysignal(SIGTERM, sighandler);
        mysignal(SIGINT, sighandler);
        mysignal(SIGQUIT, sighandler);
@@ -286,6 +296,24 @@
        return 0;
 }
 
+static int store_query(const char *query)
+{
+       int fd;
+       char tmpbuf[32];
+
+       strcpy(tmpbuf, "/tmp/mathop-query.XXXXXXXX");
+       fd = mkstemp(tmpbuf);
+       if (fd == -1) {
+               lerror("mkstemp");
+               return -1;
+       }
+       write(fd, query, strlen(query));
+       write(fd, "\n", 1);
+       lseek(fd, 0, SEEK_SET);
+       unlink(tmpbuf);
+       return fd;
+}
+
 int fork_request(struct request *r, int (*f)(struct request *))
 {
        int fd, efd;
@@ -298,7 +326,14 @@
        switch (pid) {
        case 0:
                my_pid = getpid();
+/*
+   The data segment is shared by the parent and the child in 
+   fork()-deprived uClinux.  This means that forked would be 1
+   in both child and parent processes.
+ */
+#if HAVE_WORKING_FORK - 0
                forked = 1;
+#endif
                mysignal(SIGPIPE, SIG_DFL);
                fd = r->cn->fd;
                child_filename = r->c->child_filename;
@@ -313,7 +348,15 @@
                        }
                }
                fcntl(fd, F_SETFL, 0);
-               dup2(fd, 0);
+               if (r->args) {
+                       int fdq = store_query(r->args);
+                       if (fdq > 0) {
+                               dup2(fdq, 0);
+                               close(fdq);
+                       }
+               } else {
+                       dup2(fd, 0);
+               }
                dup2(fd, 1);
                dup2(efd, 2);
                close(fd);
Index: src/mathopd.h
===================================================================
RCS file: /usr/local/cvsroot/user/mathopd/src/mathopd.h,v
retrieving revision 1.1.1.1
retrieving revision 1.3
diff -u -r1.1.1.1 -r1.3
--- src/mathopd.h       21 Apr 2002 22:54:48 -0000      1.1.1.1
+++ src/mathopd.h       24 Apr 2002 00:52:32 -0000      1.3
@@ -43,6 +43,63 @@
 #include <netinet/in.h>
 #include <signal.h>
 
+#include "config.h"
+
+/*
+#define DEBUG_EXEC 1
+#define DEBUG_MALLOC 1
+*/
+
+#if DEBUG_EXEC - 0
+#  include <syslog.h>
+#  define DEBUG_LOG(fmt, args...)    do { \
+       syslog(LOG_INFO, "%s (%d): " fmt "\n", \
+               __FUNCTION__, __LINE__ , ##args); \
+       } while (0)
+#  define D(x) x
+
+#else
+
+#  define DEBUG_LOG(fmt, args...)  do { } while (0)
+#  define D(x)
+#endif
+
+#define DEBUG_MARK()  DEBUG_LOG("debug mark")
+
+#if DEBUG_MALLOC - 0
+#  include <syslog.h>
+#  define xmalloc(n)   ( { \
+       void *ptr; \
+       ptr = malloc(n); \
+       syslog(LOG_INFO, "%s (%d): malloc(%ld) %p\n", \
+               __FUNCTION__, __LINE__ , (long)n, ptr); \
+       ptr ; \
+       } )
+#  define xstrdup(s)   ( { \
+       char *ptr; \
+       ptr = strdup(s); \
+       syslog(LOG_INFO, "%s (%d): strdup(%s) %p\n", \
+               __FUNCTION__, __LINE__ , s, ptr); \
+       ptr ; \
+       } )
+#  define xfree(p)     ( \
+       syslog(LOG_INFO, "%s (%d): free %p\n", \
+               __FUNCTION__, __LINE__ , p), \
+       free(p), \
+       p = NULL \
+       )
+#  define DEBUG_MALLOC_LOG(fmt, args...)    do { \
+       syslog(LOG_INFO, "%s (%d): " fmt "\n", \
+               __FUNCTION__, __LINE__ , ##args); \
+       } while (0)
+#else
+#  define xmalloc(n)   malloc(n)
+#  define xstrdup(s)   strdup(s)
+#  define xfree(p)     free(p)
+#  define DEBUG_MALLOC_LOG(fmt, args...)  do { } while (0)
+#endif
+
+
 #define CGI_MAGIC_TYPE "CGI"
 #define IMAP_MAGIC_TYPE "Imagemap"
 #define DUMMY_MAGIC_TYPE "Dummy"
Index: src/request.c
===================================================================
RCS file: /usr/local/cvsroot/user/mathopd/src/request.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- src/request.c       21 Apr 2002 22:54:48 -0000      1.1.1.1
+++ src/request.c       22 Apr 2002 22:40:22 -0000      1.2
@@ -35,7 +35,7 @@
 
 /* Mysterons */
 
-static const char rcsid[] = "$Id: request.c,v 1.1.1.1 2002/04/21 22:54:48 ilatypov 
Exp $";
+static const char rcsid[] = "$Id: request.c,v 1.2 2002/04/22 22:40:22 ilatypov Exp $";
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -545,7 +545,7 @@
        }
        r->content_length = r->finfo.st_size;
        r->last_modified = r->finfo.st_mtime;
-       if (r->last_modified <= r->ims) {
+       if (r->last_modified < r->ims) {
                close(fd);
                r->num_content = -1;
                return 304;
===================================================================




Reply via email to