blob: dfcc19701924eba655cc037f638e74128e6933db [file] [log] [blame]
Koushik Dutta05258fd2013-02-16 19:20:58 -08001/*
2** Copyright 2012, The CyanogenMod Project
3**
4** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
7**
8** http://www.apache.org/licenses/LICENSE-2.0
9**
10** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
14** limitations under the License.
15*/
16
Luca Stefani7c86b052018-08-26 11:50:32 +020017#include <fcntl.h>
18#include <stdlib.h>
Koushik Dutta05258fd2013-02-16 19:20:58 -080019#include <sys/stat.h>
20#include <unistd.h>
Koushik Dutta05258fd2013-02-16 19:20:58 -080021
22#include "utils.h"
23
24/* reads a file, making sure it is terminated with \n \0 */
Luca Stefani5eb52ea2018-08-26 11:35:00 +020025char* read_file(const char* fn) {
Koushik Dutta05258fd2013-02-16 19:20:58 -080026 struct stat st;
Luca Stefani5eb52ea2018-08-26 11:35:00 +020027 char* data = NULL;
Koushik Dutta05258fd2013-02-16 19:20:58 -080028
29 int fd = open(fn, O_RDONLY);
30 if (fd < 0) return data;
31
32 if (fstat(fd, &st)) goto oops;
33
34 data = malloc(st.st_size + 2);
35 if (!data) goto oops;
36
37 if (read(fd, data, st.st_size) != st.st_size) goto oops;
38 close(fd);
39 data[st.st_size] = '\n';
40 data[st.st_size + 1] = 0;
41 return data;
42
43oops:
44 close(fd);
45 if (data) free(data);
46 return NULL;
47}