/*BEGIN STANDARD RECORD SUPPORT ROUTINES*/ LOCAL long init_record(ab1771IXRecord *precord,int pass) { abStatus status; recordPvt *precordPvt; if(pass!=0) return(0); precord->iai1 = &mydevIai1; precord->dpvt = precordPvt = dbCalloc(1,sizeof(recordPvt)); callbackSetCallback(myCallback,&precordPvt->callback); callbackSetUser(precord,&precordPvt->callback); precord->inpm = (short *)dbCalloc(NUM_WORDS_IN,sizeof(short)); precord->outm = (short *)dbCalloc(NUM_WORDS_OUT,sizeof(short)); status = (*pabDrv->registerCard)(precord->link,precord->rack, precord->slot,typeBt,"ab1771IX",drvCallback,&precordPvt->drvPvt); if(status!=abNewCard) { if(status==abSuccess) errlogPrintf("record %s slot already used\n",precord->name); else errlogPrintf("record %s init error %s\n",precord->name, abStatusMessage[status]); issueError(precord,errFatal," while registering card"); precord->pact = TRUE; /*leave record active*/ return(0); } (*pabDrv->setUserPvt)(precordPvt->drvPvt,(void *)precord); msgInit(precord); precord->udf = FALSE; return(0); }
LOCAL void myCallback(CALLBACK *pCallback) { ab1771IXRecord *precord; recordPvt *precordPvt; int callLock; callbackGetUser(precord,pCallback); callLock = interruptAccept; if(callLock)dbScanLock((void *)precord); precordPvt = precord->dpvt; precordPvt->status = (*pabDrv->getStatus)(precordPvt->drvPvt); if(precordPvt->status!=abSuccess) { switch(precordPvt->msgState) { case msgStateWaitInit: case msgStateWaitGet: precordPvt->msgState = msgStateInit; break; default: errlogPrintf("ILLEGAL myCallback state: record %s\n",precord->name); break; } issueError(precord,errAb,0); } else { precordPvt->err = errOK; switch(precordPvt->msgState) { case msgStateWaitInit: precordPvt->msgState = msgStateGet; break;; case msgStateWaitGet: setValMsg(precord,0); msgCompleteGet(precord); issueAsynCallback(precord); break;; default: errlogPrintf("ILLEGAL myCallback state: record %s\n",precord->name); break; } if(precordPvt->err == errOK) switch(precordPvt->msgState) { case msgStateInit: msgInit(precord); break; case msgStateGet: msgGet(precord); break; default: break; } } if(precordPvt->err != errOK) issueAsynCallback(precord); if(callLock)dbScanUnlock((void *)precord); }
LOCAL long process(ab1771IXRecord *precord) { recordPvt *precordPvt = (recordPvt *)precord->dpvt; if(precordPvt->err == errFatal) { precord->pact = TRUE; return(0); } if(!precord->pact) {/* starting new request*/ if(precord->cmd==ab1771IX_Init) { precordPvt->msgState = msgStateInit; precord->cmd = ab1771IX_CMD_None; db_post_events(precord,&precord->cmd,DBE_VALUE|DBE_LOG); } precordPvt->err = errOK; /* starting new request*/ switch(precordPvt->msgState) { case msgStateInit: msgInit(precord); break; case msgStateGet: case msgStateDone: msgGet(precord); break; default: break; }/*Note that state may switch because of msgRequest just issued*/ } switch(precordPvt->msgState) { case msgStateWaitInit: case msgStateWaitGet: precord->pact = TRUE; precordPvt->waitAsynComplete = TRUE; return(0); default: break; } precord->pact = TRUE; monitor(precord); recGblFwdLink(precord); precordPvt->waitAsynComplete = FALSE; if(precordPvt->err != errFatal) precord->pact = FALSE; return(0); }
void main(int argc, char* argv[]) { char **cmd, *p; int i, ncmd, tflag; fmtinstall('D', dirfmt); fmtinstall('F', fcallfmt); fmtinstall('M', dirmodefmt); quotefmtinstall(); /* * Insulate from the invoker's environment. */ if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0) sysfatal("rfork: %r"); close(0); open("/dev/null", OREAD); close(1); open("/dev/null", OWRITE); cmd = nil; ncmd = tflag = 0; vtAttach(); ARGBEGIN{ case '?': default: usage(); break; case 'c': p = EARGF(usage()); currfsysname = p; cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*)); cmd[ncmd++] = p; break; case 'D': Dflag ^= 1; break; case 'f': p = EARGF(usage()); currfsysname = foptname = p; readCmdPart(p, &cmd, &ncmd); break; case 'm': mempcnt = atoi(EARGF(usage())); if(mempcnt <= 0 || mempcnt >= 100) usage(); break; case 't': tflag = 1; break; }ARGEND if(argc != 0) usage(); consInit(); cliInit(); msgInit(); conInit(); cmdInit(); fsysInit(); exclInit(); fidInit(); srvInit(); lstnInit(); usersInit(); for(i = 0; i < ncmd; i++) if(cliExec(cmd[i]) == 0) fprint(2, "%s: %R\n", cmd[i]); vtMemFree(cmd); if(tflag && consTTY() == 0) consPrint("%s\n", vtGetError()); vtDetach(); exits(0); }