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"
47 static enum DaOptions _sopt = OPT_FILE;
49 FILE* fopen(const char* filename, const char* mode)
51 static FILE* (*fopenp)(const char* filename, const char* mode);
54 BEFORE_ORIGINAL_FILE_NOFILTER(fopen, LIBC);
55 _filepath = (char*)filename;
57 fret = fopenp(filename, mode);
59 AFTER_PACK_ORIGINAL_FILEP(API_ID_fopen,
60 fret, 0, fret, FD_API_OPEN, "ss", filename, mode);
65 FILE* freopen(const char * filename, const char * mode, FILE * stream)
67 static FILE* (*freopenp)(const char * filename, const char * mode, FILE * stream);
70 BEFORE_ORIGINAL_FILE_NOFILTER(freopen, LIBC);
71 _filepath = (char*)filename;
73 fret = freopenp(filename, mode, stream);
75 AFTER_PACK_ORIGINAL_FILEP(API_ID_freopen,
76 fret, 0, fret, FD_API_OPEN, "ssp", filename, mode, stream);
81 FILE* fdopen(int fildes, const char *mode)
83 static FILE* (*fdopenp)(int fildes, const char *mode);
86 BEFORE_ORIGINAL_FILE_NOFILTER(fdopen, LIBC);
88 fret = fdopenp(fildes, mode);
90 AFTER_PACK_ORIGINAL_FILEP(API_ID_fdopen,
91 fret, 0, fret, FD_API_OPEN, "ds", fildes, mode);
96 int fflush(FILE* stream)
98 static int (*fflushp)(FILE* stream);
100 BEFORE_ORIGINAL_FILE(fflush, LIBC);
101 ret = fflushp(stream);
102 AFTER_PACK_ORIGINAL_FILEP(API_ID_fflush,
103 ret, 0, stream, FD_API_OTHER, "p", stream);
107 int fclose(FILE* stream)
109 static int (*fclosep)(FILE* stream);
112 GET_REAL_FUNC(fclose, LIBC);
115 PRE_PROBEBLOCK_BEGIN();
116 GET_FD_FROM_FILEP(stream);
118 _fstatret = fstat(_fd, &_statbuf);
120 PRE_PROBEBLOCK_END();
122 ret = fclosep(stream);
124 POST_PACK_PROBEBLOCK_BEGIN();
126 PACK_COMMON_BEGIN(MSG_PROBE_RESOURCE,
129 PACK_COMMON_END(ret, newerrno, blockresult);
130 POST_PACK_PROBEBLOCK_MIDDLE_FD(0, _fd, FD_API_CLOSE);
131 POST_PACK_PROBEBLOCK_END();
136 int remove(const char* filename)
138 static int (*removep)(const char* filename);
140 BEFORE_ORIGINAL_FILE(remove, LIBC);
141 _filepath = (char*)filename;
142 ret = removep(filename);
143 AFTER_PACK_ORIGINAL_NOFD(API_ID_remove,
144 ret, 0, FD_API_DIRECTORY, "s", filename);
148 int rename(const char* oldname, const char* newname)
150 static int (*renamep)(const char* oldname, const char* newname);
152 BEFORE_ORIGINAL_FILE(rename, LIBC);
153 _filepath = (char*)newname;
154 ret = renamep(oldname, newname);
155 AFTER_PACK_ORIGINAL_NOFD(API_ID_rename,
156 ret, 0, FD_API_DIRECTORY, "ss", oldname, newname);
160 FILE * tmpfile ( void )
162 static FILE* (*tmpfilep) ( void );
165 BEFORE_ORIGINAL_FILE_NOFILTER(tmpfile, LIBC);
166 _filepath = "<temp file>";
168 AFTER_PACK_ORIGINAL_FILEP(API_ID_tmpfile,
169 fret, 0, fret, FD_API_OPEN, "s", "");
173 int fgetpos(FILE* stream, fpos_t* position)
175 static int (*fgetposp)(FILE* stream, fpos_t* position);
177 BEFORE_ORIGINAL_FILE(fgetpos, LIBC);
178 ret = fgetposp(stream, position);
179 AFTER_PACK_ORIGINAL_FILEP(API_ID_fgetpos,
180 ret, 0, stream, FD_API_OTHER, "pp", stream, position);
184 int fseek(FILE* stream, long int offset, int origin)
186 static int (*fseekp)(FILE* stream, long int offset, int origin);
188 BEFORE_ORIGINAL_FILE(fseek, LIBC);
189 ret = fseekp(stream, offset, origin);
190 AFTER_PACK_ORIGINAL_FILEP(API_ID_fseek,
191 ret, (unsigned int)offset, stream, FD_API_OTHER,
192 "pxd", stream, offset, origin);
196 int fsetpos(FILE* stream, const fpos_t* pos)
198 static int (*fsetposp)(FILE* stream, const fpos_t* pos);
200 BEFORE_ORIGINAL_FILE(fsetpos, LIBC);
201 ret = fsetposp(stream, pos);
202 AFTER_PACK_ORIGINAL_FILEP(API_ID_fsetpos,
203 ret, 0, stream, FD_API_OTHER, "pp", stream, pos);
207 long int ftell(FILE* stream)
209 static long int (*ftellp)(FILE* stream);
212 BEFORE_ORIGINAL_FILE(ftell, LIBC);
214 lret = ftellp(stream);
216 AFTER_PACK_ORIGINAL_FILEP(API_ID_ftell,
217 lret, 0, stream, FD_API_OTHER, "p", 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 0, 0, stream, FD_API_OTHER, "p", stream);
234 void clearerr(FILE* stream)
236 static void (*clearerrp)(FILE* stream);
238 BEFORE_ORIGINAL_FILE(clearerr, LIBC);
242 AFTER_PACK_ORIGINAL_FILEP(API_ID_clearerr,
243 0, 0, stream, FD_API_OTHER, "p", stream);
246 int feof(FILE* stream)
248 static int (*feofp)(FILE* stream);
250 BEFORE_ORIGINAL_FILE(feof, LIBC);
252 AFTER_PACK_ORIGINAL_FILEP(API_ID_feof,
253 ret, 0, stream, FD_API_OTHER, "p", stream);
257 int ferror(FILE* stream)
259 static int (*ferrorp)(FILE* stream);
261 BEFORE_ORIGINAL_FILE(ferror, LIBC);
262 ret = ferrorp(stream);
263 AFTER_PACK_ORIGINAL_FILEP(API_ID_ferror,
264 ret, 0, stream, FD_API_OTHER, "p", stream);
268 int fileno(FILE* stream)
270 static int (*filenop)(FILE* stream);
272 BEFORE_ORIGINAL_FILE(fileno, LIBC);
273 ret = filenop(stream);
274 AFTER_PACK_ORIGINAL_FILEP(API_ID_fileno,
275 ret, 0, stream, FD_API_OTHER, "p", stream);
279 void perror(const char* string)
281 static void (*perrorp)(const char* string);
283 BEFORE_ORIGINAL_FILE(perror, LIBC);
287 AFTER_PACK_ORIGINAL_NOFD(API_ID_perror,
288 0, 0, FD_API_OTHER, "s", string);
291 // *******************************************************************
292 // File read / write APIs
293 // *******************************************************************
295 int vfprintf(FILE* stream, const char* format, va_list arg)
297 static int (*vfprintfp)(FILE* stream, const char* format, va_list arg);
299 BEFORE_ORIGINAL_FILE(vfprintf, LIBC);
300 FILE_API_START_BLOCK(API_ID_vfprintf, FD_API_WRITE_START);
301 ret = vfprintfp(stream, format, arg);
302 AFTER_PACK_ORIGINAL_FILEP(API_ID_vfprintf,
303 ret, ret, stream, FD_API_WRITE_END, "ps", 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_FILE(vfscanf, LIBC);
312 FILE_API_START_BLOCK(API_ID_vfscanf, FD_API_READ_START);
313 ret = vfscanfp(stream, format, arg);
314 AFTER_PACK_ORIGINAL_FILEP(API_ID_vfscanf,
315 ret, ret, stream, FD_API_READ_END, "ps", stream, format);
319 int fgetc(FILE* stream)
321 static int (*fgetcp)(FILE* stream);
323 BEFORE_ORIGINAL_FILE(fgetc, LIBC);
324 FILE_API_START_BLOCK(API_ID_fgetc, FD_API_READ_START);
325 ret = fgetcp(stream);
326 AFTER_PACK_ORIGINAL_FILEP(API_ID_fgetc,
327 ret, (ret == EOF ? 0 : 1), stream, FD_API_READ_END, "p", stream);
331 #if 0 // why is this commented?
332 char* fgets(char* str, int size, FILE* stream)
334 static char* (*fgetsp)(char* str, int num, FILE* stream);
337 BEFORE_ORIGINAL_FILE(fgets, LIBC);
339 FILE_API_START_BLOCK(API_ID_fgets, FD_API_READ_START);
341 cret = fgetsp(str, size, stream);
343 AFTER_PACK_ORIGINAL_FILEP(API_ID_fgets, cret, (ret == NULL ? 0 : strlen(cret)),
344 stream, FD_API_READ_END, "sdp", str, size, stream);
350 int fputc(int character, FILE* stream)
352 static int (*fputcp)(int character, FILE* stream);
354 BEFORE_ORIGINAL_FILE(fputc, LIBC);
355 FILE_API_START_BLOCK(API_ID_fputc, FD_API_WRITE_START);
356 ret = fputcp(character, stream);
357 AFTER_PACK_ORIGINAL_FILEP(API_ID_fputc,
358 ret, (ret == EOF ? 0 : 1), stream, FD_API_WRITE_END,
359 "dp", character, stream);
363 int fputs(const char* str, FILE* stream)
365 static int (*fputsp)(const char* str, FILE* stream);
367 BEFORE_ORIGINAL_FILE(fputs, LIBC);
368 FILE_API_START_BLOCK(API_ID_fputs, FD_API_WRITE_START);
369 ret = fputsp(str, stream);
370 AFTER_PACK_ORIGINAL_FILEP(API_ID_fputs,
371 ret, ret, stream, FD_API_WRITE_END, "sp", str, stream);
375 int getc(FILE* stream)
377 static int (*getcp)(FILE* stream);
379 BEFORE_ORIGINAL_FILE(getc, LIBC);
380 FILE_API_START_BLOCK(API_ID_getc, FD_API_READ_START);
382 AFTER_PACK_ORIGINAL_FILEP(API_ID_getc,
383 ret, (ret == EOF ? 0 : 1), stream, FD_API_READ_END, "p", stream);
387 int putc(int character, FILE* stream)
389 static int (*putcp)(int character, FILE* stream);
391 BEFORE_ORIGINAL_FILE(putc, LIBC);
392 FILE_API_START_BLOCK(API_ID_putc, FD_API_WRITE_START);
393 ret = putcp(character, stream);
394 AFTER_PACK_ORIGINAL_FILEP(API_ID_putc,
395 ret, (ret == EOF ? 0 : 1), stream, FD_API_WRITE_END,
396 "dp", character, stream);
400 int ungetc(int character, FILE* stream)
402 static int (*ungetcp)(int character, FILE* stream);
404 BEFORE_ORIGINAL_FILE(ungetc, LIBC);
405 ret = ungetcp(character, stream);
406 AFTER_PACK_ORIGINAL_FILEP(API_ID_ungetc,
407 ret, 0, stream, FD_API_OTHER, "dp", character, stream);
411 size_t fread(void* ptr, size_t size, size_t count, FILE* stream)
413 static size_t (*freadp)(void* ptr, size_t size, size_t count, FILE* stream);
416 BEFORE_ORIGINAL_FILE(fread, LIBC);
418 FILE_API_START_BLOCK(API_ID_fread, FD_API_READ_START);
420 tret = freadp(ptr, size, count, stream);
422 AFTER_PACK_ORIGINAL_FILEP(API_ID_fread,
423 tret, 0, stream, FD_API_READ_END,
424 "pxxp", ptr, size, count, stream);
429 size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream)
431 static size_t (*fwritep)(const void* ptr, size_t size, size_t count, FILE* stream);
434 BEFORE_ORIGINAL_FILE(fwrite, LIBC);
436 FILE_API_START_BLOCK(API_ID_fwrite, FD_API_WRITE_START);
438 tret = fwritep(ptr, size, count, stream);
440 AFTER_PACK_ORIGINAL_FILEP(API_ID_fwrite,
441 tret, 0, stream, FD_API_WRITE_END,
442 "pxxp", ptr, size, count, stream);
447 // *********************************************************
448 // variable parameter function
449 // *********************************************************
450 int fprintf(FILE* stream, const char* format, ...)
452 static int (*vfprintfp)(FILE* stream, const char* format, ...);
454 BEFORE_ORIGINAL_FILE(vfprintf, LIBC);
456 FILE_API_START_BLOCK(API_ID_fprintf, FD_API_WRITE_START);
459 va_start(arg, format);
460 ret = vfprintfp(stream, format, arg);
462 AFTER_PACK_ORIGINAL_FILEP(API_ID_fprintf,
463 ret, ret, stream, FD_API_WRITE_END, "ps", stream, format);
469 int fscanf(FILE* stream, const char* format, ...)
471 static int (*vfscanfp)(FILE* stream, const char* format, ...);
473 BEFORE_ORIGINAL_FILE(vfscanf, LIBC);
475 FILE_API_START_BLOCK(API_ID_fscanf, FD_API_READ_START);
478 va_start(arg, format);
479 ret = vfscanfp(stream, format, arg);
481 AFTER_PACK_ORIGINAL_FILEP(API_ID_fscanf,
482 ret, ret, stream, FD_API_READ_END, "ps", stream, format);
488 #if !defined(DA_DEBUG_LOG) && !defined(PRINT_STDOUT)
489 int printf(const char* format, ...)
491 static int (*vprintfp)(const char* format, ...);
493 BEFORE_ORIGINAL_FILE(vprintf, LIBC);
495 FILE_API_START_BLOCK(API_ID_printf, FD_API_WRITE_START);
498 va_start(arg, format);
499 ret = vprintfp(format, arg);
501 AFTER_PACK_ORIGINAL_NOFD(API_ID_printf,
502 ret, ret, FD_API_WRITE_END, "s", format);
509 int scanf(const char* format, ...)
511 static int (*vscanfp)(const char* format, ...);
513 BEFORE_ORIGINAL_FILE(vscanf, LIBC);
515 FILE_API_START_BLOCK(API_ID_scanf, FD_API_READ_START);
518 va_start(arg, format);
519 ret = vscanfp(format, arg);
521 AFTER_PACK_ORIGINAL_NOFD(API_ID_scanf,
522 ret, ret, FD_API_READ_END, "s", format);
530 static int (*getcharp)();
532 BEFORE_ORIGINAL_FILE(getchar, LIBC);
533 FILE_API_START_BLOCK(API_ID_getchar, FD_API_READ_START);
535 AFTER_PACK_ORIGINAL_NOFD(API_ID_getchar,
536 ret, (ret == EOF ? 0 : 1), FD_API_READ_END, "s", "");
542 static int (*putcharp)(int c);
544 BEFORE_ORIGINAL_FILE(putchar, LIBC);
545 FILE_API_START_BLOCK(API_ID_putchar, FD_API_WRITE_START);
547 AFTER_PACK_ORIGINAL_NOFD(API_ID_putchar,
548 ret, (ret == EOF ? 0 : 1), FD_API_WRITE_END, "d", c);
552 char* gets(char* str)
554 static char* (*getsp)(char* str);
557 BEFORE_ORIGINAL_FILE(gets, LIBC);
559 FILE_API_START_BLOCK(API_ID_gets, FD_API_READ_START);
563 AFTER_PACK_ORIGINAL_NOFD(API_ID_gets,
564 cret, strlen(cret), FD_API_READ_END, "s", str);
569 #if !defined(DA_DEBUG_LOG) && !defined(PRINT_STDOUT)
570 int puts(const char* str)
572 static int (*putsp)(const char* str);
574 BEFORE_ORIGINAL_FILE(puts, LIBC);
575 FILE_API_START_BLOCK(API_ID_puts, FD_API_WRITE_START);
577 AFTER_PACK_ORIGINAL_NOFD(API_ID_puts,
578 ret, ret, FD_API_WRITE_END, "s", str);
583 char* tmpnam(char* str)
585 static char* (*tmpnamp)(char* str);
588 BEFORE_ORIGINAL_FILE(tmpnam, LIBC);
592 AFTER_PACK_ORIGINAL_NOFD(API_ID_tmpnam,
593 cret, 0, FD_API_OTHER, "s", str);
598 void setbuf(FILE* stream, char* buf)
600 static void (*setbufp)(FILE* stream, char* buf);
602 BEFORE_ORIGINAL_FILE(setbuf, LIBC);
604 setbufp(stream, buf);
606 AFTER_PACK_ORIGINAL_FILEP(API_ID_setbuf,
607 0, 0, stream, FD_API_OTHER, "pp", stream, buf);
610 void setbuffer(FILE* stream, char* buf, size_t size)
612 static void (*setbufferp)(FILE* stream, char* buf, size_t size);
614 BEFORE_ORIGINAL_FILE(setbuffer, LIBC);
616 setbufferp(stream, buf, size);
618 AFTER_PACK_ORIGINAL_FILEP(API_ID_setbuffer,
619 0, size, stream, FD_API_OTHER,
620 "ppx", stream, buf, size);
623 void setlinebuf(FILE* stream)
625 static int (*setlinebufp)(FILE* stream);
627 BEFORE_ORIGINAL_FILE(setlinebuf, LIBC);
631 AFTER_PACK_ORIGINAL_FILEP(API_ID_setlinebuf,
632 0, 0, stream, FD_API_OTHER, "p", stream);
635 int setvbuf(FILE* stream, char* buf, int mode, size_t size)
637 static int (*setvbufp)(FILE* stream, char* buf, int mode, size_t size);
639 BEFORE_ORIGINAL_FILE(setvbuf, LIBC);
640 ret = setvbufp(stream,buf,mode,size);
641 AFTER_PACK_ORIGINAL_FILEP(API_ID_setvbuf,
642 ret, size, stream, FD_API_OTHER,
643 "ppdx", stream, buf, mode, size);