1 |
commit: a211bf1d95a0adae7aa76539fcc9789aa0c1644c |
2 |
Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru> |
3 |
AuthorDate: Fri Jul 1 02:04:09 2011 +0000 |
4 |
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru> |
5 |
CommitDate: Fri Jul 1 02:04:09 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=a211bf1d |
7 |
|
8 |
fixed a very nasty issue with environment variables |
9 |
|
10 |
--- |
11 |
logger/src/autodep/logfs/fstracer.py | 17 ++- |
12 |
logger/src/autodep/showfsevents.py | 1 + |
13 |
logger/src/hook_lib/file_hook.c | 280 +++++++++++++++++++++++++++++----- |
14 |
3 files changed, 253 insertions(+), 45 deletions(-) |
15 |
|
16 |
diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py |
17 |
index 7ceb36e..1b99f8e 100644 |
18 |
--- a/logger/src/autodep/logfs/fstracer.py |
19 |
+++ b/logger/src/autodep/logfs/fstracer.py |
20 |
@@ -132,10 +132,10 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) |
21 |
|
22 |
sock_listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
23 |
sock_listen.bind(socketname) |
24 |
- sock_listen.listen(1024) |
25 |
+ sock_listen.listen(64) |
26 |
# enable connect a socket for anyone |
27 |
os.chmod(tmpdir,stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR|stat.S_IROTH|stat.S_IWOTH|stat.S_IXOTH) |
28 |
- os.chmod(socketname,stat.S_IRUSR|stat.S_IWUSR|stat.S_IROTH|stat.S_IWOTH) |
29 |
+ os.chmod(socketname,stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR|stat.S_IROTH|stat.S_IWOTH|stat.S_IXOTH) |
30 |
|
31 |
except socket.error, e: |
32 |
print "Failed to create a socket for exchange data with the logger: %s" % e |
33 |
@@ -168,19 +168,26 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) |
34 |
stop=0 |
35 |
was_first_connect=False |
36 |
|
37 |
+ #print "fileno listen: %d",sock_listen.fileno() |
38 |
+ |
39 |
while stop==0: |
40 |
sock_events = epoll.poll(3) |
41 |
for fileno, sock_event in sock_events: |
42 |
if fileno == sock_listen.fileno(): |
43 |
+ #print "\n\nEVENT\n\n" |
44 |
ret = sock_listen.accept() |
45 |
+ #print ret |
46 |
if ret is None: |
47 |
+ # print "\n\nPASS\n\n" |
48 |
pass |
49 |
else: |
50 |
(client,addr)=ret |
51 |
+ # print client |
52 |
connects+=1; # client accepted |
53 |
was_first_connect=True |
54 |
epoll.register(client.fileno(), select.EPOLLIN) |
55 |
clients[client.fileno()]=client |
56 |
+ #print "opened %d" % client.fileno() |
57 |
#elif sock_event & select.EPOLLHUP: |
58 |
#epoll.unregister(fileno) |
59 |
#clients[fileno].close() |
60 |
@@ -196,7 +203,7 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) |
61 |
clients[fileno].close() |
62 |
del clients[fileno] |
63 |
connects-=1 |
64 |
- #print "closing!!" |
65 |
+ #print "closed %d"%fileno |
66 |
continue |
67 |
|
68 |
message=record.split("\0") |
69 |
@@ -258,12 +265,14 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) |
70 |
return [] |
71 |
if len(clients)==0 and iszombie(pid): |
72 |
break |
73 |
+ |
74 |
+ #print "\n\nRETURNING!!!!\n\n" |
75 |
+ |
76 |
|
77 |
os.wait() |
78 |
|
79 |
epoll.unregister(sock_listen.fileno()) |
80 |
epoll.close() |
81 |
sock_listen.close() |
82 |
- |
83 |
return events |
84 |
|
85 |
|
86 |
diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py |
87 |
index 2b04709..20264e1 100755 |
88 |
--- a/logger/src/autodep/showfsevents.py |
89 |
+++ b/logger/src/autodep/showfsevents.py |
90 |
@@ -14,6 +14,7 @@ if len(sys.argv)<2: |
91 |
|
92 |
events=logfs.fstracer.getfsevents(sys.argv[1], sys.argv[1:],approach="hooklib") |
93 |
print "Program finished, analyzing dependencies" |
94 |
+#exit(0); |
95 |
# get unique filenames |
96 |
filenames={} |
97 |
for stage in events: |
98 |
|
99 |
diff --git a/logger/src/hook_lib/file_hook.c b/logger/src/hook_lib/file_hook.c |
100 |
index 7c846e2..2958cb7 100644 |
101 |
--- a/logger/src/hook_lib/file_hook.c |
102 |
+++ b/logger/src/hook_lib/file_hook.c |
103 |
@@ -22,6 +22,8 @@ |
104 |
#define MAXFILEBUFFLEN 2048 |
105 |
|
106 |
#define MAXSOCKETMSGLEN 8192 |
107 |
+#define MAXENVSIZE 65536 |
108 |
+#define MAXENVITEMSIZE 256 |
109 |
|
110 |
//extern int errorno; |
111 |
|
112 |
@@ -31,16 +33,27 @@ int (*_open)(const char * pathname, int flags, ...); |
113 |
int (*_open64)(const char * pathname, int flags, ...); |
114 |
FILE * (*_fopen)(const char *path, const char *mode); |
115 |
FILE * (*_fopen64)(const char *path, const char *mode); |
116 |
-int (*_execve)(const char *filename, char *const argv[],char *const envp[]); |
117 |
ssize_t (*_read)(int fd, void *buf, size_t count); |
118 |
ssize_t (*_write)(int fd, const void *buf, size_t count); |
119 |
size_t (*_fread)(void *ptr, size_t size, size_t nmemb, FILE *stream); |
120 |
size_t (*_fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream); |
121 |
|
122 |
+int (*_execve)(const char *filename, char *const argv[],char *const envp[]); |
123 |
+int (*_execv)(const char *path, char *const argv[]); |
124 |
+int (*_execvp)(const char *file, char *const argv[]); |
125 |
+int (*_fexecve)(int fd, char *const argv[], char *const envp[]); |
126 |
+ |
127 |
+int (*_system)(const char *command); |
128 |
+ |
129 |
+pid_t (*_fork)(); |
130 |
+ |
131 |
+int (*_setenv)(const char *name, const char *value, int overwrite); |
132 |
int (*_close)(int fd); // we hooking this, because some programs closes our socket |
133 |
|
134 |
int log_socket=-1; |
135 |
|
136 |
+char log_socket_orig[MAXSOCKETPATHLEN]; |
137 |
+ |
138 |
void __doinit(){ |
139 |
_open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open"); |
140 |
_open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64"); |
141 |
@@ -51,52 +64,70 @@ void __doinit(){ |
142 |
_read= (ssize_t (*)(int fd, void *buf, size_t count)) dlsym(RTLD_NEXT, "read"); |
143 |
_write= (ssize_t (*)(int fd, const void *buf, size_t count)) dlsym(RTLD_NEXT, "write"); |
144 |
|
145 |
+ _fork = (pid_t (*)()) dlsym(RTLD_NEXT, "fork"); |
146 |
_execve = (int (*)(const char *filename, char *const argv[],char *const envp[])) dlsym(RTLD_NEXT, "execve"); |
147 |
+ _execv = (int (*)(const char *path, char *const argv[])) dlsym(RTLD_NEXT, "execv"); |
148 |
+ _execvp = (int (*)(const char *file, char *const argv[])) dlsym(RTLD_NEXT, "execvp"); |
149 |
|
150 |
+ _fexecve = (int (*)(int fd, char *const argv[], char *const envp[])) dlsym(RTLD_NEXT, "fexecve"); |
151 |
+ |
152 |
+ _system = (int (*)(const char *command)) dlsym(RTLD_NEXT, "system"); |
153 |
+ |
154 |
+ |
155 |
+ _setenv=(int (*)(const char *name, const char *value, int overwrite)) dlsym(RTLD_NEXT, "setenv"); |
156 |
_close= (int (*)(int fd)) dlsym(RTLD_NEXT, "close"); |
157 |
|
158 |
|
159 |
if(_open==NULL || _open64==NULL || |
160 |
_fopen==NULL || _fopen64==NULL || |
161 |
- execve==NULL || _read==NULL || _write==NULL || close==NULL) { |
162 |
+ _read==NULL || _write==NULL || |
163 |
+ _fork==NULL || _execve==NULL || _execv==NULL || _fexecve==NULL || _execvp==NULL || |
164 |
+ _system==NULL || _setenv==NULL || _close==NULL) { |
165 |
fprintf(stderr,"Failed to load original functions of hook\n"); |
166 |
exit(1); |
167 |
} |
168 |
|
169 |
|
170 |
char *log_socket_name=getenv("LOG_SOCKET"); |
171 |
+ |
172 |
if(log_socket_name==NULL) { |
173 |
fprintf(stderr,"LOG_SOCKET environment variable isn't defined." |
174 |
"Are this library launched by server?\n"); |
175 |
|
176 |
exit(1); |
177 |
- } else { |
178 |
- if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) { |
179 |
- fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name); |
180 |
- exit(1); |
181 |
- } |
182 |
- |
183 |
- log_socket=socket(AF_UNIX, SOCK_SEQPACKET, 0); |
184 |
- if(log_socket==-1) { |
185 |
- fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno)); |
186 |
- exit(1); |
187 |
- } |
188 |
- |
189 |
- struct sockaddr_un serveraddr; |
190 |
- memset(&serveraddr, 0, sizeof(serveraddr)); |
191 |
- serveraddr.sun_family = AF_UNIX; |
192 |
- strcpy(serveraddr.sun_path, log_socket_name); |
193 |
- |
194 |
- int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr)); |
195 |
- if(ret==-1) { |
196 |
- fprintf(stderr,"Unable to connect a unix-socket: %s\n", strerror(errno)); |
197 |
- exit(1); |
198 |
- } |
199 |
- } |
200 |
+ } |
201 |
+ strcpy(log_socket_orig,getenv("LOG_SOCKET")); |
202 |
+ //fprintf(stderr,"%d %s\n",getpid(),log_socket_name); |
203 |
+ |
204 |
+ |
205 |
+ if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) { |
206 |
+ fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name); |
207 |
+ exit(1); |
208 |
+ } |
209 |
+ |
210 |
+ log_socket=socket(AF_UNIX, SOCK_SEQPACKET, 0); |
211 |
+ if(log_socket==-1) { |
212 |
+ fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno)); |
213 |
+ exit(1); |
214 |
+ } |
215 |
+ |
216 |
+ struct sockaddr_un serveraddr; |
217 |
+ memset(&serveraddr, 0, sizeof(serveraddr)); |
218 |
+ serveraddr.sun_family = AF_UNIX; |
219 |
+ strcpy(serveraddr.sun_path, log_socket_name); |
220 |
+ |
221 |
+ |
222 |
+ int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr)); |
223 |
+ if(ret==-1) { |
224 |
+ fprintf(stderr,"Unable to connect a unix-socket %d %s: %s\n", getpid(),log_socket_name, strerror(errno)); |
225 |
+ fflush(stderr); |
226 |
+ //execlp("/bin/bash","/bin/bash",NULL); |
227 |
+ exit(1); |
228 |
+ } |
229 |
} |
230 |
|
231 |
void __dofini() { |
232 |
- //close(log_socket); |
233 |
+ close(log_socket); |
234 |
} |
235 |
|
236 |
void _init() { |
237 |
@@ -110,7 +141,7 @@ void _fini() { |
238 |
/* |
239 |
* Format of log string: time event filename stage result/err |
240 |
*/ |
241 |
-static void __raw_log_event(const char *event_type, const char *filename, char *result,int err, char* stage) { |
242 |
+static int __raw_log_event(const char *event_type, const char *filename, char *result,int err, char* stage) { |
243 |
//printf("lololo:%s %s %s\n",event_type,filename,stage); |
244 |
|
245 |
char msg_buff[MAXSOCKETMSGLEN]; |
246 |
@@ -123,19 +154,20 @@ static void __raw_log_event(const char *event_type, const char *filename, char * |
247 |
(unsigned long long)time(NULL),0,event_type,0,filename,0,stage,0,result); |
248 |
} |
249 |
|
250 |
- if(bytes_to_send>=MAXSOCKETMSGLEN) return; |
251 |
- if(send(log_socket,msg_buff,bytes_to_send,0)==-1) { |
252 |
- printf("BAYBAY!!!11 %d %d\n",log_socket, getpid()); |
253 |
- sleep(100500); |
254 |
- } |
255 |
+ if(bytes_to_send>=MAXSOCKETMSGLEN) |
256 |
+ return 0; |
257 |
+ |
258 |
+ if(send(log_socket,msg_buff,bytes_to_send,0)==-1) |
259 |
+ return 0; |
260 |
|
261 |
+ return 1; |
262 |
} |
263 |
|
264 |
/* |
265 |
* Log an event |
266 |
*/ |
267 |
-static void __log_event(const char *event_type, const char *filename, char *result,int err, char* stage) { |
268 |
- __raw_log_event(event_type,filename,result,err,stage); |
269 |
+static int __log_event(const char *event_type, const char *filename, char *result,int err, char* stage) { |
270 |
+ return __raw_log_event(event_type,filename,result,err,stage); |
271 |
} |
272 |
|
273 |
/* |
274 |
@@ -167,7 +199,7 @@ ssize_t __get_path_by_fd(int fd, char *output, int output_len) { |
275 |
static int __is_event_allowed(const char *event_type,const char *filename, char* stage) { |
276 |
char answer[8]; |
277 |
int bytes_recieved; |
278 |
- |
279 |
+ //printf("asking %s\n",filename); |
280 |
|
281 |
pthread_mutex_lock( &socketblock ); |
282 |
|
283 |
@@ -180,8 +212,11 @@ static int __is_event_allowed(const char *event_type,const char *filename, char* |
284 |
return 1; |
285 |
else if(strcmp(answer,"DENY")==0) |
286 |
return 0; |
287 |
- else |
288 |
+ else { |
289 |
fprintf(stderr,"Protocol error, text should be ALLOW or DENY, got: %s",answer); |
290 |
+ |
291 |
+ exit(1); |
292 |
+ } |
293 |
return 0; |
294 |
} |
295 |
|
296 |
@@ -198,10 +233,10 @@ int open(const char * path, int flags, mode_t mode) { |
297 |
} |
298 |
|
299 |
|
300 |
- if(flags & O_CREAT) |
301 |
+ //if(flags & O_CREAT) |
302 |
ret=_open(path, flags, mode); |
303 |
- else |
304 |
- ret=_open(path, flags, 0); |
305 |
+ //else |
306 |
+ // ret=_open(path, flags, 0); |
307 |
|
308 |
if(ret==-1) |
309 |
__log_event("open",fullpath,"ERR",errno,stage); |
310 |
@@ -311,7 +346,27 @@ ssize_t write(int fd,const void *buf, size_t count){ |
311 |
return ret; |
312 |
} |
313 |
|
314 |
+pid_t fork(void) { |
315 |
+ //fprintf(stderr,"prefork %s %s\n",getenv("LOG_SOCKET"),log_socket_orig); |
316 |
|
317 |
+ //int succ= |
318 |
+ setenv("LOG_SOCKET",log_socket_orig,1); |
319 |
+ |
320 |
+ //fprintf(stderr,"prefork %s%p%p%d %s\n",getenv("LOG_SOCKET"),_setenv,setenv,succ,log_socket_orig); |
321 |
+ |
322 |
+ int ret=_fork(); |
323 |
+ // we must to handle fork for reconnect a socket |
324 |
+ |
325 |
+ if(ret==0) { |
326 |
+ |
327 |
+ __dofini(); // reinit connection for clildren |
328 |
+ __doinit(); // because now it is different processes |
329 |
+ } else { |
330 |
+ //fprintf(stderr,"fork new: %d LOG_SOCKET=%s\n", ret,getenv("LOG_SOCKET")); |
331 |
+ //sleep(3); |
332 |
+ } |
333 |
+ return ret; |
334 |
+} |
335 |
|
336 |
int execve(const char *filename, char *const argv[], |
337 |
char *const envp[]) { |
338 |
@@ -319,17 +374,160 @@ int execve(const char *filename, char *const argv[], |
339 |
__log_event("open",filename,"OK",0,__get_stage()); |
340 |
else |
341 |
__log_event("open",filename,"ERR",2,__get_stage()); |
342 |
- |
343 |
|
344 |
+ //fprintf(stderr,"executing %s pid=%d", filename,getpid()); |
345 |
+ char *new_envp[MAXENVSIZE]; |
346 |
+ char new_ld_preload[MAXENVITEMSIZE]; |
347 |
+ char new_log_socket[MAXENVITEMSIZE]; |
348 |
+ |
349 |
+ int ld_preload_valid=0; |
350 |
+ int log_socket_valid=0; |
351 |
+ int i; |
352 |
+ for(i=0;envp[i];i++){ |
353 |
+ if(strncmp(envp[i],"LD_PRELOAD=",11)==0) |
354 |
+ if(strcmp(envp[i]+11,getenv("LD_PRELOAD"))==0) |
355 |
+ ld_preload_valid=1; |
356 |
+ if(strncmp(envp[i],"LOG_SOCKET=",11)==0) |
357 |
+ if(strcmp(envp[i]+11,log_socket_orig)==0) |
358 |
+ log_socket_valid=1; |
359 |
+ } |
360 |
+ if(!ld_preload_valid || !log_socket_valid) { |
361 |
+ snprintf(new_ld_preload,MAXENVITEMSIZE,"LD_PRELOAD=%s",getenv("LD_PRELOAD")); |
362 |
+ snprintf(new_log_socket,MAXENVITEMSIZE,"LOG_SOCKET=%s",log_socket_orig); |
363 |
+ for(i=0; envp[i] && i<MAXENVSIZE-3; i++) { |
364 |
+ if(strncmp(envp[i],"LD_PRELOAD=",11)==0) { |
365 |
+ new_envp[i]=new_ld_preload; |
366 |
+ ld_preload_valid=1; |
367 |
+ } else if(strncmp(envp[i],"LOG_SOCKET=",11)==0) { |
368 |
+ new_envp[i]=new_log_socket; |
369 |
+ log_socket_valid=1; |
370 |
+ } else { |
371 |
+ new_envp[i]=envp[i]; |
372 |
+ } |
373 |
+ } |
374 |
+ |
375 |
+ if(!ld_preload_valid) { |
376 |
+ new_envp[i]=new_ld_preload; |
377 |
+ i++; |
378 |
+ } |
379 |
+ if(!log_socket_valid) { |
380 |
+ new_envp[i]=new_log_socket; |
381 |
+ i++; |
382 |
+ } |
383 |
+ new_envp[i]=NULL; |
384 |
+ envp=new_envp; |
385 |
+// for(i=0;envp[i];i++){ |
386 |
+// printf("BAY: %s\n",envp[i]); |
387 |
+// } |
388 |
+ |
389 |
+ } |
390 |
+ |
391 |
+ fflush(stderr); |
392 |
int ret=_execve(filename, argv, envp); |
393 |
|
394 |
return ret; |
395 |
} |
396 |
|
397 |
+//int clone(int (*fn)(void *), void *child_stack, |
398 |
+// int flags, void *arg, ...) { |
399 |
+// fprintf(stderr,"clone pid=%d",getpid()); |
400 |
+// fflush(stderr); |
401 |
+ |
402 |
+// return -1;//_clone(fn,child_stack,flags,arg); |
403 |
+//} |
404 |
+ |
405 |
+ |
406 |
+/*int fexecve(int fd, char *const argv[], char *const envp[]) { |
407 |
+ fprintf(stderr,"fexecuting pid=%d",getpid()); |
408 |
+ fflush(stderr); |
409 |
+ return _fexecve(fd,argv,envp); |
410 |
+} |
411 |
+ |
412 |
+int execle(const char *path, const char *arg, ...) { |
413 |
+ fprintf(stderr,"fexecluting pid=%d",getpid()); |
414 |
+ fflush(stderr); |
415 |
+// |
416 |
+ return 0; |
417 |
+} |
418 |
+ |
419 |
+int execl(const char *path, const char *arg, ...){ |
420 |
+ fprintf(stderr,"execluting 1 pid=%d",getpid()); |
421 |
+ fflush(stderr); |
422 |
+// |
423 |
+ return 0; |
424 |
+} |
425 |
+ |
426 |
+int execv(const char *path, char *const argv[]){ |
427 |
+ fprintf(stderr,"execvuting 1 pid=%d",getpid()); |
428 |
+ fflush(stderr); |
429 |
+ _execv(path,argv); |
430 |
+ return 0; |
431 |
+} |
432 |
+ |
433 |
+int execvp(const char *file, char *const argv[]){ |
434 |
+ fprintf(stderr,"execvpting 1 pid=%d",getpid()); |
435 |
+ fflush(stderr); |
436 |
+ |
437 |
+ return _execvp(file,argv); |
438 |
+ |
439 |
+ return 0; |
440 |
+} |
441 |
+ |
442 |
+ |
443 |
+int execvpe(const char *file, char *const argv[], |
444 |
+ char *const envp[]){ |
445 |
+ fprintf(stderr,"execvpeting 1 pid=%d",getpid()); |
446 |
+ fflush(stderr); |
447 |
+// |
448 |
+ return 0; |
449 |
+} |
450 |
+ |
451 |
+int execlp(const char *file, const char *arg, ...){ |
452 |
+ fprintf(stderr,"execlpeting 1 pid=%d",getpid()); |
453 |
+ fflush(stderr); |
454 |
+// |
455 |
+ return 0; |
456 |
+} |
457 |
+ |
458 |
+int rexec(char **ahost, int inport, char *user, |
459 |
+ char *passwd, char *cmd, int *fd2p){ |
460 |
+ fprintf(stderr,"rexec 1 pid=%d",getpid()); |
461 |
+ fflush(stderr); |
462 |
+// |
463 |
+ return 0; |
464 |
+} |
465 |
+ |
466 |
+int system(const char *command) { |
467 |
+ fprintf(stderr,"rexec 1 pid=%d cmd=%s",getpid(),command); |
468 |
+ fflush(stderr); |
469 |
+ |
470 |
+ return _system(command); |
471 |
+ return 0; |
472 |
+ |
473 |
+}*/ |
474 |
+ |
475 |
+ |
476 |
+ |
477 |
+int setenv(const char *name, const char *value, int overwrite) { |
478 |
+ //printf (" CHANGING name: %s, value: %s",name,value); |
479 |
+ if(strcmp(name,"LD_PRELOAD")==0 || |
480 |
+ strcmp(name,"LOG_SOCKET")==0) return -1; |
481 |
+ int ret=_setenv(name,value,overwrite); |
482 |
+ return ret; |
483 |
+} |
484 |
+ |
485 |
+//int putenv(char *string){ |
486 |
+// fprintf(stderr,"putenv 1 pid=%d cmd=%s",getpid(),string); |
487 |
+// fflush(stderr); |
488 |
+// |
489 |
+// //return _system(command); |
490 |
+// return 0; |
491 |
+//} |
492 |
+ |
493 |
+ |
494 |
int close(int fd) { |
495 |
if(fd!=log_socket) { |
496 |
return _close(fd); |
497 |
} |
498 |
return -1; |
499 |
} |
500 |
- |