3
* This file is part of Open Sound System.
5
* Copyright (C) 4Front Technologies 1996-2008.
7
* This this source file is released under GPL v2 license (no other versions).
8
* See the COPYING file included in the main directory of this source
9
* distribution for the license terms and conditions.
18
#include <sys/types.h>
21
#include <sys/utsname.h>
25
#include "oss_config.h"
31
#define ELF_LOAD_SYMTAB elf_load_symtab
34
#define ELF_LOAD_SYMTAB elf_load_symtab
36
#include "../../../setup/elflib.inc"
44
int check_compile_vermagic = 0;
47
sym_callback (char *buffer, int blen, Elf_Sym * sym, char *name, int addr)
50
char tmp[256], *vermagic = tmp;
56
printf ("Vermagic buffer at %x\n", addr);
58
elf_read_datasym (buffer, blen, sym, addr, tmp, sizeof (tmp));
60
if (strncmp (vermagic, "vermagic=", 9) == 0)
64
printf ("%s\n", vermagic);
66
printf ("%s: '%s'\n", fname, vermagic);
73
find_vermagic (char *fname)
78
printf ("ELF scan %s\n", fname);
80
ok = ELF_LOAD_SYMTAB (fname, "vermagic", sym_callback);
82
ok = ELF_LOAD_SYMTAB (fname, "__mod_vermagic", sym_callback);
84
ELF_LOAD_SYMTAB (fname, "__oss_compile_vermagic", sym_callback);
88
find_link_vermagic (char *fname)
91
printf ("ELF scan %s\n", fname);
93
ELF_LOAD_SYMTAB (fname, "__oss_compile_vermagic", sym_callback);
97
check_gzipped_module (char *fname)
101
sprintf (tmp, "gunzip -c %s > /tmp/oss.tmpmodule", fname);
102
unlink ("/tmp/oss.tmpmodule");
104
if (system (tmp) != 0)
106
unlink ("/tmp/oss.tmpmodule");
110
find_vermagic ("/tmp/oss.tmpmodule");
111
unlink ("/tmp/oss.tmpmodule");
115
check_bzipped_module (char *fname)
119
sprintf (tmp, "bunzip2 -c %s > /tmp/oss.tmpmodule", fname);
120
unlink ("/tmp/oss.tmpmodule");
122
if (system (tmp) != 0)
124
unlink ("/tmp/oss.tmpmodule");
128
find_vermagic ("/tmp/oss.tmpmodule");
129
unlink ("/tmp/oss.tmpmodule");
133
scan_dir (char *dirname)
139
if ((dir = opendir (dirname)) == NULL)
142
while ((de = readdir (dir)))
146
if (de->d_name[0] == '.')
149
sprintf (tmp, "%s/%s", dirname, de->d_name);
151
if (stat (tmp, &st) == -1)
157
if (S_ISDIR (st.st_mode))
164
printf ("Checking %s\n", tmp);
165
p = tmp + strlen (tmp) - 3; // Seek the .gz suffix
166
if (strcmp (p, ".gz") == 0)
169
check_gzipped_module (tmp);
173
p = tmp + strlen (tmp) - 4; // Seek the .bz2 suffix
174
if (strcmp (p, ".bz2") == 0)
177
check_bzipped_module (tmp);
190
find_system_vermagic (void)
197
if (uname (&un) == -1)
203
sprintf (dirname, "/lib/modules/%s/kernel", un.release);
205
if (stat (dirname, &st) == -1)
208
fprintf (stderr, "Kernel modules not available\n");
218
main (int argc, char *argv[])
227
for (i = 1; i < argc; i++)
229
if (strcmp (argv[i], "-r") == 0)
232
* Check if the system is 2.6.20 or later which is
233
* always compiled with CONFIG_REGPARM.
239
if (uname (&un) == -1)
245
if (sscanf (un.release, "%d.%d.%d", &a, &b, &c) != 3)
247
fprintf (stderr, "Unrecognized kernel release '%s'\n",
249
exit (0); /* Assume it's some future kernel */
253
exit (0); /* Always REGPARM */
255
exit (0); /* Always REGPARM */
257
exit (0); /* Always REGPARM */
259
exit (1); /* Don't know */
262
if (strcmp (argv[i], "-s") == 0)
264
if (strcmp (argv[i], "-v") == 0)
266
if (strcmp (argv[i], "-z") == 0)
268
if (strcmp (argv[i], "-u") == 0)
269
check_compile_vermagic = 1;
275
"%s: This program is reserved for use by Open Sound System\n",
280
elf_verbose = verbose;
286
find_system_vermagic ();
291
unlink ("/tmp/oss.tmpmodule");
292
exit (WEXITSTATUS (status));
300
for (i = 1; i < argc; i++)
302
if (strcmp (argv[i], "-q") == 0)
308
if (strcmp (argv[i], "-1") == 0)
319
if (check_compile_vermagic == 0) find_vermagic (fname);
320
else find_link_vermagic (fname);