1138 } while ((f == NULL) && (__threadErrno == EINTR)); |
1138 } while ((f == NULL) && (__threadErrno == EINTR)); |
1139 } |
1139 } |
1140 #else /* not VMS */ |
1140 #else /* not VMS */ |
1141 |
1141 |
1142 # ifdef WIN32 |
1142 # ifdef WIN32 |
1143 |
1143 { |
1144 if (__qClass(pathName)==String) { |
1144 DWORD share = 0, access = 0, create = 0, attr = 0; |
1145 { |
1145 int numAttrib, i; |
1146 char _aPathName[MAXPATHLEN]; |
1146 OBJ *ap; |
1147 char _openMode[64]; |
1147 char * __openmode; |
1148 |
1148 HANDLE handle; |
1149 strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0'; |
1149 |
1150 strncpy(_openMode, __stringVal(openmode), sizeof(_openMode)-1); _openMode[sizeof(_openMode)-1] = '\0'; |
1150 if (__isStringLike(openmode)) { |
1151 do { |
1151 share = FILE_SHARE_READ|FILE_SHARE_WRITE; |
1152 __threadErrno = 0; |
1152 __openmode = __stringVal(openmode); |
1153 f = STX_C_CALL2( "fopen", fopen, _aPathName, _openMode); |
1153 if (strcmp(__openmode, "rb") == 0) { |
1154 if (__threadErrno == EINTR) { |
1154 access = GENERIC_READ; |
1155 f = NULL; |
1155 create = OPEN_EXISTING; |
|
1156 } else if (strcmp(__openmode, "rb+") == 0) { |
|
1157 access = GENERIC_READ | GENERIC_WRITE; |
|
1158 create = OPEN_ALWAYS; |
|
1159 } else if (strcmp(__openmode, "wb") == 0) { |
|
1160 access = GENERIC_WRITE; |
|
1161 create = CREATE_ALWAYS; |
|
1162 } else if (strcmp(__openmode, "wb+") == 0) { |
|
1163 access = GENERIC_READ | GENERIC_WRITE; |
|
1164 create = CREATE_ALWAYS; |
|
1165 } else if (strcmp(__openmode, "ab") == 0) { |
|
1166 access = FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA| |
|
1167 STANDARD_RIGHTS_WRITE|SYNCHRONIZE; |
|
1168 create = OPEN_ALWAYS; |
|
1169 } else if (strcmp(__openmode, "ab+") == 0) { |
|
1170 access = GENERIC_READ |FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA| |
|
1171 STANDARD_RIGHTS_WRITE|SYNCHRONIZE; |
|
1172 create = OPEN_ALWAYS; |
|
1173 } else { |
|
1174 console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n"); |
|
1175 } |
|
1176 } else if (__isArrayLike(openmode)) { |
|
1177 ap = __ArrayInstPtr(attributeSpec)->a_element; |
|
1178 numAttrib = __arraySize(attributeSpec); |
|
1179 __openmode = "rb+"; |
|
1180 |
|
1181 for (i=0; i<numAttrib; i++) { |
|
1182 OBJ attrSym = ap[i]; |
|
1183 |
|
1184 if (attrSym == @symbol(FILE_SHARE_READ)) { |
|
1185 share |= FILE_SHARE_READ; |
|
1186 } else if (attrSym == @symbol(FILE_SHARE_WRITE)) { |
|
1187 share |= FILE_SHARE_WRITE; |
|
1188 |
|
1189 } else if (attrSym == @symbol(GENERIC_READ)) { |
|
1190 access |= GENERIC_READ; |
|
1191 } else if (attrSym == @symbol(GENERIC_WRITE)) { |
|
1192 access |= GENERIC_WRITE; |
|
1193 |
|
1194 } else if (attrSym == @symbol(CREATE_NEW)) { |
|
1195 create |= CREATE_NEW; |
|
1196 } else if (attrSym == @symbol(CREATE_ALWAYS)) { |
|
1197 create |= CREATE_ALWAYS; |
|
1198 } else if (attrSym == @symbol(OPEN_EXISTING)) { |
|
1199 create |= OPEN_EXISTING; |
|
1200 } else if (attrSym == @symbol(OPEN_ALWAYS)) { |
|
1201 create |= OPEN_ALWAYS; |
|
1202 } else if (attrSym == @symbol(TRUNCATE_EXISTING)) { |
|
1203 create |= TRUNCATE_EXISTING; |
|
1204 |
|
1205 } else if (attrSym == @symbol(FILE_ATTRIBUTE_HIDDEN)) { |
|
1206 attr |= FILE_ATTRIBUTE_HIDDEN; |
|
1207 } else if (attrSym == @symbol(FILE_ATTRIBUTE_READONLY)) { |
|
1208 attr |= FILE_ATTRIBUTE_READONLY; |
|
1209 } else if (attrSym == @symbol(FILE_FLAG_WRITE_THROUGH)) { |
|
1210 attr |= FILE_FLAG_WRITE_THROUGH; |
|
1211 } else if (attrSym == @symbol(FILE_FLAG_SEQUENTIAL_SCAN)) { |
|
1212 attr |= FILE_FLAG_SEQUENTIAL_SCAN; |
|
1213 } else if (attrSym == @symbol(FILE_FLAG_DELETE_ON_CLOSE)) { |
|
1214 attr |= FILE_FLAG_DELETE_ON_CLOSE; |
|
1215 } else { |
|
1216 console_fprintf(stderr, "Win32OS [warning]: unsupported open mode\n"); |
|
1217 } |
|
1218 } |
|
1219 } else { |
|
1220 f = NULL; |
|
1221 // argumentError = @symbol(badAttributeSpec); |
|
1222 goto badArgument; |
|
1223 } |
|
1224 if (create == 0) { |
|
1225 f = NULL; |
|
1226 // argumentError = @symbol(missingCreateMode); |
|
1227 goto badArgument; |
|
1228 } |
|
1229 if (attr == 0) { |
|
1230 attr = FILE_ATTRIBUTE_NORMAL; |
|
1231 } |
|
1232 |
|
1233 if (__isString(pathName)) { |
|
1234 char _aPathName[MAXPATHLEN]; |
|
1235 |
|
1236 strncpy(_aPathName, __stringVal(pathName), MAXPATHLEN-1); _aPathName[MAXPATHLEN-1] = '\0'; |
|
1237 do { |
|
1238 __threadErrno = 0; |
|
1239 handle = STX_API_CALL7( "CreateFileA", CreateFileA, _aPathName, access, share, 0 /* sa */, create, attr, 0 /* hTempl */); |
|
1240 if (__threadErrno == EINTR) { |
|
1241 handle = INVALID_HANDLE_VALUE; |
|
1242 } |
|
1243 } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR)); |
|
1244 } else if (__isUnicode16String(pathName)) { |
|
1245 wchar_t _aPathName[MAXPATHLEN+1]; |
|
1246 int i, l; |
|
1247 |
|
1248 l = __unicode16StringSize(pathName); |
|
1249 if (l > MAXPATHLEN) l = MAXPATHLEN; |
|
1250 for (i=0; i<l; i++) { |
|
1251 _aPathName[i] = __unicode16StringVal(pathName)[i]; |
1156 } |
1252 } |
1157 } while ((f == NULL) && (__threadErrno == EINTR)); |
1253 _aPathName[i] = 0; |
1158 } |
1254 |
1159 } else if (__qClass(pathName)==Unicode16String) { |
1255 do { |
1160 { |
1256 __threadErrno = 0; |
1161 wchar_t _aPathName[MAXPATHLEN+1]; |
1257 handle = STX_API_CALL7( "CreateFileW", CreateFileW, _aPathName, access, share, 0 /* sa */, create, attr, 0 /* hTempl */); |
1162 wchar_t _openMode[64]; |
1258 if (__threadErrno == EINTR) { |
1163 int i, l; |
1259 handle = INVALID_HANDLE_VALUE; |
1164 |
1260 } |
1165 l = __unicode16StringSize(pathName); |
1261 } while ((handle == INVALID_HANDLE_VALUE) && (__threadErrno == EINTR)); |
1166 if (l > MAXPATHLEN) l = MAXPATHLEN; |
1262 } |
1167 for (i=0; i<l; i++) { |
1263 if (handle != INVALID_HANDLE_VALUE) { |
1168 _aPathName[i] = __unicode16StringVal(pathName)[i]; |
1264 f = fdopen(_open_osfhandle((long)handle, O_BINARY), __openmode); |
1169 } |
1265 } else { |
1170 _aPathName[i] = 0; |
1266 f = NULL; |
1171 |
1267 } |
1172 l = __stringSize(openmode); |
|
1173 if (l > 64) l = 64; |
|
1174 for (i=0; i<l; i++) { |
|
1175 _openMode[i] = ((unsigned char *)__stringVal(openmode))[i]; |
|
1176 } |
|
1177 _openMode[i] = 0; |
|
1178 do { |
|
1179 __threadErrno = 0; |
|
1180 f = STX_C_CALL2( "_wfopen", _wfopen, _aPathName, _openMode); |
|
1181 if (__threadErrno == EINTR) { |
|
1182 f = NULL; |
|
1183 } |
|
1184 } while ((f == NULL) && (__threadErrno == EINTR)); |
|
1185 } |
|
1186 } |
1268 } |
1187 # else /* not WIN32 */ |
1269 # else /* not WIN32 */ |
1188 |
1270 |
1189 if (__qClass(pathName)==String) { |
1271 if (__qClass(pathName)==String) { |
1190 do { |
1272 do { |