Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
wine
Manage
Activity
Members
Labels
Plan
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alanas Tebuev
wine
Commits
5ca18a11
"README.md" did not exist on "ec13f6ec2ac84f32cc572148d542e92a57f47008"
Commit
5ca18a11
authored
19 years ago
by
Detlef Riekenberg
Committed by
Alexandre Julliard
19 years ago
Browse files
Options
Downloads
Patches
Plain Diff
tools: Remove wineconf.
parent
3f567ce0
Branches
Branches containing commit
Tags
wine-0.6
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
tools/wineconf
+0
-492
0 additions, 492 deletions
tools/wineconf
with
0 additions
and
492 deletions
tools/wineconf
deleted
100755 → 0
+
0
−
492
View file @
3f567ce0
#!/usr/bin/perl -w
# This program generates wine.conf files on STDOUT.
# Copyright (C) 1996 Stephen Simmons
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# NOTES:
#
# This program examines the contents of the DOS filesystems and
# attempts to generate a sensible wine.conf file. This is output
# to STDOUT.
# It reads /etc/fstab to find mounting locations of the hard disk drives
# It uses the correct algorithm for ordering DOS drives, with the
# exception of the case of multiple drive controller types, where I don't
# know what DOS's algorithm is.
# It uses find to find all of the win.ini files on any DOS partition
# and sorts them by age to guess which is part of the active Windows
# installation.
# It reads the autoexec.bat file (if found) and records all variable
# settings. There are some inaccuracies in its determination.
# First, while variables are interpolated properly, no control
# structures are supported so calls and execs to other batch files are
# ignored, and all variable settings take effect regardless of whether
# they would in DOS (i,e., both if and else clauses are read).
# This is used to determine the path and temp directories. Duplicate
# path directories and path directories that don't exist are thrown
# out.
# On failing to find C:\AUTOEXEC.BAT, wineconf finds all executables
# in the windows directory and subdirectories, and generates an
# optimized path statement encompassing all the executables.
# Then it also looks for \TEMP and \TMP on all drives taking the first
# one it finds.
# wineconf doesn't support floppy drives, network drives, printers,
# and serial device configuration is hardcoded and not configured for
# the machine it runs on. Similarly, spy parameters are hard coded.
# It would make sense to incorporate much of the heuristic code in
# this program into a library to be shared with a dosemu configuration
# program, because it seems that at least some of the same stuff will
# be wanted. The program needs to be cleaned up still. A better tmp
# search algorithm could be written. A fast option is planned. Less
# Linux-dependence is desired. Should look for devices independent
# of /etc/fstab; then sanity checks on /etc/fstab can be performed.
use
Getopt::
Long
;
use
File::
Basename
;
use
strict
;
use
Carp
;
sub
Usage
()
{
print
"
Usage: $0 <options>
\n
";
# print "-fstab <filename> Location of alternate fstab file\n";
print
"
-windir <filename> Location of windows dir in DOS space
\n
";
print
"
-thorough Do careful analysis (default)
\n
";
print
"
-sysdir <filename> Location of systems dir in DOS space
\n
";
print
"
-inifile <filename> Path to the wine.ini file (by default './wine.ini')
\n
";
# print "-tmpdir <filename> Location of tmp directory\n";
print
"
Generates (to STDOUT) a wine configuration file based on
\n
";
print
"
/etc/fstab and searching around in DOS directories
\n
";
print
"
The options above can override certain values
\n
";
print
"
This should be considered ALPHA code
\n
";
exit
(
0
);
}
# Returns 1 if the device is mounted; -1 if mount check failed; 0 if not
# mounted.
# This code is Linux specific, and needs to be broadened.
sub
IsMounted
($)
{
my
$Device
=
shift
;
if
(
-
d
"
/proc
")
{
if
(
-
e
"
/proc/mounts
")
{
open
(
MOUNTS
,
"
/proc/mounts
")
||
(
warn
"
Cannot open /proc/mounts, although it exists
\n
"
&&
return
-
1
);
while
(
<
MOUNTS
>
)
{
if
(
/^$Device/
)
{
return
1
;
# Tested 1.4
}
}
return
0
;
# Tested 1.4
}
}
return
-
1
;
}
sub
RegisterDrive
($$)
{
my
(
$DOSdrive
,
$Drive
)
=
@_
;
$
::
DOS2Unix
{
$DOSdrive
}
=
$Drive
;
$
::
Device2DOS
{
$Drive
->
[
0
]}
=
$DOSdrive
;
$
::
MntPoint2DOS
{
$Drive
->
[
1
]}
=
$DOSdrive
;
$
::
DOS2MntPoint
{
$DOSdrive
}
=
$Drive
->
[
1
];
$
::
DOS2Device
{
$DOSdrive
}
=
$Drive
->
[
0
];
}
sub
byDriveOrder
()
{
my
(
$DeviceA
)
=
$a
->
[
0
];
my
(
$DeviceB
)
=
$b
->
[
0
];
# Primary drives come first, logical drives last
# DOS User's Guide (version 6) p. 70, IBM version.
# If both drives are the same type, sort alphabetically
# This makes drive a come before b, etc.
# It also makes SCSI drives come before IDE drives;
# this may or may not be right :-(
my
(
$Alogical
,
$Blogical
);
if
(
substr
(
$DeviceA
,
3
,
1
)
>=
5
)
{
$Alogical
++
;
}
if
(
substr
(
$DeviceB
,
3
,
1
)
>=
5
)
{
$Blogical
++
;
}
if
(
$Alogical
&&
!
$Blogical
)
{
return
-
1
;
}
elsif
(
$Blogical
&&
!
$Alogical
)
{
return
1
;
}
else
{
return
(
$DeviceA
cmp
$DeviceB
);
}
}
sub
byCdOrder
()
{
my
(
$DeviceA
)
=
$a
->
[
0
];
my
(
$DeviceB
)
=
$b
->
[
0
];
$DeviceA
cmp
$DeviceB
;
}
sub
ReadFSTAB
()
{
$
::
opt_f
=
$
::
opt_f
?
$
::
opt_f
:
'
/etc/fstab
';
open
(
FSTAB
,
$
::
opt_f
)
||
die
"
Cannot read $::opt_f
\n
";
while
(
<
FSTAB
>
)
{
next
if
/^\s*\#/
;
next
if
/^\s*$/
;
my
(
$device
,
$mntpoint
,
$type
,
@rest
)
=
split
('
',
$_
);
if
(
$device
!~
m"^/dev/fd"
)
{
if
(
$type
eq
"
ntfs
")
{
push
(
@
::
FatDrives
,
[
$device
,
$mntpoint
,
'
win95
']);
}
elsif
(
$type
eq
"
msdos
"
||
$type
eq
"
vfat
")
{
push
(
@
::
FatDrives
,
[
$device
,
$mntpoint
,
$type
]);
}
elsif
(
$type
eq
"
iso9660
"
||
(
$mntpoint
eq
"
/cdrom
"
&&
!
$type
eq
'
supermount
')
||
(
$device
eq
'
/dev/cdrom
'
&&
$type
eq
'
auto
')
)
{
push
(
@
::
CdromDrives
,
[
$device
,
$mntpoint
,
'
win95
']);
}
elsif
(
(
$mntpoint
eq
'
/mnt/cdrom
'
||
$mntpoint
eq
'
/cdrom
')
&&
$type
eq
'
supermount
')
{
push
(
@
::
CdromDrives
,
['
/dev/cdrom
',
$mntpoint
,
'
win95
']);
}
}
}
if
(
!
@
::
FatDrives
)
{
warn
"
ERROR ($0): Cannot find any MSDOS drives.
\n
";
warn
"
This does not mean you cannot run Wine, but $0
\n
";
warn
"
cannot help you (yet)
\n
";
exit
(
1
);
}
push
(
@
::
UnixDrives
,
['',
'
/tmp
',
'
hd
']);
push
(
@
::
UnixDrives
,
['',
'
${HOME}
',
'
network
']);
my
$MagicDrive
=
'
C
';
@
::
FatDrives
=
sort
byDriveOrder
@
::
FatDrives
;
@
::
CdromDrives
=
sort
byCdOrder
@
::
CdromDrives
;
foreach
my
$FatDrive
(
@
::
FatDrives
)
{
print
"
[Drive
$MagicDrive
]
\n
";
my
$MntPoint
=
$FatDrive
->
[
1
];
my
$FileSys
=
$FatDrive
->
[
2
];
print
"
\"
Path
\"
=
\"
$MntPoint
\"\n
";
print
"
\"
Type
\"
=
\"
hd
\"\n
";
print
"
\"
Filesystem
\"
=
\"
$FileSys
\"\n
";
print
"
\n
";
RegisterDrive
(
$MagicDrive
,
$FatDrive
);
if
(
!
IsMounted
(
$FatDrive
->
[
0
]))
{
warn
"
WARNING: DOS Drive
$MagicDrive
(
"
.
$FatDrive
->
[
0
]
.
"
) is not mounted
\n
";
}
$MagicDrive
++
;
}
foreach
my
$CdromDrive
(
@
::
CdromDrives
)
{
print
"
[Drive
$MagicDrive
]
\n
";
my
$Device
=
$CdromDrive
->
[
0
];
my
$MntPoint
=
$CdromDrive
->
[
1
];
my
$FileSys
=
$CdromDrive
->
[
2
];
print
"
\"
Path
\"
=
\"
$MntPoint
\"\n
";
print
"
\"
Type
\"
=
\"
cdrom
\"\n
";
print
"
\"
Device
\"
=
\"
$Device
\"\n
";
print
"
\"
Filesystem
\"
=
\"
$FileSys
\"\n
";
print
"
\n
";
RegisterDrive
(
$MagicDrive
,
$CdromDrive
);
$MagicDrive
++
;
}
foreach
my
$UnixDrive
(
@
::
UnixDrives
)
{
print
"
[Drive
$MagicDrive
]
\n
";
my
$MntPoint
=
$UnixDrive
->
[
1
];
my
$Type
=
$UnixDrive
->
[
2
];
print
"
\"
Path
\"
=
\"
$MntPoint
\"\n
";
print
"
\"
Type
\"
=
\"
$Type
\"\n
";
print
"
\"
Filesystem
\"
=
\"
win95
\"\n
";
print
"
\n
";
$MagicDrive
++
;
}
}
# FNunix = ToUnix(FNdos);
# Converts DOS filenames to Unix filenames, leaving Unix filenames
# untouched.
sub
ToUnix
($)
{
my
$FNdos
=
shift
;
my
$FNunix
;
# Initialize tables if necessary.
if
(
!%::
DOS2Unix
)
{
ReadFSTAB
();
}
# Determine which type of conversion is necessary
if
(
$FNdos
=~
/^([A-Z])\:(.*)$/
)
{
# DOS drive specified
$FNunix
=
$
::
DOS2MntPoint
{
$
1
}
.
"
/$2
";
}
elsif
(
$FNdos
=~
m%\\%
)
{
# DOS drive not specified, C: is default
$FNunix
=
$
::
DOS2MntPoint
{"
C
"}
.
"
/
$FNdos
";
}
else
{
# Unix filename
$FNunix
=
$FNdos
;
}
1
while
(
$FNunix
=~
s%\\%/%
);
# Convert \ to /
$FNunix
=~
tr/A-Z/a-z/
;
# Translate to lower case
1
while
(
$FNunix
=~
s%//%/%
);
# Translate double / to /
return
$FNunix
;
}
# FNdos = ToDos(FNunix)
# Converts Unix filenames to DOS filenames
sub
ToDos
($)
{
my
$FNunix
=
shift
;
my
(
@MntList
)
=
keys
%::
MntPoint2DOS
;
my
(
$TheMntPt
,
$FNdos
);
foreach
my
$MntPt
(
@MntList
)
{
# Scan mount point list to see if path matches
if
(
$FNunix
=~
/^$MntPt/
)
{
$TheMntPt
=
$MntPt
;
last
;
}
}
if
(
!
$TheMntPt
)
{
Carp
("
ERROR:
$FNunix
not found in DOS directories
\n
");
exit
(
1
);
}
$FNdos
=
$FNunix
;
$FNdos
=~
s/^$TheMntPt//
;
$FNdos
=
$
::
MntPoint2DOS
{
$TheMntPt
}
.
"
:
"
.
$FNdos
;
1
while
(
$FNdos
=~
s%/%\\%
);
return
$FNdos
;
}
sub
InsertDefaultFile
($$)
{
my
(
$fileName
,
$tag
)
=
@_
;
my
$state
=
0
;
if
(
open
(
DEFFILE
,
"
$fileName
"))
{
while
(
<
DEFFILE
>
)
{
$state
=
0
if
(
$state
==
1
&&
$_
=~
/^[ \t]*\#/o
&&
index
(
$_
,
"
[/
$tag
]
")
>=
0
);
print
$_
if
(
$state
==
1
);
$state
=
1
if
(
$state
==
0
&&
$_
=~
/^[ \t]*\#/o
&&
index
(
$_
,
"
[
$tag
]
"
)
>=
0
);
}
close
(
DEFFILE
);
}
else
{
print
STDERR
"
Cannot read
$fileName
\n
";
}
}
sub
marshall
($)
{
my
$s
=
$_
[
0
];
$s
=~
s/\\/\\\\/g
;
return
"
\"
$s
\"
";
}
sub
byFileAge
()
{
-
M
$a
<=>
-
M
$b
;
}
sub
FindWindowsDir
()
{
my
(
$MagicDrive
)
=
'
C
';
my
(
@FATD
)
=
@
::
FatDrives
;
my
(
@wininis
)
=
();
my
(
$winini
);
my
(
$ThisDrive
);
if
(
!
$
::
opt_windir
&&
!
$
::
opt_fast
&&
!
$
::
opt_thorough
)
{
$
::
opt_thorough
++
;
}
if
(
$
::
opt_windir
)
{
$winini
=
ToUnix
(
$
::
opt_windir
);
if
(
!-
e
$winini
)
{
die
"
ERROR: Specified winini file does not exist
\n
";
}
}
elsif
(
$
::
opt_fast
)
{
die
"
-fast code can be implemented
\n
";
}
elsif
(
$
::
opt_thorough
)
{
if
(
$
::
opt_debug
)
{
print
STDERR
"
DEBUG: Num FATD =
",
$#FATD
+
1
,
"
\n
";
}
foreach
$ThisDrive
(
@FATD
)
{
my
$MntPoint
=
$ThisDrive
->
[
1
];
push
(
@wininis
,
`
find
$MntPoint
-iname win.ini -print
`);
}
foreach
$winini
(
@wininis
)
{
chomp
$winini
;
}
my
(
$winini_cnt
)
=
$#wininis
+
1
;
if
(
$
::
opt_debug
)
{
print
STDERR
"
DEBUG: Num wininis found:
$winini_cnt
\n
";}
if
(
$winini_cnt
>
1
)
{
warn
"
$winini_cnt
win.ini files found:
\n
";
@wininis
=
sort
byFileAge
@wininis
;
warn
join
("
\n
",
@wininis
),
"
\n
";
$winini
=
$wininis
[
0
];
warn
"
Using most recent one:
$winini
\n
";
}
elsif
(
$winini_cnt
==
0
)
{
die
"
ERROR: No win.ini found in DOS partitions
\n
";
}
else
{
$winini
=
$wininis
[
0
];
}
}
else
{
die
"
ERROR: None of -windir, -fast, or -thorough set
\n
";
}
$
::
windir
=
ToDos
(
dirname
(
$winini
));
print
"
[wine]
\n
";
print
"
\"
windows
\"
=
",
marshall
(
$
::
windir
),
"
\n
";
if
(
$
::
opt_sysdir
)
{
print
"
\"
system
\"
=
",
marshall
(
$
::
opt_sysdir
),
"
\n
";
}
else
{
print
"
\"
system
\"
=
",
marshall
("
$::windir
\\
SYSTEM
"),
"
\n
";
}
}
sub
ReadAutoexecBat
()
{
if
(
!%::
DOS2Unix
)
{
ReadFSTAB
();
}
my
(
$DriveC
)
=
$
::
DOS2MntPoint
{"
C
"};
$DriveC
=~
s%/$%%
;
my
(
$path
);
if
(
$
::
opt_debug
)
{
print
STDERR
"
DEBUG: Looking for
$DriveC
/autoexec.bat
\n
";
}
if
(
-
e
"
$DriveC
/autoexec.bat
")
{
# Tested 1.4
open
(
AUTOEXEC
,
"
$DriveC
/autoexec.bat
")
||
die
"
Cannot read autoexec.bat
\n
";
while
(
<
AUTOEXEC
>
)
{
s/\015//
;
if
(
/^\s*(set\s+)?(\w+)\s*[\s\=]\s*(.*)$/i
)
{
my
(
$varname
)
=
$
2
;
my
(
$varvalue
)
=
$
3
;
chomp
(
$varvalue
);
$varname
=~
tr/A-Z/a-z/
;
while
(
$varvalue
=~
/%(\w+)%/
)
{
my
$matchname
=
$
1
;
my
$subname
=
$
1
;
$subname
=~
tr/A-Z/a-z/
;
if
((
$
::
opt_debug
)
&&
(
$
::
opt_debug
=~
/path/i
))
{
print
STDERR
"
DEBUG: Found
$matchname
as
$subname
\n
";
print
STDERR
"
DEBUG: Old varvalue:
\n
$varvalue
\n
";
print
STDERR
"
DEBUG: Old subname value:
\n
"
.
$
::
DOSenv
{
$subname
}
.
"
\n
";
}
if
(
$
::
DOSenv
{
$subname
})
{
$varvalue
=~
s/\%$matchname\%/$::DOSenv{$subname}/
;
}
else
{
warn
"
DOS environment variable
$subname
not
\n
";
warn
"
defined in autoexec.bat. (Reading config.sys
\n
";
warn
"
is not implemented.) Using null value
\n
";
$varvalue
=~
s/%$matchname%//
;
}
if
((
$
::
opt_debug
)
&&
(
$
::
opt_debug
=~
/path/i
))
{
print
STDERR
"
DEBUG: New varvalue:
\n
$varvalue
\n
";
}
}
if
(
$
::
opt_debug
)
{
print
STDERR
"
DEBUG:
$varname
=
$varvalue
\n
";
}
$
::
DOSenv
{
$varname
}
=
$varvalue
;
}
}
close
(
AUTOEXEC
);
}
else
{
# Tested 1.4
warn
"
WARNING: C:
\\
AUTOEXEC.BAT was not found.
\n
";
}
if
(
$
::
DOSenv
{"
path
"})
{
my
@pathdirs
=
split
(
/\s*;\s*/
,
$
::
DOSenv
{"
path
"});
if
((
$
::
opt_debug
)
&&
(
$
::
opt_debug
=~
/path/i
))
{
print
STDERR
"
DEBUG (path):
@pathdirs
\n
";
}
foreach
my
$pathdir
(
@pathdirs
)
{
if
(
-
d
ToUnix
(
$pathdir
))
{
if
(
$
::
DOSpathdir
{
$pathdir
}
++
)
{
warn
"
Ignoring duplicate DOS path entry
$pathdir
\n
";
}
else
{
if
((
$
::
opt_debug
)
&&
(
$
::
opt_debug
=~
/path/i
))
{
print
STDERR
"
DEBUG (path): Found
$pathdir
\n
";
}
push
(
@
::
DOSpathlist
,
$pathdir
);
}
}
else
{
warn
"
Ignoring DOS path directory
$pathdir
, as it does not
\n
";
warn
"
exist
\n
";
}
}
print
"
\"
path
\"
=
",
marshall
(
join
("
;
",
@
::
DOSpathlist
)),
"
\n
";
}
else
{
# Code status: tested 1.4
warn
"
WARNING: Making assumptions for PATH
\n
";
warn
"
Will scan windows directory for executables and generate
\n
";
warn
"
path from that
\n
";
my
$shellcmd
=
'
find
'
.
ToUnix
(
$
::
windir
)
.
"
-iregex '
"
.
'
.*\.\(exe\|bat\|com\|dll\)
'
.
"
' -print
";
if
(
$
::
opt_debug
)
{
print
STDERR
"
DEBUG: autoexec.bat search command:
\n
$shellcmd
\n
";
}
push
(
@
::
DOScommand
,
`
$shellcmd
`);
if
(
$
::
opt_debug
&&
$
::
opt_debug
=~
/autoexec/i
)
{
print
STDERR
"
DEBUG: autoexec.bat search results:
\n\@
DOS::command
\n
";
}
foreach
my
$command
(
@
::
DOScommand
)
{
$command
=~
s%[^/]+$%%
;
$
::
DOSexecdir
{
ToDos
(
$command
)}
++
;
}
print
"
\"
path
\"
=
"
.
marshall
(
join
("
;
",
grep
(
s%\\$%%
,
sort
{
$
::
DOSexecdir
{
$b
}
<=>
$
::
DOSexecdir
{
$a
}}
(
keys
%::
DOSexecdir
))))
.
"
\n
";
}
if
(
$
::
DOSenv
{"
temp
"}
&&
-
d
ToUnix
(
$
::
DOSenv
{"
temp
"}))
{
print
"
\"
temp
\"
=
",
marshall
(
$
::
DOSenv
{"
temp
"}),
"
\n
";
}
else
{
my
$TheTemp
;
warn
"
WARNING: Making assumptions for TEMP
\n
";
warn
"
Looking for
\\
TEMP and then
\\
TMP on every drive
\n
";
# Watch out .. might pick CDROM drive :-)
foreach
my
$DOSdrive
(
keys
%::
DOS2Unix
)
{
my
$tmp
=
ToUnix
("
$DOSdrive
:
\\
temp
");
if
(
-
d
$tmp
)
{
$TheTemp
=
"
$DOSdrive
:
\\
temp
";
last
;
}
$tmp
=
ToUnix
("
$DOSdrive
:
\\
tmp
");
if
(
-
d
$tmp
)
{
$TheTemp
=
"
$DOSdrive
:
\\
tmp
";
last
;
}
}
$TheTemp
=
'
/tmp
'
if
(
!
$TheTemp
&&
-
d
'
/tmp
');
if
(
$TheTemp
)
{
warn
"
Using
$TheTemp
\n
";
print
"
\"
temp
\"
=
",
marshall
(
$TheTemp
),
"
\n
";
}
else
{
warn
"
Using C:
\\\n
";
print
"
\"
temp
\"
=
",
marshall
("
C:
\\
"),
"
\n
";
}
}
print
"
\n
";
}
sub
StandardStuff
()
{
if
(
!
$
::
opt_inifile
)
{
InsertDefaultFile
("
./wine.ini
",
"
wineconf
");
}
else
{
InsertDefaultFile
(
$
::
opt_inifile
,
"
wineconf
");
}
}
### Main
GetOptions
('
windir=s
',
'
sysdir=s
',
'
thorough
',
'
debug:s
',
'
inifile=s
')
||
Usage
;
print
"
WINE REGISTRY Version 2
\n
";
print
"
;; All keys relative to
\\\\
Machine
\\\\
Software
\\\\
Wine
\\\\
Wine
\\\\
Config
\n\n
";
ReadFSTAB
();
FindWindowsDir
();
ReadAutoexecBat
();
StandardStuff
();
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment