]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
2001-03-11 H.J. Lu <hjl@lucon.org>
authorhjl <hjl>
Mon, 12 Mar 2001 00:49:42 +0000 (00:49 +0000)
committerhjl <hjl>
Mon, 12 Mar 2001 00:49:42 +0000 (00:49 +0000)
* support/include/rpcmisc.h: Undo the change made on 2001-03-10.
* support/nfs/rpcmisc.c: Likewise.
* utils/rquotad/rquota_svc.c: Likewise.
* utils/rquotad/rquotad.man: Likewise.
* utils/statd/Makefile: Likewise.
* utils/statd/rmtcall.c: Likewise.
* utils/statd/simulate.c: Likewise.
* utils/statd/statd.c: Likewise.
* utils/statd/statd.man: Likewise.

ChangeLog
support/include/rpcmisc.h
support/nfs/rpcmisc.c
utils/rquotad/rquota_svc.c
utils/rquotad/rquotad.man
utils/statd/Makefile
utils/statd/rmtcall.c
utils/statd/simulate.c
utils/statd/statd.c
utils/statd/statd.man

index 5114f05bc9bc0ed3121c2bbfe966aec9f9fb29f1..0bfc18b150705848a9a6e8fba314bf8db251ee74 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-03-11  H.J. Lu <hjl@lucon.org>
+
+       * support/include/rpcmisc.h: Undo the change made on 2001-03-10.
+       * support/nfs/rpcmisc.c: Likewise.
+       * utils/rquotad/rquota_svc.c: Likewise.
+       * utils/rquotad/rquotad.man: Likewise.
+       * utils/statd/Makefile: Likewise.
+       * utils/statd/rmtcall.c: Likewise.
+       * utils/statd/simulate.c: Likewise.
+       * utils/statd/statd.c: Likewise.
+       * utils/statd/statd.man: Likewise.
+
 2001-03-10  H.J. Lu <hjl@lucon.org>
 
        * configure.in (VERSION): Set to "0.3.2".
 2001-03-10  H.J. Lu <hjl@lucon.org>
 
        * configure.in (VERSION): Set to "0.3.2".
index a2b2b5a9d4d5b4572c8f016c77228363626b7667..d999ab9346518d716e3d62e91f28613cb0a96d7a 100644 (file)
@@ -41,8 +41,6 @@ struct rpc_dtable {
                (xdrproc_t)xdr_##res_type, sizeof(res_type), \
        }
 
                (xdrproc_t)xdr_##res_type, sizeof(res_type), \
        }
 
-
-int            makesock(int port, int proto);
 void           rpc_init(char *name, int prog, int vers,
                                void (*dispatch)(struct svc_req *, SVCXPRT *),
                                int defport);
 void           rpc_init(char *name, int prog, int vers,
                                void (*dispatch)(struct svc_req *, SVCXPRT *),
                                int defport);
index 4c0906d883e35629e7f7d329bbb40a8b54d978f3..7a9de1c733b9506cece74ebf345a8911b9c7c451 100644 (file)
@@ -33,7 +33,7 @@
 #include "nfslib.h"
 
 static void    closedown(int sig);
 #include "nfslib.h"
 
 static void    closedown(int sig);
-int    makesock(int port, int proto);
+static int     makesock(int port, int proto);
 
 #define _RPCSVC_CLOSEDOWN      120
 int    _rpcpmstart = 0;
 
 #define _RPCSVC_CLOSEDOWN      120
 int    _rpcpmstart = 0;
@@ -145,7 +145,9 @@ int sig;
        (void) alarm(_RPCSVC_CLOSEDOWN);
 }
 
        (void) alarm(_RPCSVC_CLOSEDOWN);
 }
 
