/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
/*
* cfgexport - load/configure the EXPORT kernel extension
*/
-#include <afs/param.h>
#include <afsconfig.h>
+#include <afs/param.h>
-RCSID("$Header$");
+#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include "export.h"
#include "sym.h"
-extern char *malloc(), *optarg;
-extern int errno;
-extern int sysconfig(int cmd, void *arg, int len);
+extern char *malloc(), *optarg;
+extern int sysconfig(int cmd, void *arg, int len);
-int debug;
+int debug = 0;
char *syms = "/unix";
+char *xstrings;
#include "AFS_component_version_number.c"
main(argc, argv)
-char **argv; {
- register add, del, opts;
- register c;
- char *file;
- mid_t kmid;
- struct cfg_load cload;
- struct cfg_kmod cmod;
- struct k_conf conf;
- FILE *fp;
+ char **argv;
+{
+ int add, del, opts;
+ int c;
+ char *file;
+ mid_t kmid;
+ struct cfg_load cload;
+ struct cfg_kmod cmod;
+ struct k_conf conf;
+ FILE *fp;
#ifdef AFS_AIX32_ENV
/*
- * The following signal action for AIX is necessary so that in case of a
- * crash (i.e. core is generated) we can include the user's data section
+ * The following signal action for AIX is necessary so that in case of a
+ * crash (i.e. core is generated) we can include the user's data section
* in the core dump. Unfortunately, by default, only a partial core is
* generated which, in many cases, isn't too useful.
*/
struct sigaction nsa;
-
+
sigemptyset(&nsa.sa_mask);
nsa.sa_handler = SIG_DFL;
nsa.sa_flags = SA_FULLDUMP;
sigaction(SIGSEGV, &nsa, NULL);
#endif
- add = del = 0;
-
- while ((c = getopt(argc, argv, "a:s:Z:d:")) != EOF) {
- switch (c) {
- case 'Z': /* Zdebug option */
- ++debug;
- break;
-
- case 'a':
- add = 1;
- file = optarg;
- if (!file)
- usage();
- break;
-
- case 'd':
- del = 1;
- file = optarg;
- if (!file)
- usage();
- break;
-
- case 's':
- syms = optarg;
- break;
-
- default:
- usage();
- break;
- }
- }
+ add = del = 0;
+
+ while ((c = getopt(argc, argv, "a:s:Z:d:")) != EOF) {
+ switch (c) {
+ case 'Z': /* Zdebug option */
+ ++debug;
+ break;
+
+ case 'a':
+ add = 1;
+ file = optarg;
+ if (!file)
+ usage();
+ break;
- if (!add && !del)
+ case 'd':
+ del = 1;
+ file = optarg;
+ if (!file)
usage();
+ break;
+
+ case 's':
+ syms = optarg;
+ break;
+
+ default:
+ usage();
+ break;
+ }
+ }
+
+ if (!add && !del)
+ usage();
+
+ if (add) {
+ char *buf[1024];
+ char PidFile[256];
+
+ buf[0] = "execerror";
+ buf[1] = "cfgexport";
+ get_syms(&conf, syms);
+
+ cload.path = file;
+ if (sysconfig(SYS_KLOAD, &cload, sizeof(cload)) == -1) {
+ loadquery(L_GETMESSAGES, &buf[2], sizeof buf - 8);
+ execvp("/etc/execerror", buf);
+ perror("SYS_KLOAD");
+ exit(1);
+ }
- if (add) {
- char *buf[1024];
- char PidFile[256];
-
- buf[0] = "execerror";
- buf[1] = "cfgexport";
- get_syms(&conf, syms);
-
- cload.path = file;
- if (sysconfig(SYS_KLOAD, &cload, sizeof(cload)) == -1) {
- loadquery(L_GETMESSAGES, &buf[2], sizeof buf - 8);
- execvp("/etc/execerror", buf);
- perror("SYS_KLOAD");
- exit(1);
- }
-
- cmod.kmid = cload.kmid;
- cmod.cmd = CFG_INIT;
- cmod.mdiptr = (caddr_t) &conf;
- cmod.mdilen = sizeof (conf);
-
- if (sysconfig(SYS_CFGKMOD, &cmod, sizeof(cmod)) == -1) {
- perror("SYS_CFGKMOD");
- cload.kmid = cload.kmid;
- sysconfig(SYS_KULOAD, &cload, sizeof(cload));
- exit(1);
- }
+ cmod.kmid = cload.kmid;
+ cmod.cmd = CFG_INIT;
+ cmod.mdiptr = (caddr_t) & conf;
+ cmod.mdilen = sizeof(conf);
+
+ if (sysconfig(SYS_CFGKMOD, &cmod, sizeof(cmod)) == -1) {
+ perror("SYS_CFGKMOD");
+ cload.kmid = cload.kmid;
+ sysconfig(SYS_KULOAD, &cload, sizeof(cload));
+ exit(1);
+ }
#ifdef notdef
- printf("cfgexport -d 0x%x # to remove EXPORT\n", cload.kmid);
+ printf("cfgexport -d 0x%x # to remove EXPORT\n", cload.kmid);
#endif
- strcpy(PidFile, file);
- strcat(PidFile, ".kmid");
- fp = fopen(PidFile, "w");
- if (fp) {
- (void) fprintf(fp, "%d\n", cload.kmid);
- (void) fclose(fp);
- } else {
- printf("Can't open for write file %s (error=%d); ignored\n", PidFile, errno);
- }
- exit(0);
- } else if (del) {
- char PidFile[256];
-
- strcpy(PidFile, file);
- strcat(PidFile, ".kmid");
- fp = fopen(PidFile, "r");
- if (!fp) {
- printf("Can't read %s file (error=%d); aborting\n", PidFile, errno);
- exit(1);
- }
- (void) fscanf(fp, "%d\n", &kmid);
- (void) fclose(fp);
- unlink(PidFile);
- cmod.kmid = kmid;
- cmod.cmd = CFG_TERM;
- cmod.mdiptr = NULL;
- cmod.mdilen = 0;
-
- if (sysconfig(SYS_CFGKMOD, &cmod, sizeof(cmod)) == -1) {
- perror("SYS_CFGKMOD");
- exit(1);
- }
-
- cload.kmid = kmid;
- if (sysconfig(SYS_KULOAD, &cload, sizeof(cload)) == -1) {
- perror("SYS_KULOAD");
- exit(1);
- }
- exit(0);
+ strcpy(PidFile, file);
+ strcat(PidFile, ".kmid");
+ fp = fopen(PidFile, "w");
+ if (fp) {
+ (void)fprintf(fp, "%d\n", cload.kmid);
+ (void)fclose(fp);
+ } else {
+ printf("Can't open for write file %s (error=%d); ignored\n",
+ PidFile, errno);
+ }
+ exit(0);
+ } else if (del) {
+ char PidFile[256];
+
+ strcpy(PidFile, file);
+ strcat(PidFile, ".kmid");
+ fp = fopen(PidFile, "r");
+ if (!fp) {
+ printf("Can't read %s file (error=%d); aborting\n", PidFile,
+ errno);
+ exit(1);
}
+ (void)fscanf(fp, "%d\n", &kmid);
+ (void)fclose(fp);
+ unlink(PidFile);
+ cmod.kmid = kmid;
+ cmod.cmd = CFG_TERM;
+ cmod.mdiptr = NULL;
+ cmod.mdilen = 0;
+
+ if (sysconfig(SYS_CFGKMOD, &cmod, sizeof(cmod)) == -1) {
+ perror("SYS_CFGKMOD");
+ exit(1);
+ }
+
+ cload.kmid = kmid;
+ if (sysconfig(SYS_KULOAD, &cload, sizeof(cload)) == -1) {
+ perror("SYS_KULOAD");
+ exit(1);
+ }
+ exit(0);
+ }
}
-usage() {
+usage()
+{
- error("usage: cfgexport [-a mod_file [-s symbols]] [-d mod_file]\n");
+ error("usage: cfgexport [-a mod_file [-s symbols]] [-d mod_file]\n");
}
/*
* syms - ^ to name of file containing XCOFF symbols
*/
get_syms(conf, syms)
-struct k_conf *conf;
-char *syms;
+ struct k_conf *conf;
+ char *syms;
{
- register sym_t *k_symtab, *ksp;
- register struct syment *x_symtab, *xsp, *xsq;
- register char *xstrings;
- char *kstrings;
- struct xcoffhdr hdr; /* XCOFF header from symbol file*/
- sym_t k_sym; /* export version of symbol */
- struct syment xcoff_sym; /* xcoff version of symbol */
- register i, nsyms, nksyms, nxsyms;
- int xstr_size, kstr_size;
- FILE *fp;
- int xsym_compar();
-
- fp = fopen(syms, "r");
- if (fp == NULL)
- sys_error(syms);
-
- if (fread(&hdr, sizeof (hdr), 1, fp) != 1)
- sys_error(syms);
-
- if (hdr.filehdr.f_nsyms == 0)
- error("%s: no symbols", syms);
-
- switch (hdr.filehdr.f_magic) {
- case U802WRMAGIC:
- case U802ROMAGIC:
- case U802TOCMAGIC:
- case U800WRMAGIC:
- case U800ROMAGIC:
- case U800TOCMAGIC:
- break;
+ sym_t *k_symtab, *ksp;
+ struct syment *x_symtab, *xsp, *xsq;
+ char *kstrings;
+ struct xcoffhdr hdr; /* XCOFF header from symbol file */
+ sym_t k_sym; /* export version of symbol */
+ struct syment xcoff_sym; /* xcoff version of symbol */
+ int i, nsyms, nksyms, nxsyms = 0;
+ int xstr_size, kstr_size;
+ FILE *fp;
+ int xsym_compar();
+
+ if (syms == NULL)
+ sys_error("syms is NULL");
+ fp = fopen(syms, "r");
+ if (fp == NULL)
+ sys_error(syms);
+
+ if (fread(&hdr, sizeof(hdr), 1, fp) != 1)
+ sys_error(syms);
+
+ if (hdr.filehdr.f_nsyms == 0)
+ error("%s: no symbols", syms);
+
+ switch (hdr.filehdr.f_magic) {
+ case U802WRMAGIC:
+ case U802ROMAGIC:
+ case U802TOCMAGIC:
+ case U800WRMAGIC:
+ case U800ROMAGIC:
+ case U800TOCMAGIC:
+#ifdef __XCOFF64__
+ case U64_TOCMAGIC:
+#endif
+ break;
- default:
- error("%s: funny magic number 0%o"
- , syms, hdr.filehdr.f_magic);
- }
+ default:
+ error("%s: funny magic number 0%o", syms, hdr.filehdr.f_magic);
+ }
- nsyms = hdr.filehdr.f_nsyms;
- if (debug)
- printf("nsyms = %d\n", nsyms);
+ nsyms = hdr.filehdr.f_nsyms;
+ if (debug)
+ printf("nsyms = %d\n", nsyms);
- x_symtab = (struct syment *) malloc(nsyms * SYMESZ);
- if (!x_symtab)
- error("no memory for symbol table");
+ x_symtab = malloc(nsyms * SYMESZ);
+ if (!x_symtab)
+ error("no memory for symbol table");
- /*
- * try to snarf the string table: should be just past the
- * symbol table: first 4 bytes is length of rest.
- */
- if (fseek(fp, hdr.filehdr.f_symptr + nsyms * SYMESZ, 0) < 0)
- sys_error("%s: seek to strtab", syms);
+ /*
+ * try to snarf the string table: should be just past the
+ * symbol table: first 4 bytes is length of rest.
+ */
+ if (fseek(fp, hdr.filehdr.f_symptr + nsyms * SYMESZ, 0) < 0)
+ sys_error("%s: seek to strtab", syms);
- if (fread(&xstr_size, sizeof (xstr_size), 1, fp) != 1)
- error("%s: reading string table size", syms);
+ if (fread(&xstr_size, sizeof(xstr_size), 1, fp) != 1)
+ error("%s: reading string table size", syms);
- xstrings = malloc(xstr_size + sizeof (xstr_size));
- if (!xstrings)
- error("no memory for string table");
+ xstrings = malloc(xstr_size + sizeof(xstr_size));
+ if (!xstrings)
+ error("no memory for string table");
- /*
- * seek back to the start of the strings
- */
- if (fseek(fp, hdr.filehdr.f_symptr + nsyms * SYMESZ, 0) < 0)
- sys_error("%s: seek to strtab", syms);
+ /*
+ * seek back to the start of the strings
+ */
+ if (fseek(fp, hdr.filehdr.f_symptr + nsyms * SYMESZ, 0) < 0)
+ sys_error("%s: seek to strtab", syms);
- if (fread(xstrings, sizeof (*xstrings), xstr_size, fp) != xstr_size)
- error("%s: reading string table");
+ if (fread(xstrings, sizeof(*xstrings), xstr_size, fp) != xstr_size)
+ error("%s: reading string table");
- /*
- * now seek back to the start of the symbol table, and read it
- * all in.
- */
- if (fseek(fp, hdr.filehdr.f_symptr, 0) < 0)
- sys_error("%s: seek to symtab", syms);
-
- xsp = &x_symtab[0];
-
- for (i = nxsyms = 0; i < nsyms; ++i) {
- char name[16], *p;
-
- if (fread(&xcoff_sym, SYMESZ, 1, fp) != 1)
- error("%s: reading symbol entry", syms);
-
- if (xcoff_sym.n_zeroes == 0) {
- /*
- * Need to relocate string table offset
- */
- p = xcoff_sym.n_nptr = xstrings + xcoff_sym.n_offset;
- } else {
- strncpy(name, xcoff_sym.n_name, 8);
-
- p = name, p[8] = 0;
- }
-
- if (debug > 2)
- dump_xsym(&xcoff_sym);
-
- switch (xcoff_sym.n_sclass) {
- case C_EXT: /* external */
- case C_HIDEXT: /* hidden external (sic) */
- /*
- * filtre out the ones with the strange names
- */
- if (strchr(p, '@') || strchr(p, '$') || p[0] == 0)
- break;
-
- *xsp++ = xcoff_sym;
- ++nxsyms;
-
- if (debug > 1)
- dump_xsym(&xcoff_sym);
-
- break;
- }
-
- if (xcoff_sym.n_numaux) {
- fseek(fp, xcoff_sym.n_numaux * AUXESZ, 1);
- i += xcoff_sym.n_numaux;
- }
+ /*
+ * now seek back to the start of the symbol table, and read it
+ * all in.
+ */
+ if (fseek(fp, hdr.filehdr.f_symptr, 0) < 0)
+ sys_error("%s: seek to symtab", syms);
+
+ xsp = &x_symtab[0];
+
+ for (i = nxsyms = 0; i < nsyms; ++i) {
+ char name[16], *p;
+
+ if (fread(&xcoff_sym, SYMESZ, 1, fp) != 1)
+ error("%s: reading symbol entry", syms);
+
+#ifdef __XCOFF64__
+ p = xstrings + xcoff_sym.n_offset;
+#else
+ if (xcoff_sym.n_zeroes == 0) {
+ /*
+ * Need to relocate string table offset
+ */
+ p = xcoff_sym.n_nptr = xstrings + xcoff_sym.n_offset;
+ } else {
+ strncpy(name, xcoff_sym.n_name, 8);
+
+ p = name, p[8] = 0;
}
+#endif
- fclose(fp);
+ if (debug > 2)
+ dump_xsym(&xcoff_sym);
- /*
- * sort the symbol table
- */
- qsort((char *) x_symtab, nxsyms, sizeof (*x_symtab), xsym_compar);
-
- /*
- * we will need no more than `nxsyms' symbols.
- */
- k_symtab = (sym_t *) malloc(nxsyms * sizeof (sym_t));
- if (!k_symtab)
- error("no memory for EXPORT symbol table");
+ switch (xcoff_sym.n_sclass) {
+ case C_EXT: /* external */
+ case C_HIDEXT: /* hidden external (sic) */
+ /*
+ * filtre out the ones with the strange names
+ */
+ if (strchr(p, '@') || strchr(p, '$') || p[0] == 0)
+ break;
- /*
- * uniquify it, and xlate to funny EXPORT format
- */
- xsp = xsq = x_symtab;
- ksp = k_symtab;
- kstrings = 0;
- kstr_size = 0;
- nksyms = 0;
-
- bzero(xsq = &xcoff_sym, sizeof (*xsq));
-
- for (i = 1; i < nxsyms; ++i, xsq = xsp++) {
- if (xsp->n_zeroes != xsq->n_zeroes
- || xsp->n_offset != xsq->n_offset
- || xsp->n_value != xsq->n_value) {
- xlate_xtok(xsp, ksp++, &kstrings, &kstr_size);
- ++nksyms;
- }
+ *xsp++ = xcoff_sym;
+ ++nxsyms;
+
+ if (debug > 1)
+ dump_xsym(&xcoff_sym);
+
+ break;
}
- /*
- * place the symbol table info into the `conf' data structure
- *
- * XXXXX: for today only, leave the string table the same.
- */
- conf->nsyms = nksyms;
- conf->symt_sz = nksyms * sizeof (sym_t);
- conf->str_sz = kstr_size;
- conf->symtab = (caddr_t) k_symtab;
- conf->strtab = kstrings;
+ if (xcoff_sym.n_numaux) {
+ fseek(fp, xcoff_sym.n_numaux * AUXESZ, 1);
+ i += xcoff_sym.n_numaux;
+ }
+ }
+
+ fclose(fp);
+
+ /*
+ * sort the symbol table
+ */
+ qsort((char *)x_symtab, nxsyms, sizeof(*x_symtab), xsym_compar);
+
+ /*
+ * we will need no more than `nxsyms' symbols.
+ */
+ k_symtab = malloc(nxsyms * sizeof(sym_t));
+ if (!k_symtab)
+ error("no memory for EXPORT symbol table");
+
+ /*
+ * uniquify it, and xlate to funny EXPORT format
+ */
+ xsp = xsq = x_symtab;
+ ksp = k_symtab;
+ kstrings = 0;
+ kstr_size = 0;
+ nksyms = 0;
+
+ memset(xsq = &xcoff_sym, 0, sizeof(*xsq));
+
+ for (i = 1; i < nxsyms; ++i, xsq = xsp++) {
+#ifdef __XCOFF64__
+ if (xsp->n_offset != xsq->n_offset || xsp->n_value != xsq->n_value) {
+#else
+ if (xsp->n_zeroes != xsq->n_zeroes || xsp->n_offset != xsq->n_offset
+ || xsp->n_value != xsq->n_value) {
+#endif
+ xlate_xtok(xsp, ksp++, &kstrings, &kstr_size);
+ ++nksyms;
+ }
+ }
+
+ /*
+ * place the symbol table info into the `conf' data structure
+ *
+ * XXXXX: for today only, leave the string table the same.
+ */
+ conf->nsyms = nksyms;
+ conf->symt_sz = nksyms * sizeof(sym_t);
+ conf->str_sz = kstr_size;
+ conf->symtab = (caddr_t) k_symtab;
+ conf->strtab = kstrings;
}
* strp - ^ to ^ to EXPORT string table
* szp - ^ to EXPORT string table size
*/
+#define SYMBUFSIZE 1048576
xlate_xtok(xp, kp, strp, szp)
-register struct syment *xp;
-register sym_t *kp;
-char **strp;
-uint *szp; {
- register len;
- static char *export_strings, *prev = "";
- static left, offset, sz;
-
- if (!export_strings) {
- export_strings = malloc(sz=1024);
- if (!export_strings)
- error("no memory for EXPORT string table");
-
- *strp = export_strings;
- *szp = offset = sizeof (uint);
- left = 1024 - offset;
-
- export_strings += offset;
-
- *(uint *) export_strings = 0; /* initial 4 bytes */
+ struct syment *xp;
+ sym_t *kp;
+ char **strp;
+ uint *szp;
+{
+ int len;
+ static char *export_strings = NULL, *prev = "";
+ static left, offset, sz;
+
+ if (!export_strings) {
+ export_strings = malloc(sz = SYMBUFSIZE);
+ if (!export_strings)
+ error("no memory for EXPORT string table");
+
+ *strp = export_strings;
+ *szp = offset = sizeof(uint);
+ left = SYMBUFSIZE - offset;
+
+ export_strings += offset;
+
+ *(uint *) export_strings = 0; /* initial 4 bytes */
+ }
+#ifdef __XCOFF64__
+ if (strcmp(prev, xstrings + xp->n_offset) == 0) {
+ /*
+ * same name as previous entry: just use previous
+ */
+ kp->n_offset = offset - strlen(*strp + xp->n_offset) - 1;
+ } else
+ if (find_suffix
+ (xstrings + xp->n_offset, *strp, offset, &kp->n_offset)) {
+ /*
+ * found a string that we are a suffix of
+ */
+ ;
+ } else {
+ /*
+ * need to add to our string table
+ */
+ len = strlen(xstrings + xp->n_offset) + 1;
+ while (len >= left) {
+ fprintf(stderr, "cfgexport: Out of memory. Increase SYMBUFSIZE and recompile\n");
+ exit(1);
+#if 0
+ /* Something is broken with this code, after being here
+ cfgexport segfaults */
+ export_strings = (char *)realloc(*strp, sz += SYMBUFSIZE);
+ if (!export_strings)
+ error("no memory for EXPORT string table");
+ *strp = export_strings;
+ left += SYMBUFSIZE;
+ prev = ""; /* lazy */
+#endif
}
-
- if (kp->n_zeroes = xp->n_zeroes) { /* sic */
- kp->n_zeroes = xp->n_zeroes;
- kp->n_offset = xp->n_offset;
- } else if (strcmp(prev, xp->n_nptr) == 0) {
- /*
- * same name as previous entry: just use previous
- */
- kp->n_offset = offset - strlen(xp->n_nptr) - 1;
- } else if (find_suffix(xp->n_nptr, *strp, offset, &kp->n_offset)) {
- /*
- * found a string that we are a suffix of
- */
- ;
- } else {
- /*
- * need to add to our string table
- */
- len = strlen(xp->n_nptr) + 1;
- while (len >= left) {
- export_strings = (char *)realloc(*strp, sz += 1024);
- if (!export_strings)
- error("no memory for EXPORT string table");
- *strp = export_strings;
- left += 1024;
- prev = ""; /* lazy */
- }
-
- strcpy(prev = *strp + offset, xp->n_nptr);
-
- kp->n_offset = offset;
- offset += len;
- left -= len;
- *szp += len;
+
+ strcpy(prev = *strp + offset, xstrings + xp->n_offset);
+
+ kp->n_offset = offset;
+ offset += len;
+ left -= len;
+ *szp += len;
+ }
+#else
+ if (kp->n_zeroes = xp->n_zeroes) { /* sic */
+ kp->n_zeroes = xp->n_zeroes;
+ kp->n_offset = xp->n_offset;
+ } else if (strcmp(prev, xp->n_nptr) == 0) {
+ /*
+ * same name as previous entry: just use previous
+ */
+ kp->n_offset = offset - strlen(xp->n_nptr) - 1;
+ } else if (find_suffix(xp->n_nptr, *strp, offset, &kp->n_offset)) {
+ /*
+ * found a string that we are a suffix of
+ */
+ ;
+ } else {
+ /*
+ * need to add to our string table
+ */
+ len = strlen(xp->n_nptr) + 1;
+ while (len >= left) {
+ export_strings = realloc(*strp, sz += SYMBUFSIZE);
+ if (!export_strings)
+ error("no memory for EXPORT string table");
+ *strp = export_strings;
+ left += SYMBUFSIZE;
+ prev = ""; /* lazy */
}
- kp->n_value = xp->n_value;
+ strcpy(prev = *strp + offset, xp->n_nptr);
+
+ kp->n_offset = offset;
+ offset += len;
+ left -= len;
+ *szp += len;
+ }
+#endif
+
+ kp->n_value = xp->n_value;
- if (debug)
- dump_ksym(kp, *strp);
+ if (debug)
+ dump_ksym(kp, *strp);
}
-\f
+
/*
* find_suffix - look for a string that arg string is suffix of
*
* This is rather inefficient.
*/
find_suffix(p, strings, max, offp)
-register char *p, *strings;
-uint *offp; {
- register char *q, *e;
- register len = strlen(p) - 1;
-
- strings += sizeof (uint);
- max -= sizeof (uint);
-
- for (e = strings + max; e > strings; ) {
- /*
- * adjust `e' to point at last non-blank
- */
- if (*e == 0) {
- --e;
- continue;
- }
-
- for (q = p + len; q > p && *q == *e; )
- --q, --e;
-
- if (*q == *e) {
- if (debug)
- printf("found_suffix: %s\n", p);
- return *offp = e - strings + sizeof (uint);
- }
-
- if (*e)
- while (*e && e > strings)
- --e;
+ char *p, *strings;
+ uint *offp;
+{
+ char *q, *e;
+ int len = strlen(p) - 1;
+
+ strings += sizeof(uint);
+ max -= sizeof(uint);
+
+ for (e = strings + max; e > strings;) {
+ /*
+ * adjust `e' to point at last non-blank
+ */
+ if (*e == 0) {
+ --e;
+ continue;
+ }
+
+ for (q = p + len; q > p && *q == *e;)
+ --q, --e;
+
+ if (*q == *e) {
+ if (debug)
+ printf("found_suffix: %s\n", p);
+ return *offp = e - strings + sizeof(uint);
}
- return 0;
+ if (*e)
+ while (*e && e > strings)
+ --e;
+ }
+
+ return 0;
}
-\f
+
/*
* xsym_compar - compare two XCOFF symbol table entries
*
* C_EXT < C_HIDEXT;
*/
xsym_compar(xp, xq)
-register struct syment *xp, *xq; {
- register char *p, *q;
- register compar;
-
- p = (xp->n_zeroes ? xp->n_name : xp->n_nptr);
- q = (xq->n_zeroes ? xq->n_name : xq->n_nptr);
-
- if (xp->n_zeroes || xq->n_zeroes)
- compar = strncmp(p, q, 8);
- else
- compar = strcmp(p, q);
+ struct syment *xp, *xq;
+{
+ char *p, *q;
+ int compar;
+
+#ifndef __XCOFF64__
+ p = (xp->n_zeroes ? xp->n_name : xp->n_nptr);
+ q = (xq->n_zeroes ? xq->n_name : xq->n_nptr);
+
+ if (xp->n_zeroes || xq->n_zeroes)
+ compar = strncmp(p, q, 8);
+ else
+#else
+ p = xstrings + xp->n_offset;
+ q = xstrings + xq->n_offset;
+#endif
+ compar = strcmp(p, q);
- if (compar == 0)
- compar = xp->n_sclass - xq->n_sclass;
+ if (compar == 0)
+ compar = xp->n_sclass - xq->n_sclass;
- return compar;
+ return compar;
}
-\f
+
/*
* dump_xsym - print to XCOFF symbol
*/
dump_xsym(xsp)
-struct syment *xsp; {
-
- if (xsp->n_zeroes)
- printf(
-"nptr <%-8.8s %8.8s> val %8.8x sc# %4.4x type %4.4x sclass %2.2x naux %2.2x\n"
- , xsp->n_name
- , ""
- , xsp->n_value
- , xsp->n_scnum & 0xffff
- , xsp->n_type
-
- , xsp->n_sclass
- , xsp->n_numaux);
- else
- printf(
-"nptr <%-17.17s> val %8.8x sc# %4.4x type %4.4x sclass %2.2x naux %2.2x\n"
- , xsp->n_nptr
- , xsp->n_value
- , xsp->n_scnum & 0xffff
- , xsp->n_type
- , xsp->n_sclass
- , xsp->n_numaux);
+ struct syment *xsp;
+{
+
+#ifndef __XCOFF64__
+ if (xsp->n_zeroes)
+ printf
+ ("nptr <%-8.8s %8.8s> val %8.8x sc# %4.4x type %4.4x sclass %2.2x naux %2.2x\n",
+ xsp->n_name, "", xsp->n_value, xsp->n_scnum & 0xffff,
+ xsp->n_type, xsp->n_sclass, xsp->n_numaux);
+ else
+#endif
+ printf
+ ("nptr <%-17.17s> val %8.8x sc# %4.4x type %4.4x sclass %2.2x naux %2.2x\n"
+#ifdef __XCOFF64__
+ , xstrings + xsp->n_offset
+#else
+ , xsp->n_nptr
+#endif
+ , xsp->n_value, xsp->n_scnum & 0xffff, xsp->n_type,
+ xsp->n_sclass, xsp->n_numaux);
}
dump_ksym(ksp, strings)
-sym_t *ksp;
-char *strings; {
+ sym_t *ksp;
+ char *strings;
+{
- if (ksp->n_zeroes)
- printf("%8.8x %-8.8s\n", ksp->n_value, ksp->n_name);
- else
- printf("%8.8x %s\n", ksp->n_value, ksp->n_offset + strings);
+#ifndef __XCOFF64__
+ if (ksp->n_zeroes)
+ printf("%8.8x %-8.8s\n", ksp->n_value, ksp->n_name);
+ else
+#endif
+ printf("%8.8x %s\n", ksp->n_value, ksp->n_offset + strings);
}
error(p, a, b, c, d, e)
-char *p; {
+ char *p;
+{
- fprintf(stderr, p, a, b, c, d, e);
- fprintf(stderr, "\n");
- exit(1);
+ fprintf(stderr, p, a, b, c, d, e);
+ fprintf(stderr, "\n");
+ exit(1);
}
-sys_error(p, a, b, c, d, e)
-char *p;
+sys_error(p, a, b, c, d, e)
+ char *p;
{
- fprintf(stderr, p, a, b, c, d, e);
- perror(": ");
- exit(1);
+ fprintf(stderr, p, a, b, c, d, e);
+ perror(": ");
+ exit(1);
}
-warn(p, a, b, c, d, e)
-char *p;
+warn(p, a, b, c, d, e)
+ char *p;
{
- fprintf(stderr, p, a, b, c, d, e);
- fprintf(stderr, "\n");
+ fprintf(stderr, p, a, b, c, d, e);
+ fprintf(stderr, "\n");
}