diff --git a/src/ax25.c b/src/ax25.c index 8e0f8b1..ac9a5b8 100644 --- a/src/ax25.c +++ b/src/ax25.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -77,22 +78,6 @@ error_invalid_callsign: return -1; } -static inline int expt(int base, int e) { - int ret; - - if (e == 0) { - return 1; - } - - ret = base; - - while (--e) { - ret *= ret; - } - - return ret; -} - int patty_ax25_ntop(const patty_ax25_addr *addr, char *dest, size_t len) { @@ -118,29 +103,16 @@ int patty_ax25_ntop(const patty_ax25_addr *addr, } if (ssid) { - int place = 2; + int formatted; - if (o == len) { - goto error_overflow; - } - - dest[o++] = '-'; - - while (place--) { - int div = expt(10, place), - num = ssid / div; - - if (num) { - if (o == len) { - goto error_overflow; - } - - dest[o++] = '0' + num; - } + if ((formatted = snprintf(&dest[o], 1 + len - o, "-%d", ssid)) < 0) { + goto error_format_ssid; + } else { + o += formatted; } } - if (o == len) { + if (o > len) { goto error_overflow; } @@ -148,6 +120,7 @@ int patty_ax25_ntop(const patty_ax25_addr *addr, return 0; +error_format_ssid: error_overflow: errno = EOVERFLOW;