Add code for accessing raw file by liblthor 71/68771/3
authorKrzysztof Opasiak <k.opasiak@samsung.com>
Fri, 13 May 2016 08:27:03 +0000 (10:27 +0200)
committerKrzysztof Opasiak <k.opasiak@samsung.com>
Fri, 3 Jun 2016 18:03:58 +0000 (20:03 +0200)
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>
libthor/thor_internal.h
libthor/thor_raw_file.c [new file with mode: 0644]

index 467a4505ecce9f6ff5dbded21a57d32565f8381e..9e743864b1eb8f7a2ed5b006747d96547a4b47c3 100644 (file)
@@ -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 (file)
index 0000000..1ec1385
--- /dev/null
@@ -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;
+}
+