build: Fix link errors on some systems
Since moving get_rate() and get_size() from tc to lib, on some systems we fail to link because of missing math lib. Move the functions that require math lib to their own c file and add -lm to dcb that now use those functions. ../lib/libutil.a(utils.o): In function `get_rate': utils.c:(.text+0x10dc): undefined reference to `floor' ../lib/libutil.a(utils.o): In function `get_size': utils.c:(.text+0x1394): undefined reference to `floor' ../lib/libutil.a(json_print.o): In function `sprint_size': json_print.c:(.text+0x14c0): undefined reference to `rint' json_print.c:(.text+0x14f4): undefined reference to `rint' json_print.c:(.text+0x157c): undefined reference to `rint' Fixes:f3be0e6366("lib: Move get_rate(), get_rate64() from tc here") Fixes:44396bdfcc("lib: Move get_size() from tc here") Fixes:adbe5de966("lib: Move sprint_size() from tc here, add print_size()") Signed-off-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Petr Machata <petrm@nvidia.com> Tested-by: Petr Machata <petrm@nvidia.com> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
committed by
Stephen Hemminger
parent
676a1a708f
commit
1a22ad2721
@@ -7,6 +7,7 @@ ifeq ($(HAVE_MNL),y)
|
||||
|
||||
DCBOBJ = dcb.o dcb_buffer.o dcb_ets.o dcb_maxrate.o dcb_pfc.o
|
||||
TARGETS += dcb
|
||||
LDLIBS += -lm
|
||||
|
||||
endif
|
||||
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
#include "json_writer.h"
|
||||
#include "color.h"
|
||||
|
||||
#define _IS_JSON_CONTEXT(type) (is_json_context() && (type & PRINT_JSON || type & PRINT_ANY))
|
||||
#define _IS_FP_CONTEXT(type) (!is_json_context() && (type & PRINT_FP || type & PRINT_ANY))
|
||||
|
||||
json_writer_t *get_json_writer(void);
|
||||
|
||||
/*
|
||||
|
||||
@@ -3,8 +3,8 @@ include ../config.mk
|
||||
|
||||
CFLAGS += -fPIC
|
||||
|
||||
UTILOBJ = utils.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
|
||||
inet_proto.o namespace.o json_writer.o json_print.o \
|
||||
UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
|
||||
inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \
|
||||
names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o
|
||||
|
||||
ifeq ($(HAVE_ELF),y)
|
||||
|
||||
@@ -11,16 +11,12 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "json_print.h"
|
||||
|
||||
static json_writer_t *_jw;
|
||||
|
||||
#define _IS_JSON_CONTEXT(type) ((type & PRINT_JSON || type & PRINT_ANY) && _jw)
|
||||
#define _IS_FP_CONTEXT(type) (!_jw && (type & PRINT_FP || type & PRINT_ANY))
|
||||
|
||||
static void __new_json_obj(int json, bool have_array)
|
||||
{
|
||||
if (json) {
|
||||
@@ -342,32 +338,3 @@ int print_color_rate(bool use_iec, enum output_type type, enum color_attr color,
|
||||
free(buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
char *sprint_size(__u32 sz, char *buf)
|
||||
{
|
||||
long kilo = 1024;
|
||||
long mega = kilo * kilo;
|
||||
size_t len = SPRINT_BSIZE - 1;
|
||||
double tmp = sz;
|
||||
|
||||
if (sz >= mega && fabs(mega * rint(tmp / mega) - sz) < 1024)
|
||||
snprintf(buf, len, "%gMb", rint(tmp / mega));
|
||||
else if (sz >= kilo && fabs(kilo * rint(tmp / kilo) - sz) < 16)
|
||||
snprintf(buf, len, "%gKb", rint(tmp / kilo));
|
||||
else
|
||||
snprintf(buf, len, "%ub", sz);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
int print_color_size(enum output_type type, enum color_attr color,
|
||||
const char *key, const char *fmt, __u32 sz)
|
||||
{
|
||||
SPRINT_BUF(buf);
|
||||
|
||||
if (_IS_JSON_CONTEXT(type))
|
||||
return print_color_uint(type, color, key, "%u", sz);
|
||||
|
||||
sprint_size(sz, buf);
|
||||
return print_color_string(type, color, key, fmt, buf);
|
||||
}
|
||||
|
||||
37
lib/json_print_math.c
Normal file
37
lib/json_print_math.c
Normal file
@@ -0,0 +1,37 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "json_print.h"
|
||||
|
||||
char *sprint_size(__u32 sz, char *buf)
|
||||
{
|
||||
long kilo = 1024;
|
||||
long mega = kilo * kilo;
|
||||
size_t len = SPRINT_BSIZE - 1;
|
||||
double tmp = sz;
|
||||
|
||||
if (sz >= mega && fabs(mega * rint(tmp / mega) - sz) < 1024)
|
||||
snprintf(buf, len, "%gMb", rint(tmp / mega));
|
||||
else if (sz >= kilo && fabs(kilo * rint(tmp / kilo) - sz) < 16)
|
||||
snprintf(buf, len, "%gKb", rint(tmp / kilo));
|
||||
else
|
||||
snprintf(buf, len, "%ub", sz);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
int print_color_size(enum output_type type, enum color_attr color,
|
||||
const char *key, const char *fmt, __u32 sz)
|
||||
{
|
||||
SPRINT_BUF(buf);
|
||||
|
||||
if (_IS_JSON_CONTEXT(type))
|
||||
return print_color_uint(type, color, key, "%u", sz);
|
||||
|
||||
sprint_size(sz, buf);
|
||||
return print_color_string(type, color, key, fmt, buf);
|
||||
}
|
||||
114
lib/utils.c
114
lib/utils.c
@@ -513,120 +513,6 @@ int get_addr64(__u64 *ap, const char *cp)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* See http://physics.nist.gov/cuu/Units/binary.html */
|
||||
static const struct rate_suffix {
|
||||
const char *name;
|
||||
double scale;
|
||||
} suffixes[] = {
|
||||
{ "bit", 1. },
|
||||
{ "Kibit", 1024. },
|
||||
{ "kbit", 1000. },
|
||||
{ "mibit", 1024.*1024. },
|
||||
{ "mbit", 1000000. },
|
||||
{ "gibit", 1024.*1024.*1024. },
|
||||
{ "gbit", 1000000000. },
|
||||
{ "tibit", 1024.*1024.*1024.*1024. },
|
||||
{ "tbit", 1000000000000. },
|
||||
{ "Bps", 8. },
|
||||
{ "KiBps", 8.*1024. },
|
||||
{ "KBps", 8000. },
|
||||
{ "MiBps", 8.*1024*1024. },
|
||||
{ "MBps", 8000000. },
|
||||
{ "GiBps", 8.*1024.*1024.*1024. },
|
||||
{ "GBps", 8000000000. },
|
||||
{ "TiBps", 8.*1024.*1024.*1024.*1024. },
|
||||
{ "TBps", 8000000000000. },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
int get_rate(unsigned int *rate, const char *str)
|
||||
{
|
||||
char *p;
|
||||
double bps = strtod(str, &p);
|
||||
const struct rate_suffix *s;
|
||||
|
||||
if (p == str)
|
||||
return -1;
|
||||
|
||||
for (s = suffixes; s->name; ++s) {
|
||||
if (strcasecmp(s->name, p) == 0) {
|
||||
bps *= s->scale;
|
||||
p += strlen(p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (*p)
|
||||
return -1; /* unknown suffix */
|
||||
|
||||
bps /= 8; /* -> bytes per second */
|
||||
*rate = bps;
|
||||
/* detect if an overflow happened */
|
||||
if (*rate != floor(bps))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_rate64(__u64 *rate, const char *str)
|
||||
{
|
||||
char *p;
|
||||
double bps = strtod(str, &p);
|
||||
const struct rate_suffix *s;
|
||||
|
||||
if (p == str)
|
||||
return -1;
|
||||
|
||||
for (s = suffixes; s->name; ++s) {
|
||||
if (strcasecmp(s->name, p) == 0) {
|
||||
bps *= s->scale;
|
||||
p += strlen(p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (*p)
|
||||
return -1; /* unknown suffix */
|
||||
|
||||
bps /= 8; /* -> bytes per second */
|
||||
*rate = bps;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_size(unsigned int *size, const char *str)
|
||||
{
|
||||
double sz;
|
||||
char *p;
|
||||
|
||||
sz = strtod(str, &p);
|
||||
if (p == str)
|
||||
return -1;
|
||||
|
||||
if (*p) {
|
||||
if (strcasecmp(p, "kb") == 0 || strcasecmp(p, "k") == 0)
|
||||
sz *= 1024;
|
||||
else if (strcasecmp(p, "gb") == 0 || strcasecmp(p, "g") == 0)
|
||||
sz *= 1024*1024*1024;
|
||||
else if (strcasecmp(p, "gbit") == 0)
|
||||
sz *= 1024*1024*1024/8;
|
||||
else if (strcasecmp(p, "mb") == 0 || strcasecmp(p, "m") == 0)
|
||||
sz *= 1024*1024;
|
||||
else if (strcasecmp(p, "mbit") == 0)
|
||||
sz *= 1024*1024/8;
|
||||
else if (strcasecmp(p, "kbit") == 0)
|
||||
sz *= 1024/8;
|
||||
else if (strcasecmp(p, "b") != 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
*size = sz;
|
||||
|
||||
/* detect if an overflow happened */
|
||||
if (*size != floor(sz))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_address_type(inet_prefix *addr)
|
||||
{
|
||||
switch (addr->family) {
|
||||
|
||||
123
lib/utils_math.c
Normal file
123
lib/utils_math.c
Normal file
@@ -0,0 +1,123 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
/* See http://physics.nist.gov/cuu/Units/binary.html */
|
||||
static const struct rate_suffix {
|
||||
const char *name;
|
||||
double scale;
|
||||
} suffixes[] = {
|
||||
{ "bit", 1. },
|
||||
{ "Kibit", 1024. },
|
||||
{ "kbit", 1000. },
|
||||
{ "mibit", 1024.*1024. },
|
||||
{ "mbit", 1000000. },
|
||||
{ "gibit", 1024.*1024.*1024. },
|
||||
{ "gbit", 1000000000. },
|
||||
{ "tibit", 1024.*1024.*1024.*1024. },
|
||||
{ "tbit", 1000000000000. },
|
||||
{ "Bps", 8. },
|
||||
{ "KiBps", 8.*1024. },
|
||||
{ "KBps", 8000. },
|
||||
{ "MiBps", 8.*1024*1024. },
|
||||
{ "MBps", 8000000. },
|
||||
{ "GiBps", 8.*1024.*1024.*1024. },
|
||||
{ "GBps", 8000000000. },
|
||||
{ "TiBps", 8.*1024.*1024.*1024.*1024. },
|
||||
{ "TBps", 8000000000000. },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
int get_rate(unsigned int *rate, const char *str)
|
||||
{
|
||||
char *p;
|
||||
double bps = strtod(str, &p);
|
||||
const struct rate_suffix *s;
|
||||
|
||||
if (p == str)
|
||||
return -1;
|
||||
|
||||
for (s = suffixes; s->name; ++s) {
|
||||
if (strcasecmp(s->name, p) == 0) {
|
||||
bps *= s->scale;
|
||||
p += strlen(p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (*p)
|
||||
return -1; /* unknown suffix */
|
||||
|
||||
bps /= 8; /* -> bytes per second */
|
||||
*rate = bps;
|
||||
/* detect if an overflow happened */
|
||||
if (*rate != floor(bps))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_rate64(__u64 *rate, const char *str)
|
||||
{
|
||||
char *p;
|
||||
double bps = strtod(str, &p);
|
||||
const struct rate_suffix *s;
|
||||
|
||||
if (p == str)
|
||||
return -1;
|
||||
|
||||
for (s = suffixes; s->name; ++s) {
|
||||
if (strcasecmp(s->name, p) == 0) {
|
||||
bps *= s->scale;
|
||||
p += strlen(p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (*p)
|
||||
return -1; /* unknown suffix */
|
||||
|
||||
bps /= 8; /* -> bytes per second */
|
||||
*rate = bps;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_size(unsigned int *size, const char *str)
|
||||
{
|
||||
double sz;
|
||||
char *p;
|
||||
|
||||
sz = strtod(str, &p);
|
||||
if (p == str)
|
||||
return -1;
|
||||
|
||||
if (*p) {
|
||||
if (strcasecmp(p, "kb") == 0 || strcasecmp(p, "k") == 0)
|
||||
sz *= 1024;
|
||||
else if (strcasecmp(p, "gb") == 0 || strcasecmp(p, "g") == 0)
|
||||
sz *= 1024*1024*1024;
|
||||
else if (strcasecmp(p, "gbit") == 0)
|
||||
sz *= 1024*1024*1024/8;
|
||||
else if (strcasecmp(p, "mb") == 0 || strcasecmp(p, "m") == 0)
|
||||
sz *= 1024*1024;
|
||||
else if (strcasecmp(p, "mbit") == 0)
|
||||
sz *= 1024*1024/8;
|
||||
else if (strcasecmp(p, "kbit") == 0)
|
||||
sz *= 1024/8;
|
||||
else if (strcasecmp(p, "b") != 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
*size = sz;
|
||||
|
||||
/* detect if an overflow happened */
|
||||
if (*size != floor(sz))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user