14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1992-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * * 204887Schin ***********************************************************************/ 214887Schin #pragma prototyped 224887Schin /* 234887Schin * AT&T Research 244887Schin * 254887Schin * builtin cmd definitions 264887Schin */ 274887Schin 284887Schin #ifndef _CMD_H 294887Schin #define _CMD_H 304887Schin 314887Schin #include <ast.h> 324887Schin #include <error.h> 334887Schin #include <stak.h> 348462SApril.Chin@Sun.COM #include <shcmd.h> 354887Schin 364887Schin #define cmdinit _cmd_init 374887Schin 3810898Sroland.mainz@nrubsig.org #define ERROR_CALLBACK ERROR_SET 3910898Sroland.mainz@nrubsig.org 404887Schin #if _BLD_cmd && defined(__EXPORT__) 414887Schin #define extern __EXPORT__ 424887Schin #endif 434887Schin 444887Schin #include <cmdext.h> 454887Schin 464887Schin #undef extern 474887Schin 484887Schin #if defined(CMD_BUILTIN) && !defined(CMD_STANDALONE) 494887Schin #define CMD_STANDALONE CMD_BUILTIN 504887Schin #endif 514887Schin 524887Schin #ifdef CMD_STANDALONE 534887Schin 548462SApril.Chin@Sun.COM #define CMD_CONTEXT(c) ((Shbltin_t*)0) 558462SApril.Chin@Sun.COM 564887Schin #if CMD_DYNAMIC 574887Schin 584887Schin #include <dlldefs.h> 594887Schin 604887Schin #else 614887Schin 624887Schin extern int CMD_STANDALONE(int, char**, void*); 634887Schin 644887Schin #endif 654887Schin 664887Schin #ifndef CMD_BUILTIN 674887Schin 684887Schin /* 694887Schin * command initialization 704887Schin */ 714887Schin 724887Schin static int 734887Schin cmdinit(int argc, register char** argv, void* context, const char* catalog, int flags) 744887Schin { 754887Schin register char* cp; 764887Schin register char* pp; 774887Schin 784887Schin if (cp = strrchr(argv[0], '/')) 794887Schin cp++; 804887Schin else 814887Schin cp = argv[0]; 824887Schin if (pp = strrchr(cp, '_')) 834887Schin cp = pp + 1; 844887Schin error_info.id = cp; 854887Schin if (!error_info.catalog) 864887Schin error_info.catalog = (char*)catalog; 874887Schin opt_info.index = 0; 884887Schin if (context) 8910898Sroland.mainz@nrubsig.org error_info.flags |= flags & ~(ERROR_CALLBACK|ERROR_NOTIFY); 904887Schin return 0; 914887Schin } 924887Schin 934887Schin #endif 944887Schin 954887Schin int 964887Schin main(int argc, char** argv) 974887Schin { 984887Schin #if CMD_DYNAMIC 994887Schin register char* s; 1004887Schin register char* t; 1014887Schin void* dll; 1028462SApril.Chin@Sun.COM Shbltin_f fun; 1034887Schin char buf[64]; 1044887Schin 1054887Schin if (s = strrchr(argv[0], '/')) 1064887Schin s++; 1074887Schin else if (!(s = argv[0])) 1084887Schin return 127; 1094887Schin if ((t = strrchr(s, '_')) && *++t) 1104887Schin s = t; 1114887Schin buf[0] = '_'; 1124887Schin buf[1] = 'b'; 1134887Schin buf[2] = '_'; 1144887Schin strncpy(buf + 3, s, sizeof(buf) - 4); 1154887Schin buf[sizeof(buf) - 1] = 0; 1164887Schin if (t = strchr(buf, '.')) 1174887Schin *t = 0; 1184887Schin for (;;) 1194887Schin { 1204887Schin if (dll = dlopen(NiL, RTLD_LAZY)) 1214887Schin { 1228462SApril.Chin@Sun.COM if (fun = (Shbltin_f)dlsym(dll, buf + 1)) 1234887Schin break; 1248462SApril.Chin@Sun.COM if (fun = (Shbltin_f)dlsym(dll, buf)) 1254887Schin break; 1264887Schin } 127*12068SRoger.Faulkner@Oracle.COM if (dll = dllplug(NiL, "cmd", NiL, RTLD_LAZY, NiL, 0)) 1284887Schin { 1298462SApril.Chin@Sun.COM if (fun = (Shbltin_f)dlsym(dll, buf + 1)) 1304887Schin break; 1318462SApril.Chin@Sun.COM if (fun = (Shbltin_f)dlsym(dll, buf)) 1324887Schin break; 1334887Schin } 1344887Schin return 127; 1354887Schin } 1364887Schin return (*fun)(argc, argv, NiL); 1374887Schin #else 1384887Schin return CMD_STANDALONE(argc, argv, NiL); 1394887Schin #endif 1404887Schin } 1414887Schin 1424887Schin #else 1434887Schin 1444887Schin #undef cmdinit 1458462SApril.Chin@Sun.COM #ifdef _MSC_VER 1468462SApril.Chin@Sun.COM #define CMD_CONTEXT(p) ((Shbltin_t*)(p)) 1474887Schin #define cmdinit(a,b,c,d,e) do{if(_cmd_init(a,b,c,d,e))return -1;}while(0) 1488462SApril.Chin@Sun.COM #else 1498462SApril.Chin@Sun.COM #define CMD_CONTEXT(p) (((p)&&((Shbltin_t*)(p))->version>=20071012&&((Shbltin_t*)(p))->version<20350101)?((Shbltin_t*)(p)):0) 1508462SApril.Chin@Sun.COM #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) 1514887Schin #endif 1524887Schin 1534887Schin #if _BLD_cmd && defined(__EXPORT__) 1544887Schin #define extern extern __EXPORT__ 1554887Schin #endif 1564887Schin 1574887Schin extern int _cmd_init(int, char**, void*, const char*, int); 1584887Schin 1594887Schin #undef extern 1604887Schin 1614887Schin #endif 1624887Schin 1634887Schin #endif 164