9
0
Fork 0

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:
Sascha Hauer 2014-07-30 10:43:51 +02:00
parent 2fd4f0fbe9
commit 3cfa4bc00c
40 changed files with 336 additions and 273 deletions

View File

@ -18,6 +18,7 @@
#include <fs.h>
#include <fcntl.h>
#include <libbb.h>
#include <libfile.h>
#include <asm/armlinux.h>
#include <of.h>

View File

@ -18,6 +18,7 @@
#include <fs.h>
#include <fcntl.h>
#include <libbb.h>
#include <libfile.h>
#include <asm/armlinux.h>
#include <of.h>

View File

@ -21,6 +21,7 @@
#include <fs.h>
#include <globalvar.h>
#include <libbb.h>
#include <libfile.h>
#include <magicvar.h>
#include <asm/armlinux.h>

View File

@ -18,6 +18,7 @@
#include <fs.h>
#include <fcntl.h>
#include <libbb.h>
#include <libfile.h>
#include <asm/armlinux.h>
#include <of.h>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,5 +1,6 @@
#include <common.h>
#include <command.h>
#include <libfile.h>
#include <linux/stat.h>
#include <malloc.h>
#include <fs.h>

View File

@ -1,5 +1,6 @@
#include <boot.h>
#include <common.h>
#include <libfile.h>
#include <init.h>
#include <fs.h>
#include <errno.h>

View File

@ -17,6 +17,7 @@
*/
#include <common.h>
#include <command.h>
#include <libfile.h>
#include <getopt.h>
#include <malloc.h>
#include <errno.h>

View File

@ -26,6 +26,7 @@
#include <malloc.h>
#include <libgen.h>
#include <getopt.h>
#include <libfile.h>
/**
* @param[in] argc Argument count from command line

View File

@ -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)

View File

@ -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>

View File

@ -23,6 +23,7 @@
#include <fcntl.h>
#include <linux/stat.h>
#include <errno.h>
#include <libfile.h>
#include <malloc.h>
#include <xfuncs.h>

View File

@ -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[])

View File

@ -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>

View File

@ -18,6 +18,7 @@
*/
#include <common.h>
#include <libfile.h>
#include <fdt.h>
#include <of.h>
#include <command.h>

View File

@ -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>

View File

@ -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>

View File

@ -24,6 +24,7 @@
#include <fs.h>
#include <net.h>
#include <libbb.h>
#include <libfile.h>
#define TFTP_MOUNT_PATH "/.tftp_tmp_path"

View File

@ -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>

View File

@ -7,6 +7,7 @@
#include <malloc.h>
#include <errno.h>
#include <getopt.h>
#include <libfile.h>
static int uimage_fd;

View File

@ -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>

View File

@ -16,6 +16,7 @@
#include <fs.h>
#include <malloc.h>
#include <memory.h>
#include <libfile.h>
#include <globalvar.h>
#include <init.h>

View File

@ -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>

View File

@ -15,6 +15,7 @@
#include <glob.h>
#include <menu.h>
#include <fs.h>
#include <libfile.h>
#include <linux/stat.h>

View File

@ -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>

View File

@ -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
View File

@ -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";

View File

@ -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)
{

View File

@ -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().

View File

@ -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 */

15
include/libfile.h Normal file
View File

@ -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 */

View File

@ -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

View File

@ -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)

View File

@ -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;
}

View File

@ -10,6 +10,7 @@
#include <errno.h>
#include <fs.h>
#include <malloc.h>
#include <libfile.h>
static LIST_HEAD(image_renderers);

View File

@ -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);

288
lib/libfile.c Normal file
View File

@ -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);