Annotation of Amaya/amaya/AHTBridge.c, revision 1.7

1.6       cvs         1: /***
                      2:  *** Copyright (c) 1996 INRIA, All rights reserved
                      3:  ***/
                      4: 
1.4       cvs         5: /*                                                                  AHTBridge.c
                      6:  *      INTERFACE BRIDGE TO XT, LIBWWW, and AMAYA
                      7:  *
                      8:  *      (c) COPYRIGHT 
                      9:  *      Please first read the full copyright statement in the file COPYRIGH.
                     10:  *
                     11:  *      This module implments the callback setup and handlers between
                     12:  *      the Xt, libwww, and Amaya procedures
                     13:  *
                     14:  * History:
                     15:  *      May 02 96 JK    First semi-stable version, Jose Kahan
                     16:  *      June 01 96 JK   First almost-complete version, Jose Kahan 
1.7     ! cvs        17:  */
1.4       cvs        18: 
                     19: /* Unix/C/X */
                     20: #include "thot_gui.h"
                     21: #include "thot_sys.h"
                     22: #include "message.h"
                     23: #include "dialog.h"
                     24: #include "application.h"
                     25: #include "content.h"
                     26: #include "view.h"
                     27: #include "interface.h"
                     28: #include "amaya.h"
                     29: 
                     30: #if 0
                     31: #include "AHTCommon.h"
                     32: #include "query.h"
                     33: #endif
                     34: 
1.7     ! cvs        35: #include "AHTBridge.h"         /* implemented here */
1.4       cvs        36: 
                     37: #ifdef WWW_XWINDOWS
                     38: /* Amaya's X appcontext */
                     39: extern XtAppContext app_cont;
1.7     ! cvs        40: 
1.4       cvs        41: #endif
                     42: 
                     43: 
                     44: #ifndef HACK_WWW
1.7     ! cvs        45: extern PUBLIC HTEventCallback *HTEvent_Retrieve (SOCKET, SockOps, HTRequest ** arp);
        !            46: 
1.4       cvs        47: #endif
                     48: 
                     49: /*
1.7     ! cvs        50:  * Private functions
        !            51:  */
1.4       cvs        52: #ifdef __STDC__
1.7     ! cvs        53: static void         RequestKillReadXtevent (AHTReqContext *);
        !            54: static void         RequestKillWriteXtevent (AHTReqContext *);
        !            55: static void         RequestKillExceptXtevent (AHTReqContext *);
        !            56: 
1.4       cvs        57: #else
1.7     ! cvs        58: static void         RequestKillReadXtevent ();
        !            59: static void         RequestKillWriteXtevent ();
        !            60: static void         RequestKillExceptXtevent ();
        !            61: 
        !            62: #endif
1.4       cvs        63: 
                     64: /*
                     65:  * Private variables 
                     66:  */
                     67: 
                     68: /*
                     69:  * this set of SockOps map our WinSock "socket event SockOps" into 
                     70:  * our read and write sets. Note that under the canonical Unix model,
                     71:  * a non-blocking socket passed to an accept() call will appear as readable, 
                     72:  * whilst a non-blocking call to connect() will appear as writeable. In add.
                     73:  * if the connection has been closed, the socket will appear readable under
                     74:  * BSD Unix semantics 
                     75:  */
1.7     ! cvs        76: PRIVATE const SockOps ReadBits = FD_READ | FD_ACCEPT | FD_CLOSE;
        !            77: PRIVATE const SockOps WriteBits = FD_WRITE | FD_CONNECT;
        !            78: PRIVATE const SockOps ExceptBits = FD_OOB;
1.4       cvs        79: 
                     80: /*
                     81:  * Private functions
                     82:  */
                     83: 
                     84: /*
                     85:  * Callback that acts as a bridge between X and wwwlib.
                     86:  * This function is equivalent to the library's __DoCallback()
                     87:  * function, but with a different API, to conform to Xt's event loop
                     88:  * specifications. For more info, cf. the library's HTEvntrg.c module.
                     89:  */
                     90: 
                     91: #ifdef WWW_XWINDOWS
                     92: #ifdef __STDC__
1.7     ! cvs        93: XtInputCallbackProc AHTCallback_bridge (caddr_t cd, int *s, XtInputId * id)
        !            94: #else
1.4       cvs        95: XtInputCallbackProc AHTCallback_bridge (cd, s, id)
1.7     ! cvs        96: caddr_t             cd;
        !            97: int                *s;
        !            98: XtInputId          *id;
        !            99: 
