1
2 #include "fileHandle.h"
3
4 /**************************************************************************
5 **SA Network Connection Profiler [sancp] - A TCP/IP statistical/collection tool
6 * ************************************************************************
7 * * Copyright (C) 2003 John Curry <john.curry@metre.net>
8 * *
9 * * This program is distributed under the terms of version 1.0 of the
10 * * Q Public License. See LICENSE.QPL for further details.
11 * *
12 * * This program is distributed in the hope that it will be useful,
13 * * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 * *
16 * ***********************************************************************/
17
fileHandle()18 fileHandle::fileHandle():in_use(1),handle(0),filename(0){ }
19
fileHandle(FILE * OFH,int mode=APPEND_MODE)20 fileHandle::fileHandle(FILE *OFH, int mode = APPEND_MODE):in_use(1),handle(OFH),filename(0),mode(mode){ }
21
fileHandle(const char * newfilename)22 fileHandle::fileHandle(const char *newfilename):in_use(1),handle(0),filename(0),mode(APPEND_MODE)
23 {
24 setFileName(newfilename);
25 }
fileHandle(const char * newfilename,int mode=APPEND_MODE)26 fileHandle::fileHandle(const char *newfilename, int mode = APPEND_MODE ):in_use(1),handle(0),filename(0),mode(mode)
27 {
28 setFileName(newfilename);
29 }
30
setFileName(const char * newfilename)31 void fileHandle::setFileName(const char *newfilename){
32 if( filename!=0 ){ ::free(filename); }
33 if( newfilename != 0 )
34 {
35 filename=(char *) calloc(1,strlen(newfilename)+1);
36 strncpy(filename,newfilename,strlen(newfilename));
37 }else{
38 filename = 0;
39 }
40 }
41
getFileHandle()42 FILE * fileHandle::getFileHandle()
43 {
44 return handle;
45 }
46
getFileName()47 char * fileHandle::getFileName()
48 {
49 return filename;
50 }
51
isOpen()52 int fileHandle::isOpen()
53 {
54
55 if(handle){ return 1; }
56 return 0;
57 }
58
open()59 int fileHandle::open()
60 {
61 if(isOpen()){ return 1; }
62 if(mode == WRITE_MODE ) {
63 if(filename==0){ handle=stdout; return 1;}
64 // Open file in write mode
65 if((handle = fopen(filename,"w+"))==NULL){ return 0; }
66 flock(fileno(handle),LOCK_EX|LOCK_NB);
67 }else if(mode == APPEND_MODE ) {
68 if(filename==0){ handle=stdout; return 1;}
69 // Open file in append mode
70 if((handle = fopen(filename,"a"))==NULL){ return 0; }
71 flock(fileno(handle),LOCK_EX|LOCK_NB);
72 }else{
73 if(filename==0){ handle=stdin; return 1;}
74 // Open file in read mode
75 if((handle = fopen(filename,"r"))==NULL){ return 0; }
76 flock(fileno(handle),LOCK_SH|LOCK_NB);
77 }
78 return 1;
79 }
80
getMode()81 int fileHandle::getMode()
82 {
83 return mode;
84 }
85
setMode(int tmode)86 void fileHandle::setMode(int tmode)
87 {
88 mode = tmode;
89 }
90
reopen()91 void fileHandle::reopen()
92 {
93 close();
94 open();
95 }
96
tell()97 long fileHandle::tell()
98 {
99 if(open())
100 {
101 return ::ftell(handle);
102 }else{
103 //Unable to read from file
104 return -1;
105 }
106 }
107
seek(long offset,int whence)108 int fileHandle::seek(long offset, int whence)
109 {
110 if(open())
111 {
112 return ::fseek(handle,offset,whence);
113 }else{
114 //Unable to read from file
115 return -1;
116 }
117 }
118
read(char * data,int len)119 int fileHandle::read(char *data, int len)
120 {
121 if(open())
122 {
123 return ::read(fileno(handle),data,len);
124 }else{
125 //Unable to read from file
126 return -1;
127 }
128 }
129
write(const char * data,int len)130 ssize_t fileHandle::write(const char *data, int len)
131 {
132 if( mode == READ_MODE )
133 {
134 //File in READ-ONLY MODE
135 return -2;
136 }
137 if(open())
138 {
139 return ::write(fileno(handle),data,len);
140 }else{
141 //Unable to print to file
142 return -3;
143 }
144 }
145
attach()146 fileHandle * fileHandle::attach()
147 {
148 in_use++;
149 return this;
150 }
151
detach()152 void fileHandle::detach()
153 {
154 if(in_use)
155 in_use--;
156 }
157
destroy()158 void fileHandle::destroy()
159 {
160 detach();
161 if(!in_use){ delete this; }
162 }
163
close()164 void fileHandle::close()
165 {
166 if(handle && filename)
167 {
168 fflush(handle);
169 flock(fileno(handle),LOCK_UN|LOCK_NB);
170 fclose(handle);
171 }
172 handle=0;
173 }
174
~fileHandle()175 fileHandle::~fileHandle()
176 {
177 close();
178 if(filename)
179 free(filename);
180 filename=0;
181 }
182
183