Exemple #1
0
int CBD1	
shmget(key_t key, size_t size, int shmflag)
{
	int	shmid = -1;
/*2001.1.9
	int	piid;
*********************/
	DWORD	procid;
	BOOL	lret;
	LPTSTR	lpszPipeName = "\\\\.\\pipe\\ipcd";
	SCBUF	scIn, scOut;
	DWORD	bytesRead;
	HANDLE	hIpct = NULL;
	IPCT	*ipct = NULL;

//	if (StartIPCD()<0)
//	{
//		errno=EFAULT;
//		return -1;
//	}

	if (key<0 || key>MAXKEYVAL || size<0)
	{
		l_ipclog( "[shmget] error key(%d)<0 || key(%d)>=MAXKEYVAL(%d) || size(%d)<0\n", 
			key, key, MAXKEYVAL, size);
		errno=EINVAL;
		return -1;
	}

	if (GetIPCT(&hIpct, &ipct)<0)
	{
		l_ipclog( "[shmget] GetIPCT error\n");
		errno=EFAULT;
		return -1;
	}

	procid=GetCurrentProcessId();

/*2001.1.9
	piid=FindPINFO(OPT_SHM, procid, ipct);
	if (piid<0)
	{
		piid=GetEmptyPINFO(OPT_SHM, ipct);
		if (piid<0)
		{
			l_ipclog( "[shmget] GetEmptyPINFO error\n");
			errno=ENOSPC;
			FreeIPCT(hIpct, ipct);
			return -1;
		}
	}
*********************************************************************/

	if (key!=IPC_PRIVATE)
	{
		shmid=FindSHMT(key, ipct);
		if (shmid>=0)
		{
			if (shmflag & IPC_CREAT || shmflag & IPC_EXCL)
			{
/*create한 process가 살아있으면 재생성시 오류 처리( 내가 아닌 경우 )*/
/*2001.1.9
				if (IsProcessForShm(shmid, ipct))
*/
				if( ( ipct->shmt[shmid].procid != procid ) &&
				    IsProcessForShm(shmid, ipct) )
				{
					l_ipclog( "[shmget] IsProcessForShm error shmid=[%d]\n", shmid);
					errno=EEXIST;
					FreeIPCT(hIpct, ipct);
					return -1;
				}

/*create한 process가 죽었으면 재생성 허용(truncate)*/
				if( InitSHMT(shmid, ipct) < 0 )
				{
					l_ipclog( "[shmget] InitSHMT error shmid=[%d]\n", shmid);
					FreeIPCT(hIpct, ipct);		/* 2001.1.10	JUNG	*/
					return -1;
				}
/*다시 creation 하는 경우*/
				else
				{
					;
				}
			}
			else
			{
/*있고 creation 이 아닌 경우*/
				if (size<ipct->shmt[shmid].shmds.shm_segsz 
				&&  size!=0)
				{
					l_ipclog( "[shmget] shmid=[%d], size=[%d]\n", shmid, size);
					errno=EINVAL;
					FreeIPCT(hIpct, ipct);
					return -1;
				}

/*2001.1.9			ipct->pshminfo[piid].procid=procid;*/
				FreeIPCT(hIpct, ipct);
				return shmid;
			}
		}
		if (shmflag & IPC_CREAT)
		{
			if (size==0)
			{
				l_ipclog( "[shmget] (shmflag & IPC_CREAT) shmid=[%d], size=[%d]\n", shmid, size);
				errno=EINVAL;
				FreeIPCT(hIpct, ipct);
				return -1;
			}
		}
		else
		{
/*없는데 get만하는 경우*/
			errno=ENOENT;
			FreeIPCT(hIpct, ipct);
			return -1;
		}
	}
	else
	{
/*2001.1.9. PENDING. PRIVATE 인 경우. key 값을 unique 하게 생성해야 함
		if (shmflag & IPC_CREAT)
		{
			if (size==0)
			{
				l_ipclog( "[shmget] (shmflag & IPC_CREAT) shmid=[%d], size=[%d]\n", shmid, size);
				errno=EINVAL;
				FreeIPCT(hIpct, ipct);
				return -1;
			}
		}
		else
		{
			l_ipclog( "[shmget] !(shmflag & IPC_CREAT) shmid=[%d]\n", shmid);
			errno=EINVAL;
			FreeIPCT(hIpct, ipct);
			return -1;
		}
*******************************************/
		FreeIPCT(hIpct, ipct);		/* 2001.1.10	JUNG	*/
		return( -1 );
	}

	shmid=GetEmptySHMT(ipct);
	if (shmid<0)
	{
		l_ipclog( "[shmget] GetEmptySHMT error\n");
		errno=ENOSPC;
		FreeIPCT(hIpct, ipct);
		return -1;
	}

//printf("shmget()	key=[%d]\n", key);
	ipct->shmt[shmid].key=key;
	ipct->shmt[shmid].procid=procid;

	ipct->shmt[shmid].shmds.shm_segsz=size;
	ipct->shmt[shmid].shmds.shm_lkcnt=0;
	ipct->shmt[shmid].shmds.shm_lpid=0;
	ipct->shmt[shmid].shmds.shm_cpid=0;
	ipct->shmt[shmid].shmds.shm_nattch=0;
	ipct->shmt[shmid].shmds.shm_cnattch=0;
	ipct->shmt[shmid].shmds.shm_atime=0;
	ipct->shmt[shmid].shmds.shm_dtime=0;
	time(&ipct->shmt[shmid].shmds.shm_ctime);

/*2001.1.9	ipct->pshminfo[piid].procid=procid;*/

//printf("shmget()	shmid=[%d]\n", shmid);
//printf("shmget()	shmt[%d].key=[%d]\n", shmid, shmt[shmid].key);
//printf("shmget()	hdwnd=[%x]\n", hdwnd);

	scIn.cmd=SNO_SHMGET;
	scIn.data=shmid;

	lret = CallNamedPipe(lpszPipeName,
		 (char *)&scIn, sizeof(scIn),
		 (char *)&scOut, sizeof(scOut),
		 &bytesRead, NMPWAIT_WAIT_FOREVER);

	if (lret==FALSE) 
	{
		errno=GetLastError();
		l_ipclog( "[shmget] CallNamedPipe error, errno=[%d]\n", errno);
		ipct->shmt[shmid].shmds.shm_segsz=0;
		ipct->shmt[shmid].shmds.shm_ctime=0;
		ipct->shmt[shmid].procid=0;
		ipct->shmt[shmid].key=-1;
		FreeIPCT(hIpct, ipct);
		return -1;
	}

	if (scOut.cmd!=SNO_OK)
	{
		l_ipclog( "[shmget] scOut.cmd!=SNO_OK\n");
		errno=scOut.data;
		ipct->shmt[shmid].shmds.shm_segsz=0;
		ipct->shmt[shmid].shmds.shm_ctime=0;
		ipct->shmt[shmid].procid=0;
		ipct->shmt[shmid].key=-1;
		FreeIPCT(hIpct, ipct);
		return -1;
	}

	FreeIPCT(hIpct, ipct);
	return shmid;
}
Exemple #2
0
APIRET os2APIENTRY DosWriteQueue(HQUEUE hq,
                                 ULONG request,
                                 ULONG /*cbData*/,
                                 PVOID pbData,
                                 ULONG priority)
{
    LPVOID p=(LPVOID)hq;
    if(p>=queue && p<queue+MAXQUEUES) {
        Queue *q=(Queue*)p;
        if(!q->used) return 337;
        if(q->elements==MAXELEMENTS) return 334;
        WaitForSingleObject(q->hmtx_modify,INFINITE);
        if(q->elements==MAXELEMENTS) {
            ReleaseMutex(q->hmtx_modify);
            return 334;
        }
        QueueElement e;
        e.putter = GetCurrentProcessId();
        e.base = pbData;
        e.request = request;
        e.priority = priority;
        switch(q->priority_algorithm) {
        case QUE_FIFO: {
            q->e[q->elements++] = e;
            break;
        }
        case QUE_LIFO: {
            for(int i=q->elements; i>0; i--)
                q->e[i] = q->e[i-1];
            q->e[0] = e;
            q->elements++;
            break;
        }
        case QUE_PRIORITY: {
            q->e[q->elements++] = e;
            for(int i=q->elements-1; i>0 && q->e[i].priority>q->e[i-1].priority; i--) {
                QueueElement tmp=q->e[i];
                q->e[i] = q->e[i-1];
                q->e[i-1] = tmp;
            }
            break;
        }
        }
        //signal stuff
        SetEvent(q->hev_notempty);
        if(q->uhev_notempty!=0)
            DosPostEventSem(q->uhev_notempty);
        ReleaseMutex(q->hmtx_modify);
        return 0;
    } else if(p>=clientend && p<clientend+MAXCLIENTENDS) {
        ClientEnd *ce=(ClientEnd*)p;
        if(!ce->used) return 337;
        struct {
            DWORD op;
            QueueElement e;
        } e;
        e.op = 2; //put
        e.e.putter = GetCurrentProcessId();
        e.e.base = pbData;
        e.e.request = request;
        e.e.priority = priority>15?15:priority;

        DWORD rc;
        DWORD bytes;
        BOOL b=CallNamedPipe(ce->npname,
                             &e,
                             sizeof(e),
                             &rc,
                             sizeof(rc),
                             &bytes,
                             NMPWAIT_WAIT_FOREVER
                            );
        if(!b || bytes!=sizeof(rc))
            return 337;
        else
            return 0;
    } else
        return 337;
}