diff --git a/src/sbbs3/Makefile b/src/sbbs3/Makefile
index 33a1e1b115f328b4422743abc0d3d2721337cb9e..eca0ac9c5e0bcb466ef0c3bc261085d17f72fef9 100644
--- a/src/sbbs3/Makefile
+++ b/src/sbbs3/Makefile
@@ -172,7 +172,7 @@ $(FIXSMB): fixsmb.c \
 	$(LIBODIR)\str_util.obj \
 	$(LIBODIR)\dirwrap.obj
 	@echo Creating $@
-	$(QUIET)$(CC) $(CFLAGS) -n$(EXEODIR) $**
+	$(QUIET)$(CC) $(CFLAGS) -n$(EXEODIR) $** $(WILDARGS)
 
 # CHKSMB Utility
 $(CHKSMB): chksmb.c \
diff --git a/src/sbbs3/fixsmb.c b/src/sbbs3/fixsmb.c
index d9f1d880c40b7f9dce44827ef1ea2cf860606e1c..676fd678e9e59cbec114cc66c4accd4ffc7320f7 100644
--- a/src/sbbs3/fixsmb.c
+++ b/src/sbbs3/fixsmb.c
@@ -42,7 +42,9 @@
 
 #include "sbbs.h"
 
-smb_t smb;
+smb_t	smb;
+BOOL	renumber=FALSE;
+char*	usage="usage: fixsmb [-renumber] <smb_file> [[smb_file] [...]]\n";
 
 int compare_index(const idxrec_t* idx1, const idxrec_t* idx2)
 {
@@ -88,45 +90,27 @@ void sort_index(smb_t* smb)
 void unlock_msgbase(void)
 {
 	int i;
-	if((i=smb_unlock(&smb))!=0)
+	if(smb_islocked(&smb) && (i=smb_unlock(&smb))!=0)
 		printf("smb_unlock returned %d: %s\n",i,smb.last_error);
 }
 
-char *usage="usage: fixsmb [-renumber] <smb_file>\n";
-
-int main(int argc, char **argv)
+int fixsmb(char* sub)
 {
 	char*		p;
 	char*		text;
 	char		str[MAX_PATH+1],c;
-	char		revision[16];
 	int 		i,w;
 	ulong		l,length,size,n;
-	BOOL		renumber=FALSE;
 	smbmsg_t	msg;
 
-	sscanf("$Revision$", "%*s %s", revision);
-
-	printf("\nFIXSMB v2.10-%s (rev %s) SMBLIB %s - Rebuild Synchronet Message Base\n\n"
-		,PLATFORM_DESC,revision,smb_lib_ver());
-
 	memset(&smb,0,sizeof(smb));
 
-	smb.file[0]=0;
-	for(i=1;i<argc;i++) {
-		if(!stricmp(argv[i],"-renumber"))
-			renumber=TRUE;
-		else
-			SAFECOPY(smb.file,argv[i]);
-	}
+	SAFECOPY(smb.file,sub);
 
 	if((p=getfext(smb.file))!=NULL && stricmp(p,".shd")==0)
 		*p=0;	/* Chop off .shd extension, if supplied on command-line */
 
-	if(!smb.file[0]) {
-		printf(usage);
-		exit(1); 
-	}
+	printf("Opening %s\n",smb.file);
 
 	if((i=smb_open(&smb))!=0) {
 		printf("smb_open returned %d: %s\n",i,smb.last_error);
@@ -138,8 +122,6 @@ int main(int argc, char **argv)
 		exit(1);
 	}
 
-	atexit(unlock_msgbase);
-
 	if((i=smb_locksmbhdr(&smb))!=0) {
 		smb_close(&smb);
 		printf("smb_locksmbhdr returned %d: %s\n",i,smb.last_error);
@@ -289,6 +271,41 @@ int main(int argc, char **argv)
 	smb_unlocksmbhdr(&smb);
 	printf("Closing message base.\n");
 	smb_close(&smb);
+	unlock_msgbase();
 	printf("Done.\n");
 	return(0);
 }
+
+int main(int argc, char **argv)
+{
+	char		revision[16];
+	int 		i;
+	str_list_t	list;
+
+	sscanf("$Revision$", "%*s %s", revision);
+
+	printf("\nFIXSMB v2.10-%s (rev %s) SMBLIB %s - Rebuild Synchronet Message Base\n\n"
+		,PLATFORM_DESC,revision,smb_lib_ver());
+
+	list=strListInit();
+
+	for(i=1;i<argc;i++) {
+		if(argv[i][0]=='-') {
+			if(!stricmp(argv[i],"-renumber"))
+				renumber=TRUE;
+		} else
+			strListPush(&list,argv[i]);
+	}
+
+	if(!strListCount(list)) {
+		printf(usage);
+		exit(1); 
+	}
+
+	atexit(unlock_msgbase);
+
+	for(i=0;list[i]!=NULL;i++)
+		fixsmb(list[i]);
+
+	return(0);
+}