Mercurial > hg > xemacs-beta
annotate netinstall/install.cc @ 2367:ecf1ebac70d8
[xemacs-hg @ 2004-11-04 23:05:23 by ben]
commit mega-patch
configure.in: Turn off -Winline and -Wchar-subscripts.
Use the right set of cflags when compiling modules.
Rewrite ldap configuration to separate the inclusion of lber
(needed in recent Cygwin) from the basic checks for the
needed libraries.
add a function for MAKE_JUNK_C; initially code was added to
generate xemacs.def using this, but it will need to be rewritten.
add an rm -f for junk.c to avoid weird Cygwin bug with cp -f onto
an existing file.
Sort list of auto-detected functions and eliminate unused checks for
stpcpy, setlocale and getwd.
Add autodetection of Cygwin scanf problems
BETA: Rewrite section on configure to indicate what flags are important
and what not.
digest-doc.c, make-dump-id.c, profile.c, sorted-doc.c: Add proper decls for main().
make-msgfile.c: Document that this is old junk.
Move proposal to text.c.
make-msgfile.lex: Move proposal to text.c.
make-mswin-unicode.pl: Convert error-generating code so that the entire message will
be seen as a single unrecognized token.
mule/mule-ccl.el: Update docs.
lispref/mule.texi: Update CCL docs.
ldap/eldap.c: Mule-ize.
Use EXTERNAL_LIST_LOOP_2 instead of deleted EXTERNAL_LIST_LOOP.
* XEmacs 21.5.18 "chestnut" is released.
---------------------------------------------------------------
MULE-RELATED WORK:
---------------------------------------------------------------
---------------------------
byte-char conversion
---------------------------
buffer.c, buffer.h, insdel.c, text.c: Port FSF algorithm for byte-char conversion, replacing broken
previous version. Track the char position of the gap. Add
functions to do char-byte conversion downwards as well as upwards.
Move comments about algorithm workings to internals manual.
---------------------------
work on types
---------------------------
alloc.c, console-x-impl.h, dump-data.c, dump-data.h, dumper.c, dialog-msw.c, dired-msw.c, doc.c, editfns.c, esd.c, event-gtk.h, event-msw.c, events.c, file-coding.c, file-coding.h, fns.c, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-shared.c, glyphs-x.c, glyphs.c, glyphs.h, gui.c, hpplay.c, imgproc.c, intl-win32.c, lrecord.h, lstream.c, keymap.c, lisp.h, libsst.c, linuxplay.c, miscplay.c, miscplay.h, mule-coding.c, nas.c, nt.c, ntheap.c, ntplay.c, objects-msw.c, objects-tty.c, objects-x.c, print.c, process-nt.c, process.c, redisplay.h, select-common.h, select-gtk.c, select-x.c, sgiplay.c, sound.c, sound.h, sunplay.c, sysfile.h, sysdep.c, syswindows.h, text.c, unexnt.c, win32.c, xgccache.c: Further work on types. This creates a full set of types for all
the basic semantics of `char' that I have so far identified, so that
its semantics can always be identified for the purposes of proper
Mule-safe code, and the raw use of `char' always avoided.
(1) More type renaming, for consistency of naming.
Char_ASCII -> Ascbyte
UChar_ASCII -> UAscbyte
Char_Binary -> CBinbyte
UChar_Binary -> Binbyte
SChar_Binary -> SBinbyte
(2) Introduce Rawbyte, CRawbyte, Boolbyte, Chbyte, UChbyte, and
Bitbyte and use them.
(3) New types Itext, Wexttext and Textcount for separating out
the concepts of bytes and textual units (different under UTF-16
and UTF-32, which are potential internal encodings).
(4) qxestr*_c -> qxestr*_ascii.
lisp.h: New; goes with other qxe() functions. #### Maybe goes in a
different section.
lisp.h: Group generic int-type defs together with EMACS_INT defs.
lisp.h: * lisp.h (WEXTTEXT_IS_WIDE)
New defns.
lisp.h: New type to replace places where int occurs as a boolean.
It's signed because occasionally people may want to use -1 as
an error value, and because unsigned ints are viral -- see comments
in the internals manual against using them.
dynarr.c: int -> Bytecount.
---------------------------
Mule-izing
---------------------------
device-x.c: Partially Mule-ize.
dumper.c, dumper.h: Mule-ize. Use Rawbyte. Use stderr_out not printf. Use wext_*().
sysdep.c, syswindows.h, text.c: New Wexttext API for manipulation of external text that may be
Unicode (e.g. startup code under Windows).
emacs.c: Mule-ize. Properly deal with argv in external encoding.
Use wext_*() and Wexttext. Use Rawbyte.
#if 0 some old junk on SCO that is unlikely to be correct.
Rewrite allocation code in run-temacs.
emacs.c, symsinit.h, win32.c: Rename win32 init function and call it even earlier, to
initialize mswindows_9x_p even earlier, for use in startup code
(XEUNICODE_P).
process.c: Use _wenviron not environ under Windows, to get Unicode environment
variables.
event-Xt.c: Mule-ize drag-n-drop related stuff.
dragdrop.c, dragdrop.h, frame-x.c: Mule-ize.
text.h: Add some more stand-in defines for particular kinds of conversion;
use in Mule-ization work in frame-x.c etc.
---------------------------
Freshening
---------------------------
intl-auto-encap-win32.c, intl-auto-encap-win32.h: Regenerate.
---------------------------
Unicode-work
---------------------------
intl-win32.c, syswindows.h: Factor out common options to MultiByteToWideChar and
WideCharToMultiByte. Add convert_unicode_to_multibyte_malloc()
and convert_unicode_to_multibyte_dynarr() and use. Add stuff for
alloca() conversion of multibyte/unicode.
alloc.c: Use dfc_external_data_len() in case of unicode coding system.
alloc.c, mule-charset.c: Don't zero out and reinit charset Unicode tables. This fucks up
dump-time loading. Anyway, either we load them at dump time or
run time, never both.
unicode.c: Dump the blank tables as well.
---------------------------------------------------------------
DOCUMENTATION, MOSTLY MULE-RELATED:
---------------------------------------------------------------
EmacsFrame.c, emodules.c, event-Xt.c, fileio.c, input-method-xlib.c, mule-wnnfns.c, redisplay-gtk.c, redisplay-tty.c, redisplay-x.c, regex.c, sysdep.c: Add comment about Mule work needed.
text.h: Add more documentation describing why DFC routines were not written
to return their value. Add some other DFC documentation.
console-msw.c, console-msw.h: Add pointer to docs in win32.c.
emacs.c: Add comments on sources of doc info.
text.c, charset.h, unicode.c, intl-win32.c, intl-encap-win32.c, text.h, file-coding.c, mule-coding.c: Collect background comments and related to text matters and
internationalization, and proposals for work to be done, in text.c
or Internals manual, stuff related to specific textual API's in
text.h, and stuff related to internal implementation of Unicode
conversion in unicode.c. Put lots of pointers to the comments to
make them easier to find.
s/mingw32.h, s/win32-common.h, s/win32-native.h, s/windowsnt.h, win32.c: Add bunches of new documentation on the different kinds of
builds and environments under Windows and how they work.
Collect this info in win32.c. Add pointers to these docs in
the relevant s/* files.
emacs.c: Document places with long comments.
Remove comment about exiting, move to internals manual, put
in pointer.
event-stream.c: Move docs about event queues and focus to internals manual, put
in pointer.
events.h: Move docs about event stream callbacks to internals manual, put
in pointer.
profile.c, redisplay.c, signal.c: Move documentation to the Internals manual.
process-nt.c: Add pointer to comment in win32-native.el.
lisp.h: Add comments about some comment conventions.
lisp.h: Add comment about the second argument.
device-msw.c, redisplay-msw.c: @@#### comments are out-of-date.
---------------------------------------------------------------
PDUMP WORK (MOTIVATED BY UNICODE CHANGES)
---------------------------------------------------------------
alloc.c, buffer.c, bytecode.c, console-impl.h, console.c, device.c, dumper.c, lrecord.h, elhash.c, emodules.h, events.c, extents.c, frame.c, glyphs.c, glyphs.h, mule-charset.c, mule-coding.c, objects.c, profile.c, rangetab.c, redisplay.c, specifier.c, specifier.h, window.c, lstream.c, file-coding.h, file-coding.c: PDUMP:
Properly implement dump_add_root_block(), which never worked before,
and is necessary for dumping Unicode tables.
Pdump name changes for accuracy:
XD_STRUCT_PTR -> XD_BLOCK_PTR.
XD_STRUCT_ARRAY -> XD_BLOCK_ARRAY.
XD_C_STRING -> XD_ASCII_STRING.
*_structure_* -> *_block_*.
lrecord.h: some comments added about
dump_add_root_block() vs dump_add_root_block_ptr().
extents.c: remove incorrect comment about pdump problems with gap array.
---------------------------------------------------------------
ALLOCATION
---------------------------------------------------------------
abbrev.c, alloc.c, bytecode.c, casefiddle.c, device-msw.c, device-x.c, dired-msw.c, doc.c, doprnt.c, dragdrop.c, editfns.c, emodules.c, file-coding.c, fileio.c, filelock.c, fns.c, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-x.c, gui-msw.c, gui-x.c, imgproc.c, intl-win32.c, lread.c, menubar-gtk.c, menubar.c, nt.c, objects-msw.c, objects-x.c, print.c, process-nt.c, process-unix.c, process.c, realpath.c, redisplay.c, search.c, select-common.c, symbols.c, sysdep.c, syswindows.h, text.c, text.h, ui-byhand.c: New macros {alloca,xnew}_{itext,{i,ext,raw,bin,asc}bytes} for
more convenient allocation of these commonly requested items.
Modify functions to use alloca_ibytes, alloca_array, alloca_extbytes,
xnew_ibytes, etc. also XREALLOC_ARRAY, xnew.
alloc.c: Rewrite the allocation functions to factor out repeated code.
Add assertions for freeing dumped data.
lisp.h: Moved down and consolidated with other allocation stuff.
lisp.h, dynarr.c: New functions for allocation that's very efficient when mostly in
LIFO order.
lisp.h, text.c, text.h: Factor out some stuff for general use by alloca()-conversion funs.
text.h, lisp.h: Fill out convenience routines for allocating various kinds of
bytes and put them in lisp.h. Use them in place of xmalloc(),
ALLOCA().
text.h: Fill out the convenience functions so the _MALLOC() kinds match
the alloca() kinds.
---------------------------------------------------------------
ERROR-CHECKING
---------------------------------------------------------------
text.h: Create ASSERT_ASCTEXT_ASCII() and ASSERT_ASCTEXT_ASCII_LEN()
from similar Eistring checkers and change the Eistring checkers to
use them instead.
---------------------------------------------------------------
MACROS IN LISP.H
---------------------------------------------------------------
lisp.h: Redo GCPRO declarations. Create a "base" set of functions that can
be used to generate any kind of gcpro sets -- regular, ngcpro,
nngcpro, private ones used in GC_EXTERNAL_LIST_LOOP_2.
buffer.c, callint.c, chartab.c, console-msw.c, device-x.c, dialog-msw.c, dired.c, extents.c, ui-gtk.c, rangetab.c, nt.c, mule-coding.c, minibuf.c, menubar-msw.c, menubar.c, menubar-gtk.c, lread.c, lisp.h, gutter.c, glyphs.c, glyphs-widget.c, fns.c, fileio.c, file-coding.c, specifier.c: Eliminate EXTERNAL_LIST_LOOP, which does not check for circularities.
Use EXTERNAL_LIST_LOOP_2 instead or EXTERNAL_LIST_LOOP_3
or EXTERNAL_PROPERTY_LIST_LOOP_3 or GC_EXTERNAL_LIST_LOOP_2
(new macro). Removed/redid comments on EXTERNAL_LIST_LOOP.
---------------------------------------------------------------
SPACING FIXES
---------------------------------------------------------------
callint.c, hftctl.c, number-gmp.c, process-unix.c: Spacing fixes.
---------------------------------------------------------------
FIX FOR GEOMETRY PROBLEM IN FIRST FRAME
---------------------------------------------------------------
unicode.c: Add workaround for newlib bug in sscanf() [should be fixed by
release 1.5.12 of Cygwin].
toolbar.c: bug fix for problem of initial frame being 77 chars wide on Windows.
will be overridden by my other ws.
---------------------------------------------------------------
FIX FOR LEAKING PROCESS HANDLES:
---------------------------------------------------------------
process-nt.c: Fixes for leaking handles. Inspired by work done by Adrian Aichner
<adrian@xemacs.org>.
---------------------------------------------------------------
FIX FOR CYGWIN BUG (Unicode-related):
---------------------------------------------------------------
unicode.c: Add workaround for newlib bug in sscanf() [should be fixed by
release 1.5.12 of Cygwin].
---------------------------------------------------------------
WARNING FIXES:
---------------------------------------------------------------
console-stream.c: `reinit' is unused.
compiler.h, event-msw.c, frame-msw.c, intl-encap-win32.c, text.h: Add stuff to deal with ANSI-aliasing warnings I got.
regex.c: Gather includes together to avoid warning.
---------------------------------------------------------------
CHANGES TO INITIALIZATION ROUTINES:
---------------------------------------------------------------
buffer.c, emacs.c, console.c, debug.c, device-x.c, device.c, dragdrop.c, emodules.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, events.c, extents.c, faces.c, file-coding.c, fileio.c, font-lock.c, frame-msw.c, glyphs-widget.c, glyphs.c, gui-x.c, insdel.c, lread.c, lstream.c, menubar-gtk.c, menubar-x.c, minibuf.c, mule-wnnfns.c, objects-msw.c, objects.c, print.c, scrollbar-x.c, search.c, select-x.c, text.c, undo.c, unicode.c, window.c, symsinit.h: Call reinit_*() functions directly from emacs.c, for clarity.
Factor out some redundant init code. Move disallowed stuff
that had crept into vars_of_glyphs() into complex_vars_of_glyphs().
Call init_eval_semi_early() from eval.c not in the middle of
vars_of_() in emacs.c since there should be no order dependency
in the latter calls.
---------------------------------------------------------------
ARMAGEDDON:
---------------------------------------------------------------
alloc.c, emacs.c, lisp.h, print.c: Rename inhibit_non_essential_printing_operations to
inhibit_non_essential_conversion_operations.
text.c: Assert on !inhibit_non_essential_conversion_operations.
console-msw.c, print.c: Don't do conversion in SetConsoleTitle or FindWindow to avoid
problems during armageddon. Put #errors for NON_ASCII_INTERNAL_FORMAT
in places where problems would arise.
---------------------------------------------------------------
CHANGES TO THE BUILD PROCEDURE:
---------------------------------------------------------------
config.h.in, s/cxux.h, s/usg5-4-2.h, m/powerpc.h: Add comment about correct ordering of this file.
Rearrange everything to follow this -- put all #undefs together
and before the s&m files. Add undefs for HAVE_ALLOCA, C_ALLOCA,
BROKEN_ALLOCA_IN_FUNCTION_CALLS, STACK_DIRECTION. Remove unused
HAVE_STPCPY, HAVE_GETWD, HAVE_SETLOCALE.
m/gec63.h: Deleted; totally broken, not used at all, not in FSF.
m/7300.h, m/acorn.h, m/alliant-2800.h, m/alliant.h, m/altos.h, m/amdahl.h, m/apollo.h, m/att3b.h, m/aviion.h, m/celerity.h, m/clipper.h, m/cnvrgnt.h, m/convex.h, m/cydra5.h, m/delta.h, m/delta88k.h, m/dpx2.h, m/elxsi.h, m/ews4800r.h, m/gould.h, m/hp300bsd.h, m/hp800.h, m/hp9000s300.h, m/i860.h, m/ibmps2-aix.h, m/ibmrs6000.h, m/ibmrt-aix.h, m/ibmrt.h, m/intel386.h, m/iris4d.h, m/iris5d.h, m/iris6d.h, m/irist.h, m/isi-ov.h, m/luna88k.h, m/m68k.h, m/masscomp.h, m/mg1.h, m/mips-nec.h, m/mips-siemens.h, m/mips.h, m/news.h, m/nh3000.h, m/nh4000.h, m/ns32000.h, m/orion105.h, m/pfa50.h, m/plexus.h, m/pmax.h, m/powerpc.h, m/pyrmips.h, m/sequent-ptx.h, m/sequent.h, m/sgi-challenge.h, m/symmetry.h, m/tad68k.h, m/tahoe.h, m/targon31.h, m/tekxd88.h, m/template.h, m/tower32.h, m/tower32v3.h, m/ustation.h, m/vax.h, m/wicat.h, m/xps100.h: Delete C_ALLOCA, HAVE_ALLOCA, STACK_DIRECTION,
BROKEN_ALLOCA_IN_FUNCTION_CALLS. All of this is auto-detected.
When in doubt, I followed recent FSF sources, which also have
these things deleted.
| author | ben |
|---|---|
| date | Thu, 04 Nov 2004 23:08:28 +0000 |
| parents | 6504113e7c2d |
| children |
| rev | line source |
|---|---|
| 448 | 1 /* |
| 2 * Copyright (c) 2000, Red Hat, Inc. | |
| 3 * | |
| 4 * This program is free software; you can redistribute it and/or modify | |
| 5 * it under the terms of the GNU General Public License as published by | |
| 6 * the Free Software Foundation; either version 2 of the License, or | |
| 7 * (at your option) any later version. | |
| 8 * | |
| 9 * A copy of the GNU General Public License can be found at | |
| 10 * http://www.gnu.org/ | |
| 11 * | |
| 12 * Written by DJ Delorie <dj@cygnus.com> | |
| 13 * | |
| 14 */ | |
| 15 | |
| 16 /* The purpose of this file is to intall all the packages selected in | |
| 17 the install list (in ini.h). Note that we use a separate thread to | |
| 18 maintain the progress dialog, so we avoid the complexity of | |
| 19 handling two tasks in one thread. We also create or update all the | |
| 20 files in /etc/setup and create the mount points. */ | |
| 21 | |
| 22 #include <io.h> | |
| 23 #include <stdio.h> | |
| 24 #include <stdlib.h> | |
| 25 #ifndef WIN32_NATIVE | |
| 26 #include <unistd.h> | |
| 27 #endif | |
| 28 #include <sys/types.h> | |
| 29 #include <sys/stat.h> | |
| 30 #include <errno.h> | |
| 31 #include <zlib.h> | |
| 32 | |
| 33 #include "win32.h" | |
| 34 #include "commctrl.h" | |
| 35 | |
| 36 #include "resource.h" | |
| 37 #include "ini.h" | |
| 38 #include "dialog.h" | |
| 39 #include "concat.h" | |
| 40 #include "geturl.h" | |
| 41 #include "mkdir.h" | |
| 42 #include "state.h" | |
| 43 #include "tar.h" | |
| 44 #include "diskfull.h" | |
| 45 #include "msg.h" | |
| 46 #include "regedit.h" | |
| 47 #include "reginfo.h" | |
| 48 #include "log.h" | |
| 49 #include "hash.h" | |
| 707 | 50 #include "desktop.h" |
| 448 | 51 #include "port.h" |
| 52 | |
| 53 static HWND ins_dialog = 0; | |
| 54 static HWND ins_action = 0; | |
| 55 static HWND ins_pkgname = 0; | |
| 56 static HWND ins_filename = 0; | |
| 57 static HWND ins_pprogress = 0; | |
| 58 static HWND ins_iprogress = 0; | |
| 59 static HWND ins_diskfull = 0; | |
| 60 static HANDLE init_event; | |
| 61 | |
| 62 static int total_bytes = 0; | |
| 63 static int total_bytes_sofar = 0; | |
| 64 static int package_bytes = 0; | |
| 65 | |
| 66 static BOOL | |
| 67 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code) | |
| 68 { | |
| 69 switch (id) | |
| 70 { | |
| 71 case IDCANCEL: | |
| 72 exit_setup (1); | |
| 73 } | |
| 74 return FALSE; | |
| 75 } | |
| 76 | |
| 77 static BOOL CALLBACK | |
| 78 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) | |
| 79 { | |
| 80 switch (message) | |
| 81 { | |
| 82 case WM_INITDIALOG: | |
| 83 ins_dialog = h; | |
| 84 ins_action = GetDlgItem (h, IDC_INS_ACTION); | |
| 85 ins_pkgname = GetDlgItem (h, IDC_INS_PKG); | |
| 86 ins_filename = GetDlgItem (h, IDC_INS_FILE); | |
| 87 ins_pprogress = GetDlgItem (h, IDC_INS_PPROGRESS); | |
| 88 ins_iprogress = GetDlgItem (h, IDC_INS_IPROGRESS); | |
| 89 ins_diskfull = GetDlgItem (h, IDC_INS_DISKFULL); | |
| 90 SetEvent (init_event); | |
| 91 return FALSE; | |
| 92 case WM_COMMAND: | |
| 93 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd); | |
| 94 } | |
| 95 return FALSE; | |
| 96 } | |
| 97 | |
| 98 static DWORD WINAPI | |
| 99 dialog (void *) | |
| 100 { | |
| 101 MSG m; | |
| 102 HWND new_dialog = CreateDialog (hinstance, MAKEINTRESOURCE (IDD_INSTATUS), | |
| 103 0, dialog_proc); | |
| 104 if (new_dialog == 0) | |
| 105 fatal ("create dialog"); | |
| 106 ShowWindow (new_dialog, SW_SHOWNORMAL); | |
| 107 UpdateWindow (new_dialog); | |
| 108 while (GetMessage (&m, 0, 0, 0) > 0) { | |
| 109 TranslateMessage (&m); | |
| 110 DispatchMessage (&m); | |
| 111 } | |
| 112 return FALSE; | |
| 113 } | |
| 114 | |
| 115 static void | |
| 116 init_dialog () | |
| 117 { | |
| 118 if (ins_dialog == 0) | |
| 119 { | |
| 120 DWORD tid; | |
| 121 HANDLE thread; | |
| 122 init_event = CreateEvent (0, 0, 0, 0); | |
| 123 thread = CreateThread (0, 0, dialog, 0, 0, &tid); | |
| 124 WaitForSingleObject (init_event, 10000); | |
| 125 CloseHandle (init_event); | |
| 126 SendMessage (ins_pprogress, PBM_SETRANGE, 0, MAKELPARAM (0, 100)); | |
| 127 SendMessage (ins_iprogress, PBM_SETRANGE, 0, MAKELPARAM (0, 100)); | |
| 128 SendMessage (ins_diskfull, PBM_SETRANGE, 0, MAKELPARAM (0, 100)); | |
| 129 } | |
| 130 | |
| 131 SetWindowText (ins_pkgname, ""); | |
| 132 SetWindowText (ins_filename, ""); | |
| 133 SendMessage (ins_pprogress, PBM_SETPOS, (WPARAM) 0, 0); | |
| 134 SendMessage (ins_iprogress, PBM_SETPOS, (WPARAM) 0, 0); | |
| 135 SendMessage (ins_diskfull, PBM_SETPOS, (WPARAM) 0, 0); | |
| 136 ShowWindow (ins_dialog, SW_SHOWNORMAL); | |
| 137 SetForegroundWindow (ins_dialog); | |
| 138 } | |
| 139 | |
| 140 static void | |
| 141 progress (int bytes) | |
| 142 { | |
| 143 int perc; | |
| 144 | |
| 145 if (package_bytes > 100) | |
| 146 { | |
| 147 perc = bytes / (package_bytes / 100); | |
| 148 SendMessage (ins_pprogress, PBM_SETPOS, (WPARAM) perc, 0); | |
| 149 } | |
| 150 | |
| 151 if (total_bytes > 100) | |
| 152 { | |
| 153 perc = (total_bytes_sofar + bytes) / (total_bytes / 100); | |
| 154 SendMessage (ins_iprogress, PBM_SETPOS, (WPARAM) perc, 0); | |
| 155 } | |
| 156 } | |
| 157 | |
| 158 static void | |
| 159 badrename (char *o, char *n) | |
| 160 { | |
| 161 char *err = strerror (errno); | |
| 162 if (!err) | |
| 163 err = "(unknown error)"; | |
| 164 note (IDS_ERR_RENAME, o, n, err); | |
| 165 } | |
| 166 | |
| 167 static char *standard_dirs[] = { | |
| 168 0 | |
| 169 }; | |
| 170 | |
| 171 void | |
| 172 hash::add_subdirs (char *path) | |
| 173 { | |
| 174 char *nonp, *pp; | |
| 175 for (nonp = path; *nonp == '\\' || *nonp == '/'; nonp++); | |
| 176 for (pp = path + strlen(path) - 1; pp>nonp; pp--) | |
| 177 if (*pp == '/' || *pp == '\\') | |
| 178 { | |
| 179 int i, s=0; | |
| 180 char c = *pp; | |
| 181 *pp = 0; | |
| 182 for (i=0; standard_dirs[i]; i++) | |
| 183 if (strcmp (standard_dirs[i]+1, path) == 0) | |
| 184 { | |
| 185 s = 1; | |
| 186 break; | |
| 187 } | |
| 188 if (s == 0) | |
| 189 add (path); | |
| 190 *pp = c; | |
| 191 } | |
| 192 } | |
| 193 | |
| 194 char * | |
| 195 map_filename (char *fn, int type) | |
| 196 { | |
| 197 char *dest_file; | |
| 198 while (*fn == '/' || *fn == '\\') | |
| 199 fn++; | |
| 200 if (type == TY_GENERIC) | |
| 201 dest_file = concat (root_dir, XEMACS_PACKAGE_DIR, fn, 0); | |
| 202 else // TY_CYGWIN | TY_NATIVE | |
| 203 dest_file = concat (root_dir, "/", fn, 0); | |
| 204 return dest_file; | |
| 205 } | |
| 206 | |
| 207 static int | |
| 208 exists (char *file) | |
| 209 { | |
| 210 if (_access (file, 0) == 0) | |
| 211 return 1; | |
| 212 return 0; | |
| 213 } | |
| 214 | |
| 215 | |
| 216 static int num_installs, num_uninstalls; | |
| 217 | |
| 218 static void | |
| 219 uninstall_one (char *name, int action, int type) | |
| 220 { | |
| 221 hash dirs; | |
| 222 char line[_MAX_PATH]; | |
| 223 char* fname = (type == TY_GENERIC ? | |
| 224 concat (root_dir, XEMACS_PACKAGE_DIR, "pkginfo/MANIFEST.", | |
| 225 name, 0) : | |
| 226 concat (root_dir, XEMACS_SETUP_DIR, "MANIFEST.", name, 0)); | |
| 227 | |
| 228 FILE* lst = fopen (fname, "rb"); | |
| 229 | |
| 230 if (lst) | |
| 231 { | |
| 232 SetWindowText (ins_pkgname, name); | |
| 233 SetWindowText (ins_action, "Uninstalling..."); | |
| 707 | 234 // remove shortcuts and registry entries |
| 235 if (type != TY_GENERIC) | |
| 236 remove_xemacs_setup(); | |
| 237 | |
| 448 | 238 if (action == ACTION_UPGRADE) |
| 239 log (0, "Uninstalling old %s", name); | |
| 240 else | |
| 241 log (0, "Uninstalling %s", name); | |
| 242 | |
| 243 while (fgets (line, sizeof (line), lst)) | |
| 244 { | |
| 245 if (line[strlen(line)-1] == '\n') | |
| 246 line[strlen(line)-1] = 0; | |
| 247 | |
| 248 dirs.add_subdirs (line); | |
| 249 | |
| 250 char *d = map_filename (line, type); | |
| 251 DWORD dw = GetFileAttributes (d); | |
| 252 if (dw != 0xffffffff && !(dw & FILE_ATTRIBUTE_DIRECTORY)) | |
| 253 { | |
| 254 log (LOG_BABBLE, "unlink %s", d); | |
| 255 DeleteFile (d); | |
| 256 } | |
| 257 } | |
| 258 fclose (lst); | |
| 259 | |
| 260 remove (fname); | |
| 261 | |
| 262 dirs.reverse_sort (); | |
| 263 char *subdir = 0; | |
| 264 while ((subdir = dirs.enumerate (subdir)) != 0) | |
| 265 { | |
| 266 char *d = map_filename (subdir, type); | |
| 267 if (RemoveDirectory (d)) | |
| 268 log (LOG_BABBLE, "rmdir %s", d); | |
| 269 } | |
| 270 num_uninstalls ++; | |
| 271 } | |
| 272 } | |
| 273 | |
| 274 | |
| 275 static int | |
| 276 install_one (char *name, char *file, int file_size, int action, int type) | |
| 277 { | |
| 278 int errors = 0; | |
| 279 char *local = file, *cp, *fn, *base; | |
| 280 | |
| 281 base = local; | |
| 282 for (cp=local; *cp; cp++) | |
| 283 if (*cp == '/' || *cp == '\\' || *cp == ':') | |
| 284 base = cp+1; | |
| 819 | 285 |
| 448 | 286 SetWindowText (ins_pkgname, base); |
| 287 | |
| 288 if (!exists (local) && exists (base)) | |
| 289 local = base; | |
| 290 if (!exists (local)) | |
| 291 { | |
| 292 note (IDS_ERR_OPEN_READ, local, "No such file"); | |
| 293 return 1; | |
| 294 } | |
| 295 | |
| 296 char* fname = (type == TY_GENERIC ? | |
| 297 concat (root_dir, XEMACS_PACKAGE_DIR, "pkginfo/MANIFEST.", | |
| 298 name, 0) : | |
| 299 concat (root_dir, XEMACS_SETUP_DIR, "MANIFEST.", name, 0)); | |
| 300 | |
| 301 FILE* lst = fopen (fname, "wb"); | |
| 302 | |
| 303 package_bytes = file_size; | |
| 304 | |
| 305 switch (action) | |
| 306 { | |
| 307 case ACTION_NEW: | |
| 308 SetWindowText (ins_action, "Installing..."); | |
| 309 break; | |
| 310 case ACTION_UPGRADE: | |
| 311 SetWindowText (ins_action, "Upgrading..."); | |
| 312 break; | |
| 313 } | |
| 314 | |
| 315 log (0, "Installing %s", local); | |
| 316 tar_open (local); | |
| 317 while ((fn = tar_next_file ())) | |
| 318 { | |
| 819 | 319 char *dest_file, *disp_file; |
| 320 int len; | |
| 448 | 321 |
| 322 if (lst) | |
| 323 fprintf (lst, "%s\n", fn); | |
| 324 | |
| 325 dest_file = map_filename (fn, type); | |
| 819 | 326 |
| 327 // The installer uses a variable width font. Assume roughly 32 chars | |
| 328 // will fit and munge the file accordingly. | |
| 329 #define MAX_DISP_SIZE 50 | |
| 330 disp_file = strdup(dest_file); | |
| 331 if ((len = strlen(dest_file)) > MAX_DISP_SIZE) { | |
| 332 disp_file += (len - MAX_DISP_SIZE); | |
| 333 disp_file[0] = '.'; | |
| 334 disp_file[1] = '.'; | |
| 335 disp_file[2] = '.'; | |
| 336 } | |
| 337 #undef MAX_DISP_SIZE | |
| 338 SetWindowText (ins_filename, disp_file); | |
| 448 | 339 |
| 340 log (LOG_BABBLE, "Installing file %s", dest_file); | |
| 341 if (tar_read_file (dest_file) != 0) | |
| 342 { | |
| 343 log (0, "Unable to install file %s", dest_file); | |
| 344 errors ++; | |
| 345 } | |
| 346 | |
| 347 progress (tar_ftell ()); | |
| 348 num_installs ++; | |
| 349 } | |
| 350 tar_close (); | |
| 351 | |
| 352 total_bytes_sofar += file_size; | |
| 353 progress (0); | |
| 354 | |
| 355 int df = diskfull (root_dir); | |
| 356 SendMessage (ins_diskfull, PBM_SETPOS, (WPARAM) df, 0); | |
| 357 | |
| 358 if (lst) | |
| 359 fclose (lst); | |
| 360 | |
| 361 return errors; | |
| 362 } | |
| 363 | |
| 364 void | |
| 365 do_install (HINSTANCE h) | |
| 366 { | |
| 367 int i; | |
| 368 int errors = 0; | |
| 369 | |
| 370 num_installs = 0, num_uninstalls = 0; | |
| 371 | |
| 372 next_dialog = IDD_DESKTOP; | |
| 373 | |
| 374 mkdir_p (1, root_dir); | |
| 375 | |
| 376 for (i=0; standard_dirs[i]; i++) | |
| 377 { | |
| 378 char *p = concat (root_dir, standard_dirs[i], 0); | |
| 379 mkdir_p (1, p); | |
| 380 free (p); | |
| 381 } | |
| 382 | |
| 383 dismiss_url_status_dialog (); | |
| 384 | |
| 385 init_dialog (); | |
| 386 | |
| 387 total_bytes = 0; | |
| 388 total_bytes_sofar = 0; | |
| 389 | |
| 390 int df = diskfull (root_dir); | |
| 391 SendMessage (ins_diskfull, PBM_SETPOS, (WPARAM) df, 0); | |
| 392 | |
| 393 LOOP_PACKAGES | |
| 394 { | |
| 395 total_bytes += pi.install_size; | |
| 396 } | |
| 397 | |
| 398 for (i=0; i<npackages; i++) | |
| 399 { | |
| 400 if (package[i].action == ACTION_UNINSTALL | |
| 401 || (package[i].action == ACTION_UPGRADE && pi.install)) | |
| 402 { | |
| 403 uninstall_one (package[i].name, package[i].action, | |
| 404 package[i].type); | |
| 405 uninstall_one (concat (package[i].name, "-src", 0), package[i].action, | |
| 406 package[i].type); | |
| 407 } | |
| 408 | |
| 409 if ((package[i].action == ACTION_NEW | |
| 410 || package[i].action == ACTION_UPGRADE) | |
| 411 && pi.install) | |
| 412 { | |
| 413 int e = install_one (package[i].name, pi.install, pi.install_size, package[i].action, | |
| 414 package[i].type); | |
| 415 if (package[i].srcaction == SRCACTION_YES && pi.source) | |
| 416 e += install_one (concat (package[i].name, "-src", 0), pi.source, pi.source_size, | |
| 417 package[i].action, package[i].type); | |
| 418 if (e) | |
| 419 { | |
| 420 package[i].action = ACTION_ERROR; | |
| 421 errors++; | |
| 422 } | |
| 423 } | |
| 424 } // end of big package loop | |
| 425 | |
| 426 ShowWindow (ins_dialog, SW_HIDE); | |
| 427 | |
| 428 char *odbn = concat (root_dir, XEMACS_SETUP_DIR, "installed.db", 0); | |
| 429 char *ndbn = concat (root_dir, XEMACS_SETUP_DIR, "installed.db.new", 0); | |
| 430 char *sdbn = concat (root_dir, XEMACS_SETUP_DIR, "installed.db.old", 0); | |
| 431 | |
| 432 mkdir_p (0, ndbn); | |
| 433 | |
| 434 FILE *odb = fopen (odbn, "rt"); | |
| 435 FILE *ndb = fopen (ndbn, "wb"); | |
| 436 | |
| 437 if (!ndb) | |
| 438 { | |
| 439 char *err = strerror (errno); | |
| 440 if (!err) | |
| 441 err = "(unknown error)"; | |
| 442 fatal (IDS_ERR_OPEN_WRITE, ndb, err); | |
| 443 } | |
| 444 | |
| 445 if (odb) | |
| 446 { | |
| 447 char line[1000], pkg[1000]; | |
| 448 int printit; | |
| 449 while (fgets (line, 1000, odb)) | |
| 450 { | |
| 451 printit = 1; | |
| 452 sscanf (line, "%s", pkg); | |
| 453 for (i=0; i<npackages; i++) | |
| 454 { | |
| 455 if (strcmp (pkg, package[i].name) == 0) | |
| 456 switch (package[i].action) | |
| 457 { | |
| 458 case ACTION_NEW: | |
| 459 case ACTION_UPGRADE: | |
| 460 case ACTION_UNINSTALL: | |
| 461 printit = 0; | |
| 462 break; | |
| 463 } | |
| 464 } | |
| 465 if (printit) | |
| 466 fputs (line, ndb); | |
| 467 } | |
| 468 | |
| 469 } | |
| 470 | |
| 471 LOOP_PACKAGES | |
| 472 { | |
| 473 if (package[i].srcaction == SRCACTION_YES) | |
| 474 fprintf (ndb, "%s %s %d %s %d\n", package[i].name, | |
| 475 pi.install, pi.install_size, | |
| 476 pi.source, pi.source_size); | |
| 477 else | |
| 478 fprintf (ndb, "%s %s %d\n", package[i].name, | |
| 479 pi.install, pi.install_size); | |
| 480 } | |
| 481 | |
| 482 if (odb) | |
| 483 fclose (odb); | |
| 484 fclose (ndb); | |
| 485 | |
| 486 remove (sdbn); | |
| 487 if (odb && rename (odbn, sdbn)) | |
| 488 badrename (odbn, sdbn); | |
| 489 | |
| 490 remove (odbn); | |
| 491 if (rename (ndbn, odbn)) | |
| 492 badrename (ndbn, odbn); | |
| 493 | |
| 494 if (num_installs == 0 && num_uninstalls == 0) | |
| 495 { | |
| 496 exit_msg = IDS_NOTHING_INSTALLED; | |
| 497 return; | |
| 498 } | |
| 499 if (num_installs == 0) | |
| 500 { | |
| 501 exit_msg = IDS_UNINSTALL_COMPLETE; | |
| 502 return; | |
| 503 } | |
| 504 | |
| 505 if (errors) | |
| 506 exit_msg = IDS_INSTALL_INCOMPLETE; | |
| 507 else | |
| 508 exit_msg = IDS_INSTALL_COMPLETE; | |
| 509 } |
