1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1992-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* * 20***********************************************************************/ 21#pragma prototyped 22/* 23 * AT&T Research 24 * 25 * builtin cmd definitions 26 */ 27 28#ifndef _CMD_H 29#define _CMD_H 30 31#include <ast.h> 32#include <error.h> 33#include <stak.h> 34#include <shcmd.h> 35 36#define cmdinit _cmd_init 37 38#define ERROR_CALLBACK ERROR_SET 39 40#if _BLD_cmd && defined(__EXPORT__) 41#define extern __EXPORT__ 42#endif 43 44#include <cmdext.h> 45 46#undef extern 47 48#if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE) 49#define CMD_STANDALONE CMD_BUILTIN 50#endif 51 52#ifdef CMD_STANDALONE 53 54#define CMD_CONTEXT(c) ((Shbltin_t*)0) 55 56#if CMD_DYNAMIC 57 58#include <dlldefs.h> 59 60#else 61 62extern int CMD_STANDALONE(int, char**, void*); 63 64#endif 65 66#ifndef CMD_BUILTIN 67 68/* 69 * command initialization 70 */ 71 72static int 73cmdinit(int argc, register char** argv, void* context, const char* catalog, int flags) 74{ 75 register char* cp; 76 register char* pp; 77 78 if (cp = strrchr(argv[0], '/')) 79 cp++; 80 else 81 cp = argv[0]; 82 if (pp = strrchr(cp, '_')) 83 cp = pp + 1; 84 error_info.id = cp; 85 if (!error_info.catalog) 86 error_info.catalog = (char*)catalog; 87 opt_info.index = 0; 88 if (context) 89 error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY); 90 return 0; 91} 92 93#endif 94 95int 96main(int argc, char** argv) 97{ 98#if CMD_DYNAMIC 99 register char* s; 100 register char* t; 101 void* dll; 102 Shbltin_f fun; 103 char buf[64]; 104 105 if (s = strrchr(argv[0], '/')) 106 s++; 107 else if (!(s = argv[0])) 108 return 127; 109 if ((t = strrchr(s, '_')) && *++t) 110 s = t; 111 buf[0] = '_'; 112 buf[1] = 'b'; 113 buf[2] = '_'; 114 strncpy(buf + 3, s, sizeof(buf) - 4); 115 buf[sizeof(buf) - 1] = 0; 116 if (t = strchr(buf, '.')) 117 *t = 0; 118 for (;;) 119 { 120 if (dll = dlopen(NiL, RTLD_LAZY)) 121 { 122 if (fun = (Shbltin_f)dlsym(dll, buf + 1)) 123 break; 124 if (fun = (Shbltin_f)dlsym(dll, buf)) 125 break; 126 } 127 if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0)) 128 { 129 if (fun = (Shbltin_f)dlsym(dll, buf + 1)) 130 break; 131 if (fun = (Shbltin_f)dlsym(dll, buf)) 132 break; 133 } 134 return 127; 135 } 136 return (*fun)(argc, argv, NiL); 137#else 138 return CMD_STANDALONE(argc, argv, NiL); 139#endif 140} 141 142#else 143 144#undef cmdinit 145#ifdef _MSC_VER 146#define CMD_CONTEXT(p) ((Shbltin_t*)(p)) 147#define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0) 148#else 149#define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0) 150#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) 151#endif 152 153#if _BLD_cmd && defined(__EXPORT__) 154#define extern extern __EXPORT__ 155#endif 156 157extern int _cmd_init(int, char**, void*, const char*, int); 158 159#undef extern 160 161#endif 162 163#endif 164