mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-10-10 18:28:30 +00:00

These are primarily fixes for "string is not string literal" warnings / errors (with -Werror -Wformat-nonliteral). This should be a no-op change. I had to replace couple of print helper functions with the code they call as it was becoming harder to eliminate these warnings, however these helpers were used only at couple of places, so no major change as such. Signed-off-by: Mahesh Bandewar <maheshb@google.com> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
112 lines
2.2 KiB
C
112 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __TC_EMATCH_H_
|
|
#define __TC_EMATCH_H_
|
|
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
|
|
#include "utils.h"
|
|
#include "tc_util.h"
|
|
|
|
#define EMATCHKINDSIZ 16
|
|
|
|
struct bstr {
|
|
char *data;
|
|
unsigned int len;
|
|
int quoted;
|
|
struct bstr *next;
|
|
};
|
|
|
|
struct bstr *bstr_alloc(const char *text);
|
|
|
|
static inline struct bstr *bstr_new(char *data, unsigned int len)
|
|
{
|
|
struct bstr *b = calloc(1, sizeof(*b));
|
|
|
|
if (b == NULL)
|
|
return NULL;
|
|
|
|
b->data = data;
|
|
b->len = len;
|
|
|
|
return b;
|
|
}
|
|
|
|
static inline int bstrcmp(const struct bstr *b, const char *text)
|
|
{
|
|
int len = strlen(text);
|
|
int d = b->len - len;
|
|
|
|
if (d == 0)
|
|
return strncmp(b->data, text, len);
|
|
|
|
return d;
|
|
}
|
|
|
|
static inline struct bstr *bstr_next(struct bstr *b)
|
|
{
|
|
return b->next;
|
|
}
|
|
|
|
unsigned long bstrtoul(const struct bstr *b);
|
|
void bstr_print(FILE *fd, const struct bstr *b, int ascii);
|
|
|
|
struct ematch {
|
|
struct bstr *args;
|
|
int index;
|
|
int inverted;
|
|
int relation;
|
|
int child_ref;
|
|
struct ematch *child;
|
|
struct ematch *next;
|
|
};
|
|
|
|
static inline struct ematch *new_ematch(struct bstr *args, int inverted)
|
|
{
|
|
struct ematch *e = calloc(1, sizeof(*e));
|
|
|
|
if (e == NULL)
|
|
return NULL;
|
|
|
|
e->args = args;
|
|
e->inverted = inverted;
|
|
|
|
return e;
|
|
}
|
|
|
|
void print_ematch_tree(const struct ematch *tree);
|
|
|
|
struct ematch_util {
|
|
char kind[EMATCHKINDSIZ];
|
|
int kind_num;
|
|
int (*parse_eopt)(struct nlmsghdr *, struct tcf_ematch_hdr *,
|
|
struct bstr *);
|
|
int (*parse_eopt_argv)(struct nlmsghdr *, struct tcf_ematch_hdr *,
|
|
int, char **);
|
|
int (*print_eopt)(FILE *, struct tcf_ematch_hdr *, void *, int);
|
|
void (*print_usage)(FILE *);
|
|
struct ematch_util *next;
|
|
};
|
|
|
|
static inline int parse_layer(const struct bstr *b)
|
|
{
|
|
if (*((char *) b->data) == 'l')
|
|
return TCF_LAYER_LINK;
|
|
else if (*((char *) b->data) == 'n')
|
|
return TCF_LAYER_NETWORK;
|
|
else if (*((char *) b->data) == 't')
|
|
return TCF_LAYER_TRANSPORT;
|
|
else
|
|
return INT_MAX;
|
|
}
|
|
|
|
__attribute__((format(printf, 5, 6)))
|
|
int em_parse_error(int err, struct bstr *args, struct bstr *carg,
|
|
struct ematch_util *, char *fmt, ...);
|
|
int print_ematch(FILE *, const struct rtattr *);
|
|
int parse_ematch(int *, char ***, int, struct nlmsghdr *);
|
|
|
|
#endif
|