1 /*
2  * Copyright (c) 2007 Vreixo Formoso
3  *
4  * This file is part of the libisofs project; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License version 2
6  * or later as published by the Free Software Foundation.
7  * See COPYING file for details.
8  */
9 
10 #ifdef HAVE_CONFIG_H
11 #include "../config.h"
12 #endif
13 
14 #include "fsource.h"
15 #include <stdlib.h>
16 
17 /**
18  * Values belong 1000 are reserved for libisofs usage
19  */
20 unsigned int iso_fs_global_id = 1000;
21 
iso_file_source_ref(IsoFileSource * src)22 void iso_file_source_ref(IsoFileSource *src)
23 {
24     ++src->refcount;
25 }
26 
iso_file_source_unref(IsoFileSource * src)27 void iso_file_source_unref(IsoFileSource *src)
28 {
29     if (--src->refcount == 0) {
30         src->class->free(src);
31         free(src);
32     }
33 }
34 
iso_filesystem_ref(IsoFilesystem * fs)35 void iso_filesystem_ref(IsoFilesystem *fs)
36 {
37     ++fs->refcount;
38 }
39 
iso_filesystem_unref(IsoFilesystem * fs)40 void iso_filesystem_unref(IsoFilesystem *fs)
41 {
42     if (--fs->refcount == 0) {
43         fs->free(fs);
44         free(fs);
45     }
46 }
47 
48 /*
49  * this are just helpers to invoque methods in class
50  */
51 
52 inline
iso_file_source_get_path(IsoFileSource * src)53 char* iso_file_source_get_path(IsoFileSource *src)
54 {
55     return src->class->get_path(src);
56 }
57 
58 inline
iso_file_source_get_name(IsoFileSource * src)59 char* iso_file_source_get_name(IsoFileSource *src)
60 {
61     return src->class->get_name(src);
62 }
63 
64 inline
iso_file_source_lstat(IsoFileSource * src,struct stat * info)65 int iso_file_source_lstat(IsoFileSource *src, struct stat *info)
66 {
67     return src->class->lstat(src, info);
68 }
69 
70 inline
iso_file_source_access(IsoFileSource * src)71 int iso_file_source_access(IsoFileSource *src)
72 {
73     return src->class->access(src);
74 }
75 
76 inline
iso_file_source_stat(IsoFileSource * src,struct stat * info)77 int iso_file_source_stat(IsoFileSource *src, struct stat *info)
78 {
79     return src->class->stat(src, info);
80 }
81 
82 inline
iso_file_source_open(IsoFileSource * src)83 int iso_file_source_open(IsoFileSource *src)
84 {
85     return src->class->open(src);
86 }
87 
88 inline
iso_file_source_close(IsoFileSource * src)89 int iso_file_source_close(IsoFileSource *src)
90 {
91     return src->class->close(src);
92 }
93 
94 inline
iso_file_source_read(IsoFileSource * src,void * buf,size_t count)95 int iso_file_source_read(IsoFileSource *src, void *buf, size_t count)
96 {
97     return src->class->read(src, buf, count);
98 }
99 
100 inline
iso_file_source_lseek(IsoFileSource * src,off_t offset,int flag)101 off_t iso_file_source_lseek(IsoFileSource *src, off_t offset, int flag)
102 {
103     return src->class->lseek(src, offset, flag);
104 }
105 
106 inline
iso_file_source_readdir(IsoFileSource * src,IsoFileSource ** child)107 int iso_file_source_readdir(IsoFileSource *src, IsoFileSource **child)
108 {
109     return src->class->readdir(src, child);
110 }
111 
112 inline
iso_file_source_readlink(IsoFileSource * src,char * buf,size_t bufsiz)113 int iso_file_source_readlink(IsoFileSource *src, char *buf, size_t bufsiz)
114 {
115     return src->class->readlink(src, buf, bufsiz);
116 }
117 
118 inline
iso_file_source_get_filesystem(IsoFileSource * src)119 IsoFilesystem* iso_file_source_get_filesystem(IsoFileSource *src)
120 {
121     return src->class->get_filesystem(src);
122 }
123 
124 
125 inline
iso_file_source_get_aa_string(IsoFileSource * src,unsigned char ** aa_string,int flag)126 int iso_file_source_get_aa_string(IsoFileSource *src,
127                                   unsigned char **aa_string, int flag)
128 {
129     if (src->class->version < 1) {
130         *aa_string = NULL;
131         return 1;
132     }
133     return src->class->get_aa_string(src, aa_string, flag);
134 }
135 
136