4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
8 * Jaewon Lim <jaewon81.lim@samsung.com>
9 * Woojin Jung <woojin2.jung@samsung.com>
10 * Juyoung Kim <j0.kim@samsung.com>
12 * This library is free software; you can redistribute it and/or modify it under
13 * the terms of the GNU Lesser General Public License as published by the
14 * Free Software Foundation; either version 2.1 of the License, or (at your option)
17 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
18 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
20 * License for more details.
22 * You should have received a copy of the GNU Lesser General Public License
23 * along with this library; if not, write to the Free Software Foundation, Inc., 51
24 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
38 #include "probeinfo.h"
43 static enum DaOptions _sopt = OPT_FILE;
45 FILE* fopen(const char* filename, const char* mode)
47 static FILE* (*fopenp)(const char* filename, const char* mode);
50 BEFORE_ORIGINAL_FILE_NOFILTER(fopen, LIBC);
51 _filepath = (char*)filename;
53 fret = fopenp(filename, mode);
55 AFTER_ORIGINAL_FILEP_RET(VT_PTR, fret, 0, fret, FD_API_OPEN, "%s, %s", filename, mode);
60 FILE* freopen(const char * filename, const char * mode, FILE * stream)
62 static FILE* (*freopenp)(const char * filename, const char * mode, FILE * stream);
65 BEFORE_ORIGINAL_FILE_NOFILTER(freopen, LIBC);
66 _filepath = (char*)filename;
68 fret = freopenp(filename, mode, stream);
70 AFTER_ORIGINAL_FILEP_RET(VT_PTR, fret, 0, fret, FD_API_OPEN,
71 "%s, %s, %p", filename, mode, stream);
76 FILE* fdopen(int fildes, const char *mode)
78 static FILE* (*fdopenp)(int fildes, const char *mode);
81 BEFORE_ORIGINAL_FILE_NOFILTER(fdopen, LIBC);
83 fret = fdopenp(fildes, mode);
85 AFTER_ORIGINAL_FILEP_RET(VT_PTR, fret, 0, fret, FD_API_OPEN, "%d, %s", fildes, mode);
90 int fflush(FILE* stream)
92 static int (*fflushp)(FILE* stream);
94 BEFORE_ORIGINAL_FILE(fflush, LIBC);
95 ret = fflushp(stream);
96 AFTER_ORIGINAL_FILEP(0, stream, FD_API_OTHER, "%p", stream);
100 int fclose(FILE* stream)
102 static int (*fclosep)(FILE* stream);
105 GET_REAL_FUNC(fclose, LIBC);
108 PRE_PROBEBLOCK_BEGIN();
109 GET_FD_FROM_FILEP(stream);
111 _fstatret = fstat(_fd, &_statbuf);
113 PRE_PROBEBLOCK_END();
115 ret = fclosep(stream);
117 POST_PROBEBLOCK_BEGIN(LC_RESOURCE, VT_INT, ret, "%p", stream);
118 POST_PROBEBLOCK_MIDDLE_FD(0, _fd, FD_API_CLOSE);
119 POST_PROBEBLOCK_CALLSTACK_RESOURCE(FD_API_CLOSE);
120 POST_PROBEBLOCK_END();
125 int remove(const char* filename)
127 static int (*removep)(const char* filename);
129 BEFORE_ORIGINAL_FILE(remove, LIBC);
130 _filepath = (char*)filename;
131 ret = removep(filename);
132 AFTER_ORIGINAL_NOFD(0, FD_API_DIRECTORY, "%s", filename);
136 int rename(const char* oldname, const char* newname)
138 static int (*renamep)(const char* oldname, const char* newname);
140 BEFORE_ORIGINAL_FILE(rename, LIBC);
141 _filepath = (char*)newname;
142 ret = renamep(oldname, newname);
143 AFTER_ORIGINAL_NOFD(0, FD_API_DIRECTORY, "%s, %s", oldname, newname);
147 FILE * tmpfile ( void )
149 static FILE* (*tmpfilep) ( void );
152 BEFORE_ORIGINAL_FILE_NOFILTER(tmpfile, LIBC);
153 _filepath = "<temp file>";
156 AFTER_ORIGINAL_FILEP_RET(VT_PTR, fret, 0, fret, FD_API_OPEN, "%s", "");
161 int fgetpos(FILE* stream, fpos_t* position)
163 static int (*fgetposp)(FILE* stream, fpos_t* position);
165 BEFORE_ORIGINAL_FILE(fgetpos, LIBC);
166 ret = fgetposp(stream, position);
167 AFTER_ORIGINAL_FILEP(0, stream, FD_API_OTHER, "%p, %p", stream, position);
171 int fseek(FILE* stream, long int offset, int origin)
173 static int (*fseekp)(FILE* stream, long int offset, int origin);
175 BEFORE_ORIGINAL_FILE(fseek, LIBC);
176 ret = fseekp(stream, offset, origin);
177 AFTER_ORIGINAL_FILEP((unsigned int)offset, stream, FD_API_OTHER,
178 "%p, %ld, %d", stream, offset, origin);
182 int fsetpos(FILE* stream, const fpos_t* pos)
184 static int (*fsetposp)(FILE* stream, const fpos_t* pos);
186 BEFORE_ORIGINAL_FILE(fsetpos, LIBC);
187 ret = fsetposp(stream, pos);
188 AFTER_ORIGINAL_FILEP(0, stream, FD_API_OTHER, "%p, %p", stream, pos);
192 long int ftell(FILE* stream)
194 static long int (*ftellp)(FILE* stream);
197 BEFORE_ORIGINAL_FILE(ftell, LIBC);
199 lret = ftellp(stream);
201 AFTER_ORIGINAL_FILEP_RET(VT_LONG, lret, 0, stream, FD_API_OTHER, "%p", stream);
206 void rewind(FILE* stream)
208 static void (*rewindp)(FILE* stream);
210 BEFORE_ORIGINAL_FILE(rewind, LIBC);
214 AFTER_ORIGINAL_FILEP_RET(VT_NULL, NULL, 0, stream, FD_API_OTHER, "%p", stream);
217 void clearerr(FILE* stream)
219 static void (*clearerrp)(FILE* stream);
221 BEFORE_ORIGINAL_FILE(clearerr, LIBC);
225 AFTER_ORIGINAL_FILEP_RET(VT_NULL, NULL, 0, stream, FD_API_OTHER, "%p", stream);
228 int feof(FILE* stream)
230 static int (*feofp)(FILE* stream);
232 BEFORE_ORIGINAL_FILE(feof, LIBC);
234 AFTER_ORIGINAL_FILEP(0, stream, FD_API_OTHER, "%p", stream);
238 int ferror(FILE* stream)
240 static int (*ferrorp)(FILE* stream);
242 BEFORE_ORIGINAL_FILE(ferror, LIBC);
243 ret = ferrorp(stream);
244 AFTER_ORIGINAL_FILEP(0, stream, FD_API_OTHER, "%p", stream);
248 int fileno(FILE* stream)
250 static int (*filenop)(FILE* stream);
252 BEFORE_ORIGINAL_FILE(fileno, LIBC);
253 ret = filenop(stream);
254 AFTER_ORIGINAL_FILEP(0, stream, FD_API_OTHER, "%p", stream);
258 void perror(const char* string)
260 static void (*perrorp)(const char* string);
262 BEFORE_ORIGINAL_FILE(perror, LIBC);
266 AFTER_ORIGINAL_NOFD_RET(VT_NULL, NULL, 0, FD_API_OTHER, "%s", string);
269 // *******************************************************************
270 // File read / write APIs
271 // *******************************************************************
273 int vfprintf(FILE* stream, const char* format, va_list arg)
275 static int (*vfprintfp)(FILE* stream, const char* format, va_list arg);
277 BEFORE_ORIGINAL_FILE(vfprintf, LIBC);
278 ret = vfprintfp(stream, format, arg);
279 AFTER_ORIGINAL_FILEP(ret, stream, FD_API_WRITE, "%p, %s", stream, format);
283 int vfscanf(FILE* stream, const char* format, va_list arg)
285 static int (*vfscanfp)(FILE* stream, const char* format, va_list arg);
287 BEFORE_ORIGINAL_FILE(vfscanf, LIBC);
288 ret = vfscanfp(stream, format, arg);
289 AFTER_ORIGINAL_FILEP(ret, stream, FD_API_READ, "%p, %s", stream, format);
293 int fgetc(FILE* stream)
295 static int (*fgetcp)(FILE* stream);
297 BEFORE_ORIGINAL_FILE(fgetc, LIBC);
298 ret = fgetcp(stream);
299 AFTER_ORIGINAL_FILEP((ret == EOF ? 0 : 1), stream, FD_API_READ, "%p", stream);
303 #if 0 // why is this commented?
304 char* fgets(char* str, int size, FILE* stream)
306 static char* (*fgetsp)(char* str, int num, FILE* stream);
309 BEFORE_ORIGINAL_FILE(fgets, LIBC);
311 cret = fgetsp(str, size, stream);
313 AFTER_ORIGINAL_FILEP_RET(VT_STR, cret, (ret == NULL ? 0 : strlen(cret)),
314 stream, FD_API_READ, "%s, %d, %p", str, size, stream);
320 int fputc(int character, FILE* stream)
322 static int (*fputcp)(int character, FILE* stream);
324 BEFORE_ORIGINAL_FILE(fputc, LIBC);
325 ret = fputcp(character, stream);
326 AFTER_ORIGINAL_FILEP((ret == EOF ? 0 : 1), stream, FD_API_WRITE,
327 "%d, %p", character, stream);
331 int fputs(const char* str, FILE* stream)
333 static int (*fputsp)(const char* str, FILE* stream);
335 BEFORE_ORIGINAL_FILE(fputs, LIBC);
336 ret = fputsp(str, stream);
337 AFTER_ORIGINAL_FILEP(ret, stream, FD_API_WRITE, "%s, %p", str, stream);
341 int getc(FILE* stream)
343 static int (*getcp)(FILE* stream);
345 BEFORE_ORIGINAL_FILE(getc, LIBC);
347 AFTER_ORIGINAL_FILEP((ret == EOF ? 0 : 1), stream, FD_API_READ, "%p", stream);
351 int putc(int character, FILE* stream)
353 static int (*putcp)(int character, FILE* stream);
355 BEFORE_ORIGINAL_FILE(putc, LIBC);
356 ret = putcp(character, stream);
357 AFTER_ORIGINAL_FILEP((ret == EOF ? 0 : 1), stream, FD_API_WRITE,
358 "%d, %p", character, stream);
362 int ungetc(int character, FILE* stream)
364 static int (*ungetcp)(int character, FILE* stream);
366 BEFORE_ORIGINAL_FILE(ungetc, LIBC);
367 ret = ungetcp(character, stream);
368 AFTER_ORIGINAL_FILEP(0, stream, FD_API_OTHER, "%d, %p", character, stream);
372 size_t fread(void* ptr, size_t size, size_t count, FILE* stream)
374 static size_t (*freadp)(void* ptr, size_t size, size_t count, FILE* stream);
377 BEFORE_ORIGINAL_FILE(fread, LIBC);
379 tret = freadp(ptr, size, count, stream);
381 AFTER_ORIGINAL_FILEP_RET(VT_SIZE_T, tret, 0, stream, FD_API_READ,
382 "%p, %u, %u, %p", ptr, size, count, stream);
387 size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream)
389 static size_t (*fwritep)(const void* ptr, size_t size, size_t count, FILE* stream);
392 BEFORE_ORIGINAL_FILE(fwrite, LIBC);
394 tret = fwritep(ptr, size, count, stream);
396 AFTER_ORIGINAL_FILEP_RET(VT_SIZE_T, tret, 0, stream, FD_API_WRITE,
397 "%p, %u, %u, %p", ptr, size, count, stream);
402 // *********************************************************
403 // variable parameter function
404 // *********************************************************
405 int fprintf(FILE* stream, const char* format, ...)
407 static int (*vfprintfp)(FILE* stream, const char* format, ...);
409 BEFORE_ORIGINAL_FILE(vfprintf, LIBC);
412 va_start(arg, format);
413 ret = vfprintfp(stream, format, arg);
415 AFTER_ORIGINAL_FILEP(ret, stream, FD_API_WRITE, "%p, %s, ...", stream, format);
421 int fscanf(FILE* stream, const char* format, ...)
423 static int (*vfscanfp)(FILE* stream, const char* format, ...);
425 BEFORE_ORIGINAL_FILE(vfscanf, LIBC);
428 va_start(arg, format);
429 ret = vfscanfp(stream, format, arg);
431 AFTER_ORIGINAL_FILEP(ret, stream, FD_API_READ, "%p, %s, ...", stream, format);
437 #if !defined(DA_DEBUG_LOG) && !defined(PRINT_STDOUT)
438 int printf(const char* format, ...)
440 static int (*vprintfp)(const char* format, ...);
442 BEFORE_ORIGINAL_FILE(vprintf, LIBC);
445 va_start(arg, format);
446 ret = vprintfp(format, arg);
448 AFTER_ORIGINAL_NOFD(ret, FD_API_WRITE, "%s,...", format);
455 int scanf(const char* format, ...)
457 static int (*vscanfp)(const char* format, ...);
459 BEFORE_ORIGINAL_FILE(vscanf, LIBC);
462 va_start(arg, format);
463 ret = vscanfp(format, arg);
465 AFTER_ORIGINAL_NOFD(ret, FD_API_READ, "%s,...", format);
473 static int (*getcharp)();
475 BEFORE_ORIGINAL_FILE(getchar, LIBC);
477 AFTER_ORIGINAL_NOFD((ret == EOF ? 0 : 1), FD_API_READ, "%s", "");
483 static int (*putcharp)(int c);
485 BEFORE_ORIGINAL_FILE(putchar, LIBC);
487 AFTER_ORIGINAL_NOFD((ret == EOF ? 0 : 1), FD_API_WRITE, "%d", c);
491 char* gets(char* str)
493 static char* (*getsp)(char* str);
496 BEFORE_ORIGINAL_FILE(gets, LIBC);
500 AFTER_ORIGINAL_NOFD_RET(VT_STR, cret, strlen(cret), FD_API_READ, "%s", str);
505 #if !defined(DA_DEBUG_LOG) && !defined(PRINT_STDOUT)
506 int puts(const char* str)
508 static int (*putsp)(const char* str);
510 BEFORE_ORIGINAL_FILE(puts, LIBC);
512 AFTER_ORIGINAL_NOFD(ret, FD_API_WRITE, "%s", str);
517 char* tmpnam(char* str)
519 static char* (*tmpnamp)(char* str);
522 BEFORE_ORIGINAL_FILE(tmpnam, LIBC);
526 AFTER_ORIGINAL_NOFD_RET(VT_STR, cret, 0, FD_API_OTHER, "%s", str);
531 void setbuf(FILE* stream, char* buf)
533 static void (*setbufp)(FILE* stream, char* buf);
535 BEFORE_ORIGINAL_FILE(setbuf, LIBC);
537 setbufp(stream, buf);
539 AFTER_ORIGINAL_FILEP_RET(VT_NULL, NULL, 0, stream, FD_API_OTHER,
540 "%p, %p", stream, buf);
543 void setbuffer(FILE* stream, char* buf, size_t size)
545 static void (*setbufferp)(FILE* stream, char* buf, size_t size);
547 BEFORE_ORIGINAL_FILE(setbuffer, LIBC);
549 setbufferp(stream, buf, size);
551 AFTER_ORIGINAL_FILEP_RET(VT_NULL, NULL, size, stream, FD_API_OTHER,
552 "%p, %p, %u", stream, buf, size);
555 void setlinebuf(FILE* stream)
557 static int (*setlinebufp)(FILE* stream);
559 BEFORE_ORIGINAL_FILE(setlinebuf, LIBC);
563 AFTER_ORIGINAL_FILEP_RET(VT_NULL, NULL, 0, stream, FD_API_OTHER, "%p", stream);
566 int setvbuf(FILE* stream, char* buf, int mode, size_t size)
568 static int (*setvbufp)(FILE* stream, char* buf, int mode, size_t size);
570 BEFORE_ORIGINAL_FILE(setvbuf, LIBC);
571 ret = setvbufp(stream,buf,mode,size);
572 AFTER_ORIGINAL_FILEP(size, stream, FD_API_OTHER,
573 "%p, %p, %d, %u", stream, buf, mode, size);