Use SIGNAL not signal because the former doesn't reset the handler
[ppp.git] / aix4 / ppp_async.c
index c932fd3c2b6dbcd2c41add20be14f4f3019a142c..d079e3f87037d806dc18ae33d7ec909b8c11b5e6 100644 (file)
@@ -5,7 +5,7 @@
   fcstab and some ideas nicked from if_ppp.c from cmu.
   See copyright notice in if_ppp.h and NOTES
 
-  $Id: ppp_async.c,v 1.1 1994/12/05 00:29:21 paulus Exp $
+  $Id: ppp_async.c,v 1.3 1995/04/26 04:15:48 paulus Exp $
 */
 
 #include <sys/types.h>
@@ -117,7 +117,7 @@ struct  ppp_async_info {
     mblk_t     *pai_buffer;    /* pointer to the current buffer list */
     mblk_t     *pai_bufftail;  /* pointer to the current input block */
     ext_accm   pai_asyncmap;   /* current outgoing asyncmap */
-    u_long     pai_rasyncmap;  /* current receive asyncmap */
+    u_int32_t  pai_rasyncmap;  /* current receive asyncmap */
 };
 
 /* Values for pai_flags */
@@ -244,7 +244,18 @@ ppp_async_wput(q, mp)
     int        x, flags;
   
     switch (mp->b_datap->db_type) {
-    
+    case M_CTL:
+        switch (*(u_char *)mp->b_rptr) {
+        case IF_GET_CSTATS:
+            /* trap this and remove it */
+            freemsg(mp);
+            break;
+        default:
+            putnext(q, mp);
+        }
+        break;
+   
     case M_FLUSH :
        if (*mp->b_rptr & FLUSHW)
            flushq(q, FLUSHDATA);
@@ -320,9 +331,9 @@ ppp_async_wput(q, mp)
            goto iocnak;
       
        case SIOCGIFASYNCMAP :
-           if ((mp->b_cont = allocb(sizeof(u_long), BPRI_MED)) != NULL) {
-               *(u_long *) mp->b_cont->b_wptr = p->pai_asyncmap[0];
-               mp->b_cont->b_wptr += i->ioc_count = sizeof(u_long);
+           if ((mp->b_cont = allocb(sizeof(u_int32_t), BPRI_MED)) != NULL) {
+               *(u_int32_t *) mp->b_cont->b_wptr = p->pai_asyncmap[0];
+               mp->b_cont->b_wptr += i->ioc_count = sizeof(u_int32_t);
                goto iocack;
            }
            i->ioc_error = ENOSR;
@@ -330,19 +341,19 @@ ppp_async_wput(q, mp)
 
        case SIOCSIFASYNCMAP :
            if ((i->ioc_count != TRANSPARENT) &&
-               (i->ioc_count != sizeof(u_long))) {
+               (i->ioc_count != sizeof(u_int32_t))) {
                i->ioc_error = EINVAL;
                goto iocnak;    /* ugh, goto */
            }
-           p->pai_asyncmap[0] = *(u_long *) mp->b_cont->b_rptr;
+           p->pai_asyncmap[0] = *(u_int32_t *) mp->b_cont->b_rptr;
            DLOG("ppp_async: SIFASYNCMAP %lx\n", p->pai_asyncmap[0]);
            i->ioc_count = 0;
            goto iocack;
 
        case SIOCGIFRASYNCMAP :
-           if ((mp->b_cont = allocb(sizeof(u_long), BPRI_MED)) != NULL) {
-               *(u_long *) mp->b_cont->b_wptr = p->pai_rasyncmap;
-               mp->b_cont->b_wptr += i->ioc_count = sizeof(u_long);
+           if ((mp->b_cont = allocb(sizeof(u_int32_t), BPRI_MED)) != NULL) {
+               *(u_int32_t *) mp->b_cont->b_wptr = p->pai_rasyncmap;
+               mp->b_cont->b_wptr += i->ioc_count = sizeof(u_int32_t);
                goto iocack;
            }
            i->ioc_error = ENOSR;
@@ -350,11 +361,11 @@ ppp_async_wput(q, mp)
 
        case SIOCSIFRASYNCMAP :
            if ((i->ioc_count != TRANSPARENT) &&
-               (i->ioc_count != sizeof(u_long))) {
+               (i->ioc_count != sizeof(u_int32_t))) {
                i->ioc_error = EINVAL;
                goto iocnak;    /* ugh, goto */
            }
-           p->pai_rasyncmap = *(u_long *) mp->b_cont->b_rptr;
+           p->pai_rasyncmap = *(u_int32_t *) mp->b_cont->b_rptr;
            DLOG("ppp_async: SIFRASYNCMAP %lx\n", p->pai_rasyncmap);
            i->ioc_count = 0;
            goto iocack;
@@ -482,7 +493,7 @@ ppp_async_wsrv(q)
         * to allow for escaped characters.  If this isn't enough, we
         * allocate another buffer later.
         */
-       olen = len + (len >> 8) + 5;
+       olen = len + (len >> 2) + 5;
        if (olen < 32)
            olen = 32;
        else if (olen > 2048)
@@ -611,7 +622,7 @@ ppp_async_rput(q, mp)
     }
 }
 
-static u_long paritytab[8] = {
+static u_int32_t paritytab[8] = {
     0x96696996, 0x69969669, 0x69969669, 0x96696996,
     0x69969669, 0x96696996, 0x96696996, 0x69969669,
 };
@@ -808,15 +819,19 @@ ppp_async_rsrv(q)
 
                STUFF_CHAR(p, c);
                p->pai_fcs = PPP_FCS(p->pai_fcs, c);
-               while (cp < mp->b_wptr
-                      && wptr < p->pai_bufftail->b_datap->db_lim
-                      && (c = *cp) != PPP_FLAG && c != PPP_ESCAPE) {
-                   if (c >= 0x20 || (p->pai_rasyncmap & (1 << c)) == 0) {
-                       STUFF_CHAR(p, c);
-                       p->pai_fcs = PPP_FCS(p->pai_fcs, c);
+
+               if (p->pai_buffcount >= PPP_HDRLEN) {
+                   while (cp < mp->b_wptr
+                          && wptr < p->pai_bufftail->b_datap->db_lim
+                          && (c = *cp) != PPP_FLAG && c != PPP_ESCAPE) {
+                       if (c >= 0x20 || (p->pai_rasyncmap & (1 << c)) == 0) {
+                           STUFF_CHAR(p, c);
+                           p->pai_fcs = PPP_FCS(p->pai_fcs, c);
+                       }
+                       ++cp;
                    }
-                   ++cp;
                }
+
                p->pai_bufftail->b_wptr = wptr;
 
            } /* end while cp < wptr */