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