100 lines
1.6 KiB
C
100 lines
1.6 KiB
C
|
/*
|
||
|
safe C library functions
|
||
|
|
||
|
This upgrades unsafe C functions like "strcpy()" to safer equivalents,
|
||
|
like "safe_strcpy()".
|
||
|
|
||
|
NOTE: This is for maintaining a policy of "no unsafe functions"
|
||
|
*/
|
||
|
#include "util-safefunc.h"
|
||
|
#include <errno.h>
|
||
|
#include <ctype.h>
|
||
|
#include <errno.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
/**
|
||
|
* Case-insensitive memcmp()
|
||
|
*/
|
||
|
#ifdef __GNUC__
|
||
|
int
|
||
|
memcasecmp(const void *lhs, const void *rhs, size_t length)
|
||
|
{
|
||
|
int i;
|
||
|
for (i=0; i<length; i++) {
|
||
|
if (tolower(((char*)lhs)[i]) != tolower(((char*)rhs)[i]))
|
||
|
return -1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* Safe version of `strcpy()`
|
||
|
*/
|
||
|
void
|
||
|
safe_strcpy(char *dst, size_t sizeof_dst, const char *src)
|
||
|
{
|
||
|
size_t i;
|
||
|
|
||
|
if (sizeof_dst == 0)
|
||
|
return;
|
||
|
|
||
|
if (dst == NULL)
|
||
|
return;
|
||
|
|
||
|
if (src == NULL) {
|
||
|
dst[0] = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for (i=0; src[i]; i++) {
|
||
|
if (i >= sizeof_dst) {
|
||
|
dst[0] = 0;
|
||
|
return;
|
||
|
} else
|
||
|
dst[i] = src[i];
|
||
|
}
|
||
|
if (i >= sizeof_dst) {
|
||
|
dst[0] = 0;
|
||
|
return ;
|
||
|
} else
|
||
|
dst[i] = src[i];
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
int
|
||
|
safe_localtime(struct tm* _tm, const time_t *time)
|
||
|
{
|
||
|
struct tm *x;
|
||
|
|
||
|
x = localtime(time);
|
||
|
if (x == NULL) {
|
||
|
memset(_tm, 0, sizeof(*_tm));
|
||
|
return -1;
|
||
|
}
|
||
|
memcpy(_tm, x, sizeof(*_tm));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
int
|
||
|
safe_gmtime(struct tm* _tm, const time_t *time)
|
||
|
{
|
||
|
struct tm *x;
|
||
|
|
||
|
x = gmtime(time);
|
||
|
if (x == NULL) {
|
||
|
memset(_tm, 0, sizeof(*_tm));
|
||
|
return -1;
|
||
|
}
|
||
|
memcpy(_tm, x, sizeof(*_tm));
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|