106 lines
2.4 KiB
Python
106 lines
2.4 KiB
Python
def ds3_lock_twice(self, fstype):
|
|
testdir = self.mkworkdir('d')
|
|
|
|
self.mkfile("testit.bat", """\
|
|
d:
|
|
%s
|
|
c:\\lcktwice primary
|
|
rem end
|
|
""" % ("rem Internal share" if self.version == "FDPP kernel" else "c:\\share"), newline="\r\n")
|
|
|
|
# compile sources
|
|
self.mkexe_with_djgpp("lcktwice", r"""
|
|
/* Most of this was copied from DJGPP docs at
|
|
http://www.delorie.com/djgpp/doc/libc/libc_181.html */
|
|
|
|
#include <dos.h>
|
|
#include <dir.h>
|
|
#include <fcntl.h>
|
|
#include <io.h>
|
|
#include <process.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define FNAME "FOO.DAT"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
int handle;
|
|
int ret;
|
|
int primary = -1;
|
|
|
|
if (argc < 2) {
|
|
printf("FAIL: Missing argument (primary|secondary)\n");
|
|
return -2;
|
|
}
|
|
if (strcmp(argv[1], "primary") == 0)
|
|
primary = 1;
|
|
if (strcmp(argv[1], "secondary") == 0)
|
|
primary = 0;
|
|
if (primary < 0) {
|
|
printf("FAIL: Invalid argument (primary|secondary)\n");
|
|
return -2;
|
|
}
|
|
|
|
if (primary) {
|
|
int rc;
|
|
ret = _dos_creat(FNAME, _A_NORMAL, &handle);
|
|
if (ret == 0)
|
|
_dos_write(handle, "hello\n", 6, &rc); // something to lock on
|
|
} else {
|
|
ret = _dos_open(FNAME, O_RDWR, &handle);
|
|
}
|
|
if (ret != 0) {
|
|
printf("FAIL: %s: File '%s' not created or opened\n", argv[1], FNAME);
|
|
return -1;
|
|
}
|
|
|
|
ret = _dos_lock(handle, 0, 1); // just the first byte
|
|
if (ret != 0) {
|
|
if (primary) {
|
|
printf("FAIL: %s: Could not get lock on file '%s'\n", argv[1], FNAME);
|
|
_dos_close(handle);
|
|
return -1;
|
|
} else {
|
|
printf("PASS: %s: Could not get lock on file '%s'\n", argv[1], FNAME);
|
|
_dos_close(handle);
|
|
return 0;
|
|
}
|
|
} else {
|
|
if (primary) {
|
|
printf("OKAY: %s: Acquired lock on file '%s'\n", argv[1], FNAME);
|
|
|
|
// Now start second copy
|
|
spawnlp(P_WAIT, argv[0], argv[0], "secondary", NULL);
|
|
|
|
} else {
|
|
printf("FAIL: %s: Acquired lock on file '%s'\n", argv[1], FNAME);
|
|
_dos_unlock(handle, 0, 1);
|
|
_dos_close(handle);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
_dos_unlock(handle, 0, 1);
|
|
_dos_close(handle);
|
|
return 0;
|
|
}
|
|
""")
|
|
|
|
if fstype == "MFS":
|
|
config="""\
|
|
$_hdimage = "dXXXXs/c:hdtype1 dXXXXs/d:hdtype1 +1"
|
|
$_floppy_a = ""
|
|
"""
|
|
else: # FAT
|
|
name = self.mkimage("12", cwd=testdir)
|
|
config="""\
|
|
$_hdimage = "dXXXXs/c:hdtype1 %s +1"
|
|
$_floppy_a = ""
|
|
""" % name
|
|
|
|
results = self.runDosemu("testit.bat", config=config)
|
|
|
|
self.assertNotIn("FAIL:", results)
|
|
self.assertIn("PASS:", results)
|