3 This file is part of gldbg
4 Copyright © 2009-2010 Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
15 #include "breakpoint.h"
16 #include "functions.h"
19 static unsigned char breakpoints[N_FUNCS] = { };
20 static char break_any = 0;
23 static const char *get_lib_names(void)
25 const char *env = getenv("GLWRAP_LIBS");
31 void *glsym(const char *name)
33 static void **gl_libs = NULL;
38 char *lib_names = strdup(get_lib_names());
42 for(i=0; lib_names[i]; ++i)
46 gl_libs = (void **)malloc((n_libs+1)*sizeof(void *));
51 if(lib_names[j]==':' || lib_names[j]==0)
53 int at_end = (lib_names[j]==0);
56 gl_libs[n_libs] = dlopen(lib_names+i, RTLD_NOW);
59 fprintf(stderr, "Could not open %s: %s\n", lib_names+i, dlerror());
75 for(i=0; gl_libs[i]; ++i)
77 void *sym = dlsym(gl_libs[i], name);
91 const char *var = getenv("GLWRAP_FD");
93 fd = strtol(var, NULL, 0);
96 var = getenv("GLWRAP_FILE");
99 fd = open(var, O_WRONLY|O_CREAT|O_TRUNC, 0644);
102 fprintf(stderr, "Couldn't open dumpfile %s for output: %s", var, strerror(errno));
120 const char *var = getenv("GLWRAP_CTRL_FD");
122 fd = strtol(var, NULL, 0);
130 static void receive_gldBreak(GlPacket *pkt)
133 unsigned char flags_set;
134 unsigned char flags_clr;
136 packet_read_short(pkt, (short *)&func);
137 packet_read_char(pkt, (char *)&flags_set);
138 packet_read_char(pkt, (char *)&flags_clr);
142 breakpoints[func] &= ~flags_clr;
143 breakpoints[func] |= flags_set;
146 break_any = flags_set;
149 static void receive_gldHold(GlPacket *pkt __attribute__((unused)))
154 static void receive(void)
158 while((pkt = packet_receive(get_in_fd())))
162 packet_read_short(pkt, (short *)&func);
165 case FUNC_GLDBREAK: receive_gldBreak(pkt); break;
166 case FUNC_GLDHOLD: receive_gldHold(pkt); break;
172 void tracepoint(unsigned short func, int flag)
176 if((breakpoints[func]|break_any)&flag)
180 pkt = packet_begin(FUNC_GLDBREAK);
181 packet_write_short(pkt, func);
182 packet_send(pkt, get_out_fd());