invocation.c revision 06ef971be505678ee462ae1844204ed24f14aedc
14f1732b8068970b368a89271158ca29daf25650eztenghui/* 24f1732b8068970b368a89271158ca29daf25650eztenghui * Copyright 1987, 1988 by MIT Student Information Processing Board 34f1732b8068970b368a89271158ca29daf25650eztenghui * 44f1732b8068970b368a89271158ca29daf25650eztenghui * Permission to use, copy, modify, and distribute this software and 54f1732b8068970b368a89271158ca29daf25650eztenghui * its documentation for any purpose is hereby granted, provided that 64f1732b8068970b368a89271158ca29daf25650eztenghui * the names of M.I.T. and the M.I.T. S.I.P.B. not be used in 74f1732b8068970b368a89271158ca29daf25650eztenghui * advertising or publicity pertaining to distribution of the software 84f1732b8068970b368a89271158ca29daf25650eztenghui * without specific, written prior permission. M.I.T. and the 94f1732b8068970b368a89271158ca29daf25650eztenghui * M.I.T. S.I.P.B. make no representations about the suitability of 104f1732b8068970b368a89271158ca29daf25650eztenghui * this software for any purpose. It is provided "as is" without 114f1732b8068970b368a89271158ca29daf25650eztenghui * express or implied warranty. 124f1732b8068970b368a89271158ca29daf25650eztenghui */ 134f1732b8068970b368a89271158ca29daf25650eztenghui 144f1732b8068970b368a89271158ca29daf25650eztenghui#ifdef HAS_STDLIB_H 154f1732b8068970b368a89271158ca29daf25650eztenghui#include <stdlib.h> 164f1732b8068970b368a89271158ca29daf25650eztenghui#endif 174f1732b8068970b368a89271158ca29daf25650eztenghui#include "ss_internal.h" 184f1732b8068970b368a89271158ca29daf25650eztenghui#define size sizeof(ss_data *) 194f1732b8068970b368a89271158ca29daf25650eztenghui#ifdef HAVE_DLOPEN 204f1732b8068970b368a89271158ca29daf25650eztenghui#include <dlfcn.h> 214f1732b8068970b368a89271158ca29daf25650eztenghui#endif 224f1732b8068970b368a89271158ca29daf25650eztenghui 234f1732b8068970b368a89271158ca29daf25650eztenghuiint ss_create_invocation(subsystem_name, version_string, info_ptr, 244f1732b8068970b368a89271158ca29daf25650eztenghui request_table_ptr, code_ptr) 254f1732b8068970b368a89271158ca29daf25650eztenghui const char *subsystem_name, *version_string; 264f1732b8068970b368a89271158ca29daf25650eztenghui void *info_ptr; 274f1732b8068970b368a89271158ca29daf25650eztenghui ss_request_table *request_table_ptr; 284f1732b8068970b368a89271158ca29daf25650eztenghui int *code_ptr; 294f1732b8068970b368a89271158ca29daf25650eztenghui{ 304f1732b8068970b368a89271158ca29daf25650eztenghui register int sci_idx; 314f1732b8068970b368a89271158ca29daf25650eztenghui register ss_data *new_table; 324f1732b8068970b368a89271158ca29daf25650eztenghui register ss_data **table; 334f1732b8068970b368a89271158ca29daf25650eztenghui 344f1732b8068970b368a89271158ca29daf25650eztenghui *code_ptr = 0; 354f1732b8068970b368a89271158ca29daf25650eztenghui table = _ss_table; 364f1732b8068970b368a89271158ca29daf25650eztenghui new_table = (ss_data *) malloc(sizeof(ss_data)); 374f1732b8068970b368a89271158ca29daf25650eztenghui 384f1732b8068970b368a89271158ca29daf25650eztenghui if (table == (ss_data **) NULL) { 3984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber table = (ss_data **) malloc(2 * size); 404f1732b8068970b368a89271158ca29daf25650eztenghui table[0] = table[1] = (ss_data *)NULL; 414f1732b8068970b368a89271158ca29daf25650eztenghui } 424f1732b8068970b368a89271158ca29daf25650eztenghui initialize_ss_error_table (); 434f1732b8068970b368a89271158ca29daf25650eztenghui 444f1732b8068970b368a89271158ca29daf25650eztenghui for (sci_idx = 1; table[sci_idx] != (ss_data *)NULL; sci_idx++) 454f1732b8068970b368a89271158ca29daf25650eztenghui ; 464f1732b8068970b368a89271158ca29daf25650eztenghui table = (ss_data **) realloc((char *)table, 474f1732b8068970b368a89271158ca29daf25650eztenghui ((unsigned)sci_idx+2)*size); 484f1732b8068970b368a89271158ca29daf25650eztenghui table[sci_idx+1] = (ss_data *) NULL; 494f1732b8068970b368a89271158ca29daf25650eztenghui table[sci_idx] = new_table; 504f1732b8068970b368a89271158ca29daf25650eztenghui 514f1732b8068970b368a89271158ca29daf25650eztenghui new_table->subsystem_name = subsystem_name; 524f1732b8068970b368a89271158ca29daf25650eztenghui new_table->subsystem_version = version_string; 534f1732b8068970b368a89271158ca29daf25650eztenghui new_table->argv = (char **)NULL; 544f1732b8068970b368a89271158ca29daf25650eztenghui new_table->current_request = (char *)NULL; 554f1732b8068970b368a89271158ca29daf25650eztenghui new_table->info_dirs = (char **)malloc(sizeof(char *)); 564f1732b8068970b368a89271158ca29daf25650eztenghui *new_table->info_dirs = (char *)NULL; 574f1732b8068970b368a89271158ca29daf25650eztenghui new_table->info_ptr = info_ptr; 584f1732b8068970b368a89271158ca29daf25650eztenghui new_table->prompt = malloc((unsigned)strlen(subsystem_name)+4); 594f1732b8068970b368a89271158ca29daf25650eztenghui strcpy(new_table->prompt, subsystem_name); 604f1732b8068970b368a89271158ca29daf25650eztenghui strcat(new_table->prompt, ": "); 614f1732b8068970b368a89271158ca29daf25650eztenghui#ifdef silly 624f1732b8068970b368a89271158ca29daf25650eztenghui new_table->abbrev_info = ss_abbrev_initialize("/etc/passwd", code_ptr); 634f1732b8068970b368a89271158ca29daf25650eztenghui#else 644f1732b8068970b368a89271158ca29daf25650eztenghui new_table->abbrev_info = NULL; 654f1732b8068970b368a89271158ca29daf25650eztenghui#endif 664f1732b8068970b368a89271158ca29daf25650eztenghui new_table->flags.escape_disabled = 0; 674f1732b8068970b368a89271158ca29daf25650eztenghui new_table->flags.abbrevs_disabled = 0; 684f1732b8068970b368a89271158ca29daf25650eztenghui new_table->rqt_tables = 694f1732b8068970b368a89271158ca29daf25650eztenghui (ss_request_table **) calloc(2, sizeof(ss_request_table *)); 704f1732b8068970b368a89271158ca29daf25650eztenghui *(new_table->rqt_tables) = request_table_ptr; 714f1732b8068970b368a89271158ca29daf25650eztenghui *(new_table->rqt_tables+1) = (ss_request_table *) NULL; 724f1732b8068970b368a89271158ca29daf25650eztenghui 734f1732b8068970b368a89271158ca29daf25650eztenghui new_table->readline_handle = 0; 744f1732b8068970b368a89271158ca29daf25650eztenghui new_table->readline_shutdown = 0; 754f1732b8068970b368a89271158ca29daf25650eztenghui new_table->readline = 0; 764f1732b8068970b368a89271158ca29daf25650eztenghui new_table->add_history = 0; 774f1732b8068970b368a89271158ca29daf25650eztenghui new_table->redisplay = 0; 7884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber new_table->rl_completion_matches = 0; 794f1732b8068970b368a89271158ca29daf25650eztenghui _ss_table = table; 804f1732b8068970b368a89271158ca29daf25650eztenghui#if defined(HAVE_DLOPEN) && defined(SHARED_ELF_LIB) 814f1732b8068970b368a89271158ca29daf25650eztenghui ss_get_readline(sci_idx); 824f1732b8068970b368a89271158ca29daf25650eztenghui#endif 834f1732b8068970b368a89271158ca29daf25650eztenghui return(sci_idx); 844f1732b8068970b368a89271158ca29daf25650eztenghui} 854f1732b8068970b368a89271158ca29daf25650eztenghui 864f1732b8068970b368a89271158ca29daf25650eztenghuivoid 874f1732b8068970b368a89271158ca29daf25650eztenghuiss_delete_invocation(sci_idx) 884f1732b8068970b368a89271158ca29daf25650eztenghui int sci_idx; 894f1732b8068970b368a89271158ca29daf25650eztenghui{ 904f1732b8068970b368a89271158ca29daf25650eztenghui register ss_data *t; 914f1732b8068970b368a89271158ca29daf25650eztenghui int ignored_code; 924f1732b8068970b368a89271158ca29daf25650eztenghui 934f1732b8068970b368a89271158ca29daf25650eztenghui t = ss_info(sci_idx); 944f1732b8068970b368a89271158ca29daf25650eztenghui free(t->prompt); 954f1732b8068970b368a89271158ca29daf25650eztenghui free(t->rqt_tables); 964f1732b8068970b368a89271158ca29daf25650eztenghui while(t->info_dirs[0] != (char *)NULL) 974f1732b8068970b368a89271158ca29daf25650eztenghui ss_delete_info_dir(sci_idx, t->info_dirs[0], &ignored_code); 984f1732b8068970b368a89271158ca29daf25650eztenghui free(t->info_dirs); 994f1732b8068970b368a89271158ca29daf25650eztenghui#if defined(HAVE_DLOPEN) && defined(SHARED_ELF_LIB) 1004f1732b8068970b368a89271158ca29daf25650eztenghui if (t->readline_shutdown) 1014f1732b8068970b368a89271158ca29daf25650eztenghui (*t->readline_shutdown)(t); 1024f1732b8068970b368a89271158ca29daf25650eztenghui#endif 1034f1732b8068970b368a89271158ca29daf25650eztenghui free(t); 1044f1732b8068970b368a89271158ca29daf25650eztenghui} 1054f1732b8068970b368a89271158ca29daf25650eztenghui