|
Packit |
992a25 |
/***********************************************************************
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* This software is part of the ast package *
|
|
Packit |
992a25 |
* Copyright (c) 1992-2012 AT&T Intellectual Property *
|
|
Packit |
992a25 |
* and is licensed under the *
|
|
Packit |
992a25 |
* Eclipse Public License, Version 1.0 *
|
|
Packit |
992a25 |
* by AT&T Intellectual Property *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* A copy of the License is available at *
|
|
Packit |
992a25 |
* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
Packit |
992a25 |
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* Information and Software Systems Research *
|
|
Packit |
992a25 |
* AT&T Research *
|
|
Packit |
992a25 |
* Florham Park NJ *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
* Glenn Fowler <gsf@research.att.com> *
|
|
Packit |
992a25 |
* David Korn <dgk@research.att.com> *
|
|
Packit |
992a25 |
* *
|
|
Packit |
992a25 |
***********************************************************************/
|
|
Packit |
992a25 |
#pragma prototyped
|
|
Packit |
992a25 |
/*
|
|
Packit |
992a25 |
* AT&T Research
|
|
Packit |
992a25 |
*
|
|
Packit |
992a25 |
* builtin cmd definitions
|
|
Packit |
992a25 |
*/
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#ifndef _CMD_H
|
|
Packit |
992a25 |
#define _CMD_H
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#include <ast.h>
|
|
Packit |
992a25 |
#include <error.h>
|
|
Packit |
992a25 |
#include <stak.h>
|
|
Packit |
992a25 |
#include <shcmd.h>
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define cmdinit _cmd_init
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define ERROR_CALLBACK ERROR_SET
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if _BLD_cmd && defined(__EXPORT__)
|
|
Packit |
992a25 |
#define extern __EXPORT__
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#include <cmdext.h>
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#undef extern
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE)
|
|
Packit |
992a25 |
#define CMD_STANDALONE CMD_BUILTIN
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#ifdef CMD_STANDALONE
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#define CMD_CONTEXT(c) ((Shbltin_t*)0)
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if CMD_DYNAMIC
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#include <dlldefs.h>
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
extern int CMD_STANDALONE(int, char**, Shbltin_t*);
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#ifndef CMD_BUILTIN
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
/*
|
|
Packit |
992a25 |
* command initialization
|
|
Packit |
992a25 |
*/
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
static int
|
|
Packit |
992a25 |
cmdinit(int argc, register char** argv, Shbltin_t* context, const char* catalog, int flags)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
register char* cp;
|
|
Packit |
992a25 |
register char* pp;
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
if (cp = strrchr(argv[0], '/'))
|
|
Packit |
992a25 |
cp++;
|
|
Packit |
992a25 |
else
|
|
Packit |
992a25 |
cp = argv[0];
|
|
Packit |
992a25 |
if (pp = strrchr(cp, '_'))
|
|
Packit |
992a25 |
cp = pp + 1;
|
|
Packit |
992a25 |
error_info.id = cp;
|
|
Packit |
992a25 |
if (!error_info.catalog)
|
|
Packit |
992a25 |
error_info.catalog = (char*)catalog;
|
|
Packit |
992a25 |
opt_info.index = 0;
|
|
Packit |
992a25 |
if (context)
|
|
Packit |
992a25 |
error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY);
|
|
Packit |
992a25 |
return 0;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
int
|
|
Packit |
992a25 |
main(int argc, char** argv)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
#if CMD_DYNAMIC
|
|
Packit |
992a25 |
register char* s;
|
|
Packit |
992a25 |
register char* t;
|
|
Packit |
992a25 |
void* dll;
|
|
Packit |
992a25 |
Shbltin_f fun;
|
|
Packit |
992a25 |
char buf[64];
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
if (s = strrchr(argv[0], '/'))
|
|
Packit |
992a25 |
s++;
|
|
Packit |
992a25 |
else if (!(s = argv[0]))
|
|
Packit |
992a25 |
return 127;
|
|
Packit |
992a25 |
if ((t = strrchr(s, '_')) && *++t)
|
|
Packit |
992a25 |
s = t;
|
|
Packit |
992a25 |
buf[0] = '_';
|
|
Packit |
992a25 |
buf[1] = 'b';
|
|
Packit |
992a25 |
buf[2] = '_';
|
|
Packit |
992a25 |
strncpy(buf + 3, s, sizeof(buf) - 4);
|
|
Packit |
992a25 |
buf[sizeof(buf) - 1] = 0;
|
|
Packit |
992a25 |
if (t = strchr(buf, '.'))
|
|
Packit |
992a25 |
*t = 0;
|
|
Packit |
992a25 |
for (;;)
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
if (dll = dlopen(NiL, RTLD_LAZY))
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
if (fun = (Shbltin_f)dlsym(dll, buf + 1))
|
|
Packit |
992a25 |
break;
|
|
Packit |
992a25 |
if (fun = (Shbltin_f)dlsym(dll, buf))
|
|
Packit |
992a25 |
break;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0))
|
|
Packit |
992a25 |
{
|
|
Packit |
992a25 |
if (fun = (Shbltin_f)dlsym(dll, buf + 1))
|
|
Packit |
992a25 |
break;
|
|
Packit |
992a25 |
if (fun = (Shbltin_f)dlsym(dll, buf))
|
|
Packit |
992a25 |
break;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
return 127;
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
return (*fun)(argc, argv, NiL);
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
return CMD_STANDALONE(argc, argv, NiL);
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
}
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#undef cmdinit
|
|
Packit |
992a25 |
#ifdef _MSC_VER
|
|
Packit |
992a25 |
#define CMD_CONTEXT(p) ((Shbltin_t*)(p))
|
|
Packit |
992a25 |
#define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0)
|
|
Packit |
992a25 |
#else
|
|
Packit |
992a25 |
#define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0)
|
|
Packit |
992a25 |
#define cmdinit(a,b,c,d,e) do{if((c)&&!CMD_CONTEXT(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0)
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#if _BLD_cmd && defined(__EXPORT__)
|
|
Packit |
992a25 |
#define extern extern __EXPORT__
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
extern int _cmd_init(int, char**, Shbltin_t*, const char*, int);
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#undef extern
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif
|
|
Packit |
992a25 |
|
|
Packit |
992a25 |
#endif
|