1178825Sdfr/*
2233294Sstas * Copyright (c) 2005 Kungliga Tekniska H��gskolan
3178825Sdfr * (Royal Institute of Technology, Stockholm, Sweden).
4178825Sdfr * All rights reserved.
5233294Sstas *
6178825Sdfr * Redistribution and use in source and binary forms, with or without
7178825Sdfr * modification, are permitted provided that the following conditions
8178825Sdfr * are met:
9233294Sstas *
10178825Sdfr * 1. Redistributions of source code must retain the above copyright
11178825Sdfr *    notice, this list of conditions and the following disclaimer.
12233294Sstas *
13178825Sdfr * 2. Redistributions in binary form must reproduce the above copyright
14178825Sdfr *    notice, this list of conditions and the following disclaimer in the
15178825Sdfr *    documentation and/or other materials provided with the distribution.
16233294Sstas *
17178825Sdfr * 3. Neither the name of the Institute nor the names of its contributors
18178825Sdfr *    may be used to endorse or promote products derived from this software
19178825Sdfr *    without specific prior written permission.
20233294Sstas *
21178825Sdfr * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22178825Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23178825Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24178825Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25178825Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26178825Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27178825Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28178825Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29178825Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30178825Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31178825Sdfr * SUCH DAMAGE.
32178825Sdfr */
33178825Sdfr
34178825Sdfr#include <config.h>
35178825Sdfr
36178825Sdfr#include "roken.h"
37178825Sdfr
38178825Sdfr/*
39178825Sdfr * Write datablob to a filename, don't care about errors.
40178825Sdfr */
41178825Sdfr
42233294SstasROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
43178825Sdfrrk_dumpdata (const char *filename, const void *buf, size_t size)
44178825Sdfr{
45178825Sdfr    int fd;
46178825Sdfr
47178825Sdfr    fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0640);
48178825Sdfr    if (fd < 0)
49178825Sdfr	return;
50178825Sdfr    net_write(fd, buf, size);
51178825Sdfr    close(fd);
52178825Sdfr}
53233294Sstas
54233294Sstas/*
55233294Sstas * Read all data from a filename, care about errors.
56233294Sstas */
57233294Sstas
58233294SstasROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
59233294Sstasrk_undumpdata(const char *filename, void **buf, size_t *size)
60233294Sstas{
61233294Sstas    struct stat sb;
62233294Sstas    int fd, ret;
63233294Sstas    ssize_t sret;
64233294Sstas
65233294Sstas    *buf = NULL;
66233294Sstas
67233294Sstas    fd = open(filename, O_RDONLY, 0);
68233294Sstas    if (fd < 0)
69233294Sstas	return errno;
70233294Sstas    if (fstat(fd, &sb) != 0){
71233294Sstas	ret = errno;
72233294Sstas	goto out;
73233294Sstas    }
74233294Sstas    *buf = malloc(sb.st_size);
75233294Sstas    if (*buf == NULL) {
76233294Sstas	ret = ENOMEM;
77233294Sstas	goto out;
78233294Sstas    }
79233294Sstas    *size = sb.st_size;
80233294Sstas
81233294Sstas    sret = net_read(fd, *buf, *size);
82233294Sstas    if (sret < 0)
83233294Sstas	ret = errno;
84233294Sstas    else if (sret != (ssize_t)*size) {
85233294Sstas	ret = EINVAL;
86233294Sstas	free(*buf);
87233294Sstas	*buf = NULL;
88233294Sstas    } else
89233294Sstas	ret = 0;
90233294Sstas
91233294Sstas out:
92233294Sstas    close(fd);
93233294Sstas    return ret;
94233294Sstas}
95