1.4       cvs       100: #endif /* __STDC__ */
                    101: 
1.7     ! cvs       102: #else  /* WWW_XWINDOWS */
1.4       cvs       103: /* some winproc someday? */
1.7     ! cvs       104: LONG                AHTCallback_bridge (caddr_t cd, int *s)
        !           105: #endif                         /* !WWW_XWINDOWS */
1.4       cvs       106: {
1.7     ! cvs       107:    int                 status;
        !           108:    HTRequest          *rqp = NULL;
        !           109:    AHTReqContext      *me;
        !           110:    SOCKET              sock;
        !           111:    SockOps             ops;    /* what value goes here ? Ask eric */
1.4       cvs       112: 
                    113:    /* Libwww 4.1 does not take into account the third parameter
                    114:       for this function call */
                    115: 
                    116: #ifdef HACK_WWW
1.7     ! cvs       117:    HTEventCallback    *cbf;
        !           118: 
1.4       cvs       119: #else
1.7     ! cvs       120:    HTEventCallback    *cbf = (HTEventCallback *) __RetrieveCBF (*s, ops, &rqp);
        !           121: 
1.4       cvs       122: #endif
1.7     ! cvs       123:    me = HTRequest_context (rqp);
1.4       cvs       124: 
                    125: #if 0
1.7     ! cvs       126:    switch ((XtInputId) cd)
        !           127:         {
        !           128:            case XtInputReadMask:
        !           129:               ops = me->read_ops;
        !           130:               if (me->read_xtinput_id)
        !           131:                 {
        !           132:                    XtRemoveInput (me->read_xtinput_id);
        !           133:                    if (THD_TRACE)
        !           134:                       fprintf (stderr, "(BT) removing Xtinput %lu R (AHTBridge before cbf), sock %d\n", me->read_xtinput_id, *s);
        !           135:                    me->read_xtinput_id = 0;
        !           136:                 }
        !           137:               break;
        !           138:            case XtInputWriteMask:
        !           139:               ops = me->write_ops;
        !           140:               if (me->write_xtinput_id)
        !           141:                 {
        !           142:                    XtRemoveInput (me->write_xtinput_id);
        !           143:                    if (THD_TRACE)
        !           144:                       fprintf (stderr, "(BT) removing Xtinput %lu W (AHTBridge before cbf), sock %d\n", me->write_xtinput_id, *s);
        !           145:                    me->write_xtinput_id = 0;
        !           146:                 }
        !           147:               break;
        !           148:            case XtInputExceptMask:
        !           149:               ops = me->except_ops;
        !           150:               if (me->except_xtinput_id)
        !           151:                 {
        !           152:                    XtRemoveInput (me->except_xtinput_id);
        !           153:                    if (THD_TRACE)
        !           154:                       fprintf (stderr, "(BT) removing Xtinput %lu E (AHTBridge before cbf), sock %d\n", me->except_xtinput_id, *s);
        !           155:                    me->except_xtinput_id = 0;
        !           156:                 }
        !           157:               break;
        !           158:         }                      /* switch */
1.4       cvs       159: #endif
                    160: 
1.7     ! cvs       161:    if (THD_TRACE)
1.4       cvs       162:       fprintf (stderr, "AHTBridge: Processing url %s \n", me->urlName);
                    163: 
                    164: 
                    165: #ifdef WWW_XWINDOWS
1.7     ! cvs       166:    switch ((XtInputId) cd)
        !           167:         {
        !           168:            case XtInputReadMask:
        !           169:               ops = me->read_ops;
        !           170:               ops = FD_READ;
        !           171:               break;
        !           172:            case XtInputWriteMask:
        !           173:               ops = me->write_ops;
        !           174:               ops = FD_WRITE;
        !           175:               break;
        !           176:            case XtInputExceptMask:
        !           177:               ops = me->except_ops;
        !           178:               ops = FD_OOB;
        !           179:               break;
        !           180:         }                      /* switch */
        !           181: #endif /* WWW_XWINDOWS */
        !           182: 
        !           183:    /* 
        !           184:     * Liberate the input, so that when a pending socket is activated,
        !           185:     * the socket status will be ... available 
        !           186:     * 
        !           187:     * verify if I can CHKR_LIMIT this to the unregister function 
        !           188:     * does not look so
        !           189:     *
        !           190:     * although it makes no sense, callbacks can be null 
        !           191:     */
1.4       cvs       192: 
1.7     ! cvs       193:    if (!cbf || !rqp || rqp->priority == HT_PRIORITY_OFF)
        !           194:      {
1.4       cvs       195:        if (THD_TRACE)
1.7     ! cvs       196:           HTTrace ("Callback.... No callback found\n");
1.4       cvs       197:        /* put some more code to correctly destroy this request */
                    198:        return (0);
1.7     ! cvs       199:      }
        !           200: 
        !           201:    me->reqStatus = HT_BUSY;
1.4       cvs       202: 
1.7     ! cvs       203:    if ((status = (*cbf) (*s, rqp, ops)) != HT_OK)
        !           204:       HTTrace ("Callback.... received != HT_OK");
1.4       cvs       205: 
1.7     ! cvs       206:    /* Several states can happen after this callback. They
        !           207:     * are indicated by the me->reqStatus structure member and
        !           208:     * the fds external variables. The following lines examine
        !           209:     * the states and correspondly update the Xt event register
        !           210:     *
        !           211:     * Regarding the me->reqStatus member, we have the following
        !           212:     * possible states:
        !           213:     *   
        !           214:     * HT_BUSY:    Request has blocked
        !           215:     * HT_WAITING: Request has been reissued
        !           216:     * HT_ABORT:   Request has been stopped
        !           217:     * HT_END:     Request has ended
        !           218:     */
        !           219: 
        !           220:    /* Has the request been stopped? 
1.4       cvs       221: 
1.7     ! cvs       222:     * we verify if the request exists. If it has ended, me will have
        !           223:     *  a reqStatus with an HT_END value */
1.4       cvs       224: 
1.7     ! cvs       225:    /* Was the stop button pressed? */
1.4       cvs       226: 
1.7     ! cvs       227: #ifdef WWW_XWINDOWS
        !           228:    if (me->reqStatus == HT_ABORT)
        !           229:      {
1.4       cvs       230:        me->reqStatus = HT_WAITING;
                    231:        StopRequest (me->docid);
1.7     ! cvs       232:        if (THD_TRACE)
        !           233:           fprintf (stderr, "(BF) removing Xtinput %lu !RWE (Stop buttonl), sock %d\n", me->read_xtinput_id, sock);
        !           234:        return (0);
        !           235:      }
        !           236: #endif /* WWW_XWINDOWS */
        !           237: 
        !           238:    /* the request is being reissued */
        !           239: 
        !           240:    if (me->reqStatus == HT_WAITING)
        !           241:      {
        !           242:        /*
        !           243:         * (1) The old request has ended and the library
        !           244:         * assigned the old socket number to a pending
        !           245:         * request.
        !           246:         *
        !           247:         * (2) The request has been reissued after an 
        !           248:         * authentication or redirection directive and
        !           249:         * we are using the same old socket number.
        !           250:         */
1.4       cvs       251: 
1.7     ! cvs       252:        if (THD_TRACE)
        !           253:           fprintf (stderr, "*** detected a reissue of request \n");
        !           254:        return (0);
        !           255:      }
1.4       cvs       256: 
1.7     ! cvs       257: 
        !           258:    /* verify if the request is still alive !! */
        !           259: 
        !           260:    if ((me->request->net == (HTNet *) NULL) || (me->reqStatus == HT_END || me->reqStatus == HT_ERR))
        !           261:      {
        !           262:        /* the socket is now being used by a different request, so the request has ended */
1.4       cvs       263: #ifdef WWW_XWINDOWS
1.7     ! cvs       264:        if (THD_TRACE)
        !           265:           fprintf (stderr, "(BF) removing Xtinput %lu !RWE, sock %d (Request has ended)\n", *id, *s);
1.4       cvs       266: #endif
1.7     ! cvs       267:        if ((me->mode & AMAYA_ASYNC) || (me->mode & AMAYA_IASYNC))
        !           268:          {
        !           269:             AHTPrintPendingRequestStatus (me->docid, YES);
        !           270:             AHTReqContext_delete (me);
        !           271:          }
        !           272:        else if (me->reqStatus != HT_END && HTError_hasSeverity (HTRequest_error (me->request), ERR_NON_FATAL))
1.4       cvs       273:           me->reqStatus = HT_ERR;
1.7     ! cvs       274:        return (0);
        !           275:      }
        !           276:    me->reqStatus = HT_WAITING;
        !           277:    return (0);
1.4       cvs       278: }
                    279: 
                    280: 
                    281: /* 
                    282:  * This function is called whenever a socket is available
                    283:  * for a request. It  the necessary events to the Xt
                    284:  * A small interface to the HTLoadAnchor libwww function.
                    285:  * It prepares Xt to handle the asynchronous data requests.
                    286:  */
                    287: 
                    288: #ifdef __STDC__
