Revert "Merge branch 'upstream' into tizen"
[platform/upstream/nettle.git] / examples / io.c
1 /* io.c
2  *
3  * Miscellaneous functions used by the example programs.
4  */
5
6 /* nettle, low-level cryptographics library
7  *
8  * Copyright (C) 2002 Niels Möller
9  *  
10  * The nettle library is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation; either version 2.1 of the License, or (at your
13  * option) any later version.
14  * 
15  * The nettle library is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
18  * License for more details.
19  * 
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with the nettle library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
23  * MA 02111-1301, USA.
24  */
25
26 #if HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include <stdarg.h>
31 #include <stdlib.h>
32
33 /* For errno and strerror */
34 #include <errno.h>
35 #include <string.h>
36
37 #include "io.h"
38
39 #define RANDOM_DEVICE "/dev/urandom"
40 #define BUFSIZE 1000
41
42 int quiet_flag = 0;
43
44 void *
45 xalloc(size_t size)
46 {
47   void *p = malloc(size);
48   if (!p)
49     {
50       fprintf(stderr, "Virtual memory exhausted.\n");
51       abort();
52     }
53
54   return p;
55 }
56
57 void
58 werror(const char *format, ...)
59 {
60   if (!quiet_flag)
61     {
62       va_list args;
63       va_start(args, format);
64       vfprintf(stderr, format, args);
65       va_end(args);
66     }
67 }
68
69 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
70
71 unsigned
72 read_file(const char *name, unsigned max_size, char **contents)
73 {
74   unsigned size, done;
75   char *buffer;
76   FILE *f;
77     
78   f = fopen(name, "rb");
79   if (!f)
80     {
81       werror("Opening `%s' failed: %s\n", name, strerror(errno));
82       return 0;
83     }
84
85   size = 100;
86
87   for (buffer = NULL, done = 0;; size *= 2)
88     {
89       char *p;
90
91       if (max_size && size > max_size)
92         size = max_size;
93
94       /* Space for terminating NUL */
95       p = realloc(buffer, size + 1);
96
97       if (!p)
98         {
99         fail:
100           fclose(f);
101           free(buffer);
102           *contents = NULL;
103           return 0;
104         }
105
106       buffer = p;
107       done += fread(buffer + done, 1, size - done, f);
108
109       if (done < size)
110         {
111           /* Short count means EOF or read error */
112           if (ferror(f))
113             {
114               fprintf (stderr, "Reading `%s' failed: %s\n",
115                        name, strerror(errno));
116
117               goto fail;
118             }
119           if (done == 0)
120             /* Treat empty file as error */
121             goto fail;
122
123           break;
124         }
125
126       if (size == max_size)
127         break;
128     }
129   
130   fclose(f);
131
132   /* NUL-terminate the data. */
133   buffer[done] = '\0';
134   *contents = buffer;
135   
136   return done;
137 }
138
139 int
140 write_string(FILE *f, unsigned size, const char *buffer)
141 {
142   size_t res = fwrite(buffer, 1, size, f);
143
144   return res == size;
145 }
146
147 int
148 write_file(const char *name, unsigned size, const char *buffer)
149 {
150   FILE *f = fopen(name, "wb");
151   int res;
152   
153   if (!f)
154     return 0;
155
156   res = write_string(f, size, buffer);
157   return fclose(f) == 0 && res;
158 }
159
160 int
161 simple_random(struct yarrow256_ctx *ctx, const char *name)
162 {
163   unsigned length;
164   char *buffer;
165
166   if (name)
167     length = read_file(name, 0, &buffer);
168   else
169     length = read_file(RANDOM_DEVICE, 20, &buffer);
170   
171   if (!length)
172     return 0;
173
174   yarrow256_seed(ctx, length, buffer);
175
176   free(buffer);
177
178   return 1;
179 }
180
181 int
182 hash_file(const struct nettle_hash *hash, void *ctx, FILE *f)
183 {
184   for (;;)
185     {
186       char buffer[BUFSIZE];
187       size_t res = fread(buffer, 1, sizeof(buffer), f);
188       if (ferror(f))
189         return 0;
190       
191       hash->update(ctx, res, buffer);
192       if (feof(f))
193         return 1;
194     }
195 }