Blame tools/smidump.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * smidump.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Dump a MIB module conforming to a given format.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit Service 9ccfef
 * Copyright (c) 1999 J. Schoenwaelder, Technical University of Braunschweig.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * See the file "COPYING" for information on usage and redistribution
Packit Service 9ccfef
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * @(#) $Id: smidump.c 7870 2008-03-11 19:29:58Z schoenw $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <stdlib.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
#ifdef HAVE_UNISTD_H
Packit Service 9ccfef
#include <unistd.h>
Packit Service 9ccfef
#endif
Packit Service 9ccfef
#ifdef HAVE_WIN_H
Packit Service 9ccfef
#include "win.h"
Packit Service 9ccfef
#endif
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "shhopt.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void help(void);
Packit Service 9ccfef
static void usage(void);
Packit Service 9ccfef
static void version(void);
Packit Service 9ccfef
static void config(char *filename);
Packit Service 9ccfef
static void level(int lev);
Packit Service 9ccfef
static void quiet(void);
Packit Service 9ccfef
static void preload(char *module);
Packit Service 9ccfef
static void unified(void);
Packit Service 9ccfef
static void format(char *form);
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int flags;
Packit Service 9ccfef
static int mFlag = 0;	/* show the name for error messages */
Packit Service 9ccfef
static int sFlag = 0;	/* show the severity for error messages */
Packit Service 9ccfef
static int kFlag = 0;	/* keep going after severe errors */
Packit Service 9ccfef
static SmidumpDriver *driver;
Packit Service 9ccfef
static SmidumpDriver *firstDriver;
Packit Service 9ccfef
static SmidumpDriver *lastDriver;
Packit Service 9ccfef
static SmidumpDriver *defaultDriver;
Packit Service 9ccfef
static char *output;
Packit Service 9ccfef
Packit Service 9ccfef
static int opts;
Packit Service 9ccfef
static optStruct *opt;
Packit Service 9ccfef
static optStruct genericOpt[] = {
Packit Service 9ccfef
    /* short long              type        var/func       special       */
Packit Service 9ccfef
    { 'h', "help",           OPT_FLAG,   help,          OPT_CALLFUNC },
Packit Service 9ccfef
    { 'V', "version",        OPT_FLAG,   version,       OPT_CALLFUNC },
Packit Service 9ccfef
    { 'c', "config",         OPT_STRING, config,        OPT_CALLFUNC },
Packit Service 9ccfef
    { 'l', "level",          OPT_INT,    level,         OPT_CALLFUNC },
Packit Service 9ccfef
    { 'p', "preload",        OPT_STRING, preload,       OPT_CALLFUNC },
Packit Service 9ccfef
    { 'l', "level",          OPT_INT,    level,         OPT_CALLFUNC },
Packit Service 9ccfef
    { 'q', "quiet",          OPT_FLAG,   quiet,         OPT_CALLFUNC },
Packit Service 9ccfef
    { 'm', "error-names",    OPT_FLAG,   &mFlag,        0 },
Packit Service 9ccfef
    { 's', "severity",       OPT_FLAG,   &sFlag,        0 },
Packit Service 9ccfef
    { 'u', "unified",        OPT_FLAG,   unified,       OPT_CALLFUNC },
Packit Service 9ccfef
    { 'f', "format",         OPT_STRING, format,        OPT_CALLFUNC },
Packit Service 9ccfef
    { 'o', "output",         OPT_STRING, &output,       0            },
Packit Service 9ccfef
    { 'k', "keep-going",     OPT_FLAG,	 &kFlag,	0 },
Packit Service 9ccfef
    { 0, 0, OPT_END, 0, 0 }  /* no more options */
Packit Service 9ccfef
};
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void *xmalloc(size_t size)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *m = malloc(size);
Packit Service 9ccfef
    if (! m) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: malloc failed - running out of memory\n");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return m;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void *xrealloc(void *ptr, size_t size)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *m = realloc(ptr, size);
Packit Service 9ccfef
    if (! m) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: realloc failed - running out of memory\n");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return m;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void *xcalloc(size_t nmemb, size_t size)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *m = calloc(nmemb, size);
Packit Service 9ccfef
    if (! m) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: calloc failed - running out of memory\n");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return m;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
char *xstrdup(const char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *m = strdup(s);
Packit Service 9ccfef
    if (! m) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: strdup failed - running out of memory\n");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return m;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void xfree(void *ptr)
Packit Service 9ccfef
{
Packit Service 9ccfef
    free(ptr);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void smidumpRegisterDriver(SmidumpDriver *driver)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (!firstDriver) {
Packit Service 9ccfef
	firstDriver = driver;
Packit Service 9ccfef
	lastDriver = driver;
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	lastDriver->next = driver;
Packit Service 9ccfef
	lastDriver = driver;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; driver->opt && driver->opt[i].type != OPT_END; i++) {
Packit Service 9ccfef
	opt = xrealloc(opt, (opts+1) * sizeof(optStruct));
Packit Service 9ccfef
	memcpy(&opt[opts], &opt[opts-1], sizeof(optStruct));
Packit Service 9ccfef
	opt[opts-1].shortName = 0;
Packit Service 9ccfef
	opt[opts-1].longName  = xmalloc(strlen(driver->name) +
Packit Service 9ccfef
				 strlen(driver->opt[i].name) + 2);
Packit Service 9ccfef
	sprintf(opt[opts-1].longName, "%s-%s",
Packit Service 9ccfef
		driver->name, driver->opt[i].name);
Packit Service 9ccfef
	opt[opts-1].type      = driver->opt[i].type;
Packit Service 9ccfef
	opt[opts-1].arg       = driver->opt[i].arg;
Packit Service 9ccfef
	opt[opts-1].flags     = driver->opt[i].flags;
Packit Service 9ccfef
	opts++;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void formats()
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmidumpDriver *driver = firstDriver;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (driver = firstDriver; driver; driver = driver->next) {
Packit Service 9ccfef
	fprintf(stderr, "  %-14s: %s\n", driver->name,
Packit Service 9ccfef
 		driver->descr ? driver->descr : "...");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void usage()
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i;
Packit Service 9ccfef
    SmidumpDriver *driver;
Packit Service 9ccfef
    char *value = NULL;
Packit Service 9ccfef
#ifdef _MSC_VER
Packit Service 9ccfef
    #if _MSC_VER >= 1400
Packit Service 9ccfef
/*
Packit Service 9ccfef
   %n in printf is a security vulnerability. Ref:
Packit Service 9ccfef
   http://en.wikipedia.org/wiki/Format_string_vulnerabilities
Packit Service 9ccfef
   MS decided it was important enough to disble it by default. Ref:
Packit Service 9ccfef
   "ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vccrt/html/77a854ae-5b48-4865-89f4-f2dc5cf80f52.htm
Packit Service 9ccfef
   Calling _set_printf_count_output() stops an invalid parameter crash.
Packit Service 9ccfef
*/
Packit Service 9ccfef
    int printf_state;
Packit Service 9ccfef
    #endif
Packit Service 9ccfef
#endif
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintf(stderr,
Packit Service 9ccfef
	    "Usage: smidump [options] [module or path ...]\n"
Packit Service 9ccfef
	    "  -V, --version        show version and license information\n"
Packit Service 9ccfef
	    "  -h, --help           show usage information\n"
Packit Service 9ccfef
	    "  -q, --quiet          do not generate any comments\n"
Packit Service 9ccfef
	    "  -c, --config=file    load a specific configuration file\n"
Packit Service 9ccfef
	    "  -p, --preload=module preload <module>\n"
Packit Service 9ccfef
	    "  -l, --level=level    set maximum level of errors and warnings\n"
Packit Service 9ccfef
	    "  -m, --error-names    print the name of errors in braces\n"
Packit Service 9ccfef
	    "  -s, --severity       print the severity of errors in brackets\n"
Packit Service 9ccfef
	    "  -f, --format=format  use <format> when dumping (default %s)\n"
Packit Service 9ccfef
	    "  -o, --output=name    use <name> when creating names for output files\n"
Packit Service 9ccfef
	    "  -u, --unified        print a single unified output of all modules\n"
Packit Service 9ccfef
	    "  -k, --keep-going     continue after serious parse errors\n\n",
Packit Service 9ccfef
	    defaultDriver ? defaultDriver->name : "none");
Packit Service 9ccfef
Packit Service 9ccfef
    fprintf(stderr, "Supported formats are:\n");
Packit Service 9ccfef
    formats();
Packit Service 9ccfef
Packit Service 9ccfef
    for (driver = firstDriver; driver; driver = driver->next) {
Packit Service 9ccfef
	if (! driver->opt) continue;
Packit Service 9ccfef
	fprintf(stderr, "\nSpecific option for the \"%s\" format:\n",
Packit Service 9ccfef
		driver->name);
Packit Service 9ccfef
	for (i = 0; driver->opt && driver->opt[i].type != OPT_END; i++) {
Packit Service 9ccfef
	    int n;
Packit Service 9ccfef
	    switch (driver->opt[i].type) {
Packit Service 9ccfef
	    case OPT_END:
Packit Service 9ccfef
	    case OPT_FLAG:
Packit Service 9ccfef
		value = NULL;
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case OPT_STRING:
Packit Service 9ccfef
		value = "string";
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case OPT_INT:
Packit Service 9ccfef
	    case OPT_UINT:
Packit Service 9ccfef
	    case OPT_LONG:
Packit Service 9ccfef
	    case OPT_ULONG:
Packit Service 9ccfef
		value = "number";
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
#ifdef _MSC_VER
Packit Service 9ccfef
    #if _MSC_VER >= 1400
Packit Service 9ccfef
	    printf_state=_set_printf_count_output(1);
Packit Service 9ccfef
    #endif
Packit Service 9ccfef
#endif
Packit Service 9ccfef
	    fprintf(stderr, "  --%s-%s%s%s%n",
Packit Service 9ccfef
		    driver->name, driver->opt[i].name,
Packit Service 9ccfef
		    value ? "=" : "",
Packit Service 9ccfef
		    value ? value : "",
Packit Service 9ccfef
		    &n);
Packit Service 9ccfef
#ifdef _MSC_VER
Packit Service 9ccfef
    #if _MSC_VER >= 1400
Packit Service 9ccfef
	    (void)_set_printf_count_output(printf_state);
Packit Service 9ccfef
    #endif
Packit Service 9ccfef
#endif
Packit Service 9ccfef
	    fprintf(stderr, "%*s%s\n",
Packit Service 9ccfef
		    30-n, "",
Packit Service 9ccfef
		    driver->opt[i].descr ? driver->opt[i].descr : "...");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void help() { usage(); exit(0); }
Packit Service 9ccfef
static void version() { printf("smidump " SMI_VERSION_STRING "\n"); exit(0); }
Packit Service 9ccfef
static void config(char *filename) { smiReadConfig(filename, "smidump"); }
Packit Service 9ccfef
static void level(int lev) { smiSetErrorLevel(lev); }
Packit Service 9ccfef
static void quiet() { flags |= SMIDUMP_FLAG_SILENT; }
Packit Service 9ccfef
static void preload(char *module) { smiLoadModule(module); }
Packit Service 9ccfef
static void unified() { flags |= SMIDUMP_FLAG_UNITE; }
Packit Service 9ccfef
Packit Service 9ccfef
static void format(char *form)
Packit Service 9ccfef
{
Packit Service 9ccfef
    for (driver = firstDriver; driver; driver = driver->next) {
Packit Service 9ccfef
	if (strcasecmp(driver->name, form) == 0) {
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (!driver) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: invalid dump format `%s'"
Packit Service 9ccfef
		" - supported formats are:\n", form);
Packit Service 9ccfef
	formats();
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
errorHandler(char *path, int line, int severity, char *msg, char *tag)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (path) {
Packit Service 9ccfef
	fprintf(stderr, "%s:%d: ", path, line);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (sFlag) {
Packit Service 9ccfef
	fprintf(stderr, "[%d] ", severity);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (mFlag) {
Packit Service 9ccfef
	fprintf(stderr, "{%s} ", tag);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    switch (severity) {
Packit Service 9ccfef
    case 4:
Packit Service 9ccfef
    case 5:
Packit Service 9ccfef
	fprintf(stderr, "warning: ");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case 6:	
Packit Service 9ccfef
	fprintf(stderr, "info: ");
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(stderr, "%s\n", msg);
Packit Service 9ccfef
Packit Service 9ccfef
    if (severity <= 0) {
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
int main(int argc, char *argv[])
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *modulename;
Packit Service 9ccfef
    SmiModule *smiModule;
Packit Service 9ccfef
    int smiflags, i;
Packit Service 9ccfef
    SmiModule **modv = NULL;
Packit Service 9ccfef
    int modc = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    output = NULL;
Packit Service 9ccfef
    firstDriver = lastDriver = defaultDriver = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
    opts = sizeof(genericOpt) / sizeof(optStruct);
Packit Service 9ccfef
    opt = xmalloc(sizeof(genericOpt));
Packit Service 9ccfef
    memcpy(opt, genericOpt, sizeof(genericOpt));
Packit Service 9ccfef
Packit Service 9ccfef
    initCm();
Packit Service 9ccfef
    initCorba();
Packit Service 9ccfef
#if 0
Packit Service 9ccfef
    initFig();
Packit Service 9ccfef
#endif
Packit Service 9ccfef
    initIdentifiers();
Packit Service 9ccfef
    initImports();
Packit Service 9ccfef
    initJax();
Packit Service 9ccfef
    initMetrics();
Packit Service 9ccfef
    initMosy();
Packit Service 9ccfef
    initNetsnmp();
Packit Service 9ccfef
    initPerl();
Packit Service 9ccfef
    initPython();
Packit Service 9ccfef
    initSming();
Packit Service 9ccfef
    initSmi();                defaultDriver = lastDriver;
Packit Service 9ccfef
    initSppi();
Packit Service 9ccfef
#if 0
Packit Service 9ccfef
    initSql();
Packit Service 9ccfef
#endif
Packit Service 9ccfef
    initScli();
Packit Service 9ccfef
    initSvg();
Packit Service 9ccfef
    initTree();
Packit Service 9ccfef
    initTypes();
Packit Service 9ccfef
    initSizes();
Packit Service 9ccfef
    initXml();
Packit Service 9ccfef
    initXsd();
Packit Service 9ccfef
    initCompliances();
Packit Service 9ccfef
    initYang();
Packit Service 9ccfef
    initBoilerplate();
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (i = 1; i < argc; i++)
Packit Service 9ccfef
	if ((strstr(argv[i], "-c") == argv[i]) ||
Packit Service 9ccfef
	    (strstr(argv[i], "--config") == argv[i])) break;
Packit Service 9ccfef
    if (i == argc) 
Packit Service 9ccfef
	smiInit("smidump");
Packit Service 9ccfef
    else
Packit Service 9ccfef
	smiInit(NULL);
Packit Service 9ccfef
Packit Service 9ccfef
    flags = 0;
Packit Service 9ccfef
    driver = defaultDriver;
Packit Service 9ccfef
Packit Service 9ccfef
    optParseOptions(&argc, argv, opt, 0);
Packit Service 9ccfef
Packit Service 9ccfef
    if (!driver) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: no dump formats registered\n");
Packit Service 9ccfef
	smiExit();
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (sFlag || mFlag) {
Packit Service 9ccfef
	smiSetErrorHandler(errorHandler);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    smiflags = smiGetFlags();
Packit Service 9ccfef
    smiflags |= SMI_FLAG_ERRORS;
Packit Service 9ccfef
    smiflags |= driver->smiflags;
Packit Service 9ccfef
    smiSetFlags(smiflags);
Packit Service 9ccfef
Packit Service 9ccfef
    if (flags & SMIDUMP_FLAG_UNITE && driver->ignflags & SMIDUMP_DRIVER_CANT_UNITE) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: %s format does not support united output:"
Packit Service 9ccfef
		" ignoring -u\n", driver->name);
Packit Service 9ccfef
	flags = (flags & ~SMIDUMP_FLAG_UNITE);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (output && driver->ignflags & SMIDUMP_DRIVER_CANT_OUTPUT) {
Packit Service 9ccfef
	fprintf(stderr, "smidump: %s format does not support output option:"
Packit Service 9ccfef
		" ignoring -o %s\n", driver->name, output);
Packit Service 9ccfef
	output = NULL;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    modv = (SmiModule **) xmalloc((argc) * sizeof(SmiModule *));
Packit Service 9ccfef
    modc = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (i = 1; i < argc; i++) {
Packit Service 9ccfef
	modulename = smiLoadModule(argv[i]);
Packit Service 9ccfef
	smiModule = modulename ? smiGetModule(modulename) : NULL;
Packit Service 9ccfef
	if (smiModule) {
Packit Service 9ccfef
	    if ((smiModule->conformance) && (smiModule->conformance < 3)) {
Packit Service 9ccfef
		flags |= SMIDUMP_FLAG_ERROR;
Packit Service 9ccfef
		if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit Service 9ccfef
		    fprintf(stderr,
Packit Service 9ccfef
			    "smidump: module `%s' contains errors, "
Packit Service 9ccfef
			    "expect flawed output\n",
Packit Service 9ccfef
			    argv[i]);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    modv[modc++] = smiModule;
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintf(stderr, "smidump: cannot locate module `%s'\n",
Packit Service 9ccfef
		    argv[i]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (! (flags & SMIDUMP_FLAG_ERROR) || kFlag) {
Packit Service 9ccfef
	(driver->func)(modc, modv, flags, output);
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit Service 9ccfef
	    fprintf(stderr,
Packit Service 9ccfef
		    "smidump: aborting due to severe parsing errors\n"
Packit Service 9ccfef
		    "smidump: use the -k option to force continuation\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    smiExit();
Packit Service 9ccfef
Packit Service 9ccfef
    if (modv) xfree(modv);
Packit Service 9ccfef
    
Packit Service 9ccfef
    return 0;
Packit Service 9ccfef
}