4 * Copyright (c) 2000 - 2013 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>
11 * Anastasia Lyupa <a.lyupa@samsung.com>
13 * This library is free software; you can redistribute it and/or modify it under
14 * the terms of the GNU Lesser General Public License as published by the
15 * Free Software Foundation; either version 2.1 of the License, or (at your option)
18 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
19 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
21 * License for more details.
23 * You should have received a copy of the GNU Lesser General Public License
24 * along with this library; if not, write to the Free Software Foundation, Inc., 51
25 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 * - Samsung RnD Institute Russia
40 #include "probeinfo.h"
46 #include "real_functions.h"
48 static enum DaOptions _sopt = OPT_FILE;
50 static inline char *get_abs_path(FILE *file, const char *fname,
51 char *buf, size_t bufsiz)
53 char *path = file ? real_abs_path(fileno(file), buf, bufsiz): NULL;
56 path = absolutize_filepath(fname, buf, bufsiz);
61 FILE* fopen(const char* filename, const char* mode)
63 static FILE* (*fopenp)(const char* filename, const char* mode);
64 char buffer[PATH_MAX];
67 BEFORE_ORIGINAL_FILE(fopen, LIBC);
69 fret = fopenp(filename, mode);
71 _filepath = get_abs_path(fret, filename, buffer, PATH_MAX);
73 AFTER_PACK_ORIGINAL_FILEP(API_ID_fopen,
74 'p', fret, 0, fret, FD_API_OPEN, "s4s",
80 FILE* freopen(const char * filename, const char * mode, FILE * stream)
82 static FILE* (*freopenp)(const char *filename, const char *mode,
84 char buffer[PATH_MAX];
87 BEFORE_ORIGINAL_FILE(freopen, LIBC);
89 fret = freopenp(filename, mode, stream);
91 _filepath = get_abs_path(fret, filename, buffer, PATH_MAX);
93 AFTER_PACK_ORIGINAL_FILEP(API_ID_freopen, 'p', fret, 0, fret, FD_API_OPEN,
94 "s4sp", filename, mode,
95 voidp_to_uint64(stream));
100 FILE* fdopen(int fildes, const char *mode)
102 static FILE* (*fdopenp)(int fildes, const char *mode);
105 BEFORE_ORIGINAL_FILE(fdopen, LIBC);
107 fret = fdopenp(fildes, mode);
109 AFTER_PACK_ORIGINAL_FILEP(API_ID_fdopen,
110 'p', fret, 0, fret, FD_API_OPEN, "ds", fildes, mode);
115 int fflush(FILE* stream)
117 static int (*fflushp)(FILE* stream);
119 BEFORE_ORIGINAL_FILE(fflush, LIBC);
120 ret = fflushp(stream);
121 AFTER_PACK_ORIGINAL_FILEP(API_ID_fflush,
122 'd', ret, 0, stream, FD_API_OTHER, "p",
123 voidp_to_uint64(stream));
127 int fclose(FILE* stream)
129 static int (*fclosep)(FILE* stream);
132 GET_REAL_FUNC(fclose, LIBC);
134 PRE_PROBEBLOCK_BEGIN();
135 GET_FD_FROM_FILEP(stream);
137 _fstatret = fstat(_fd, &_statbuf);
139 PRE_PROBEBLOCK_END();
141 ret = fclosep(stream);
143 POST_PACK_PROBEBLOCK_BEGIN();
145 PACK_COMMON_BEGIN(MSG_PROBE_RESOURCE,
147 "p", voidp_to_uint64(stream));
148 PACK_COMMON_END('d', ret, newerrno, blockresult);
149 POST_PACK_PROBEBLOCK_MIDDLE_FD(0, _fd, FD_API_CLOSE);
150 POST_PACK_PROBEBLOCK_END();
155 FILE * tmpfile ( void )
157 static FILE* (*tmpfilep) ( void );
160 BEFORE_ORIGINAL_FILE(tmpfile, LIBC);
161 _filepath = "<temp file>";
163 AFTER_PACK_ORIGINAL_FILEP(API_ID_tmpfile,
164 'p', fret, 0, fret, FD_API_OPEN, "s", "");
168 int fgetpos(FILE* stream, fpos_t* position)
170 static int (*fgetposp)(FILE* stream, fpos_t* position);
172 BEFORE_ORIGINAL_FILE(fgetpos, LIBC);
173 ret = fgetposp(stream, position);
174 AFTER_PACK_ORIGINAL_FILEP(API_ID_fgetpos,
175 'd', ret, 0, stream, FD_API_OTHER, "pp",
176 voidp_to_uint64(stream),
177 voidp_to_uint64(position));
181 int fseek(FILE* stream, long int offset, int origin)
183 static int (*fseekp)(FILE* stream, long int offset, int origin);
185 BEFORE_ORIGINAL_FILE(fseek, LIBC);
186 ret = fseekp(stream, offset, origin);
187 AFTER_PACK_ORIGINAL_FILEP(API_ID_fseek,
188 'd', ret, (unsigned int)offset, stream, FD_API_OTHER,
189 "pxd", voidp_to_uint64(stream),
190 (uint64_t)(offset), origin);
194 int fsetpos(FILE* stream, const fpos_t* pos)
196 static int (*fsetposp)(FILE* stream, const fpos_t* pos);
198 BEFORE_ORIGINAL_FILE(fsetpos, LIBC);
199 ret = fsetposp(stream, pos);
200 AFTER_PACK_ORIGINAL_FILEP(API_ID_fsetpos,
201 'd', ret, 0, stream, FD_API_OTHER, "pp",
202 voidp_to_uint64(stream), voidp_to_uint64(pos));
206 long int ftell(FILE* stream)
208 static long int (*ftellp)(FILE* stream);
211 BEFORE_ORIGINAL_FILE(ftell, LIBC);
213 lret = ftellp(stream);
215 AFTER_PACK_ORIGINAL_FILEP(API_ID_ftell,
216 'x', lret, 0, stream, FD_API_OTHER, "p",
217 voidp_to_uint64(stream));
222 void rewind(FILE* stream)
224 static void (*rewindp)(FILE* stream);
226 BEFORE_ORIGINAL_FILE(rewind, LIBC);
230 AFTER_PACK_ORIGINAL_FILEP(API_ID_rewind,
231 'v', 0, 0, stream, FD_API_OTHER, "p",
232 voidp_to_uint64(stream));
235 void clearerr(FILE* stream)
237 static void (*clearerrp)(FILE* stream);
239 BEFORE_ORIGINAL_FILE(clearerr, LIBC);
243 AFTER_PACK_ORIGINAL_FILEP(API_ID_clearerr,
244 'v', 0, 0, stream, FD_API_OTHER, "p",
245 voidp_to_uint64(stream));
248 int feof(FILE* stream)
250 static int (*feofp)(FILE* stream);
252 BEFORE_ORIGINAL_FILE(feof, LIBC);
254 AFTER_PACK_ORIGINAL_FILEP(API_ID_feof,
255 'd', ret, 0, stream, FD_API_OTHER, "p",
256 voidp_to_uint64(stream));
260 int ferror(FILE* stream)
262 static int (*ferrorp)(FILE* stream);
264 BEFORE_ORIGINAL_FILE(ferror, LIBC);
265 ret = ferrorp(stream);
266 AFTER_PACK_ORIGINAL_FILEP(API_ID_ferror,
267 'd', ret, 0, stream, FD_API_OTHER, "p",
268 voidp_to_uint64(stream));
272 int fileno(FILE* stream)
274 static int (*filenop)(FILE* stream);
276 BEFORE_ORIGINAL_FILE(fileno, LIBC);
277 ret = filenop(stream);
278 AFTER_PACK_ORIGINAL_FILEP(API_ID_fileno,
279 'd', ret, 0, stream, FD_API_OTHER, "p",
280 voidp_to_uint64(stream));
286 // *******************************************************************
287 // File read / write APIs
288 // *******************************************************************
290 int vfprintf(FILE* stream, const char* format, va_list arg)
292 static int (*vfprintfp)(FILE* stream, const char* format, va_list arg);
294 BEFORE_ORIGINAL_START_END_FILEP(API_ID_vfprintf, 'd', vfprintf, LIBC, stream,
295 FD_API_WRITE_START, "ps",
296 voidp_to_uint64(stream), format);
298 ret = vfprintfp(stream, format, arg);
300 AFTER_ORIGINAL_START_END_FILEP(API_ID_vfprintf, 'd', ret, ret, stream,
301 FD_API_WRITE_END, "ps",
302 voidp_to_uint64(stream), format);
307 int vfscanf(FILE* stream, const char* format, va_list arg)
309 static int (*vfscanfp)(FILE* stream, const char* format, va_list arg);
311 BEFORE_ORIGINAL_START_END_FILEP(API_ID_vfscanf, 'd', vfscanf, LIBC, stream,
312 FD_API_READ_START, "ps",
313 voidp_to_uint64(stream), format);
315 ret = vfscanfp(stream, format, arg);
317 AFTER_ORIGINAL_START_END_FILEP(API_ID_vfscanf, 'd', ret, ret, stream,
318 FD_API_READ_END, "ps",
319 voidp_to_uint64(stream), format);
324 int fgetc(FILE* stream)
326 static int (*fgetcp)(FILE* stream);
328 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fgetc, 'd', fgetc, LIBC, stream,
329 FD_API_READ_START, "p",
330 voidp_to_uint64(stream));
332 ret = fgetcp(stream);
334 AFTER_ORIGINAL_START_END_FILEP(API_ID_fgetc, 'd', ret, (ret != EOF), stream,
335 FD_API_READ_END, "p",
336 voidp_to_uint64(stream));
341 #if 0 // why is this commented?
342 char* fgets(char* str, int size, FILE* stream)
344 static char* (*fgetsp)(char* str, int num, FILE* stream);
347 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fgets, 'p', FD_API_READ_START,
348 fgets, LIBC, stream, "sdp", str, size, stream);
350 cret = fgetsp(str, size, stream);
352 AFTER_ORIGINAL_START_END_FILEP(API_ID_fgets, 'p', cret, (ret == NULL ? 0 : strlen(cret)),
353 stream, FD_API_READ_END, "sdp", str, size, stream);
359 int fputc(int character, FILE* stream)
361 static int (*fputcp)(int character, FILE* stream);
363 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fputc, 'd', fputc, LIBC, stream,
364 FD_API_WRITE_START, "dp", character,
365 voidp_to_uint64(stream));
367 ret = fputcp(character, stream);
369 AFTER_ORIGINAL_START_END_FILEP(API_ID_fputc, 'd', ret, (ret == EOF ? 0 : 1),
370 stream, FD_API_WRITE_END, "dp",
371 character, voidp_to_uint64(stream));
376 int fputs(const char* str, FILE* stream)
378 static int (*fputsp)(const char* str, FILE* stream);
380 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fputs, 'd', fputs, LIBC, stream,
381 FD_API_WRITE_START, "sp", str,
382 voidp_to_uint64(stream));
384 ret = fputsp(str, stream);
386 AFTER_ORIGINAL_START_END_FILEP(API_ID_fputs, 'd', ret, ret, stream,
387 FD_API_WRITE_END, "sp", str,
388 voidp_to_uint64(stream));
393 int getc(FILE* stream)
395 static int (*getcp)(FILE* stream);
397 BEFORE_ORIGINAL_START_END_FILEP(API_ID_getc, 'd', getc, LIBC, stream,
398 FD_API_READ_START, "p",
399 voidp_to_uint64(stream));
403 AFTER_ORIGINAL_START_END_FILEP(API_ID_getc, 'd', ret, (ret == EOF ? 0 : 1), stream,
404 FD_API_READ_END, "p",
405 voidp_to_uint64(stream));
410 int putc(int character, FILE* stream)
412 static int (*putcp)(int character, FILE* stream);
414 BEFORE_ORIGINAL_START_END_FILEP(API_ID_putc, 'd', putc, LIBC, stream,
415 FD_API_WRITE_START, "dp", character,
416 voidp_to_uint64(stream));
418 ret = putcp(character, stream);
420 AFTER_ORIGINAL_START_END_FILEP(API_ID_putc, 'd', ret, (ret == EOF ? 0 : 1),
421 stream, FD_API_WRITE_END, "dp",
422 character, voidp_to_uint64(stream));
427 int ungetc(int character, FILE* stream)
429 static int (*ungetcp)(int character, FILE* stream);
431 BEFORE_ORIGINAL_START_END_FILEP(API_ID_putc, 'd', ungetc, LIBC, stream,
432 FD_API_WRITE_START, "dp", character,
433 voidp_to_uint64(stream));
435 ret = ungetcp(character, stream);
437 AFTER_ORIGINAL_START_END_FILEP(API_ID_ungetc, 'd', ret, 0, stream,
438 FD_API_OTHER, "dp", character,
439 voidp_to_uint64(stream));
444 size_t fread(void* ptr, size_t size, size_t count, FILE* stream)
446 static size_t (*freadp)(void* ptr, size_t size, size_t count, FILE* stream);
449 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fread, 'x', fread, LIBC, stream,
450 FD_API_READ_START, "pxxp",
451 voidp_to_uint64(ptr),
454 voidp_to_uint64(stream));
456 tret = freadp(ptr, size, count, stream);
458 AFTER_ORIGINAL_START_END_FILEP(API_ID_fread, 'x', tret, tret*size, stream,
459 FD_API_READ_END, "pxxp",
460 voidp_to_uint64(ptr),
463 voidp_to_uint64(stream));
468 size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream)
470 static size_t (*fwritep)(const void* ptr, size_t size, size_t count, FILE* stream);
473 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fwrite, 'x', fwrite, LIBC, stream,
474 FD_API_WRITE_START, "pxxp",
475 voidp_to_uint64(ptr),
478 voidp_to_uint64(stream));
480 tret = fwritep(ptr, size, count, stream);
482 AFTER_ORIGINAL_START_END_FILEP(API_ID_fwrite, 'x', tret, tret*size, stream,
483 FD_API_WRITE_END, "pxxp",
484 voidp_to_uint64(ptr),
487 voidp_to_uint64(stream));
492 // *********************************************************
493 // variable parameter function
494 // *********************************************************
495 int fprintf(FILE* stream, const char* format, ...)
497 static int (*vfprintfp)(FILE* stream, const char* format, ...);
499 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fprintf, 'd', vfprintf, LIBC, stream,
500 FD_API_WRITE_START, "ps",
501 voidp_to_uint64(stream), format);
504 va_start(arg, format);
506 ret = vfprintfp(stream, format, arg);
508 AFTER_ORIGINAL_START_END_FILEP(API_ID_fprintf, 'd', ret, ret, stream,
509 FD_API_WRITE_END, "ps",
510 voidp_to_uint64(stream), format);
517 int fscanf(FILE* stream, const char* format, ...)
519 static int (*vfscanfp)(FILE* stream, const char* format, ...);
521 BEFORE_ORIGINAL_START_END_FILEP(API_ID_fscanf, 'd', vfscanf, LIBC, stream,
522 FD_API_READ_START, "ps",
523 voidp_to_uint64(stream), format);
526 va_start(arg, format);
528 ret = vfscanfp(stream, format, arg);
530 AFTER_ORIGINAL_START_END_FILEP(API_ID_fscanf, 'd', ret, ret, stream,
531 FD_API_READ_END, "ps",
532 voidp_to_uint64(stream), format);
539 #if !defined(DA_DEBUG_LOG) && !defined(PRINT_STDOUT)
540 int printf(const char* format, ...)
542 static int (*vprintfp)(const char* format, ...);
544 BEFORE_ORIGINAL_START_END_NOFD(API_ID_printf, 'd', vprintf, LIBC,
545 FD_API_WRITE_START, "s", format);
548 va_start(arg, format);
549 ret = vprintfp(format, arg);
551 AFTER_ORIGINAL_START_END_NOFD(API_ID_printf, 'd', ret, ret,
552 FD_API_WRITE_END, "s", format);
560 int scanf(const char* format, ...)
562 static int (*vscanfp)(const char* format, ...);
564 BEFORE_ORIGINAL_START_END_NOFD(API_ID_scanf, 'd', vscanf, LIBC,
565 FD_API_READ_START, "s", format);
568 va_start(arg, format);
569 ret = vscanfp(format, arg);
571 AFTER_ORIGINAL_START_END_NOFD(API_ID_scanf, 'd', ret, ret,
572 FD_API_READ_END, "s", format);
581 static int (*getcharp)();
583 BEFORE_ORIGINAL_START_END_NOFD(API_ID_getchar, 'd', getchar, LIBC,
584 FD_API_READ_START, "", 0);
588 AFTER_ORIGINAL_START_END_NOFD(API_ID_getchar, 'd', ret, (ret == EOF ? 0 : 1),
589 FD_API_READ_END, "", 0);
596 static int (*putcharp)(int c);
598 BEFORE_ORIGINAL_START_END_NOFD(API_ID_putchar, 'd', putchar, LIBC,
599 FD_API_WRITE_START, "d", c);
603 AFTER_ORIGINAL_START_END_NOFD(API_ID_putchar, 'd', ret, (ret == EOF ? 0 : 1),
604 FD_API_WRITE_END, "d", c);
609 char* gets(char* str)
611 static char* (*getsp)(char* str);
614 BEFORE_ORIGINAL_START_END_NOFD(API_ID_gets, 'p', gets, LIBC,
615 FD_API_READ_START, "s", str);
619 AFTER_ORIGINAL_START_END_NOFD(API_ID_gets, 'p', cret, strlen(cret),
620 FD_API_READ_END, "s", str);
625 #if !defined(DA_DEBUG_LOG) && !defined(PRINT_STDOUT)
626 int puts(const char* str)
628 static int (*putsp)(const char* str);
630 BEFORE_ORIGINAL_START_END_NOFD(API_ID_puts, 'd', puts, LIBC,
631 FD_API_WRITE_START, "s", str);
635 AFTER_ORIGINAL_START_END_NOFD(API_ID_puts, 'd', ret, ret,
636 FD_API_WRITE_END, "s", str);
644 void setbuf(FILE* stream, char* buf)
646 static void (*setbufp)(FILE* stream, char* buf);
648 BEFORE_ORIGINAL_FILE(setbuf, LIBC);
650 setbufp(stream, buf);
652 AFTER_PACK_ORIGINAL_FILEP(API_ID_setbuf,
653 'v', 0, 0, stream, FD_API_OTHER, "pp",
654 voidp_to_uint64(stream),
655 voidp_to_uint64(buf));
658 void setbuffer(FILE* stream, char* buf, size_t size)
660 static void (*setbufferp)(FILE* stream, char* buf, size_t size);
662 BEFORE_ORIGINAL_FILE(setbuffer, LIBC);
664 setbufferp(stream, buf, size);
666 AFTER_PACK_ORIGINAL_FILEP(API_ID_setbuffer,
667 'v', 0, size, stream, FD_API_OTHER,
668 "ppx", voidp_to_uint64(stream),
669 voidp_to_uint64(buf), (uint64_t)(size));
672 void setlinebuf(FILE* stream)
674 static int (*setlinebufp)(FILE* stream);
676 BEFORE_ORIGINAL_FILE(setlinebuf, LIBC);
680 AFTER_PACK_ORIGINAL_FILEP(API_ID_setlinebuf,
681 'v', 0, 0, stream, FD_API_OTHER, "p",
682 voidp_to_uint64(stream));
685 int setvbuf(FILE* stream, char* buf, int mode, size_t size)
687 static int (*setvbufp)(FILE* stream, char* buf, int mode, size_t size);
689 BEFORE_ORIGINAL_FILE(setvbuf, LIBC);
690 ret = setvbufp(stream,buf,mode,size);
691 AFTER_PACK_ORIGINAL_FILEP(API_ID_setvbuf,
692 'd', ret, size, stream, FD_API_OTHER,
694 voidp_to_uint64(stream),
695 voidp_to_uint64(buf), mode,