1.7     ! cvs       289: int                 Add_NewSocket_to_Loop (HTRequest * request, HTAlertOpcode op, int msgnum, const char *dfault, void *input, HTAlertPar * reply)
1.4       cvs       290: #else
1.7     ! cvs       291: int                 Add_NewSocket_to_Loop (request, op, msgnum, dfault, input, reply)
        !           292: HTRequest          *request;
        !           293: HTAlertOpcode       op;
        !           294: int                 msgnum;
        !           295: const char         *dfault;
        !           296: void               *input;
        !           297: HTAlertPar         *reply;
        !           298: 
        !           299: #endif /* __STDC__ */
1.4       cvs       300: {
1.7     ! cvs       301:    SOCKET              req_socket;
        !           302:    AHTReqContext      *me = HTRequest_context (request);
1.4       cvs       303: 
1.7     ! cvs       304:    /* AmayaOpenRequests *reqState; */
1.4       cvs       305: 
1.7     ! cvs       306:    if (me->reqStatus == HT_NEW_PENDING)
        !           307:      {
        !           308:        /* we are opening a pending request */
        !           309:        if ((me->output = fopen (me->outputfile, "w")) == NULL)
        !           310:          {
        !           311:             me->outputfile[0] = '\0';  /* file could not be opened */
        !           312:             TtaSetStatus (me->docid, 1, TtaGetMessage (AMAYA, AM_CANNOT_CREATE_FILE),
        !           313:                           me->outputfile);
        !           314:             me->reqStatus = HT_ERR;
        !           315:             return (HT_ERROR);
        !           316:          }
        !           317:        if (THD_TRACE)
        !           318:           fprintf (stderr, "Add_NewSocket_to_Loop: Activating pending %s . Open fd %d\n", me->urlName, (int) me->output);
        !           319:        HTRequest_setOutputStream (me->request,
        !           320:                             AHTFWriter_new (me->request, me->output, YES));
        !           321:      }
1.4       cvs       322: 
1.7     ! cvs       323:    me->reqStatus = HT_WAITING;
1.4       cvs       324: 
1.7     ! cvs       325:    if (THD_TRACE)
        !           326:       fprintf (stderr, "(Activating a pending request\n");
1.4       cvs       327: 
1.7     ! cvs       328:    /* reusing this function to save on file descriptors */
1.4       cvs       329: 
                    330: 
1.7     ! cvs       331:    return (HT_OK);
1.4       cvs       332: 
                    333:     /***
                    334:     if(me->method == METHOD_PUT || me->method == METHOD_POST)
                    335:        return (HT_OK);
                    336:     ***/
                    337: 
1.7     ! cvs       338:    /* get the socket number associated to the request */
1.4       cvs       339: 
1.7     ! cvs       340:    req_socket = HTNet_socket (request->net);
        !           341: 
        !           342:    if (req_socket == INVSOC)
        !           343:      {
1.4       cvs       344:        /* this should never be true */
                    345:        return (HT_ERROR);
1.7     ! cvs       346:      }
1.4       cvs       347: 
1.7     ! cvs       348:    /* add the input */
1.4       cvs       349: 
                    350: #ifdef WWW_XWINDOWS
1.7     ! cvs       351:    me->write_xtinput_id =
        !           352:       XtAppAddInput (app_cont, req_socket, (XtPointer) XtInputWriteMask,
1.4       cvs       353:                     (XtInputCallbackProc) AHTCallback_bridge, NULL);
1.7     ! cvs       354:    if (THD_TRACE)
        !           355:       fprintf (stderr, "(BT) adding   Xtinput %lu Socket %d W \n", me->write_xtinput_id, req_socket);
        !           356: 
        !           357:    if (me->write_xtinput_id == (XtInputId) NULL)
        !           358:      {
        !           359:        TtaSetStatus (me->docid, 1, TtaGetMessage (AMAYA, AM_XT_ERROR), me->urlName);
        !           360: 
        !           361:        /* I still need to add some error treatment here, to liberate memory */
        !           362:        return (HT_ERROR);
        !           363:      }
1.4       cvs       364: 
                    365: #endif /* WWW_XWINDOWS */
1.7     ! cvs       366:    /* To speed up the stop performances, we move the active requests to the top of the Amaya list */
1.4       cvs       367: 
1.7     ! cvs       368:    /*
        !           369:       reqState  = DocRequestState(Amaya->open_requests, me->docid);
1.4       cvs       370: 
1.7     ! cvs       371:       if(reqState->counter > 1) {
1.4       cvs       372:       HTList_removeObject (Amaya->reqlist, (void *) me);
                    373:       HTList_addObject (Amaya->reqlist, (void *) me);
1.7     ! cvs       374:       }
1.4       cvs       375:     */
1.7     ! cvs       376:    return (HT_OK);
1.4       cvs       377: }
                    378: 
                    379: 
                    380: /* 
                    381:  * This function is called whenever a socket is available
                    382:  * for a request. It  the necessary events to the Xt
                    383:  * A small interface to the HTLoadAnchor libwww function.
                    384:  * It prepares Xt to handle the asynchronous data requests.
                    385:  */
                    386: 
                    387: #ifdef __STDC__
