touched up code a little
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: pio.c 242 2009-07-23 13:01:52Z hyunghwan.chung $ | ||||
|  * $Id: pio.c 244 2009-07-24 12:22:00Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -35,8 +35,7 @@ static qse_ssize_t pio_input (int cmd, void* arg, void* buf, qse_size_t size); | ||||
| static qse_ssize_t pio_output (int cmd, void* arg, void* buf, qse_size_t size); | ||||
|  | ||||
| qse_pio_t* qse_pio_open ( | ||||
| 	qse_mmgr_t* mmgr, qse_size_t ext, | ||||
| 	const qse_char_t* path, int flags) | ||||
| 	qse_mmgr_t* mmgr, qse_size_t ext, const qse_char_t* path, int oflags) | ||||
| { | ||||
| 	qse_pio_t* pio; | ||||
|  | ||||
| @ -53,7 +52,7 @@ qse_pio_t* qse_pio_open ( | ||||
| 	pio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_pio_t) + ext); | ||||
| 	if (pio == QSE_NULL) return QSE_NULL; | ||||
|  | ||||
| 	if (qse_pio_init (pio, mmgr, path, flags) == QSE_NULL) | ||||
| 	if (qse_pio_init (pio, mmgr, path, oflags) == QSE_NULL) | ||||
| 	{ | ||||
| 		QSE_MMGR_FREE (mmgr, pio); | ||||
| 		return QSE_NULL; | ||||
| @ -69,7 +68,7 @@ void qse_pio_close (qse_pio_t* pio) | ||||
| } | ||||
|  | ||||
| qse_pio_t* qse_pio_init ( | ||||
| 	qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd, int flags) | ||||
| 	qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd, int oflags) | ||||
| { | ||||
|  | ||||
| 	qse_pio_hnd_t handle[6] =  | ||||
| @ -112,7 +111,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 	secattr.bInheritHandle = TRUE; | ||||
| 	secattr.lpSecurityDescriptor = QSE_NULL; | ||||
|  | ||||
| 	if (flags & QSE_PIO_WRITEIN) | ||||
| 	if (oflags & QSE_PIO_WRITEIN) | ||||
| 	{ | ||||
| 		/* child reads, parent writes */ | ||||
| 		if (CreatePipe ( | ||||
| @ -126,7 +125,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		minidx = 0; maxidx = 1; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READOUT) | ||||
| 	if (oflags & QSE_PIO_READOUT) | ||||
| 	{ | ||||
| 		/* child writes, parent reads */ | ||||
| 		if (CreatePipe ( | ||||
| @ -141,7 +140,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		maxidx = 3; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READERR) | ||||
| 	if (oflags & QSE_PIO_READERR) | ||||
| 	{ | ||||
| 		/* child writes, parent reads */ | ||||
| 		if (CreatePipe ( | ||||
| @ -156,9 +155,9 @@ qse_pio_t* qse_pio_init ( | ||||
| 		maxidx = 5; | ||||
| 	} | ||||
|  | ||||
| 	if ((flags & QSE_PIO_INTONUL) ||  | ||||
| 	    (flags & QSE_PIO_OUTTONUL) || | ||||
| 	    (flags & QSE_PIO_ERRTONUL)) | ||||
| 	if ((oflags & QSE_PIO_INTONUL) ||  | ||||
| 	    (oflags & QSE_PIO_OUTTONUL) || | ||||
| 	    (oflags & QSE_PIO_ERRTONUL)) | ||||
| 	{ | ||||
| 		windevnul = CreateFile( | ||||
| 			QSE_T("NUL"), GENERIC_READ | GENERIC_WRITE, | ||||
| @ -177,34 +176,34 @@ qse_pio_t* qse_pio_init ( | ||||
| 	startup.hStdOutput = INVALID_HANDLE_VALUE; | ||||
| 	startup.hStdOutput = INVALID_HANDLE_VALUE; | ||||
|  | ||||
| 	if (flags & QSE_PIO_WRITEIN) startup.hStdInput = handle[0]; | ||||
| 	if (oflags & QSE_PIO_WRITEIN) startup.hStdInput = handle[0]; | ||||
|  | ||||
| 	if (flags & QSE_PIO_READOUT) | ||||
| 	if (oflags & QSE_PIO_READOUT) | ||||
| 	{ | ||||
| 		startup.hStdOutput = handle[3]; | ||||
| 		if (flags & QSE_PIO_ERRTOOUT) startup.hStdError = handle[3]; | ||||
| 		if (oflags & QSE_PIO_ERRTOOUT) startup.hStdError = handle[3]; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READERR) | ||||
| 	if (oflags & QSE_PIO_READERR) | ||||
| 	{ | ||||
| 		startup.hStdError = handle[5]; | ||||
| 		if (flags & QSE_PIO_OUTTOERR) startup.hStdOutput = handle[5]; | ||||
| 		if (oflags & QSE_PIO_OUTTOERR) startup.hStdOutput = handle[5]; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_INTONUL) startup.hStdOutput = windevnul; | ||||
| 	if (flags & QSE_PIO_OUTTONUL) startup.hStdOutput = windevnul; | ||||
| 	if (flags & QSE_PIO_ERRTONUL) startup.hStdError = windevnul; | ||||
| 	if (oflags & QSE_PIO_INTONUL) startup.hStdOutput = windevnul; | ||||
| 	if (oflags & QSE_PIO_OUTTONUL) startup.hStdOutput = windevnul; | ||||
| 	if (oflags & QSE_PIO_ERRTONUL) startup.hStdError = windevnul; | ||||
|  | ||||
| 	if (flags & QSE_PIO_DROPIN) startup.hStdInput = INVALID_HANDLE_VALUE; | ||||
| 	if (flags & QSE_PIO_DROPOUT) startup.hStdOutput = INVALID_HANDLE_VALUE; | ||||
| 	if (flags & QSE_PIO_DROPERR) startup.hStdError = INVALID_HANDLE_VALUE; | ||||
| 	if (oflags & QSE_PIO_DROPIN) startup.hStdInput = INVALID_HANDLE_VALUE; | ||||
| 	if (oflags & QSE_PIO_DROPOUT) startup.hStdOutput = INVALID_HANDLE_VALUE; | ||||
| 	if (oflags & QSE_PIO_DROPERR) startup.hStdError = INVALID_HANDLE_VALUE; | ||||
|  | ||||
| 	startup.dwFlags |= STARTF_USESTDHANDLES; | ||||
|  | ||||
| 	/* there is nothing to do for QSE_PIO_SHELL as CreateProcess | ||||
| 	 * takes the entire command line */ | ||||
|  | ||||
| 	if (flags & QSE_PIO_SHELL)  | ||||
| 	if (oflags & QSE_PIO_SHELL)  | ||||
| 	{ | ||||
| 		dup = QSE_MMGR_ALLOC ( | ||||
| 			mmgr, (11+qse_strlen(cmd)+1 )*QSE_SIZEOF(qse_char_t)); | ||||
| @ -237,17 +236,17 @@ qse_pio_t* qse_pio_init ( | ||||
|  | ||||
| 	if (x == FALSE) goto oops; | ||||
|  | ||||
| 	if (flags & QSE_PIO_WRITEIN) | ||||
| 	if (oflags & QSE_PIO_WRITEIN) | ||||
| 	{ | ||||
| 		CloseHandle (handle[0]); | ||||
| 		handle[0] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
| 	if (flags & QSE_PIO_READOUT) | ||||
| 	if (oflags & QSE_PIO_READOUT) | ||||
| 	{ | ||||
| 		CloseHandle (handle[3]); | ||||
| 		handle[3] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
| 	if (flags & QSE_PIO_READERR) | ||||
| 	if (oflags & QSE_PIO_READERR) | ||||
| 	{ | ||||
| 		CloseHandle (handle[5]); | ||||
| 		handle[5] = QSE_PIO_HND_NIL; | ||||
| @ -257,22 +256,22 @@ qse_pio_t* qse_pio_init ( | ||||
| 	pio->child = procinfo.hProcess; | ||||
| #else | ||||
|  | ||||
| 	if (flags & QSE_PIO_WRITEIN) | ||||
| 	if (oflags & QSE_PIO_WRITEIN) | ||||
| 	{ | ||||
| 		if (QSE_PIPE(&handle[0]) == -1) goto oops; | ||||
| 		if (QSE_PIPE(&handle[0]) <= -1) goto oops; | ||||
| 		minidx = 0; maxidx = 1; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READOUT) | ||||
| 	if (oflags & QSE_PIO_READOUT) | ||||
| 	{ | ||||
| 		if (QSE_PIPE(&handle[2]) == -1) goto oops; | ||||
| 		if (QSE_PIPE(&handle[2]) <= -1) goto oops; | ||||
| 		if (minidx == -1) minidx = 2; | ||||
| 		maxidx = 3; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READERR) | ||||
| 	if (oflags & QSE_PIO_READERR) | ||||
| 	{ | ||||
| 		if (QSE_PIPE(&handle[4]) == -1) goto oops; | ||||
| 		if (QSE_PIPE(&handle[4]) <= -1) goto oops; | ||||
| 		if (minidx == -1) minidx = 4; | ||||
| 		maxidx = 5; | ||||
| 	} | ||||
| @ -280,7 +279,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 	if (maxidx == -1) goto oops; | ||||
|  | ||||
| 	pid = QSE_FORK(); | ||||
| 	if (pid == -1) goto oops; | ||||
| 	if (pid <= -1) goto oops; | ||||
|  | ||||
| 	if (pid == 0) | ||||
| 	{ | ||||
| @ -302,7 +301,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		struct rlimit rlim; | ||||
| 		int fd; | ||||
|  | ||||
| 		if (QSE_GETRLIMIT (RLIMIT_NOFILE, &rlim) == -1 || | ||||
| 		if (QSE_GETRLIMIT (RLIMIT_NOFILE, &rlim) <= -1 || | ||||
| 		    rlim.rlim_max == RLIM_INFINITY)  | ||||
| 		{ | ||||
| 		#ifdef HAVE_SYSCONF | ||||
| @ -323,77 +322,77 @@ qse_pio_t* qse_pio_init ( | ||||
| 			    fd != handle[5]) QSE_CLOSE (fd); | ||||
| 		} | ||||
|  | ||||
| 		if (flags & QSE_PIO_WRITEIN) | ||||
| 		if (oflags & QSE_PIO_WRITEIN) | ||||
| 		{ | ||||
| 			/* child should read */ | ||||
| 			QSE_CLOSE (handle[1]); | ||||
| 			handle[1] = QSE_PIO_HND_NIL; | ||||
| 			if (QSE_DUP2 (handle[0], 0) == -1) goto child_oops; | ||||
| 			if (QSE_DUP2 (handle[0], 0) <= -1) goto child_oops; | ||||
| 			QSE_CLOSE (handle[0]); | ||||
| 			handle[0] = QSE_PIO_HND_NIL; | ||||
| 		} | ||||
|  | ||||
| 		if (flags & QSE_PIO_READOUT) | ||||
| 		if (oflags & QSE_PIO_READOUT) | ||||
| 		{ | ||||
| 			/* child should write */ | ||||
| 			QSE_CLOSE (handle[2]); | ||||
| 			handle[2] = QSE_PIO_HND_NIL; | ||||
| 			if (QSE_DUP2 (handle[3], 1) == -1) goto child_oops; | ||||
| 			if (QSE_DUP2 (handle[3], 1) <= -1) goto child_oops; | ||||
|  | ||||
| 			if (flags & QSE_PIO_ERRTOOUT) | ||||
| 			if (oflags & QSE_PIO_ERRTOOUT) | ||||
| 			{ | ||||
| 				if (QSE_DUP2 (handle[3], 2) == -1) goto child_oops; | ||||
| 				if (QSE_DUP2 (handle[3], 2) <= -1) goto child_oops; | ||||
| 			} | ||||
|  | ||||
| 			QSE_CLOSE (handle[3]);  | ||||
| 			handle[3] = QSE_PIO_HND_NIL; | ||||
| 		} | ||||
|  | ||||
| 		if (flags & QSE_PIO_READERR) | ||||
| 		if (oflags & QSE_PIO_READERR) | ||||
| 		{ | ||||
| 			/* child should write */ | ||||
| 			QSE_CLOSE (handle[4]);  | ||||
| 			handle[4] = QSE_PIO_HND_NIL; | ||||
| 			if (QSE_DUP2 (handle[5], 2) == -1) goto child_oops; | ||||
| 			if (QSE_DUP2 (handle[5], 2) <= -1) goto child_oops; | ||||
|  | ||||
| 			if (flags & QSE_PIO_OUTTOERR) | ||||
| 			if (oflags & QSE_PIO_OUTTOERR) | ||||
| 			{ | ||||
| 				if (QSE_DUP2 (handle[5], 1) == -1) goto child_oops; | ||||
| 				if (QSE_DUP2 (handle[5], 1) <= -1) goto child_oops; | ||||
| 			} | ||||
|  | ||||
| 			QSE_CLOSE (handle[5]); | ||||
| 			handle[5] = QSE_PIO_HND_NIL; | ||||
| 		} | ||||
|  | ||||
| 		if ((flags & QSE_PIO_INTONUL) ||  | ||||
| 		    (flags & QSE_PIO_OUTTONUL) || | ||||
| 		    (flags & QSE_PIO_ERRTONUL)) | ||||
| 		if ((oflags & QSE_PIO_INTONUL) ||  | ||||
| 		    (oflags & QSE_PIO_OUTTONUL) || | ||||
| 		    (oflags & QSE_PIO_ERRTONUL)) | ||||
| 		{ | ||||
| 		#ifdef O_LARGEFILE | ||||
| 			devnull = QSE_OPEN ("/dev/null", O_RDWR|O_LARGEFILE, 0); | ||||
| 		#else | ||||
| 			devnull = QSE_OPEN ("/dev/null", O_RDWR, 0); | ||||
| 		#endif | ||||
| 			if (devnull == -1) goto child_oops; | ||||
| 			if (devnull <= -1) goto child_oops; | ||||
| 		} | ||||
|  | ||||
| 		if ((flags & QSE_PIO_INTONUL)  && | ||||
| 		    QSE_DUP2(devnull,0) == -1) goto child_oops; | ||||
| 		if ((flags & QSE_PIO_OUTTONUL) && | ||||
| 		    QSE_DUP2(devnull,1) == -1) goto child_oops; | ||||
| 		if ((flags & QSE_PIO_ERRTONUL) && | ||||
| 		    QSE_DUP2(devnull,2) == -1) goto child_oops; | ||||
| 		if ((oflags & QSE_PIO_INTONUL)  && | ||||
| 		    QSE_DUP2(devnull,0) <= -1) goto child_oops; | ||||
| 		if ((oflags & QSE_PIO_OUTTONUL) && | ||||
| 		    QSE_DUP2(devnull,1) <= -1) goto child_oops; | ||||
| 		if ((oflags & QSE_PIO_ERRTONUL) && | ||||
| 		    QSE_DUP2(devnull,2) <= -1) goto child_oops; | ||||
|  | ||||
| 		if ((flags & QSE_PIO_INTONUL) ||  | ||||
| 		    (flags & QSE_PIO_OUTTONUL) || | ||||
| 		    (flags & QSE_PIO_ERRTONUL)) QSE_CLOSE (devnull); | ||||
| 		if ((oflags & QSE_PIO_INTONUL) ||  | ||||
| 		    (oflags & QSE_PIO_OUTTONUL) || | ||||
| 		    (oflags & QSE_PIO_ERRTONUL)) QSE_CLOSE (devnull); | ||||
|  | ||||
| 		if (flags & QSE_PIO_DROPIN) QSE_CLOSE(0); | ||||
| 		if (flags & QSE_PIO_DROPOUT) QSE_CLOSE(1); | ||||
| 		if (flags & QSE_PIO_DROPERR) QSE_CLOSE(2); | ||||
| 		if (oflags & QSE_PIO_DROPIN) QSE_CLOSE(0); | ||||
| 		if (oflags & QSE_PIO_DROPOUT) QSE_CLOSE(1); | ||||
| 		if (oflags & QSE_PIO_DROPERR) QSE_CLOSE(2); | ||||
|  | ||||
| 	#ifdef QSE_CHAR_IS_MCHAR | ||||
| 		if (flags & QSE_PIO_SHELL) mcmd = (qse_char_t*)cmd; | ||||
| 		if (oflags & QSE_PIO_SHELL) mcmd = (qse_char_t*)cmd; | ||||
| 		else | ||||
| 		{ | ||||
| 			mcmd =  qse_strdup (cmd, pio->mmgr); | ||||
| @ -408,7 +407,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 			} | ||||
| 		} | ||||
| 	#else	 | ||||
| 		if (flags & QSE_PIO_SHELL) | ||||
| 		if (oflags & QSE_PIO_SHELL) | ||||
| 		{ | ||||
|        			n = qse_wcstombslen (cmd, &mn); | ||||
| 			if (cmd[n] != QSE_WT('\0'))  | ||||
| @ -453,7 +452,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 			if (mcmd == QSE_NULL) goto child_oops; | ||||
| 		} | ||||
|  | ||||
| 		if (flags & QSE_PIO_SHELL) | ||||
| 		if (oflags & QSE_PIO_SHELL) | ||||
| 		{ | ||||
| 			/* qse_wcstombs() should succeed as  | ||||
| 			 * qse_wcstombslen() was successful above */ | ||||
| @ -471,7 +470,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		} | ||||
| 	#endif | ||||
|  | ||||
| 		if (flags & QSE_PIO_SHELL) | ||||
| 		if (oflags & QSE_PIO_SHELL) | ||||
| 		{ | ||||
| 			const qse_mchar_t* argv[4]; | ||||
|  | ||||
| @ -508,7 +507,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 	/* parent */ | ||||
| 	pio->child = pid; | ||||
|  | ||||
| 	if (flags & QSE_PIO_WRITEIN) | ||||
| 	if (oflags & QSE_PIO_WRITEIN) | ||||
| 	{ | ||||
| 		/*  | ||||
| 		 * 012345 | ||||
| @ -519,7 +518,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		QSE_CLOSE (handle[0]); handle[0] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READOUT) | ||||
| 	if (oflags & QSE_PIO_READOUT) | ||||
| 	{ | ||||
| 		/*  | ||||
| 		 * 012345 | ||||
| @ -530,7 +529,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 		QSE_CLOSE (handle[3]); handle[3] = QSE_PIO_HND_NIL; | ||||
| 	} | ||||
|  | ||||
| 	if (flags & QSE_PIO_READERR) | ||||
| 	if (oflags & QSE_PIO_READERR) | ||||
| 	{ | ||||
| 		/*  | ||||
| 		 * 012345 | ||||
| @ -553,7 +552,7 @@ qse_pio_t* qse_pio_init ( | ||||
| 	pio->pin[QSE_PIO_OUT].handle = handle[2]; | ||||
| 	pio->pin[QSE_PIO_ERR].handle = handle[4]; | ||||
|  | ||||
| 	if (flags & QSE_PIO_TEXT) | ||||
| 	if (oflags & QSE_PIO_TEXT) | ||||
| 	{ | ||||
| 		for (i = 0; i < QSE_COUNTOF(tio); i++) | ||||
| 		{ | ||||
| @ -566,13 +565,13 @@ qse_pio_t* qse_pio_init ( | ||||
| 				qse_tio_attachout (tio[i], pio_output, &pio->pin[i]): | ||||
| 				qse_tio_attachin (tio[i], pio_input, &pio->pin[i]); | ||||
|  | ||||
| 			if (r == -1) goto oops; | ||||
| 			if (r <= -1) goto oops; | ||||
|  | ||||
| 			pio->pin[i].tio = tio[i]; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	pio->flags = 0; | ||||
| 	pio->option = 0; | ||||
| 	return pio; | ||||
|  | ||||
| oops: | ||||
| @ -599,26 +598,19 @@ void qse_pio_fini (qse_pio_t* pio) | ||||
| 	qse_pio_end (pio, QSE_PIO_OUT); | ||||
| 	qse_pio_end (pio, QSE_PIO_IN); | ||||
|  | ||||
| 	qse_pio_setflags (pio, QSE_PIO_WAIT_NOBLOCK|QSE_PIO_WAIT_NORETRY, -1); | ||||
| 	pio->option &= ~QSE_PIO_WAIT_NOBLOCK; | ||||
| 	pio->option &= ~QSE_PIO_WAIT_NORETRY; | ||||
| 	qse_pio_wait (pio); | ||||
| } | ||||
|  | ||||
| int qse_pio_getflags (qse_pio_t* pio) | ||||
| int qse_pio_getoption (qse_pio_t* pio) | ||||
| { | ||||
| 	return pio->flags; | ||||
| 	return pio->option; | ||||
| } | ||||
|  | ||||
| void qse_pio_setflags (qse_pio_t* pio, int flags, int op) | ||||
| void qse_pio_setoption (qse_pio_t* pio, int opt) | ||||
| { | ||||
| 	/* | ||||
| 	op => set | ||||
| 	op => off | ||||
| 	op => on | ||||
| 	*/ | ||||
|  | ||||
| 	if (op == 0) pio->flags = flags; | ||||
| 	else if (op > 0) pio->flags |= flags; | ||||
| 	else /*if (op < 0)*/ pio->flags &= ~flags; | ||||
| 	pio->option = opt; | ||||
| } | ||||
|  | ||||
| qse_pio_errnum_t qse_pio_geterrnum (qse_pio_t* pio) | ||||
| @ -626,8 +618,6 @@ qse_pio_errnum_t qse_pio_geterrnum (qse_pio_t* pio) | ||||
| 	return pio->errnum; | ||||
| } | ||||
|  | ||||
| /* TODO: qse_pio_geterrmsg (qse_pio_t* pio) */ | ||||
|  | ||||
| const qse_char_t* qse_pio_geterrmsg (qse_pio_t* pio) | ||||
| { | ||||
| 	static const qse_char_t* __errstr[] = | ||||
| @ -694,7 +684,7 @@ reread: | ||||
| 	{ | ||||
| 		if (errno == EINTR) | ||||
| 		{ | ||||
| 			if (pio->flags & QSE_PIO_READ_NORETRY)  | ||||
| 			if (pio->option & QSE_PIO_READ_NORETRY)  | ||||
| 				pio->errnum = QSE_PIO_EINTR; | ||||
| 			else goto reread; | ||||
| 		} | ||||
| @ -755,7 +745,7 @@ rewrite: | ||||
| 	{ | ||||
| 		if (errno == EINTR) | ||||
| 		{ | ||||
| 			if (pio->flags & QSE_PIO_WRITE_NORETRY) | ||||
| 			if (pio->option & QSE_PIO_WRITE_NORETRY) | ||||
| 				pio->errnum = QSE_PIO_EINTR; | ||||
| 			else goto rewrite; | ||||
| 		} | ||||
| @ -820,7 +810,7 @@ int qse_pio_wait (qse_pio_t* pio) | ||||
| 	} | ||||
|  | ||||
| 	w = WaitForSingleObject (pio->child,  | ||||
| 		((pio->flags & QSE_PIO_WAIT_NOBLOCK)? 0: INFINITE) | ||||
| 		((pio->option & QSE_PIO_WAIT_NOBLOCK)? 0: INFINITE) | ||||
| 	); | ||||
| 	if (w == WAIT_TIMEOUT) | ||||
| 	{ | ||||
| @ -871,14 +861,14 @@ int qse_pio_wait (qse_pio_t* pio) | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (pio->flags & QSE_PIO_WAIT_NOBLOCK) opt |= WNOHANG; | ||||
| 	if (pio->option & QSE_PIO_WAIT_NOBLOCK) opt |= WNOHANG; | ||||
|  | ||||
| 	while (1) | ||||
| 	{ | ||||
| 		int status, n; | ||||
|  | ||||
| 		n = QSE_WAITPID (pio->child, &status, opt); | ||||
| 		if (n == -1) | ||||
| 		if (n <= -1) | ||||
| 		{ | ||||
| 			if (errno == ECHILD) | ||||
| 			{ | ||||
| @ -889,7 +879,7 @@ int qse_pio_wait (qse_pio_t* pio) | ||||
| 			} | ||||
| 			else if (errno == EINTR) | ||||
| 			{ | ||||
| 				if (pio->flags & QSE_PIO_WAIT_NORETRY)  | ||||
| 				if (pio->option & QSE_PIO_WAIT_NORETRY)  | ||||
| 					pio->errnum = QSE_PIO_EINTR; | ||||
| 				else continue; | ||||
| 			} | ||||
| @ -901,7 +891,7 @@ int qse_pio_wait (qse_pio_t* pio) | ||||
| 		if (n == 0)  | ||||
| 		{ | ||||
| 			/* when WNOHANG is not specified, 0 can't be returned */ | ||||
| 			QSE_ASSERT (pio->flags & QSE_PIO_WAIT_NOBLOCK); | ||||
| 			QSE_ASSERT (pio->option & QSE_PIO_WAIT_NOBLOCK); | ||||
|  | ||||
| 			ret = 255 + 1; | ||||
| 			/* the child process is still alive */ | ||||
| @ -963,7 +953,7 @@ int qse_pio_kill (qse_pio_t* pio) | ||||
| 	return 0; | ||||
| #else | ||||
| 	n = QSE_KILL (pio->child, SIGKILL); | ||||
| 	if (n == -1) pio->errnum = QSE_PIO_ESUBSYS; | ||||
| 	if (n <= -1) pio->errnum = QSE_PIO_ESUBSYS; | ||||
| 	return n; | ||||
| #endif | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user