From: Krzysztof Opasiak Date: Fri, 13 May 2016 08:27:03 +0000 (+0200) Subject: Add code for accessing raw file by liblthor X-Git-Tag: submit/trunk/20190927.044709~35 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=63d11b30e2dda9d0f151cbc95cfd8be4f4fabff9;p=tools%2Flthor.git Add code for accessing raw file by liblthor Implement a data source for accessing standard file. This type of access is used for reading PIT file. Change-Id: Icc9de3718e1234e0758c27f4721f3072d3d538f9 Signed-off-by: Krzysztof Opasiak --- diff --git a/libthor/thor_internal.h b/libthor/thor_internal.h index 467a450..9e74386 100644 --- a/libthor/thor_internal.h +++ b/libthor/thor_internal.h @@ -44,5 +44,7 @@ struct thor_device_handle { int data_ep_out; }; +int t_file_get_data_src(const char *path, struct thor_data_src **data); + #endif /* THOR_INTERNAL_H__ */ diff --git a/libthor/thor_raw_file.c b/libthor/thor_raw_file.c new file mode 100644 index 0000000..1ec1385 --- /dev/null +++ b/libthor/thor_raw_file.c @@ -0,0 +1,129 @@ +/* + * libthor - Tizen Thor communication protocol + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "thor.h" +#include "thor_internal.h" + +struct file_data_src { + struct thor_data_src src; + int fd; + const char* filename; + size_t filesize; + int pos; +}; + +static size_t file_get_file_length(struct thor_data_src *src) +{ + struct file_data_src *filedata = + container_of(src, struct file_data_src, src); + + return filedata->filesize; +} + +static size_t file_get_data_block(struct thor_data_src *src, + void *data, size_t len) +{ + struct file_data_src *filedata = + container_of(src, struct file_data_src, src); + + return read(filedata->fd, data, len); +} + +static const char *file_get_file_name(struct thor_data_src *src) +{ + struct file_data_src *filedata = + container_of(src, struct file_data_src, src); + + return filedata->filename; +} + +static void file_release(struct thor_data_src *src) +{ + struct file_data_src *filedata = + container_of(src, struct file_data_src, src); + + close(filedata->fd); + free((void *)filedata->filename); + free(filedata); +} + +static int file_next_file(struct thor_data_src *src) +{ + struct file_data_src *filedata = + container_of(src, struct file_data_src, src); + + return !filedata->pos ? ++filedata->pos : 0; +} + +int t_file_get_data_src(const char *path, struct thor_data_src **data) +{ + int ret; + char *basefile; + struct file_data_src *fdata; + + fdata = calloc(sizeof(*fdata), 1); + if (!fdata) + return -1; + + ret = open(path, O_RDONLY); + if (ret < 0) + goto close_file; + + fdata->fd = ret; + + /* + * According to the man page basename() might modify the argument or + * return a pointer to statically allocated memory. Thus two strdup()s + */ + basefile = strdup(path); + if (!basefile) + goto close_file; + + fdata->filename = strdup(basename(basefile)); + free(basefile); + if (!fdata->filename) + goto close_file; + + fdata->filesize = lseek(fdata->fd, 0, SEEK_END); + lseek(fdata->fd, 0, SEEK_SET); + + fdata->src.get_file_length = file_get_file_length; + fdata->src.get_size = file_get_file_length; + fdata->src.get_block = file_get_data_block; + fdata->src.get_name = file_get_file_name; + fdata->src.release = file_release; + fdata->src.next_file = file_next_file; + fdata->pos = 0; + + *data = &fdata->src; + return 0; + +close_file: + close(ret); + free(fdata); + return -EINVAL; +} +