1.7     ! cvs       388: int                 AHTEvent_register (SOCKET sock, HTRequest * rqp, SockOps ops, HTEventCallback * cbf, HTPriority p)
1.4       cvs       389: #else
1.7     ! cvs       390: int                 AHTEvent_register (sock, rqp, ops, cbf, p)
        !           391: SOCKET              sock;
        !           392: HTRequest          *rqp;
        !           393: SockOps             ops;
        !           394: HTEventCallback    *cbf;
        !           395: HTPriority          p;
        !           396: 
        !           397: #endif /* __STDC__ */
1.4       cvs       398: {
1.7     ! cvs       399:    AHTReqContext      *me;
        !           400:    int                 status;
        !           401: 
        !           402:    if (sock == INVSOC)
1.4       cvs       403:       return (0);
                    404: 
1.7     ! cvs       405:    /* get the request associated to the socket number */
        !           406: 
        !           407:    if ((status = HTEventrg_register (sock, rqp, ops,
        !           408:                                     cbf, p)) != HT_OK)
1.4       cvs       409:       return (status);
                    410: 
1.7     ! cvs       411:    if (rqp)
        !           412:      {
1.4       cvs       413: 
1.7     ! cvs       414:        me = HTRequest_context (rqp);
1.4       cvs       415: 
1.7     ! cvs       416:        /* verify if we need to open the fd */
1.4       cvs       417: 
1.7     ! cvs       418:        if (me->reqStatus == HT_NEW_PENDING)
        !           419:          {
        !           420:             /* we are opening a pending request */
        !           421:             if ((me->output = fopen (me->outputfile, "w")) == NULL)
        !           422:               {
        !           423:                  me->outputfile[0] = '\0';     /* file could not be opened */
        !           424:                  TtaSetStatus (me->docid, 1, TtaGetMessage (AMAYA, AM_CANNOT_CREATE_FILE),
        !           425:                                me->outputfile);
        !           426:                  me->reqStatus = HT_ERR;
        !           427:                  return (HT_ERROR);
        !           428:               }
        !           429:             HTRequest_setOutputStream (me->request,
        !           430:                             AHTFWriter_new (me->request, me->output, YES));
        !           431:             me->reqStatus = HT_WAITING;
        !           432: 
        !           433:             if (THD_TRACE)
        !           434:                fprintf (stderr, "AHTEvent_register: Activating pending request url %s, fd %d\n", me->urlName, (int) me->output);
        !           435:          }
1.4       cvs       436: 
1.7     ! cvs       437:        if (THD_TRACE)
        !           438:           fprintf (stderr, "AHTEvent_register: url %s, sock %d, ops %lu \n",
        !           439:                    me->urlName, sock, ops);
1.4       cvs       440: 
1.7     ! cvs       441:        /* add the input */
        !           442:        if (me->reqStatus == HT_NEW)
        !           443:           me->reqStatus = HT_WAITING;
        !           444: 
        !           445:        if (ops & ReadBits)
        !           446:          {
        !           447:             me->read_ops = ops;
        !           448: 
        !           449: #ifdef WWW_XWINDOWS
        !           450:             if (me->read_xtinput_id)
        !           451:                XtRemoveInput (me->read_xtinput_id);
        !           452:             me->read_xtinput_id =
        !           453:                XtAppAddInput (app_cont,
        !           454:                               sock,
        !           455:                               (XtPointer) XtInputReadMask,
        !           456:                               (XtInputCallbackProc) AHTCallback_bridge,
        !           457:                               (XtPointer) XtInputReadMask);
        !           458:             if (THD_TRACE)
        !           459:                fprintf (stderr, "(BT) adding Xtinput %lu Socket %d R\n",
        !           460:                         me->read_xtinput_id, sock);
        !           461: #endif /* WWW_XWINDOWS */
        !           462:          }
        !           463: 
        !           464:        if (ops & WriteBits)
        !           465:          {
        !           466:             me->write_ops = ops;
        !           467: #ifdef WWW_XWINDOWS
        !           468:             if (me->write_xtinput_id)
        !           469:                XtRemoveInput (me->write_xtinput_id);
        !           470:             me->write_xtinput_id = XtAppAddInput (app_cont, sock,
        !           471:                                               (XtPointer) XtInputWriteMask,
        !           472:                                   (XtInputCallbackProc) AHTCallback_bridge,
        !           473:                                              (XtPointer) XtInputWriteMask);
        !           474:             if (THD_TRACE)
        !           475:                fprintf (stderr, "(BT) adding Xtinput %lu Socket %d W\n",
        !           476:                         me->write_xtinput_id, sock);
        !           477: #endif /* WWW_XWINDOWS */
        !           478:          }
        !           479: 
        !           480:        if (ops & ExceptBits)
        !           481:          {
        !           482:             me->except_ops = ops;
        !           483: #ifdef WWW_XWINDOWS
        !           484:             if (me->except_xtinput_id)
        !           485:                XtRemoveInput (me->except_xtinput_id);
        !           486: 
        !           487:             me->except_xtinput_id = XtAppAddInput (app_cont, sock,
        !           488:                                              (XtPointer) XtInputExceptMask,
        !           489:                                   (XtInputCallbackProc) AHTCallback_bridge,
        !           490:                                             (XtPointer) XtInputExceptMask);
        !           491:             if (THD_TRACE)
        !           492:                fprintf (stderr, "(BT) adding Xtinput %lu Socket %d E\n", me->except_xtinput_id, sock);
1.4       cvs       493: #endif /* WWW_XWINDOWS */
1.7     ! cvs       494:          }
        !           495:      }
1.4       cvs       496: 
                    497: 
                    498: 
                    499: #if 0
1.7     ! cvs       500:    if (me->xtinput_id == (XtInputId) NULL)
        !           501:      {
        !           502:        TtaSetStatus (me->docid, 1, TtaGetMessage (AMAYA, AM_XT_ERROR), me->urlName);
        !           503: 
        !           504:        /* I still need to add some error treatment here, to liberate memory */
        !           505:        return (HT_ERROR);
        !           506:      }
1.4       cvs       507: 
                    508: #endif
                    509: 
1.7     ! cvs       510:    return (status);
1.4       cvs       511: }
                    512: 
                    513: #ifdef __STDC__
