diff options
Diffstat (limited to 'lib/roken/dumpdata.c')
| -rw-r--r-- | lib/roken/dumpdata.c | 61 | 
1 files changed, 49 insertions, 12 deletions
| diff --git a/lib/roken/dumpdata.c b/lib/roken/dumpdata.c index 4750cac1a5bb..844360187f87 100644 --- a/lib/roken/dumpdata.c +++ b/lib/roken/dumpdata.c @@ -1,23 +1,23 @@  /* - * Copyright (c) 2005 Kungliga Tekniska Högskolan + * Copyright (c) 2005 Kungliga Tekniska Högskolan   * (Royal Institute of Technology, Stockholm, Sweden).   * All rights reserved. - *  + *   * Redistribution and use in source and binary forms, with or without   * modification, are permitted provided that the following conditions   * are met: - *  + *   * 1. Redistributions of source code must retain the above copyright   *    notice, this list of conditions and the following disclaimer. - *  + *   * 2. Redistributions in binary form must reproduce the above copyright   *    notice, this list of conditions and the following disclaimer in the   *    documentation and/or other materials provided with the distribution. - *  + *   * 3. Neither the name of the Institute nor the names of its contributors   *    may be used to endorse or promote products derived from this software   *    without specific prior written permission. - *  + *   * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -31,12 +31,7 @@   * SUCH DAMAGE.   */ -#ifdef HAVE_CONFIG_H  #include <config.h> -RCSID("$Id: dumpdata.c 21005 2007-06-08 01:54:35Z lha $"); -#endif - -#include <unistd.h>  #include "roken.h" @@ -44,7 +39,7 @@ RCSID("$Id: dumpdata.c 21005 2007-06-08 01:54:35Z lha $");   * Write datablob to a filename, don't care about errors.   */ -void ROKEN_LIB_FUNCTION +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL  rk_dumpdata (const char *filename, const void *buf, size_t size)  {      int fd; @@ -55,3 +50,45 @@ rk_dumpdata (const char *filename, const void *buf, size_t size)      net_write(fd, buf, size);      close(fd);  } + +/* + * Read all data from a filename, care about errors. + */ + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_undumpdata(const char *filename, void **buf, size_t *size) +{ +    struct stat sb; +    int fd, ret; +    ssize_t sret; + +    *buf = NULL; + +    fd = open(filename, O_RDONLY, 0); +    if (fd < 0) +	return errno; +    if (fstat(fd, &sb) != 0){ +	ret = errno; +	goto out; +    } +    *buf = malloc(sb.st_size); +    if (*buf == NULL) { +	ret = ENOMEM; +	goto out; +    } +    *size = sb.st_size; + +    sret = net_read(fd, *buf, *size); +    if (sret < 0) +	ret = errno; +    else if (sret != (ssize_t)*size) { +	ret = EINVAL; +	free(*buf); +	*buf = NULL; +    } else +	ret = 0; + + out: +    close(fd); +    return ret; +} | 
