summaryrefslogtreecommitdiff
path: root/libthor
diff options
context:
space:
mode:
authorKrzysztof Opasiak <k.opasiak@samsung.com>2016-05-13 10:27:03 +0200
committerKrzysztof Opasiak <k.opasiak@samsung.com>2016-06-03 20:03:58 +0200
commit6c552da2ea9793f0e1cc6196addf6463ad613d36 (patch)
tree894a1683e6616e5867e3a877bed6054c4b77efeb /libthor
parent26d5e8b0b9fef3a898942dcc55f53d64d4f5bd99 (diff)
downloadlthor-6c552da2ea9793f0e1cc6196addf6463ad613d36.tar.gz
lthor-6c552da2ea9793f0e1cc6196addf6463ad613d36.tar.bz2
lthor-6c552da2ea9793f0e1cc6196addf6463ad613d36.zip
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 <k.opasiak@samsung.com>
Diffstat (limited to 'libthor')
-rw-r--r--libthor/thor_internal.h2
-rw-r--r--libthor/thor_raw_file.c129
2 files changed, 131 insertions, 0 deletions
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 <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <libgen.h>
+#include <errno.h>
+#include <unistd.h>
+
+#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;
+}
+