summaryrefslogtreecommitdiffstats
path: root/newlib/libc/include
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/include')
-rw-r--r--newlib/libc/include/stdlib.h1
-rw-r--r--newlib/libc/include/sys/reent.h35
2 files changed, 30 insertions, 6 deletions
diff --git a/newlib/libc/include/stdlib.h b/newlib/libc/include/stdlib.h
index 38890675a..ca7c2a73f 100644
--- a/newlib/libc/include/stdlib.h
+++ b/newlib/libc/include/stdlib.h
@@ -108,6 +108,7 @@ int _EXFUN(system,(const char *__string));
long _EXFUN(a64l,(const char *__input));
char * _EXFUN(l64a,(long __input));
char * _EXFUN(_l64a_r,(struct _reent *,long __input));
+int _EXFUN(on_exit,(_VOID (*__func)(int, _PTR),_PTR __arg));
int _EXFUN(putenv,(const char *__string));
int _EXFUN(_putenv_r,(struct _reent *, const char *__string));
int _EXFUN(setenv,(const char *__string, const char *__value, int __overwrite));
diff --git a/newlib/libc/include/sys/reent.h b/newlib/libc/include/sys/reent.h
index 7a5305328..5303ed3dd 100644
--- a/newlib/libc/include/sys/reent.h
+++ b/newlib/libc/include/sys/reent.h
@@ -72,11 +72,15 @@ struct _atexit {
struct _atexit *_next; /* next in list */
int _ind; /* next index in this table */
void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */
+ void *_fnargs[_ATEXIT_SIZE]; /* fn args for on_exit */
+ __uint32_t _fntypes; /* type of exit routine */
};
#else
struct _atexit {
int _ind; /* next index in this table */
void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */
+ void *_fnargs[_ATEXIT_SIZE]; /* fn args for on_exit */
+ __uint32_t _fntypes; /* type of exit routine */
};
#endif
@@ -304,14 +308,15 @@ struct _reent
};
#define _REENT_INIT(var) \
- { &var.__sf_fake, &var.__sf_fake, &var.__sf_fake, 0, 0, _NULL, 0, 0, \
+ { (struct __sFILE *)&var.__sf_fake, (struct __sFILE *)&var.__sf_fake, \
+ (struct __sFILE *)&var.__sf_fake, 0, 0, _NULL, 0, 0, \
"C", _NULL, _NULL, 0, 0, _NULL, _NULL, _NULL, _NULL, _NULL, \
- { 0, _NULL }, { _NULL, 0, _NULL }, 0, _NULL }
+ { 0, _NULL, _NULL, 0 }, { _NULL, 0, _NULL }, _NULL, 0, _NULL }
#define _REENT_INIT_PTR(var) \
- { var->_stdin = &var->__sf_fake; \
- var->_stdout = &var->__sf_fake; \
- var->_stderr = &var->__sf_fake; \
+ { var->_stdin = (struct __sFILE *)&var->__sf_fake; \
+ var->_stdout = (struct __sFILE *)&var->__sf_fake; \
+ var->_stderr = (struct __sFILE *)&var->__sf_fake; \
var->_errno = 0; \
var->_inc = 0; \
var->_emergency = _NULL; \
@@ -328,12 +333,21 @@ struct _reent
var->_asctime_buf = _NULL; \
var->_sig_func = _NULL; \
var->_atexit._ind = 0; \
- var->_atexit._fns = _NULL}; \
+ var->_atexit._fns[0] = _NULL; \
+ var->_atexit._fnargs[0] = _NULL; \
+ var->_atexit._fntypes = 0; \
var->__sglue._next = _NULL; \
var->__sglue._niobs = 0; \
var->__sglue._iobs = _NULL; \
var->__sf = 0; \
var->_misc = _NULL; \
+ var->__sf_fake._p = _NULL; \
+ var->__sf_fake._r = 0; \
+ var->__sf_fake._w = 0; \
+ var->__sf_fake._flags = 0; \
+ var->__sf_fake._file = 0; \
+ var->__sf_fake._lbfsize = 0; \
+ var->__sf_fake._data = _NULL; \
}
/* signal info */
@@ -537,6 +551,15 @@ struct _reent
var->_new._reent._mbtowc_state = 0; \
var->_new._reent._wctomb_state = 0; \
var->_new._reent._l64a_buf[0] = '\0'; \
+ var->_atexit = _NULL; \
+ var->_atexit0._ind = 0; \
+ var->_atexit0._fns[0] = _NULL; \
+ var->_atexit0._fntypes = 0; \
+ var->_sig_func = _NULL; \
+ var->__sglue._next = _NULL; \
+ var->__sglue._niobs = 0; \
+ var->__sglue._iobs = _NULL; \
+ memset(var->__sf,0,sizeof(var->__sf)); \
}
#define _REENT_CHECK_RAND48(ptr) /* nothing */