Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 21 Nov 1999 14:10:01 -0800 (PST)
From:      Juergen Lock <nox@jelal.kn-bremen.de>
To:        freebsd-ports@FreeBSD.org
Subject:   Re: ports/14927: the newer wine again :)
Message-ID:  <199911212210.OAA07390@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR ports/14927; it has been noted by GNATS.

From: Juergen Lock <nox@jelal.kn-bremen.de>
To: mi@misha.cisco.com
Cc: freebsd-gnats-submit@freebsd.org, se@freebsd.org,
	Stefan.Esser@o-tel-o.de
Subject: Re: ports/14927: the newer wine again :)
Date: Sun, 21 Nov 1999 21:58:44 +0100 (MET)

 In article <199911162152.QAA68224@misha.cisco.com> you write:
 
 >	The  new  wine  was  "released"  on  Nov  14,  '99.  The
 >	cliboard-patch is  no longer  needed, but two  files now
 >	include <sys/ptrace.h> without including <sys/types.h>.
 >
 >	Also corrected  a minor bug  in the port's  Makefile and
 >	made building the wine  for debugging an optional affair
 >	(.if-ed by WANT_DEBUG).
 
 Here's a better version of the 991114 update :)
 
 1. The -g flag can now be turned off (NO_DEBUG)
 2. Use/set fs/gs from the sigcontext struct so that it correctly runs
 on recent -stable (the fs/gs handling has just been MFC'd.)  I have
 extracted the relevant diffs from cvs and placed them into files/ for
 users running older -stable or -releases.
 3. Fix another ptrace bug, the debugger now actually seems to work again...
 5. Also install regapi, and some doc files.
 4. And added some patches from the wine-patches list. (patches/patch-e*)
 
 Changed files:
 	Makefile files/README.patch files/md5
 	pkg/MESSAGE pkg/PLIST
 
 Removed files:
 	patches/patch-bb
 	(the patch doesn't remove files, you have to rm them yourself)
 
 New files:
 	files/patch-3.3-sys-fsgs
 	patches/patch-da patches/patch-db patches/patch-ea
 	patches/patch-eb patches/patch-be patches/patch-ec
 	patches/patch-ed patches/patch-ee patches/patch-ef
 	patches/patch-eg patches/patch-eh patches/patch-bc
 	patches/patch-bd patches/patch-au patches/patch-af
 
 Index: Makefile
 ===================================================================
 RCS file: /home/cvs/cvs/ports/emulators/wine/Makefile,v
 retrieving revision 1.74
 diff -u -u -r1.74 Makefile
 --- Makefile	1999/11/14 20:49:22	1.74
 +++ Makefile	1999/11/20 16:12:54
 @@ -6,45 +6,96 @@
  # $FreeBSD: ports/emulators/wine/Makefile,v 1.74 1999/11/14 20:49:22 se Exp $
  #
  
 -DATE=		991031
  DISTNAME=	Wine-${DATE}
 -PKGNAME=	wine-99.10.31
 +PKGNAME=	wine-99.11.14
  CATEGORIES=	emulators
  MASTER_SITES=	${MASTER_SITE_SUNSITE}
  MASTER_SITE_SUBDIR=	ALPHA/wine/development
  
  MAINTAINER=	se@FreeBSD.org
  
 -LIB_DEPENDS=	Xpm.4:${PORTSDIR}/graphics/xpm
 +LIB_DEPENDS=	Xpm.4:${PORTSDIR}/graphics/xpm \
 +		GL.14:${PORTSDIR}/graphics/Mesa3
  
 +DATE=		991114
  WRKSRC=		${WRKDIR}/wine-${DATE}
  GNU_CONFIGURE=	yes
  MAN1=		wine.1
 -MAN1=		wine.conf.5
 +MAN5=		wine.conf.5
  ONLY_FOR_ARCHS=	i386
  
 +.if defined(NO_DEBUG)
 +pre-extract:
 +	@${ECHO} "NO_DEBUG has been set, building without debug info..."
 +	@${ECHO} "This will save diskspace but it makes debugging harder."
 +	@${ECHO} "If for example wine crashes and you would like to send"
 +	@${ECHO} "the backtrace it then dumps to the developers (or"
 +	@${ECHO} "comp.emulators.ms-windows.wine) it will be much more useful"
 +	@${ECHO} "to them if you first rebuild without this and generate it again."
 +	@${ECHO} "(If you're _not_ low on diskspace there is not really a reason to"
 +	@${ECHO} "use this flag, the resulting wine won't use more VM or anything like"
 +	@${ECHO} "that when running, only when it has to enter the debugger...)"
 +.else
  STRIP=
  CFLAGS+=	-g
 +.endif
  
  post-configure:
 -		cd ${WRKSRC} && make depend
 +	cd ${WRKSRC} && make depend
  
 +post-build:
 +	cd ${WRKSRC}/programs/regapi && ${MAKE}
 +	${SED} '1s/bash/sh/;s-\./\(reg.*\.pl\)-'${PREFIX}/lib/wine/reg/'\1-' <${WRKSRC}/programs/regapi/regSet.sh >${WRKDIR}/regSet.sh
 +	${SED} 's-\(Change directory to \)<dirs to wine>/tools$$-\1your program'"'"'s dir (or wherever you need to be to run it)-;s-\./\(bug_report\.pl\)-'${PREFIX}/lib/wine/'\1-' <${WRKSRC}/documentation/bugreports >${WRKDIR}/bugreports
 +	${SED} 's-\(look at the file \)<dirs to wine>/wine.ini-\1'${PREFIX}/etc/wine.conf.sample- <${WRKSRC}/documentation/config >${WRKDIR}/config
 +
  do-install:
  	${INSTALL_PROGRAM} ${WRKSRC}/wine ${PREFIX}/bin
 -	${INSTALL_PROGRAM} ${WRKSRC}/tools/fnt2bdf ${PREFIX}/bin
 -	${INSTALL_PROGRAM} ${WRKSRC}/windows/x11drv/wineclipsrv ${PREFIX}/bin
 +	${INSTALL_PROGRAM} -s ${WRKSRC}/tools/fnt2bdf ${PREFIX}/bin
 +	${INSTALL_PROGRAM} -s ${WRKSRC}/windows/x11drv/wineclipsrv ${PREFIX}/bin
 +	${INSTALL_PROGRAM} -s ${WRKSRC}/programs/regapi/regapi ${PREFIX}/bin
 +	${INSTALL_SCRIPT} ${WRKDIR}/regSet.sh ${PREFIX}/bin
  	${INSTALL_DATA} ${WRKSRC}/wine.ini ${PREFIX}/etc/wine.conf.sample
  	[ -f ${PREFIX}/etc/wine.conf ] \
  		|| ${INSTALL_DATA} ${WRKSRC}/wine.ini ${PREFIX}/etc/wine.conf
  	${INSTALL_DATA} ${WRKSRC}/wine.sym ${PREFIX}/etc
  	${INSTALL_DATA} ${WRKSRC}/documentation/wine.man ${PREFIX}/man/man1/wine.1
  	${INSTALL_DATA} ${WRKSRC}/documentation/wine.conf.man ${PREFIX}/man/man5/wine.conf.5
 -	-@${MKDIR} ${PREFIX}/lib/wine 2>/dev/null
 +	-@${MKDIR} ${PREFIX}/lib/wine/documentation ${PREFIX}/lib/wine/reg 2>/dev/null
 +	${INSTALL_DATA} ${WRKDIR}/bugreports ${WRKDIR}/config \
 +		${WRKSRC}/README \
 +		${WRKSRC}/ANNOUNCE \
 +		${WRKSRC}/AUTHORS \
 +		${WRKSRC}/LICENSE \
 +		${WRKSRC}/WARRANTY \
 +		${WRKSRC}/documentation/cdrom-labels \
 +		${WRKSRC}/documentation/debugging \
 +		${WRKSRC}/documentation/dlls \
 +		${WRKSRC}/documentation/fonts \
 +		${WRKSRC}/documentation/ioport-trace-hints \
 +		${WRKSRC}/documentation/lables-and-serial-nubers \
 +		${WRKSRC}/documentation/no-windows \
 +		${WRKSRC}/documentation/printing \
 +		${WRKSRC}/documentation/psdriver \
 +		${WRKSRC}/documentation/psdrv.reg \
 +		${WRKSRC}/documentation/ttfserver \
 +		${PREFIX}/lib/wine/documentation
 +	${INSTALL_DATA} ${WRKSRC}/debugger/README \
 +		${PREFIX}/lib/wine/documentation/README.debugger
 +	${INSTALL_DATA} ${WRKSRC}/programs/regapi/README \
 +		${PREFIX}/lib/wine/documentation/README.regapi
 +	${INSTALL_SCRIPT} ${WRKSRC}/tools/bug_report.pl \
 +		${PREFIX}/lib/wine
 +	${INSTALL_SCRIPT} \
 +		${WRKSRC}/programs/regapi/regFixer.pl \
 +		${WRKSRC}/programs/regapi/regRestorer.pl \
 +		${PREFIX}/lib/wine/reg
  	${INSTALL_DATA} ${FILESDIR}/README.patch \
  		${FILESDIR}/patch-3.3-sys-ldtshare \
  		${FILESDIR}/patch-3.3-sys-sigtrap \
 +		${FILESDIR}/patch-3.3-sys-fsgs \
  		${PREFIX}/lib/wine
 -	${INSTALL_DATA} ${WRKSRC}/winedefault.reg ${PREFIX}/lib/wine/
 +	${INSTALL_DATA} ${WRKSRC}/winedefault.reg ${PREFIX}/lib/wine
  	${ECHO}
  	@${SED} s+%%PREFIX%%+${PREFIX}+g <${PKGMESSAGE}
  
 Index: files/README.patch
 ===================================================================
 RCS file: /home/cvs/cvs/ports/emulators/wine/files/README.patch,v
 retrieving revision 1.1
 diff -u -u -r1.1 README.patch
 --- README.patch	1999/11/14 20:49:29	1.1
 +++ README.patch	1999/11/21 01:11:32
 @@ -1,4 +1,4 @@
 -Here are two patches for FreeBSD's kernel that are necessary for wine
 +Here are some patches for FreeBSD's kernel that are necessary for wine
  (well not strictly _necessary_ but without them parts of it won't work.)
  They unfortunately didn't make it into the base distribution in time
  for the 3.3 release code freeze...
 @@ -14,27 +14,35 @@
  correctly show a crash backtrace but all commands that use single-
  stepping failed.)
  
 +patch-3.3-sys-fsgs:
 +always set/use the sc_fs and sc_gs entries in the sigcontext struct,
 +making -stable behave the same as -current there.  this should finally
 +allow signal handling of a wine that was built on -stable to correctly
 +run on -current too.  Until the corresponding wine change has been
 +committed it is in the port in patches/patch-af.
 +(this one was MFC'd Nov 15 1999, so you only need it if you're running a
 +system from the -stable branch older than that, like a 3.3-RELEASE.  If you
 +happen to try to apply it when its already there patch(1) should complain
 +`Reversed (or previously applied) patch detected!  Assume -R? [y]',
 +just hit ^C then...)
 +
  Apply as follows:
  
  	(cd /usr/src/sys && patch ) <patch-3.3-sys-ldtshare
  	(cd /usr/src/sys && patch ) <patch-3.3-sys-sigtrap
  
 +And if you don't already have it:
 +
 +	(cd /usr/src/sys && patch ) <patch-3.3-sys-fsgs
 +
  then build a new kernel. (don't forget to include the options USER_LDT,
  SYSVSHM, SYSVSEM, and SYSVMSG, wine needs these.)
  
  -current users:
 -someone of you :) needs to implement a runtime check in wine for the
 -FreeBSD version and based on that use/set the sc_gs and sc_fs values
 -in the sigcontext struct in signal handlers for versions >= 4.0.
 -(see the `wine signal handlers lose %fs on FreeBSD' thread on the
 -wine-devel list for details, can be read at
 -http://www.integrita.com/cgi-local/lwgate.pl/WINE-DEVEL/archives/1999-09/Subject/article-15.html
 -at least i ended up there when i searched it today.  yes you could also
 -simply define FS_sig and GS_sig in wine's include/sig_context.h and be
 -done with it but the resulting wine would only work on 4.0 and
 -Alexandre (wine maintainer) didn't like that idea...)
 -
 -A LDT patch for -current is at http://www.freebsd.org/~luoqi
 -(not included since i don't know if it still applies), the sigtrap
 -patch looks like it could also apply to -current but i haven't tried.
 -(and if not, i guess a similar fix will be committed soon anyway.)
 +A LDT patch for -current is at http://www.freebsd.org/~luoqi/
 +(well in a recent posting on the -current list,
 +http://www.freebsd.org/cgi/mid.cgi?db=&id=199911150745.CAA27884@lor.watermarkgroup.com
 +he said that version is outdated, seems you have to mail him to
 +get a current one), the sigtrap patch looks like it could also
 +apply to -current but i haven't tried.  And the fs/gs patch of course
 +already is in -current.
 Index: files/md5
 ===================================================================
 RCS file: /home/cvs/cvs/ports/emulators/wine/files/md5,v
 retrieving revision 1.47
 diff -u -u -r1.47 md5
 --- md5	1999/11/14 20:49:29	1.47
 +++ md5	1999/11/19 16:27:46
 @@ -1 +1 @@
 -MD5 (Wine-991031.tar.gz) = 80904e8933ac1a72fdf4c0a05f36d6be
 +MD5 (Wine-991114.tar.gz) = 51df1d91f266b3e72c4e17093670da35
 Index: pkg/MESSAGE
 ===================================================================
 RCS file: /home/cvs/cvs/ports/emulators/wine/pkg/MESSAGE,v
 retrieving revision 1.1
 diff -u -u -r1.1 MESSAGE
 --- MESSAGE	1999/11/14 20:49:34	1.1
 +++ MESSAGE	1999/11/21 02:11:59
 @@ -2,3 +2,18 @@
  options USER_LDT, SYSVSHM, SYSVSEM, and SYSVMSG.  Before you do that,
  you may want to apply the patches in %%PREFIX%%/lib/wine to your
  kernel sources, see the README.patch there.
 +
 +(Note: if you already installed the patches from the 991031 version of
 +this port and you're not tracking -stable or your -stable is older than
 +Nov 15 1999:  there is a new patch you need, patch-3.3-sys-fsgs)
 +
 +And the port now also installs some of wine's doc files which
 +describe additional things that are not in the manual pages, see
 +%%PREFIX%%/lib/wine/documentation.  There are more in the source tree
 +but the others are only useful in conjunction with the rest of the
 +source tree, and then you can as well look at them there.  (If you
 +just installed this as a package and don't know how to use the ports
 +system to have it fetch and extract the source for you have a look at
 +http://www.freebsd.org/handbook/ports.html .  In short:
 +cd /usr/ports/emulators/wine && make configure )
 +
 Index: pkg/PLIST
 ===================================================================
 RCS file: /home/cvs/cvs/ports/emulators/wine/pkg/PLIST,v
 retrieving revision 1.4
 diff -u -u -r1.4 PLIST
 --- PLIST	1999/11/14 20:49:34	1.4
 +++ PLIST	1999/11/20 16:01:06
 @@ -1,10 +1,38 @@
  bin/wine
  bin/fnt2bdf
  bin/wineclipsrv
 +bin/regapi
 +bin/regSet.sh
  etc/wine.conf.sample
  etc/wine.sym
  lib/wine/README.patch
  lib/wine/patch-3.3-sys-ldtshare
  lib/wine/patch-3.3-sys-sigtrap
 +lib/wine/patch-3.3-sys-fsgs
  lib/wine/winedefault.reg
 +lib/wine/bug_report.pl
 +lib/wine/reg/regFixer.pl
 +lib/wine/reg/regRestorer.pl
 +lib/wine/documentation/ANNOUNCE
 +lib/wine/documentation/AUTHORS
 +lib/wine/documentation/LICENSE
 +lib/wine/documentation/WARRANTY
 +lib/wine/documentation/README
 +lib/wine/documentation/bugreports
 +lib/wine/documentation/cdrom-labels
 +lib/wine/documentation/config
 +lib/wine/documentation/debugging
 +lib/wine/documentation/dlls
 +lib/wine/documentation/fonts
 +lib/wine/documentation/ioport-trace-hints
 +lib/wine/documentation/lables-and-serial-nubers
 +lib/wine/documentation/no-windows
 +lib/wine/documentation/printing
 +lib/wine/documentation/psdriver
 +lib/wine/documentation/psdrv.reg
 +lib/wine/documentation/ttfserver
 +lib/wine/documentation/README.debugger
 +lib/wine/documentation/README.regapi
 +@dirrm lib/wine/reg
 +@dirrm lib/wine/documentation
  @dirrm lib/wine
 --- /dev/null	Sun Nov 21 02:59:53 1999
 +++ files/patch-3.3-sys-fsgs	Fri Nov 19 20:36:36 1999
 @@ -0,0 +1,176 @@
 +
 +luoqi       1999/11/15 12:19:28 PST
 +
 +  Modified files:        (Branch: RELENG_3)
 +    sys/i386/i386        genassym.c locore.s machdep.c 
 +    sys/i386/include     cpufunc.h 
 +  Log:
 +  MFC: Save %fs and %gs in sigcontext when delivering signals and restore
 +  them upon return.
 +  
 +  Revision  Changes    Path
 +  1.62.2.3  +4 -1      src/sys/i386/i386/genassym.c
 +  1.118.2.3 +11 -7     src/sys/i386/i386/locore.s
 +  1.322.2.9 +5 -1      src/sys/i386/i386/machdep.c
 +  1.85.2.2  +29 -1     src/sys/i386/include/cpufunc.h
 +
 +
 +
 +luoqi       1999/11/15 12:34:50 PST
 +
 +  Modified files:        (Branch: RELENG_3)
 +    sys/pc98/i386        machdep.c 
 +  Log:
 +  MFC: Save %fs and %gs in sigcontext when delivering signals and restore
 +  them upon return.
 +  
 +  Revision  Changes    Path
 +  1.105.2.10 +5 -1      src/sys/pc98/i386/machdep.c
 +
 +
 +
 +Index: i386/i386/genassym.c
 +===================================================================
 +RCS file: /home/cvs/cvs/src/sys/i386/i386/genassym.c,v
 +retrieving revision 1.62.2.2
 +retrieving revision 1.62.2.3
 +diff -p -u -r1.62.2.2 -r1.62.2.3
 +--- src/sys/i386/i386/genassym.c	1999/08/29 16:05:40	1.62.2.2
 ++++ /home/cvs/cvs/src/sys/i386/i386/genassym.c	1999/11/15 20:19:23	1.62.2.3
 +@@ -173,6 +173,9 @@ main()
 + 	printf("#define\tSIGF_SCP %#x\n", OS(sigframe, sf_scp));
 + 	printf("#define\tSIGF_HANDLER %#x\n", OS(sigframe, sf_handler));
 + 	printf("#define\tSIGF_SC %#x\n", OS(sigframe, sf_sc));
 ++	printf("#define\tSC_PS %#x\n", OS(sigcontext, sc_ps));
 ++	printf("#define\tSC_FS %#x\n", OS(sigcontext, sc_fs));
 ++	printf("#define\tSC_GS %#x\n", OS(sigcontext, sc_gs));
 + 
 + 	printf("#define\tB_READ %#x\n", B_READ);
 + 	printf("#define\tENOENT %d\n", ENOENT);
 +Index: i386/i386/locore.s
 +===================================================================
 +RCS file: /home/cvs/cvs/src/sys/i386/i386/locore.s,v
 +retrieving revision 1.118.2.2
 +retrieving revision 1.118.2.3
 +diff -p -u -r1.118.2.2 -r1.118.2.3
 +--- src/sys/i386/i386/locore.s	1999/08/29 16:05:42	1.118.2.2
 ++++ /home/cvs/cvs/src/sys/i386/i386/locore.s	1999/11/15 20:19:24	1.118.2.3
 +@@ -433,13 +433,17 @@ NON_GPROF_ENTRY(prepare_usermode)
 +  */
 + NON_GPROF_ENTRY(sigcode)
 + 	call	SIGF_HANDLER(%esp)
 +-	lea	SIGF_SC(%esp),%eax		/* scp (the call may have clobbered the */
 +-						/* copy at 8(%esp)) */
 +-	pushl	%eax
 +-	pushl	%eax				/* junk to fake return address */
 ++	lea	SIGF_SC(%esp),%eax		/* scp (the copy at 8(%esp) */
 ++	pushl	%eax				/* may have been clobbered) */
 ++	testl	$PSL_VM,SC_PS(%eax)
 ++	jne	9f
 ++	movl	SC_FS(%eax),%fs			/* restore %fs */
 ++	movl	SC_GS(%eax),%gs			/* restore %gs */
 ++9:
 ++	pushl	%eax				/* junk to fake return addr */
 + 	movl	$SYS_sigreturn,%eax		/* sigreturn() */
 +-	LCALL(0x7,0)				/* enter kernel with args on stack */
 +-	hlt					/* never gets here */
 ++	LCALL(0x7,0)				/* enter kernel with args */
 ++0:	jmp	0b
 + 	ALIGN_TEXT
 + _esigcode:
 + 
 +Index: i386/i386/machdep.c
 +===================================================================
 +RCS file: /home/cvs/cvs/src/sys/i386/i386/machdep.c,v
 +retrieving revision 1.322.2.8
 +retrieving revision 1.322.2.9
 +diff -p -u -r1.322.2.8 -r1.322.2.9
 +--- src/sys/i386/i386/machdep.c	1999/08/29 16:05:43	1.322.2.8
 ++++ /home/cvs/cvs/src/sys/i386/i386/machdep.c	1999/11/15 20:19:25	1.322.2.9
 +@@ -579,6 +579,8 @@ sendsig(catcher, sig, mask, code)
 + 	sf.sf_sc.sc_ds = regs->tf_ds;
 + 	sf.sf_sc.sc_ss = regs->tf_ss;
 + 	sf.sf_sc.sc_es = regs->tf_es;
 ++	sf.sf_sc.sc_fs = rfs();
 ++	sf.sf_sc.sc_gs = rgs();
 + 	sf.sf_sc.sc_isp = regs->tf_isp;
 + 
 + 	/*
 +@@ -643,6 +645,8 @@ sendsig(catcher, sig, mask, code)
 + 	regs->tf_cs = _ucodesel;
 + 	regs->tf_ds = _udatasel;
 + 	regs->tf_es = _udatasel;
 ++	load_fs(_udatasel);
 ++	load_gs(_udatasel);
 + 	regs->tf_ss = _udatasel;
 + }
 + 
 +Index: i386/include/cpufunc.h
 +===================================================================
 +RCS file: /home/cvs/cvs/src/sys/i386/include/cpufunc.h,v
 +retrieving revision 1.85.2.1
 +retrieving revision 1.85.2.2
 +diff -p -u -r1.85.2.1 -r1.85.2.2
 +--- src/sys/i386/include/cpufunc.h	1999/08/29 16:06:26	1.85.2.1
 ++++ /home/cvs/cvs/src/sys/i386/include/cpufunc.h	1999/11/15 20:19:28	1.85.2.2
 +@@ -424,6 +424,34 @@ static __inline void
 + wrmsr(u_int msr, u_int64_t newval)
 + {
 + 	__asm __volatile(".byte 0x0f, 0x30" : : "A" (newval), "c" (msr));
 ++}
 ++
 ++static __inline u_int
 ++rfs(void)
 ++{
 ++	u_int sel;
 ++	__asm __volatile("movl %%fs,%0" : "=rm" (sel));
 ++	return (sel);
 ++}
 ++
 ++static __inline u_int
 ++rgs(void)
 ++{
 ++	u_int sel;
 ++	__asm __volatile("movl %%gs,%0" : "=rm" (sel));
 ++	return (sel);
 ++}
 ++
 ++static __inline void
 ++load_fs(u_int sel)
 ++{
 ++	__asm __volatile("movl %0,%%fs" : : "rm" (sel));
 ++}
 ++
 ++static __inline void
 ++load_gs(u_int sel)
 ++{
 ++	__asm __volatile("movl %0,%%gs" : : "rm" (sel));
 + }
 + 
 + #else /* !__GNUC__ */
 +Index: pc98/i386/machdep.c
 +===================================================================
 +RCS file: /home/cvs/cvs/src/sys/pc98/i386/machdep.c,v
 +retrieving revision 1.105.2.9
 +retrieving revision 1.105.2.10
 +diff -p -u -r1.105.2.9 -r1.105.2.10
 +--- src/sys/pc98/i386/machdep.c	1999/11/14 01:54:08	1.105.2.9
 ++++ /home/cvs/cvs/src/sys/pc98/i386/machdep.c	1999/11/15 20:34:48	1.105.2.10
 +@@ -592,6 +592,8 @@ sendsig(catcher, sig, mask, code)
 + 	sf.sf_sc.sc_ds = regs->tf_ds;
 + 	sf.sf_sc.sc_ss = regs->tf_ss;
 + 	sf.sf_sc.sc_es = regs->tf_es;
 ++	sf.sf_sc.sc_fs = rfs();
 ++	sf.sf_sc.sc_gs = rgs();
 + 	sf.sf_sc.sc_isp = regs->tf_isp;
 + 
 + 	/*
 +@@ -656,6 +658,8 @@ sendsig(catcher, sig, mask, code)
 + 	regs->tf_cs = _ucodesel;
 + 	regs->tf_ds = _udatasel;
 + 	regs->tf_es = _udatasel;
 ++	load_fs(_udatasel);
 ++	load_gs(_udatasel);
 + 	regs->tf_ss = _udatasel;
 + }
 + 
 --- /dev/null	Sun Nov 21 03:01:19 1999
 +++ patches/patch-af	Sun Nov 21 02:36:01 1999
 @@ -0,0 +1,25 @@
 +Index: dlls/ntdll/signal_i386.c
 +@@ -183,10 +183,22 @@
 + #define ES_sig(context)      ((context)->sc_es)
 + #define SS_sig(context)      ((context)->sc_ss)
 +                             
 +-#ifdef linux
 + /* FS and GS are now in the sigcontext struct of FreeBSD, but not 
 +  * saved by the exception handling. duh.
 ++ * Actually they are in -current (have been for a while), and that
 ++ * patch now finally has been MFC'd to -stable too (Nov 15 1999).
 ++ * If you're running a system from the -stable branch older than that,
 ++ * like a 3.3-RELEASE, grab the patch from the ports tree:
 ++ * ftp://ftp.freebsd.org/pub/FreeBSD/FreeBSD-current/ports/emulators/wine/files/patch-3.3-sys-fsgs
 ++ * (If its not yet there when you look, go here:
 ++ * http://www.jelal.kn-bremen.de/freebsd/ports/emulators/wine/files/ )
 +  */
 ++#ifdef __FreeBSD__
 ++#define FS_sig(context)      ((context)->sc_fs)
 ++#define GS_sig(context)      ((context)->sc_gs)
 ++#endif
 ++
 ++#ifdef linux
 + #define FS_sig(context)      ((context)->sc_fs)
 + #define GS_sig(context)      ((context)->sc_gs)
 + #define CR2_sig(context)     ((context)->cr2)
 --- /dev/null	Sun Nov 21 03:01:26 1999
 +++ patches/patch-au	Sat Nov 20 11:24:14 1999
 @@ -0,0 +1,53 @@
 +Index: server/ptrace.c
 +@@ -36,6 +36,11 @@
 + #ifndef PTRACE_POKEDATA
 + #define PTRACE_POKEDATA PT_WRITE_D
 + #endif
 ++#ifdef __FreeBSD__
 ++#define PTRACE_KEEPIP 1
 ++#else
 ++#define PTRACE_KEEPIP 0
 ++#endif
 + 
 + static const int use_ptrace = 1;  /* set to 0 to disable ptrace */
 + 
 +@@ -64,10 +69,10 @@
 +             if (!thread)
 +                 if (!(thread = get_thread_from_pid( pid ))) break;
 +             if (!(thread->process->suspend + thread->suspend))
 +-                ptrace( PTRACE_CONT, pid, 0, sig );
 ++                ptrace( PTRACE_CONT, pid, PTRACE_KEEPIP, sig );
 +             break;
 +         default:  /* ignore other signals for now */
 +-            ptrace( PTRACE_CONT, pid, 0, sig );
 ++            ptrace( PTRACE_CONT, pid, PTRACE_KEEPIP, sig );
 +             break;
 +         }
 +         if (signal && sig != signal) goto restart;
 +@@ -97,7 +102,7 @@
 + static int attach_thread( struct thread *thread )
 + {
 +     /* this may fail if the client is already being debugged */
 +-    if (!use_ptrace || (ptrace( PTRACE_ATTACH, thread->unix_pid, 0, 0 ) == -1)) return 0;
 ++    if (!use_ptrace || (ptrace( PTRACE_ATTACH, thread->unix_pid, PTRACE_KEEPIP, 0 ) == -1)) return 0;
 +     if (debug_level) fprintf( stderr, "ptrace: attached to pid %d\n", thread->unix_pid );
 +     thread->attached = 1;
 +     wait4_thread( thread, SIGSTOP );
 +@@ -114,7 +119,7 @@
 +     {
 +         wait4_thread( thread, SIGTERM );
 +         if (debug_level) fprintf( stderr, "ptrace: detaching from %d\n", thread->unix_pid );
 +-        ptrace( PTRACE_DETACH, thread->unix_pid, 0, SIGTERM );
 ++        ptrace( PTRACE_DETACH, thread->unix_pid, PTRACE_KEEPIP, SIGTERM );
 +         thread->attached = 0;
 +     }
 + }
 +@@ -137,7 +142,7 @@
 + {
 +     if (!thread->unix_pid) return;
 +     if (!thread->attached) kill( thread->unix_pid, SIGCONT );
 +-    else ptrace( PTRACE_CONT, thread->unix_pid, 0, SIGSTOP );
 ++    else ptrace( PTRACE_CONT, thread->unix_pid, PTRACE_KEEPIP, SIGSTOP );
 + }
 + 
 + /* read an int from a thread address space */
 --- /dev/null	Sun Nov 21 03:01:44 1999
 +++ patches/patch-bc	Sun Nov 14 06:10:19 1999
 @@ -0,0 +1,25 @@
 +Index: programs/regapi/README
 +@@ -60,7 +60,7 @@
 +   regRestorer.pl  - Will convert "cleaned" diff file into 
 +                     something "regapi-able"
 +   
 +-  regSet          - Will do the procedure explained herein 
 ++  regSet.sh       - Will do the procedure explained herein 
 +                     for the added key only.
 + 
 +   
 +@@ -72,12 +72,12 @@
 +   1 - Get a snapshot of your windows registry in before.reg, (regedit/export)
 +   2 - Install you're application,
 +   3 - Get a snapshot of your windows registry in after.reg.
 +-  4 - Invoke ./regSet.sh before.reg after.reg
 ++  4 - Invoke regSet.sh before.reg after.reg
 + 
 + 
 +   Adding key I have in a regedit export file (nothing to diff with...)
 +   ------------------------------------------
 +-  1 - Invoke ./regSet.sh /dev/null myRegistry.reg
 ++  1 - Invoke regSet.sh /dev/null myRegistry.reg
 + 
 +   regapi help
 +   -----------
 --- /dev/null	Sun Nov 21 03:01:44 1999
 +++ patches/patch-bd	Sun Nov 14 06:13:27 1999
 @@ -0,0 +1,7 @@
 +Index: winedefault.reg
 +@@ -1,4 +1,5 @@
 + # These entries must apparently exist in any win95-compatible registry.
 ++# (feed this to `regapi setValue' to install)
 + 
 + # Shell Folders. The purpose of these are pretty self-evident.
 + # Primarily used by installation programs and the Explorer.
 --- /dev/null	Sun Nov 21 03:02:10 1999
 +++ patches/patch-be	Sat Nov 20 12:58:40 1999
 @@ -0,0 +1,13 @@
 +Index: documentation/fonts
 +@@ -41,7 +41,10 @@
 + font tools that can convert them to the Type1 format but the 
 + quality of the resulting fonts is far from stellar. The other
 + way to use them is to get a font server capable of rendering 
 +-TrueType (Caldera has one).
 ++TrueType (Caldera has one, there also is the free Xfstt in
 ++Linux/X11/fonts on sunsite and mirrors, if you're on FreeBSD you
 ++can use the port in /usr/ports/x11-servers/Xfstt.  And there is
 ++xfsft which uses the freetype library, see documentation/ttfserver).
 + 
 + However, there is a possibility of the native TrueType support 
 + via FreeType renderer in the future (hint, hint :-)
 --- /dev/null	Sun Nov 21 03:02:27 1999
 +++ patches/patch-da	Fri Nov 19 17:27:46 1999
 @@ -0,0 +1,11 @@
 +--- server/ptrace.c.orig	Sun Nov 14 16:23:21 1999
 ++++ server/ptrace.c	Tue Nov 16 15:57:08 1999
 +@@ -12,2 +12,3 @@
 + #include <signal.h>
 ++#include <sys/types.h>
 + #include <sys/ptrace.h>
 +@@ -144,3 +145,3 @@
 + {
 +-    if (((*data = ptrace( PTRACE_PEEKDATA, thread->unix_pid, addr )) == -1) && errno)
 ++    if (((*data = ptrace( PTRACE_PEEKDATA, thread->unix_pid, addr, *data )) == -1) && errno)
 +     {
 --- /dev/null	Sun Nov 21 03:02:43 1999
 +++ patches/patch-db	Fri Nov 19 17:27:46 1999
 @@ -0,0 +1,6 @@
 +--- server/process.c.orig	Sun Nov 14 16:23:21 1999
 ++++ server/process.c	Tue Nov 16 15:51:55 1999
 +@@ -13,2 +13,3 @@
 + #include <stdlib.h>
 ++#include <sys/types.h>
 + #include <sys/ptrace.h>
 --- /dev/null	Sun Nov 21 03:14:28 1999
 +++ patches/patch-ea	Sun Nov 21 03:04:44 1999
 @@ -0,0 +1,88 @@
 +From: mohr@elektron.ikp.physik.tu-darmstadt.de (Andreas Mohr)
 +Newsgroups: local.list.wine.patches
 +Subject: profile fix
 +Date: 19 Nov 1999 11:47:40 +0100
 +Organization: home
 +Lines: 67
 +Message-ID: <199911190815.JAA16531@hertz.ikp.physik.tu-darmstadt.de>
 +Mime-Version: 1.0
 +Content-Type: multipart/mixed; boundary=ELM942999323-16505-0_
 +Content-Transfer-Encoding: 7bit
 +X-Resent-Date: Fri, 19 Nov 1999 01:15:36 -0700
 +X-To: wine-patches@winehq.com
 +X-Mailer: ELM [version 2.4ME+ PL47 (25)]
 +X-Resent-Message-ID: <gIikWB.A.V_.ocQN4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Reply-To: wine-devel@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2148
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +
 +--ELM942999323-16505-0_
 +Content-Type: text/plain; charset=US-ASCII
 +Content-Transfer-Encoding: 7bit
 +
 +Hi !
 +
 +OK, first Huw with the registry, now me with the profile handling :-\
 +
 +Fixed a gross bug in PROFILE_Open:
 +Before making a newly opened file the current profile, not only
 +the oldest profile should be flushed, but also the *old* current profile !!
 +
 +And nobody never ever found that bug. VERY strange...
 +
 +Andreas Mohr
 +
 +--ELM942999323-16505-0_
 +Content-Type: text/plain; charset=iso-8859-1
 +Content-Disposition: attachment; filename=diff.profile
 +Content-Description: /home/mohr/diff.profile
 +Content-Transfer-Encoding: 7bit
 +
 +Index: files/profile.c
 +===================================================================
 +RCS file: /home/wine/wine/files/profile.c,v
 +retrieving revision 1.15
 +diff -u -w -r1.15 profile.c
 +--- files/profile.c	1999/10/31 17:32:57	1.15
 ++++ files/profile.c	1999/11/19 08:07:49
 +@@ -373,6 +373,7 @@
 +         return FALSE;
 +     }
 + 
 ++	TRACE("Trying to flush %s. [%d]\n", CurProfile->dos_name, CurProfile->changed);
 +     if (!CurProfile->changed || !CurProfile->dos_name) return TRUE;
 +     if (!(unix_name = CurProfile->unix_name) || !(file = fopen(unix_name, "w")))
 +     {
 +@@ -494,8 +495,10 @@
 +          }
 +       }
 + 
 +-    /* Rotate the oldest to the top to be replaced */
 ++	/* Flush the old current profile */
 ++	PROFILE_FlushFile();
 + 
 ++    /* Make the oldest profile the current one only in order to get rid of it */
 +     if(i==N_CACHED_PROFILES)
 +       {
 +        tempProfile=MRUProfile[N_CACHED_PROFILES-1];
 +@@ -503,11 +506,9 @@
 +           MRUProfile[i]=MRUProfile[i-1];
 +        CurProfile=tempProfile;
 +       }
 +-
 +-    /* Flush the profile */
 +-
 +     if(CurProfile->filename) PROFILE_ReleaseFile();
 + 
 ++	/* OK, now that CurProfile is definitely free we assign it our new file */
 +     newdos_name = HEAP_strdupA( SystemHeap, 0, full_name.short_name );
 +     CurProfile->dos_name  = newdos_name;
 +     CurProfile->filename  = HEAP_strdupA( SystemHeap, 0, filename );
 +
 +--ELM942999323-16505-0_--
 +
 +---
 --- /dev/null	Sun Nov 21 03:14:42 1999
 +++ patches/patch-eb	Sun Nov 21 03:05:34 1999
 @@ -0,0 +1,57 @@
 +From: weigand@informatik.uni-erlangen.de (Ulrich Weigand)
 +Newsgroups: local.list.wine.patches
 +Subject: Bugfix: GetThreadSelectorEntry() and read-write flag
 +Date: 19 Nov 1999 00:37:52 +0100
 +Organization: home
 +Lines: 35
 +Message-ID: <199911181807.TAA00875@faui11.informatik.uni-erlangen.de>
 +MIME-Version: 1.0
 +Content-Type: text/plain; charset=US-ASCII
 +Content-Transfer-Encoding: 7bit
 +X-Resent-Date: Thu, 18 Nov 1999 11:07:48 -0700
 +X-To: wine-patches@winehq.com
 +X-Mailer: ELM [version 2.4 PL24]
 +X-Resent-Message-ID: <QXxWWB.A.n8C.zBEN4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Reply-To: wine-devel@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2142
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +
 +Hello,
 +
 +GetThreadSelectorEntry() reported read-only segments as read-write and
 +vice versa.  This caused a bug in native OLE thunking code, affecting
 +(at least) WinWord ...
 +
 +Bye,
 +Ulrich
 +
 +ChangeLog:
 +
 +	* memory/selector.c
 +	Bugfix: GetThreadSelectorEntry() sets read-write flag incorrectly.
 +
 +
 +Index: memory/selector.c
 +diff -ur wine-cvs/memory/selector.c wine-uw/memory/selector.c
 +--- wine-cvs/memory/selector.c	Wed Nov 17 15:51:16 1999
 ++++ wine-uw/memory/selector.c	Wed Nov 17 16:43:21 1999
 +@@ -621,7 +621,7 @@
 +     ldtent->HighWord.Bits.Sys = 0;
 +     ldtent->HighWord.Bits.Pres = 1;
 +     ldtent->HighWord.Bits.Type = 0x10|(ldtentry.type << 2);
 +-    if (ldtentry.read_only)
 ++    if (!ldtentry.read_only)
 +     	ldtent->HighWord.Bits.Type|=0x2;
 +     ldtent->HighWord.Bits.Granularity = ldtentry.limit_in_pages;
 +     ldtent->HighWord.Bits.Default_Big = ldtentry.seg_32bit;
 +
 +-- 
 +  Ulrich Weigand,
 +  IMMD 1, Universitaet Erlangen-Nuernberg,
 +  Martensstr. 3, D-91058 Erlangen, Phone: +49 9131 85-7688
 +
 +---
 --- /dev/null	Sun Nov 21 03:14:45 1999
 +++ patches/patch-ec	Sun Nov 21 03:06:04 1999
 @@ -0,0 +1,124 @@
 +From: mohr@elektron.ikp.physik.tu-darmstadt.de (Andreas Mohr)
 +Newsgroups: local.list.wine.patches
 +Subject: DISPLAY driver addition take 2
 +Date: 16 Nov 1999 19:33:02 +0100
 +Organization: home
 +Lines: 103
 +Message-ID: <199911161313.OAA13466@hertz.ikp.physik.tu-darmstadt.de>
 +MIME-Version: 1.0
 +Content-Type: multipart/mixed; boundary=ELM942758003-13460-0_
 +Content-Transfer-Encoding: 7bit
 +X-Resent-Date: Tue, 16 Nov 1999 06:13:37 -0700
 +X-To: wine-patches@winehq.com
 +X-Mailer: ELM [version 2.4ME+ PL47 (25)]
 +X-Resent-Message-ID: <sYNqV.A.goD.BiVM4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Reply-To: wine-devel@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2133
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +
 +--ELM942758003-13460-0_
 +Content-Type: text/plain; charset=US-ASCII
 +Content-Transfer-Encoding: 7bit
 +
 +Hi,
 +
 +add some ordinals and GetDriverResourceID().                                    
 +
 +And of course I added the info Huw gave :)
 +
 +Andreas Mohr
 +
 +--ELM942758003-13460-0_
 +Content-Type: text/plain; charset=iso-8859-1
 +Content-Disposition: attachment; filename=diff.display
 +Content-Description: /home/mohr/diff.display
 +Content-Transfer-Encoding: 7bit
 +
 +Index: if1632/display.spec
 +===================================================================
 +RCS file: /home/wine/wine/if1632/display.spec,v
 +retrieving revision 1.5
 +diff -u -w -r1.5 display.spec
 +--- if1632/display.spec	1999/05/23 09:18:30	1.5
 ++++ if1632/display.spec	1999/11/16 14:03:35
 +@@ -22,6 +22,24 @@
 + 19  stub DeviceBitmapBits
 + 20  stub CreateBitmap
 + 21  stub DIBScreenBlt
 ++
 ++# ATI driver exports
 ++22 stub SetPalette
 ++23 stub GetPalette
 ++24 stub SetPaletteTranslate
 ++25 stub GetPaletteTranslate
 ++26 stub UpdateColors
 ++27 stub StretchBlt
 ++28 stub StrechDIBits
 ++29 stub SelectBitmap
 ++30 stub BitmapBits
 ++31 stub ReEnable
 ++# these conflict with ordinals 19-21, thus relocated to 39-41 !
 ++39 stub DIBBlt
 ++40 stub CreateDIBitmap
 ++41 stub DIBToDevice
 ++# ATI driver end
 ++
 + 90  stub Do_Polylines
 + 91  stub Do_Scanlines
 + 92  stub SaveScreenBitmap
 +@@ -29,7 +47,14 @@
 + 102 pascal16 SetCursor(ptr) DISPLAY_SetCursor
 + 103 pascal16 MoveCursor(word word) DISPLAY_MoveCursor
 + 104 pascal16 CheckCursor() DISPLAY_CheckCursor
 ++400 stub PExtTextOut
 ++401 stub PStrBlt
 ++402 stub RExtTextOut
 ++403 stub RStrBlt
 ++450 pascal GetDriverResourceID(word str) DISPLAY_GetDriverResourceID
 + 500 pascal16 UserRepaintDisable(word) UserRepaintDisable16
 ++501 stub ORDINAL_ONLY1
 ++502 stub ORDINAL_ONLY2
 + 600 stub InkReady
 + 601 stub GetLPDevice
 + 
 +Index: windows/display.c
 +===================================================================
 +RCS file: /home/wine/wine/windows/display.c,v
 +retrieving revision 1.16
 +diff -u -w -r1.16 display.c
 +--- windows/display.c	1999/07/04 16:09:20	1.16
 ++++ windows/display.c	1999/11/16 14:03:35
 +@@ -50,6 +50,25 @@
 + }
 + 
 + /***********************************************************************
 ++ *           DISPLAY_GetDriverResourceID                  (DISPLAY.450)
 ++ *
 ++ * Used by USER to check if driver contains better version of a builtin
 ++ * resource than USER.
 ++ * wQueriedResID is the ID USER asks about.
 ++ * lpsResName might often contain "OEMBIN".
 ++ * For now we just let USER use its own resource.
 ++ */
 ++DWORD WINAPI DISPLAY_GetDriverResourceID( WORD wQueriedResID, LPSTR lpsResName )
 ++{
 ++    FIXME("Return the display resource ID\n" );
 ++
 ++	if (wQueriedResID == 3)
 ++		return (DWORD)wQueriedResID/*FIXME resourceID*/;
 ++
 ++	return (DWORD)wQueriedResID;
 ++}
 ++
 ++/***********************************************************************
 +  *           UserRepaintDisable			(DISPLAY.500)
 +  */
 + VOID WINAPI UserRepaintDisable16( BOOL16 disable )
 +
 +--ELM942758003-13460-0_--
 +
 +---
 --- /dev/null	Sun Nov 21 03:14:45 1999
 +++ patches/patch-ed	Sun Nov 21 03:06:29 1999
 @@ -0,0 +1,75 @@
 +From: mohr@elektron.ikp.physik.tu-darmstadt.de (Andreas Mohr)
 +Newsgroups: local.list.wine.patches
 +Subject: shlmenu fix
 +Date: 16 Nov 1999 19:32:35 +0100
 +Organization: home
 +Lines: 54
 +Message-ID: <199911161303.OAA13412@hertz.ikp.physik.tu-darmstadt.de>
 +MIME-Version: 1.0
 +Content-Type: multipart/mixed; boundary=ELM942757435-13379-0_
 +Content-Transfer-Encoding: 7bit
 +X-Resent-Date: Tue, 16 Nov 1999 06:04:08 -0700
 +X-To: wine-patches@winehq.com
 +X-Mailer: ELM [version 2.4ME+ PL47 (25)]
 +X-Resent-Message-ID: <JN9fkD.A.GjD.IZVM4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Reply-To: wine-devel@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2132
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +
 +--ELM942757435-13379-0_
 +Content-Type: text/plain; charset=US-ASCII
 +Content-Transfer-Encoding: 7bit
 +
 +Hi,
 +
 +SHFind_InitMenuPopup is supposed to return a pointer.
 +Makes my Explorer version happy again.
 +
 +Andreas Mohr
 +
 +--ELM942757435-13379-0_
 +Content-Type: text/plain; charset=iso-8859-1
 +Content-Disposition: attachment; filename=diff.shlmenu
 +Content-Description: /home/mohr/diff.shlmenu
 +Content-Transfer-Encoding: 7bit
 +
 +Index: dlls/shell32/shlmenu.c
 +===================================================================
 +RCS file: /home/wine/wine/dlls/shell32/shlmenu.c,v
 +retrieving revision 1.7
 +diff -u -w -r1.7 shlmenu.c
 +--- dlls/shell32/shlmenu.c	1999/10/13 12:28:25	1.7
 ++++ dlls/shell32/shlmenu.c	1999/11/16 13:55:36
 +@@ -764,15 +764,19 @@
 +  *
 +  *
 +  * PARAMETERS
 +- *  hMenu		[in] handel of menu previously created
 ++ *  hMenu		[in] handle of menu previously created
 +  *  hWndParent	[in] parent window
 +- *  w			[in] no pointer
 +- *  x			[in] no pointer
 ++ *  w			[in] no pointer (0x209 over here) perhaps menu IDs ???
 ++ *  x			[in] no pointer (0x226 over here)
 ++ *
 ++ * RETURNS
 ++ *  LPXXXXX			 pointer to struct containing a func addr at offset 8
 ++ *					 or NULL at failure.
 +  */
 +-HRESULT WINAPI SHFind_InitMenuPopup (HMENU hMenu, HWND hWndParent, DWORD w, DWORD x)
 ++LPVOID WINAPI SHFind_InitMenuPopup (HMENU hMenu, HWND hWndParent, DWORD w, DWORD x)
 + {	FIXME("hmenu=0x%08x hwnd=0x%08x 0x%08lx 0x%08lx stub\n",
 + 		hMenu,hWndParent,w,x);
 +-	return TRUE;
 ++	return NULL; /* this is supposed to be a pointer */
 + }
 + 
 + /*************************************************************************
 +
 +--ELM942757435-13379-0_--
 +
 +---
 --- /dev/null	Sun Nov 21 03:14:53 1999
 +++ patches/patch-ee	Sun Nov 21 03:06:59 1999
 @@ -0,0 +1,258 @@
 +From: rklazes@casema.net (Rein Klazes)
 +Newsgroups: local.list.wine.patches
 +Subject: 16 bits dialog patch.
 +Date: 16 Nov 1999 19:31:16 +0100
 +Organization: -++-
 +Lines: 232
 +Message-ID: <199911161137.EAA11876@ursula.gmcl.com>
 +MIME-Version: 1.0
 +Content-Type: multipart/mixed; boundary="--=_6UExOKVVL1eFPpiMs=Y5SwSVvDwS.MFSBCHJLHS"
 +X-Resent-Date: Tue, 16 Nov 1999 04:37:34 -0700
 +X-To: wine-patches@winehq.com
 +X-Mailer: Forte Agent 1.6/32.525
 +X-Resent-Message-ID: <ELvLED.A.u5C.-HUM4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Reply-To: wine-devel@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2131
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +
 +----=_6UExOKVVL1eFPpiMs=Y5SwSVvDwS.MFSBCHJLHS
 +Content-Type: text/plain; charset=us-ascii
 +Content-Transfer-Encoding: 7bit
 +
 +Hi,
 +
 +I have an application here that has stopped working since the
 +introduction of 32 bit message queues.
 +
 +The application breaks when it posts a WM_COMMAND message using
 +PostMessage16. 
 +
 +The message is received by a  GetMessage and dispatched by
 +DispatchMessageA in DIALOG_DoDialogBox(). However these are win32
 +functions and when calling the 16 bit dialogproc, a message
 +translation 32->16 bits is done which messes up the parameters.
 +
 +The patch corrects this in a trivial way by adding a parameter to
 +DIALOG_DoDialogBox() that flags whether 16 bits functions should be
 +used. 
 +
 +If there is a better way do fix this problem then let me know.
 +
 +Files:
 +./include/dialog.h
 +./windows/dialog.c
 +./dlls/commdlg/colordlg.c
 +./dlls/commdlg/filedlg.c
 +./dlls/commdlg/fontdlg.c
 +./dlls/commdlg/printdlg.c
 +
 +Changelog:
 +Correct handling of 16 bits messages in DIALOG_DoDialogBox()
 +
 +Rein.
 +-- 
 +Rein Klazes
 +rklazes@casema.net
 +
 +----=_6UExOKVVL1eFPpiMs=Y5SwSVvDwS.MFSBCHJLHS
 +Content-Type: text/plain; charset=us-ascii; name=dlg16.diff
 +Content-Transfer-Encoding: 7bit
 +Content-Disposition: attachment; filename=dlg16.diff
 +
 +Index: include/dialog.h
 +--- ./wine/./include/dialog.h	Sun Apr 25 14:36:53 1999
 ++++ ./mywine/./include/dialog.h	Tue Nov 16 11:49:40 1999
 +@@ -43,6 +43,6 @@
 +                                      BOOL win32Template, HWND owner,
 +                                      DLGPROC16 dlgProc, LPARAM param,
 +                                      WINDOWPROCTYPE procType );
 +-extern INT DIALOG_DoDialogBox( HWND hwnd, HWND owner );
 ++extern INT DIALOG_DoDialogBox( HWND hwnd, HWND owner, BOOL iswin16);
 + 
 + #endif  /* __WINE_DIALOG_H */
 +Index: windows/dialog.c
 +--- ./wine/./windows/dialog.c	Sun Nov  7 22:02:17 1999
 ++++ ./mywine/./windows/dialog.c	Tue Nov 16 11:50:43 1999
 +@@ -22,6 +22,7 @@
 + #include "winproc.h"
 + #include "message.h"
 + #include "debugtools.h"
 ++#include "struct32.h"
 + 
 + DEFAULT_DEBUG_CHANNEL(dialog)
 + 
 +@@ -929,7 +930,7 @@
 + /***********************************************************************
 +  *           DIALOG_DoDialogBox
 +  */
 +-INT DIALOG_DoDialogBox( HWND hwnd, HWND owner )
 ++INT DIALOG_DoDialogBox( HWND hwnd, HWND owner, BOOL iswin16 )
 + {
 +     WND * wndPtr;
 +     DIALOGINFO * dlgInfo;
 +@@ -948,11 +949,24 @@
 +         while (MSG_InternalGetMessage(&msg, hwnd, owner, MSGF_DIALOGBOX, 
 +                                       PM_REMOVE, !(wndPtr->dwStyle & DS_NOIDLEMSG), NULL ))
 +         {
 +-            if (!IsDialogMessageA( hwnd, &msg))
 ++            if(iswin16)
 +             {
 +-                TranslateMessage( &msg );
 +-                DispatchMessageA( &msg );
 ++                MSG16 msg16;
 ++                
 ++                STRUCT32_MSG32to16( &msg, &msg16 );
 ++
 ++                if (!IsDialogMessage16( hwnd, &msg16))
 ++                {
 ++                    TranslateMessage16( &msg16 );
 ++                    DispatchMessage16( &msg16 );
 ++                }
 +             }
 ++            else
 ++                if (!IsDialogMessageA( hwnd, &msg))
 ++                {
 ++                    TranslateMessage( &msg );
 ++                    DispatchMessageA( &msg );
 ++                }
 +             if (dlgInfo->flags & DF_END) break;
 +         }
 +         EnableWindow( owner, TRUE );
 +@@ -981,7 +995,7 @@
 +                                HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
 + {
 +     HWND16 hwnd = CreateDialogParam16( hInst, template, owner, dlgProc, param);
 +-    if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner );
 ++    if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner, TRUE );
 +     return -1;
 + }
 + 
 +@@ -993,7 +1007,7 @@
 +                                 HWND owner, DLGPROC dlgProc, LPARAM param )
 + {
 +     HWND hwnd = CreateDialogParamA( hInst, name, owner, dlgProc, param );
 +-    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
 ++    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner , FALSE);
 +     return -1;
 + }
 + 
 +@@ -1005,7 +1019,7 @@
 +                                 HWND owner, DLGPROC dlgProc, LPARAM param )
 + {
 +     HWND hwnd = CreateDialogParamW( hInst, name, owner, dlgProc, param );
 +-    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
 ++    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner, FALSE);
 +     return -1;
 + }
 + 
 +@@ -1033,7 +1047,7 @@
 +     if (!(ptr = GlobalLock16( dlgTemplate ))) return -1;
 +     hwnd = CreateDialogIndirectParam16( hInst, ptr, owner, dlgProc, param );
 +     GlobalUnlock16( dlgTemplate );
 +-    if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner );
 ++    if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner, TRUE );
 +     return -1;
 + }
 + 
 +@@ -1047,7 +1061,7 @@
 + {
 +     HWND hwnd = CreateDialogIndirectParamA( hInstance, template,
 +                                                 owner, dlgProc, param );
 +-    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
 ++    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner, FALSE );
 +     return -1;
 + }
 + 
 +@@ -1061,7 +1075,7 @@
 + {
 +     HWND hwnd = CreateDialogIndirectParamW( hInstance, template,
 +                                                 owner, dlgProc, param );
 +-    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
 ++    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner, FALSE );
 +     return -1;
 + }
 + 
 +Index: dlls/commdlg/colordlg.c
 +--- ./wine/./dlls/commdlg/colordlg.c	Sat Jul 24 12:27:58 1999
 ++++ ./mywine/./dlls/commdlg/colordlg.c	Tue Nov 16 10:18:12 1999
 +@@ -108,7 +108,8 @@
 +                                         lpChCol->hwndOwner,
 +                                         (DLGPROC16)ColorDlgProc,
 +                                         (DWORD)lpChCol, WIN_PROC_32A );
 +-    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpChCol->hwndOwner);
 ++    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpChCol->hwndOwner,
 ++            TRUE);
 +     if (hDlgTmpl) FreeResource16( hDlgTmpl );
 + 
 +     return bRet;
 +Index: dlls/commdlg/filedlg.c
 +--- ./wine/./dlls/commdlg/filedlg.c	Wed Oct 13 15:51:57 1999
 ++++ ./mywine/./dlls/commdlg/filedlg.c	Tue Nov 16 10:21:52 1999
 +@@ -251,7 +251,7 @@
 +                                         lpofn->hwndOwner,
 +                                         (DLGPROC16)FileOpenDlgProc,
 +                                         ofn, WIN_PROC_32A );
 +-    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
 ++    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner, TRUE );
 + 
 +     if (str1)
 +       {
 +@@ -413,7 +413,7 @@
 +                                         lpofn->hwndOwner,
 +                                         (DLGPROC16)FileSaveDlgProc,
 +                                         ofn, WIN_PROC_32A );
 +-    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
 ++    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner, TRUE );
 + 
 +     if (str1)
 +       {
 +Index: dlls/commdlg/fontdlg.c
 +--- ./wine/./dlls/commdlg/fontdlg.c	Sat Jul 24 12:27:58 1999
 ++++ ./mywine/./dlls/commdlg/fontdlg.c	Tue Nov 16 10:23:04 1999
 +@@ -124,7 +124,7 @@
 +                                         lpChFont->hwndOwner,
 +                                         (DLGPROC16)FormatCharDlgProcA,
 +                                         (DWORD)lpChFont, WIN_PROC_32A );
 +-    if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
 ++    if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner, TRUE);
 +     if (hDlgTmpl) FreeResource16( hDlgTmpl );
 +     lpChFont->lpTemplateName=lpTemplateName;
 +     FONT_LogFont32ATo16(cf32a.lpLogFont, 
 +@@ -160,7 +160,7 @@
 +     CF_ENABLETEMPLATEHANDLE)) FIXME(": unimplemented flag (ignored)\n");
 +   hwndDialog = DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
 +             (DLGPROC16)FormatCharDlgProcA, (LPARAM)lpChFont, WIN_PROC_32A );
 +-  if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);  
 ++  if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner, TRUE);  
 +   return bRet;
 + }
 + 
 +@@ -199,7 +199,7 @@
 +   lpChFont->lpTemplateName=(LPWSTR)&cf32a;
 +   hwndDialog=DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
 +             (DLGPROC16)FormatCharDlgProcW, (LPARAM)lpChFont, WIN_PROC_32W );
 +-  if (hwndDialog)bRet=DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);  
 ++  if (hwndDialog)bRet=DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner, TRUE);  
 +   HeapFree(GetProcessHeap(), 0, cf32a.lpszStyle);
 +   lpChFont->lpTemplateName=(LPWSTR)cf32a.lpTemplateName;
 +   memcpy(lpChFont->lpLogFont, &lf32a, sizeof(CHOOSEFONTA));
 +Index: dlls/commdlg/printdlg.c
 +--- ./wine/./dlls/commdlg/printdlg.c	Sun Nov 14 08:08:30 1999
 ++++ ./mywine/./dlls/commdlg/printdlg.c	Tue Nov 16 10:23:35 1999
 +@@ -288,7 +288,7 @@
 +             (DLGPROC16)PrintDlgProcA, (LPARAM)&PrintStructures, WIN_PROC_32A );
 +         }
 +     if (hwndDialog) 
 +-        bRet = DIALOG_DoDialogBox(hwndDialog, lppd->hwndOwner);  
 ++        bRet = DIALOG_DoDialogBox(hwndDialog, lppd->hwndOwner, TRUE);  
 +      
 +     /* free memory & resources
 +      */   
 +
 +----=_6UExOKVVL1eFPpiMs=Y5SwSVvDwS.MFSBCHJLHS--
 +
 +---
 --- /dev/null	Sun Nov 21 03:14:53 1999
 +++ patches/patch-ef	Sun Nov 21 03:07:36 1999
 @@ -0,0 +1,139 @@
 +From: juergen.schmied@debitel.net ("Juergen Schmied")
 +Newsgroups: local.list.wine.patches
 +Subject: some bugs in filedlg
 +Date: 15 Nov 1999 21:36:25 +0100
 +Organization: at home
 +Lines: 118
 +Message-ID: <19991115194143.22977.qmail@psmtp1.dnsg.net>
 +Mime-Version: 1.0
 +Content-Type: Multipart/Mixed; boundary=Message-Boundary-2348
 +X-Resent-Date: Mon, 15 Nov 1999 12:41:54 -0700
 +X-To: wine-patches@winehq.com
 +X-Reply-to: juergen.schmied@debitel.net
 +X-Priority: normal
 +X-Mailer: Pegasus Mail for Win32 (v3.11)
 +X-Resent-Message-ID: <4zm7fB.A.roD.CIGM4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2128
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +
 +--Message-Boundary-2348
 +Content-type: text/plain; charset=US-ASCII
 +Content-transfer-encoding: 7BIT
 +Content-description: Mail message body
 +
 +[dlls/commdlg/filedlg95.c]
 +- the fodInfos were used before initialized
 +- lpTemplateName can be a resource id
 +- if lpTemplateName is a string don't free the original one
 +
 +---
 +the first one caused a chrash accessing a low memory address, 
 +the second one a heap error while MemFree and a possible chrash 
 +when using the unicode version, the third one could possibly cause 
 +a crash in the app later ...
 +
 +Happy crashing..... ;-))))
 +
 +PS: now the "Message Save" of Agent dialog works but look 
 +strange due to wrong control positions...
 +
 +juergen
 + 
 +
 +---
 +juergen.schmied@debitel.net
 +
 +... from sunny Berlin
 +
 +
 +--Message-Boundary-2348
 +Content-type: text/plain; charset=US-ASCII
 +Content-transfer-encoding: 7BIT
 +Content-description: Text from file '991115.dif'
 +
 +Index: dlls/commdlg/filedlg95.c
 +===================================================================
 +RCS file: /home/wine/wine/dlls/commdlg/filedlg95.c,v
 +retrieving revision 1.18
 +diff -u -r1.18 filedlg95.c
 +--- wine/dlls/commdlg/filedlg95.c	1999/11/14 21:29:24	1.18
 ++++ wine/dlls/commdlg/filedlg95.c	1999/11/15 20:10:51
 +@@ -281,8 +281,14 @@
 +   fodInfos->ofnInfos.lCustData = ofn->lCustData;
 +   fodInfos->ofnInfos.lpfnHook = (LPOFNHOOKPROC)ofn->lpfnHook;
 + 
 +-  if (ofn->lpTemplateName)
 ++  if HIWORD(ofn->lpTemplateName)
 +   {
 ++      fodInfos->ofnInfos.lpTemplateName = MemAlloc(strlen(ofn->lpTemplateName)+1);
 ++      strcpy ((LPSTR)fodInfos->ofnInfos.lpTemplateName, ofn->lpTemplateName);
 ++  }
 ++  else
 ++  {
 ++      /* resource id */
 +       fodInfos->ofnInfos.lpTemplateName = ofn->lpTemplateName;
 +   }
 + 
 +@@ -321,7 +327,7 @@
 + 
 +   if (fodInfos->ofnInfos.lpstrFilter)
 +       MemFree((LPVOID)(fodInfos->ofnInfos.lpstrFilter));
 +-  if (fodInfos->ofnInfos.lpTemplateName)
 ++  if  HIWORD(fodInfos->ofnInfos.lpTemplateName)
 +       MemFree((LPVOID)(fodInfos->ofnInfos.lpTemplateName));
 +   if (fodInfos->ofnInfos.lpstrDefExt)
 +       MemFree((LPVOID)(fodInfos->ofnInfos.lpstrDefExt));
 +@@ -441,11 +447,17 @@
 +   }
 +   fodInfos->ofnInfos.lCustData = ofn->lCustData;
 +   fodInfos->ofnInfos.lpfnHook = (LPOFNHOOKPROC)ofn->lpfnHook;
 +-  if (ofn->lpTemplateName) 
 ++
 ++  if HIWORD(ofn->lpTemplateName) 
 +   { 
 +     fodInfos->ofnInfos.lpTemplateName = (LPSTR)MemAlloc(lstrlenW(ofn->lpTemplateName)+1);
 +     lstrcpyWtoA((LPSTR)fodInfos->ofnInfos.lpTemplateName,ofn->lpTemplateName);
 +   }
 ++  else
 ++  {
 ++      /* resource id */
 ++      fodInfos->ofnInfos.lpTemplateName = (LPSTR)ofn->lpTemplateName;
 ++  }
 +   /* Initialise the dialog property */
 +   fodInfos->DlgInfos.dwDlgProp = 0;
 +   
 +@@ -816,10 +828,14 @@
 +  */
 + HRESULT WINAPI FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 + {
 +-
 +   switch(uMsg)
 +   {
 +     case WM_INITDIALOG :
 ++
 ++         /* Adds the FileOpenDlgInfos in the property list of the dialog 
 ++            so it will be easily accessible through a GetPropA(...) */
 ++      	 SetPropA(hwnd, FileOpenDlgInfosStr, (HANDLE) lParam);
 ++
 +       	 ((FileOpenDlgInfos *)lParam)->DlgInfos.hwndCustomDlg = 
 +      	CreateTemplateDialog((FileOpenDlgInfos *)lParam,hwnd);
 +       	 FILEDLG95_OnWMInitDialog(hwnd, wParam, lParam);
 +@@ -862,10 +878,6 @@
 +   FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) lParam;
 + 
 +   TRACE("\n");
 +-
 +-  /* Adds the FileOpenDlgInfos in the property list of the dialog 
 +-     so it will be easily accessible through a GetPropA(...) */
 +-  SetPropA(hwnd, FileOpenDlgInfosStr, (HANDLE) fodInfos);
 + 
 +   /* Make sure the common control DLL is loaded */      
 +   InitCommonControls();
 +
 +--Message-Boundary-2348--
 +
 +---
 --- /dev/null	Sun Nov 21 03:14:53 1999
 +++ patches/patch-eg	Sun Nov 21 03:08:08 1999
 @@ -0,0 +1,60 @@
 +From: juergen.schmied@debitel.net ("Juergen Schmied")
 +Newsgroups: local.list.wine.patches
 +Subject: filedlg - one more
 +Date: 16 Nov 1999 00:11:58 +0100
 +Organization: at home
 +Lines: 27
 +Message-ID: <19991115215001.16292.qmail@psmtp2.dnsg.net>
 +Mime-Version: 1.0
 +Content-Type: text/plain; charset=US-ASCII
 +Content-Transfer-Encoding: 7BIT
 +NNTP-Posting-Date: 15 Nov 1999 23:12:03 GMT
 +X-Resent-Date: Mon, 15 Nov 1999 14:50:22 -0700
 +X-To: wine-patches@winehq.com
 +X-Reply-to: juergen.schmied@debitel.net
 +X-Priority: normal
 +X-Mailer: Pegasus Mail for Win32 (v3.11)
 +X-Resent-Message-ID: <9rUtNC.A.eLF.eAIM4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2129
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +I forgot one place:
 +
 +can you pls. change in 
 +
 +dlls/commdlg/filedlg95.c
 +
 +function  GetFileDialog95W()
 +
 +from
 +
 +  if (fodInfos->ofnInfos.lpTemplateName)
 +    MemFree((LPVOID)(fodInfos->ofnInfos.lpTemplateName));
 +to
 +
 +  if HIWORD (fodInfos->ofnInfos.lpTemplateName)
 +    MemFree((LPVOID)(fodInfos->ofnInfos.lpTemplateName));
 +
 +Bye
 +
 +juergen
 +
 +---
 +juergen.schmied@debitel.net
 +
 +... from sunny Berlin
 +
 +---
 +Index: dlls/commdlg/filedlg95.c
 +@@ -486,7 +486,7 @@
 + 
 +   if (fodInfos->ofnInfos.lpstrFilter)
 +     MemFree((LPVOID)(fodInfos->ofnInfos.lpstrFilter));
 +-  if (fodInfos->ofnInfos.lpTemplateName)
 ++  if (HIWORD(fodInfos->ofnInfos.lpTemplateName))
 +     MemFree((LPVOID)(fodInfos->ofnInfos.lpTemplateName));
 +   if (fodInfos->ofnInfos.lpstrDefExt)
 +     MemFree((LPVOID)(fodInfos->ofnInfos.lpstrDefExt));
 --- /dev/null	Sun Nov 21 03:15:03 1999
 +++ patches/patch-eh	Sun Nov 21 03:08:41 1999
 @@ -0,0 +1,367 @@
 +From: tomasek@etf.cuni.cz (Petr Tomasek)
 +Newsgroups: local.list.wine.patches
 +Subject: Auto reading of labels & serial numbers. (fwd)
 +Date: 15 Nov 1999 21:22:36 +0100
 +Organization: home
 +Lines: 295
 +Message-ID: <Pine.LNX.4.04.9911151313350.2292-200000@ebed.etf.cuni.cz>
 +Mime-Version: 1.0
 +Content-Type: MULTIPART/MIXED; BOUNDARY="1908605701-2102248834-942667042=:1411"
 +Content-ID: <Pine.LNX.4.04.9911151313351.2292@ebed.etf.cuni.cz>
 +X-Resent-Date: Mon, 15 Nov 1999 05:16:28 -0700
 +X-To: wine-patches@winehq.com
 +X-Resent-Message-ID: <z4vwk.A.na.cm_L4@ursula.gmcl.com>
 +X-Resent-From: wine-patches@winehq.com
 +X-Reply-To: wine-devel@winehq.com
 +X-Mailing-List: <wine-patches@winehq.com> archive/latest/2126
 +X-Loop: wine-patches@winehq.com
 +X-Precedence: list
 +X-Resent-Sender: wine-patches-request@winehq.com
 +
 +
 +Hello!
 +
 +I've made a patch, that allows wine to read labels and
 +serial numbers directly from the device (no more having to
 +be specified in the wine.conf file).
 +
 +For doc see Documentation/labels-and-serial-numbers.
 +
 +One more issue: I had to create procedure named
 +'PROFILE_ExistWineString' (in profile.c), that checks,
 +whether certain entry exists in the wine.conf. You may want
 +to change its name to something better....
 +
 +Best Wishes
 +
 +Petr Tomasek
 +
 +BTW, could I be informed, whether the patch was accepted to
 +the CVS /Wine release? Thanks!
 +
 +
 +--
 +Petr Tomasek, http://www.etf.cuni.cz/~tomasek/
 +
 +Index: documentation/cdrom-labels
 +diff -ruN wine-991031/documentation/cdrom-labels wine-991031-new/documentation/cdrom-labels
 +--- wine-991031/documentation/cdrom-labels	Sun Jun  6 19:28:20 1999
 ++++ wine-991031-new/documentation/cdrom-labels	Sun Nov 14 14:41:08 1999
 +@@ -1,3 +1,7 @@
 +++-----------------------------------------------------------------------------+
 ++| This doc is obsolate now. See 'labels-and-serial-nubmers' for current info. |
 +++-----------------------------------------------------------------------------+
 ++
 + *** VOLUME LABEL
 + 
 + If a program depends on the correct label and/or serial number for the
 +Index: documentation/lables-and-serial-nubers
 +diff -ruN wine-991031/documentation/lables-and-serial-nubers wine-991031-new/documentation/lables-and-serial-nubers
 +--- documentation/lables-and-serial-nubers	Thu Jan  1 01:00:00 1970
 ++++ documentation/lables-and-serial-nubers	Sun Nov 14 16:12:01 1999
 +@@ -0,0 +1,88 @@
 ++[FIXME - can someone translate this into (real) english? :)) ]
 ++[FIXME - update the 'Documentation/config' accordingly]
 ++
 ++
 ++		Drive Labels and Serial Numbers with wine.
 ++		-----------------------------------------
 ++
 ++	Until now, You had to specify drive labels and serial numbers in wine 
 ++config file manually. For now, wine can read them directly from the device.
 ++	This may be usefull mainly for programs distributed on CD-Roms, that
 ++check for volume label at the setup or when accesing the disc.  
 ++
 ++WHAT'S SUPPORTED ?
 ++
 ++    *	FAT systems (types 'hd' and 'floppy'): reads labels and serial num's.
 ++    * 	Iso9660 ('cdrom'):                     reads labels only.
 ++
 ++HOW TO SET UP ?
 ++
 ++	There are two ways: You can either set 'ReadLabelFromDevice=' and
 ++'ReadSerialFromDevice=' in [Drive X] section in Your wine.conf (~/.winerc) 
 ++to 'true' or 'false', if want to disable/enable reading label/serial number
 ++from the device for this drive. Note, that you have to have specified 'Device' 
 ++and appropriate 'Type' entries!
 ++
 ++	If 'ReadLabelFromDevice' and/or 'ReadSerialFromDevice' unspecified, wine
 ++tries to find out, whether to read labels/serial num's from device by itself.
 ++It will read them when 'Device' and 'Type' entries specified correctly and 
 ++appropriate 'Label'/'Serial' section is NOT specified. (In other words 
 ++specifying 'Label'/'Serial' will cause wine to use specified value rather, 
 ++than reading it from the device).
 ++
 ++
 ++EXAMPLES
 ++
 ++*** Simple example of cdrom and floppy; labels will be read from the device on 
 ++both, cdrom and floppy; serial numbers on floppy only:
 ++
 ++[Drive A]
 ++Path=/mnt/floppy
 ++Type=floppy
 ++Device=/dev/fd0
 ++Filesystem=msdos
 ++
 ++[Drive R]
 ++Path=/mnt/cdrom
 ++Type=cdrom
 ++Device=/dev/hda1
 ++Filesystem=win95
 ++
 ++*** Cdrom. We want to override the label:
 ++
 ++[Drive J]
 ++Path=/mnt/cdrom
 ++Type=cdrom
 ++Label=X234GCDSE
 ++Device=/dev/cdrom
 ++Filesystem=msdos
 ++
 ++*** This is a bit tricky example. It will read label and serial number from the 
 ++ZIP disk; if this fails (no ZIP disk in drive/ acces denied to the device /
 ++the disk is not formatted as FAT), it will fall back to the specified values.
 ++
 ++[Drive D]
 ++Path=/mnt/zip
 ++Type=hd
 ++Label=*Unknown*
 ++ReadLabelFromDevice=true
 ++Serial=00000000
 ++ReadSerialFromDevice=true
 ++Device=/dev/hdc4
 ++Filesystem=msdos
 ++
 ++
 ++TODO / OPEN ISSUES
 ++
 ++ - The cdrom-label can be read only if the data track of the disk resides in 
 ++the first track and the cdrom is iso9660.
 ++ - Better checking for FAT superblock (it now check's only one byte).
 ++ - Support for labels/serial num's WRITING.
 ++ - Can the label be longer than 11 chars? (iso9660 has 32 chars).
 ++ - What about reading ext2 volume label? ....
 ++
 ++
 ++					Petr Tomasek
 ++					<tomasek@etf.cuni.cz>
 ++					Nov 14 1999
 ++
 +Index: files/drive.c
 +diff -ruN wine-991031/files/drive.c wine-991031-new/files/drive.c
 +--- wine-991031/files/drive.c	Wed Oct 13 15:57:38 1999
 ++++ wine-991031-new/files/drive.c	Sun Nov 14 16:42:45 1999
 +@@ -3,6 +3,10 @@
 +  *
 +  * Copyright 1993 Erik Bos
 +  * Copyright 1996 Alexandre Julliard
 ++ *
 ++ * Label & Serial-number read support. 
 ++ *  (c) 1999 Petr Tomasek <tomasek@etf.cuni.cz> 
 ++ *
 +  */
 + 
 + #include "config.h"
 +@@ -59,6 +63,8 @@
 +     UINT    flags;     /* drive flags */
 +     dev_t     dev;       /* unix device number */
 +     ino_t     ino;       /* unix inode number */
 ++    int       read_label;   /* should disk label be read from device ? */
 ++    int	      read_serial;  /* should serial number be read ? */
 + } DOSDRIVE;
 + 
 + 
 +@@ -187,6 +193,25 @@
 +                                       buffer, sizeof(buffer) );
 +             drive->serial = strtoul( buffer, NULL, 16 );
 + 
 ++	    /* Should the label be read directly from the device ? */
 ++            drive->read_label=
 ++	       ((drive->type==TYPE_FLOPPY) ||
 ++                 (drive->type==TYPE_HD) ||
 ++                 (drive->type==TYPE_CDROM)) &&
 ++		(PROFILE_ExistWineString(  name, "Device")) &&
 ++	          (PROFILE_ExistWineString(name, "ReadLabelFromDevice") ?
 ++                  PROFILE_GetWineIniBool(name, "ReadLabelFromDevice", 1) : 
 ++    	            (!PROFILE_ExistWineString(  name, "Label")));
 ++
 ++	    /* Should the serial number be read from the device ? */
 ++            drive->read_serial=
 ++	       ((drive->type==TYPE_FLOPPY) ||
 ++                 (drive->type==TYPE_HD)) &&
 ++		(PROFILE_ExistWineString( name, "Device")) &&
 ++	          (PROFILE_ExistWineString(name, "ReadSerialFromDevice") ?
 ++                  PROFILE_GetWineIniBool(name, "ReadSerialFromDevice", 1) : 
 ++                    (!PROFILE_ExistWineString( name, "Serial")));
 ++
 +             /* Get the filesystem type */
 +             PROFILE_GetWineIniString( name, "Filesystem", "win95",
 +                                       buffer, sizeof(buffer) );
 +@@ -207,6 +232,8 @@
 +                            name, path, DRIVE_Types[drive->type],
 +                            drive->label, drive->serial, drive->flags,
 +                            (int)drive->dev, (int)drive->ino );
 ++	    TRACE_(dosfs)("%s: label ? %d , serial ? %d\n",name,
 ++			   drive->read_label, drive->read_serial);
 +         }
 +         else WARN_(dosfs)("%s: not defined\n", name );
 +     }
 +@@ -395,11 +422,80 @@
 + 
 + 
 + /***********************************************************************
 ++ *           DRIVE_ReadFatSuperblock
 ++ *
 ++ * Used in DRIVE_GetLabel and DRIVE_GetSerial
 ++ */
 ++int DRIVE_ReadFatSuperblock (char * dev, char * buff) 
 ++{
 ++int fd;
 ++#define DRIVE_SUPER 96  /* Number of bytes read from the superblock */
 ++
 ++if (memset(buff,0,DRIVE_SUPER)!=buff) return -1;
 ++if ((fd=open(dev,O_RDONLY))==-1) return -1;
 ++if (read(fd,buff,DRIVE_SUPER)!=DRIVE_SUPER) return -2;
 ++if (buff[0x26]!=0x29)  return -3;   /* Check for FAT present */ 
 ++return close (fd);
 ++}
 ++
 ++
 ++/***********************************************************************
 ++ *           DRIVE_ReadIso9660Superblock
 ++ *
 ++ * Used in DRIVE_GetLabel
 ++ */
 ++int DRIVE_ReadIso9660Superblock (char * dev, char * buff) 
 ++{
 ++int block=0;   
 ++/* FIXME: Maybe we should search for the first data track on the CD,
 ++    not just assume, that it is the first track. */
 ++int fd;
 ++off_t offset;
 ++offset=(off_t)2048*(16+block);
 ++
 ++if (memset(buff,0,DRIVE_SUPER)!=buff) return -1;
 ++if ((fd=open(dev,O_RDONLY))==-1) return -1;
 ++if (lseek(fd,offset,SEEK_SET)!=offset) return -4;
 ++if (read(fd,buff,DRIVE_SUPER)!=DRIVE_SUPER) return -2;
 ++if (strncmp(&buff[1],"CD001",5)) return -3;   /* Check for iso9660 present */
 ++return close (fd);
 ++
 ++}
 ++
 ++
 ++
 ++/***********************************************************************
 +  *           DRIVE_GetLabel
 +  */
 + const char * DRIVE_GetLabel( int drive )
 + {
 ++char buff[DRIVE_SUPER];
 ++
 +     if (!DRIVE_IsValid( drive )) return NULL;
 ++    if (DOSDrives[drive].read_label) {
 ++      if ((DOSDrives[drive].type == TYPE_FLOPPY) ||
 ++          (DOSDrives[drive].type == TYPE_HD)) {
 ++	if (DRIVE_ReadFatSuperblock(DOSDrives[drive].device,(char *) buff))
 ++           
 ++	  MESSAGE("Invalid or unreadable superblock on %s (%c:)."
 ++             " Maybe not FAT?\n" ,DOSDrives[drive].device,(char)(drive+'A'));
 ++	else {
 ++		memcpy(DOSDrives[drive].label,buff+0x2b,11);
 ++		DOSDrives[drive].label[11]='\0';
 ++	 }
 ++       }
 ++      if (DOSDrives[drive].type == TYPE_CDROM) {
 ++	if (DRIVE_ReadIso9660Superblock(DOSDrives[drive].device,(char *) buff))
 ++           
 ++	  MESSAGE("Invalid or unreadable superblock on %s (%c:)."
 ++           " Maybe not Iso9660?\n" ,DOSDrives[drive].device,(char)(drive+'A'));
 ++	else {
 ++/* FIXME: Iso9660 uses 32-bytes long label. Should we do also? */
 ++		memcpy(DOSDrives[drive].label,buff+40,11);
 ++		DOSDrives[drive].label[11]='\0';
 ++	 }
 ++       }
 ++     }
 +     return DOSDrives[drive].label;
 + }
 + 
 +@@ -409,7 +505,19 @@
 +  */
 + DWORD DRIVE_GetSerialNumber( int drive )
 + {
 ++char buff[DRIVE_SUPER];
 ++
 +     if (!DRIVE_IsValid( drive )) return 0;
 ++    if (DOSDrives[drive].read_serial)
 ++      if ((DOSDrives[drive].type == TYPE_FLOPPY) ||
 ++          (DOSDrives[drive].type == TYPE_HD)) {
 ++	if (DRIVE_ReadFatSuperblock(DOSDrives[drive].device,(char *) buff))
 ++           
 ++	  MESSAGE("Invalid or unreadable superblock on %s (%c:)."
 ++             " Maybe not FAT?\n" ,DOSDrives[drive].device,(char)(drive+'A'));
 ++	else 
 ++	DOSDrives[drive].serial=*((DWORD*)(buff+0x27));
 ++       }
 +     return DOSDrives[drive].serial;
 + }
 + 
 +Index: files/profile.c
 +diff -ruN wine-991031/files/profile.c wine-991031-new/files/profile.c
 +--- wine-991031/files/profile.c	Sun Oct 31 18:32:57 1999
 ++++ wine-991031-new/files/profile.c	Sat Nov 13 20:37:29 1999
 +@@ -708,6 +708,27 @@
 + 
 + 
 + /***********************************************************************
 ++ *           PROFILE_ExistWineString
 ++ *
 ++ * Tests for tags in the wine.ini file. 
 ++ */
 ++int PROFILE_ExistWineString ( const char *section, const char *key_name)
 ++{
 ++
 ++    int	ret;
 ++
 ++    EnterCriticalSection( &PROFILE_CritSect );
 ++
 ++ret=(PROFILE_Find(&PROFILE_WineProfile, section, key_name, FALSE)!=NULL);
 ++
 ++    LeaveCriticalSection( &PROFILE_CritSect );
 ++
 ++    return ret;
 ++}
 ++
 ++
 ++
 ++/***********************************************************************
 +  *           PROFILE_GetWineIniString
 +  *
 +  * Get a config string from the wine.ini file.
 +Index: include/options.h
 +diff -ruN wine-991031/include/options.h wine-991031-new/include/options.h
 +--- wine-991031/include/options.h	Fri Jul 23 21:19:56 1999
 ++++ wine-991031-new/include/options.h	Sat Nov 13 20:38:31 1999
 +@@ -83,6 +83,7 @@
 + 
 + /* Profile functions */
 + 
 ++extern int PROFILE_ExistWineString( const char *section ,const char *key_name);
 + extern int PROFILE_LoadWineIni(void);
 + extern void PROFILE_UsageWineIni(void);
 + extern int PROFILE_GetWineIniString( const char *section, const char *key_name,
 +Index: libtest/volinfo.c
 +diff -ruN wine-991031/libtest/volinfo.c wine-991031-new/libtest/volinfo.c
 +--- wine-991031/libtest/volinfo.c	Sat Apr  3 15:52:04 1999
 ++++ wine-991031-new/libtest/volinfo.c	Sun Nov 14 05:59:18 1999
 +@@ -13,7 +13,7 @@
 + 
 +     printf("Drive Serial     Flags      Filename-Length "
 +            "Label                 Fsname\n");
 +-    for (drive = 'C'; drive <= 'Z'; drive++)
 ++    for (drive = 'A'; drive <= 'Z'; drive++)
 +     {
 +         root[0] = drive;
 +         if (GetVolumeInformation(root,label,labellen,&serial,
 -- 
 Juergen Lock <nox.foo@jelal.kn-bremen.de>
 (remove dot foo from address to reply)
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199911212210.OAA07390>