1.7     ! cvs       514: int                 AHTEvent_unregister (SOCKET sock, SockOps ops)
1.4       cvs       515: #else
1.7     ! cvs       516: int                 AHTEvent_unregister (sock, ops)
        !           517: SOCKET              sock;
        !           518: SockOps             ops;
        !           519: 
        !           520: #endif /* __STDC__ */
1.4       cvs       521: {
1.7     ! cvs       522:    int                 status;
        !           523: 
        !           524:    HTRequest          *rqp = NULL;
        !           525:    AHTReqContext      *me;
1.4       cvs       526: 
                    527:    /* Libwww 4.1 does not take into account the third parameter
1.7     ! cvs       528:       **  for this function call */
1.4       cvs       529: 
1.7     ! cvs       530:    HTEventCallback    *cbf = (HTEventCallback *) __RetrieveCBF (sock, (SockOps) NULL, &rqp);
1.4       cvs       531: 
1.7     ! cvs       532:    if (cbf)
        !           533:      {
1.4       cvs       534: #ifdef WWW_XWINDOWS
1.7     ! cvs       535:        if (rqp)
        !           536:          {
        !           537:             me = HTRequest_context (rqp);
        !           538: 
        !           539:             if (ops & ReadBits)
        !           540:                RequestKillReadXtevent (me);
1.4       cvs       541: 
1.7     ! cvs       542:             if (ops & WriteBits)
        !           543:                RequestKillWriteXtevent (me);
        !           544: 
        !           545:             if (ops & ExceptBits)
        !           546:                RequestKillExceptXtevent (me);
        !           547: 
        !           548: #endif /* WWW_XWINDOWS */
        !           549: 
        !           550:          }
        !           551:      }
        !           552: 
        !           553:    status = HTEventrg_unregister (sock, ops);
        !           554:    return (status);
1.4       cvs       555: }
                    556: 
                    557: #ifdef __STDC__
