move file helper functions to separate file
We have our file helper functions in several places. Move them all to lib/libfile.c. With this we no longer have file helpers in fs/fs.c which contains the core fs functions and no functions in lib/libbb.c which are not from busybox. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
2fd4f0fbe9
commit
3cfa4bc00c
|
@ -18,6 +18,7 @@
|
|||
#include <fs.h>
|
||||
#include <fcntl.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
#include <asm/armlinux.h>
|
||||
#include <of.h>
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <fs.h>
|
||||
#include <fcntl.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
#include <asm/armlinux.h>
|
||||
#include <of.h>
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <fs.h>
|
||||
#include <globalvar.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
#include <magicvar.h>
|
||||
|
||||
#include <asm/armlinux.h>
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <fs.h>
|
||||
#include <fcntl.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
#include <asm/armlinux.h>
|
||||
#include <of.h>
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <image.h>
|
||||
#include <init.h>
|
||||
#include <fs.h>
|
||||
#include <libfile.h>
|
||||
#include <linux/list.h>
|
||||
#include <xfuncs.h>
|
||||
#include <malloc.h>
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
#include <getopt.h>
|
||||
#include <fs.h>
|
||||
#include <fcntl.h>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <io.h>
|
||||
#include <fs.h>
|
||||
#include <malloc.h>
|
||||
#include <libfile.h>
|
||||
#include <linux/stat.h>
|
||||
#include <mach/gpmc.h>
|
||||
#include <mach/generic.h>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <init.h>
|
||||
#include <driver.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <libfile.h>
|
||||
#include <fs.h>
|
||||
#include <fcntl.h>
|
||||
#include <sizes.h>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <libfile.h>
|
||||
#include <linux/stat.h>
|
||||
#include <malloc.h>
|
||||
#include <fs.h>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include <boot.h>
|
||||
#include <common.h>
|
||||
#include <libfile.h>
|
||||
#include <init.h>
|
||||
#include <fs.h>
|
||||
#include <errno.h>
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <libfile.h>
|
||||
#include <getopt.h>
|
||||
#include <malloc.h>
|
||||
#include <errno.h>
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <malloc.h>
|
||||
#include <libgen.h>
|
||||
#include <getopt.h>
|
||||
#include <libfile.h>
|
||||
|
||||
/**
|
||||
* @param[in] argc Argument count from command line
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <fs.h>
|
||||
#include <getopt.h>
|
||||
#include <malloc.h>
|
||||
#include <libfile.h>
|
||||
#include <environment.h>
|
||||
|
||||
static int crc_from_file(const char* file, ulong *crc)
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <fs.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <libfile.h>
|
||||
#include <readkey.h>
|
||||
#include <errno.h>
|
||||
#include <xfuncs.h>
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <fcntl.h>
|
||||
#include <linux/stat.h>
|
||||
#include <errno.h>
|
||||
#include <libfile.h>
|
||||
#include <malloc.h>
|
||||
#include <xfuncs.h>
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <module.h>
|
||||
#include <errno.h>
|
||||
#include <fs.h>
|
||||
#include <libfile.h>
|
||||
#include <malloc.h>
|
||||
|
||||
static int do_insmod(int argc, char *argv[])
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <environment.h>
|
||||
#include <fs.h>
|
||||
#include <errno.h>
|
||||
#include <libfile.h>
|
||||
#include <getopt.h>
|
||||
#include <malloc.h>
|
||||
#include <boot.h>
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <libfile.h>
|
||||
#include <fdt.h>
|
||||
#include <of.h>
|
||||
#include <command.h>
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <common.h>
|
||||
#include <environment.h>
|
||||
#include <fdt.h>
|
||||
#include <libfile.h>
|
||||
#include <of.h>
|
||||
#include <command.h>
|
||||
#include <fs.h>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <fs.h>
|
||||
#include <libfile.h>
|
||||
#include <malloc.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/ctype.h>
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <fs.h>
|
||||
#include <net.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
|
||||
#define TFTP_MOUNT_PATH "/.tftp_tmp_path"
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <malloc.h>
|
||||
#include <ioctl.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/stat.h>
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <malloc.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
#include <libfile.h>
|
||||
|
||||
static int uimage_fd;
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <malloc.h>
|
||||
#include <block.h>
|
||||
#include <fcntl.h>
|
||||
#include <libfile.h>
|
||||
#include <libbb.h>
|
||||
#include <init.h>
|
||||
#include <boot.h>
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <fs.h>
|
||||
#include <malloc.h>
|
||||
#include <memory.h>
|
||||
#include <libfile.h>
|
||||
#include <globalvar.h>
|
||||
#include <init.h>
|
||||
|
||||
|
|
|
@ -118,6 +118,7 @@
|
|||
#include <libbb.h>
|
||||
#include <glob.h>
|
||||
#include <getopt.h>
|
||||
#include <libfile.h>
|
||||
#include <libbb.h>
|
||||
#include <magicvar.h>
|
||||
#include <linux/list.h>
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <glob.h>
|
||||
#include <menu.h>
|
||||
#include <fs.h>
|
||||
#include <libfile.h>
|
||||
|
||||
#include <linux/stat.h>
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <malloc.h>
|
||||
#include <errno.h>
|
||||
#include <libbb.h>
|
||||
#include <libfile.h>
|
||||
#include <uncompress.h>
|
||||
#include <fcntl.h>
|
||||
#include <fs.h>
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <linux/list.h>
|
||||
#include <usb/gadget.h>
|
||||
#include <linux/stat.h>
|
||||
#include <libfile.h>
|
||||
#include <usb/ch9.h>
|
||||
#include <usb/dfu.h>
|
||||
#include <config.h>
|
||||
|
|
72
fs/fs.c
72
fs/fs.c
|
@ -34,78 +34,6 @@
|
|||
#include <libgen.h>
|
||||
#include <block.h>
|
||||
|
||||
void *read_file(const char *filename, size_t *size)
|
||||
{
|
||||
int fd;
|
||||
struct stat s;
|
||||
void *buf = NULL;
|
||||
const char *tmpfile = "/.read_file_tmp";
|
||||
int ret;
|
||||
|
||||
again:
|
||||
if (stat(filename, &s))
|
||||
return NULL;
|
||||
|
||||
if (s.st_size == FILESIZE_MAX) {
|
||||
ret = copy_file(filename, tmpfile, 0);
|
||||
if (ret)
|
||||
return NULL;
|
||||
filename = tmpfile;
|
||||
goto again;
|
||||
}
|
||||
|
||||
buf = xzalloc(s.st_size + 1);
|
||||
|
||||
fd = open(filename, O_RDONLY);
|
||||
if (fd < 0)
|
||||
goto err_out;
|
||||
|
||||
ret = read_full(fd, buf, s.st_size);
|
||||
if (ret < 0)
|
||||
goto err_out1;
|
||||
|
||||
close(fd);
|
||||
|
||||
if (size)
|
||||
*size = s.st_size;
|
||||
|
||||
if (filename == tmpfile)
|
||||
unlink(tmpfile);
|
||||
|
||||
return buf;
|
||||
|
||||
err_out1:
|
||||
close(fd);
|
||||
err_out:
|
||||
free(buf);
|
||||
|
||||
if (filename == tmpfile)
|
||||
unlink(tmpfile);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(read_file);
|
||||
|
||||
int write_file(const char *filename, void *buf, size_t size)
|
||||
{
|
||||
int fd, ret;
|
||||
|
||||
fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
ret = write_full(fd, buf, size);
|
||||
|
||||
close(fd);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(write_file);
|
||||
|
||||
char *mkmodestr(unsigned long mode, char *str)
|
||||
{
|
||||
static const char *l = "xwr";
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <uimagefs.h>
|
||||
#include <libbb.h>
|
||||
#include <rtc.h>
|
||||
#include <libfile.h>
|
||||
|
||||
static bool uimagefs_is_data_file(struct uimagefs_handle_data *d)
|
||||
{
|
||||
|
|
14
include/fs.h
14
include/fs.h
|
@ -163,20 +163,6 @@ int ls(const char *path, ulong flags);
|
|||
|
||||
char *mkmodestr(unsigned long mode, char *str);
|
||||
|
||||
/*
|
||||
* Read a file into memory. Memory is allocated with malloc and must
|
||||
* be freed with free() afterwards. This function allocates one
|
||||
* byte more than actually needed and sets this to zero, so that
|
||||
* it can be used for text files.
|
||||
* If size is nonzero it s set to the file size.
|
||||
*/
|
||||
void *read_file(const char *filename, size_t *size);
|
||||
|
||||
/*
|
||||
* Write a buffer to a file. This file is newly created.
|
||||
*/
|
||||
int write_file(const char *filename, void *buf, size_t size);
|
||||
|
||||
/*
|
||||
* This function turns 'path' into an absolute path and removes all occurrences
|
||||
* of "..", "." and double slashes. The returned string must be freed wit free().
|
||||
|
|
|
@ -26,15 +26,8 @@ int recursive_action(const char *fileName, unsigned flags,
|
|||
|
||||
char * safe_strncpy(char *dst, const char *src, size_t size);
|
||||
|
||||
int copy_file(const char *src, const char *dst, int verbose);
|
||||
|
||||
int process_escape_sequence(const char *source, char *dest, int destlen);
|
||||
|
||||
char *simple_itoa(unsigned int i);
|
||||
|
||||
int write_full(int fd, void *buf, size_t size);
|
||||
int read_full(int fd, void *buf, size_t size);
|
||||
|
||||
char *read_file_line(const char *fmt, ...);
|
||||
|
||||
#endif /* __LIBBB_H */
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
#ifndef __LIBFILE_H
|
||||
#define __LIBFILE_H
|
||||
|
||||
int write_full(int fd, void *buf, size_t size);
|
||||
int read_full(int fd, void *buf, size_t size);
|
||||
|
||||
char *read_file_line(const char *fmt, ...);
|
||||
|
||||
void *read_file(const char *filename, size_t *size);
|
||||
|
||||
int write_file(const char *filename, void *buf, size_t size);
|
||||
|
||||
int copy_file(const char *src, const char *dst, int verbose);
|
||||
|
||||
#endif /* __LIBFILE_H */
|
|
@ -25,7 +25,6 @@ obj-$(CONFIG_GLOB) += fnmatch.o
|
|||
obj-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o
|
||||
obj-y += glob.o
|
||||
obj-y += notifier.o
|
||||
obj-y += copy_file.o
|
||||
obj-y += random.o
|
||||
obj-y += lzo/
|
||||
obj-$(CONFIG_LZ4_DECOMPRESS) += lz4/
|
||||
|
@ -44,3 +43,4 @@ obj-y += gui/
|
|||
obj-$(CONFIG_XYMODEM) += xymodem.o
|
||||
obj-y += unlink-recursive.o
|
||||
obj-$(CONFIG_STMP_DEVICE) += stmp-device.o
|
||||
obj-y += libfile.o
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <sizes.h>
|
||||
#include <errno.h>
|
||||
#include <malloc.h>
|
||||
#include <libfile.h>
|
||||
#include <bootstrap.h>
|
||||
|
||||
void* bootstrap_read_disk(char *dev, char *fstype)
|
||||
|
|
|
@ -1,86 +0,0 @@
|
|||
#include <common.h>
|
||||
#include <fs.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <malloc.h>
|
||||
#include <libbb.h>
|
||||
#include <progress.h>
|
||||
|
||||
/**
|
||||
* @param[in] src FIXME
|
||||
* @param[out] dst FIXME
|
||||
* @param[in] verbose FIXME
|
||||
*/
|
||||
int copy_file(const char *src, const char *dst, int verbose)
|
||||
{
|
||||
char *rw_buf = NULL;
|
||||
int srcfd = 0, dstfd = 0;
|
||||
int r, w;
|
||||
int ret = 1;
|
||||
void *buf;
|
||||
int total = 0;
|
||||
struct stat statbuf;
|
||||
|
||||
rw_buf = xmalloc(RW_BUF_SIZE);
|
||||
|
||||
srcfd = open(src, O_RDONLY);
|
||||
if (srcfd < 0) {
|
||||
printf("could not open %s: %s\n", src, errno_str());
|
||||
goto out;
|
||||
}
|
||||
|
||||
dstfd = open(dst, O_WRONLY | O_CREAT | O_TRUNC);
|
||||
if (dstfd < 0) {
|
||||
printf("could not open %s: %s\n", dst, errno_str());
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
if (stat(src, &statbuf) < 0)
|
||||
statbuf.st_size = 0;
|
||||
|
||||
init_progression_bar(statbuf.st_size);
|
||||
}
|
||||
|
||||
while(1) {
|
||||
r = read(srcfd, rw_buf, RW_BUF_SIZE);
|
||||
if (r < 0) {
|
||||
perror("read");
|
||||
goto out;
|
||||
}
|
||||
if (!r)
|
||||
break;
|
||||
|
||||
buf = rw_buf;
|
||||
while (r) {
|
||||
w = write(dstfd, buf, r);
|
||||
if (w < 0) {
|
||||
perror("write");
|
||||
goto out;
|
||||
}
|
||||
buf += w;
|
||||
r -= w;
|
||||
total += w;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
if (statbuf.st_size && statbuf.st_size != FILESIZE_MAX)
|
||||
show_progress(total);
|
||||
else
|
||||
show_progress(total / 16384);
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
if (verbose)
|
||||
putchar('\n');
|
||||
|
||||
free(rw_buf);
|
||||
if (srcfd > 0)
|
||||
close(srcfd);
|
||||
if (dstfd > 0)
|
||||
close(dstfd);
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -10,6 +10,7 @@
|
|||
#include <errno.h>
|
||||
#include <fs.h>
|
||||
#include <malloc.h>
|
||||
#include <libfile.h>
|
||||
|
||||
static LIST_HEAD(image_renderers);
|
||||
|
||||
|
|
93
lib/libbb.c
93
lib/libbb.c
|
@ -126,96 +126,3 @@ char *simple_itoa(unsigned int i)
|
|||
return p + 1;
|
||||
}
|
||||
EXPORT_SYMBOL(simple_itoa);
|
||||
|
||||
/*
|
||||
* write_full - write to filedescriptor
|
||||
*
|
||||
* Like write, but guarantees to write the full buffer out, else
|
||||
* it returns with an error.
|
||||
*/
|
||||
int write_full(int fd, void *buf, size_t size)
|
||||
{
|
||||
size_t insize = size;
|
||||
int now;
|
||||
|
||||
while (size) {
|
||||
now = write(fd, buf, size);
|
||||
if (now <= 0)
|
||||
return now;
|
||||
size -= now;
|
||||
buf += now;
|
||||
}
|
||||
|
||||
return insize;
|
||||
}
|
||||
EXPORT_SYMBOL(write_full);
|
||||
|
||||
/*
|
||||
* read_full - read from filedescriptor
|
||||
*
|
||||
* Like read, but this function only returns less bytes than
|
||||
* requested when the end of file is reached.
|
||||
*/
|
||||
int read_full(int fd, void *buf, size_t size)
|
||||
{
|
||||
size_t insize = size;
|
||||
int now;
|
||||
int total = 0;
|
||||
|
||||
while (size) {
|
||||
now = read(fd, buf, size);
|
||||
if (now == 0)
|
||||
return total;
|
||||
if (now < 0)
|
||||
return now;
|
||||
total += now;
|
||||
size -= now;
|
||||
buf += now;
|
||||
}
|
||||
|
||||
return insize;
|
||||
}
|
||||
EXPORT_SYMBOL(read_full);
|
||||
|
||||
/*
|
||||
* read_file_line - read a line from a file
|
||||
*
|
||||
* Used to compose a filename from a printf format and to read a line from this
|
||||
* file. All leading and trailing whitespaces (including line endings) are
|
||||
* removed. The returned buffer must be freed with free(). This function is
|
||||
* supposed for reading variable like content into a buffer, so files > 1024
|
||||
* bytes are ignored.
|
||||
*/
|
||||
char *read_file_line(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char *filename;
|
||||
char *buf, *line = NULL;
|
||||
size_t size;
|
||||
int ret;
|
||||
struct stat s;
|
||||
|
||||
va_start(args, fmt);
|
||||
filename = vasprintf(fmt, args);
|
||||
va_end(args);
|
||||
|
||||
ret = stat(filename, &s);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (s.st_size > 1024)
|
||||
goto out;
|
||||
|
||||
buf = read_file(filename, &size);
|
||||
if (!buf)
|
||||
goto out;
|
||||
|
||||
line = strim(buf);
|
||||
|
||||
line = xstrdup(line);
|
||||
free(buf);
|
||||
out:
|
||||
free(filename);
|
||||
return line;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(read_file_line);
|
||||
|
|
|
@ -0,0 +1,288 @@
|
|||
/*
|
||||
* Copyright (c) 2014 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
#include <common.h>
|
||||
#include <fs.h>
|
||||
#include <fcntl.h>
|
||||
#include <malloc.h>
|
||||
#include <libfile.h>
|
||||
#include <progress.h>
|
||||
#include <linux/stat.h>
|
||||
|
||||
/*
|
||||
* write_full - write to filedescriptor
|
||||
*
|
||||
* Like write, but guarantees to write the full buffer out, else
|
||||
* it returns with an error.
|
||||
*/
|
||||
int write_full(int fd, void *buf, size_t size)
|
||||
{
|
||||
size_t insize = size;
|
||||
int now;
|
||||
|
||||
while (size) {
|
||||
now = write(fd, buf, size);
|
||||
if (now <= 0)
|
||||
return now;
|
||||
size -= now;
|
||||
buf += now;
|
||||
}
|
||||
|
||||
return insize;
|
||||
}
|
||||
EXPORT_SYMBOL(write_full);
|
||||
|
||||
/*
|
||||
* read_full - read from filedescriptor
|
||||
*
|
||||
* Like read, but this function only returns less bytes than
|
||||
* requested when the end of file is reached.
|
||||
*/
|
||||
int read_full(int fd, void *buf, size_t size)
|
||||
{
|
||||
size_t insize = size;
|
||||
int now;
|
||||
int total = 0;
|
||||
|
||||
while (size) {
|
||||
now = read(fd, buf, size);
|
||||
if (now == 0)
|
||||
return total;
|
||||
if (now < 0)
|
||||
return now;
|
||||
total += now;
|
||||
size -= now;
|
||||
buf += now;
|
||||
}
|
||||
|
||||
return insize;
|
||||
}
|
||||
EXPORT_SYMBOL(read_full);
|
||||
|
||||
/*
|
||||
* read_file_line - read a line from a file
|
||||
*
|
||||
* Used to compose a filename from a printf format and to read a line from this
|
||||
* file. All leading and trailing whitespaces (including line endings) are
|
||||
* removed. The returned buffer must be freed with free(). This function is
|
||||
* supposed for reading variable like content into a buffer, so files > 1024
|
||||
* bytes are ignored.
|
||||
*/
|
||||
char *read_file_line(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
char *filename;
|
||||
char *buf, *line = NULL;
|
||||
size_t size;
|
||||
int ret;
|
||||
struct stat s;
|
||||
|
||||
va_start(args, fmt);
|
||||
filename = vasprintf(fmt, args);
|
||||
va_end(args);
|
||||
|
||||
ret = stat(filename, &s);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (s.st_size > 1024)
|
||||
goto out;
|
||||
|
||||
buf = read_file(filename, &size);
|
||||
if (!buf)
|
||||
goto out;
|
||||
|
||||
line = strim(buf);
|
||||
|
||||
line = xstrdup(line);
|
||||
free(buf);
|
||||
out:
|
||||
free(filename);
|
||||
return line;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(read_file_line);
|
||||
|
||||
/**
|
||||
* read_file - read a file to an allocated buffer
|
||||
* @filename: The filename to read
|
||||
* @size: After successful return contains the size of the file
|
||||
*
|
||||
* This function reads a file to an allocated buffer.
|
||||
* Some TFTP servers do not transfer the size of a file. In this case
|
||||
* a the file is first read to a temporary file.
|
||||
*
|
||||
* Return: The buffer conataining the file or NULL on failure
|
||||
*/
|
||||
void *read_file(const char *filename, size_t *size)
|
||||
{
|
||||
int fd;
|
||||
struct stat s;
|
||||
void *buf = NULL;
|
||||
const char *tmpfile = "/.read_file_tmp";
|
||||
int ret;
|
||||
|
||||
again:
|
||||
if (stat(filename, &s))
|
||||
return NULL;
|
||||
|
||||
if (s.st_size == FILESIZE_MAX) {
|
||||
ret = copy_file(filename, tmpfile, 0);
|
||||
if (ret)
|
||||
return NULL;
|
||||
filename = tmpfile;
|
||||
goto again;
|
||||
}
|
||||
|
||||
buf = xzalloc(s.st_size + 1);
|
||||
|
||||
fd = open(filename, O_RDONLY);
|
||||
if (fd < 0)
|
||||
goto err_out;
|
||||
|
||||
ret = read_full(fd, buf, s.st_size);
|
||||
if (ret < 0)
|
||||
goto err_out1;
|
||||
|
||||
close(fd);
|
||||
|
||||
if (size)
|
||||
*size = s.st_size;
|
||||
|
||||
if (filename == tmpfile)
|
||||
unlink(tmpfile);
|
||||
|
||||
return buf;
|
||||
|
||||
err_out1:
|
||||
close(fd);
|
||||
err_out:
|
||||
free(buf);
|
||||
|
||||
if (filename == tmpfile)
|
||||
unlink(tmpfile);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(read_file);
|
||||
|
||||
/**
|
||||
* write_file - write a buffer to a file
|
||||
* @filename: The filename to write
|
||||
* @size: The size of the buffer
|
||||
*
|
||||
* Return: 0 for success or negative error value
|
||||
*/
|
||||
int write_file(const char *filename, void *buf, size_t size)
|
||||
{
|
||||
int fd, ret;
|
||||
|
||||
fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
ret = write_full(fd, buf, size);
|
||||
|
||||
close(fd);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(write_file);
|
||||
|
||||
/**
|
||||
* copy_file - Copy a file
|
||||
* @src: The source filename
|
||||
* @dst: The destination filename
|
||||
* @verbose: if true, show a progression bar
|
||||
*
|
||||
* Return: 0 for success or negative error code
|
||||
*/
|
||||
int copy_file(const char *src, const char *dst, int verbose)
|
||||
{
|
||||
char *rw_buf = NULL;
|
||||
int srcfd = 0, dstfd = 0;
|
||||
int r, w;
|
||||
int ret = 1;
|
||||
void *buf;
|
||||
int total = 0;
|
||||
struct stat statbuf;
|
||||
|
||||
rw_buf = xmalloc(RW_BUF_SIZE);
|
||||
|
||||
srcfd = open(src, O_RDONLY);
|
||||
if (srcfd < 0) {
|
||||
printf("could not open %s: %s\n", src, errno_str());
|
||||
goto out;
|
||||
}
|
||||
|
||||
dstfd = open(dst, O_WRONLY | O_CREAT | O_TRUNC);
|
||||
if (dstfd < 0) {
|
||||
printf("could not open %s: %s\n", dst, errno_str());
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
if (stat(src, &statbuf) < 0)
|
||||
statbuf.st_size = 0;
|
||||
|
||||
init_progression_bar(statbuf.st_size);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
r = read(srcfd, rw_buf, RW_BUF_SIZE);
|
||||
if (r < 0) {
|
||||
perror("read");
|
||||
goto out;
|
||||
}
|
||||
if (!r)
|
||||
break;
|
||||
|
||||
buf = rw_buf;
|
||||
while (r) {
|
||||
w = write(dstfd, buf, r);
|
||||
if (w < 0) {
|
||||
perror("write");
|
||||
goto out;
|
||||
}
|
||||
buf += w;
|
||||
r -= w;
|
||||
total += w;
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
if (statbuf.st_size && statbuf.st_size != FILESIZE_MAX)
|
||||
show_progress(total);
|
||||
else
|
||||
show_progress(total / 16384);
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
if (verbose)
|
||||
putchar('\n');
|
||||
|
||||
free(rw_buf);
|
||||
if (srcfd > 0)
|
||||
close(srcfd);
|
||||
if (dstfd > 0)
|
||||
close(dstfd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(copy_file);
|
Loading…
Reference in New Issue