Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Feb 2005 20:00:40 GMT
From:      Dong Xuezhang-A19583 <xdong@motorola.com>
To:        freebsd-threads@FreeBSD.org
Subject:   Re: threads/72953: fork() unblocks blocked signals w/o PTHREAD_SC OPE_SYSTEM
Message-ID:  <200502222000.j1MK0e46033113@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR threads/72953; it has been noted by GNATS.

From: Dong Xuezhang-A19583 <xdong@motorola.com>
To: freebsd-gnats-submit@FreeBSD.org, marka@daemon.lab.isc.org
Cc:  
Subject: Re: threads/72953: fork() unblocks blocked signals w/o PTHREAD_SC
	OPE_SYSTEM
Date: Tue, 22 Feb 2005 12:57:15 -0700

 This message is in MIME format. Since your mail reader does not understand
 this format, some or all of this message may not be legible.
 
 ------_=_NextPart_001_01C51918.B4EDF491
 Content-Type: text/plain
 
 This is not a bug. If you insert a sleep call before the line of kill singal, you will get consistent behavior of "singal 15".
 Actually fork() donot copy the properties of singal mask, so it never been a case of singal 15 been blocked. The reason of sometime the singal donot get print out is because of race condition in two thread. The reason it "works" at Linux is because of a BUG in Linux which donot deliver the singal to all threads.
  
 I modify the code to demostrate two thread case and two process case. You will notice that twothread.c will have different behavior in Linux vs. Freebsd.
  
 ======= twothread.c==============
 #include <pthread.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <signal.h>
 #include <stdlib.h>
  
 sigset_t signal_mask;
  
 static void *
 waiter(void *arg) {
         int result;
         int sig;
  
         result = sigwait(&signal_mask, &sig);
         if (result != 0)
                 fprintf(stdout, "child thread sigwait: %\n", strerror(result));
         else
                 fprintf(stdout, "child thread signal %d\n", sig);
  fflush(stdout);
         return (NULL);
 }
  
 int
 main(int argc, char **argv) {
         pthread_t id;
  pthread_attr_t attr;
         int result;
  int scope = 0;
  
         if (argc > 1) {
                 if (strcmp(argv[1], "system") == 0)
                         scope = 1;
         }
  
         sigemptyset (&signal_mask);
         sigaddset (&signal_mask, SIGTERM);
  
         result = sigprocmask(SIG_BLOCK, &signal_mask, NULL);
         if (result != 0)
                 fprintf(stdout, "pthread_sigmask: %\n", strerror(result));
         else
                 fprintf(stdout, "pthread_sigmask: OK\n");
  fflush(stdout);
  
  result = pthread_attr_init(&attr);
         if (result != 0)
                 fprintf(stdout, "pthread_attr_init: %\n", strerror(result));
         else
                 fprintf(stdout, "pthread_attr_init: OK\n");
  fflush(stdout);
  
  if (scope) {
   result = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
   if (result != 0)
    fprintf(stdout, "pthread_attr_setscope: %\n",
     strerror(result));
   else
    fprintf(stdout, "pthread_attr_setscope: OK\n");
  } else
   fprintf(stdout, "default scope\n");
  fflush(stdout);
  
         result = pthread_create (&id, &attr, waiter, NULL);
         if (result != 0)
                 fprintf(stdout, "pthread_create: %\n", strerror(result));
         else
                 fprintf(stdout, "pthread_create: OK\n");
  fflush(stdout);
  
         sleep(1);
         if (kill(getpid(), SIGTERM) == -1)
                 perror("kill");
         else
                 fprintf(stdout, "kill: OK\n");
  fflush(stdout);
  
         result = pthread_join(id, NULL);
         if (result != 0)
                 fprintf(stdout, "pthread_join: %\n", strerror(result));
         else
                 fprintf(stdout, "pthread_join: OK\n");
  fflush(stdout);
         sleep(1);
         return(0);
 }
 
 ======= twoprocess.c==============
 #include <pthread.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <signal.h>
 #include <stdlib.h>
  
 sigset_t signal_mask;
 int childpid;
  
 void
 dofork() {
         int result;
         int sig;
         childpid = fork();
    switch (childpid) {
    case 0:
         
           result = sigwait(&signal_mask, &sig);
           if (result != 0)
                 fprintf(stdout, "sigwait: %\n", strerror(result));
           else
                 fprintf(stdout, "signal %d\n", sig);
      fflush(stdout);
                 _exit(0);
    case -1:
                 // some error
   _exit(1);
    default:
                 // parent process
                 fprintf(stdout, "fork, in parent process\n");
                 fflush(stdout);
                 break;
    }
 }
  
         
 int
 main(int argc, char **argv) {
       pthread_t id;
  pthread_attr_t attr;
       int result;
  
       sigemptyset (&signal_mask);
       sigaddset (&signal_mask, SIGTERM);
  
       result = sigprocmask(SIG_BLOCK, &signal_mask, NULL);
       if (result != 0)
                fprintf(stdout, "pthread_sigmask: %\n", strerror(result));
        else
                fprintf(stdout, "pthread_sigmask: OK\n");
  fflush(stdout);
  
  dofork();
  
       sleep(1);
  
       if (kill(childpid, SIGTERM) == -1)
                 perror("kill");
       else
                 fprintf(stdout, "kill: OK\n");
  fflush(stdout);
       return(0);
 }
 
 
 ------_=_NextPart_001_01C51918.B4EDF491
 Content-Type: text/html
 Content-Transfer-Encoding: base64
 
 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
 L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05U
 RU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVMtQVNDSUkiPg0KPFRJVExFPk1lc3NhZ2U8L1RJVExF
 Pg0KDQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0OTEiIG5hbWU9R0VORVJBVE9S
 PjwvSEVBRD4NCjxCT0RZPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48U1BBTiBjbGFz
 cz00OTAwNTQ4MTktMjIwMjIwMDU+VGhpcyBpcyBub3QgYSBidWcuIA0KSWYgeW91IGluc2VydCBh
 IHNsZWVwIGNhbGwgYmVmb3JlIHRoZSBsaW5lIG9mIGtpbGwgc2luZ2FsLCB5b3Ugd2lsbCBnZXQg
 DQpjb25zaXN0ZW50IGJlaGF2aW9yIG9mICJzaW5nYWwgMTUiLjwvU1BBTj48L0ZPTlQ+PC9ESVY+
 DQo8RElWPjxGT05UIGZhY2U9QXJpYWwgc2l6ZT0yPjxTUEFOIGNsYXNzPTQ5MDA1NDgxOS0yMjAy
 MjAwNT5BY3R1YWxseSBmb3JrKCkgDQpkb25vdCBjb3B5IHRoZSBwcm9wZXJ0aWVzIG9mIHNpbmdh
 bCBtYXNrLCBzbyBpdCBuZXZlciBiZWVuIGEgY2FzZSBvZiBzaW5nYWwgMTUgDQpiZWVuIGJsb2Nr
 ZWQuIFRoZSByZWFzb24gb2Ygc29tZXRpbWUgdGhlIHNpbmdhbCBkb25vdCBnZXQgcHJpbnQgb3V0
 IGlzIGJlY2F1c2UgDQpvZiByYWNlIGNvbmRpdGlvbiBpbiB0d28gdGhyZWFkLiBUaGUgcmVhc29u
 IGl0ICJ3b3JrcyIgYXQgTGludXggaXMgYmVjYXVzZSBvZiBhIA0KQlVHIGluIExpbnV4IHdoaWNo
 IGRvbm90IGRlbGl2ZXIgdGhlIHNpbmdhbCB0byBhbGwgdGhyZWFkcy48L1NQQU4+PC9GT05UPjwv
 RElWPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48U1BBTiANCmNsYXNzPTQ5MDA1NDgx
 OS0yMjAyMjAwNT48L1NQQU4+PC9GT05UPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBmYWNlPUFy
 aWFsIHNpemU9Mj48U1BBTiBjbGFzcz00OTAwNTQ4MTktMjIwMjIwMDU+SSBtb2RpZnkgdGhlIGNv
 ZGUgdG8gDQpkZW1vc3RyYXRlIHR3byB0aHJlYWQgY2FzZSBhbmQgdHdvIHByb2Nlc3MgY2FzZS4g
 WW91IHdpbGwgbm90aWNlIHRoYXQgDQp0d290aHJlYWQuYyB3aWxsIGhhdmUgZGlmZmVyZW50IGJl
 aGF2aW9yIGluIExpbnV4IHZzLiANCkZyZWVic2QuPC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+
 PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gDQpjbGFzcz00OTAwNTQ4MTktMjIwMjIwMDU+
 PC9TUEFOPjwvRk9OVD4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+
 PFNQQU4gY2xhc3M9NDkwMDU0ODE5LTIyMDIyMDA1Pj09PT09PT0gDQp0d290aHJlYWQuYz09PT09
 PT09PT09PT09PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXpl
 PTI+PFNQQU4gY2xhc3M9NDkwMDU0ODE5LTIyMDIyMDA1PiNpbmNsdWRlIA0KJmx0O3B0aHJlYWQu
 aCZndDs8QlI+I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OzxCUj4jaW5jbHVkZSANCiZsdDtzdGRp
 by5oJmd0OzxCUj4jaW5jbHVkZSAmbHQ7c3lzL3R5cGVzLmgmZ3Q7PEJSPiNpbmNsdWRlIA0KJmx0
 O3N5cy93YWl0LmgmZ3Q7PEJSPiNpbmNsdWRlICZsdDtzaWduYWwuaCZndDs8QlI+I2luY2x1ZGUg
 DQombHQ7c3RkbGliLmgmZ3Q7PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1B
 cmlhbCBzaXplPTI+PC9GT05UPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNp
 emU9Mj48U1BBTiBjbGFzcz00OTAwNTQ4MTktMjIwMjIwMDU+c2lnc2V0X3QgDQpzaWduYWxfbWFz
 azs8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48L0ZP
 TlQ+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05UIGZhY2U9QXJpYWwgc2l6ZT0yPjxTUEFOIGNsYXNz
 PTQ5MDA1NDgxOS0yMjAyMjAwNT5zdGF0aWMgdm9pZCANCio8QlI+d2FpdGVyKHZvaWQgKmFyZykg
 ezxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IA0KcmVz
 dWx0OzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IA0K
 c2lnOzwvU1BBTj48L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIGZhY2U9QXJpYWwgc2l6ZT0yPjwv
 Rk9OVD4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gDQpj
 bGFzcz00OTAwNTQ4MTktMjIwMjIwMDU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
 c3A7Jm5ic3A7IHJlc3VsdCA9IA0Kc2lnd2FpdCgmYW1wO3NpZ25hbF9tYXNrLCANCiZhbXA7c2ln
 KTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChyZXN1
 bHQgIT0gDQowKTxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQpmcHJpbnRm
 KHN0ZG91dCwgImNoaWxkIHRocmVhZCBzaWd3YWl0OiAlXG4iLCANCnN0cmVycm9yKHJlc3VsdCkp
 OzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQplbHNlPEJS
 PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0LCAiY2hp
 bGQgdGhyZWFkIHNpZ25hbCAlZFxuIiwgDQpzaWcpOzxCUj4mbmJzcDtmZmx1c2goc3Rkb3V0KTs8
 QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KcmV0dXJuIChO
 VUxMKTs8QlI+fTwvU1BBTj48L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIGZhY2U9QXJpYWwgc2l6
 ZT0yPjwvRk9OVD4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQ
 QU4gY2xhc3M9NDkwMDU0ODE5LTIyMDIyMDA1PmludDxCUj5tYWluKGludCANCmFyZ2MsIGNoYXIg
 Kiphcmd2KSB7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBw
 dGhyZWFkX3QgDQppZDs8QlI+Jm5ic3A7cHRocmVhZF9hdHRyX3QgYXR0cjs8QlI+Jm5ic3A7Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KaW50IHJlc3VsdDs8QlI+Jm5ic3A7
 aW50IHNjb3BlID0gMDs8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJVj4mbmJzcDs8L0RJVj4NCjxE
 SVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gDQpjbGFzcz00OTAwNTQ4MTktMjIwMjIw
 MDU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChhcmdjIA0K
 Jmd0OyAxKSANCns8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KaWYgKHN0
 cmNtcChhcmd2WzFdLCAic3lzdGVtIikgPT0gDQowKTxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
 cDsgDQpzY29wZSA9IDE7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyB9PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05U
 IGZhY2U9QXJpYWwgc2l6ZT0yPjxTUEFOIA0KY2xhc3M9NDkwMDU0ODE5LTIyMDIyMDA1PiZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzaWdlbXB0eXNldCANCigmYW1w
 O3NpZ25hbF9tYXNrKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
 c3A7IHNpZ2FkZHNldCANCigmYW1wO3NpZ25hbF9tYXNrLCBTSUdURVJNKTs8L1NQQU4+PC9GT05U
 PjwvRElWPg0KPERJVj4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+
 PFNQQU4gDQpjbGFzcz00OTAwNTQ4MTktMjIwMjIwMDU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJlc3VsdCA9IA0Kc2lncHJvY21hc2soU0lHX0JMT0NLLCAmYW1w
 O3NpZ25hbF9tYXNrLCANCk5VTEwpOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsgaWYgKHJlc3VsdCAhPSANCjApPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0LCAicHRocmVhZF9zaWdtYXNrOiAlXG4iLCANCnN0
 cmVycm9yKHJlc3VsdCkpOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsgDQplbHNlPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmZwcmlu
 dGYoc3Rkb3V0LCAicHRocmVhZF9zaWdtYXNrOiANCk9LXG4iKTs8QlI+Jm5ic3A7ZmZsdXNoKHN0
 ZG91dCk7PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05U
 IGZhY2U9QXJpYWwgc2l6ZT0yPjxTUEFOIGNsYXNzPTQ5MDA1NDgxOS0yMjAyMjAwNT4mbmJzcDty
 ZXN1bHQgPSANCnB0aHJlYWRfYXR0cl9pbml0KCZhbXA7YXR0cik7PEJSPiZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiANCihyZXN1bHQgIT0gDQowKTxCUj4mbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQpmcHJpbnRmKHN0ZG91dCwgInB0aHJlYWRf
 YXR0cl9pbml0OiAlXG4iLCANCnN0cmVycm9yKHJlc3VsdCkpOzxCUj4mbmJzcDsmbmJzcDsmbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQplbHNlPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0LCAicHRocmVhZF9hdHRyX2luaXQ6IA0KT0tc
 biIpOzxCUj4mbmJzcDtmZmx1c2goc3Rkb3V0KTs8QlI+Jm5ic3A7PEJSPiZuYnNwO2lmIChzY29w
 ZSkgDQp7PEJSPiZuYnNwOyZuYnNwO3Jlc3VsdCA9IHB0aHJlYWRfYXR0cl9zZXRzY29wZSgmYW1w
 O2F0dHIsIA0KUFRIUkVBRF9TQ09QRV9TWVNURU0pOzxCUj4mbmJzcDsmbmJzcDtpZiAocmVzdWx0
 ICE9IA0KMCk8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRvdXQsICJwdGhyZWFkX2F0
 dHJfc2V0c2NvcGU6IA0KJVxuIiw8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c3RyZXJyb3Io
 cmVzdWx0KSk7PEJSPiZuYnNwOyZuYnNwO2Vsc2U8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7ZnByaW50
 ZihzdGRvdXQsIA0KInB0aHJlYWRfYXR0cl9zZXRzY29wZTogT0tcbiIpOzxCUj4mbmJzcDt9IGVs
 c2U8QlI+Jm5ic3A7Jm5ic3A7ZnByaW50ZihzdGRvdXQsIA0KImRlZmF1bHQgc2NvcGVcbiIpOzxC
 Uj4mbmJzcDtmZmx1c2goc3Rkb3V0KTs8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJVj4mbmJzcDs8
 L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gDQpjbGFzcz00OTAwNTQ4
 MTktMjIwMjIwMDU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJl
 c3VsdCA9IA0KcHRocmVhZF9jcmVhdGUgKCZhbXA7aWQsICZhbXA7YXR0ciwgd2FpdGVyLCANCk5V
 TEwpOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYgKHJl
 c3VsdCAhPSANCjApPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmZwcmlu
 dGYoc3Rkb3V0LCAicHRocmVhZF9jcmVhdGU6ICVcbiIsIA0Kc3RyZXJyb3IocmVzdWx0KSk7PEJS
 PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmVsc2U8QlI+Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KZnByaW50ZihzdGRvdXQsICJwdGhyZWFk
 X2NyZWF0ZTogDQpPS1xuIik7PEJSPiZuYnNwO2ZmbHVzaChzdGRvdXQpOzwvU1BBTj48L0ZPTlQ+
 PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48
 U1BBTiANCmNsYXNzPTQ5MDA1NDgxOS0yMjAyMjAwNT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsgDQpzbGVlcCgxKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChraWxsKGdldHBpZCgpLCANClNJR1RFUk0pID09IA0KLTEp
 PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCnBlcnJvcigia2lsbCIpOzxC
 Uj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQplbHNlPEJSPiZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0LCAia2lsbDog
 T0tcbiIpOzxCUj4mbmJzcDtmZmx1c2goc3Rkb3V0KTs8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJ
 Vj4mbmJzcDs8L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gDQpjbGFz
 cz00OTAwNTQ4MTktMjIwMjIwMDU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7IHJlc3VsdCA9IA0KcHRocmVhZF9qb2luKGlkLCBOVUxMKTs8QlI+Jm5ic3A7Jm5ic3A7
 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChyZXN1bHQgDQohPSANCjApPEJSPiZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0LCAicHRocmVh
 ZF9qb2luOiAlXG4iLCANCnN0cmVycm9yKHJlc3VsdCkpOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQplbHNlPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0LCAicHRocmVhZF9qb2luOiANCk9LXG4iKTs8QlI+
 Jm5ic3A7ZmZsdXNoKHN0ZG91dCk7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyANCnNsZWVwKDEpOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsgDQpyZXR1cm4oMCk7PEJSPn08QlI+PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxE
 SVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gY2xhc3M9NDkwMDU0ODE5LTIyMDIyMDA1
 Pg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48U1BBTiBjbGFzcz00OTAwNTQ4MTktMjIw
 MjIwMDU+PT09PT09PSANCnR3b3Byb2Nlc3MuYz09PT09PT09PT09PT09PC9TUEFOPjwvRk9OVD48
 L0RJVj4NCjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gY2xhc3M9NDkwMDU0ODE5
 LTIyMDIyMDA1PiNpbmNsdWRlIA0KJmx0O3B0aHJlYWQuaCZndDs8QlI+I2luY2x1ZGUgJmx0O3Vu
 aXN0ZC5oJmd0OzxCUj4jaW5jbHVkZSANCiZsdDtzdGRpby5oJmd0OzxCUj4jaW5jbHVkZSAmbHQ7
 c3lzL3R5cGVzLmgmZ3Q7PEJSPiNpbmNsdWRlIA0KJmx0O3N5cy93YWl0LmgmZ3Q7PEJSPiNpbmNs
 dWRlICZsdDtzaWduYWwuaCZndDs8QlI+I2luY2x1ZGUgDQombHQ7c3RkbGliLmgmZ3Q7PC9TUEFO
 PjwvRk9OVD48L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPjxGT05UIGZhY2U9QXJpYWwg
 c2l6ZT0yPjxTUEFOIGNsYXNzPTQ5MDA1NDgxOS0yMjAyMjAwNT5zaWdzZXRfdCANCnNpZ25hbF9t
 YXNrOzxCUj5pbnQgY2hpbGRwaWQ7PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+Jm5ic3A7PC9E
 SVY+DQo8RElWPjxGT05UIGZhY2U9QXJpYWwgc2l6ZT0yPjxTUEFOIGNsYXNzPTQ5MDA1NDgxOS0y
 MjAyMjAwNT52b2lkPEJSPmRvZm9yaygpIA0KezxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsgaW50IA0KcmVzdWx0OzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsgaW50IA0Kc2lnOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsgY2hpbGRwaWQgPSANCmZvcmsoKTs8QlI+Jm5ic3A7Jm5ic3A7
 IHN3aXRjaCAoY2hpbGRwaWQpIHs8QlI+Jm5ic3A7Jm5ic3A7IGNhc2UgDQowOjxCUj4mbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQo8QlI+Jm5ic3A7Jm5ic3A7Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJlc3VsdCA9IA0Kc2lnd2Fp
 dCgmYW1wO3NpZ25hbF9tYXNrLCANCiZhbXA7c2lnKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChyZXN1bHQgDQohPSANCjApPEJS
 PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0LCAic2ln
 d2FpdDogJVxuIiwgDQpzdHJlcnJvcihyZXN1bHQpKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KZWxzZTxCUj4mbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsgDQpmcHJpbnRmKHN0ZG91dCwgInNpZ25hbCAlZFxuIiwgc2ln
 KTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KZmZsdXNoKHN0ZG91dCk7PEJSPiZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCl9leGl0KDApOzxCUj4mbmJzcDsmbmJzcDsg
 Y2FzZSANCi0xOjxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQovLyBzb21l
 IGVycm9yPEJSPiZuYnNwOyZuYnNwO19leGl0KDEpOzxCUj4mbmJzcDsmbmJzcDsgDQpkZWZhdWx0
 OjxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQovLyBwYXJlbnQgDQpwcm9j
 ZXNzPEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCmZwcmludGYoc3Rkb3V0
 LCAiZm9yaywgaW4gcGFyZW50IA0KcHJvY2Vzc1xuIik7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZu
 YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyANCmZmbHVzaChzdGRvdXQpOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJz
 cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsgDQpicmVhazs8QlI+Jm5ic3A7Jm5ic3A7IH08QlI+fTwvU1BBTj48L0ZPTlQ+
 PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48
 U1BBTiANCmNsYXNzPTQ5MDA1NDgxOS0yMjAyMjAwNT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsmbmJzcDsmbmJzcDsgDQo8QlI+aW50PEJSPm1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2
 KSB7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCnB0aHJlYWRfdCBpZDs8QlI+
 Jm5ic3A7cHRocmVhZF9hdHRyX3QgYXR0cjs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
 c3A7IA0KaW50IHJlc3VsdDs8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJVj4mbmJzcDs8L0RJVj4N
 CjxESVY+PEZPTlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gDQpjbGFzcz00OTAwNTQ4MTktMjIw
 MjIwMDU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNpZ2VtcHR5c2V0IA0KKCZhbXA7
 c2lnbmFsX21hc2spOzxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc2lnYWRkc2V0
 IA0KKCZhbXA7c2lnbmFsX21hc2ssIFNJR1RFUk0pOzwvU1BBTj48L0ZPTlQ+PC9ESVY+DQo8RElW
 PiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48U1BBTiANCmNsYXNz
 PTQ5MDA1NDgxOS0yMjAyMjAwNT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmVzdWx0
 ID0gDQpzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZhbXA7c2lnbmFsX21hc2ssIA0KTlVMTCk7PEJS
 PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiAocmVzdWx0ICE9IA0KMCk8QlI+Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KZnByaW50ZihzdGRvdXQsICJwdGhyZWFkX3NpZ21h
 c2s6ICVcbiIsIA0Kc3RyZXJyb3IocmVzdWx0KSk7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyANCmVsc2U8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KZnBy
 aW50ZihzdGRvdXQsICJwdGhyZWFkX3NpZ21hc2s6IA0KT0tcbiIpOzxCUj4mbmJzcDtmZmx1c2go
 c3Rkb3V0KTs8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJVj4mbmJzcDs8L0RJVj4NCjxESVY+PEZP
 TlQgZmFjZT1BcmlhbCBzaXplPTI+PFNQQU4gDQpjbGFzcz00OTAwNTQ4MTktMjIwMjIwMDU+Jm5i
 c3A7ZG9mb3JrKCk7PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElW
 PjxGT05UIGZhY2U9QXJpYWwgc2l6ZT0yPjxTUEFOIA0KY2xhc3M9NDkwMDU0ODE5LTIyMDIyMDA1
 PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCnNsZWVwKDEpOzwvU1BBTj48L0ZPTlQ+
 PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBmYWNlPUFyaWFsIHNpemU9Mj48
 U1BBTiANCmNsYXNzPTQ5MDA1NDgxOS0yMjAyMjAwNT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm
 bmJzcDsgaWYgKGtpbGwoY2hpbGRwaWQsIA0KU0lHVEVSTSkgPT0gDQotMSk8QlI+Jm5ic3A7Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KcGVycm9yKCJraWxsIik7PEJSPiZuYnNwOyZuYnNw
 OyZuYnNwOyZuYnNwOyZuYnNwOyANCmVsc2U8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i
 c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7
 Jm5ic3A7IA0KZnByaW50ZihzdGRvdXQsICJraWxsOiANCk9LXG4iKTs8QlI+Jm5ic3A7ZmZsdXNo
 KHN0ZG91dCk7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyANCnJldHVybigwKTs8
 QlI+fTxCUj48L1NQQU4+PC9GT05UPjwvRElWPjwvRElWPjwvU1BBTj48L0ZPTlQ+PC9CT0RZPjwv
 SFRNTD4NCg==
 
 ------_=_NextPart_001_01C51918.B4EDF491--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200502222000.j1MK0e46033113>