* t : the trace containing the facilities
* pathname : the path name of the facility
*
+ * Open the facility corresponding to the right checksum.
+ *
*returns 0 on success, 1 on error.
****************************************************************************/
int ltt_facility_open(LttFacility *f, LttTrace * t, gchar * pathname)
{
+ int ret = 0;
gchar *token;
parse_file_t in;
- gsize length;
facility_t * fac;
unsigned long checksum;
- GError * error = NULL;
gchar buffer[BUFFER_SIZE];
+ gboolean generated = FALSE;
in.buffer = &(buffer[0]);
in.lineno = 0;
in.error = error_callback;
in.name = pathname;
+ in.unget = 0;
- //in.fd = g_open(in.name, O_RDONLY, 0);
- //if(in.fd < 0 ) {
in.fp = fopen(in.name, "r");
if(in.fp == NULL) {
g_warning("cannot open facility description file %s",
in.name);
- return 1;
+ ret = 1;
+ goto open_error;
}
- //in.channel = g_io_channel_unix_new(in.fd);
- //in.pos = 0;
-
while(1){
token = getToken(&in);
if(in.type == ENDFILE) break;
checkNamedTypesImplemented(&fac->named_types);
generateChecksum(fac->name, &checksum, &fac->events);
-
- generateFacility(f, fac, checksum);
+
+ if(checksum == f->checksum) {
+ generateFacility(f, fac, checksum);
+ generated = TRUE;
+ }
g_free(fac->name);
+ free(fac->capname);
g_free(fac->description);
freeEvents(&fac->events);
sequence_dispose(&fac->events);
freeTypes(&fac->unnamed_types);
sequence_dispose(&fac->unnamed_types);
g_free(fac);
+ if(generated) break; /* use the first good match */
}
else {
g_warning("facility token was expected in file %s", in.name);
+ ret = 1;
goto parse_error;
}
}
-
+
parse_error:
- //g_io_channel_shutdown(in.channel, FALSE, &error); /* No flush */
- //if(error != NULL) {
fclose(in.fp);
- // g_warning("Can not close file: \n%s\n", error->message);
- // g_error_free(error);
- //}
+open_error:
+
+ if(!generated) {
+ g_warning("Cannot find facility %s, checksum 0x%X",
+ g_quark_to_string(f->name), f->checksum);
+ ret = 1;
+ }
- //g_close(in.fd);
+ return ret;
}
void construct_types_and_fields(LttFacility * fac, type_descriptor_t * td,
LttField * fld)
{
- int i, flag;
+ int i;
type_descriptor_t * tmpTd;
switch(td->type) {
LttEventType *ltt_facility_eventtype_get_by_name(LttFacility *f, GQuark name)
{
LttEventType *et = g_datalist_id_get_data(&f->events_by_name, name);
+ return et;
}