diff options
author | Karel Zak | 2006-12-07 00:25:46 +0100 |
---|---|---|
committer | Karel Zak | 2006-12-07 00:25:46 +0100 |
commit | c07ebfa1e02d208ab12430e6791ea147bcfaf9c0 (patch) | |
tree | d44a755098286f5d553c7aea1a73d98c2995d6ec /sys-utils | |
parent | Imported from util-linux-2.10s tarball. (diff) | |
download | kernel-qcow2-util-linux-c07ebfa1e02d208ab12430e6791ea147bcfaf9c0.tar.gz kernel-qcow2-util-linux-c07ebfa1e02d208ab12430e6791ea147bcfaf9c0.tar.xz kernel-qcow2-util-linux-c07ebfa1e02d208ab12430e6791ea147bcfaf9c0.zip |
Imported from util-linux-2.11b tarball.
Diffstat (limited to 'sys-utils')
-rw-r--r-- | sys-utils/ctrlaltdel.c | 2 | ||||
-rw-r--r-- | sys-utils/cytune.c | 2 | ||||
-rw-r--r-- | sys-utils/dmesg.c | 2 | ||||
-rw-r--r-- | sys-utils/ipcrm.c | 2 | ||||
-rw-r--r-- | sys-utils/ipcs.c | 46 | ||||
-rw-r--r-- | sys-utils/rdev.c | 2 | ||||
-rw-r--r-- | sys-utils/readprofile.1 | 16 | ||||
-rw-r--r-- | sys-utils/readprofile.c | 335 | ||||
-rw-r--r-- | sys-utils/renice.c | 2 | ||||
-rw-r--r-- | sys-utils/setsid.c | 22 | ||||
-rw-r--r-- | sys-utils/tunelp.c | 2 |
11 files changed, 241 insertions, 192 deletions
diff --git a/sys-utils/ctrlaltdel.c b/sys-utils/ctrlaltdel.c index 91b67bc8b..beabc6059 100644 --- a/sys-utils/ctrlaltdel.c +++ b/sys-utils/ctrlaltdel.c @@ -2,7 +2,7 @@ * ctrlaltdel.c - Set the function of the Ctrl-Alt-Del combination * Created 4-Jul-92 by Peter Orbaek <poe@daimi.aau.dk> * ftp://ftp.daimi.aau.dk/pub/linux/poe/ - * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support * */ diff --git a/sys-utils/cytune.c b/sys-utils/cytune.c index 63ca0e4e2..dfa276e9b 100644 --- a/sys-utils/cytune.c +++ b/sys-utils/cytune.c @@ -34,7 +34,7 @@ */ /* - * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support * Sun Mar 21 1999 - Arnaldo Carvalho de Melo <acme@conectiva.com.br> * - fixed strerr(errno) in gettext calls diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c index 5cf1817aa..f9d1e282e 100644 --- a/sys-utils/dmesg.c +++ b/sys-utils/dmesg.c @@ -6,7 +6,7 @@ * Modifications by Rick Sladkey (jrs@world.std.com) * Larger buffersize 3 June 1998 by Nicolai Langfeldt, based on a patch * by Peeter Joot. This was also suggested by John Hudson. - * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support * */ diff --git a/sys-utils/ipcrm.c b/sys-utils/ipcrm.c index 2fc6ec47f..3e3a9ba02 100644 --- a/sys-utils/ipcrm.c +++ b/sys-utils/ipcrm.c @@ -1,7 +1,7 @@ /* * krishna balasubramanian 1993 * - * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support * * 1999-04-02 frank zago diff --git a/sys-utils/ipcs.c b/sys-utils/ipcs.c index d74fa359e..eec8bce9c 100644 --- a/sys-utils/ipcs.c +++ b/sys-utils/ipcs.c @@ -1,7 +1,7 @@ -/* Original author unknown, but may be "krishna balasub@cis.ohio-state.edu" - Modified Sat Oct 9 10:55:28 1993 for 0.99.13 */ +/* Original author unknown, may be "krishna balasub@cis.ohio-state.edu" */ +/* -/* + Modified Sat Oct 9 10:55:28 1993 for 0.99.13 Patches from Mike Jagdis (jaggy@purplet.demon.co.uk) applied Wed Feb 8 12:12:21 1995 by faith@cs.unc.edu to print numeric uids if no @@ -13,7 +13,7 @@ Patched to display the key field -- hy@picksys.com 12/18/96 - 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> - added Native Language Support @@ -335,10 +335,13 @@ void do_shm (char format) printf ("%-10d%-10.10s", shmid, pw->pw_name); else printf ("%-10d%-10d", shmid, ipcp->uid); - printf(" %-20.16s%-20.16s%-20.16s\n", - shmseg.shm_atime ? ctime(&shmseg.shm_atime) + 4 : _("Not set"), - shmseg.shm_dtime ? ctime(&shmseg.shm_dtime) + 4 : _("Not set"), - shmseg.shm_ctime ? ctime(&shmseg.shm_ctime) + 4 : _("Not set")); + /* ctime uses static buffer: use separate calls */ + printf(" %-20.16s", shmseg.shm_atime + ? ctime(&shmseg.shm_atime) + 4 : _("Not set\n")); + printf("%-20.16s", shmseg.shm_dtime + ? ctime(&shmseg.shm_dtime) + 4 : _("Not set\n")); + printf("%-20.16s\n", shmseg.shm_ctime + ? ctime(&shmseg.shm_ctime) + 4 : _("Not set\n")); break; case PID: if (pw) @@ -445,9 +448,10 @@ void do_sem (char format) printf ("%-8d%-10.10s", semid, pw->pw_name); else printf ("%-8d%-10d", semid, ipcp->uid); - printf (" %-26.24s %-26.24s\n", - semary.sem_otime ? ctime(&semary.sem_otime) : _("Not set"), - semary.sem_ctime ? ctime(&semary.sem_ctime) : _("Not set")); + printf (" %-26.24s", semary.sem_otime + ? ctime(&semary.sem_otime) : _("Not set\n")); + printf (" %-26.24s\n", semary.sem_ctime + ? ctime(&semary.sem_ctime) : _("Not set\n")); break; case PID: break; @@ -544,10 +548,12 @@ void do_msg (char format) printf ("%-8d%-10.10s", msqid, pw->pw_name); else printf ("%-8d%-10d", msqid, ipcp->uid); - printf (" %-20.16s%-20.16s%-20.16s\n", - msgque.msg_stime ? ctime(&msgque.msg_stime) + 4 : _("Not set"), - msgque.msg_rtime ? ctime(&msgque.msg_rtime) + 4 : _("Not set"), - msgque.msg_ctime ? ctime(&msgque.msg_ctime) + 4 : _("Not set")); + printf (" %-20.16s", msgque.msg_stime + ? ctime(&msgque.msg_stime) + 4 : _("Not set\n")); + printf ("%-20.16s", msgque.msg_rtime + ? ctime(&msgque.msg_rtime) + 4 : _("Not set\n")); + printf ("%-20.16s\n", msgque.msg_ctime + ? ctime(&msgque.msg_ctime) + 4 : _("Not set\n")); break; case PID: if (pw) @@ -631,10 +637,12 @@ void print_msg (int msqid) */ (long) buf.msg_cbytes, (long) buf.msg_qbytes, (long) buf.msg_qnum, buf.msg_lspid, buf.msg_lrpid); - printf (_("send_time=%srcv_time=%schange_time=%s"), - buf.msg_rtime? ctime (&buf.msg_rtime) : _("Not Set\n"), - buf.msg_stime? ctime (&buf.msg_stime) : _("Not Set\n"), - buf.msg_ctime? ctime (&buf.msg_ctime) : _("Not Set\n")); + printf (_("send_time=%s"), + buf.msg_stime? ctime (&buf.msg_stime) : _("Not set\n")); + printf (_("rcv_time=%s"), + buf.msg_rtime? ctime (&buf.msg_rtime) : _("Not set\n")); + printf (_("change_time=%s"), + buf.msg_ctime? ctime (&buf.msg_ctime) : _("Not set\n")); printf ("\n"); return; } diff --git a/sys-utils/rdev.c b/sys-utils/rdev.c index d49da823c..54ccd99f4 100644 --- a/sys-utils/rdev.c +++ b/sys-utils/rdev.c @@ -49,7 +49,7 @@ Tue Mar 30 09:31:52 1993: rdev -Rn to set root readonly flag, sct@dcs.ed.ac.uk Wed Jun 22 21:12:29 1994: Applied patches from Dave (gentzel@nova.enet.dec.com) to prevent dereferencing the NULL pointer, faith@cs.unc.edu -1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> +1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> - added Native Language Support ------------------------------------------------------------------------- diff --git a/sys-utils/readprofile.1 b/sys-utils/readprofile.1 index a72113c85..d26e8eca7 100644 --- a/sys-utils/readprofile.1 +++ b/sys-utils/readprofile.1 @@ -23,7 +23,7 @@ The output is organized in three columns: the first is the number of clock ticks, the second is the name of the C function in the kernel where those many ticks occurred, and the third is the normalized `load' of the procedure, -calculated as a ratio between the number of thicks and the lenght of +calculated as a ratio between the number of ticks and the length of the procedure. The output is filled with blanks to ease readability. .LP @@ -78,6 +78,15 @@ you can make setuid 0, in order to reset the buffer without gaining privileges. .TP +.RB -M " multiplier" +On some architectures it is possible to alter the frequency at which +the kernel delivers profiling interrupts to each CPU. This option allows you to +set the frequency, as a multiplier of the system clock frequency, HZ. +This is supported on i386-SMP (2.2 and 2.4 kernel) and also on sparc-SMP +and sparc64-SMP (2.4 kernel). This option also resets the profiling buffer, +and requires superuser privileges. + +.TP .B -v Verbose. The output is organized in four columns and filled with blanks. The first column is the RAM address of a kernel function, the second is @@ -116,6 +125,11 @@ Browse a `freezed' profile buffer for a non current kernel: readprofile -p ~/profile.freeze -m /zImage.map.gz .fi +Request profiling at 2kHz per CPU, and reset the profiling buffer +.nf + sudo readprofile -M 20 + +.fi .SH BUGS diff --git a/sys-utils/readprofile.c b/sys-utils/readprofile.c index b531fa90a..189322623 100644 --- a/sys-utils/readprofile.c +++ b/sys-utils/readprofile.c @@ -19,10 +19,12 @@ */ /* - * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support * 1999-09-01 Stephane Eranian <eranian@cello.hpl.hp.com> * - 64bit clean patch + * 3Feb2001 Andrew Morton <andrewm@uow.edu.au> + * - -M option to write profile multiplier. */ #include <errno.h> @@ -44,7 +46,7 @@ static char *prgname; /* These are the defaults */ static char defaultmap[]="/usr/src/linux/System.map"; static char defaultpro[]="/proc/profile"; -static char optstring[]="m:p:itvarV"; +static char optstring[]="M:m:p:itvarV"; static void usage(void) { @@ -52,6 +54,7 @@ usage(void) { _("%s: Usage: \"%s [options]\n" "\t -m <mapfile> (default = \"%s\")\n" "\t -p <pro-file> (default = \"%s\")\n" + "\t -M <mult> set the profiling multiplier to <mult>\n" "\t -i print only info about the sampling step\n" "\t -v print verbose data\n" "\t -a print all symbols, even if count is 0\n" @@ -63,171 +66,181 @@ usage(void) { static FILE * myopen(char *name, char *mode, int *flag) { - static char cmdline[S_LEN]; - - if (!strcmp(name+strlen(name)-3,".gz")) - { - *flag=1; - sprintf(cmdline,"zcat %s", name); - return popen(cmdline,mode); - } - *flag=0; - return fopen(name,mode); + static char cmdline[S_LEN]; + + if (!strcmp(name+strlen(name)-3,".gz")) { + *flag=1; + sprintf(cmdline,"zcat %s", name); + return popen(cmdline,mode); + } + *flag=0; + return fopen(name,mode); } int main (int argc, char **argv) { - FILE *pro; - FILE *map; - int proFd; - char *mapFile, *proFile; - unsigned long len=0, add0=0, indx=0; - unsigned int step; - unsigned int *buf, total, fn_len; - unsigned long fn_add, next_add; /* current and next address */ - char fn_name[S_LEN], next_name[S_LEN]; /* current and next name */ - char mode[8]; - int c; - int optAll=0, optInfo=0, optReset=0, optVerbose=0; - char mapline[S_LEN]; - int maplineno=1; - int popenMap; /* flag to tell if popen() has been used */ + FILE *map; + int proFd; + char *mapFile, *proFile, *mult=0; + unsigned long len=0, add0=0, indx=0; + unsigned int step; + unsigned int *buf, total, fn_len; + unsigned long fn_add, next_add; /* current and next address */ + char fn_name[S_LEN], next_name[S_LEN]; /* current and next name */ + char mode[8]; + int c; + int optAll=0, optInfo=0, optReset=0, optVerbose=0; + char mapline[S_LEN]; + int maplineno=1; + int popenMap; /* flag to tell if popen() has been used */ #define next (current^1) - setlocale(LC_ALL, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); - - prgname=argv[0]; - proFile=defaultpro; - mapFile=defaultmap; - - while ((c=getopt(argc,argv,optstring))!=-1) - { - switch(c) - { - case 'm': mapFile=optarg; break; - case 'p': proFile=optarg; break; - case 'a': optAll++; break; - case 'i': optInfo++; break; - case 'r': optReset++; break; - case 'v': optVerbose++; break; - case 'V': printf(_("%s Version %s\n"),prgname,RELEASE); exit(0); - default: usage(); - } - } - - if (optReset) - { - /* try to become root, just in case */ - setuid(0); - pro=fopen(defaultpro,"w"); - if (!pro) - {perror(proFile); exit(1);} - fprintf(pro,_("anything\n")); - fclose(pro); - exit(0); - } - - /* - * Use an fd for the profiling buffer, to skip stdio overhead - */ - if ( ((proFd=open(proFile,O_RDONLY)) < 0) - || ((int)(len=lseek(proFd,0,SEEK_END)) < 0) - || (lseek(proFd,0,SEEK_SET)<0) ) - { - fprintf(stderr,"%s: %s: %s\n",prgname,proFile,strerror(errno)); - exit(1); - } - - if ( !(buf=malloc(len)) ) - { fprintf(stderr,"%s: malloc(): %s\n",prgname, strerror(errno)); exit(1); } - - if (read(proFd,buf,len) != len) - { - fprintf(stderr,"%s: %s: %s\n",prgname,proFile,strerror(errno)); - exit(1); - } - close(proFd); - - step=buf[0]; - if (optInfo) - { - printf(_("Sampling_step: %i\n"),step); - exit(0); - } - - total=0; - - if (!(map=myopen(mapFile,"r",&popenMap))) - {fprintf(stderr,"%s: ",prgname);perror(mapFile);exit(1);} - - while(fgets(mapline,S_LEN,map)) - { - if (sscanf(mapline,"%lx %s %s",&fn_add,mode,fn_name)!=3) - { - fprintf(stderr,_("%s: %s(%i): wrong map line\n"), - prgname,mapFile, maplineno); - exit(1); - } - if (!strcmp(fn_name,"_stext")) /* only elf works like this */ - { - add0=fn_add; - break; - } - } - - if (!add0) - { - fprintf(stderr,_("%s: can't find \"_stext\" in %s\n"),prgname, mapFile); - exit(1); - } - - /* - * Main loop. - */ - while(fgets(mapline,S_LEN,map)) - { - unsigned int this=0; - - if (sscanf(mapline,"%lx %s %s",&next_add,mode,next_name)!=3) - { - fprintf(stderr,_("%s: %s(%i): wrong map line\n"), - prgname,mapFile, maplineno); - exit(1); - } - /* ignore any LEADING (before a '[tT]' symbol is found) Absolute symbols */ - if (*mode == 'A' && total == 0) continue; - if (*mode!='T' && *mode!='t') break; /* only text is profiled */ - - while (indx < (next_add-add0)/step) - this += buf[indx++]; - total += this; - - fn_len = next_add-fn_add; - if (fn_len && (this || optAll)) - { - if (optVerbose) - printf("%08lx %-40s %6i %8.4f\n", - fn_add,fn_name,this,this/(double)fn_len); - else - printf("%6i %-40s %8.4f\n", - this,fn_name,this/(double)fn_len); - } - fn_add=next_add; strcpy(fn_name,next_name); - } - /* trailer */ - if (optVerbose) - printf("%08x %-40s %6i %8.4f\n", - 0,"total",total,total/(double)(fn_add-add0)); - else - printf("%6i %-40s %8.4f\n", - total,_("total"),total/(double)(fn_add-add0)); + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + prgname=argv[0]; + proFile=defaultpro; + mapFile=defaultmap; + + while ((c=getopt(argc,argv,optstring))!=-1) { + switch(c) { + case 'm': mapFile=optarg; break; + case 'p': proFile=optarg; break; + case 'a': optAll++; break; + case 'i': optInfo++; break; + case 'M': mult=optarg; break; + case 'r': optReset++; break; + case 'v': optVerbose++; break; + case 'V': printf(_("%s Version %s\n"),prgname,RELEASE); + exit(0); + default: usage(); + } + } + + if (optReset || mult) { + int multiplier, fd, to_write; + + /* + * When writing the multiplier, if the length of the write is + * not sizeof(int), the multiplier is not changed + */ + if (mult) { + multiplier = strtoul(mult, 0, 10); + to_write = sizeof(int); + } else { + multiplier = 0; + to_write = 1; /* sth different from sizeof(int) */ + } + /* try to become root, just in case */ + setuid(0); + fd = open(defaultpro,O_WRONLY); + if (fd < 0) { + perror(defaultpro); + exit(1); + } + if (write(fd, &multiplier, to_write) != to_write) { + fprintf(stderr, "readprofile: error writing %s: %s\n", + defaultpro, strerror(errno)); + exit(1); + } + close(fd); + exit(0); + } + + /* + * Use an fd for the profiling buffer, to skip stdio overhead + */ + if ( ((proFd=open(proFile,O_RDONLY)) < 0) + || ((int)(len=lseek(proFd,0,SEEK_END)) < 0) + || (lseek(proFd,0,SEEK_SET)<0) ) { + fprintf(stderr,"%s: %s: %s\n",prgname,proFile,strerror(errno)); + exit(1); + } + + if ( !(buf=malloc(len)) ) { + fprintf(stderr,"%s: malloc(): %s\n",prgname, strerror(errno)); + exit(1); + } + + if (read(proFd,buf,len) != len) { + fprintf(stderr,"%s: %s: %s\n",prgname,proFile,strerror(errno)); + exit(1); + } + close(proFd); + + step=buf[0]; + if (optInfo) { + printf(_("Sampling_step: %i\n"),step); + exit(0); + } + + total=0; + + if (!(map=myopen(mapFile,"r",&popenMap))) { + fprintf(stderr,"%s: ",prgname);perror(mapFile); + exit(1); + } + + while(fgets(mapline,S_LEN,map)) { + if (sscanf(mapline,"%lx %s %s",&fn_add,mode,fn_name)!=3) { + fprintf(stderr,_("%s: %s(%i): wrong map line\n"), + prgname,mapFile, maplineno); + exit(1); + } + if (!strcmp(fn_name,"_stext")) /* only elf works like this */ { + add0=fn_add; + break; + } + } + + if (!add0) { + fprintf(stderr,_("%s: can't find \"_stext\" in %s\n"), + prgname, mapFile); + exit(1); + } + + /* + * Main loop. + */ + while(fgets(mapline,S_LEN,map)) { + unsigned int this=0; + + if (sscanf(mapline,"%lx %s %s",&next_add,mode,next_name)!=3) { + fprintf(stderr,_("%s: %s(%i): wrong map line\n"), + prgname,mapFile, maplineno); + exit(1); + } + + /* ignore any LEADING (before a '[tT]' symbol is found) + Absolute symbols */ + if (*mode == 'A' && total == 0) continue; + if (*mode!='T' && *mode!='t') break;/* only text is profiled */ + + while (indx < (next_add-add0)/step) + this += buf[indx++]; + total += this; + + fn_len = next_add-fn_add; + if (fn_len && (this || optAll)) { + if (optVerbose) + printf("%08lx %-40s %6i %8.4f\n", fn_add, + fn_name,this,this/(double)fn_len); + else + printf("%6i %-40s %8.4f\n", + this,fn_name,this/(double)fn_len); + } + fn_add=next_add; strcpy(fn_name,next_name); + } + /* trailer */ + if (optVerbose) + printf("%08x %-40s %6i %8.4f\n", + 0,"total",total,total/(double)(fn_add-add0)); + else + printf("%6i %-40s %8.4f\n", + total,_("total"),total/(double)(fn_add-add0)); - popenMap ? pclose(map) : fclose(map); - exit(0); + popenMap ? pclose(map) : fclose(map); + exit(0); } - - - diff --git a/sys-utils/renice.c b/sys-utils/renice.c index cd1fa87a0..f04f69f13 100644 --- a/sys-utils/renice.c +++ b/sys-utils/renice.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. */ - /* 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + /* 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support */ diff --git a/sys-utils/setsid.c b/sys-utils/setsid.c index 7aeb2de89..baf3b0aae 100644 --- a/sys-utils/setsid.c +++ b/sys-utils/setsid.c @@ -3,9 +3,12 @@ * Rick Sladkey <jrs@world.std.com> * In the public domain. * - * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support * + * 2001-01-18 John Fremlin <vii@penguinpowered.com> + * - fork in case we are process group leader + * */ #include <stdio.h> @@ -13,8 +16,8 @@ #include <stdlib.h> #include "nls.h" -int main(int argc, char *argv[]) -{ +int +main(int argc, char *argv[]) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -24,8 +27,19 @@ int main(int argc, char *argv[]) argv[0]); exit(1); } + if (getpgrp() == getpid()) { + switch(fork()){ + case -1: + perror("fork"); + exit(1); + case 0: /* child */ + break; + default: /* parent */ + exit(0); + } + } if (setsid() < 0) { - perror("setsid"); + perror("setsid"); /* cannot happen */ exit(1); } execvp(argv[1], argv + 1); diff --git a/sys-utils/tunelp.c b/sys-utils/tunelp.c index 4453de748..9249283d0 100644 --- a/sys-utils/tunelp.c +++ b/sys-utils/tunelp.c @@ -42,7 +42,7 @@ * Revision 1.2 1995/01/03 07:33:44 johnsonm * revisions for lp driver updates in Linux 1.1.76 * - * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@misiek.eu.org> + * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL> * - added Native Language Support * * 1999-05-07 Merged LPTRUSTIRQ patch by Andrea Arcangeli (1998/11/29), aeb |