1.7     ! cvs       558: void                RequestKillAllXtevents (AHTReqContext * me)
1.4       cvs       559: #else
1.7     ! cvs       560: void                RequestKillAllXtevents (me)
        !           561: AHTReqContext      *me;
        !           562: 
        !           563: #endif /* __STDC__ */
1.4       cvs       564: {
                    565: #ifdef WWW_XWINDOWS
1.7     ! cvs       566:    if (THD_TRACE)
        !           567:       fprintf (stderr, "Request_kill: Clearing Xtinputs\n");
1.4       cvs       568: 
1.7     ! cvs       569:    RequestKillReadXtevent (me);
        !           570:    RequestKillWriteXtevent (me);
        !           571:    RequestKillExceptXtevent (me);
1.4       cvs       572: #endif /* WWW_XWINDOWS */
                    573: }
                    574: 
                    575: #ifdef __STDC__
1.7     ! cvs       576: static void         RequestKillReadXtevent (AHTReqContext * me)
1.4       cvs       577: #else
1.7     ! cvs       578: static void         RequestKillReadXtevent (me)
        !           579: AHTReqContext      *me;
        !           580: 
        !           581: #endif /* __STDC__ */
1.4       cvs       582: {
                    583: #ifdef WWW_XWINDOWS
1.7     ! cvs       584:    if (me->read_xtinput_id)
        !           585:      {
        !           586:        if (THD_TRACE)
        !           587:           fprintf (stderr, "Request_kill: Clearing Read Xtinputs%lu\n", me->read_xtinput_id);
        !           588:        XtRemoveInput (me->read_xtinput_id);
        !           589:        me->read_xtinput_id = (XtInputId) NULL;
        !           590:      }
1.4       cvs       591: #endif /* WWW_XWINDOWS */
                    592: }
                    593: 
                    594: #ifdef __STDC__
