Add -lole32 to link libraries.
This fixes a problem when compiling with mingw-headers version 3.3
where the use of SHGetFolderPath() expands to a call to CoTaskMemFree()
which is defined in libole32.dll:
/usr/x86_64-w64-mingw32/sys-root/mingw/include/shobjidl.h:29954: undefined reference to `__imp_CoTaskMemFree'
2 * Copyright (C) 2014 J. Ali Harlow <ali@juiblex.co.uk>
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.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 #include "razor-internal.h"
29 dump_raw(FILE *fp, void *raw, char *what, size_t length, size_t offset)
32 unsigned char *bytes = raw;
35 fprintf(fp, "%05lX %s", (unsigned long)(offset + n), what);
36 for (i = 0; (i < 16) && (length > 0);) {
38 fprintf(fp, " %08X", *(uint32_t *)bytes);
43 } else if (length >= 2) {
44 fprintf(fp, " %04X", *(unsigned short *)bytes);
50 fprintf(fp, " %02X", *bytes);
64 dump_string(FILE *fp, char *pool, size_t length, size_t offset)
70 while (offset + n < length) {
71 c = pool[offset + n++];
76 else if (c == '\\' || c == '"')
77 fprintf(fp, "\\%c", c);
78 else if (c >= ' ' && c <= '~')
81 fprintf(fp, "\\x%02X", c);
89 dump_pool(FILE *fp, char *pool, char *what, size_t length, size_t offset)
93 fprintf(fp, "%05lX %s {\n", (unsigned long)offset, what);
96 fprintf(fp, " %08X ", (uint32_t)n);
97 n += dump_string(fp, pool, length, n);
107 dump_header(FILE *fp, struct razor_set_header *header, size_t length,
110 if (length >= sizeof(*header)) {
111 fprintf(fp, "%05lX header ", (unsigned long)offset);
112 fprintf(fp, "{ magic=%08X version=%08X num_sections=%08X }\n",
113 header->magic, header->version, header->num_sections);
114 return sizeof(*header);
116 return dump_raw(fp, header, "unknown", length, offset);
120 dump_section(FILE *fp, struct razor_set_section *section, size_t length,
121 size_t offset, int indx)
123 if (length >= sizeof(*section)) {
124 fprintf(fp, "%05lX section %X ", (unsigned long)offset, indx);
125 fprintf(fp, "{ name=%08X offset=%08X size=%08X }\n",
126 section->name, section->offset, section->size);
127 return sizeof(*section);
129 return dump_raw(fp, section, "unknown", length, offset);
133 dump_list_head(FILE *fp, struct list_head *head)
135 fprintf(fp, "{ list_ptr=%06X flags=%02X ",
136 head->list_ptr, head->flags);
137 if (head->flags == RAZOR_EMPTY_LIST)
138 fprintf(fp, "(EMPTY_LIST) ");
139 else if (head->flags == RAZOR_IMMEDIATE)
140 fprintf(fp, "(IMMEDIATE) ");
145 dump_list_link(FILE *fp, struct list *list)
147 fprintf(fp, "{ data=%06X flags=%02X ",
148 list->data, list->flags);
149 if (list->flags == RAZOR_ENTRY_LAST)
150 fprintf(fp, "(ENTRY_LAST) ");
151 else if (list->flags == RAZOR_ENTRY_FIRST)
152 fprintf(fp, "(ENTRY_FIRST) ");
157 expand_pooled_string(FILE *fp, struct array *pool, uint32_t str)
159 if (pool->data && str < pool->size) {
161 dump_string(fp, pool->data, pool->size, str);
167 dump_package(FILE *fp, struct razor_package *package, size_t length,
168 size_t offset, struct array *string_pool, int indx)
170 if (length >= sizeof(*package)) {
171 fprintf(fp, " %05lX package %X ", (unsigned long)offset,
173 fprintf(fp, "{ name=%06X ", package->name);
174 expand_pooled_string(fp, string_pool, package->name);
175 fprintf(fp, "flags=%02X\n version=%08X ",
176 package->flags, package->version);
177 expand_pooled_string(fp, string_pool, package->version);
178 fprintf(fp, "arch=%08X ", package->arch);
179 expand_pooled_string(fp, string_pool, package->arch);
181 "summary=%08X description=%08X url=%08X license=%08X\n",
182 package->summary, package->description,
183 package->url, package->license);
184 fprintf(fp," properties=");
185 dump_list_head(fp, &package->properties);
187 fprintf(fp," files=");
188 dump_list_head(fp, &package->files);
190 fprintf(fp," install_prefixes=");
191 dump_list_head(fp, &package->install_prefixes);
193 fprintf(fp," preun={ program=%08X body=%08X }\n",
194 package->preun.program, package->preun.body);
195 fprintf(fp," postun={ program=%08X body=%08X }\n",
196 package->postun.program, package->postun.body);
198 return sizeof(*package);
200 return dump_raw(fp, package, "unknown", length, offset);
204 dump_packages(FILE *fp, struct razor_package *packages, size_t length,
205 size_t offset, struct array *string_pool)
210 fprintf(fp, "%05lX packages {\n", (unsigned long)offset);
213 n += dump_package(fp, packages, length - n, n, string_pool, i);
224 dump_property(FILE *fp, struct razor_property *property, size_t length,
225 size_t offset, struct array *string_pool)
227 if (length >= sizeof(*property)) {
228 fprintf(fp, " %05lX property ", (unsigned long)offset);
229 fprintf(fp, "{ name=%08X ", property->name);
230 expand_pooled_string(fp, string_pool, property->name);
231 fprintf(fp, "\n flags=%08X (", property->flags);
232 if (property->flags & RAZOR_PROPERTY_LESS)
234 if (property->flags & RAZOR_PROPERTY_GREATER)
236 if (property->flags & RAZOR_PROPERTY_EQUAL)
238 switch (property->flags & RAZOR_PROPERTY_TYPE_MASK) {
239 case RAZOR_PROPERTY_REQUIRES:
240 fprintf(fp, " requires");
242 case RAZOR_PROPERTY_PROVIDES:
243 fprintf(fp, " provides");
245 case RAZOR_PROPERTY_CONFLICTS:
246 fprintf(fp, " conflicts");
248 case RAZOR_PROPERTY_OBSOLETES:
249 fprintf(fp, " obsoletes");
252 if (property->flags & RAZOR_PROPERTY_PRE)
254 if (property->flags & RAZOR_PROPERTY_POST)
255 fprintf(fp, " post");
256 if (property->flags & RAZOR_PROPERTY_PREUN)
257 fprintf(fp, " preun");
258 if (property->flags & RAZOR_PROPERTY_POSTUN)
259 fprintf(fp, " postun");
260 fprintf(fp, ") version=%08X ", property->version);
261 expand_pooled_string(fp, string_pool, property->version);
262 fprintf(fp,"\n packages=");
263 dump_list_head(fp, &property->packages);
266 return sizeof(*property);
268 return dump_raw(fp, property, "unknown", length, offset);
272 dump_properties(FILE *fp, struct razor_property *properties, size_t length,
273 size_t offset, struct array *string_pool)
277 fprintf(fp, "%05lX properties {\n", (unsigned long)offset);
280 n += dump_property(fp, properties, length - n, n, string_pool);
290 dump_entry(FILE *fp, struct razor_entry *entry, size_t length, size_t offset,
291 struct array *string_pool, int indx)
293 if (length >= sizeof(*entry)) {
294 fprintf(fp, " %05lX entry %X ", (unsigned long)offset, indx);
295 fprintf(fp, "{ name=%06X ", entry->name);
296 expand_pooled_string(fp, string_pool, entry->name);
297 fprintf(fp, "\n flags=%02X ", entry->flags);
298 if (entry->flags == RAZOR_ENTRY_LAST)
299 fprintf(fp, "(LAST) ");
300 fprintf(fp, "start=%08X", entry->start);
302 fprintf(fp, " (NONE)");
303 fprintf(fp,"\n packages=");
304 dump_list_head(fp, &entry->packages);
307 return sizeof(*entry);
309 return dump_raw(fp, entry, "unknown", length, offset);
313 dump_files(FILE *fp, struct razor_entry *entries, size_t length, size_t offset,
314 struct array *string_pool)
319 fprintf(fp, "%05lX files {\n", (unsigned long)offset);
322 n += dump_entry(fp, entries, length - n, n, string_pool, i);
333 dump_lists(FILE *fp, struct list *lists, char *what, size_t length,
339 fprintf(fp, "%05lX %s {\n", (unsigned long)offset, what);
341 while (n + sizeof(*lists) <= length) {
342 fprintf(fp, " list %06X ", i);
343 dump_list_link(fp, lists);
351 n += dump_raw(fp, lists, "unknown", length - n, offset + n);
359 razor_dump_database(FILE *fp, const char *root, const char *filename,
360 struct razor_error **error)
363 char *s, *path, *data;
364 struct array pool = { 0, };
365 struct array string_pool = { 0, };
366 struct array file_string_pool = { 0, };
367 struct array details_string_pool = { 0, };
368 unsigned char *contents;
369 size_t length, len, n, min_offset;
370 struct razor_set_header *header;
371 struct razor_set_section *section, *sections;
372 struct razor_package *package;
373 struct razor_property *prop;
374 struct razor_entry *entry;
378 filename = "system.rzdb";
380 s = razor_concat(razor_get_database_path(), "/", filename, NULL);
381 path = razor_path_add_root(s, root);
383 contents = razor_file_get_contents(path, &length, 0, error);
391 header = (void *)contents;
394 n += dump_header(fp, header, length - n, n);
397 sections = (void *)(contents + n);
398 for (i = 0; i < header->num_sections; i++) {
401 section = (void *)(contents + n);
402 if (section->offset < min_offset)
403 min_offset = section->offset;
404 n += dump_section(fp, section, length - n, n, i);
408 pool.data = (char *)(contents + n);
409 pool.size = min_offset - n;
410 n += dump_pool(fp, pool.data, "pool", pool.size, n);
413 if ((length - n) && PADDING(n, 4))
414 n += dump_raw(fp, contents + n, "padding", PADDING(n, 4), n);
416 for (i = 0; length - n && i < header->num_sections; i++) {
417 if (sections[i].name < pool.size &&
418 ((char *)pool.data)[pool.size - 1] == '\0')
419 s = pool.data + sections[i].name;
423 data = (char *)(contents + sections[i].offset);
425 if (!strcmp(s, "string_pool")) {
426 string_pool.data = data;
427 string_pool.size = sections[i].size;
428 } else if (!strcmp(s, "file_string_pool")) {
429 file_string_pool.data = data;
430 file_string_pool.size = sections[i].size;
431 } else if (!strcmp(s, "details_string_pool")) {
432 details_string_pool.data = data;
433 details_string_pool.size = sections[i].size;
437 for (i = 0; i < header->num_sections; i++) {
440 section = sections + i;
441 if (section->offset != n)
444 if (len > length - n)
447 if (section->name < pool.size &&
448 ((char *)pool.data)[pool.size - 1] == '\0')
449 s = pool.data + section->name;
453 if (!strcmp(s, "string_pool") ||
454 !strcmp(s, "file_string_pool") ||
455 !strcmp(s, "details_string_pool"))
456 n += dump_pool(fp, (char *)(contents + n), s, len, n);
457 else if (!strcmp(s, "packages")) {
458 package = (void *)(contents + n);
459 n += dump_packages(fp, package, len, n, &string_pool);
460 } else if (!strcmp(s, "properties")) {
461 prop = (void *)(contents + n);
462 n += dump_properties(fp, prop, len, n, &string_pool);
463 } else if (!strcmp(s, "files")) {
464 entry = (void *)(contents + n);
465 n += dump_files(fp, entry, len, n, &file_string_pool);
466 } else if (!strcmp(s, "package_pool") ||
467 !strcmp(s, "property_pool") ||
468 !strcmp(s, "prefix_pool") ||
469 !strcmp(s, "file_pool")) {
470 list = (void *)(contents + n);
471 n += dump_lists(fp, list, s, len, n);
473 n += dump_raw(fp, contents + n, s, len, n);
475 if ((length - n) && PADDING(n, 4))
476 n += dump_raw(fp, contents + n, "padding",
481 n += dump_raw(fp, contents + n, "unknown", length - n, n);
483 fprintf(fp, "%05lX EOF\n", (unsigned long)n);
485 razor_file_free_contents(contents, length);