Annotation of sbbs/sbbs3/sbbsexec.c, revision 1.1.1.1

1.1       root        1: /* sbbsexec.c */
                      2: 
                      3: /* Synchronet Windows NT/2000 VDD for FOSSIL and DOS I/O Interrupts */
                      4: 
                      5: /* $Id: sbbsexec.c,v 1.1.1.1 2000/10/10 11:26:22 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include <windows.h> 
                     39: #include <stdio.h>
                     40: #include <vddsvc.h>
                     41: #include "vdd_func.h"
                     42: #include "ringbuf.h"
                     43: 
                     44: #define RINGBUF_SIZE_IN                10000
                     45: 
                     46: 
                     47: __declspec(dllexport) void __cdecl VDDDispatch(void) 
                     48: {
                     49:        char                    str[512];
                     50:        char                    buf[5000];
                     51:        DWORD                   count;
                     52:        int                             retval;
                     53:        int                             node_num;
                     54:        BYTE*                   p;
                     55:        vdd_status_t*   status;
                     56:        static  DWORD   inbuf_poll;
                     57:        static  DWORD   online_poll;
                     58:        static  DWORD   status_poll;
                     59:        static  HANDLE  hungup_event;
                     60:        static  HANDLE  rdslot=INVALID_HANDLE_VALUE;
                     61:        static  HANDLE  wrslot=INVALID_HANDLE_VALUE;
                     62:        static  RingBuf rdbuf;
                     63:        static  FILE*   fp;
                     64: 
                     65:        node_num=getBH();
                     66: 
                     67:        switch(getBL()) {
                     68: 
                     69:                case VDD_OPEN:
                     70:                        sprintf(str,"sbbsexec%d.log",node_num);
                     71:                        fp=fopen(str,"wb");
                     72: 
                     73:                        sprintf(str,"\\\\.\\mailslot\\sbbsexec\\wr%d",node_num);
                     74:                        rdslot=CreateMailslot(str
                     75:                                ,sizeof(buf)                    // Max message size (0=any)
                     76:                                ,MAILSLOT_WAIT_FOREVER  // Read timeout
                     77:                                ,NULL);
                     78:                        if(rdslot==INVALID_HANDLE_VALUE) {
                     79:                                if(fp!=NULL)
                     80:                                        fprintf(fp,"!VDD_OPEN: Error %d opening %s\r\n"
                     81:                                                ,GetLastError(),str);
                     82:                                retval=1;
                     83:                                break;
                     84:                        }
                     85: 
                     86:                        sprintf(str,"\\\\.\\mailslot\\sbbsexec\\rd%d",node_num);
                     87:                        wrslot=CreateFile(str
                     88:                                ,GENERIC_WRITE
                     89:                                ,FILE_SHARE_READ
                     90:                                ,NULL
                     91:                                ,OPEN_EXISTING
                     92:                                ,FILE_ATTRIBUTE_NORMAL
                     93:                                ,(HANDLE) NULL);
                     94:                        if(wrslot==INVALID_HANDLE_VALUE) {
                     95:                                if(fp!=NULL)
                     96:                                        fprintf(fp,"!VDD_OPEN: Error %d opening %s\r\n"
                     97:                                                ,GetLastError(),str);
                     98:                                retval=2;
                     99:                                break;
                    100:                        }
                    101: 
                    102:                        if(RingBufInit(&rdbuf, RINGBUF_SIZE_IN)!=0) {
                    103:                                retval=3;
                    104:                                break;
                    105:                        }
                    106: 
                    107:                        sprintf(str,"sbbsexec_hungup%d",node_num);
                    108:                        hungup_event=OpenEvent(
                    109:                                EVENT_ALL_ACCESS,       // access flag 
                    110:                                FALSE,                          // inherit flag 
                    111:                                str);                           // pointer to event-object name 
                    112:                        if(hungup_event==NULL) {
                    113:                                if(fp!=NULL)
                    114:                                        fprintf(fp,"!VDD_OPEN: Error %d opening %s\r\n"
                    115:                                                ,GetLastError(),str);
                    116:                                retval=4;
                    117:                                break;
                    118:                        }
                    119: 
                    120:                        status_poll=0;
                    121:                        inbuf_poll=0;
                    122:                        online_poll=0;
                    123: 
                    124:                        retval=0;
                    125:                        break;
                    126: 
                    127:                case VDD_CLOSE:
                    128:                        if(fp!=NULL) {
                    129:                                fprintf(fp,"VDD_CLOSE: rdbuf=%d "
                    130:                                        "status_poll=%d inbuf_poll=%d online_poll=%d\r\n"
                    131:                                        ,RingBufFull(&rdbuf),status_poll,inbuf_poll,online_poll);
                    132:                                fclose(fp);
                    133:                        }
                    134:                        CloseHandle(rdslot);
                    135:                        CloseHandle(wrslot);
                    136:                        CloseHandle(hungup_event);
                    137:                        RingBufDispose(&rdbuf);
                    138:                        status_poll=0;
                    139:                        retval=0;
                    140: 
                    141:                        break;
                    142: 
                    143:                case VDD_READ:
                    144:                        count = getCX();
                    145:                        if(count != 1 && fp!=NULL)
                    146:                                fprintf(fp,"VDD_READ of %d\r\n",count);
                    147: 
                    148:                        p = (BYTE*) GetVDMPointer((ULONG)((getES() << 16)|getDI())
                    149:                                ,count,FALSE); 
                    150:                        if(RingBufFull(&rdbuf)) {
                    151:                                retval=RingBufRead(&rdbuf,p,count);
                    152:                                if(retval==0 && fp!=NULL)
                    153:                                        fprintf(fp,"!VDD_READ: RingBufRead read 0\r\n");
                    154:                                break;
                    155:                        }
                    156:                        if(!ReadFile(rdslot,buf,sizeof(buf),&retval,NULL)) {
                    157:                                if(fp!=NULL)
                    158:                                        fprintf(fp,"!VDD_READ: ReadFile Error %d (size=%d)\r\n"
                    159:                                                ,GetLastError(),retval);
                    160:                                retval=0;
                    161:                                break;
                    162:                        }
                    163:                        if(retval==0) {
                    164:                                if(fp!=NULL)
                    165:                                        fprintf(fp,"!VDD_READ: ReadFile read 0\r\n");
                    166:                                break;
                    167:                        }
                    168:                        RingBufWrite(&rdbuf,buf,retval);
                    169:                        retval=RingBufRead(&rdbuf,p,count);
                    170:                        if(retval==0 && fp!=NULL)
                    171:                                fprintf(fp,"!VDD_READ: RingBufRead read 0 after write\r\n");
                    172:                        break;
                    173: 
                    174:                case VDD_PEEK:
                    175:                        count = getCX();
                    176:                        if(count != 1 && fp!=NULL)
                    177:                                fprintf(fp,"VDD_PEEK of %d\r\n",count);
                    178: 
                    179:                        p = (BYTE*) GetVDMPointer((ULONG)((getES() << 16)|getDI())
                    180:                                ,count,FALSE); 
                    181:                        if(RingBufFull(&rdbuf)) {
                    182:                                retval=RingBufPeek(&rdbuf,p,count);
                    183:                                break;
                    184:                        }
                    185:                        if(!ReadFile(rdslot,buf,sizeof(buf),&retval,NULL)) {
                    186:                                if(fp!=NULL)
                    187:                                        fprintf(fp,"!VDD_PEEK: ReadFile Error %d\r\n"
                    188:                                                ,GetLastError());
                    189:                                retval=0;
                    190:                                break;
                    191:                        }
                    192:                        if(retval==0) {
                    193:                                if(fp!=NULL)
                    194:                                        fprintf(fp,"!VDD_PEEK: ReadFile read 0\r\n");
                    195:                                break;
                    196:                        }
                    197:                        RingBufWrite(&rdbuf,buf,retval);
                    198:                        retval=RingBufPeek(&rdbuf,p,count);
                    199:                        break;
                    200: 
                    201:                case VDD_WRITE:
                    202:                        count = getCX();
                    203:                        if(count != 1 && fp!=NULL)
                    204:                                fprintf(fp,"VDD_WRITE of %d\r\n",count);
                    205:                        p = (BYTE*) GetVDMPointer((ULONG)((getES() << 16)|getDI())
                    206:                                ,count,FALSE); 
                    207: //                     if(fp!=NULL)
                    208: //                             fwrite(p,count,1,fp);
                    209:                        if(!WriteFile(wrslot,p,count,&retval,NULL)) {
                    210:                                if(fp!=NULL)
                    211:                                        fprintf(fp,"!VDD_WRITE: WriteFile Error %d (size=%d)\r\n"
                    212:                                                ,GetLastError(),retval);
                    213:                                retval=0;
                    214:                        }
                    215:                        break;
                    216: 
                    217:                case VDD_STATUS:
                    218: 
                    219:                        status_poll++;
                    220:                        count = getCX();
                    221:                        if(count != sizeof(vdd_status_t)) {
                    222:                                if(fp!=NULL)
                    223:                                        fprintf(fp,"!VDD_STATUS: wrong size (%d!=%d)\r\n",count,sizeof(vdd_status_t));
                    224:                                retval=sizeof(vdd_status_t);
                    225:                                break;
                    226:                        }
                    227:                        status = (vdd_status_t*) GetVDMPointer((ULONG)((getES() << 16)|getDI())
                    228:                                ,count,FALSE); 
                    229: 
                    230:                        /* INBUF FULL/SIZE */
                    231:                        if(!GetMailslotInfo(
                    232:                                rdslot,                                 // mailslot handle 
                    233:                                &status->inbuf_size,    // address of maximum message size 
                    234:                                &status->inbuf_full,    // address of size of next message 
                    235:                                NULL,                                   // address of number of messages 
                    236:                                NULL                                    // address of read time-out 
                    237:                                )) {
                    238:                                status->inbuf_full=0;
                    239:                                status->inbuf_size=4000;
                    240:                        }
                    241:                        if(status->inbuf_full==MAILSLOT_NO_MESSAGE)
                    242:                                status->inbuf_full=0;
                    243:                        status->inbuf_full+=RingBufFull(&rdbuf);
                    244:                        
                    245: 
                    246:                        /* OUTBUF FULL/SIZZE */
                    247:                        if(!GetMailslotInfo(
                    248:                                wrslot,                                 // mailslot handle 
                    249:                                &status->outbuf_size,   // address of maximum message size 
                    250:                                &status->outbuf_full,   // address of size of next message 
                    251:                                NULL,                                   // address of number of messages 
                    252:                                NULL                                    // address of read time-out 
                    253:                                )) {
                    254:                                status->outbuf_full=0;
                    255:                                status->outbuf_size=4000;
                    256:                        }
                    257:                        if(status->outbuf_full==MAILSLOT_NO_MESSAGE)
                    258:                                status->outbuf_full=0;
                    259:                
                    260:                        
                    261:                        /* ONLINE */
                    262:                        if(WaitForSingleObject(hungup_event,0)==WAIT_OBJECT_0)
                    263:                                status->online=0;
                    264:                        else
                    265:                                status->online=1;
                    266: 
                    267:                        retval=0;       /* success */
                    268:                        break;
                    269: 
                    270: 
                    271:                case VDD_INBUF_PURGE:
                    272:                        if(fp!=NULL)
                    273:                                fprintf(fp,"!VDD_INBUF_PURGE: NOT IMPLEMENTED\r\n");
                    274:                        retval=0;
                    275:                        break;
                    276: 
                    277:                case VDD_OUTBUF_PURGE:
                    278:                        if(fp!=NULL)
                    279:                                fprintf(fp,"!VDD_OUTBUF_PURGE: NOT IMPLEMENTED\r\n");
                    280:                        retval=0;
                    281:                        break;
                    282: 
                    283: #if 1
                    284:                case VDD_INBUF_FULL:
                    285:                        if(!GetMailslotInfo(
                    286:                                rdslot,         // mailslot handle 
                    287:                                NULL,           // address of maximum message size 
                    288:                                &retval,        // address of size of next message 
                    289:                                &count,         // address of number of messages 
                    290:                                NULL            // address of read time-out 
                    291:                                ))
                    292:                                retval=0;
                    293:                        if(retval==MAILSLOT_NO_MESSAGE)
                    294:                                retval=0;
                    295:                        retval+=RingBufFull(&rdbuf);
                    296:                        inbuf_poll++;
                    297:                        break;
                    298: 
                    299:                case VDD_INBUF_SIZE:
                    300:                        if(!GetMailslotInfo(
                    301:                                rdslot,         // mailslot handle 
                    302:                                &retval,        // address of maximum message size 
                    303:                                NULL,           // address of size of next message 
                    304:                                NULL,           // address of number of messages 
                    305:                                NULL            // address of read time-out 
                    306:                                ))
                    307:                                retval=4000;
                    308:                        break;
                    309: 
                    310:                case VDD_OUTBUF_FULL:
                    311:                        if(!GetMailslotInfo(
                    312:                                wrslot,         // mailslot handle 
                    313:                                NULL,           // address of maximum message size 
                    314:                                &retval,        // address of size of next message 
                    315:                                NULL,           // address of number of messages 
                    316:                                NULL            // address of read time-out 
                    317:                                ))
                    318:                                retval=0;
                    319:                        if(retval==MAILSLOT_NO_MESSAGE)
                    320:                                retval=0;
                    321:                        break;
                    322: 
                    323:                case VDD_OUTBUF_SIZE:
                    324:                        if(!GetMailslotInfo(
                    325:                                wrslot,         // mailslot handle 
                    326:                                &retval,        // address of maximum message size 
                    327:                                NULL,           // address of size of next message 
                    328:                                NULL,           // address of number of messages 
                    329:                                NULL            // address of read time-out 
                    330:                                )) 
                    331:                                retval=4000;
                    332:                        break;
                    333: 
                    334:                case VDD_ONLINE:
                    335:                        if(WaitForSingleObject(hungup_event,0)==WAIT_OBJECT_0)
                    336:                                retval=0;
                    337:                        else
                    338:                                retval=1;
                    339:                        online_poll++;
                    340:                        break;
                    341: #endif
                    342:                default:
                    343:                        if(fp!=NULL)
                    344:                                fprintf(fp,"!UNKNOWN VDD_OP: %d\r\n",getBL());
                    345:                        break;
                    346:        }
                    347:        setAX((WORD)retval);
                    348: }
                    349: 
                    350: __declspec(dllexport) BOOL __cdecl VDDInitialize(IN PVOID DllHandle, IN ULONG Reason, 
                    351: IN PCONTEXT Context OPTIONAL)
                    352: {
                    353:     return TRUE;
                    354: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.