1.7     ! cvs       595: static void         RequestKillWriteXtevent (AHTReqContext * me)
1.4       cvs       596: #else
1.7     ! cvs       597: static void         RequestKillWriteXtevent (me)
        !           598: AHTReqContext      *me;
        !           599: 
        !           600: #endif /* __STDC__ */
1.4       cvs       601: {
                    602: #ifdef WWW_XWINDOWS
1.7     ! cvs       603:    if (me->write_xtinput_id)
        !           604:      {
        !           605:        if (THD_TRACE)
        !           606:           fprintf (stderr, "Request_kill: Clearing Write Xtinputs %lu\n", me->write_xtinput_id);
        !           607:        XtRemoveInput (me->write_xtinput_id);
        !           608:        me->write_xtinput_id = (XtInputId) NULL;
        !           609:      }
1.4       cvs       610: #endif /* WWW_XWINDOWS */
                    611: }
                    612: 
                    613: #ifdef __STDC__
1.7     ! cvs       614: static void         RequestKillExceptXtevent (AHTReqContext * me)
1.4       cvs       615: #else
1.7     ! cvs       616: static void         RequestKillExceptXtevent (me)
        !           617: AHTReqContext      *me;
        !           618: 
        !           619: #endif /* __STDC__ */
1.4       cvs       620: {
                    621: #ifdef WWW_XWINDOWS
1.7     ! cvs       622:    if (me->except_xtinput_id)
        !           623:      {
        !           624:        if (THD_TRACE)
        !           625:           fprintf (stderr, "Request_kill: Clearing Except Xtinputs %lu\n", me->except_xtinput_id);
        !           626:        XtRemoveInput (me->except_xtinput_id);
        !           627:        me->except_xtinput_id = (XtInputId) NULL;
        !           628:      }
1.4       cvs       629: #endif /* WWW_XWINDOWS */
                    630: }

Webmaster