Changeset eeab9832 for lib/trace.c


Ignore:
Timestamp:
03/03/06 18:24:18 (15 years ago)
Author:
Perry Lorier <perry@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
Children:
7ac9705
Parents:
c3e6e47
Message:

more error handling support
dag card work-around
removed annoying issue with mallocing memory during constructor that we

never free'd

added the ability to catch finalised packets

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/trace.c

    r6c248a9 reeab9832  
    124124struct trace_err_t trace_err;
    125125
    126 struct libtrace_format_t **format_list = 0;
    127 int format_size = 0;
    128 int nformats = 0;
     126static struct libtrace_format_t *formats_list = 0;
    129127
    130128/* strncpy is not assured to copy the final \0, so we
     
    145143
    146144void register_format(struct libtrace_format_t *f) {
    147         if (format_list == 0) {
    148                 format_size = 10;
    149                 format_list = malloc(
    150                                         sizeof(struct libtrace_format_t *) *
    151                                         format_size
    152                                 );
    153         } else if (format_size == nformats) {
    154                 format_size = format_size + 10;
    155                 format_list = realloc(format_list,
    156                                 sizeof(struct libtrace_format_t *) *
    157                                 format_size);
    158         }
    159         format_list[nformats] = f;
     145        assert(f->next==NULL);
     146        f->next=formats_list;
     147        formats_list=f;
    160148        /* Now, verify things */
    161149#if 0
     
    230218        }
    231219#endif
    232         nformats++;
    233220}
    234221
     
    239226 */
    240227void trace_help() {
    241         int i = 0;
     228        struct libtrace_format_t *tmp;
    242229        printf("libtrace %s\n",PACKAGE_VERSION);
    243         for (i = 0; i < nformats; i++) {
    244                 if (format_list[i]->help) {
    245                         format_list[i]->help();
    246                 }
     230        for(tmp=formats_list;tmp;tmp=tmp->next) {
     231                if (tmp->help)
     232                        tmp->help();
    247233        }
    248234}
     
    292278        char *scan = 0;
    293279        const char *uridata = 0;                 
    294         int i = 0;
     280        struct libtrace_format_t *tmp;
    295281       
    296282        trace_err.err_num = TRACE_ERR_NOERROR;
     
    308294        libtrace->started=false;
    309295
    310         for (i = 0; i < nformats; i++) {
    311                 if (strlen(scan) == strlen(format_list[i]->name) &&
    312                                 strncasecmp(scan,
    313                                         format_list[i]->name,
    314                                         strlen(scan)) == 0) {
    315                         libtrace->format=format_list[i];
     296        for (tmp=formats_list;tmp;tmp=tmp->next) {
     297                if (strlen(scan) == strlen(tmp->name) &&
     298                                strncasecmp(scan, tmp->name, strlen(scan)) == 0
     299                                ) {
     300                        libtrace->format=tmp;
    316301                        break;
    317302                }
     
    320305                trace_set_err(libtrace, TRACE_ERR_BAD_FORMAT,
    321306                                "Unknown format (%s)",scan);
    322                 return 0;
     307                return libtrace;
    323308        }
    324309
     
    368353        char *scan = calloc(sizeof(char),URI_PROTO_LINE);
    369354        char *uridata;
    370         int i;
     355        struct libtrace_format_t *tmp;
    371356       
    372357        trace_err.err_num = TRACE_ERR_NOERROR;
     
    380365        libtrace->format = 0;   
    381366       
    382         for (i = 0; i < nformats; i++) {
    383                 if (strlen(scan) == strlen(format_list[i]->name) &&
     367        for(tmp=formats_list;tmp;tmp=tmp->next) {
     368                if (strlen(scan) == strlen(tmp->name) &&
    384369                                !strncasecmp(scan,
    385                                         format_list[i]->name,
     370                                        tmp->name,
    386371                                        strlen(scan))) {
    387                                 libtrace->format=format_list[i];
     372                                libtrace->format=tmp;
    388373                                break;
    389374                                }
     
    410395       
    411396libtrace_out_t *trace_create_output(const char *uri) {
    412         struct libtrace_out_t *libtrace = malloc(sizeof(struct libtrace_out_t));
     397        libtrace_out_t *libtrace = malloc(sizeof(struct libtrace_out_t));
    413398       
    414399        char *scan = 0;
    415400        const char *uridata = 0;
    416         int i;
     401        struct libtrace_format_t *tmp;
    417402
    418403        trace_err.err_num = TRACE_ERR_NOERROR;
     
    420405
    421406        if ((uridata = trace_parse_uri(uri, &scan)) == 0) {
    422                 trace_set_err_out(libtrace,TRACE_ERR_BAD_FORMAT,"Bad uri format (%s)",uri);
     407                trace_set_err_out(libtrace,TRACE_ERR_BAD_FORMAT,
     408                                "Bad uri format (%s)",uri);
    423409                return libtrace;
    424410        }
    425411       
    426412       
    427         libtrace->format = 0;
    428         for (i = 0; i < nformats; i++) {
    429                 if (strlen(scan) == strlen(format_list[i]->name) &&
     413        libtrace->format = NULL;
     414        for(tmp=formats_list;tmp;tmp=tmp->next) {
     415                if (strlen(scan) == strlen(tmp->name) &&
    430416                                !strncasecmp(scan,
    431                                         format_list[i]->name,
     417                                        tmp->name,
    432418                                        strlen(scan))) {
    433                                 libtrace->format=format_list[i];
     419                                libtrace->format=tmp;
    434420                                break;
    435421                                }
    436422        }
    437         if (libtrace->format == 0) {
     423        if (libtrace->format == NULL) {
    438424                trace_set_err_out(libtrace,TRACE_ERR_BAD_FORMAT,
    439425                                "Unknown output format (%s)",scan);
    440                 return 0;
     426                return libtrace;
    441427        }
    442428        libtrace->uridata = strdup(uridata);
     
    452438                        case -1: /* failure */
    453439                                free(libtrace);
    454                                 return 0;
     440                                return libtrace;
    455441                        case 0: /* success */
    456442                                break;
     
    501487        }
    502488
    503         libtrace->started=false;
     489        libtrace->started=true;
    504490        return 0;
    505491}
     
    689675        assert(packet->size<65536);
    690676        assert(packet->size>0);
     677        assert(libtrace->started);
    691678
    692679        if (libtrace->format->write_packet) {
     
    16751662}
    16761663
     1664bool trace_is_err(libtrace_t *trace)
     1665{
     1666        return trace->err.err_num != 0;
     1667}
     1668
     1669void trace_perror(libtrace_t *trace,const char *msg,...)
     1670{
     1671        char buf[256];
     1672        va_list va;
     1673        va_start(va,msg);
     1674        vsnprintf(buf,sizeof(buf),msg,va);
     1675        va_end(va);
     1676        if(trace->err.err_num) {
     1677                fprintf(stderr,"%s(%s): %s\n",
     1678                                buf,trace->uridata,trace->err.problem);
     1679        } else {
     1680                fprintf(stderr,"%s(%s): No error\n",
     1681                                buf,trace->uridata);
     1682        }
     1683}
     1684
    16771685libtrace_err_t trace_get_err_output(libtrace_out_t *trace)
    16781686{
     
    16811689        trace->err.problem[0]='\0';
    16821690        return err;
     1691}
     1692
     1693bool trace_is_err_output(libtrace_out_t *trace)
     1694{
     1695        return trace->err.err_num != 0;
     1696}
     1697
     1698void trace_perror_output(libtrace_out_t *trace,const char *msg,...)
     1699{
     1700        char buf[256];
     1701        va_list va;
     1702        va_start(va,msg);
     1703        vsnprintf(buf,sizeof(buf),msg,va);
     1704        va_end(va);
     1705        if(trace->err.err_num) {
     1706                fprintf(stderr,"%s(%s): %s\n",
     1707                                buf,trace->uridata,trace->err.problem);
     1708        } else {
     1709                fprintf(stderr,"%s(%s): No error\n",buf,trace->uridata);
     1710        }
    16831711}
    16841712
Note: See TracChangeset for help on using the changeset viewer.