diff --git a/src/xpdev/sopenfile.c b/src/xpdev/sopenfile.c
index 5b4d44f6d228ed19d870dd7860adedd4a6fa1932..ec778722b5e40b7abfd11d4c3c713d7b22d4c6cc 100644
--- a/src/xpdev/sopenfile.c
+++ b/src/xpdev/sopenfile.c
@@ -7,11 +7,13 @@ int main(int argc, char** argv)
 	int access = O_RDWR;
 	char* share = "NWA";
 	bool try_all = true;
+	bool loop = false;
 
 	if(argc < 2) {
-		printf("usage: sopenfile [-r] <path/filename> [share-mode]\n");
+		printf("usage: sopenfile [-r] [-l] <path/filename> [share-mode]\n");
 		printf("\n");
 		printf("-r           open file read-only instead of read/write\n");
+		printf("-l           loop until failure\n");
 		printf("\n");
 		printf("share-mode:  N (deny-none)\n");
 		printf("             W (deny-write)\n");
@@ -23,42 +25,48 @@ int main(int argc, char** argv)
 		access = O_RDONLY;
 		++argn;
 	}
+	if(strcmp(argv[argn], "-l") == 0) {
+		loop = true;
+		++argn;
+	}
 	const char* path = argv[argn++];
 	if(argc > argn) {
 		share = argv[argn++];
 		try_all = false;
 	}
-	
-	for(int i = 0; share[i] != '\0'; ++i) {
-		int share_mode = 0;
-		char share_flag = share[i];
-		switch(toupper(share_flag)) {
-			case 'N':
-				share_mode = SH_DENYNO;
-				break;
-			case 'W':
-				share_mode = SH_DENYWR;
-				break;
-			case 'A':
-				share_mode = SH_DENYRW;
-				break;
-			default:
-				fprintf(stderr, "Unrecognized share-mode: %c\n", share_flag);
-				return EXIT_FAILURE;
-		}
-		fprintf(stderr, "%s Deny-%c (share mode %x): ", path, toupper(share_flag), share_mode);
-		int file = sopen(path, access, share_mode);
-		if(file < 0)
-			fprintf(stderr, "Error %d (%s)\n", errno, strerror(errno));
-		else {
-			printf("Success\n");
-			if(!try_all) {
-				fprintf(stderr, "Hit enter\n");
-				getchar();
+
+	do {
+		for(int i = 0; share[i] != '\0'; ++i) {
+			int share_mode = 0;
+			char share_flag = share[i];
+			switch(toupper(share_flag)) {
+				case 'N':
+					share_mode = SH_DENYNO;
+					break;
+				case 'W':
+					share_mode = SH_DENYWR;
+					break;
+				case 'A':
+					share_mode = SH_DENYRW;
+					break;
+				default:
+					fprintf(stderr, "Unrecognized share-mode: %c\n", share_flag);
+					return EXIT_FAILURE;
+			}
+			fprintf(stderr, "%s Deny-%c (share mode %x): ", path, toupper(share_flag), share_mode);
+			int file = sopen(path, access, share_mode);
+			if(file < 0)
+				fprintf(stderr, "Error %d (%s)\n", errno, strerror(errno));
+			else {
+				printf("Success\n");
+				if(!try_all) {
+					fprintf(stderr, "Hit enter\n");
+					getchar();
+				}
+				close(file);
 			}
-			close(file);
 		}
-	}
-	return EXIT_SUCCESS;
+	} while(loop && errno == 0);
+	return errno == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }