mirror of
https://gitlab.freedesktop.org/xorg/lib/libx11.git
synced 2025-12-20 04:40:10 +01:00
Drop vestiges of OS/2 support
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> Part-of: <https://gitlab.freedesktop.org/xorg/lib/libx11/-/merge_requests/291>
This commit is contained in:
parent
06516f8c51
commit
7b9a1dba6f
7 changed files with 6 additions and 476 deletions
4
AUTHORS
4
AUTHORS
|
|
@ -7,8 +7,8 @@ Warren Turkal did the autotooling in October, 2003.
|
|||
Josh Triplett, Jamey Sharp, and the XCB team (xcb@lists.freedesktop.org)
|
||||
maintain the XCB support.
|
||||
|
||||
Individual developers include (in no particular order): Sebastien
|
||||
Marineau, Holger Veit, Bruno Haible, Keith Packard, Bob Scheifler,
|
||||
Individual developers include (in no particular order):
|
||||
Bruno Haible, Keith Packard, Bob Scheifler,
|
||||
Takashi Fujiwara, Kazunori Nishihara, Hideki Hiura, Hiroyuki Miyamoto,
|
||||
Katsuhisi Yano, Shigeru Yamada, Stephen Gildea, Li Yuhong, Seiji Kuwari.
|
||||
|
||||
|
|
|
|||
29
COPYING
29
COPYING
|
|
@ -715,35 +715,6 @@ OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
----------------------------------------
|
||||
|
||||
(c) Copyright 1996 by Sebastien Marineau and Holger Veit
|
||||
<marineau@genie.uottawa.ca>
|
||||
<Holger.Veit@gmd.de>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
HOLGER VEIT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of Sebastien Marineau or Holger Veit
|
||||
shall not be used in advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Software without prior written authorization from Holger Veit or
|
||||
Sebastien Marineau.
|
||||
|
||||
----------------------------------------
|
||||
|
||||
Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
|
||||
and Nippon Telegraph and Telephone Corporation
|
||||
Copyright 1991 by the Open Software Foundation
|
||||
|
|
|
|||
|
|
@ -177,14 +177,8 @@ AC_CHECK_FUNC([shmat], AC_DEFINE(HAS_SHM,1,[Has shm*() functions]))
|
|||
|
||||
# arch specific things
|
||||
WCHAR32="1"
|
||||
case $host_os in
|
||||
os2*) os2="true" ; WCHAR32="0" ;;
|
||||
*) ;;
|
||||
esac
|
||||
AC_SUBST(WCHAR32)
|
||||
|
||||
AM_CONDITIONAL(OS2, test x$os2 = xtrue)
|
||||
|
||||
AC_ARG_WITH(launchd, AS_HELP_STRING([--with-launchd], [Build with support for Apple's launchd (default: auto)]), [LAUNCHD=$withval], [LAUNCHD=auto])
|
||||
if test "x$LAUNCHD" = xauto; then
|
||||
unset LAUNCHD
|
||||
|
|
|
|||
|
|
@ -329,16 +329,10 @@ libX11_la_SOURCES = \
|
|||
# ========================= Extra stuff ============================
|
||||
#
|
||||
|
||||
if OS2
|
||||
libX11_la_SOURCES+=os2Stubs.c
|
||||
endif OS2
|
||||
|
||||
x11datadir = @X11_DATADIR@
|
||||
x11data_DATA = XErrorDB
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(x11data_DATA) \
|
||||
os2Stubs.c
|
||||
EXTRA_DIST = $(x11data_DATA)
|
||||
|
||||
libX11_xcb_la_SOURCES = x11_xcb.c Xxcbint.h
|
||||
libX11_xcb_la_LDFLAGS = -version-number 1:0:0 -no-undefined
|
||||
|
|
|
|||
|
|
@ -1880,7 +1880,6 @@ static int AccessFile (path, pathbuf, len_pathbuf, pathret)
|
|||
/* tried everywhere else, go fishing */
|
||||
#define C_DRIVE ('C' - 'A')
|
||||
#define Z_DRIVE ('Z' - 'A')
|
||||
/* does OS/2 (with or with gcc-emx) have getdrives? */
|
||||
drives = _getdrives ();
|
||||
for (i = C_DRIVE; i <= Z_DRIVE; i++) { /* don't check on A: or B: */
|
||||
if ((1 << i) & drives) {
|
||||
|
|
|
|||
|
|
@ -1577,18 +1577,18 @@ ReadInFile(_Xconst char *filename)
|
|||
|
||||
|
||||
/*
|
||||
* MS-Windows and OS/2 note: Default open mode includes O_TEXT
|
||||
* MS-Windows note: Default open mode includes O_TEXT
|
||||
*/
|
||||
if ( (fd = _XOpenFile (filename, O_RDONLY)) == -1 )
|
||||
return (char *)NULL;
|
||||
|
||||
/*
|
||||
* MS-Windows and OS/2 note: depending on how the sources are
|
||||
* MS-Windows note: depending on how the sources are
|
||||
* untarred, the newlines in resource files may or may not have
|
||||
* been expanded to CRLF. Either way the size returned by fstat
|
||||
* is sufficient to read the file into because in text-mode any
|
||||
* CRLFs in a file will be converted to newlines (LF) with the
|
||||
* result that the number of bytes actually read with be <=
|
||||
* result that the number of bytes actually read will be <=
|
||||
* to the size returned by fstat.
|
||||
*/
|
||||
{
|
||||
|
|
|
|||
428
src/os2Stubs.c
428
src/os2Stubs.c
|
|
@ -1,428 +0,0 @@
|
|||
/*
|
||||
* (c) Copyright 1996 by Sebastien Marineau and Holger Veit
|
||||
* <marineau@genie.uottawa.ca>
|
||||
* <Holger.Veit@gmd.de>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* HOLGER VEIT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of Sebastien Marineau or Holger Veit
|
||||
* shall not be used in advertising or otherwise to promote the sale, use or other
|
||||
* dealings in this Software without prior written authorization from Holger Veit or
|
||||
* Sebastien Marineau.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* A few OS/2 functions needed in the X11 lib. Mainly, the file path redirection
|
||||
* functions and the "optimized" select() for the clients */
|
||||
|
||||
#define I_NEED_OS2_H
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#include <X11/Xpoll.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/errno.h>
|
||||
#define INCL_DOSSEMAPHORES
|
||||
#define INCL_DOSNPIPES
|
||||
#define INCL_DOSMISC
|
||||
#define INCL_DOSMODULEMGR
|
||||
#undef BOOL
|
||||
#undef BYTE
|
||||
#include <os2.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
char *__XOS2RedirRoot(char *fname)
|
||||
{
|
||||
/* This adds a further redirection by allowing the ProjectRoot
|
||||
* to be prepended by the content of the envvar X11ROOT.
|
||||
* This is for the purpose to move the whole X11 stuff to a different
|
||||
* disk drive.
|
||||
* The feature was added despite various environment variables
|
||||
* because not all file opens respect them.
|
||||
*/
|
||||
static char redirname[300]; /* enough for long filenames */
|
||||
char *root;
|
||||
|
||||
/* if name does not start with /, assume it is not root-based */
|
||||
if (fname==0 || !(fname[0]=='/' || fname[0]=='\\'))
|
||||
return fname;
|
||||
|
||||
root = (char*)getenv("X11ROOT");
|
||||
if (root==0 ||
|
||||
(fname[1]==':' && isalpha(fname[0])) ||
|
||||
(strlen(fname)+strlen(root)+2) > 300)
|
||||
return fname;
|
||||
sprintf(redirname,"%s%s",root,fname);
|
||||
return redirname;
|
||||
}
|
||||
|
||||
char *__XOS2RedirRoot1(char *format, char *arg1, char *arg2, char *arg3)
|
||||
{
|
||||
/* this first constructs a name from a format and up to three
|
||||
* components, then adds a path
|
||||
*/
|
||||
char buf[300];
|
||||
sprintf(buf,format,arg1,arg2,arg3);
|
||||
return __XOS2RedirRoot(buf);
|
||||
}
|
||||
|
||||
/* This below implements select() for the calls in this file. It has been */
|
||||
/* somewhat optimized for improved performance, but assumes a few */
|
||||
/* things so it cannot be used as a general select. If both pipes and */
|
||||
/* sockets are present, this may call the emx select */
|
||||
|
||||
|
||||
HEV hPipeSem;
|
||||
HMODULE hmod_so32dll;
|
||||
static int (*os2_tcp_select)(int*,int,int,int,long);
|
||||
ULONG os2_get_sys_millis();
|
||||
extern int _files[];
|
||||
|
||||
#define MAX_TCP 256
|
||||
/* These lifted from sys/emx.h. Change if that changes there! */
|
||||
#define F_SOCKET 0x10000000
|
||||
#define F_PIPE 0x20000000
|
||||
|
||||
struct select_data
|
||||
{
|
||||
fd_set read_copy;
|
||||
fd_set write_copy;
|
||||
BOOL have_read;
|
||||
BOOL have_write;
|
||||
int tcp_select_mask[MAX_TCP];
|
||||
int tcp_emx_handles[MAX_TCP];
|
||||
int tcp_select_copy[MAX_TCP];
|
||||
int socket_nread;
|
||||
int socket_nwrite;
|
||||
int socket_ntotal;
|
||||
int pipe_ntotal;
|
||||
int pipe_have_write;
|
||||
int max_fds;
|
||||
};
|
||||
|
||||
int os2ClientSelect(int nfds, fd_set *readfds, fd_set *writefds,
|
||||
fd_set *exceptfds, struct timeval *timeout)
|
||||
{
|
||||
static BOOL FirstTime=TRUE;
|
||||
static haveTCPIP=TRUE;
|
||||
ULONG timeout_ms;
|
||||
ULONG postCount, start_millis,now_millis;
|
||||
char faildata[16];
|
||||
struct select_data sd;
|
||||
BOOL any_ready;
|
||||
int np,ns, i,ready_handles,n;
|
||||
APIRET rc;
|
||||
|
||||
sd.have_read=FALSE; sd.have_write=FALSE;
|
||||
sd.socket_nread=0; sd.socket_nwrite=0; sd.socket_ntotal=0;
|
||||
sd.max_fds=31; ready_handles=0; any_ready=FALSE;
|
||||
sd.pipe_ntotal=0; sd.pipe_have_write=FALSE;
|
||||
|
||||
if(FirstTime){
|
||||
/* First load the so32dll.dll module and get a pointer to the SELECT fn */
|
||||
|
||||
if((rc=DosLoadModule(faildata,sizeof(faildata),"SO32DLL",&hmod_so32dll))!=0){
|
||||
fprintf(stderr, "Could not load module so32dll.dll, rc = %d. Error note %s\n",rc,faildata);
|
||||
haveTCPIP=FALSE;
|
||||
}
|
||||
if((rc = DosQueryProcAddr(hmod_so32dll, 0, "SELECT", (PPFN)&os2_tcp_select))!=0){
|
||||
fprintf(stderr, "Could not query address of SELECT, rc = %d.\n",rc);
|
||||
haveTCPIP=FALSE;
|
||||
}
|
||||
/* Call these a first time to set the semaphore */
|
||||
rc = DosCreateEventSem(NULL, &hPipeSem, DC_SEM_SHARED, FALSE);
|
||||
if(rc) {
|
||||
fprintf(stderr, "Could not create event semaphore, rc=%d\n",rc);
|
||||
return(-1);
|
||||
}
|
||||
rc = DosResetEventSem(hPipeSem, &postCount);
|
||||
FirstTime = FALSE;
|
||||
}
|
||||
|
||||
/* Set up the time delay structs */
|
||||
|
||||
if(timeout!=NULL) {
|
||||
timeout_ms=timeout->tv_sec*1000+timeout->tv_usec/1000;
|
||||
}
|
||||
else { timeout_ms=1000000; } /* This should be large enough... */
|
||||
if(timeout_ms>0) start_millis=os2_get_sys_millis();
|
||||
|
||||
/* Copy the masks */
|
||||
{FD_ZERO(&sd.read_copy);}
|
||||
{FD_ZERO(&sd.write_copy);}
|
||||
if(readfds!=NULL){ XFD_COPYSET(readfds,&sd.read_copy); sd.have_read=TRUE;}
|
||||
if(writefds!=NULL) {XFD_COPYSET(writefds,&sd.write_copy);sd.have_write=TRUE;}
|
||||
|
||||
/* And zero the original masks */
|
||||
if(sd.have_read){ FD_ZERO(readfds);}
|
||||
if(sd.have_write) {FD_ZERO(writefds);}
|
||||
if(exceptfds != NULL) {FD_ZERO(exceptfds);}
|
||||
|
||||
/* Now we parse the fd_sets passed to select and separate pipe/sockets */
|
||||
n = os2_parse_select(&sd,nfds);
|
||||
if(n == -1) {
|
||||
errno = EBADF;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* Now we have three cases: either we have sockets, pipes, or both */
|
||||
/* We handle all three cases differently to optimize things */
|
||||
|
||||
/* Case 1: only pipes! */
|
||||
if((sd.pipe_ntotal >0) && (!sd.socket_ntotal)){
|
||||
np = os2_check_pipes(&sd,readfds,writefds);
|
||||
if(np > 0){
|
||||
return (np);
|
||||
}
|
||||
else if (np == -1) { return(-1); }
|
||||
while(!any_ready){
|
||||
rc = DosWaitEventSem(hPipeSem, timeout_ms);
|
||||
if(rc == 640) {
|
||||
return(0);
|
||||
}
|
||||
if((rc != 0) && (rc != 95)) {errno= EBADF; return(-1);}
|
||||
np = os2_check_pipes(&sd,readfds,writefds);
|
||||
if (np > 0){
|
||||
return(np);
|
||||
}
|
||||
else if (np < 0){ return(-1); }
|
||||
}
|
||||
}
|
||||
|
||||
/* Case 2: only sockets. Just let the os/2 tcp select do the work */
|
||||
if((sd.socket_ntotal > 0) && (!sd.pipe_ntotal)){
|
||||
ns = os2_check_sockets(&sd, readfds, writefds, timeout_ms);
|
||||
return (ns);
|
||||
}
|
||||
|
||||
/* Case 3: combination of both */
|
||||
if((sd.socket_ntotal > 0) && (sd.pipe_ntotal)){
|
||||
np = os2_check_pipes(&sd,readfds,writefds);
|
||||
if(np > 0){
|
||||
any_ready=TRUE;
|
||||
ready_handles += np;
|
||||
}
|
||||
else if (np == -1) { return(-1); }
|
||||
|
||||
ns = os2_check_sockets(&sd,readfds,writefds, 0);
|
||||
if(ns>0){
|
||||
ready_handles+=ns;
|
||||
any_ready = TRUE;
|
||||
}
|
||||
else if (ns == -1) {return(-1);}
|
||||
|
||||
while (!any_ready && timeout_ms){
|
||||
|
||||
rc = DosWaitEventSem(hPipeSem, 10L);
|
||||
if(rc == 0){
|
||||
np = os2_check_pipes(&sd,readfds,writefds);
|
||||
if(np > 0){
|
||||
ready_handles+=np;
|
||||
any_ready = TRUE;
|
||||
}
|
||||
else if (np == -1) {
|
||||
return(-1); }
|
||||
}
|
||||
|
||||
ns = os2_check_sockets(&sd,readfds,writefds,exceptfds, 0);
|
||||
if(ns>0){
|
||||
ready_handles+=ns;
|
||||
any_ready = TRUE;
|
||||
}
|
||||
else if (ns == -1) {return(-1);}
|
||||
|
||||
if (i%8 == 0) {
|
||||
now_millis = os2_get_sys_millis();
|
||||
if((now_millis-start_millis) > timeout_ms) timeout_ms = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return(ready_handles);
|
||||
}
|
||||
|
||||
|
||||
ULONG os2_get_sys_millis()
|
||||
{
|
||||
APIRET rc;
|
||||
ULONG milli;
|
||||
|
||||
rc = DosQuerySysInfo(14, 14, &milli, sizeof(milli));
|
||||
if(rc) {
|
||||
fprintf(stderr,"Bad return code querying the millisecond counter! rc=%d\n",rc);
|
||||
return(0);
|
||||
}
|
||||
return(milli);
|
||||
}
|
||||
|
||||
int os2_parse_select(sd,nfds)
|
||||
struct select_data *sd;
|
||||
int nfds;
|
||||
{
|
||||
int i;
|
||||
APIRET rc;
|
||||
/* First we determine up to which descriptor we need to check. */
|
||||
/* No need to check up to 256 if we don't have to (and usually we don't...)*/
|
||||
/* Note: stuff here is hardcoded for fd_sets which are int[8] as in EMX!!! */
|
||||
|
||||
if(nfds > sd->max_fds){
|
||||
for(i=0;i<((FD_SETSIZE+31)/32);i++){
|
||||
if(sd->read_copy.fds_bits[i] ||
|
||||
sd->write_copy.fds_bits[i])
|
||||
sd->max_fds=(i*32) +32;
|
||||
}
|
||||
}
|
||||
else { sd->max_fds = nfds; }
|
||||
/* Check if result is greater than specified in select() call */
|
||||
if(sd->max_fds > nfds) sd->max_fds = nfds;
|
||||
|
||||
if (sd->have_read)
|
||||
{
|
||||
for (i = 0; i < sd->max_fds; ++i) {
|
||||
if (FD_ISSET (i, &sd->read_copy)){
|
||||
if(_files[i] & F_SOCKET)
|
||||
{
|
||||
sd->tcp_select_mask[sd->socket_ntotal]=_getsockhandle(i);
|
||||
sd->tcp_emx_handles[sd->socket_ntotal]=i;
|
||||
sd->socket_ntotal++; sd->socket_nread++;
|
||||
}
|
||||
else if (_files[i] & F_PIPE)
|
||||
{
|
||||
sd -> pipe_ntotal++;
|
||||
rc = DosSetNPipeSem((HPIPE)i, (HSEM) hPipeSem, i);
|
||||
if(rc) { fprintf(stderr,"Error SETNPIPE rc = %d\n",rc); return -1;}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sd->have_write)
|
||||
{
|
||||
for (i = 0; i < sd->max_fds; ++i) {
|
||||
if (FD_ISSET (i, &sd->write_copy)){
|
||||
if(_files[i] & F_SOCKET)
|
||||
{
|
||||
sd->tcp_select_mask[sd->socket_ntotal]=_getsockhandle(i);
|
||||
sd->tcp_emx_handles[sd->socket_ntotal]=i;
|
||||
sd->socket_ntotal++; sd->socket_nwrite++;
|
||||
}
|
||||
else if (_files[i] & F_PIPE)
|
||||
{
|
||||
sd -> pipe_ntotal++;
|
||||
rc = DosSetNPipeSem((HPIPE)i, (HSEM) hPipeSem, i);
|
||||
if(rc) { fprintf(stderr,"Error SETNPIPE rc = %d\n",rc); return -1;}
|
||||
sd -> pipe_have_write=TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(sd->socket_ntotal);
|
||||
}
|
||||
|
||||
|
||||
int os2_check_sockets(sd,readfds,writefds)
|
||||
struct select_data *sd;
|
||||
fd_set *readfds,*writefds;
|
||||
{
|
||||
int e,i;
|
||||
int j,n;
|
||||
memcpy(sd->tcp_select_copy,sd->tcp_select_mask,
|
||||
sd->socket_ntotal*sizeof(int));
|
||||
|
||||
e = os2_tcp_select(sd->tcp_select_copy,sd->socket_nread,
|
||||
sd->socket_nwrite, 0, 0);
|
||||
|
||||
if(e == 0) return(e);
|
||||
/* We have something ready? */
|
||||
if(e>0){
|
||||
j = 0; n = 0;
|
||||
for (i = 0; i < sd->socket_nread; ++i, ++j)
|
||||
if (sd->tcp_select_copy[j] != -1)
|
||||
{
|
||||
FD_SET (sd->tcp_emx_handles[j], readfds);
|
||||
n ++;
|
||||
}
|
||||
for (i = 0; i < sd->socket_nwrite; ++i, ++j)
|
||||
if (sd->tcp_select_copy[j] != -1)
|
||||
{
|
||||
FD_SET (sd->tcp_emx_handles[j], writefds);
|
||||
n ++;
|
||||
}
|
||||
errno = 0;
|
||||
|
||||
return n;
|
||||
}
|
||||
if(e<0){
|
||||
/*Error -- TODO */
|
||||
fprintf(stderr,"Error in server select! e=%d\n",e);
|
||||
errno = EBADF;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check to see if anything is ready on pipes */
|
||||
|
||||
int os2_check_pipes(sd,readfds,writefds)
|
||||
struct select_data *sd;
|
||||
fd_set *readfds,*writefds;
|
||||
{
|
||||
int i,e;
|
||||
ULONG ulPostCount;
|
||||
PIPESEMSTATE pipeSemState[128];
|
||||
APIRET rc;
|
||||
e = 0;
|
||||
rc = DosResetEventSem(hPipeSem,&ulPostCount);
|
||||
rc = DosQueryNPipeSemState((HSEM) hPipeSem, (PPIPESEMSTATE)&pipeSemState,
|
||||
sizeof(pipeSemState));
|
||||
if(rc) fprintf(stderr,"SELECT: rc from QueryNPipeSem: %d\n",rc);
|
||||
i=0;
|
||||
while (pipeSemState[i].fStatus != 0) {
|
||||
/*fprintf(stderr,"SELECT: sem entry, stat=%d, flag=%d, key=%d,avail=%d\n",
|
||||
pipeSemState[i].fStatus,pipeSemState[i].fFlag,pipeSemState[i].usKey,
|
||||
pipeSemState[i].usAvail); */
|
||||
if((pipeSemState[i].fStatus == 1) &&
|
||||
(FD_ISSET(pipeSemState[i].usKey,&sd->read_copy))){
|
||||
FD_SET(pipeSemState[i].usKey,readfds);
|
||||
e++;
|
||||
}
|
||||
else if((pipeSemState[i].fStatus == 2) &&
|
||||
(FD_ISSET(pipeSemState[i].usKey,&sd->write_copy))){
|
||||
FD_SET(pipeSemState[i].usKey,writefds);
|
||||
e++;
|
||||
}
|
||||
else if( (pipeSemState[i].fStatus == 3) &&
|
||||
( (FD_ISSET(pipeSemState[i].usKey,&sd->read_copy)) ||
|
||||
(FD_ISSET(pipeSemState[i].usKey,&sd->write_copy)) )){
|
||||
errno = EBADF;
|
||||
return (-1);
|
||||
}
|
||||
i++;
|
||||
} /* endwhile */
|
||||
/*fprintf(stderr,"Done listing pipe sem entries, total %d entries, total ready entries %d\n",i,e);*/
|
||||
errno = 0;
|
||||
return(e);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Add table
Reference in a new issue