-int makesock(int port, int proto)
+static int makesock(port, proto)
+int port;
+int proto;
 {
        struct sockaddr_in sin;
        int     s;
 {
        struct sockaddr_in sin;
        int     s;
index 104ba7eb8946cdb2675439f84d5896eaefd4c016..f55c192762bf3aab0975994a05896f2f691e94cc 100644 (file)
@@ -35,8 +35,6 @@
 #include <netinet/in.h>
 #include <syslog.h>
 #include <signal.h>
 #include <netinet/in.h>
 #include <syslog.h>
 #include <signal.h>
-#include <getopt.h>
-#include <rpcmisc.h>
 
 #ifdef __STDC__
 #define SIG_PF void(*)(int)
 
 #ifdef __STDC__
 #define SIG_PF void(*)(int)
@@ -51,14 +49,6 @@ extern getquota_rslt *rquotaproc_getquota_2(ext_getquota_args *argp,
 extern getquota_rslt *rquotaproc_getactivequota_2(ext_getquota_args *argp,
                                                  struct svc_req *rqstp);
 
 extern getquota_rslt *rquotaproc_getactivequota_2(ext_getquota_args *argp,
                                                  struct svc_req *rqstp);
 
-static struct option longopts[] =
-{
-        { "help", 0, 0, 'h' },
-        { "version", 0, 0, 'v' },
-        { "port", 1, 0, 'p' },
-        { NULL, 0, 0, 0 }
-};
-
 /*
  * Global authentication credentials.
  */
 /*
  * Global authentication credentials.
  */
@@ -214,53 +204,19 @@ static void rquotaprog_2(struct svc_req *rqstp, register SVCXPRT *transp)
    return;
 }
 
    return;
 }
 
-static void
-usage(const char *prog, int n)
-{
-  fprintf(stderr, "Usage: %s [-p|--port port] [-h|-?|--help] [-v|--version]\n", prog);
-  exit(n);
-}
-
 int main(int argc, char **argv)
 {
    register SVCXPRT *transp;
 int main(int argc, char **argv)
 {
    register SVCXPRT *transp;
-   char c;
-   int port = 0;
 
    (void) pmap_unset(RQUOTAPROG, RQUOTAVERS);
    (void) pmap_unset(RQUOTAPROG, EXT_RQUOTAVERS);
 
    openlog("rquota", LOG_PID, LOG_DAEMON);
 
 
    (void) pmap_unset(RQUOTAPROG, RQUOTAVERS);
    (void) pmap_unset(RQUOTAPROG, EXT_RQUOTAVERS);
 
    openlog("rquota", LOG_PID, LOG_DAEMON);
 
-   while ((c = getopt_long(argc, argv, "hp:v", longopts, NULL)) != EOF) {
-     switch (c) {
-     case '?':
-     case 'h':
-       usage(argv[0], 0);
-       break;
-     case 'p':
-       port = atoi(optarg);
-       if (port < 1 || port > 65535) {
-        fprintf(stderr, "%s: bad port number: %s\n",
-                argv[0], optarg);
-        usage(argv[0], 1);
-       }
-       break;
-     case 'v':
-       printf("rquotad %s\n", VERSION);
-       exit(0);
-     default:
-       usage(argv[0], 1);
-     }
-   }
-
    /* WARNING: the following works on Linux and SysV, but not BSD! */
    signal(SIGCHLD, SIG_IGN);
 
    /* WARNING: the following works on Linux and SysV, but not BSD! */
    signal(SIGCHLD, SIG_IGN);
 
-   if (port)
-     transp = svcudp_create(makesock(port, IPPROTO_UDP));
-   else
-     transp = svcudp_create(RPC_ANYSOCK);
+   transp = svcudp_create(RPC_ANYSOCK);
    if (transp == NULL) {
       syslog(LOG_ERR, "cannot create udp service.");
       exit(1);
    if (transp == NULL) {
       syslog(LOG_ERR, "cannot create udp service.");
       exit(1);
index f4d5d6f094583b68b1fb02102298bb15939d5679..9b16df50fcfba221d04d40fcc1fc0e368277adbb 100644 (file)
@@ -1,9 +1,9 @@
 .\"@(#)rquotad.8"
 .\"@(#)rquotad.8"
-.TH RQUOTAD 8 "8 Mar 2001"
+.TH RQUOTAD 8 "25 Aug 2000"
 .SH NAME
 rquotad, rpc.rquotad \- remote quota server
 .SH SYNOPSIS
 .SH NAME
 rquotad, rpc.rquotad \- remote quota server
 .SH SYNOPSIS
-.B /usr/etc/rpc.rquotad [-p " port "] "
+.B /usr/etc/rpc.rquotad
 .SH DESCRIPTION
 .LP
 .IX  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
 .SH DESCRIPTION
 .LP
 .IX  "rquotad daemon"  ""  "\fLrquotad\fP \(em remote quota server"
@@ -35,21 +35,6 @@ or
 .BR /etc/init.d/
 (on systems with SysV'ish scripts, e.g. RedHat, SuSE, etc).
 
 .BR /etc/init.d/
 (on systems with SysV'ish scripts, e.g. RedHat, SuSE, etc).
 
-.SH OPTIONS
-.TP
-.BI "\-p," "" " \-\-port " port
-specify a port for 
-.BR rpc.rquotad 
-to listen on.  By default,
-.BR rpc.rquotad
-will ask
-.BR portmap (8)
-to assign it a port number.  As of this writing, there is not
-a standard port number that 
-.BR portmap
-always or usually assigns.  Specifying
-a port may be useful when implementing a firewall.
-
 .SH TCP_WRAPPERS SUPPORT
 This
 .BR rpc.rquotad
 .SH TCP_WRAPPERS SUPPORT
 This
 .BR rpc.rquotad
@@ -84,6 +69,5 @@ manual pages.
 .BR quota (8),
 .BR rpc (3N),
 .BR nfs (5),
 .BR quota (8),
 .BR rpc (3N),
 .BR nfs (5),
-.BR services (5),
-.BR portmap(8),
-.BR inetd (8)
+.BR services (5)
+.BR inetd (8),
index 03e97e038c5d578c35b77dae86a5ed86a7841763..211e22da5c371a8ba1849b543075271916797bc2 100644 (file)
@@ -16,7 +16,7 @@ PROGRAM       = statd
 PREFIX = rpc.
 OBJS   = $(SRCS:.c=.o)
 CCOPTS = $(DEBUG) $(SIMUL)
 PREFIX = rpc.
 OBJS   = $(SRCS:.c=.o)
 CCOPTS = $(DEBUG) $(SIMUL)
-LIBS   = -lexport -lnfs -lmisc $(LIBWRAP) $(LIBNSL)
+LIBS   = -lexport -lmisc $(LIBWRAP) $(LIBNSL)
 
 SRCS   = $(RPCSRCS) $(SIMSRCS) \
          callback.c notlist.c log.c misc.c monitor.c notify.c simu.c \
 
 SRCS   = $(RPCSRCS) $(SIMSRCS) \
          callback.c notlist.c log.c misc.c monitor.c notify.c simu.c \
index f01faba06e1a7be80a5c0c3c344cccc1fd58e776..b70e5bb701e829a391ff6fda47abd10239fab4cb 100644 (file)
@@ -47,8 +47,8 @@ static int            sockfd = -1;    /* notify socket */
 /*
  * Initialize callback socket
  */
 /*
  * Initialize callback socket
  */
-int
-statd_get_socket(int port)
+static int
+get_socket(void)
 {
        struct sockaddr_in      sin;
 
 {
        struct sockaddr_in      sin;
 
@@ -64,7 +64,6 @@ statd_get_socket(int port)
 
        memset(&sin, 0, sizeof(sin));
        sin.sin_family = AF_INET;
 
        memset(&sin, 0, sizeof(sin));
        sin.sin_family = AF_INET;
-       sin.sin_port = port;
        if (bindresvport(sockfd, &sin) < 0) {
                dprintf(L_WARNING,
                        "process_hosts: can't bind to reserved port\n");
        if (bindresvport(sockfd, &sin) < 0) {
                dprintf(L_WARNING,
                        "process_hosts: can't bind to reserved port\n");
@@ -395,7 +394,7 @@ process_notify_list(void)
        time_t          now;
        int             fd;
 
        time_t          now;
        int             fd;
 
-       if ((fd = statd_get_socket(0)) < 0)
+       if ((fd = get_socket()) < 0)
                return 0;
 
        while ((entry = notify) != NULL && NL_WHEN(entry) < time(&now)) {
                return 0;
 
        while ((entry = notify) != NULL && NL_WHEN(entry) < time(&now)) {
index 3bebfc795a8d06ba6a6ea4b638f5b16394c5d6c8..4b8d59cad042b9dbf0d68788e047217eab7419c7 100644 (file)
@@ -18,7 +18,6 @@
 #include <string.h>
 #include <rpc/rpc.h>
 #include <rpc/pmap_clnt.h>
 #include <string.h>
 #include <rpc/rpc.h>
 #include <rpc/pmap_clnt.h>
-#include <rpcmisc.h>
 #include "statd.h"
 #include "sim_sm_inter.h"
 
 #include "statd.h"
 #include "sim_sm_inter.h"
 
@@ -208,8 +207,8 @@ daemon_simulator (void)
   signal (SIGINT, sim_killer);
   signal (SIGTERM, sim_killer);
   pmap_unset (sim_port, SIM_SM_VERS);
   signal (SIGINT, sim_killer);
   signal (SIGTERM, sim_killer);
   pmap_unset (sim_port, SIM_SM_VERS);
-  /* this registers both UDP and TCP services */
-  rpc_init("statd", sim_port, SIM_SM_VERS, sim_sm_prog_1, 0);
+  do_regist (sim_port, sim_sm_prog_1);
+/*   do_regist (sim_port, (__dispatch_fn_t)sim_sm_prog_1); */
   svc_run ();
   pmap_unset (sim_port, SIM_SM_VERS);
 }
   svc_run ();
   pmap_unset (sim_port, SIM_SM_VERS);
 }
index e758707887963aca31ddfae79785e39e36bcadc3..a63a6a26a37bcbcef46a61582e06fcd1146cc461 100644 (file)
 #include <signal.h>
 #include <unistd.h>
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
 #include <string.h>
-#include <getopt.h>
 #include <rpc/rpc.h>
 #include <rpc/pmap_clnt.h>
 #include <rpc/rpc.h>
 #include <rpc/pmap_clnt.h>
-#include <rpcmisc.h>
 #include "statd.h"
 #include "version.h"
 
 #include "statd.h"
 #include "version.h"
 
@@ -25,6 +23,9 @@
 
 
 short int restart = 0;
 
 
 short int restart = 0;
+int    _rpcpmstart = 0;        /* flags for tirpc rpcgen */
+int    _rpcfdtype = 0;
+int    _rpcsvcdirty = 0;
 int    run_mode = 0;           /* foreground logging mode */
 
 /* LH - I had these local to main, but it seemed silly to have 
 int    run_mode = 0;           /* foreground logging mode */
 
 /* LH - I had these local to main, but it seemed silly to have 
@@ -33,19 +34,7 @@ int  run_mode = 0;           /* foreground logging mode */
 char *name_p = NULL;
 char *version_p = NULL;
 
 char *name_p = NULL;
 char *version_p = NULL;
 
-static struct option longopts[] =
-{
-       { "foreground", 0, 0, 'F' },
-       { "no-syslog", 0, 0, 'd' },
-       { "help", 0, 0, 'h' },
-       { "version", 0, 0, 'v' },
-       { "outgoing-port", 1, 0, 'o' },
-       { "port", 1, 0, 'p' },
-       { NULL, 0, 0, 0 }
-};
-
 extern void sm_prog_1 (struct svc_req *, register SVCXPRT *);
 extern void sm_prog_1 (struct svc_req *, register SVCXPRT *);
-extern int statd_get_socket(int port);
 
 #ifdef SIMULATIONS
 extern void simulator (int, char **);
 
 #ifdef SIMULATIONS
 extern void simulator (int, char **);
@@ -119,12 +108,10 @@ static void
 usage()
 {
        fprintf(stderr,"usage: %s [options]\n", name_p);
 usage()
 {
        fprintf(stderr,"usage: %s [options]\n", name_p);
-       fprintf(stderr,"      -h, -?, --help       Print this help screen.\n");
-       fprintf(stderr,"      -F, --foreground     Foreground (no-daemon mode)\n");
-       fprintf(stderr,"      -d, --no-syslog      Verbose logging to stderr.  Foreground mode only.\n");
-       fprintf(stderr,"      -p, --port           Port to listen on\n");
-       fprintf(stderr,"      -o, --outgoing-port  Port for outgoing connections\n");
-       fprintf(stderr,"      -V, -v, --version    Display version information and exit.\n");
+       fprintf(stderr,"      -h, -?       Print this help screen.\n");
+       fprintf(stderr,"      -F           Foreground (no-daemon mode)\n");
+       fprintf(stderr,"      -d           Verbose logging to stderr.  Foreground mode only.\n");
+       fprintf(stderr,"      -V           Display version information and exit.\n");
 }
 
 /* 
 }
 
 /* 
@@ -135,8 +122,7 @@ int main (int argc, char **argv)
        extern char *optarg;
        int pid;
        int arg;
        extern char *optarg;
        int pid;
        int arg;
-       int port = 0, out_port = 0;
-
+       
        /* Default: daemon mode, no other options */
        run_mode = 0;
 
        /* Default: daemon mode, no other options */
        run_mode = 0;
 
@@ -155,51 +141,27 @@ int main (int argc, char **argv)
        }
        
        /* Process command line switches */
        }
        
        /* Process command line switches */
-       while ((arg = getopt_long(argc, argv, "h?vVFdp:o:", longopts, NULL)) != EOF) {
+       while ((arg = getopt(argc, argv, "h?VFd")) >= 0) {
                switch (arg) {
                switch (arg) {
-               case 'V':       /* Version */
-               case 'v':
-                       printf("%s version %s\n",name_p,version_p);
-                       exit(0);
-               case 'F':       /* Foreground/nodaemon mode */
-                       run_mode |= MODE_NODAEMON;
-                       break;
-               case 'd':       /* No daemon only - log to stderr */
-                       run_mode |= MODE_LOG_STDERR;
-                       break;
-               case 'o':
-                       out_port = atoi(optarg);
-                       if (out_port < 1 || out_port > 65535) {
-                               fprintf(stderr, "%s: bad port number: %s\n",
-                                       argv[0], optarg);
+                       case 'V':       /* Version */
+                               printf("%s version %s\n",name_p,version_p);
+                               exit(0);
+                       case 'F':       /* Foreground/nodaemon mode */
+                               run_mode |= MODE_NODAEMON;
+                               break;
+                       case 'd':       /* No daemon only - log to stderr */
+                               run_mode |= MODE_LOG_STDERR;
+                               break;
+                       case '?':       /* heeeeeelllllllpppp? heh */
+                       case 'h':
                                usage();
                                usage();
-                               exit(1);
-                       }
-                       break;
-               case 'p':
-                       port = atoi(optarg);
-                       if (port < 1 || port > 65535) {
-                               fprintf(stderr, "%s: bad port number: %s\n",
-                                       argv[0], optarg);
+                               exit (0);
+                       default:        /* oh dear ... heh */
                                usage();
                                usage();
-                               exit(1);
-                       }
-                       break;
-               case '?':       /* heeeeeelllllllpppp? heh */
-               case 'h':
-                       usage();
-                       exit (0);
-               default:        /* oh dear ... heh */
-                       usage();
-                       exit(-1);
+                               exit(-1);
                }
        }
 
                }
        }
 
-       if (port == out_port && port != 0) {
-               fprintf(stderr, "Listening and outgoing ports cannot be the same!\n");
-               exit(-1);
-       }
-
        if (!(run_mode & MODE_NODAEMON)) {
                run_mode &= ~MODE_LOG_STDERR;   /* Never log to console in
                                                   daemon mode. */
        if (!(run_mode & MODE_NODAEMON)) {
                run_mode &= ~MODE_LOG_STDERR;   /* Never log to console in
                                                   daemon mode. */
@@ -241,9 +203,6 @@ int main (int argc, char **argv)
        /* WARNING: the following works on Linux and SysV, but not BSD! */
        signal(SIGCHLD, SIG_IGN);
 
        /* WARNING: the following works on Linux and SysV, but not BSD! */
        signal(SIGCHLD, SIG_IGN);
 
-       /* initialize out_port */
-       statd_get_socket(out_port);
-
        for (;;) {
                pmap_unset (SM_PROG, SM_VERS);
                change_state ();
        for (;;) {
                pmap_unset (SM_PROG, SM_VERS);
                change_state ();
@@ -253,10 +212,9 @@ int main (int argc, char **argv)
 
                /* future: IP aliasing 
                if (!(run_mode & MODE_NOTIFY_ONLY)) {
 
                /* future: IP aliasing 
                if (!(run_mode & MODE_NOTIFY_ONLY)) {
-                       rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port);
+                       do_regist (SM_PROG, sm_prog_1);
                } */
                } */
-               /* this registers both UDP and TCP services */
-               rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port);
+               do_regist(SM_PROG,sm_prog_1);
 
                /*
                 * Handle incoming requests:  SM_NOTIFY socket requests, as
 
                /*
                 * Handle incoming requests:  SM_NOTIFY socket requests, as
@@ -266,3 +224,24 @@ int main (int argc, char **argv)
        }
        return 0;
 }
        }
        return 0;
 }
+
+
+/*
+ * Register services.
+ */
+void do_regist(u_long prog, void (*sm_prog_1)())
+{
+       SVCXPRT         *transp;
+
+       if ((transp = svcudp_create(RPC_ANYSOCK)) == NULL)
+               die("cannot create udp service.");
+
+       if (!svc_register(transp, prog, SM_VERS, sm_prog_1, IPPROTO_UDP))
+               die("unable to register (SM_PROG, SM_VERS, udp).");
+
+       if ((transp = svctcp_create(RPC_ANYSOCK, 0, 0)) == NULL)
+               die("cannot create tcp service.");
+
+       if (!svc_register(transp, prog, SM_VERS, sm_prog_1, IPPROTO_TCP))
+               die("unable to register (SM_PROG, SM_VERS, tcp).");
+}
index 84199e83f91fffbb65be51b4ec4316944a387c3c..8a7bd8cda301798a10929b64eb17306697c3dc9e 100644 (file)
@@ -4,11 +4,11 @@
 .\" Copyright (C) 1999 Olaf Kirch <okir@monad.swb.de>
 .\" Modified by Jeffrey A. Uphoff, 1999.
 .\" Modified by Lon Hohberger, 2000.
 .\" Copyright (C) 1999 Olaf Kirch <okir@monad.swb.de>
 .\" Modified by Jeffrey A. Uphoff, 1999.
 .\" Modified by Lon Hohberger, 2000.
-.TH rpc.statd 8 "08 Mar 2001"
+.TH rpc.statd 8 "05 Oct 2000"
 .SH NAME
 rpc.statd \- NSM status monitor
 .SH SYNOPSIS
 .SH NAME
 rpc.statd \- NSM status monitor
 .SH SYNOPSIS
-.B "/sbin/rpc.statd [-F] [-d] [-?] [-o " port "] [-p " port "] [-V]"
+.B "/usr/sbin/rpc.statd [-F] [-d] [-?] [-V]
 .SH DESCRIPTION
 The
 .B rpc.statd
 .SH DESCRIPTION
 The
 .B rpc.statd
@@ -52,32 +52,6 @@ be used in conjunction with the
 .B -F
 parameter.
 .TP
 .B -F
 parameter.
 .TP
-.BI "\-o," "" " \-\-outgoing\-port "  port
-specify a port for
-.B rpc.statd
-to send outgoing status requests from.  By default,
-.BR rpc.statd
-will ask
-.BR portmap (8)
-to assign it a port number.  As of this writing, there is not
-a standard port number that
-.BR portmap
-always or usually assigns.  Specifying
-a port may be useful when implementing a firewall.
-.TP
-.BI "\-p," "" " \-\-port " port
-specify a port for
-.B rpc.statd
-to listen on.  By default,
-.BR rpc.statd
-will ask
-.BR portmap (8)
-to assign it a port number.  As of this writing, there is not
-a standard port number that
-.BR portmap
-always or usually assigns.  Specifying
-a port may be useful when implementing a firewall.
-.TP
 .B -?
 Causes
 .B rpc.statd
 .B -?
 Causes
 .B rpc.statd
@@ -122,8 +96,7 @@ manual pages.
 .br
 .BR /var/lib/nfs/sm.bak/*
 .SH SEE ALSO
 .br
 .BR /var/lib/nfs/sm.bak/*
 .SH SEE ALSO
-.BR rpc.nfsd(8),
-.BR portmap(8)
+.BR rpc.nfsd(8)
 .SH AUTHORS
 .br
 Jeff Uphoff <juphoff@transmeta.com>
 .SH AUTHORS
 .br
 Jeff Uphoff <juphoff@transmeta.com>