update.
[chise/xemacs-chise.git.1] / netinstall / fromcwd.cc
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 handle the case where we're
17    installing from files that already exist in the current directory.
18    If a setup.ini file is present, we set the mirror site to "." and
19    pretend we're installing from the `internet' ;-) else we have to
20    find all the .tar.gz files, deduce their versions, and try to
21    compare versions in the case where the current directory contains
22    multiple versions of any given package.  We do *not* try to compare
23    versions with already installed packages; we always choose a
24    package in the current directory over one that's already installed
25    (otherwise, why would you have asked to install it?).  Note
26    that we search recursively. */
27
28 #include "win32.h"
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <io.h>
33 #include <ctype.h>
34 #ifndef WIN32_NATIVE
35 #include <unistd.h>
36 #endif
37
38 #include "ini.h"
39 #include "resource.h"
40 #include "concat.h"
41 #include "state.h"
42 #include "dialog.h"
43 #include "msg.h"
44 #include "find.h"
45 #include "version.h"
46
47 #include "port.h"
48
49 static int
50 is_test_version (char *v)
51 {
52   int i;
53   for (i=0; v[i] && isdigit (v[i]); i++) ;
54   return (i >= 6) ? 1 : 0;
55 }
56
57 char *
58 canonicalize_version (char *v)
59 {
60   static char nv[3][100];
61   static int idx = 0;
62   char *np, *dp;
63   int i;
64
65   idx = (idx+1) % 3;
66   np = nv[idx];
67
68   while (*v)
69     {
70       if (isdigit (*v))
71         {
72           for (dp=v; *dp && isdigit (*dp); dp++) ;
73           for (i=dp-v; i<12; i++)
74             *np++ = '0';
75           while (v < dp)
76             *np++ = *v++;
77         }
78       else
79         *np++ = *v++;
80     }
81   *np++ = 0;
82   return nv[idx];
83 }
84
85 static void
86 found_file (char *path, unsigned int fsize)
87 {
88   char base[_MAX_PATH], *ver;
89
90   int l = strlen (path);
91
92   if (strcmp (path + l - 7, ".tar.gz") != 0)
93     return;
94   if (strstr (path, "-src."))
95     return;
96   if (strstr (path, "-patch."))
97     return;
98
99   char *sl = strrchr (path, '/');
100   if (sl)
101     sl ++;
102   else
103     sl = path;
104   strcpy (base, sl);
105   base[strlen (base) - 7] = 0; /* remove .tar.gz */
106   for (ver=base; *ver; ver++)
107     if ((*ver == '-' || *ver == '_') && isdigit (ver[1]))
108       {
109         *ver++ = 0;
110         break;
111       }
112
113   Package *p = 0;
114   int i;
115
116   for (i=0; i<npackages; i++)
117     if (strcmp (package[i].name, base) == 0)
118       {
119         p = package + i;
120         break;
121       }
122   if (p == 0)
123       p = new_package (strdup (base));
124
125   int trust = is_test_version (ver) ? TRUST_TEST : TRUST_CURR;
126   if (!*ver)
127     trust = TRUST_PREV;
128
129   /* See if this version is older than what we have */
130   if (p->info[trust].version)
131     {
132       char *ov = canonicalize_version (p->info[trust].version);
133       char *nv = canonicalize_version (ver);
134       if (strcmp (ov, nv) > 0)
135         return;
136     }
137
138   l = strlen (base);
139   if (l >= 5 && strcmp (base + l - 5, "win32") == 0)
140     p->type = TY_NATIVE;
141   if (l >= 8 && strcmp (base + l - 8, "cygwin32") == 0)
142     p->type = TY_CYGWIN;
143
144   p->info[trust].version = strdup (ver);
145   p->info[trust].install = strdup (path);
146   p->info[trust].install_size = fsize;
147 }
148
149 void
150 do_fromcwd (HINSTANCE h)
151 {
152   if (_access ("./setup.ini", 0) == 0)
153     {
154       mirror_site = ".";
155       next_dialog = IDD_S_LOAD_INI;
156       return;
157     }
158
159   next_dialog = IDD_CHOOSE;
160
161   find (".", found_file);
162
163   // Now see about source tarballs
164   int i, t;
165   Package *p;
166   char srcpath[_MAX_PATH];
167   for (i=0; i<npackages; i++)
168     {
169       p = package+i;
170       for (t=TRUST_PREV; t<=TRUST_TEST; t++)
171         if (p->info[t].install)
172           {
173             strcpy (srcpath, p->info[t].install);
174             strcpy (srcpath + strlen (srcpath) - 7, "-src.tar.gz");
175             msg ("looking for %s", srcpath);
176
177             WIN32_FIND_DATA wfd;
178             HANDLE h = FindFirstFile (srcpath, &wfd);
179             if (h != INVALID_HANDLE_VALUE)
180               {
181                 msg("-- got it");
182                 FindClose (h);
183                 p->info[t].source = strdup (srcpath);
184                 p->info[t].source_size = wfd.nFileSizeLow;
185               }
186           }
187     }
188
189   return;
190 }