/* * admin/edit/tcl_wrapper.c * * Copyright 1990,1991 by the Massachusetts Institute of Technology. * All Rights Reserved. * * Export of this software from the United States of America may * require a specific license from the United States Government. * It is the responsibility of any person or organization contemplating * export to obtain such a license before exporting. * * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and * distribute this software and its documentation for any purpose and * without fee is hereby granted, provided that the above copyright * notice appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity pertaining * to distribution of the software without specific, written prior * permission. Furthermore if you modify this software you must label * your software as modified software and not distribute it in such a * fashion that it might be confused with the original M.I.T. software. * M.I.T. makes no representations about the suitability of * this software for any purpose. It is provided "as is" without express * or implied warranty. * * * Tcl wrapper for kdb5_edit */ #include "k5-int.h" #include "kdb5_edit.h" #ifdef HAVE_TCL_H #include #elif defined(HAVE_TCL_TCL_H) #include #endif #define CMDDECL(x) int x(clientData, interp, argc, argv)\ ClientData clientData;\ Tcl_Interp * interp;\ int argc;\ char ** argv; #define CMDPROTO(x) int x (ClientData, Tcl_Interp, int, char **) #define MKCMD(name,cmd) Tcl_CreateCommand(interp, name, cmd,\ (ClientData)NULL,\ (Tcl_CmdDeleteProc *)NULL) extern int main(); int *tclDummyMainPtr = (int *) main; /* force ld to suck in main() from libtcl.a */ extern Tcl_Interp *interp; /* XXX yes, this is gross, but we do need it for some things */ extern int exit_status; void show_principal (int, char **); void add_new_key (int, char **); void change_pwd_key (int, char **); void add_rnd_key (int, char **); void change_rnd_key (int, char **); void delete_entry (int, char **); void extract_srvtab (krb5_context, int, char **); void extract_v4_srvtab (int, char **); void list_db (int, char **); void dump_db (int, char **); void load_db (int, char **); void set_dbname (krb5_context, int, char **); void enter_master_key (krb5_context, int, char **); /* * this is mostly stolen from tcl_ExitCmd() * we need to do a few extra things, though... */ int doquit(clientData, interp, argc, argv) ClientData clientData; Tcl_Interp *interp; int argc; char *argv[]; { int value; if ((argc != 1) && (argc != 2)) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ?returnCode?\"", (char *) NULL); return TCL_ERROR; } if (argc == 1) { exit(quit() ? 1 : exit_status); } if (Tcl_GetInt(interp, argv[1], &value) != TCL_OK) { return TCL_ERROR; } (void)quit(); exit(value); /*NOTREACHED*/ return TCL_OK; /* Better not ever reach this! */ } int list_requests(clientData, interp, argc, argv) ClientData clientData; Tcl_Interp *interp; int argc; char *argv[]; { Tcl_SetResult(interp, "show_principal, show: Show the Kerberos database entry for a principal\nadd_new_key, ank: Add new entry to the Kerberos database (prompting for password\nchange_pwd_key, cpw: Change key of an entry in the Kerberos database (prompting for password)\nadd_rnd_key, ark: Add new entry to Kerberos database, using a random key\nchange_rnd_key, crk: Change key of an entry in the Kerberos database (select a random key)\ndelete_entry, delent: Delete an entry from the database\nextract_srvtab, xst, ex_st: Extract service key table\nextract_v4_srvtab, xst4: Extract service key table\nlist_db, ldb: List database entries\nset_dbname, sdbn: Change database name\nenter_master_key, emk: Enter the master key for a database\nchange_working_directory, cwd, cd: Change working directory\nprint_working_directory, pwd: Print working directory\nlist_requests, lr: List available requests\nquit, exit: Exit program", TCL_STATIC); return TCL_OK; } int wrapper(func, interp, argc, argv) void (*func)(); Tcl_Interp *interp; int argc; char *argv[]; { (*func)(argc, argv); return TCL_OK; } int Tcl_AppInit(interp) Tcl_Interp *interp; { int argc; char **argv, **mostly_argv; char *interp_argv, *interp_argv0, *request; Tcl_CmdInfo cmdInfo; if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; /* * the following is, admittedly, sorta gross, but the only way * to grab the original argc, argv once the interpreter is running */ interp_argv = Tcl_GetVar(interp, "argv", 0); if (interp_argv == NULL) return TCL_ERROR; else if (Tcl_SplitList(interp, interp_argv, &argc, &mostly_argv) != TCL_OK) return TCL_ERROR; interp_argv0 = Tcl_GetVar(interp, "argv0", 0); if (interp_argv0 == NULL) return TCL_ERROR; if ((argv = (char **)malloc((argc + 1) * sizeof (char *))) == NULL) return TCL_ERROR; argv[0] = interp_argv0; memcpy(argv + 1, mostly_argv, argc++ * sizeof (char *)); /* * set up a prompt */ if (Tcl_SetVar(interp, "tcl_prompt1", "puts -nonewline \"kdb5_edit: \"", 0) == NULL) return TCL_ERROR; /* * we don't want arbitrary programs to get exec'd by accident */ if (Tcl_SetVar(interp, "auto_noexec", "{}", 0) == NULL) return TCL_ERROR; request = kdb5_edit_Init(argc, argv); Tcl_CallWhenDeleted(interp, doquit, (ClientData)0); Tcl_CreateCommand(interp, "quit", doquit, (ClientData)0, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "exit", doquit, (ClientData)0, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "list_requests", list_requests, (ClientData)0, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "lr", list_requests, (ClientData)0, (Tcl_CmdDeleteProc *)0); if (Tcl_GetCommandInfo(interp, "cd", &cmdInfo)) { Tcl_CreateCommand(interp, "cwd", cmdInfo.proc, (ClientData)0, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "change_working_directory", cmdInfo.proc, (ClientData)0, (Tcl_CmdDeleteProc *)0); } if (Tcl_GetCommandInfo(interp, "pwd", &cmdInfo)) { Tcl_CreateCommand(interp, "print_working_directory", cmdInfo.proc, (ClientData)0, (Tcl_CmdDeleteProc *)0); } Tcl_CreateCommand(interp, "show_principal", wrapper, show_principal, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "show", wrapper, show_principal, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "add_new_key", wrapper, add_new_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "ank", wrapper, add_new_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "change_pwd_key", wrapper, change_pwd_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "cpw", wrapper, change_pwd_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "add_rnd_key", wrapper, add_rnd_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "ark", wrapper, add_rnd_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "change_rnd_key", wrapper, change_rnd_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "crk", wrapper, change_rnd_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "delete_entry", wrapper, delete_entry, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "delent", wrapper, delete_entry, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "extract_srvtab", wrapper, extract_srvtab, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "xst", wrapper, extract_srvtab, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "ex_st", wrapper, extract_srvtab, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "extract_v4_srvtab", wrapper, extract_v4_srvtab, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "xv4st", wrapper, extract_v4_srvtab, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "list_db", wrapper, list_db, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "ldb", wrapper, list_db, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "dump_db", wrapper, dump_db, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "ddb", wrapper, dump_db, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "load_db", wrapper, load_db, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "lddb", wrapper, load_db, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "set_dbname", wrapper, set_dbname, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "sdbn", wrapper, set_dbname, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "enter_master_key", wrapper, enter_master_key, (Tcl_CmdDeleteProc *)0); Tcl_CreateCommand(interp, "emk", wrapper, enter_master_key, (Tcl_CmdDeleteProc *)0); if (request && (Tcl_Eval(interp, request) == TCL_ERROR)) return TCL_ERROR; return TCL_OK; }