static int check_proctable_entry(MPIR_PROCDESC *e) { int i; char *c; if (e->pid == 0) return 0; if (e->host_name == NULL || *e->host_name == '\0') return 0; if (e->executable_name == NULL) return 0; for (i = 0, c = e->host_name; i < 255 && *c != '\0'; i++, c++) { if (!IS_HOSTCHAR(*c)) return 0; } if (i == 255) return 0; return 1; }
static const char *syslog_parse_structured_data(nx_logdata_t *logdata, const char *string) { const char *ptr = string; char sd_name[40]; int i; int sd_namelen; for ( ; *ptr != '\0'; ptr++ ) { for ( ; *ptr == ' '; ptr++ ); // skip space if ( *ptr != '[' ) { // no SD-ELEMENT found return ( ptr ); } ptr++; for ( ; *ptr == ' '; ptr++ ); // skip space sd_namelen = 0; for ( i = 0; *ptr != '\0'; i++, ptr++ ) { if ( i >= (int) sizeof(sd_name) - 1 ) { break; } if ( (*ptr == '=') || (*ptr == ' ') || (*ptr == '"') || (*ptr == ']') ) { if ( sd_namelen == 0 ) { sd_namelen = i; } break; } if ( *ptr == '@' ) { // ignore enterprise number and the at mark sd_namelen = i; sd_name[i] = '\0'; } else if ( IS_HOSTCHAR(*ptr) ) { sd_name[i] = *ptr; } else { sd_name[i] = '_'; } } sd_name[i] = '\0'; if ( *ptr == '\0' ) { return ( string ); } ptr++; if ( strcmp(sd_name, "NXLOG") == 0 ) { sd_name[0] = '\0'; sd_namelen = 0; } if ( (ptr = syslog_parse_sd_params(logdata, sd_name, (size_t) sd_namelen, ptr)) == NULL ) { return ( string ); } for ( ; *ptr == ' '; ptr++ ); // skip space if ( *ptr != ']' ) { // missing closing bracket, invalid SD-ELEMENT return ( string ); } } return ( ptr ); }
static const char *syslog_parse_sd_params(nx_logdata_t *logdata, const char *sd_name, size_t sd_namelen, const char *string) { nx_string_t *param_value = NULL; char param_name[80]; const char *ptr = string; int i; nx_value_t *value; if ( sd_namelen > 0 ) { ASSERT(sd_namelen < sizeof(param_name) / 2); memcpy(param_name, sd_name, sd_namelen); param_name[sd_namelen] = '.'; sd_namelen++; } for ( ; *ptr != '\0'; ptr++ ) { for ( ; *ptr == ' '; ptr++ ); // skip space if ( *ptr == ']' ) { break; } // parse param-name for ( i = (int) sd_namelen; *ptr != '\0'; i++, ptr++ ) { if ( i >= (int) sizeof(param_name) - 1 ) { break; } if ( (*ptr == '=') || (*ptr == ' ') || (*ptr == '"') || (*ptr == ']') ) { break; } if ( IS_HOSTCHAR(*ptr) ) { param_name[i] = *ptr; } else { param_name[i] = '_'; } } param_name[i] = '\0'; if ( *ptr != '=' ) { return ( NULL ); } ptr++; if ( *ptr != '"' ) { return ( NULL ); } ptr++; param_value = nx_string_new_size(50); // parse param-value for ( i = 0; *ptr != '\0'; i++, ptr++ ) { //FIXME: this needs to be utf-8 aware if ( *ptr == '\\' ) { if ( (ptr[1] == '\\') || (ptr[1] == '"') || (ptr[1] == ']') ) { ptr++; nx_string_append(param_value, ptr, 1); } } else if ( *ptr == '"' ) { break; } else { nx_string_append(param_value, ptr, 1); } if ( param_value->len >= 1024*64 ) { // 64K limit nx_string_free(param_value); return ( NULL ); } } if ( *ptr != '"' ) { if ( param_value != NULL ) { nx_string_free(param_value); } return ( NULL ); } value = nx_value_new(NX_VALUE_TYPE_STRING); value->string = param_value; nx_logdata_set_field_value(logdata, param_name, value); } return ( ptr ); }
boolean nx_syslog_parse_rfc3164(nx_logdata_t *logdata, const char *string, size_t stringlen) { boolean retval = TRUE; const char *ptr, *hoststart = NULL, *hostend = NULL; const char *appstart = NULL, *append = NULL; const char *msgstart = NULL, *msgend = NULL; const char *pidstart = NULL, *pidend = NULL; apr_time_t date; boolean got_date = FALSE; boolean got_pri = FALSE; ASSERT(logdata != NULL); ASSERT(string != NULL); if ( stringlen <= 0 ) { stringlen = strlen(string); } msgend = string + stringlen; ptr = parse_syslog_priority(string, logdata, &retval); got_pri = retval; msgstart = ptr; if ( nx_date_parse(&date, ptr, &ptr) != APR_SUCCESS ) { nx_logdata_set_datetime(logdata, "EventTime", apr_time_now()); for ( appstart = ptr; IS_TAGCHAR(*ptr); ptr++ ); append = ptr; } else { // date ok got_date = TRUE; for ( ; *ptr == ' '; ptr++ ); // skip space msgstart = ptr; for ( hoststart = ptr; IS_HOSTCHAR(*ptr); ptr++ ); if ( hoststart == ptr ) { //no host hoststart = NULL; } else if ( *ptr == '\0' ) { // line ends after host msgstart = NULL; hostend = ptr; } else if ( *ptr == '[' ) { //app instead of host hoststart = NULL; appstart = msgstart; } else if ( (*ptr != ' ') && (*ptr != ':') ) { msgstart = hoststart; hoststart = NULL; } else { // got host hostend = ptr; msgstart = ptr; if ( *ptr == ':' ) { // no host appstart = hoststart; hoststart = NULL; append = hostend; hostend = NULL; } else { for ( ; *ptr == ' '; ptr++ ); // skip space for ( appstart = ptr; IS_TAGCHAR(*ptr); ptr++ ); msgstart = ptr; } } } if ( (got_date == TRUE) || (got_pri = TRUE) ) { if ( (appstart != NULL) && (*appstart == '[') ) { appstart = NULL; } else if ( appstart == NULL ) { // ignore pid } else if ( *ptr == '[' ) { // pid append = ptr; ptr++; pidstart = ptr; for ( ; *ptr != '\0'; ptr++ ) { if ( (*ptr == ']') || (*ptr == ' ') ) { break; } } msgstart = appstart; if ( *ptr == ']' ) { pidend = ptr; ptr++; } else { pidend = NULL; } if ( *ptr == ':' ) { ptr++; } else { pidend = NULL; } if ( *ptr == ' ' ) { ptr++; } if ( pidend == NULL ) { appstart = NULL; append = NULL; } if ( appstart != NULL ) { msgstart = ptr; } } else if ( *ptr == ':') { append = ptr; ptr++; if ( *ptr == ' ' ) { ptr++; } if ( appstart != NULL ) { msgstart = ptr; } } else { msgstart = appstart; appstart = NULL; } } else { appstart = NULL; } set_syslog_hostname(logdata, hoststart, hostend); if ( got_date == TRUE ) { nx_date_fix_year(&date); set_syslog_timestamp(logdata, date); } set_syslog_appname(logdata, appstart, append); set_syslog_procid(logdata, pidstart, pidend); set_syslog_message(logdata, msgstart, msgend); return ( retval ); }