1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/tools/fetchdlls/main.cpp Sat May 24 06:48:35 2008 +0000
1.3 @@ -0,0 +1,192 @@
1.4 +#include <stdio.h>
1.5 +#include <windows.h>
1.6 +#include <DbgHelp.h>
1.7 +
1.8 +void mdmp_string(void *mdmp, RVA addr, char *buffer, size_t maxlength)
1.9 +{
1.10 + int len;
1.11 + MINIDUMP_STRING *str;
1.12 +
1.13 + str = (MINIDUMP_STRING *)((char *)mdmp + addr);
1.14 + len = WideCharToMultiByte(CP_UTF8,
1.15 + 0,
1.16 + str->Buffer,
1.17 + str->Length / sizeof(WCHAR),
1.18 + buffer,
1.19 + maxlength,
1.20 + NULL,
1.21 + NULL);
1.22 + buffer[len] = '\0';
1.23 +}
1.24 +
1.25 +int find_revision(const char *version, MINIDUMP_MODULE *module, const char *name)
1.26 +{
1.27 + FILE *fp;
1.28 + char msg[255];
1.29 + size_t i, len;
1.30 + char path[255];
1.31 + char buffer[3000];
1.32 + int last_revision;
1.33 +
1.34 + len = _snprintf(path, sizeof(path), "%s", name);
1.35 + for (i = 0; i < len; i++)
1.36 + {
1.37 + if (path[i] == '\\')
1.38 + {
1.39 + path[i] = '/';
1.40 + }
1.41 + }
1.42 +
1.43 + DeleteFile("_svnlog.txt");
1.44 + _snprintf(buffer,
1.45 + sizeof(buffer),
1.46 + "svn log svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s > _svnlog.txt",
1.47 + (module->VersionInfo.dwFileVersionMS >> 16),
1.48 + (module->VersionInfo.dwFileVersionMS & 0xFFFF),
1.49 + path);
1.50 + system(buffer);
1.51 +
1.52 + if ((fp = fopen("_svnlog.txt", "rt")) == NULL)
1.53 + {
1.54 + return -1;
1.55 + }
1.56 +
1.57 + _snprintf(msg,
1.58 + sizeof(msg),
1.59 + "sourcemod-%s",
1.60 + version);
1.61 +
1.62 + while (fgets(buffer, sizeof(buffer), fp) != NULL)
1.63 + {
1.64 + if (buffer[0] == 'r')
1.65 + {
1.66 + last_revision = atoi(&buffer[1]);
1.67 + }
1.68 + else if (strstr(buffer, msg) != NULL)
1.69 + {
1.70 + fclose(fp);
1.71 +
1.72 + _snprintf(buffer,
1.73 + sizeof(buffer),
1.74 + "svn export -q -r %d svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s",
1.75 + last_revision,
1.76 + (module->VersionInfo.dwFileVersionMS >> 16),
1.77 + (module->VersionInfo.dwFileVersionMS & 0xFFFF),
1.78 + path);
1.79 + system(buffer);
1.80 +
1.81 + return last_revision;
1.82 + }
1.83 + }
1.84 +
1.85 + fclose(fp);
1.86 +
1.87 + return -1;
1.88 +}
1.89 +
1.90 +int main(int argc, char **argv)
1.91 +{
1.92 + int rev;
1.93 + ULONG32 m;
1.94 + LPVOID mdmp;
1.95 + HANDLE hFile;
1.96 + const char *name;
1.97 + ULONG stream_size;
1.98 + char name_buf[255];
1.99 + HANDLE hFileMapping;
1.100 + MINIDUMP_MODULE *module;
1.101 + MINIDUMP_DIRECTORY *dir;
1.102 + MINIDUMP_MODULE_LIST *modules;
1.103 +
1.104 + if (argc < 3)
1.105 + {
1.106 + fprintf(stderr, "Usage: <build> <mdmp>\n");
1.107 + exit(-1);
1.108 + }
1.109 +
1.110 + if ((hFile = CreateFile(argv[2],
1.111 + GENERIC_READ,
1.112 + FILE_SHARE_READ,
1.113 + NULL,
1.114 + OPEN_EXISTING,
1.115 + FILE_ATTRIBUTE_NORMAL,
1.116 + NULL))
1.117 + == INVALID_HANDLE_VALUE)
1.118 + {
1.119 + fprintf(stderr, "Could not open file (error %d)\n", GetLastError());
1.120 + exit(-1);
1.121 + }
1.122 +
1.123 + hFileMapping = CreateFileMapping(
1.124 + hFile,
1.125 + NULL,
1.126 + PAGE_READONLY,
1.127 + 0,
1.128 + 0,
1.129 + NULL);
1.130 + if (hFileMapping == NULL)
1.131 + {
1.132 + fprintf(stderr, "Could not open file mapping (error %d)\n", GetLastError());
1.133 + CloseHandle(hFile);
1.134 + exit(-1);
1.135 + }
1.136 +
1.137 + mdmp = MapViewOfFile(hFileMapping,
1.138 + FILE_MAP_READ,
1.139 + 0,
1.140 + 0,
1.141 + 0);
1.142 + if (mdmp == NULL)
1.143 + {
1.144 + fprintf(stderr, "Could not create map view (error %d)\n", GetLastError());
1.145 + CloseHandle(hFileMapping);
1.146 + CloseHandle(hFile);
1.147 + exit(-1);
1.148 + }
1.149 +
1.150 + if (!MiniDumpReadDumpStream(mdmp,
1.151 + ModuleListStream,
1.152 + &dir,
1.153 + (void **)&modules,
1.154 + &stream_size))
1.155 + {
1.156 + fprintf(stderr, "Could not read the module list stream.\n");
1.157 + UnmapViewOfFile(mdmp);
1.158 + CloseHandle(hFileMapping);
1.159 + CloseHandle(hFile);
1.160 + }
1.161 +
1.162 + for (m = 0; m < modules->NumberOfModules; m++)
1.163 + {
1.164 + module = &modules->Modules[m];
1.165 +
1.166 + mdmp_string(mdmp, module->ModuleNameRva, name_buf, sizeof(name_buf));
1.167 +
1.168 + if ((name = strstr(name_buf, "sourcemod\\")) != NULL)
1.169 + {
1.170 + name += 10;
1.171 + fprintf(stdout,
1.172 + "looking for: %s (%d.%d.%d.%d of build %s)... ",
1.173 + name,
1.174 + (module->VersionInfo.dwFileVersionMS >> 16),
1.175 + (module->VersionInfo.dwFileVersionMS & 0xFFFF),
1.176 + (module->VersionInfo.dwFileVersionLS >> 16),
1.177 + (module->VersionInfo.dwFileVersionLS & 0xFFFF),
1.178 + argv[1]
1.179 + );
1.180 + fflush(stdout);
1.181 + if ((rev = find_revision(argv[1], module, name)) == -1)
1.182 + {
1.183 + fprintf(stdout, "not found :(\n");
1.184 + continue;
1.185 + }
1.186 + fprintf(stdout, "downloaded! (pkgrev %d)\n", rev);
1.187 + }
1.188 + }
1.189 +
1.190 + UnmapViewOfFile(mdmp);
1.191 + CloseHandle(hFileMapping);
1.192 + CloseHandle(hFile);
1.193 +
1.194 + return 0;
1.195 +}