udhcpc is supposed to be in /sbin, not /usr/sbin/
[oweals/busybox.git] / libbb / xfuncs.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <fcntl.h>
29 #include "libbb.h"
30
31
32 #ifndef DMALLOC
33 extern void *xmalloc(size_t size)
34 {
35         void *ptr = malloc(size);
36         if (ptr == NULL && size != 0)
37                 error_msg_and_die(memory_exhausted);
38         return ptr;
39 }
40
41 extern void *xrealloc(void *ptr, size_t size)
42 {
43         ptr = realloc(ptr, size);
44         if (ptr == NULL && size != 0)
45                 error_msg_and_die(memory_exhausted);
46         return ptr;
47 }
48
49 extern void *xcalloc(size_t nmemb, size_t size)
50 {
51         void *ptr = calloc(nmemb, size);
52         if (ptr == NULL && nmemb != 0 && size != 0)
53                 error_msg_and_die(memory_exhausted);
54         return ptr;
55 }
56
57 extern char * xstrdup (const char *s) {
58         char *t;
59
60         if (s == NULL)
61                 return NULL;
62
63         t = strdup (s);
64
65         if (t == NULL)
66                 error_msg_and_die(memory_exhausted);
67
68         return t;
69 }
70 #endif
71
72 extern char * xstrndup (const char *s, int n) {
73         char *t;
74
75         if (s == NULL)
76                 error_msg_and_die("xstrndup bug");
77
78         t = xmalloc(++n);
79         
80         return safe_strncpy(t,s,n);
81 }
82
83 FILE *xfopen(const char *path, const char *mode)
84 {
85         FILE *fp;
86         if ((fp = fopen(path, mode)) == NULL)
87                 perror_msg_and_die("%s", path);
88         return fp;
89 }
90
91 extern int xopen(const char *pathname, int flags)
92 {
93         int ret;
94         
95         ret = open(pathname, flags, 0777);
96         if (ret == -1) {
97                 perror_msg_and_die("%s", pathname);
98         }
99         return ret;
100 }
101
102 extern ssize_t xread(int fd, void *buf, size_t count)
103 {
104         ssize_t size;
105
106         size = read(fd, buf, count);
107         if (size == -1) {
108                 perror_msg_and_die("Read error");
109         }
110         return(size);
111 }
112
113 extern void xread_all(int fd, void *buf, size_t count)
114 {
115         ssize_t size;
116
117         size = xread(fd, buf, count);
118         if (size != count) {
119                 error_msg_and_die("Short read");
120         }
121         return;
122 }
123
124 extern unsigned char xread_char(int fd)
125 {
126         char tmp;
127         
128         xread_all(fd, &tmp, 1);
129
130         return(tmp);    
131 }
132
133 /* Stupid gcc always includes its own builtin strlen()... */
134 #undef strlen
135 size_t xstrlen(const char *string)
136 {
137             return(strlen(string));
138 }
139
140 /* END CODE */
141 /*
142 Local Variables:
143 c-file-style: "linux"
144 c-basic-offset: 4
145 tab-width: 4
146 End:
147 */