Annotation of embedaddon/libpdel/util/kernelglue.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * Copyright (c) 1988, 1993
                      4:  *     The Regents of the University of California.  All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  * 1. Redistributions of source code must retain the above copyright
                     10:  *    notice, this list of conditions and the following disclaimer.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  * 3. All advertising materials mentioning features or use of this software
                     15:  *    must display the following acknowledgement:
                     16:  *     This product includes software developed by the University of
                     17:  *     California, Berkeley and its contributors.
                     18:  * 4. Neither the name of the University nor the names of its contributors
                     19:  *    may be used to endorse or promote products derived from this software
                     20:  *    without specific prior written permission.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     23:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     24:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     25:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     26:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     27:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     28:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     29:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     30:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     31:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     32:  * SUCH DAMAGE.
                     33:  */
                     34: 
                     35: #include <sys/types.h>
                     36: #include <sys/errno.h>
                     37: #include <sys/param.h>
                     38: #include <sys/libkern.h>
                     39: #include <sys/systm.h>
                     40: #include <sys/ctype.h>
                     41: #include <net/ethernet.h>
                     42: #include <netinet/in.h>
                     43: #include <netinet/in_systm.h>
                     44: 
                     45: #include "kernelglue.h"
                     46: 
                     47: /*
                     48:  * Kernelglue kernel memory type
                     49:  */
                     50: MALLOC_DEFINE(M_LIBPDEL, "LIBPDEL", "libpdel kernel memory");
                     51: 
                     52: /* Errno */
                     53: int    errno;
                     54: 
                     55: char *
                     56: strdup(const char *str)
                     57: {
                     58:        size_t len;
                     59:        char *copy;
                     60: 
                     61:        len = strlen(str) + 1;
                     62:        if ((copy = MALLOC(NULL, len)) == NULL)
                     63:                return (NULL);
                     64:        memcpy(copy, str, len);
                     65:        return (copy);
                     66: }
                     67: 
                     68: int
                     69: asprintf(char **ret, const char *format, ...)
                     70: {
                     71:        va_list args;
                     72:        int rtn;
                     73: 
                     74:        va_start(args, format);
                     75:        rtn = vasprintf(ret, format, args);
                     76:        va_end(args);
                     77:        return (rtn);
                     78: }
                     79: 
                     80: int
                     81: vasprintf(char **ret, const char *format, va_list ap)
                     82: {
                     83:        size_t buflen = 256;
                     84:        char *buf;
                     85:        int slen;
                     86: 
                     87:        /* Initialize return value in case of failure */
                     88:        *ret = NULL;
                     89: 
                     90: try_again:
                     91:        /* Allocate buffer */
                     92:        if ((buf = malloc(buflen, M_LIBPDEL, M_NOWAIT)) == NULL) {
                     93:                errno = ENOMEM;
                     94:                return (-1);
                     95:        }
                     96: 
                     97:        /* Format string */
                     98:        slen = vsnprintf(buf, buflen, format, ap);
                     99: 
                    100:        /* If buffer was big enough, we're done */
                    101:        if (slen < buflen) {
                    102:                *ret = buf;
                    103:                return (slen);
                    104:        }
                    105: 
                    106:        /* Increase buffer size and try again */
                    107:        free(buf, M_LIBPDEL);
                    108:        buflen = slen + 1;
                    109:        goto try_again;
                    110: }
                    111: 
                    112: char *
                    113: strchr(const char *s, int c)
                    114: {
                    115:        while (1) {
                    116:                if (*s == (char)c)
                    117:                        return ((char *)s);
                    118:                if (*s == '\0')
                    119:                        return (NULL);
                    120:                s++;
                    121:        }
                    122: }
                    123: 
                    124: int
                    125: strcasecmp(const char *s1, const char *s2)
                    126: {
                    127:        const u_char *s = s1;
                    128:        const u_char *t = s2;
                    129: 
                    130:         while (*s != '\0' && *t != '\0' && tolower(*s) == tolower(*t)) {
                    131:                s++;
                    132:                t++;
                    133:         }
                    134:         return (*s - *t);
                    135: }
                    136: 
                    137: size_t
                    138: strlcpy(char *dst, const char *src, size_t siz)
                    139: {
                    140:        char *d = dst;
                    141:        const char *s = src;
                    142:        size_t n = siz;
                    143: 
                    144:        /* Copy as many bytes as will fit */
                    145:        if (n != 0 && --n != 0) {
                    146:                do {
                    147:                        if ((*d++ = *s++) == 0)
                    148:                                break;
                    149:                } while (--n != 0);
                    150:        }
                    151: 
                    152:        /* Not enough room in dst, add NUL and traverse rest of src */
                    153:        if (n == 0) {
                    154:                if (siz != 0)
                    155:                        *d = '\0';              /* NUL-terminate dst */
                    156:                while (*s++)
                    157:                        ;
                    158:        }
                    159: 
                    160:        return(s - src - 1);    /* count does not include NUL */
                    161: }
                    162: 
                    163: void *
                    164: memmove(void *dst, const void *src, size_t len)
                    165: {
                    166:        ovbcopy(src, dst, len);
                    167:        return (dst);
                    168: }
                    169: 
                    170: time_t 
                    171: time(time_t *newtime)
                    172: {
                    173:        struct timeval valtime;
                    174: 
                    175:        getmicrotime(&valtime);
                    176:        if (newtime)
                    177:                *newtime = valtime.tv_sec;
                    178:        return (valtime.tv_sec);
                    179: }
                    180: 
                    181: char *
                    182: strerror(int errnum)
                    183: {
                    184:        static char buf[32];
                    185:        const char *s;
                    186: 
                    187:        switch (errnum) {
                    188:        case EPERM:             s = "Operation not permitted"; break;
                    189:        case ENOENT:            s = "No such file or directory"; break;
                    190:        case ESRCH:             s = "No such process"; break;
                    191:        case EINTR:             s = "Interrupted system call"; break;
                    192:        case EIO:               s = "Input/output error"; break;
                    193:        case ENXIO:             s = "Device not configured"; break;
                    194:        case E2BIG:             s = "Argument list too long"; break;
                    195:        case ENOEXEC:           s = "Exec format error"; break;
                    196:        case EBADF:             s = "Bad file descriptor"; break;
                    197:        case ECHILD:            s = "No child processes"; break;
                    198:        case EDEADLK:           s = "Resource deadlock avoided"; break;
                    199:        case ENOMEM:            s = "Cannot allocate memory"; break;
                    200:        case EACCES:            s = "Permission denied"; break;
                    201:        case EFAULT:            s = "Bad address"; break;
                    202:        case ENOTBLK:           s = "Block device required"; break;
                    203:        case EBUSY:             s = "Device busy"; break;
                    204:        case EEXIST:            s = "File exists"; break;
                    205:        case EXDEV:             s = "Cross-device link"; break;
                    206:        case ENODEV:            s = "Operation not supported by device"; break;
                    207:        case ENOTDIR:           s = "Not a directory"; break;
                    208:        case EISDIR:            s = "Is a directory"; break;
                    209:        case EINVAL:            s = "Invalid argument"; break;
                    210:        case ENFILE:            s = "Too many open files in system"; break;
                    211:        case EMFILE:            s = "Too many open files"; break;
                    212:        case ENOTTY:            s = "Inappropriate ioctl for device"; break;
                    213:        case ETXTBSY:           s = "Text file busy"; break;
                    214:        case EFBIG:             s = "File too large"; break;
                    215:        case ENOSPC:            s = "No space left on device"; break;
                    216:        case ESPIPE:            s = "Illegal seek"; break;
                    217:        case EROFS:             s = "Read-only file system"; break;
                    218:        case EMLINK:            s = "Too many links"; break;
                    219:        case EPIPE:             s = "Broken pipe"; break;
                    220:        case EDOM:              s = "Numerical argument out of domain"; break;
                    221:        case ERANGE:            s = "Result too large"; break;
                    222:        case EAGAIN:            s = "Resource temporarily unavailable"; break;
                    223:        case EINPROGRESS:       s = "Operation now in progress"; break;
                    224:        case EALREADY:          s = "Operation already in progress"; break;
                    225:        case ENOTSOCK:          s = "Socket operation on non-socket"; break;
                    226:        case EDESTADDRREQ:      s = "Destination address required"; break;
                    227:        case EMSGSIZE:          s = "Message too long"; break;
                    228:        case EPROTOTYPE:        s = "Protocol wrong type for socket"; break;
                    229:        case ENOPROTOOPT:       s = "Protocol not available"; break;
                    230:        case EPROTONOSUPPORT:   s = "Protocol not supported"; break;
                    231:        case ESOCKTNOSUPPORT:   s = "Socket type not supported"; break;
                    232:        case EOPNOTSUPP:        s = "Operation not supported"; break;
                    233:        case EPFNOSUPPORT:      s = "Protocol family not supported"; break;
                    234:        case EAFNOSUPPORT:
                    235:                s = "Address family not supported by protocol family"; break;
                    236:        case EADDRINUSE:        s = "Address already in use"; break;
                    237:        case EADDRNOTAVAIL:     s = "Can't assign requested address"; break;
                    238:        case ENETDOWN:          s = "Network is down"; break;
                    239:        case ENETUNREACH:       s = "Network is unreachable"; break;
                    240:        case ENETRESET: 
                    241:                s = "Network dropped connection on reset"; break;
                    242:        case ECONNABORTED:      s = "Software caused connection abort"; break;
                    243:        case ECONNRESET:        s = "Connection reset by peer"; break;
                    244:        case ENOBUFS:           s = "No buffer space available"; break;
                    245:        case EISCONN:           s = "Socket is already connected"; break;
                    246:        case ENOTCONN:          s = "Socket is not connected"; break;
                    247:        case ESHUTDOWN:         s = "Can't send after socket shutdown"; break;
                    248:        case ETOOMANYREFS:      s = "Too many references: can't splice"; break;
                    249:        case ETIMEDOUT:         s = "Operation timed out"; break;
                    250:        case ECONNREFUSED:      s = "Connection refused"; break;
                    251:        case ELOOP:             s = "Too many levels of symbolic links"; break;
                    252:        case ENAMETOOLONG:      s = "File name too long"; break;
                    253:        case EHOSTDOWN:         s = "Host is down"; break;
                    254:        case EHOSTUNREACH:      s = "No route to host"; break;
                    255:        case ENOTEMPTY:         s = "Directory not empty"; break;
                    256:        case EPROCLIM:          s = "Too many processes"; break;
                    257:        case EUSERS:            s = "Too many users"; break;
                    258:        case EDQUOT:            s = "Disc quota exceeded"; break;
                    259:        case ESTALE:            s = "Stale NFS file handle"; break;
                    260:        case EREMOTE:           s = "Too many levels of remote in path"; break;
                    261:        case EBADRPC:           s = "RPC struct is bad"; break;
                    262:        case ERPCMISMATCH:      s = "RPC version wrong"; break;
                    263:        case EPROGUNAVAIL:      s = "RPC prog. not avail"; break;
                    264:        case EPROGMISMATCH:     s = "Program version wrong"; break;
                    265:        case EPROCUNAVAIL:      s = "Bad procedure for program"; break;
                    266:        case ENOLCK:            s = "No locks available"; break;
                    267:        case ENOSYS:            s = "Function not implemented"; break;
                    268:        case EFTYPE:            s = "Inappropriate file type or format"; break;
                    269:        case EAUTH:             s = "Authentication error"; break;
                    270:        case ENEEDAUTH:         s = "Need authenticator"; break;
                    271:        case EIDRM:             s = "Identifier removed"; break;
                    272:        case ENOMSG:            s = "No message of desired type"; break;
                    273:        case EOVERFLOW:         s =
                    274:                "Value too large to be stored in data type"; break;
                    275:        case ECANCELED:         s = "Operation canceled"; break;
                    276:        case EILSEQ:            s = "Illegal byte sequence"; break;
                    277:        default:
                    278:                snprintf(buf, sizeof(buf), "Unknown error: %d", errnum);
                    279:                errno = EINVAL;
                    280:                return (buf);
                    281:        }
                    282:        strlcpy(buf, s, sizeof(buf));
                    283:        return (buf);
                    284: }
                    285: 
                    286: void *
                    287: kern_malloc(size_t size)
                    288: {
                    289:        void *mem;
                    290: 
                    291:        if ((mem = malloc((u_long)size, M_LIBPDEL, M_NOWAIT)) == NULL)
                    292:                errno = ENOMEM;
                    293:        return (mem);
                    294: }
                    295: 
                    296: void *
                    297: kern_realloc(void *mem, size_t size)
                    298: {
                    299:        if ((mem = realloc(mem,
                    300:            (u_long)size, M_LIBPDEL, M_NOWAIT)) == NULL)
                    301:                errno = ENOMEM;
                    302:        return (mem);
                    303: }
                    304: 
                    305: void
                    306: kern_free(void *mem)
                    307: {
                    308:        free(mem, M_LIBPDEL);
                    309: }
                    310: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>