mdadm/dlink.c
NeilBrown 503975b9d5 Remove scattered checks for malloc success.
malloc should never fail, and if it does it is unlikely
that anything else useful can be done.  Best approach is to
abort and let some super-daemon restart.

So define xmalloc, xcalloc, xrealloc, xstrdup which don't
fail but just print a message and exit.  Then use those
removing all the tests for failure.

Also replace all "malloc;memset" sequences with 'xcalloc'.

Signed-off-by: NeilBrown <neilb@suse.de>
2012-07-09 17:14:16 +10:00

76 lines
1.3 KiB
C

/* doubly linked lists */
/* This is free software. No strings attached. No copyright claimed */
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#ifdef __dietlibc__
char *strncpy(char *dest, const char *src, size_t n) __THROW;
#endif
void *xcalloc(size_t num, size_t size);
#include "dlink.h"
void *dl_head()
{
void *h;
h = dl_alloc(0);
dl_next(h) = h;
dl_prev(h) = h;
return h;
}
void dl_free(void *v)
{
struct __dl_head *vv = v;
free(vv-1);
}
void dl_init(void *v)
{
dl_next(v) = v;
dl_prev(v) = v;
}
void dl_insert(void *head, void *val)
{
dl_next(val) = dl_next(head);
dl_prev(val) = head;
dl_next(dl_prev(val)) = val;
dl_prev(dl_next(val)) = val;
}
void dl_add(void *head, void *val)
{
dl_prev(val) = dl_prev(head);
dl_next(val) = head;
dl_next(dl_prev(val)) = val;
dl_prev(dl_next(val)) = val;
}
void dl_del(void *val)
{
if (dl_prev(val) == 0 || dl_next(val) == 0)
return;
dl_prev(dl_next(val)) = dl_prev(val);
dl_next(dl_prev(val)) = dl_next(val);
dl_prev(val) = dl_next(val) = 0;
}
char *dl_strndup(char *s, int l)
{
char *n;
if (s == NULL)
return NULL;
n = dl_newv(char, l+1);
strncpy(n, s, l);
n[l] = 0;
return n;
}
char *dl_strdup(char *s)
{
return dl_strndup(s, (int)strlen(s));
}