00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <stdio.h>
00029 #include <stdlib.h>
00030 #include <string.h>
00031 #include "cio.h"
00032 #include "task.h"
00033
00034 IOCB *PoolList;
00035 HTABS htabs[CIO_MAX_DEV];
00036 int last_dev = 0;
00037 ECB *IOCBBlocker;
00038
00039 static int dev_search(IOCB *iocb)
00040 {
00041
00042
00043
00044
00045 int i;
00046 HTABS *ht;
00047
00048 char *n,un[4];
00049 int l;
00050
00051 l = strcspn(iocb->dev_name,"9876543210:");
00052 ht = htabs + last_dev - 1;
00053
00054
00055 for(i=last_dev -1;(i > -1) && strncmp(iocb->dev_name,ht->dev_name,l) ;--i,--ht);
00056 if(i >= 0)
00057 {
00058
00059
00060
00061 n = iocb->dev_name + l;
00062 if((l = strcspn(n,":")) == 0)
00063 {
00064 iocb->devnum = 1;
00065 }
00066 else
00067 {
00068 strncpy(un,n,l);
00069 un[l] = '\0';
00070 iocb->devnum = atoi(un);
00071 }
00072 }
00073 return(i);
00074 }
00075
00076 static IOCB *AllocIOCB(void)
00077 {
00078 IOCB *retval;
00079
00080 if(PoolList == NULL)
00081 retval = (IOCB *)malloc(sizeof(IOCB));
00082 else
00083 {
00084 PendSemaphore(IOCBBlocker,0);
00085 retval = PoolList;
00086 PoolList = PoolList->next;
00087 PostSemaphore(IOCBBlocker,0);
00088 }
00089 return retval;
00090 }
00091
00092 static void FreeIOCB(IOCB *I)
00093 {
00094 PendSemaphore(IOCBBlocker,0);
00095 I->next = PoolList;
00096 PoolList = I;
00097 PostSemaphore(IOCBBlocker,0);
00098 }
00099
00100
00101 int CioAddHandler(char * devname,H_JVEC *t)
00102 {
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 int retval = 0;
00115 int sr;
00116
00117 sr = Disable();
00118 if(last_dev >= CIO_MAX_DEV) retval = CIO_DEVTABLE_FULL;
00119 else
00120 {
00121 htabs[last_dev].dev_name = devname;
00122 htabs[last_dev].HtabsEntry = t;
00123 ++last_dev;
00124 }
00125 Enable(sr);
00126 return retval;
00127 }
00128
00129 IOCB *CioOpen(char *devname,int mode)
00130 {
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 IOCB *iocb;
00149
00150 if((iocb = AllocIOCB()) != NULL)
00151 {
00152 iocb->dev_name = devname;
00153 iocb->mode = mode;
00154 if(( iocb->ichid = dev_search(iocb)) < 0)
00155 {
00156 FreeIOCB(iocb);
00157 iocb = NULL;
00158 }
00159
00160 else if(((*htabs[iocb->ichid].HtabsEntry->openv)(iocb)) < 0)
00161 {
00162 FreeIOCB(iocb);
00163 iocb = NULL;
00164 }
00165 }
00166 return(iocb);
00167 }
00168
00169 int CioClose(IOCB *I)
00170 {
00171 (*htabs[I->ichid].HtabsEntry->closv)(I);
00172 FreeIOCB(I);
00173 return(0);
00174 }