7 static char *rcsid_gdb_c = "$Header$";
11 /************************************************************************/
15 /* Global Database Library - main controlling functions and globally
18 /* Author: Noah Mendelsohn
20 /* Copyright: 1986 MIT Project Athena
23 /* In addition to defining the main routines for gdb, this source
24 /* file #includes gdb_lib.h, which does the external definitions
25 /* for all global data used by the library. Everyone else gets
26 /* externs for this data defined by gdb.h.
28 /************************************************************************/
38 #include <sys/utsname.h>
42 extern char *sys_errlist[];
46 /* This global is defined to make sure that Moira clients are linked
47 * against the correct library.
49 int link_against_the_moira_version_of_gdb = 0;
50 int g_inited = FALSE; /* gdb_init has not been */
53 /*----------------------------------------------------------*/
57 /* Initialize the global database facility. Must be
58 /* called before any of the other gdb functions
59 /* are used. Among other things, this function
60 /* sets to ignore signals for writing on broken pipes.
62 /*----------------------------------------------------------*/
68 char hostname[255]; /* name of local host */
69 extern uid_t getuid();
70 int uid; /* Unix user-i.d. number */
71 char *username; /* string form of i.d. */
73 struct passwd *pw_struct; /* passwd entry comes back */
76 struct utsname nameposix;
79 sigemptyset(&act.sa_mask);
84 * So we know we've been initialized, and we do it only once
91 * Initialize the system defined types table
96 * Initialize the connection control data structures.
98 gdb_mcons = 0; /* number of connections */
100 for (i=0; i<GDB_MAX_CONNECTIONS; i++) {
101 gdb_cons[i].id = GDB_CON_ID;
102 gdb_cons[i].in.stream_buffer = NULL;
103 gdb_cons[i].in.stream_buffer_length = GDB_STREAM_BUFFER_SIZE;
106 * Initialize the fd maps
115 * Initialize the server/client layer
120 * Ignore the signal generated when writing to a pipe which has been
121 * closed at the other end. gdb_move_data handles this condition
125 act.sa_handler = (void(*)()) SIG_IGN;
126 (void) sigaction(SIGPIPE, &act, NULL);
128 (void) signal(SIGPIPE, SIG_IGN);
132 * Make a note of the local host and user name
135 (void) uname(&nameposix);
136 strncpy(hostname, nameposix.nodename, sizeof(hostname) - 1);
138 if (gethostname(hostname, sizeof(hostname)-1)!=0)
139 (void) strcpy(hostname, "????");
141 gdb_host = db_alloc(strlen(hostname)+1);
142 (void) strcpy(gdb_host, hostname);
146 pw_struct = getpwuid(uid);
148 if (pw_struct != NULL && pw_struct ->pw_name != NULL &&
149 *pw_struct->pw_name !='\0')
150 username = pw_struct->pw_name;
153 gdb_uname = db_alloc(strlen(username)+1);
154 (void) strcpy(gdb_uname, username);
158 /*----------------------------------------------------------*/
162 /* Make sure gdb has been initialized, blow up if not.
164 /*----------------------------------------------------------*/
170 GDB_GIVEUP("You must call gdb_init before using GDB services.")
173 /*----------------------------------------------------------*/
177 /* Count the number of bits in a word. Adapted from
180 /*----------------------------------------------------------*/
186 register unsigned int x = inp; /* the word to check */
187 register int count; /* the count to return */
189 for (count=0; x !=0; x=x>>1)
196 /*----------------------------------------------------------*/
200 /* Utility routine to conditionally free a null
201 /* terminated string.
203 /*----------------------------------------------------------*/
210 db_free(str, strlen(str)+1);
213 /*----------------------------------------------------------*/
217 /* Called when a fatal error occurs.
219 /*----------------------------------------------------------*/
225 fprintf(gdb_log,"\n\nFATAL GDB ERROR:\n\n\t");
226 fprintf(gdb_log,errormsg);
227 fprintf(gdb_log,"\n\n");
231 /*----------------------------------------------------------*/
235 /* Acts like gdb_perror, but takes its errno from
236 /* the connection. Resets errno as a side effect.
237 /* THIS ROUTINE IS A NO_OP IF connection_status(con)!=CON_STOPPING
239 /*----------------------------------------------------------*/
242 connection_perror(con, msg)
246 if (con == NULL || connection_status(con) != CON_STOPPING)
248 errno = connection_errno(con);
252 /*----------------------------------------------------------*/
256 /* Performs same function as system perror, but does
257 /* it on gdb_log instead of stderr.
259 /*----------------------------------------------------------*/
266 fprintf(gdb_log, "%s: ", msg);
268 fprintf(gdb_log, "%s.\n", sys_errlist[errno]);
270 fprintf(gdb_log, "errno %d is out of range of message table.\n");