blob: f40c8b28ccd9910cf7b1e4d8709121539cad0ba8 [file] [log] [blame]
Julien Boeuf026a4172015-02-02 18:36:37 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
Julien Boeuf026a4172015-02-02 18:36:37 -08004 * 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 are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Craig Tiller85178862016-05-18 16:09:16 -070034#include "src/core/lib/iomgr/load_file.h"
Julien Boeuf026a4172015-02-02 18:36:37 -080035
36#include <errno.h>
37#include <string.h>
38
39#include <grpc/support/alloc.h>
40#include <grpc/support/log.h>
Masood Malekghassemi701af602015-06-03 15:01:17 -070041#include <grpc/support/string_util.h>
Julien Boeuf026a4172015-02-02 18:36:37 -080042
Craig Tiller9533d042016-03-25 17:11:06 -070043#include "src/core/lib/support/block_annotate.h"
44#include "src/core/lib/support/string.h"
Julien Boeuf026a4172015-02-02 18:36:37 -080045
Craig Tiller85178862016-05-18 16:09:16 -070046grpc_error *grpc_load_file(const char *filename, int add_null_terminator,
Craig Tillerd41a4a72016-10-26 16:16:06 -070047 grpc_slice *output) {
Julien Boeuf026a4172015-02-02 18:36:37 -080048 unsigned char *contents = NULL;
49 size_t contents_size = 0;
Craig Tiller7c70b6c2017-01-23 07:48:42 -080050 grpc_slice result = grpc_empty_slice();
vjpai7e0289e2015-09-24 16:59:07 -070051 FILE *file;
Julien Boeuf9d005cc2015-04-16 09:50:13 -070052 size_t bytes_read = 0;
Craig Tiller4727b9b2016-05-17 17:19:19 -070053 grpc_error *error = GRPC_ERROR_NONE;
Julien Boeuf026a4172015-02-02 18:36:37 -080054
vjpai9839d282015-09-24 17:55:18 -070055 GRPC_SCHEDULING_START_BLOCKING_REGION;
vjpai7e0289e2015-09-24 16:59:07 -070056 file = fopen(filename, "rb");
Julien Boeuf026a4172015-02-02 18:36:37 -080057 if (file == NULL) {
Craig Tiller4727b9b2016-05-17 17:19:19 -070058 error = GRPC_OS_ERROR(errno, "fopen");
Julien Boeuf026a4172015-02-02 18:36:37 -080059 goto end;
60 }
Julien Boeuf9d005cc2015-04-16 09:50:13 -070061 fseek(file, 0, SEEK_END);
murgatroid995e71d7a2015-06-19 12:24:44 -070062 /* Converting to size_t on the assumption that it will not fail */
63 contents_size = (size_t)ftell(file);
Julien Boeuf9d005cc2015-04-16 09:50:13 -070064 fseek(file, 0, SEEK_SET);
65 contents = gpr_malloc(contents_size + (add_null_terminator ? 1 : 0));
66 bytes_read = fread(contents, 1, contents_size, file);
67 if (bytes_read < contents_size) {
Craig Tiller4727b9b2016-05-17 17:19:19 -070068 error = GRPC_OS_ERROR(errno, "fread");
Julien Boeuf9d005cc2015-04-16 09:50:13 -070069 GPR_ASSERT(ferror(file));
Julien Boeuf9d005cc2015-04-16 09:50:13 -070070 goto end;
Julien Boeuf026a4172015-02-02 18:36:37 -080071 }
Julien Boeuf28d75d92015-04-15 15:52:23 -070072 if (add_null_terminator) {
Julien Boeuf28d75d92015-04-15 15:52:23 -070073 contents[contents_size++] = 0;
74 }
Craig Tillerd41a4a72016-10-26 16:16:06 -070075 result = grpc_slice_new(contents, contents_size, gpr_free);
Julien Boeuf026a4172015-02-02 18:36:37 -080076
77end:
Craig Tiller4727b9b2016-05-17 17:19:19 -070078 *output = result;
Julien Boeuf026a4172015-02-02 18:36:37 -080079 if (file != NULL) fclose(file);
Craig Tiller4727b9b2016-05-17 17:19:19 -070080 if (error != GRPC_ERROR_NONE) {
81 grpc_error *error_out = grpc_error_set_str(
82 GRPC_ERROR_CREATE_REFERENCING("Failed to load file", &error, 1),
83 GRPC_ERROR_STR_FILENAME, filename);
84 GRPC_ERROR_UNREF(error);
85 error = error_out;
86 }
vjpai9839d282015-09-24 17:55:18 -070087 GRPC_SCHEDULING_END_BLOCKING_REGION;
Craig Tiller4727b9b2016-05-17 17:19:19 -070088 return error;
Craig Tiller190d3602015-02-18 09:23:38 -080089}