| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	 YAP Prolog 							 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *	Yap Prolog was developed at NCCUP - Universidade do Porto	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | ************************************************************************** | 
					
						
							|  |  |  | *									 * | 
					
						
							| 
									
										
										
										
											2004-01-26 12:51:33 +00:00
										 |  |  | * $Id: sys.c,v 1.18 2004-01-26 12:51:33 vsc Exp $									 * | 
					
						
							| 
									
										
										
										
											2003-01-27 15:55:40 +00:00
										 |  |  | * mods:		$Log: not supported by cvs2svn $ | 
					
						
							| 
									
										
										
										
											2004-01-26 12:51:33 +00:00
										 |  |  | * mods:		Revision 1.17  2004/01/26 12:41:06  vsc | 
					
						
							|  |  |  | * mods:		bug fixes | 
					
						
							|  |  |  | * mods:		 | 
					
						
							| 
									
										
										
										
											2004-01-26 12:41:06 +00:00
										 |  |  | * mods:		Revision 1.16  2003/01/27 15:55:40  vsc | 
					
						
							|  |  |  | * mods:		use CVS Id | 
					
						
							|  |  |  | * mods:		 | 
					
						
							| 
									
										
										
										
											2003-01-27 15:55:40 +00:00
										 |  |  | * mods:		Revision 1.15  2003/01/27 15:54:10  vsc | 
					
						
							|  |  |  | * mods:		fix header | 
					
						
							|  |  |  | * mods:									 * | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | * comments:	regular expression interpreter                           * | 
					
						
							|  |  |  | *									 * | 
					
						
							|  |  |  | *************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "config.h"
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | #include "YapInterface.h"
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #if STDC_HEADERS
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_UNISTD_H
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #if HAVE_TIME_H
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SYS_TYPES_H
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SYS_STAT_H
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_FCNTL_H
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_UNISTD_H
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_ERRNO_H
 | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_STRING_H
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SIGNAL_H
 | 
					
						
							|  |  |  | #include <signal.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SYS_WAIT_H
 | 
					
						
							|  |  |  | #include <sys/wait.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_DIRENT_H
 | 
					
						
							|  |  |  | #include <dirent.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if HAVE_DIRECT_H
 | 
					
						
							|  |  |  | #include <direct.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  | #include <windows.h>
 | 
					
						
							|  |  |  | #include <process.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #ifdef __MINGW32__
 | 
					
						
							|  |  |  | #ifdef HAVE_ENVIRON
 | 
					
						
							|  |  |  | #undef HAVE_ENVIRON
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PROTO(init_sys, (void)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-07 17:54:29 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | static YAP_Term | 
					
						
							| 
									
										
										
										
											2001-06-07 17:54:29 +00:00
										 |  |  | WinError(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char msg[256]; | 
					
						
							|  |  |  |   /* Error, we could not read time */ | 
					
						
							|  |  |  |     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, | 
					
						
							|  |  |  | 		  NULL, GetLastError(),  | 
					
						
							|  |  |  | 		  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), msg, 256, | 
					
						
							|  |  |  | 		  NULL); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_MkAtomTerm(YAP_LookupAtom(msg))); | 
					
						
							| 
									
										
										
										
											2001-06-07 17:54:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | /* Return time in a structure */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | datime(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Term tf, out[6]; | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   SYSTEMTIME stime; | 
					
						
							|  |  |  |   GetLocalTime(&stime); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   out[0] = YAP_MkIntTerm(stime.wYear); | 
					
						
							|  |  |  |   out[1] = YAP_MkIntTerm(stime.wMonth); | 
					
						
							|  |  |  |   out[2] = YAP_MkIntTerm(stime.wDay); | 
					
						
							|  |  |  |   out[3] = YAP_MkIntTerm(stime.wHour); | 
					
						
							|  |  |  |   out[4] = YAP_MkIntTerm(stime.wMinute); | 
					
						
							|  |  |  |   out[5] = YAP_MkIntTerm(stime.wSecond); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #elif HAVE_TIME
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   time_t  tp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ((tp = time(NULL)) == -1) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |      return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(errno)));     | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #ifdef HAVE_LOCALTIME
 | 
					
						
							|  |  |  |  { | 
					
						
							|  |  |  |    struct tm *loc = localtime(&tp); | 
					
						
							|  |  |  |    if (loc == NULL) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |      return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(errno)));     | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |    out[0] = YAP_MkIntTerm(1900+loc->tm_year); | 
					
						
							|  |  |  |    out[1] = YAP_MkIntTerm(1+loc->tm_mon); | 
					
						
							|  |  |  |    out[2] = YAP_MkIntTerm(loc->tm_mday); | 
					
						
							|  |  |  |    out[3] = YAP_MkIntTerm(loc->tm_hour); | 
					
						
							|  |  |  |    out[4] = YAP_MkIntTerm(loc->tm_min); | 
					
						
							|  |  |  |    out[5] = YAP_MkIntTerm(loc->tm_sec); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |  } | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   oops | 
					
						
							|  |  |  | #endif /* HAVE_LOCALTIME */
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   oops | 
					
						
							|  |  |  | #endif /* HAVE_TIME */
 | 
					
						
							| 
									
										
										
										
											2004-01-26 12:51:33 +00:00
										 |  |  |   tf = YAP_MkApplTerm(YAP_MkFunctor(YAP_LookupAtom("datime"),6), 6, out); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1, tf)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BUF_SIZE 1024
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Return a list of files for a directory */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | list_directory(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Term tf = YAP_MkAtomTerm(YAP_LookupAtom("[]")); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *buf = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   struct _finddata_t c_file; | 
					
						
							|  |  |  |   char bs[BUF_SIZE]; | 
					
						
							|  |  |  |   long hFile; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bs[0] = '\0'; | 
					
						
							|  |  |  | #if HAVE_STRNCPY
 | 
					
						
							|  |  |  |   strncpy(bs, buf, BUF_SIZE); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   strcpy(bs, buf); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_STRNCAT
 | 
					
						
							|  |  |  |   strncat(bs, "/*", BUF_SIZE); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   strncat(bs, "/*"); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   if ((hFile = _findfirst(bs, &c_file)) == -1L) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG2,tf)); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   tf = YAP_MkPairTerm(YAP_MkAtomTerm(YAP_LookupAtom(c_file.name)), tf); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   while (_findnext( hFile, &c_file) == 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     YAP_Term ti = YAP_MkAtomTerm(YAP_LookupAtom(c_file.name)); | 
					
						
							|  |  |  |     tf = YAP_MkPairTerm(ti, tf); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   _findclose( hFile ); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #if HAVE_OPENDIR
 | 
					
						
							|  |  |  |  { | 
					
						
							|  |  |  |    DIR *de; | 
					
						
							|  |  |  |    struct dirent *dp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    if ((de = opendir(buf)) == NULL) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |      return(YAP_Unify(YAP_ARG3, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |    } | 
					
						
							|  |  |  |    while ((dp = readdir(de))) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |      YAP_Term ti = YAP_MkAtomTerm(YAP_LookupAtom(dp->d_name)); | 
					
						
							|  |  |  |      tf = YAP_MkPairTerm(ti, tf); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |    } | 
					
						
							|  |  |  |    closedir(de); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  | #endif /* HAVE_OPENDIR */
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG2, tf)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_unlink(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *fd = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   if (_unlink(fd) == -1) | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   if (unlink(fd) == -1) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_mkdir(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *fd = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   if (_mkdir(fd) == -1) { | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if (mkdir(fd, 0777) == -1) { | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_rmdir(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *fd = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   if (_rmdir(fd) == -1) { | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if (rmdir(fd) == -1) { | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | rename_file(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *s1 = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							|  |  |  |   char *s2 = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #if HAVE_RENAME
 | 
					
						
							|  |  |  |   if (rename(s1, s2) == -1) { | 
					
						
							|  |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | dir_separator(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1,YAP_MkAtomTerm(YAP_LookupAtom("/")))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | file_property(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char *fd; | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if HAVE_LSTAT 
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   struct stat buf; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   fd = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if (lstat(fd, &buf) == -1) { | 
					
						
							|  |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG7, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |   if (S_ISREG(buf.st_mode)) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!(YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("regular"))) && | 
					
						
							|  |  |  | 	  YAP_Unify(YAP_ARG6, YAP_MkIntTerm(0)))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } else if (S_ISDIR(buf.st_mode)) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!(YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("directory"))) && | 
					
						
							|  |  |  | 	  YAP_Unify(YAP_ARG6, YAP_MkIntTerm(0)))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } else if (S_ISFIFO(buf.st_mode)) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!(YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("fifo"))) && | 
					
						
							|  |  |  | 	  YAP_Unify(YAP_ARG6, YAP_MkIntTerm(0)))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } else if (S_ISLNK(buf.st_mode)) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("symlink")))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							| 
									
										
										
										
											2002-06-11 05:30:05 +00:00
										 |  |  | #if HAVE_READLINK
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       char tmp[256]; | 
					
						
							| 
									
										
										
										
											2002-06-11 05:43:01 +00:00
										 |  |  |       int n; | 
					
						
							|  |  |  |       if ((n = readlink(fd,tmp,256)) == -1) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | 	return(YAP_Unify(YAP_ARG7, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2002-06-11 05:30:05 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2002-06-11 05:43:01 +00:00
										 |  |  |       tmp[n] = '\0'; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       if(!YAP_Unify(YAP_ARG6,YAP_MkAtomTerm(YAP_LookupAtom(tmp)))) { | 
					
						
							| 
									
										
										
										
											2002-06-11 05:30:05 +00:00
										 |  |  | 	return(FALSE); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!YAP_Unify(YAP_ARG6, YAP_MkIntTerm(0))) | 
					
						
							| 
									
										
										
										
											2002-06-11 05:30:05 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  | #endif    
 | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |   } else if (S_ISSOCK(buf.st_mode)) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!(YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("socket"))) && | 
					
						
							|  |  |  | 	  YAP_Unify(YAP_ARG6, YAP_MkIntTerm(0)))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!(YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("unknown"))) && | 
					
						
							|  |  |  | 	  YAP_Unify(YAP_ARG6, YAP_MkIntTerm(0)))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #elif defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   /* for some weird reason _stat did not work with mingw32 */ | 
					
						
							| 
									
										
										
										
											2002-10-07 14:50:00 +00:00
										 |  |  |   struct _stat buf; | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   fd = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2002-10-07 14:50:00 +00:00
										 |  |  |   if (_stat(fd, &buf) != 0) { | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG7, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |   if (buf.st_mode & S_IFREG) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("regular")))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } else if (buf.st_mode & S_IFDIR) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("directory")))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (!YAP_Unify(YAP_ARG2, YAP_MkAtomTerm(YAP_LookupAtom("unknown")))) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |       return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  |   return ( | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | 	  YAP_Unify(YAP_ARG3, YAP_MkIntTerm(buf.st_size)) && | 
					
						
							|  |  |  | 	  YAP_Unify(YAP_ARG4, YAP_MkIntTerm(buf.st_mtime)) && | 
					
						
							|  |  |  | 	  YAP_Unify(YAP_ARG5, YAP_MkIntTerm(buf.st_mode)) | 
					
						
							| 
									
										
										
										
											2002-06-10 23:38:59 +00:00
										 |  |  | 	  ); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* temporary files */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_mktemp(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if HAVE_MKTEMP
 | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   char *s, tmp[BUF_SIZE]; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   s = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #if HAVE_STRNCPY
 | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   strncpy(tmp, s, BUF_SIZE); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |   strcpy(tmp, s); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   if ((s = _mktemp(tmp)) == NULL) { | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if ((s = mktemp(tmp)) == NULL) { | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG2,YAP_MkAtomTerm(YAP_LookupAtom(s)))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  |  oops | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   return(TRUE);  | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_tpmnam(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if HAVE_TMPNAM
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1,YAP_MkAtomTerm(YAP_LookupAtom(tmpnam(NULL))))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | oops | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* return YAP's environment */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_environ(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if HAVE_ENVIRON
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   extern char **_environ; | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   extern char **environ; | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Term t1 = YAP_ARG1; | 
					
						
							|  |  |  |   long int i; | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   i = YAP_IntOfTerm(t1); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   if (_environ[i] == NULL) | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if (environ[i] == NULL) | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   else { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     YAP_Term t = YAP_BufferToString(environ[i]); | 
					
						
							|  |  |  |     return(YAP_Unify(t, YAP_ARG2)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Error("environ not available in this configuration"); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   return(FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  | static HANDLE | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | get_handle(YAP_Term ti, DWORD fd) | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   if (YAP_IsAtomTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     HANDLE out; | 
					
						
							|  |  |  |     SECURITY_ATTRIBUTES satt; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     satt.nLength = sizeof(satt); | 
					
						
							|  |  |  |     satt.lpSecurityDescriptor = NULL; | 
					
						
							|  |  |  |     satt.bInheritHandle = TRUE; | 
					
						
							|  |  |  |     out = CreateFile("NUL", | 
					
						
							|  |  |  | 			    GENERIC_READ|GENERIC_WRITE, | 
					
						
							|  |  |  | 			    FILE_SHARE_READ|FILE_SHARE_WRITE, | 
					
						
							|  |  |  | 			    &satt, | 
					
						
							|  |  |  | 			    OPEN_EXISTING, | 
					
						
							|  |  |  | 			    0, | 
					
						
							|  |  |  | 			    NULL); | 
					
						
							|  |  |  |     return(out); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (YAP_IsIntTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |       return(GetStdHandle(fd)); | 
					
						
							|  |  |  |     } else | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       return((HANDLE)YAP_StreamToFileNo(ti)); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | close_handle(YAP_Term ti, HANDLE h) | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   if (YAP_IsAtomTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     CloseHandle(h); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | /* execute a command as a detached process */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | execute_command(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Term ti = YAP_ARG2, to = YAP_ARG3, te = YAP_ARG4; | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   int res; | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   HANDLE inpf, outf, errf; | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   DWORD CreationFlags = 0; | 
					
						
							|  |  |  |   STARTUPINFO StartupInfo; | 
					
						
							|  |  |  |   PROCESS_INFORMATION ProcessInformation; | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   inpf = get_handle(ti, STD_INPUT_HANDLE); | 
					
						
							|  |  |  |   if (inpf == INVALID_HANDLE_VALUE) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, WinError())); | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   outf = get_handle(to, STD_OUTPUT_HANDLE); | 
					
						
							|  |  |  |   if (outf == INVALID_HANDLE_VALUE) { | 
					
						
							|  |  |  |     close_handle(ti, inpf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, WinError())); | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   errf = get_handle(te, STD_OUTPUT_HANDLE); | 
					
						
							|  |  |  |   if (errf == INVALID_HANDLE_VALUE) { | 
					
						
							|  |  |  |     close_handle(ti, inpf); | 
					
						
							|  |  |  |     close_handle(to, outf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, WinError())); | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   if (!YAP_IsIntTerm(ti) && !YAP_IsIntTerm(to) && !YAP_IsIntTerm(te)) { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     /* we do not keep a current stream */ | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |     CreationFlags = DETACHED_PROCESS; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   StartupInfo.cb = sizeof(STARTUPINFO); | 
					
						
							|  |  |  |   StartupInfo.lpReserved = NULL; | 
					
						
							|  |  |  |   StartupInfo.lpDesktop = NULL; /* inherit */ | 
					
						
							|  |  |  |   StartupInfo.lpTitle = NULL; /* we do not create a new console window */ | 
					
						
							|  |  |  |   StartupInfo.dwFlags = STARTF_USESTDHANDLES; | 
					
						
							|  |  |  |   StartupInfo.cbReserved2 = 0; | 
					
						
							|  |  |  |   StartupInfo.lpReserved2 = NULL; | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   StartupInfo.hStdInput = inpf; | 
					
						
							|  |  |  |   StartupInfo.hStdOutput = outf; | 
					
						
							|  |  |  |   StartupInfo.hStdError = errf; | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   /* got stdin, stdout and error as I like it */ | 
					
						
							|  |  |  |   if (CreateProcess(NULL, | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | 		    YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)), | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | 		    NULL, | 
					
						
							|  |  |  | 		    NULL, | 
					
						
							|  |  |  | 		    TRUE, | 
					
						
							|  |  |  | 		    CreationFlags, | 
					
						
							|  |  |  | 		    NULL, | 
					
						
							|  |  |  | 		    NULL, | 
					
						
							|  |  |  | 		    &StartupInfo, | 
					
						
							|  |  |  | 		    &ProcessInformation) == FALSE) { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     close_handle(ti, inpf); | 
					
						
							|  |  |  |     close_handle(to, outf); | 
					
						
							|  |  |  |     close_handle(te, errf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, WinError())); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   close_handle(ti, inpf); | 
					
						
							|  |  |  |   close_handle(to, outf); | 
					
						
							|  |  |  |   close_handle(te, errf); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   res = ProcessInformation.dwProcessId; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG5,YAP_MkIntTerm(res)));   | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #else /* UNIX CODE */
 | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   int inpf, outf, errf; | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   /* process input first */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   if (YAP_IsAtomTerm(ti)) { | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     inpf = open("/dev/null", O_RDONLY); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     int sd; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (YAP_IsIntTerm(ti)) | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |       sd = 0; | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       sd = YAP_StreamToFileNo(ti); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     inpf = dup(sd); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (inpf < 0) { | 
					
						
							|  |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   /* then output stream */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   if (YAP_IsAtomTerm(to)) { | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     outf = open("/dev/zero", O_WRONLY); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     int sd; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (YAP_IsIntTerm(to)) | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |       sd = 1; | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       sd = YAP_StreamToFileNo(to); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     outf = dup(sd); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (outf < 0) { | 
					
						
							|  |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     close(inpf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   /* then error stream */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   if (YAP_IsAtomTerm(te)) { | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     errf = open("/dev/zero", O_WRONLY); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     int sd; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     if (YAP_IsIntTerm(te)) | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |       sd = 2; | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       sd = YAP_StreamToFileNo(te); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     errf = dup(sd); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (errf < 0) { | 
					
						
							|  |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |     close(inpf); | 
					
						
							|  |  |  |     close(outf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   /* we are now ready to fork */ | 
					
						
							|  |  |  |   if ((res = fork()) < 0) { | 
					
						
							|  |  |  |     /* close streams we don't need */ | 
					
						
							|  |  |  |     close(inpf); | 
					
						
							|  |  |  |     close(outf); | 
					
						
							|  |  |  |     close(errf); | 
					
						
							|  |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG6, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } else if (res == 0) { | 
					
						
							|  |  |  |     char *argv[4]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* child */ | 
					
						
							|  |  |  |     /* close current streams, but not std streams */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     YAP_CloseAllOpenStreams(); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     close(0); | 
					
						
							|  |  |  |     dup(inpf); | 
					
						
							| 
									
										
										
										
											2002-01-14 22:26:53 +00:00
										 |  |  |     close(inpf); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     close(1); | 
					
						
							|  |  |  |     dup(outf); | 
					
						
							|  |  |  |     close(outf); | 
					
						
							| 
									
										
										
										
											2002-01-14 22:26:53 +00:00
										 |  |  |     close(2); | 
					
						
							|  |  |  |     dup(errf); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     close(errf); | 
					
						
							|  |  |  |     argv[0] = "sh"; | 
					
						
							|  |  |  |     argv[1] = "-c"; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     argv[2] = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     argv[3] = NULL; | 
					
						
							|  |  |  |     execv("/bin/sh", argv); | 
					
						
							|  |  |  |     exit(127); | 
					
						
							|  |  |  |     /* we have the streams where we want them, just want to execute now */ | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     close(inpf); | 
					
						
							|  |  |  |     close(outf); | 
					
						
							|  |  |  |     close(errf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG5,YAP_MkIntTerm(res))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif /* UNIX code */
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* execute a command as a detached process */ | 
					
						
							|  |  |  | static int | 
					
						
							| 
									
										
										
										
											2001-05-22 20:41:52 +00:00
										 |  |  | do_system(void) | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *command = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #if HAVE_SYSTEM
 | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   int sys = system(command); | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   if (sys < 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3,YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-06-29 19:30:25 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(sys))); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Error("system not available in this configuration"); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   return(FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* execute a command as a detached process */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | do_shell(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *buf = YAP_AllocSpaceFromYap(BUF_SIZE); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   int sys; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (buf == NULL) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     YAP_Error("No Temporary Space for Shell"); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |     return(FALSE); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #if HAVE_STRNCPY
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   strncpy(YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)), buf, BUF_SIZE); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   strncpy(" ", buf, BUF_SIZE); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   strncpy(YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)), buf, BUF_SIZE); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   strncpy(" ", buf, BUF_SIZE); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   strncpy(YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), buf, BUF_SIZE); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   strcpy(YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)), buf); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   strcpy(" ", buf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   strcpy(YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)), buf); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   strcpy(" ", buf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   strcpy(YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)), buf); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SYSTEM
 | 
					
						
							|  |  |  |   sys = system(buf); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_FreeSpaceFromYap(buf); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   if (sys < 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG5,YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG4, YAP_MkIntTerm(sys))); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Error("system not available in this configuration"); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   return(FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   char *cptr[4]; | 
					
						
							|  |  |  |   int t; | 
					
						
							|  |  |  |   int sys; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   cptr[0]= YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							|  |  |  |   cptr[1]= YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)); | 
					
						
							|  |  |  |   cptr[2]= YAP_AtomName(YAP_AtomOfTerm(YAP_ARG3)); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   cptr[3]= NULL; | 
					
						
							|  |  |  |   t = fork(); | 
					
						
							|  |  |  |   if (t < 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG5,YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |   } else if (t == 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     t = execvp(YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)),cptr); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |     return(t); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     t = wait(&sys); | 
					
						
							|  |  |  |     if (t < 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       return(YAP_Unify(YAP_ARG5,YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2002-06-18 05:58:12 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG4, YAP_MkIntTerm(sys))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* execute a command as a detached process */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_wait(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   long int pid = YAP_IntOfTerm(YAP_ARG1); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   HANDLE proc = OpenProcess(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE, FALSE, pid); | 
					
						
							|  |  |  |   DWORD ExitCode; | 
					
						
							|  |  |  |   if (proc == NULL) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, WinError())); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (WaitForSingleObject(proc, INFINITE) == WAIT_FAILED) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, WinError())); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (GetExitCodeProcess(proc, &ExitCode) == 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, WinError())); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   CloseHandle(proc); | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(ExitCode))); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   do { | 
					
						
							|  |  |  |     int status; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* check for interruptions */ | 
					
						
							|  |  |  |     if (waitpid(pid, &status, 0) == -1) { | 
					
						
							|  |  |  |       if (errno != EINTR) | 
					
						
							|  |  |  | 	return -1; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       return(YAP_Unify(YAP_ARG3, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |       return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(status))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } while(TRUE); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* execute a command as a detached process */ | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_popen(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   char *command = YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); | 
					
						
							|  |  |  |   long int mode = YAP_IntOfTerm(YAP_ARG2); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   FILE *pfd; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Term tsno; | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   int flags; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  | #if HAVE_POPEN
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   /* This will only work for console applications. FIX */ | 
					
						
							|  |  |  |   if (mode == 0) | 
					
						
							|  |  |  |     pfd = _popen(command, "r"); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     pfd = _popen(command, "w"); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if (mode == 0) | 
					
						
							|  |  |  |     pfd = popen(command, "r"); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     pfd = popen(command, "w"); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if (pfd == NULL) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG4, YAP_MkIntTerm(errno)));     | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (mode == 0) | 
					
						
							|  |  |  |     flags = YAP_INPUT_STREAM | YAP_POPEN_STREAM; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     flags = YAP_OUTPUT_STREAM | YAP_POPEN_STREAM; | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   tsno = YAP_OpenStream((void *)pfd, | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | 		       "pipe", | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  | 		       YAP_MkAtomTerm(YAP_LookupAtom("pipe")), | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | 		       flags); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG3, tsno)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | p_sleep(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_Term ts = YAP_ARG1; | 
					
						
							|  |  |  |   long int secs = 0, usecs = 0, out; | 
					
						
							|  |  |  |   if (YAP_IsIntTerm(ts)) { | 
					
						
							|  |  |  |     secs = YAP_IntOfTerm(ts); | 
					
						
							|  |  |  |   }  else if (YAP_IsFloatTerm(ts)) { | 
					
						
							|  |  |  |     double tfl = YAP_FloatOfTerm(ts); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     if (tfl > 1.0) | 
					
						
							|  |  |  |       secs = tfl; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       usecs = tfl*1000; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   if (secs) usecs = secs*1000; | 
					
						
							|  |  |  |   Sleep(usecs); | 
					
						
							|  |  |  |   out = 0; | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #if HAVE_USLEEP
 | 
					
						
							|  |  |  |   if (usecs > 0) { | 
					
						
							|  |  |  |     usleep(usecs); | 
					
						
							|  |  |  |     out = 0; | 
					
						
							|  |  |  |   } else | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #if HAVE_SLEEP
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       out = sleep(secs); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif /* defined(__MINGW32__) || _MSC_VER */
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(out))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* host info */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | host_name(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   char name[MAX_COMPUTERNAME_LENGTH+1]; | 
					
						
							|  |  |  |   DWORD nSize = MAX_COMPUTERNAME_LENGTH+1; | 
					
						
							|  |  |  |   if (GetComputerName(name, &nSize) == 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG2, WinError())); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #if HAVE_GETHOSTNAME
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   char name[256]; | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   if (gethostname(name, 256) == -1) { | 
					
						
							|  |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG2, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif /* defined(__MINGW32__) || _MSC_VER */
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1, YAP_MkAtomTerm(YAP_LookupAtom(name)))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | host_id(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if HAVE_GETHOSTID
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1, YAP_MkIntTerm(gethostid()))); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1, YAP_MkIntTerm(0))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | pid(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1, YAP_MkIntTerm(_getpid()))); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG1, YAP_MkIntTerm(getpid()))); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-08 14:52:54 +00:00
										 |  |  | static int | 
					
						
							|  |  |  | win(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   return(TRUE); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   return(FALSE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | static int | 
					
						
							|  |  |  | p_kill(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #if defined(__MINGW32__) || _MSC_VER
 | 
					
						
							|  |  |  |   /* Windows does not support cross-process signals, so we shall do the
 | 
					
						
							|  |  |  |      SICStus thing and assume that a signal to a process will | 
					
						
							|  |  |  |      always kill it */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   HANDLE proc = OpenProcess(STANDARD_RIGHTS_REQUIRED|PROCESS_TERMINATE, FALSE, YAP_IntOfTerm(YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   if (proc == NULL) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, WinError())); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (TerminateProcess(proc, -1) == 0) { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, WinError())); | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   CloseHandle(proc); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   if (kill(YAP_IntOfTerm(YAP_ARG1), YAP_IntOfTerm(YAP_ARG2)) < 0) { | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |     /* return an error number */ | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |     return(YAP_Unify(YAP_ARG3, YAP_MkIntTerm(errno))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | #endif /* defined(__MINGW32__) || _MSC_VER */
 | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  |   return(TRUE);  | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | error_message(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #if HAVE_STRERROR
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG2,YAP_MkAtomTerm(YAP_LookupAtom(strerror(YAP_IntOfTerm(YAP_ARG1)))))); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #if HAVE_STRERROR
 | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   return(YAP_Unify(YAP_ARG2,YAP_ARG1)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | init_sys(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2002-09-09 17:40:12 +00:00
										 |  |  |   YAP_UserCPredicate("datime", datime, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("list_directory", list_directory, 3); | 
					
						
							|  |  |  |   YAP_UserCPredicate("file_property", file_property, 7); | 
					
						
							|  |  |  |   YAP_UserCPredicate("unlink", p_unlink, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("mkdir", p_mkdir, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("rmdir", p_rmdir, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("dir_separator", dir_separator, 1); | 
					
						
							|  |  |  |   YAP_UserCPredicate("p_environ", p_environ, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("exec_command", execute_command, 6); | 
					
						
							|  |  |  |   YAP_UserCPredicate("do_shell", do_shell, 5); | 
					
						
							|  |  |  |   YAP_UserCPredicate("do_system", do_system, 3); | 
					
						
							|  |  |  |   YAP_UserCPredicate("popen", p_popen, 4); | 
					
						
							|  |  |  |   YAP_UserCPredicate("wait", p_wait, 3); | 
					
						
							|  |  |  |   YAP_UserCPredicate("host_name", host_name, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("host_id", host_id, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("pid", pid, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("kill", p_kill, 3); | 
					
						
							|  |  |  |   YAP_UserCPredicate("mktemp", p_mktemp, 3); | 
					
						
							|  |  |  |   YAP_UserCPredicate("tmpnam", p_tpmnam, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("rename_file", rename_file, 3); | 
					
						
							|  |  |  |   YAP_UserCPredicate("sleep", p_sleep, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("error_message", error_message, 2); | 
					
						
							|  |  |  |   YAP_UserCPredicate("win", win, 0); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <windows.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | int WINAPI PROTO(win_sys, (HANDLE, DWORD, LPVOID)); | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  | int WINAPI win_sys(HANDLE hinst, DWORD reason, LPVOID reserved) | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   switch (reason)  | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case DLL_PROCESS_ATTACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case DLL_PROCESS_DETACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case DLL_THREAD_ATTACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case DLL_THREAD_DETACH: | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-05-28 19:54:53 +00:00
										 |  |  |   return 1; | 
					
						
							| 
									
										
										
										
											2001-05-21 20:08:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 |