From 3d219e70d33bea18a78a4c9f0c7b6e190d9fe95a Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 13 Aug 2015 13:44:33 +0300 Subject: [PATCH 01/86] add 'vita' system --- newlib/configure.host | 7 + newlib/libc/sys/configure | 282 +- newlib/libc/sys/configure.in | 1 + newlib/libc/sys/vita/Makefile.am | 18 + newlib/libc/sys/vita/Makefile.in | 465 +++ newlib/libc/sys/vita/aclocal.m4 | 983 ++++++ newlib/libc/sys/vita/configure | 4775 +++++++++++++++++++++++++++++ newlib/libc/sys/vita/configure.in | 7 + newlib/libc/sys/vita/crt0.c | 5 + newlib/libc/sys/vita/syscalls.c | 127 + 10 files changed, 6533 insertions(+), 137 deletions(-) create mode 100755 newlib/libc/sys/vita/Makefile.am create mode 100644 newlib/libc/sys/vita/Makefile.in create mode 100644 newlib/libc/sys/vita/aclocal.m4 create mode 100755 newlib/libc/sys/vita/configure create mode 100755 newlib/libc/sys/vita/configure.in create mode 100755 newlib/libc/sys/vita/crt0.c create mode 100755 newlib/libc/sys/vita/syscalls.c diff --git a/newlib/configure.host b/newlib/configure.host index dac461b731..c85d8041f9 100644 --- a/newlib/configure.host +++ b/newlib/configure.host @@ -397,6 +397,9 @@ case "${host}" in arc-*-*) sys_dir=arc ;; + arm*vita*) + sys_dir=vita + ;; arm*-*-*) sys_dir=arm if [ "x${newlib_may_supply_syscalls}" = "xno" ] ; then @@ -610,6 +613,10 @@ case "${host}" in arc-*-*) syscall_dir=syscalls ;; + arm*vita*) + syscall_dir=syscalls + newlib_cflags="${newlib_cflags} -D__DYNAMIC_REENT__ -DREENTRANT_SYSCALLS_PROVIDED" + ;; arm*-*-pe) syscall_dir=syscalls ;; diff --git a/newlib/libc/sys/configure b/newlib/libc/sys/configure index 6b2b6eac8a..8bbe8eea18 100755 --- a/newlib/libc/sys/configure +++ b/newlib/libc/sys/configure @@ -1,11 +1,9 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for newlib 2.2.0. +# Generated by GNU Autoconf 2.69 for newlib 2.2.0. # # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software -# Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -134,6 +132,31 @@ export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh @@ -167,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi -test x\$exitcode = x0 || exit 1" +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && @@ -220,21 +244,25 @@ IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : - # We cannot yet assume a decent shell, so we have to provide a - # neutralization value for shells without unset; and this also - # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi if test x$as_have_required = xno; then : @@ -336,6 +364,14 @@ $as_echo X"$as_dir" | } # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take @@ -457,6 +493,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -491,16 +531,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -512,28 +552,8 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -810,6 +830,7 @@ sysvi386 sysvnecv70 tic80 tirtos +vita w65 z8ksim' @@ -1266,8 +1287,6 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1535,9 +1554,9 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF newlib configure 2.2.0 -generated by GNU Autoconf 2.68 +generated by GNU Autoconf 2.69 -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1613,7 +1632,7 @@ $as_echo "$ac_try_echo"; } >&5 test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext + test -x conftest$ac_exeext }; then : ac_retval=0 else @@ -1813,7 +1832,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by newlib $as_me 2.2.0, which was -generated by GNU Autoconf 2.68. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2303,7 +2322,7 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -2472,7 +2491,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2512,7 +2531,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2563,7 +2582,7 @@ do test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -2616,7 +2635,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2944,7 +2963,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3112,7 +3131,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -3290,7 +3309,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3330,7 +3349,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3382,7 +3401,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3422,7 +3441,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3474,7 +3493,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3514,7 +3533,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3566,7 +3585,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_READELF="${ac_tool_prefix}readelf" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3606,7 +3625,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_READELF="readelf" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3789,7 +3808,7 @@ do for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue + as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in @@ -3923,7 +3942,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3963,7 +3982,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4015,7 +4034,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4055,7 +4074,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4107,7 +4126,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4147,7 +4166,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4269,7 +4288,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4309,7 +4328,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4362,7 +4381,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4403,7 +4422,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -4461,7 +4480,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4505,7 +4524,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4951,8 +4970,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#include -#include +struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -5181,7 +5199,7 @@ do for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue + as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -5247,7 +5265,7 @@ do for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue + as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -5314,7 +5332,7 @@ do for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue + as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in @@ -5570,7 +5588,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5614,7 +5632,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5954,7 +5972,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5994,7 +6012,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6271,7 +6289,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6311,7 +6329,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6376,7 +6394,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6416,7 +6434,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6475,7 +6493,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6515,7 +6533,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7105,7 +7123,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7145,7 +7163,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7197,7 +7215,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7237,7 +7255,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7289,7 +7307,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7329,7 +7347,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7381,7 +7399,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7421,7 +7439,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7473,7 +7491,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -7513,7 +7531,7 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -11456,7 +11474,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11459 "configure" +#line 11477 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11562,7 +11580,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11565 "configure" +#line 11583 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11854,6 +11872,8 @@ subdirs="$subdirs a29khif" tic80) subdirs="$subdirs tic80" ;; tirtos) subdirs="$subdirs tirtos" + ;; + vita) subdirs="$subdirs vita" ;; w65) subdirs="$subdirs w65" ;; @@ -12378,16 +12398,16 @@ if (echo >conf$$.file) 2>/dev/null; then # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. + # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -12447,28 +12467,16 @@ else as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -12490,7 +12498,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by newlib $as_me 2.2.0, which was -generated by GNU Autoconf 2.68. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -12547,10 +12555,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ newlib config.status 2.2.0 -configured by $0, generated by GNU Autoconf 2.68, +configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" -Copyright (C) 2010 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -12630,7 +12638,7 @@ fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' diff --git a/newlib/libc/sys/configure.in b/newlib/libc/sys/configure.in index 4c6266d60c..276d0f8b4a 100644 --- a/newlib/libc/sys/configure.in +++ b/newlib/libc/sys/configure.in @@ -47,6 +47,7 @@ if test -n "${sys_dir}"; then sysvnecv70) AC_CONFIG_SUBDIRS(sysvnecv70) ;; tic80) AC_CONFIG_SUBDIRS(tic80) ;; tirtos) AC_CONFIG_SUBDIRS(tirtos) ;; + vita) AC_CONFIG_SUBDIRS(vita) ;; w65) AC_CONFIG_SUBDIRS(w65) ;; z8ksim) AC_CONFIG_SUBDIRS(z8ksim) ;; esac; diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am new file mode 100755 index 0000000000..cf77a1cfab --- /dev/null +++ b/newlib/libc/sys/vita/Makefile.am @@ -0,0 +1,18 @@ +## Process this file with automake to generate Makefile.in + +AUTOMAKE_OPTIONS = cygnus + +INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) + +AM_CCASFLAGS = $(INCLUDES) + +noinst_LIBRARIES = lib.a + +lib_a_SOURCES = syscalls.c +lib_a_CCASFLAGS = $(AM_CCASFLAGS) +lib_a_CFLAGS = $(AM_CFLAGS) + +all-local: crt0.o + +ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. +CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in new file mode 100644 index 0000000000..5917807dd3 --- /dev/null +++ b/newlib/libc/sys/vita/Makefile.in @@ -0,0 +1,465 @@ +# Makefile.in generated by automake 1.12.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2012 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(top_srcdir)/../../../../mkinstalldirs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/../../../acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/../../../../mkinstalldirs +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +lib_a_AR = $(AR) $(ARFLAGS) +lib_a_LIBADD = +am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) +lib_a_OBJECTS = $(am_lib_a_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = +am__depfiles_maybe = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(lib_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NEWLIB_CFLAGS = @NEWLIB_CFLAGS@ +NO_INCLUDE_LIST = @NO_INCLUDE_LIST@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +READELF = @READELF@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +aext = @aext@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +libm_machine_dir = @libm_machine_dir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lpfx = @lpfx@ +machine_dir = @machine_dir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +newlib_basedir = @newlib_basedir@ +oext = @oext@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sys_dir = @sys_dir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = cygnus +INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) +AM_CCASFLAGS = $(INCLUDES) +noinst_LIBRARIES = lib.a +lib_a_SOURCES = syscalls.c +lib_a_CCASFLAGS = $(AM_CCASFLAGS) +lib_a_CFLAGS = $(AM_CFLAGS) +ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. +CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --cygnus'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --cygnus \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --cygnus Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +lib.a: $(lib_a_OBJECTS) $(lib_a_DEPENDENCIES) $(EXTRA_lib_a_DEPENDENCIES) + -rm -f lib.a + $(lib_a_AR) lib.a $(lib_a_OBJECTS) $(lib_a_LIBADD) + $(RANLIB) lib.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +.c.o: + $(COMPILE) -c $< + +.c.obj: + $(COMPILE) -c `$(CYGPATH_W) '$<'` + +lib_a-syscalls.o: syscalls.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-syscalls.o `test -f 'syscalls.c' || echo '$(srcdir)/'`syscalls.c + +lib_a-syscalls.obj: syscalls.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-syscalls.obj `if test -f 'syscalls.c'; then $(CYGPATH_W) 'syscalls.c'; else $(CYGPATH_W) '$(srcdir)/syscalls.c'; fi` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) + +clean-cscope: + -rm -f cscope.files + +cscope.files: clean-cscope cscopelist + +cscopelist: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files +check-am: +check: check-am +all-am: Makefile $(LIBRARIES) all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am all-local am--refresh check check-am \ + clean clean-cscope clean-generic clean-noinstLIBRARIES cscope \ + cscopelist ctags distclean distclean-compile distclean-generic \ + distclean-tags dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +all-local: crt0.o + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/newlib/libc/sys/vita/aclocal.m4 b/newlib/libc/sys/vita/aclocal.m4 new file mode 100644 index 0000000000..5fb014d775 --- /dev/null +++ b/newlib/libc/sys/vita/aclocal.m4 @@ -0,0 +1,983 @@ +# generated automatically by aclocal 1.12.6 -*- Autoconf -*- + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.12' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.12.6], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.12.6])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], +[$0: two- and three-arguments forms are deprecated. For more info, see: +http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +dnl Support for Objective C++ was only introduced in Autoconf 2.65, +dnl but we still cater to Autoconf 2.62. +m4_ifdef([AC_PROG_OBJCXX], +[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of '-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([../../../acinclude.m4]) diff --git a/newlib/libc/sys/vita/configure b/newlib/libc/sys/vita/configure new file mode 100755 index 0000000000..548219857f --- /dev/null +++ b/newlib/libc/sys/vita/configure @@ -0,0 +1,4775 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for newlib 2.2.0. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='newlib' +PACKAGE_TARNAME='newlib' +PACKAGE_VERSION='2.2.0' +PACKAGE_STRING='newlib 2.2.0' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="crt0.c" +ac_subst_vars='LTLIBOBJS +LIBOBJS +sys_dir +machine_dir +libm_machine_dir +lpfx +aext +oext +OBJEXT +USE_LIBTOOL_FALSE +USE_LIBTOOL_TRUE +ELIX_LEVEL_4_FALSE +ELIX_LEVEL_4_TRUE +ELIX_LEVEL_3_FALSE +ELIX_LEVEL_3_TRUE +ELIX_LEVEL_2_FALSE +ELIX_LEVEL_2_TRUE +ELIX_LEVEL_1_FALSE +ELIX_LEVEL_1_TRUE +ELIX_LEVEL_0_FALSE +ELIX_LEVEL_0_TRUE +LDFLAGS +NO_INCLUDE_LIST +NEWLIB_CFLAGS +CCASFLAGS +CCAS +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +READELF +RANLIB +AR +AS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +newlib_basedir +MAY_SUPPLY_SYSCALLS_FALSE +MAY_SUPPLY_SYSCALLS_TRUE +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_multilib +enable_target_optspace +enable_malloc_debugging +enable_newlib_multithread +enable_newlib_iconv +enable_newlib_elix_level +enable_newlib_io_float +enable_newlib_supplied_syscalls +enable_dependency_tracking +enable_maintainer_mode +' + ac_precious_vars='build_alias +host_alias +target_alias +CCAS +CCASFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures newlib 2.2.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/newlib] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of newlib 2.2.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-multilib build many library versions (default) + --enable-target-optspace optimize for space + --enable-malloc-debugging indicate malloc debugging requested + --enable-newlib-multithread enable support for multiple threads + --enable-newlib-iconv enable iconv library support + --enable-newlib-elix-level supply desired elix library level (1-4) + --disable-newlib-io-float disable printf/scanf family float support + --disable-newlib-supplied-syscalls disable newlib from supplying syscalls + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + +Some influential environment variables: + CCAS assembler compiler command (defaults to CC) + CCASFLAGS assembler compiler flags (defaults to CFLAGS) + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +newlib configure 2.2.0 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by newlib $as_me 2.2.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_aux_dir= +for ac_dir in ../../../.. "$srcdir"/../../../..; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../../.. \"$srcdir\"/../../../.." "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +am__api_version='1.12' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +# Check whether --enable-multilib was given. +if test "${enable_multilib+set}" = set; then : + enableval=$enable_multilib; case "${enableval}" in + yes) multilib=yes ;; + no) multilib=no ;; + *) as_fn_error $? "bad value ${enableval} for multilib option" "$LINENO" 5 ;; + esac +else + multilib=yes +fi + +# Check whether --enable-target-optspace was given. +if test "${enable_target_optspace+set}" = set; then : + enableval=$enable_target_optspace; case "${enableval}" in + yes) target_optspace=yes ;; + no) target_optspace=no ;; + *) as_fn_error $? "bad value ${enableval} for target-optspace option" "$LINENO" 5 ;; + esac +else + target_optspace= +fi + +# Check whether --enable-malloc-debugging was given. +if test "${enable_malloc_debugging+set}" = set; then : + enableval=$enable_malloc_debugging; case "${enableval}" in + yes) malloc_debugging=yes ;; + no) malloc_debugging=no ;; + *) as_fn_error $? "bad value ${enableval} for malloc-debugging option" "$LINENO" 5 ;; + esac +else + malloc_debugging= +fi + +# Check whether --enable-newlib-multithread was given. +if test "${enable_newlib_multithread+set}" = set; then : + enableval=$enable_newlib_multithread; case "${enableval}" in + yes) newlib_multithread=yes ;; + no) newlib_multithread=no ;; + *) as_fn_error $? "bad value ${enableval} for newlib-multithread option" "$LINENO" 5 ;; + esac +else + newlib_multithread=yes +fi + +# Check whether --enable-newlib-iconv was given. +if test "${enable_newlib_iconv+set}" = set; then : + enableval=$enable_newlib_iconv; if test "${newlib_iconv+set}" != set; then + case "${enableval}" in + yes) newlib_iconv=yes ;; + no) newlib_iconv=no ;; + *) as_fn_error $? "bad value ${enableval} for newlib-iconv option" "$LINENO" 5 ;; + esac + fi +else + newlib_iconv=${newlib_iconv} +fi + +# Check whether --enable-newlib-elix-level was given. +if test "${enable_newlib_elix_level+set}" = set; then : + enableval=$enable_newlib_elix_level; case "${enableval}" in + 0) newlib_elix_level=0 ;; + 1) newlib_elix_level=1 ;; + 2) newlib_elix_level=2 ;; + 3) newlib_elix_level=3 ;; + 4) newlib_elix_level=4 ;; + *) as_fn_error $? "bad value ${enableval} for newlib-elix-level option" "$LINENO" 5 ;; + esac +else + newlib_elix_level=0 +fi + +# Check whether --enable-newlib-io-float was given. +if test "${enable_newlib_io_float+set}" = set; then : + enableval=$enable_newlib_io_float; case "${enableval}" in + yes) newlib_io_float=yes ;; + no) newlib_io_float=no ;; + *) as_fn_error $? "bad value ${enableval} for newlib-io-float option" "$LINENO" 5 ;; + esac +else + newlib_io_float=yes +fi + +# Check whether --enable-newlib-supplied-syscalls was given. +if test "${enable_newlib_supplied_syscalls+set}" = set; then : + enableval=$enable_newlib_supplied_syscalls; case "${enableval}" in + yes) newlib_may_supply_syscalls=yes ;; + no) newlib_may_supply_syscalls=no ;; + *) as_fn_error $? "bad value ${enableval} for newlib-supplied-syscalls option" "$LINENO" 5 ;; + esac +else + newlib_may_supply_syscalls=yes +fi + + if test x${newlib_may_supply_syscalls} = xyes; then + MAY_SUPPLY_SYSCALLS_TRUE= + MAY_SUPPLY_SYSCALLS_FALSE='#' +else + MAY_SUPPLY_SYSCALLS_TRUE='#' + MAY_SUPPLY_SYSCALLS_FALSE= +fi + + + +test -z "${with_target_subdir}" && with_target_subdir=. + +if test "${srcdir}" = "."; then + if test "${with_target_subdir}" != "."; then + newlib_basedir="${srcdir}/${with_multisrctop}../../../.." + else + newlib_basedir="${srcdir}/${with_multisrctop}../../.." + fi +else + newlib_basedir="${srcdir}/../../.." +fi + + + + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='newlib' + VERSION='2.2.0' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# FIXME: We temporarily define our own version of AC_PROG_CC. This is +# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We +# are probably using a cross compiler, which will not be able to fully +# link an executable. This should really be fixed in autoconf +# itself. + + + + + + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -z "$CC" && as_fn_error $? "no acceptable cc found in \$PATH" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using GNU C" >&5 +$as_echo_n "checking whether we are using GNU C... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.c <&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_c_compiler_gnu=yes +else + ac_cv_c_compiler_gnu=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } + +if test $ac_cv_c_compiler_gnu = yes; then + GCC=yes + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + elif test $ac_cv_prog_cc_g = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-O2" + fi +else + GCC= + test "${CFLAGS+set}" = set || CFLAGS="-g" +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}readelf", so it can be a program name with args. +set dummy ${ac_tool_prefix}readelf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_READELF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$READELF"; then + ac_cv_prog_READELF="$READELF" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_READELF="${ac_tool_prefix}readelf" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +READELF=$ac_cv_prog_READELF +if test -n "$READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 +$as_echo "$READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_READELF"; then + ac_ct_READELF=$READELF + # Extract the first word of "readelf", so it can be a program name with args. +set dummy readelf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_READELF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_READELF"; then + ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_READELF="readelf" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_READELF=$ac_cv_prog_ac_ct_READELF +if test -n "$ac_ct_READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5 +$as_echo "$ac_ct_READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_READELF" = x; then + READELF=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + READELF=$ac_ct_READELF + fi +else + READELF="$ac_cv_prog_READELF" +fi + + + + +# Hack to ensure that INSTALL won't be set to "../" with autoconf 2.13. */ +ac_given_INSTALL=$INSTALL + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + +# By default we simply use the C compiler to build assembly code. + +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS + + + + +# We need AC_EXEEXT to keep automake happy in cygnus mode. However, +# at least currently, we never actually build a program, so we never +# need to use $(EXEEXT). Moreover, the test for EXEEXT normally +# fails, because we are probably configuring with a cross compiler +# which can't create executables. So we include AC_EXEEXT to keep +# automake happy, but we don't execute it, since we don't care about +# the result. +if false; then + + dummy_var=1 +fi + +. ${newlib_basedir}/configure.host + +newlib_cflags="${newlib_cflags} -fno-builtin" + +NEWLIB_CFLAGS=${newlib_cflags} + + +NO_INCLUDE_LIST=${noinclude} + + +LDFLAGS=${ldflags} + + + if test x${newlib_elix_level} = x0; then + ELIX_LEVEL_0_TRUE= + ELIX_LEVEL_0_FALSE='#' +else + ELIX_LEVEL_0_TRUE='#' + ELIX_LEVEL_0_FALSE= +fi + + if test x${newlib_elix_level} = x1; then + ELIX_LEVEL_1_TRUE= + ELIX_LEVEL_1_FALSE='#' +else + ELIX_LEVEL_1_TRUE='#' + ELIX_LEVEL_1_FALSE= +fi + + if test x${newlib_elix_level} = x2; then + ELIX_LEVEL_2_TRUE= + ELIX_LEVEL_2_FALSE='#' +else + ELIX_LEVEL_2_TRUE='#' + ELIX_LEVEL_2_FALSE= +fi + + if test x${newlib_elix_level} = x3; then + ELIX_LEVEL_3_TRUE= + ELIX_LEVEL_3_FALSE='#' +else + ELIX_LEVEL_3_TRUE='#' + ELIX_LEVEL_3_FALSE= +fi + + if test x${newlib_elix_level} = x4; then + ELIX_LEVEL_4_TRUE= + ELIX_LEVEL_4_FALSE='#' +else + ELIX_LEVEL_4_TRUE='#' + ELIX_LEVEL_4_FALSE= +fi + + + if test x${use_libtool} = xyes; then + USE_LIBTOOL_TRUE= + USE_LIBTOOL_FALSE='#' +else + USE_LIBTOOL_TRUE='#' + USE_LIBTOOL_FALSE= +fi + + +# Hard-code OBJEXT. Normally it is set by AC_OBJEXT, but we +# use oext, which is set in configure.host based on the target platform. +OBJEXT=${oext} + + + + + + + + + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${MAY_SUPPLY_SYSCALLS_TRUE}" && test -z "${MAY_SUPPLY_SYSCALLS_FALSE}"; then + as_fn_error $? "conditional \"MAY_SUPPLY_SYSCALLS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ELIX_LEVEL_0_TRUE}" && test -z "${ELIX_LEVEL_0_FALSE}"; then + as_fn_error $? "conditional \"ELIX_LEVEL_0\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ELIX_LEVEL_1_TRUE}" && test -z "${ELIX_LEVEL_1_FALSE}"; then + as_fn_error $? "conditional \"ELIX_LEVEL_1\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ELIX_LEVEL_2_TRUE}" && test -z "${ELIX_LEVEL_2_FALSE}"; then + as_fn_error $? "conditional \"ELIX_LEVEL_2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ELIX_LEVEL_3_TRUE}" && test -z "${ELIX_LEVEL_3_FALSE}"; then + as_fn_error $? "conditional \"ELIX_LEVEL_3\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ELIX_LEVEL_4_TRUE}" && test -z "${ELIX_LEVEL_4_FALSE}"; then + as_fn_error $? "conditional \"ELIX_LEVEL_4\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_LIBTOOL_TRUE}" && test -z "${USE_LIBTOOL_FALSE}"; then + as_fn_error $? "conditional \"USE_LIBTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by newlib $as_me 2.2.0, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +newlib config.status 2.2.0 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/newlib/libc/sys/vita/configure.in b/newlib/libc/sys/vita/configure.in new file mode 100755 index 0000000000..9e15348313 --- /dev/null +++ b/newlib/libc/sys/vita/configure.in @@ -0,0 +1,7 @@ +AC_PREREQ(2.59) +AC_INIT([newlib], [NEWLIB_VERSION]) +AC_CONFIG_SRCDIR([crt0.c]) +AC_CONFIG_AUX_DIR(../../../..) +NEWLIB_CONFIGURE(../../..) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c new file mode 100755 index 0000000000..d9016dfdb8 --- /dev/null +++ b/newlib/libc/sys/vita/crt0.c @@ -0,0 +1,5 @@ +int main(int argc, const char* argv[]); + +void _start() { + exit(main(1, (const char*[]){"", 0})); +} \ No newline at end of file diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c new file mode 100755 index 0000000000..dd27dac26c --- /dev/null +++ b/newlib/libc/sys/vita/syscalls.c @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include + +_ssize_t +_write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) +{ + reent->_errno = ENOSYS; + return -1; +} + +void +_exit(int rc) +{ + while (1) {} +} + +int +_close_r(struct _reent *reent, int fildes) +{ + reent->_errno = ENOSYS; + return -1; +} + +char *__env[1] = { 0 }; +char **environ = __env; + +int +_execve_r(struct _reent *reent, const char *name, char * const *argv, + char * const *env) +{ + reent->_errno = ENOSYS; + return -1; +} + +int +_fork_r(struct _reent *reent) +{ + errno = ENOSYS; + return -1; +} + +int +_fstat_r(struct _reent *reent, int fildes, struct stat *st) +{ + reent->_errno = ENOSYS; + return -1; +} + +int +_getpid_r(struct _reent *reent) +{ + reent->_errno = ENOSYS; + return -1; +} + +int +_gettimeofday(struct _reent *reent, struct timeval *ptimeval, void *ptimezone) +{ + reent->_errno = ENOSYS; + return -1; +} + +int +_isatty_r(struct _reent *reent, int file) +{ + reent->_errno = ENOSYS; + return 0; +} + +int +_kill_r(struct _reent *reent, int pid, int sig) +{ + reent->_errno = ENOSYS; + return -1; +} + +int +_link_r(struct _reent *reent, const char *existing, const char *new) +{ + reent->_errno = ENOSYS; + return -1; +} + +_off_t +_lseek_r(struct _reent *reent, int file, _off_t ptr, int dir) +{ + errno = ENOSYS; + return -1; +} + +int +_open(struct _reent *reent, char *file, int flags, int mode) +{ + reent->_errno = ENOSYS; + return -1; +} + +_ssize_t +_read_r(struct _reent *reent, int file, void *ptr, size_t len) +{ + reent->_errno = ENOSYS; + return -1; +} + +int +_readlink_r(struct _reent *reent, const char *path, char *buf, size_t bufsize) +{ + reent->_errno = ENOSYS; + return -1; +} + +int +_stat_r(struct _reent *reent, const char *path, struct stat *buf) +{ + reent->_errno = EIO; + return -1; +} + +int +_unlink_r(struct _reent *reent, const char * path) +{ + reent->_errno = EIO; + return (-1); +} From 69b0d566c9977e37216ce48ca236bebe4a0219d0 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 13 Aug 2015 16:31:57 +0300 Subject: [PATCH 02/86] working (not thread safe) sbrk --- newlib/libc/sys/vita/Makefile.am | 2 +- newlib/libc/sys/vita/Makefile.in | 10 ++++++++-- newlib/libc/sys/vita/crt0.c | 32 +++++++++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index cf77a1cfab..ddff53a4fa 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,7 +8,7 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c +lib_a_SOURCES = syscalls.c sbrk.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index 5917807dd3..abaabf01c4 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -68,7 +68,7 @@ LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru lib_a_AR = $(AR) $(ARFLAGS) lib_a_LIBADD = -am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) +am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -194,7 +194,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c +lib_a_SOURCES = syscalls.c sbrk.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. @@ -263,6 +263,12 @@ lib_a-syscalls.o: syscalls.c lib_a-syscalls.obj: syscalls.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-syscalls.obj `if test -f 'syscalls.c'; then $(CYGPATH_W) 'syscalls.c'; else $(CYGPATH_W) '$(srcdir)/syscalls.c'; fi` +lib_a-sbrk.o: sbrk.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sbrk.o `test -f 'sbrk.c' || echo '$(srcdir)/'`sbrk.c + +lib_a-sbrk.obj: sbrk.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sbrk.obj `if test -f 'sbrk.c'; then $(CYGPATH_W) 'sbrk.c'; else $(CYGPATH_W) '$(srcdir)/sbrk.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index d9016dfdb8..aff06bb328 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -1,5 +1,35 @@ int main(int argc, const char* argv[]); +extern int _newlib_heap_memblock; +extern unsigned _newlib_heap_size; +extern char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; + +void _init_vita_heap(void) { + int ret; + // Create a memblock for the heap memory, 32MB + _newlib_heap_size = 32 * 1024 * 1024; + _newlib_heap_memblock = sceKernelAllocMemBlock("Newlib heap", 0x0c20d060, _newlib_heap_size, 0); + if (_newlib_heap_memblock < 0) { + goto failure; + } + if ((ret = sceKernelGetMemBlockBase(_newlib_heap_memblock, &_newlib_heap_base)) < 0) { + goto failure; + } + _newlib_heap_end = _newlib_heap_base + _newlib_heap_size; + _newlib_heap_cur = _newlib_heap_base; + + return; +failure: + _newlib_heap_memblock = 0; + _newlib_heap_base = 0; + _newlib_heap_cur = 0; +} + +void _init_vita_newlib(void) { + _init_vita_heap(); +} + void _start() { + _init_vita_newlib(); exit(main(1, (const char*[]){"", 0})); -} \ No newline at end of file +} From 624ead333fa22a1e7350ef2d596df180bfbb7aba Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Thu, 13 Aug 2015 23:48:52 +0300 Subject: [PATCH 03/86] [Vita] Implement a proper thread safe _sbrk_r. --- newlib/libc/sys/vita/crt0.c | 7 +++++-- newlib/libc/sys/vita/sbrk.c | 22 ++++++++++++++++++++++ newlib/libc/sys/vita/syscalls.c | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100755 newlib/libc/sys/vita/sbrk.c diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index aff06bb328..a1d7b48fef 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -3,16 +3,19 @@ int main(int argc, const char* argv[]); extern int _newlib_heap_memblock; extern unsigned _newlib_heap_size; extern char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; +extern char _newlib_sbrk_mutex[32]; void _init_vita_heap(void) { - int ret; + // Create a mutex to use inside _sbrk_r + if (sceKernelCreateLwMutex(_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0) < 0) + goto failure; // Create a memblock for the heap memory, 32MB _newlib_heap_size = 32 * 1024 * 1024; _newlib_heap_memblock = sceKernelAllocMemBlock("Newlib heap", 0x0c20d060, _newlib_heap_size, 0); if (_newlib_heap_memblock < 0) { goto failure; } - if ((ret = sceKernelGetMemBlockBase(_newlib_heap_memblock, &_newlib_heap_base)) < 0) { + if (sceKernelGetMemBlockBase(_newlib_heap_memblock, &_newlib_heap_base) < 0) { goto failure; } _newlib_heap_end = _newlib_heap_base + _newlib_heap_size; diff --git a/newlib/libc/sys/vita/sbrk.c b/newlib/libc/sys/vita/sbrk.c new file mode 100755 index 0000000000..ea3745bcf6 --- /dev/null +++ b/newlib/libc/sys/vita/sbrk.c @@ -0,0 +1,22 @@ +#include +#include + +int _newlib_heap_memblock; +unsigned _newlib_heap_size; +char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; + +char _newlib_sbrk_mutex[32] __attribute__ ((aligned (8))); + +void * _sbrk_r(struct _reent *reent, ptrdiff_t incr) { + if (sceKernelLockLwMutex(_newlib_sbrk_mutex, 1, 0) < 0 || !_newlib_heap_base || _newlib_heap_cur + incr >= _newlib_heap_end) { + sceKernelUnlockLwMutex(_newlib_sbrk_mutex, 1); + reent->_errno = ENOMEM; + return -1; + } + + char *prev_heap_end = _newlib_heap_cur; + _newlib_heap_cur += incr; + + sceKernelUnlockLwMutex(_newlib_sbrk_mutex, 1); + return (void*) prev_heap_end; +} diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index dd27dac26c..827636255a 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -92,7 +92,7 @@ _lseek_r(struct _reent *reent, int file, _off_t ptr, int dir) } int -_open(struct _reent *reent, char *file, int flags, int mode) +_open_r(struct _reent *reent, const char *file, int flags, int mode) { reent->_errno = ENOSYS; return -1; From 2bbaa43caf8e53a10a16782f90042b5e04429205 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Fri, 14 Aug 2015 21:58:37 +0300 Subject: [PATCH 04/86] [Vita] Implement a per-thread reent, also a small fix to sbrk. --- newlib/libc/reent/getreent.c | 2 + newlib/libc/sys/vita/Makefile.am | 2 +- newlib/libc/sys/vita/Makefile.in | 17 +++- newlib/libc/sys/vita/crt0.c | 7 +- newlib/libc/sys/vita/reent.c | 136 +++++++++++++++++++++++++++++++ newlib/libc/sys/vita/sbrk.c | 5 +- newlib/libc/sys/vita/threading.c | 105 ++++++++++++++++++++++++ 7 files changed, 269 insertions(+), 5 deletions(-) create mode 100644 newlib/libc/sys/vita/reent.c create mode 100755 newlib/libc/sys/vita/threading.c diff --git a/newlib/libc/reent/getreent.c b/newlib/libc/reent/getreent.c index 60ae6fbb71..e5ee830711 100644 --- a/newlib/libc/reent/getreent.c +++ b/newlib/libc/reent/getreent.c @@ -7,8 +7,10 @@ #undef __getreent #endif +#if 0 struct _reent * _DEFUN_VOID(__getreent) { return _impure_ptr; } +#endif \ No newline at end of file diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index ddff53a4fa..ff73b44250 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,7 +8,7 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c reent.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index abaabf01c4..8dde28318c 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -68,7 +68,8 @@ LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru lib_a_AR = $(AR) $(ARFLAGS) lib_a_LIBADD = -am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) +am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ + lib_a-threading.$(OBJEXT) lib_a-reent.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -194,7 +195,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c reent.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. @@ -269,6 +270,18 @@ lib_a-sbrk.o: sbrk.c lib_a-sbrk.obj: sbrk.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sbrk.obj `if test -f 'sbrk.c'; then $(CYGPATH_W) 'sbrk.c'; else $(CYGPATH_W) '$(srcdir)/sbrk.c'; fi` +lib_a-threading.o: threading.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-threading.o `test -f 'threading.c' || echo '$(srcdir)/'`threading.c + +lib_a-threading.obj: threading.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-threading.obj `if test -f 'threading.c'; then $(CYGPATH_W) 'threading.c'; else $(CYGPATH_W) '$(srcdir)/threading.c'; fi` + +lib_a-reent.o: reent.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-reent.o `test -f 'reent.c' || echo '$(srcdir)/'`reent.c + +lib_a-reent.obj: reent.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-reent.obj `if test -f 'reent.c'; then $(CYGPATH_W) 'reent.c'; else $(CYGPATH_W) '$(srcdir)/reent.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index a1d7b48fef..1f8c9759fd 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -6,9 +6,11 @@ extern char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; extern char _newlib_sbrk_mutex[32]; void _init_vita_heap(void) { + int ret; // Create a mutex to use inside _sbrk_r - if (sceKernelCreateLwMutex(_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0) < 0) + if ((ret = sceKernelCreateLwMutex(_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0)) < 0) { goto failure; + } // Create a memblock for the heap memory, 32MB _newlib_heap_size = 32 * 1024 * 1024; _newlib_heap_memblock = sceKernelAllocMemBlock("Newlib heap", 0x0c20d060, _newlib_heap_size, 0); @@ -28,8 +30,11 @@ void _init_vita_heap(void) { _newlib_heap_cur = 0; } +void _init_vita_reent(void); + void _init_vita_newlib(void) { _init_vita_heap(); + _init_vita_reent(); } void _start() { diff --git a/newlib/libc/sys/vita/reent.c b/newlib/libc/sys/vita/reent.c new file mode 100644 index 0000000000..b6c2abf02e --- /dev/null +++ b/newlib/libc/sys/vita/reent.c @@ -0,0 +1,136 @@ +/* +FUNCTION + <>---definition of impure data. + +INDEX + reent + +DESCRIPTION + This module defines the impure data area used by the + non-reentrant functions, such as strtok. +*/ + +#include +#include + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +int errno; + +#endif + +/* Interim cleanup code */ + +void +_DEFUN (cleanup_glue, (ptr, glue), + struct _reent *ptr _AND + struct _glue *glue) +{ + /* Have to reclaim these in reverse order: */ + if (glue->_next) + cleanup_glue (ptr, glue->_next); + + _free_r (ptr, glue); +} + +void +_DEFUN (_reclaim_reent, (ptr), + struct _reent *ptr) +{ + if (ptr != _impure_ptr) + { + /* used by mprec routines. */ +#ifdef _REENT_SMALL + if (ptr->_mp) /* don't bother allocating it! */ + { +#endif + if (_REENT_MP_FREELIST(ptr)) + { + int i; + for (i = 0; i < _Kmax; i++) + { + struct _Bigint *thisone, *nextone; + + nextone = _REENT_MP_FREELIST(ptr)[i]; + while (nextone) + { + thisone = nextone; + nextone = nextone->_next; + _free_r (ptr, thisone); + } + } + + _free_r (ptr, _REENT_MP_FREELIST(ptr)); + } + if (_REENT_MP_RESULT(ptr)) + _free_r (ptr, _REENT_MP_RESULT(ptr)); +#ifdef _REENT_SMALL + } +#endif + +#ifdef _REENT_SMALL + if (ptr->_emergency) + _free_r (ptr, ptr->_emergency); + if (ptr->_mp) + _free_r (ptr, ptr->_mp); + if (ptr->_r48) + _free_r (ptr, ptr->_r48); + if (ptr->_localtime_buf) + _free_r (ptr, ptr->_localtime_buf); + if (ptr->_asctime_buf) + _free_r (ptr, ptr->_asctime_buf); + if (ptr->_signal_buf) + _free_r (ptr, ptr->_signal_buf); + if (ptr->_misc) + _free_r (ptr, ptr->_misc); +#endif + +#ifndef _REENT_GLOBAL_ATEXIT + /* atexit stuff */ +# ifdef _REENT_SMALL + if (ptr->_atexit && ptr->_atexit->_on_exit_args_ptr) + _free_r (ptr, ptr->_atexit->_on_exit_args_ptr); +# else + if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0)) + { + struct _atexit *p, *q; + for (p = ptr->_atexit; p != &ptr->_atexit0;) + { + q = p; + p = p->_next; + _free_r (ptr, q); + } + } +# endif +#endif + + if (ptr->_cvtbuf) + _free_r (ptr, ptr->_cvtbuf); + /* We should free _sig_func to avoid a memory leak, but how to + do it safely considering that a signal may be delivered immediately + after the free? + if (ptr->_sig_func) + _free_r (ptr, ptr->_sig_func);*/ + + if (ptr->__sdidinit) + { + /* cleanup won't reclaim memory 'coz usually it's run + before the program exits, and who wants to wait for that? */ + ptr->__cleanup (ptr); + + if (ptr->__sglue._next) + cleanup_glue (ptr, ptr->__sglue._next); + } + + /* Malloc memory not reclaimed; no good way to return memory anyway. */ + + } +} diff --git a/newlib/libc/sys/vita/sbrk.c b/newlib/libc/sys/vita/sbrk.c index ea3745bcf6..895fa7ea06 100755 --- a/newlib/libc/sys/vita/sbrk.c +++ b/newlib/libc/sys/vita/sbrk.c @@ -8,8 +8,11 @@ char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; char _newlib_sbrk_mutex[32] __attribute__ ((aligned (8))); void * _sbrk_r(struct _reent *reent, ptrdiff_t incr) { - if (sceKernelLockLwMutex(_newlib_sbrk_mutex, 1, 0) < 0 || !_newlib_heap_base || _newlib_heap_cur + incr >= _newlib_heap_end) { + if (sceKernelLockLwMutex(_newlib_sbrk_mutex, 1, 0) < 0) + goto fail; + if (!_newlib_heap_base || _newlib_heap_cur + incr >= _newlib_heap_end) { sceKernelUnlockLwMutex(_newlib_sbrk_mutex, 1); +fail: reent->_errno = ENOMEM; return -1; } diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c new file mode 100755 index 0000000000..7e90b18e9c --- /dev/null +++ b/newlib/libc/sys/vita/threading.c @@ -0,0 +1,105 @@ +// This provides support for __getreent() as well as implementation of our thread-related wrappers + +#include + +#define MAX_THREADS 64 + +typedef struct reent_for_thread { + int thread_id; + int needs_reclaim; + struct _reent reent; +} reent_for_thread; + +reent_for_thread reent_list[MAX_THREADS]; +int _newlib_reent_mutex; +struct _reent _newlib_global_reent; + +int sceKernelExitThread(int); +int sceKernelExitDeleteThread(int); + +#define TLS_REENT_PTR sceKernelGetTLSAddr(0x88) + +#define list_entry(ptr, type, member) \ + ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) + +int _exit_thread_common(int exit_status, int (*exit_func)(int)) { + int ret, thread_id; + struct reent_for_thread *for_thread; + // We only need to cleanup if reent is allocated, i.e. if it's on our TLS + // We also don't need to clean up the global reent + struct _reent **on_tls = TLS_REENT_PTR; + if (!*on_tls || *on_tls == &_newlib_global_reent) + return exit_func(exit_status); + for_thread = list_entry(*on_tls, struct reent_for_thread, reent); + // Remove from TLS + *on_tls = 0; + // Lock the list because we'll be modifying it + sceKernelLockMutex(_newlib_reent_mutex); + // Set thread id to zero, which means the reent is free + thread_id = for_thread->thread_id; + for_thread->thread_id = 0; + // We can't reclaim it here, will be done later in __getreent + for_thread->needs_reclaim = 1; + // Try to actually exit the thread + ret = exit_func(exit_status); + // If it succeeds, the mutex is unlocked, and we don't get here + // However, if it fails, we need to restore thread_id and unlock the mutex + for_thread->thread_id = thread_id; + sceKernelUnlockMutex(_newlib_reent_mutex); + // And put it back on TLS + *on_tls = &for_thread->reent; + return ret; +} + +int vita_exit_thread(int exit_status) { + return _exit_thread_common(exit_status, sceKernelExitThread); +} + +int vita_exit_delete_thread(int exit_status) { + return _exit_thread_common(exit_status, sceKernelExitDeleteThread); +} + +struct _reent *__getreent(void) { + int i; + struct reent_for_thread *free_reent = 0; + struct _reent *returned_reent = 0; + // A pointer to our reent should be on the TLS + struct _reent **on_tls = TLS_REENT_PTR; + if (*on_tls) { + return *on_tls; + } + // If it's not on the TLS this means the thread doesn't have a reent allocated yet + // We allocate one and put a pointer to it on the TLS + sceKernelLockMutex(_newlib_reent_mutex, 1, 0); + for (i = 0; i < MAX_THREADS; ++i) + if (reent_list[i].thread_id == 0) { + free_reent = &reent_list[i]; + break; + } + if (!free_reent) { + returned_reent = &_newlib_global_reent; + } else { + // First, check if it needs to be cleaned up (if it came from another thread) + if (free_reent->needs_reclaim) { + _reclaim_reent(&free_reent->reent); + free_reent->needs_reclaim = 0; + } + // Set it up + free_reent->thread_id = sceKernelGetThreadId(); + _REENT_INIT_PTR(&free_reent->reent); + returned_reent = &free_reent->reent; + } + sceKernelUnlockMutex(_newlib_reent_mutex, 1); + // Put it on TLS for faster access time + *on_tls = returned_reent; + return returned_reent; +} + +// Called from _start to set up the main thread reentrancy structure +void _init_vita_reent(void) { + _newlib_reent_mutex = sceKernelCreateMutex("reent list access mutex", 0, 0, 0); + reent_list[0].thread_id = sceKernelGetThreadId(); + _REENT_INIT_PTR(&reent_list[0].reent); + *(struct _reent **)(sceKernelGetTLSAddr(0x88)) = &reent_list[0].reent; + _REENT_INIT_PTR(&_newlib_global_reent); +} From 5a8abc088f52f669693a8d5d71e8f9f8cad55b1b Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Fri, 14 Aug 2015 22:55:06 +0300 Subject: [PATCH 05/86] [Vita] Implement proper __malloc_lock, __malloc_unlock --- newlib/libc/sys/vita/Makefile.am | 2 +- newlib/libc/sys/vita/Makefile.in | 12 +-- newlib/libc/sys/vita/crt0.c | 33 +------- newlib/libc/sys/vita/mlock.c | 13 +++ newlib/libc/sys/vita/reent.c | 136 ------------------------------- newlib/libc/sys/vita/sbrk.c | 24 ++++++ 6 files changed, 45 insertions(+), 175 deletions(-) create mode 100755 newlib/libc/sys/vita/mlock.c delete mode 100644 newlib/libc/sys/vita/reent.c diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index ff73b44250..800371e24a 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,7 +8,7 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c threading.c reent.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index 8dde28318c..11740df66b 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -69,7 +69,7 @@ ARFLAGS = cru lib_a_AR = $(AR) $(ARFLAGS) lib_a_LIBADD = am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ - lib_a-threading.$(OBJEXT) lib_a-reent.$(OBJEXT) + lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -195,7 +195,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c threading.c reent.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. @@ -276,11 +276,11 @@ lib_a-threading.o: threading.c lib_a-threading.obj: threading.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-threading.obj `if test -f 'threading.c'; then $(CYGPATH_W) 'threading.c'; else $(CYGPATH_W) '$(srcdir)/threading.c'; fi` -lib_a-reent.o: reent.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-reent.o `test -f 'reent.c' || echo '$(srcdir)/'`reent.c +lib_a-mlock.o: mlock.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mlock.o `test -f 'mlock.c' || echo '$(srcdir)/'`mlock.c -lib_a-reent.obj: reent.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-reent.obj `if test -f 'reent.c'; then $(CYGPATH_W) 'reent.c'; else $(CYGPATH_W) '$(srcdir)/reent.c'; fi` +lib_a-mlock.obj: mlock.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mlock.obj `if test -f 'mlock.c'; then $(CYGPATH_W) 'mlock.c'; else $(CYGPATH_W) '$(srcdir)/mlock.c'; fi` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index 1f8c9759fd..1027055e03 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -1,40 +1,9 @@ int main(int argc, const char* argv[]); -extern int _newlib_heap_memblock; -extern unsigned _newlib_heap_size; -extern char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; -extern char _newlib_sbrk_mutex[32]; - -void _init_vita_heap(void) { - int ret; - // Create a mutex to use inside _sbrk_r - if ((ret = sceKernelCreateLwMutex(_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0)) < 0) { - goto failure; - } - // Create a memblock for the heap memory, 32MB - _newlib_heap_size = 32 * 1024 * 1024; - _newlib_heap_memblock = sceKernelAllocMemBlock("Newlib heap", 0x0c20d060, _newlib_heap_size, 0); - if (_newlib_heap_memblock < 0) { - goto failure; - } - if (sceKernelGetMemBlockBase(_newlib_heap_memblock, &_newlib_heap_base) < 0) { - goto failure; - } - _newlib_heap_end = _newlib_heap_base + _newlib_heap_size; - _newlib_heap_cur = _newlib_heap_base; - - return; -failure: - _newlib_heap_memblock = 0; - _newlib_heap_base = 0; - _newlib_heap_cur = 0; -} - -void _init_vita_reent(void); - void _init_vita_newlib(void) { _init_vita_heap(); _init_vita_reent(); + _init_vita_malloc(); } void _start() { diff --git a/newlib/libc/sys/vita/mlock.c b/newlib/libc/sys/vita/mlock.c new file mode 100755 index 0000000000..969d83e34e --- /dev/null +++ b/newlib/libc/sys/vita/mlock.c @@ -0,0 +1,13 @@ +char _newlib_malloc_mutex[32] __attribute__ ((aligned (8))); + +void __malloc_lock(struct _reent *r) { + sceKernelLockLwMutex(_newlib_malloc_mutex, 1, 0); +} + +void __malloc_unlock(struct _reent *r) { + sceKernelUnlockLwMutex(_newlib_malloc_mutex, 1); +} + +void _init_vita_malloc(void) { + sceKernelCreateLwMutex(_newlib_malloc_mutex, "malloc mutex", 2, 0, 0); +} diff --git a/newlib/libc/sys/vita/reent.c b/newlib/libc/sys/vita/reent.c deleted file mode 100644 index b6c2abf02e..0000000000 --- a/newlib/libc/sys/vita/reent.c +++ /dev/null @@ -1,136 +0,0 @@ -/* -FUNCTION - <>---definition of impure data. - -INDEX - reent - -DESCRIPTION - This module defines the impure data area used by the - non-reentrant functions, such as strtok. -*/ - -#include -#include - -#ifdef _REENT_ONLY -#ifndef REENTRANT_SYSCALLS_PROVIDED -#define REENTRANT_SYSCALLS_PROVIDED -#endif -#endif - -#ifndef REENTRANT_SYSCALLS_PROVIDED - -/* We use the errno variable used by the system dependent layer. */ -#undef errno -int errno; - -#endif - -/* Interim cleanup code */ - -void -_DEFUN (cleanup_glue, (ptr, glue), - struct _reent *ptr _AND - struct _glue *glue) -{ - /* Have to reclaim these in reverse order: */ - if (glue->_next) - cleanup_glue (ptr, glue->_next); - - _free_r (ptr, glue); -} - -void -_DEFUN (_reclaim_reent, (ptr), - struct _reent *ptr) -{ - if (ptr != _impure_ptr) - { - /* used by mprec routines. */ -#ifdef _REENT_SMALL - if (ptr->_mp) /* don't bother allocating it! */ - { -#endif - if (_REENT_MP_FREELIST(ptr)) - { - int i; - for (i = 0; i < _Kmax; i++) - { - struct _Bigint *thisone, *nextone; - - nextone = _REENT_MP_FREELIST(ptr)[i]; - while (nextone) - { - thisone = nextone; - nextone = nextone->_next; - _free_r (ptr, thisone); - } - } - - _free_r (ptr, _REENT_MP_FREELIST(ptr)); - } - if (_REENT_MP_RESULT(ptr)) - _free_r (ptr, _REENT_MP_RESULT(ptr)); -#ifdef _REENT_SMALL - } -#endif - -#ifdef _REENT_SMALL - if (ptr->_emergency) - _free_r (ptr, ptr->_emergency); - if (ptr->_mp) - _free_r (ptr, ptr->_mp); - if (ptr->_r48) - _free_r (ptr, ptr->_r48); - if (ptr->_localtime_buf) - _free_r (ptr, ptr->_localtime_buf); - if (ptr->_asctime_buf) - _free_r (ptr, ptr->_asctime_buf); - if (ptr->_signal_buf) - _free_r (ptr, ptr->_signal_buf); - if (ptr->_misc) - _free_r (ptr, ptr->_misc); -#endif - -#ifndef _REENT_GLOBAL_ATEXIT - /* atexit stuff */ -# ifdef _REENT_SMALL - if (ptr->_atexit && ptr->_atexit->_on_exit_args_ptr) - _free_r (ptr, ptr->_atexit->_on_exit_args_ptr); -# else - if ((ptr->_atexit) && (ptr->_atexit != &ptr->_atexit0)) - { - struct _atexit *p, *q; - for (p = ptr->_atexit; p != &ptr->_atexit0;) - { - q = p; - p = p->_next; - _free_r (ptr, q); - } - } -# endif -#endif - - if (ptr->_cvtbuf) - _free_r (ptr, ptr->_cvtbuf); - /* We should free _sig_func to avoid a memory leak, but how to - do it safely considering that a signal may be delivered immediately - after the free? - if (ptr->_sig_func) - _free_r (ptr, ptr->_sig_func);*/ - - if (ptr->__sdidinit) - { - /* cleanup won't reclaim memory 'coz usually it's run - before the program exits, and who wants to wait for that? */ - ptr->__cleanup (ptr); - - if (ptr->__sglue._next) - cleanup_glue (ptr, ptr->__sglue._next); - } - - /* Malloc memory not reclaimed; no good way to return memory anyway. */ - - } -} diff --git a/newlib/libc/sys/vita/sbrk.c b/newlib/libc/sys/vita/sbrk.c index 895fa7ea06..8b03267128 100755 --- a/newlib/libc/sys/vita/sbrk.c +++ b/newlib/libc/sys/vita/sbrk.c @@ -23,3 +23,27 @@ void * _sbrk_r(struct _reent *reent, ptrdiff_t incr) { sceKernelUnlockLwMutex(_newlib_sbrk_mutex, 1); return (void*) prev_heap_end; } + +void _init_vita_heap(void) { + // Create a mutex to use inside _sbrk_r + if (sceKernelCreateLwMutex(_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0) < 0) { + goto failure; + } + // Create a memblock for the heap memory, 32MB + _newlib_heap_size = 32 * 1024 * 1024; + _newlib_heap_memblock = sceKernelAllocMemBlock("Newlib heap", 0x0c20d060, _newlib_heap_size, 0); + if (_newlib_heap_memblock < 0) { + goto failure; + } + if (sceKernelGetMemBlockBase(_newlib_heap_memblock, &_newlib_heap_base) < 0) { + goto failure; + } + _newlib_heap_end = _newlib_heap_base + _newlib_heap_size; + _newlib_heap_cur = _newlib_heap_base; + + return; +failure: + _newlib_heap_memblock = 0; + _newlib_heap_base = 0; + _newlib_heap_cur = 0; +} From d8e5ec59aed742217a87f11b6a11dfb77852a904 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Sat, 15 Aug 2015 00:25:01 +0300 Subject: [PATCH 06/86] [Vita] Implement most of file related syscalls. --- newlib/libc/sys/vita/crt0.c | 3 + newlib/libc/sys/vita/syscalls.c | 134 +++++++++++++++++++++++++++----- 2 files changed, 118 insertions(+), 19 deletions(-) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index 1027055e03..f8f0a5e8f5 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -1,9 +1,12 @@ +extern char _newlib_fd_mutex[32]; + int main(int argc, const char* argv[]); void _init_vita_newlib(void) { _init_vita_heap(); _init_vita_reent(); _init_vita_malloc(); + sceKernelCreateLwMutex(_newlib_fd_mutex, "fd conversion table mutex", 0, 0, 0); } void _start() { diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 827636255a..9b32d662fc 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -1,14 +1,36 @@ #include +#include #include #include #include #include +#include + +#define SCE_ERRNO_MASK 0xFF +#define MAX_OPEN_FILES 1024 + +int fd_to_scefd[MAX_OPEN_FILES]; +char _newlib_fd_mutex[32] __attribute__ ((aligned (8))); _ssize_t _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) { - reent->_errno = ENOSYS; - return -1; + int ret; + if ((unsigned)fd > MAX_OPEN_FILES) { + reent->_errno = EINVAL; + return -1; + } + if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { + reent->_errno = 0; + return nbytes; + } + ret = sceIoWrite(fd_to_scefd[fd], buf, nbytes); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + reent->_errno = 0; + return ret; } void @@ -18,10 +40,19 @@ _exit(int rc) } int -_close_r(struct _reent *reent, int fildes) -{ - reent->_errno = ENOSYS; - return -1; +_close_r(struct _reent *reent, int fd) +{ + if ((unsigned)fd > MAX_OPEN_FILES) { + reent->_errno = EINVAL; + return -1; + } + reent->_errno = sceIoClose(fd_to_scefd[fd]) & SCE_ERRNO_MASK; + if (reent->_errno == 0) { + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + fd_to_scefd[fd] = 0; + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + } + return 0; } char *__env[1] = { 0 }; @@ -38,12 +69,12 @@ _execve_r(struct _reent *reent, const char *name, char * const *argv, int _fork_r(struct _reent *reent) { - errno = ENOSYS; + reent->_errno = ENOSYS; return -1; } int -_fstat_r(struct _reent *reent, int fildes, struct stat *st) +_fstat_r(struct _reent *reent, int fd, struct stat *st) { reent->_errno = ENOSYS; return -1; @@ -52,8 +83,8 @@ _fstat_r(struct _reent *reent, int fildes, struct stat *st) int _getpid_r(struct _reent *reent) { - reent->_errno = ENOSYS; - return -1; + reent->_errno = 0; + return sceKernelGetProcessId(); } int @@ -85,24 +116,89 @@ _link_r(struct _reent *reent, const char *existing, const char *new) } _off_t -_lseek_r(struct _reent *reent, int file, _off_t ptr, int dir) -{ - errno = ENOSYS; - return -1; +_lseek_r(struct _reent *reent, int fd, _off_t ptr, int dir) +{ + int ret; + if ((unsigned)fd > MAX_OPEN_FILES || fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { + reent->_errno = EINVAL; + return -1; + } + ret = sceIoLseek32(fd_to_scefd[fd], ptr, dir); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + return ret; +} + +int _fcntl2sony(int flags) { + int out = 0; + if (flags & O_RDWR) + out |= 3; + else if (flags & O_WRONLY) + out |= 2; + else + out |= 1; + if (flags & O_NONBLOCK) + out |= 4; + if (flags & O_APPEND) + out |= 0x100; + if (flags & O_CREAT) + out |= 0x200; + if (flags & O_TRUNC) + out |= 0x400; + if (flags & O_EXCL) + out |= 0x800; + return out; } int _open_r(struct _reent *reent, const char *file, int flags, int mode) { - reent->_errno = ENOSYS; + int ret, i, found = 0; + flags = _fcntl2sony(flags); + ret = sceIoOpen(file, flags, 0600); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + // skip stdin, stdout, stderr + for (i = 3; i < MAX_OPEN_FILES; ++i) + if (fd_to_scefd[i] == 0) { + found = i; + break; + } + if (!found) + goto fail; + fd_to_scefd[found] = ret; + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + reent->_errno = 0; + return found; +fail: + reent->_errno = EMFILE; return -1; } _ssize_t -_read_r(struct _reent *reent, int file, void *ptr, size_t len) -{ - reent->_errno = ENOSYS; - return -1; +_read_r(struct _reent *reent, int fd, void *ptr, size_t len) +{ + int ret; + if ((unsigned)fd > MAX_OPEN_FILES) { + reent->_errno = EINVAL; + return 01; + } + if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { + reent->_errno = 0; + return len; + } + ret = sceIoRead(fd_to_scefd[fd], ptr, len); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + reent->_errno = 0; + return ret; } int From 0c05d372c6cc5f7a70dd1236408f4a1b988a272b Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Mon, 17 Aug 2015 04:24:11 +0300 Subject: [PATCH 07/86] Proper gettimeofday header --- newlib/libc/sys/vita/syscalls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 9b32d662fc..4219ce1711 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -88,7 +88,7 @@ _getpid_r(struct _reent *reent) } int -_gettimeofday(struct _reent *reent, struct timeval *ptimeval, void *ptimezone) +_gettimeofday_r(struct _reent *reent, struct timeval *ptimeval, void *ptimezone) { reent->_errno = ENOSYS; return -1; From 37639ed81a0400283c9e173d933d6f8529e71c07 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Wed, 19 Aug 2015 16:40:59 +0300 Subject: [PATCH 08/86] Disable libgloss for vita build. --- configure | 3 +++ configure.ac | 3 +++ 2 files changed, 6 insertions(+) diff --git a/configure b/configure index ae23ce435b..ac3d3bd0f0 100755 --- a/configure +++ b/configure @@ -3499,6 +3499,9 @@ case "${target}" in alpha*-dec-osf*) noconfigdirs="$noconfigdirs target-newlib target-libgloss" ;; + arm*vita*) + noconfigdirs="$noconfigdirs target-libgloss" + ;; i[3456789]86-*-linux*) # This section makes it possible to build newlib natively on linux. # If we are using a cross compiler then don't configure newlib. diff --git a/configure.ac b/configure.ac index 80313d0601..b41d6c1c95 100644 --- a/configure.ac +++ b/configure.ac @@ -832,6 +832,9 @@ case "${target}" in alpha*-dec-osf*) noconfigdirs="$noconfigdirs target-newlib target-libgloss" ;; + arm*vita*) + noconfigdirs="$noconfigdirs target-libgloss" + ;; i[[3456789]]86-*-linux*) # This section makes it possible to build newlib natively on linux. # If we are using a cross compiler then don't configure newlib. From d4564552689ba57ae16d7b6c20161fbe3acd1d21 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Fri, 18 Sep 2015 01:00:40 +0300 Subject: [PATCH 09/86] Call __libc_init_array in Vita crt0.c Thanks to @frangarcj for testing it. --- newlib/libc/sys/vita/crt0.c | 1 + 1 file changed, 1 insertion(+) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index f8f0a5e8f5..bed90edba4 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -11,5 +11,6 @@ void _init_vita_newlib(void) { void _start() { _init_vita_newlib(); + __libc_init_array(); exit(main(1, (const char*[]){"", 0})); } From 3d792ab7b89a4685a1ec28dfa503daeafd5621c6 Mon Sep 17 00:00:00 2001 From: Glenn Anderson Date: Fri, 4 Sep 2015 01:54:32 -0400 Subject: [PATCH 10/86] Adds a call to uvl_write for handling STDIN, STDOUT, and STDERR. --- newlib/libc/sys/vita/syscalls.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 4219ce1711..c2a2e10478 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -21,6 +21,11 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) return -1; } if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { + ret = uvl_write(fd, buf, nbytes); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } reent->_errno = 0; return nbytes; } From 57f41364b098a4664790a9b349795fcb4bbcf3b8 Mon Sep 17 00:00:00 2001 From: Glenn Anderson Date: Sun, 6 Sep 2015 12:46:48 -0400 Subject: [PATCH 11/86] Renames uvl_write to uvl_log_write. --- newlib/libc/sys/vita/syscalls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index c2a2e10478..e9b8ade610 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -21,7 +21,7 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) return -1; } if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { - ret = uvl_write(fd, buf, nbytes); + ret = uvl_log_write(buf, nbytes); if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; From f88157db43377cc0860661264840c4b23da67583 Mon Sep 17 00:00:00 2001 From: Glenn Anderson Date: Wed, 9 Sep 2015 00:29:55 -0400 Subject: [PATCH 12/86] exit now calls uvl_exit. --- newlib/libc/sys/vita/syscalls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index e9b8ade610..eacfc3102d 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -41,7 +41,7 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) void _exit(int rc) { - while (1) {} + uvl_exit(rc); } int From 8b68730104314dfb928af5d6f8c8e222aaf6fdee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sun, 20 Sep 2015 12:45:42 +0200 Subject: [PATCH 13/86] (Vita) Add user-defined heap size --- newlib/libc/sys/vita/sbrk.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/sbrk.c b/newlib/libc/sys/vita/sbrk.c index 8b03267128..63ff14b22c 100755 --- a/newlib/libc/sys/vita/sbrk.c +++ b/newlib/libc/sys/vita/sbrk.c @@ -2,6 +2,7 @@ #include int _newlib_heap_memblock; +extern unsigned int _newlib_heap_size_user __attribute__((weak)); unsigned _newlib_heap_size; char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; @@ -29,8 +30,12 @@ void _init_vita_heap(void) { if (sceKernelCreateLwMutex(_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0) < 0) { goto failure; } - // Create a memblock for the heap memory, 32MB - _newlib_heap_size = 32 * 1024 * 1024; + if (&_newlib_heap_size_user != NULL) { + _newlib_heap_size = _newlib_heap_size_user; + } else { + // Create a memblock for the heap memory, 32MB + _newlib_heap_size = 32 * 1024 * 1024; + } _newlib_heap_memblock = sceKernelAllocMemBlock("Newlib heap", 0x0c20d060, _newlib_heap_size, 0); if (_newlib_heap_memblock < 0) { goto failure; From 161dd369d8eb6b946dbea9271e1f5c15722c32d6 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 20 Sep 2015 19:33:45 -0700 Subject: [PATCH 14/86] Implement _gettimeofday_r --- newlib/libc/sys/vita/syscalls.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index eacfc3102d..bdf465484a 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -95,8 +95,13 @@ _getpid_r(struct _reent *reent) int _gettimeofday_r(struct _reent *reent, struct timeval *ptimeval, void *ptimezone) { - reent->_errno = ENOSYS; - return -1; + int ret = sceKernelLibcGettimeofday(ptimeval, ptimezone); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + reent->_errno = 0; + return 0; } int From 0cb4b2b00a2e9b4cec5d8ec2a1c03fa1bcf7be4a Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 22 Sep 2015 11:48:43 +0300 Subject: [PATCH 15/86] Unlock _newlib_fd_mutex even when fd_to_scefd is full, fixes #8 --- newlib/libc/sys/vita/syscalls.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index bdf465484a..9c6cd5225f 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -179,15 +179,16 @@ _open_r(struct _reent *reent, const char *file, int flags, int mode) found = i; break; } - if (!found) - goto fail; + if (!found) { + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + sceIoClose(ret); + reent->_errno = EMFILE; + return -1; + } fd_to_scefd[found] = ret; sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); reent->_errno = 0; return found; -fail: - reent->_errno = EMFILE; - return -1; } _ssize_t From aefcd564897f2808d0a13cce5bcf6a07c374fc2e Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 22 Sep 2015 11:55:23 +0300 Subject: [PATCH 16/86] Simplify _write_r --- newlib/libc/sys/vita/syscalls.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 9c6cd5225f..61f5618cce 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -22,14 +22,11 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) } if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { ret = uvl_log_write(buf, nbytes); - if (ret < 0) { - reent->_errno = ret & SCE_ERRNO_MASK; - return -1; - } - reent->_errno = 0; - return nbytes; + if (ret == 0) + ret = nbytes; + } else { + ret = sceIoWrite(fd_to_scefd[fd], buf, nbytes); } - ret = sceIoWrite(fd_to_scefd[fd], buf, nbytes); if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; From 6fcb342ef934027e7c927c3cd2f31092265ffcf4 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 22 Sep 2015 12:00:38 +0300 Subject: [PATCH 17/86] Add "static" to global variables where applicable. --- newlib/libc/sys/vita/mlock.c | 2 +- newlib/libc/sys/vita/sbrk.c | 8 ++++---- newlib/libc/sys/vita/syscalls.c | 2 +- newlib/libc/sys/vita/threading.c | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/newlib/libc/sys/vita/mlock.c b/newlib/libc/sys/vita/mlock.c index 969d83e34e..8914eacfa4 100755 --- a/newlib/libc/sys/vita/mlock.c +++ b/newlib/libc/sys/vita/mlock.c @@ -1,4 +1,4 @@ -char _newlib_malloc_mutex[32] __attribute__ ((aligned (8))); +static char _newlib_malloc_mutex[32] __attribute__ ((aligned (8))); void __malloc_lock(struct _reent *r) { sceKernelLockLwMutex(_newlib_malloc_mutex, 1, 0); diff --git a/newlib/libc/sys/vita/sbrk.c b/newlib/libc/sys/vita/sbrk.c index 63ff14b22c..068615198b 100755 --- a/newlib/libc/sys/vita/sbrk.c +++ b/newlib/libc/sys/vita/sbrk.c @@ -1,12 +1,12 @@ #include #include -int _newlib_heap_memblock; extern unsigned int _newlib_heap_size_user __attribute__((weak)); -unsigned _newlib_heap_size; -char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; -char _newlib_sbrk_mutex[32] __attribute__ ((aligned (8))); +static int _newlib_heap_memblock; +static unsigned _newlib_heap_size; +static char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur; +static char _newlib_sbrk_mutex[32] __attribute__ ((aligned (8))); void * _sbrk_r(struct _reent *reent, ptrdiff_t incr) { if (sceKernelLockLwMutex(_newlib_sbrk_mutex, 1, 0) < 0) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 61f5618cce..2a1283e5fa 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -9,7 +9,7 @@ #define SCE_ERRNO_MASK 0xFF #define MAX_OPEN_FILES 1024 -int fd_to_scefd[MAX_OPEN_FILES]; +static int fd_to_scefd[MAX_OPEN_FILES]; char _newlib_fd_mutex[32] __attribute__ ((aligned (8))); _ssize_t diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index 7e90b18e9c..aaebda52f2 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -10,9 +10,9 @@ typedef struct reent_for_thread { struct _reent reent; } reent_for_thread; -reent_for_thread reent_list[MAX_THREADS]; -int _newlib_reent_mutex; -struct _reent _newlib_global_reent; +static reent_for_thread reent_list[MAX_THREADS]; +static int _newlib_reent_mutex; +static struct _reent _newlib_global_reent; int sceKernelExitThread(int); int sceKernelExitDeleteThread(int); From 33792acb27d8e5e538710d37224b248915ffb84a Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 22 Sep 2015 12:01:48 +0300 Subject: [PATCH 18/86] Replace sceKernelGetTLSAddr(0x88) with a #define in _init_vita_reent --- newlib/libc/sys/vita/threading.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index aaebda52f2..ea1f60fabe 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -100,6 +100,6 @@ void _init_vita_reent(void) { _newlib_reent_mutex = sceKernelCreateMutex("reent list access mutex", 0, 0, 0); reent_list[0].thread_id = sceKernelGetThreadId(); _REENT_INIT_PTR(&reent_list[0].reent); - *(struct _reent **)(sceKernelGetTLSAddr(0x88)) = &reent_list[0].reent; + *(struct _reent **)(TLS_REENT_PTR) = &reent_list[0].reent; _REENT_INIT_PTR(&_newlib_global_reent); } From 6de39677021504a610890bcbb6be2b7cfdeea40d Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 22 Sep 2015 22:39:12 +0300 Subject: [PATCH 19/86] Implement _unlink_r --- newlib/libc/sys/vita/syscalls.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 2a1283e5fa..ad0651ba86 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -226,6 +226,12 @@ _stat_r(struct _reent *reent, const char *path, struct stat *buf) int _unlink_r(struct _reent *reent, const char * path) { - reent->_errno = EIO; - return (-1); + int ret; + ret = sceIoRemove(path); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + reent->_errno = 0; + return 0; } From d9c305b8e6ca262ef5976d4e764305d8aebe65df Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 22 Sep 2015 22:41:58 +0300 Subject: [PATCH 20/86] Implement _rename_r. --- newlib/libc/sys/vita/syscalls.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index ad0651ba86..2e1d5701f3 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -235,3 +235,16 @@ _unlink_r(struct _reent *reent, const char * path) reent->_errno = 0; return 0; } + +int +_rename_r(struct _reent *reent, const char *old, const char *new) +{ + int ret; + ret = sceIoRename(old, new); + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + reent->_errno = 0; + return 0; +} From ccf528d05b0089a31039ad7eb11d5b9721565e84 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 22 Sep 2015 23:02:22 +0300 Subject: [PATCH 21/86] Implement _times_r. --- newlib/libc/include/machine/time.h | 2 +- newlib/libc/sys/vita/syscalls.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/newlib/libc/include/machine/time.h b/newlib/libc/include/machine/time.h index 6f9a35cc54..42a5ec2e28 100644 --- a/newlib/libc/include/machine/time.h +++ b/newlib/libc/include/machine/time.h @@ -1,7 +1,7 @@ #ifndef _MACHTIME_H_ #define _MACHTIME_H_ -#if defined(__rtems__) || defined(__VISIUM__) +#if defined(__rtems__) || defined(__VISIUM__) || defined(__vita__) #define _CLOCKS_PER_SEC_ 1000000 #elif defined(__aarch64__) || defined(__arm__) || defined(__thumb__) #define _CLOCKS_PER_SEC_ 100 diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 2e1d5701f3..59b7a40183 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #define SCE_ERRNO_MASK 0xFF @@ -248,3 +249,14 @@ _rename_r(struct _reent *reent, const char *old, const char *new) reent->_errno = 0; return 0; } + +clock_t +_times_r(struct _reent *reent, struct tms *ptms) +{ + unsigned result = sceKernelGetProcessTimeLow(); + ptms->tms_utime = result; + ptms->tms_stime = 0; + ptms->tms_cutime = 0; + ptms->tms_cstime = 0; + return result; +} From 6fed0c7f27b1d04ac4201c13f2ff51de0f3b63db Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Wed, 23 Sep 2015 00:09:02 +0300 Subject: [PATCH 22/86] Implement _stat_r and _fstat_r. --- newlib/libc/sys/vita/syscalls.c | 88 +++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 59b7a40183..6dcb224234 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -76,13 +76,6 @@ _fork_r(struct _reent *reent) return -1; } -int -_fstat_r(struct _reent *reent, int fd, struct stat *st) -{ - reent->_errno = ENOSYS; - return -1; -} - int _getpid_r(struct _reent *reent) { @@ -217,13 +210,6 @@ _readlink_r(struct _reent *reent, const char *path, char *buf, size_t bufsize) return -1; } -int -_stat_r(struct _reent *reent, const char *path, struct stat *buf) -{ - reent->_errno = EIO; - return -1; -} - int _unlink_r(struct _reent *reent, const char * path) { @@ -260,3 +246,77 @@ _times_r(struct _reent *reent, struct tms *ptms) ptms->tms_cstime = 0; return result; } + +struct SceDateTime { + unsigned short year; + unsigned short month; + unsigned short day; + unsigned short hour; + unsigned short minute; + unsigned short second; + unsigned int microsecond; +}; + +struct SceIoStat { + int st_mode; + unsigned int st_attr; + long long st_size; + struct SceDateTime st_ctime; + struct SceDateTime st_atime; + struct SceDateTime st_mtime; + unsigned st_private[6]; +}; + +enum { + SCE_DIR = 0x1000, + SCE_REG = 0x2000, + SCE_STATFMT = 0xf000 +}; + +#define SCE_ISREG(x) (((x) & SCE_STATFMT) == SCE_REG) +#define SCE_ISDIR(x) (((x) & SCE_STATFMT) == SCE_DIR) + +static void +scestat_to_stat(struct SceIoStat *in, struct stat *out) { + memset(out, 0, sizeof(*out)); + out->st_size = in->st_size; + if (SCE_ISREG(in->st_mode)) + out->st_mode |= _IFREG; + if (SCE_ISDIR(in->st_mode)) + out->st_mode |= _IFDIR; + sceRtcGetTime_t(&in->st_atime, &out->st_atime); + sceRtcGetTime_t(&in->st_mtime, &out->st_mtime); + sceRtcGetTime_t(&in->st_ctime, &out->st_ctime); +} + +int +_fstat_r(struct _reent *reent, int fd, struct stat *st) +{ + struct SceIoStat stat = {0}; + int ret; + if ((unsigned)fd > MAX_OPEN_FILES) { + reent->_errno = EINVAL; + return -1; + } + if ((ret = sceIoGetstatByFd(fd_to_scefd[fd], &stat)) < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + scestat_to_stat(&stat, st); + reent->_errno = 0; + return 0; +} + +int +_stat_r(struct _reent *reent, const char *path, struct stat *st) +{ + struct SceIoStat stat = {0}; + int ret; + if ((ret = sceIoGetstat(path, &stat)) < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + scestat_to_stat(&stat, st); + reent->_errno = 0; + return 0; +} \ No newline at end of file From d029bbe712d937a378a23c9b7660b2d225aa7541 Mon Sep 17 00:00:00 2001 From: Glenn Anderson Date: Sun, 27 Sep 2015 23:47:17 -0400 Subject: [PATCH 23/86] Allows building the manuals using recent versions of TexInfo. (See here: https://sourceware.org/ml/newlib/2015/msg00624.html) --- newlib/doc/doc.str | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/doc/doc.str b/newlib/doc/doc.str index 51ecef7f4a..aeef6f75ed 100644 --- a/newlib/doc/doc.str +++ b/newlib/doc/doc.str @@ -107,7 +107,7 @@ courierize do_fancy_stuff catstr - "@*\n" catstr + "@sp 1\n" catstr ; : asection From eca3c697853b5c4a258639c48fb8e30901cd6840 Mon Sep 17 00:00:00 2001 From: Glenn Anderson Date: Sun, 8 Nov 2015 12:06:40 -0500 Subject: [PATCH 24/86] Frees the heap memblock when exiting homebrew. --- newlib/libc/sys/vita/crt0.c | 4 ++++ newlib/libc/sys/vita/sbrk.c | 9 +++++++++ newlib/libc/sys/vita/syscalls.c | 2 ++ 3 files changed, 15 insertions(+) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index bed90edba4..eb1b658d11 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -9,6 +9,10 @@ void _init_vita_newlib(void) { sceKernelCreateLwMutex(_newlib_fd_mutex, "fd conversion table mutex", 0, 0, 0); } +void _free_vita_newlib(void) { + _free_vita_heap(); +} + void _start() { _init_vita_newlib(); __libc_init_array(); diff --git a/newlib/libc/sys/vita/sbrk.c b/newlib/libc/sys/vita/sbrk.c index 068615198b..94f93f4966 100755 --- a/newlib/libc/sys/vita/sbrk.c +++ b/newlib/libc/sys/vita/sbrk.c @@ -52,3 +52,12 @@ void _init_vita_heap(void) { _newlib_heap_base = 0; _newlib_heap_cur = 0; } + +void _free_vita_heap(void) { + // Free the heap memblock to avoid memory leakage. + sceKernelFreeMemBlock(_newlib_heap_memblock); + + _newlib_heap_memblock = 0; + _newlib_heap_base = 0; + _newlib_heap_cur = 0; +} diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 6dcb224234..f95080b0a4 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -39,6 +39,8 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) void _exit(int rc) { + _free_vita_newlib(); + uvl_exit(rc); } From 0003640a6c44a12bdf1a60df1d7f9488bf4c8670 Mon Sep 17 00:00:00 2001 From: Sergi Granell Date: Fri, 22 Jan 2016 17:09:58 +0100 Subject: [PATCH 25/86] Destroy _newlib_sbrk_mutex at _free_vita_heap --- newlib/libc/sys/vita/sbrk.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/newlib/libc/sys/vita/sbrk.c b/newlib/libc/sys/vita/sbrk.c index 94f93f4966..7cf2f96eeb 100755 --- a/newlib/libc/sys/vita/sbrk.c +++ b/newlib/libc/sys/vita/sbrk.c @@ -54,6 +54,9 @@ void _init_vita_heap(void) { } void _free_vita_heap(void) { + // Destroy the sbrk mutex + sceKernelDeleteLwMutex(_newlib_sbrk_mutex); + // Free the heap memblock to avoid memory leakage. sceKernelFreeMemBlock(_newlib_heap_memblock); From 6073de55a3ae87b436e5789835b4984a1cf80ac9 Mon Sep 17 00:00:00 2001 From: Sergi Granell Date: Fri, 22 Jan 2016 17:15:58 +0100 Subject: [PATCH 26/86] Add _free_vita_reent and _free_vita_malloc --- newlib/libc/sys/vita/crt0.c | 2 ++ newlib/libc/sys/vita/mlock.c | 4 ++++ newlib/libc/sys/vita/threading.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index eb1b658d11..13bc5dea9a 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -10,6 +10,8 @@ void _init_vita_newlib(void) { } void _free_vita_newlib(void) { + _free_vita_malloc(); + _free_vita_reent(); _free_vita_heap(); } diff --git a/newlib/libc/sys/vita/mlock.c b/newlib/libc/sys/vita/mlock.c index 8914eacfa4..6b5774ce9d 100755 --- a/newlib/libc/sys/vita/mlock.c +++ b/newlib/libc/sys/vita/mlock.c @@ -11,3 +11,7 @@ void __malloc_unlock(struct _reent *r) { void _init_vita_malloc(void) { sceKernelCreateLwMutex(_newlib_malloc_mutex, "malloc mutex", 2, 0, 0); } + +void _free_vita_malloc(void) { + sceKernelDeleteLwMutex(_newlib_malloc_mutex); +} diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index ea1f60fabe..a16d4eb53c 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -103,3 +103,7 @@ void _init_vita_reent(void) { *(struct _reent **)(TLS_REENT_PTR) = &reent_list[0].reent; _REENT_INIT_PTR(&_newlib_global_reent); } + +void _free_vita_reent(void) { + sceKernelDeleteMutex(_newlib_reent_mutex); +} From 2a77c3980f28c41fff61a43a03aa5fa6c6f91864 Mon Sep 17 00:00:00 2001 From: Sergi Granell Date: Sat, 23 Jan 2016 14:34:20 +0100 Subject: [PATCH 27/86] Free _newlib_fd_mutex at _free_vita_newlib --- newlib/libc/sys/vita/crt0.c | 1 + 1 file changed, 1 insertion(+) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index 13bc5dea9a..2b8eedb459 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -13,6 +13,7 @@ void _free_vita_newlib(void) { _free_vita_malloc(); _free_vita_reent(); _free_vita_heap(); + sceKernelDeleteLwMutex(_newlib_fd_mutex); } void _start() { From 520ff20437c58e013832f186f7122c5a4c94b1ab Mon Sep 17 00:00:00 2001 From: Yifan Lu Date: Thu, 23 Jun 2016 14:04:56 -0500 Subject: [PATCH 28/86] Removed UVL calls from newlib. Is a hack and not the right place. Homebrew using UVL that requires logging should import and make the log call themselves (preferably with a compile time define). Calling uvl_exit() is not needed in normal operations (a return from the thread start function automatically releases the thread). --- newlib/libc/sys/vita/syscalls.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index f95080b0a4..a81f58b47f 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -22,7 +22,6 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) return -1; } if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { - ret = uvl_log_write(buf, nbytes); if (ret == 0) ret = nbytes; } else { @@ -40,8 +39,6 @@ void _exit(int rc) { _free_vita_newlib(); - - uvl_exit(rc); } int From 8cb9ce7f4e258b124584457230b4bb34d3c4579c Mon Sep 17 00:00:00 2001 From: Yifan Lu Date: Thu, 23 Jun 2016 21:27:26 -0500 Subject: [PATCH 29/86] Added default stdin/out/err implementations for Vita --- newlib/libc/sys/vita/Makefile.am | 2 +- newlib/libc/sys/vita/Makefile.in | 10 +++++-- newlib/libc/sys/vita/crt0.c | 6 ++--- newlib/libc/sys/vita/io.c | 45 ++++++++++++++++++++++++++++++++ newlib/libc/sys/vita/syscalls.c | 14 +++++----- 5 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 newlib/libc/sys/vita/io.c diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 800371e24a..fdbae43a3e 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,7 +8,7 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index 11740df66b..519baa6fb2 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -69,7 +69,7 @@ ARFLAGS = cru lib_a_AR = $(AR) $(ARFLAGS) lib_a_LIBADD = am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ - lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) + lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) lib_a-io.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -195,7 +195,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. @@ -270,6 +270,12 @@ lib_a-sbrk.o: sbrk.c lib_a-sbrk.obj: sbrk.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sbrk.obj `if test -f 'sbrk.c'; then $(CYGPATH_W) 'sbrk.c'; else $(CYGPATH_W) '$(srcdir)/sbrk.c'; fi` +lib_a-io.o: io.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-io.o `test -f 'io.c' || echo '$(srcdir)/'`io.c + +lib_a-io.obj: io.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-io.obj `if test -f 'io.c'; then $(CYGPATH_W) 'io.c'; else $(CYGPATH_W) '$(srcdir)/io.c'; fi` + lib_a-threading.o: threading.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-threading.o `test -f 'threading.c' || echo '$(srcdir)/'`threading.c diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index 2b8eedb459..8edf156c4d 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -1,19 +1,17 @@ -extern char _newlib_fd_mutex[32]; - int main(int argc, const char* argv[]); void _init_vita_newlib(void) { _init_vita_heap(); _init_vita_reent(); _init_vita_malloc(); - sceKernelCreateLwMutex(_newlib_fd_mutex, "fd conversion table mutex", 0, 0, 0); + _init_vita_io(); } void _free_vita_newlib(void) { + _free_vita_io(); _free_vita_malloc(); _free_vita_reent(); _free_vita_heap(); - sceKernelDeleteLwMutex(_newlib_fd_mutex); } void _start() { diff --git a/newlib/libc/sys/vita/io.c b/newlib/libc/sys/vita/io.c new file mode 100644 index 0000000000..b4c920f826 --- /dev/null +++ b/newlib/libc/sys/vita/io.c @@ -0,0 +1,45 @@ +#include +#include + +extern char _newlib_fd_mutex[]; +extern int fd_to_scefd[]; + +void _init_vita_io(void) { + int ret; + + sceKernelCreateLwMutex(_newlib_fd_mutex, "fd conversion table mutex", 0, 0, 0); + + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + ret = sceIoOpen("tty0:", O_RDONLY, 0); + if (ret >= 0) { + fd_to_scefd[STDIN_FILENO] = ret; + } + ret = sceIoOpen("tty0:", O_WRONLY, 0); + if (ret >= 0) { + fd_to_scefd[STDOUT_FILENO] = ret; + } + ret = sceIoOpen("tty0:", O_WRONLY, 0); + if (ret >= 0) { + fd_to_scefd[STDERR_FILENO] = ret; + } + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); +} + +void _free_vita_io(void) { + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + if (fd_to_scefd[STDIN_FILENO]) { + sceIoClose(fd_to_scefd[STDIN_FILENO]); + fd_to_scefd[STDIN_FILENO] = 0; + } + if (fd_to_scefd[STDOUT_FILENO]) { + sceIoClose(fd_to_scefd[STDOUT_FILENO]); + fd_to_scefd[STDOUT_FILENO] = 0; + } + if (fd_to_scefd[STDERR_FILENO]) { + sceIoClose(fd_to_scefd[STDERR_FILENO]); + fd_to_scefd[STDERR_FILENO] = 0; + } + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + + sceKernelDeleteLwMutex(_newlib_fd_mutex); +} diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index a81f58b47f..21c290b017 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -10,7 +10,7 @@ #define SCE_ERRNO_MASK 0xFF #define MAX_OPEN_FILES 1024 -static int fd_to_scefd[MAX_OPEN_FILES]; +int fd_to_scefd[MAX_OPEN_FILES]; char _newlib_fd_mutex[32] __attribute__ ((aligned (8))); _ssize_t @@ -21,9 +21,9 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) reent->_errno = EINVAL; return -1; } - if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { - if (ret == 0) - ret = nbytes; + if ((fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) + && fd_to_scefd[fd] == 0) { + ret = nbytes; } else { ret = sceIoWrite(fd_to_scefd[fd], buf, nbytes); } @@ -190,8 +190,10 @@ _read_r(struct _reent *reent, int fd, void *ptr, size_t len) return 01; } if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { - reent->_errno = 0; - return len; + if (fd_to_scefd[fd] == 0) { + reent->_errno = 0; + return len; + } } ret = sceIoRead(fd_to_scefd[fd], ptr, len); if (ret < 0) { From 0b71f1aa4b04618d40dcc66c5b84427fb645b0fb Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Sun, 24 Jul 2016 10:34:30 -0400 Subject: [PATCH 30/86] Fix permissions --- newlib/libc/sys/vita/syscalls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 21c290b017..7995daa385 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -157,7 +157,7 @@ _open_r(struct _reent *reent, const char *file, int flags, int mode) { int ret, i, found = 0; flags = _fcntl2sony(flags); - ret = sceIoOpen(file, flags, 0600); + ret = sceIoOpen(file, flags, 0666); if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; From 0ec1e80dff80865742d9b674c8c143507d213bc2 Mon Sep 17 00:00:00 2001 From: Ilya Zhuravlev Date: Tue, 26 Jul 2016 08:47:26 -0700 Subject: [PATCH 31/86] vita: make read EOF when reading from stdin/out/err --- newlib/libc/sys/vita/syscalls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 7995daa385..ed2ca96ed6 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -192,7 +192,7 @@ _read_r(struct _reent *reent, int fd, void *ptr, size_t len) if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { if (fd_to_scefd[fd] == 0) { reent->_errno = 0; - return len; + return 0; } } ret = sceIoRead(fd_to_scefd[fd], ptr, len); From 90b1a0f5c84d424c7fa54c535b0f5b139f7cf55c Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Tue, 2 Aug 2016 21:41:31 -0700 Subject: [PATCH 32/86] End process when calling exit --- newlib/libc/sys/vita/syscalls.c | 1 + 1 file changed, 1 insertion(+) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index ed2ca96ed6..a0895e12f1 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -39,6 +39,7 @@ void _exit(int rc) { _free_vita_newlib(); + sceKernelExitProcess(rc); } int From 9168bab7b6a524f8b6cc07329c4b6995bbfc1203 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Wed, 17 Aug 2016 19:06:09 -0700 Subject: [PATCH 33/86] Implement a few ways to kill yourself --- newlib/libc/sys/vita/syscalls.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index a0895e12f1..609053f963 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -105,8 +106,21 @@ _isatty_r(struct _reent *reent, int file) int _kill_r(struct _reent *reent, int pid, int sig) { - reent->_errno = ENOSYS; - return -1; + if (pid != sceKernelGetProcessId()) { + reent->_errno = EPERM; + return -1; + } + switch (sig) { + default: + __builtin_trap(); + case SIGINT: + case SIGTERM: + sceKernelExitProcess(-sig); + break; + case SIGCHLD: + case SIGCONT: + return 0; + } } int From 885eb2caa5fece03f474cece4beae1ac07da08b2 Mon Sep 17 00:00:00 2001 From: Davee Date: Sun, 4 Sep 2016 22:01:15 +0100 Subject: [PATCH 34/86] added sockets to newlib --- newlib/libc/sys/vita/Makefile.am | 8 +- newlib/libc/sys/vita/Makefile.in | 88 +++--- newlib/libc/sys/vita/aclocal.m4 | 355 +++++++++++---------- newlib/libc/sys/vita/configure | 148 ++++----- newlib/libc/sys/vita/io.c | 158 +++++++--- newlib/libc/sys/vita/socket.c | 433 ++++++++++++++++++++++++++ newlib/libc/sys/vita/sys/socket.h | 274 ++++++++++++++++ newlib/libc/sys/vita/syscalls.c | 235 ++++++++------ newlib/libc/sys/vita/vitadescriptor.h | 58 ++++ newlib/libc/sys/vita/vitaglue.h | 32 ++ 10 files changed, 1369 insertions(+), 420 deletions(-) create mode 100644 newlib/libc/sys/vita/socket.c create mode 100644 newlib/libc/sys/vita/sys/socket.h create mode 100644 newlib/libc/sys/vita/vitadescriptor.h create mode 100644 newlib/libc/sys/vita/vitaglue.h diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index fdbae43a3e..94a5a6acd0 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,11 +8,17 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o + +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c +lib_a_LIBADD = ${SOCKET_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) all-local: crt0.o +$(SOCKET_OBJS): socket.c + $(COMPILE) -DF_$* $< -c -o $@ + ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index 519baa6fb2..bd19696ceb 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.12.6 from Makefile.am. +# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2012 Free Software Foundation, Inc. - +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -53,7 +54,7 @@ host_triplet = @host@ subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ - $(top_srcdir)/../../../../mkinstalldirs + $(srcdir)/../../../../mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../../../acinclude.m4 \ $(top_srcdir)/configure.in @@ -67,9 +68,10 @@ CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru lib_a_AR = $(AR) $(ARFLAGS) -lib_a_LIBADD = +lib_a_DEPENDENCIES = $(SOCKET_OBJS) am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ - lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) lib_a-io.$(OBJEXT) + lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ + lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -86,8 +88,6 @@ am__can_run_installinfo = \ esac ETAGS = etags CTAGS = ctags -CSCOPE = cscope -AM_RECURSIVE_TARGETS = cscope ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ @@ -182,6 +182,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -195,7 +196,9 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c +lib_a_LIBADD = ${SOCKET_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. @@ -270,12 +273,6 @@ lib_a-sbrk.o: sbrk.c lib_a-sbrk.obj: sbrk.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sbrk.obj `if test -f 'sbrk.c'; then $(CYGPATH_W) 'sbrk.c'; else $(CYGPATH_W) '$(srcdir)/sbrk.c'; fi` -lib_a-io.o: io.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-io.o `test -f 'io.c' || echo '$(srcdir)/'`io.c - -lib_a-io.obj: io.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-io.obj `if test -f 'io.c'; then $(CYGPATH_W) 'io.c'; else $(CYGPATH_W) '$(srcdir)/io.c'; fi` - lib_a-threading.o: threading.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-threading.o `test -f 'threading.c' || echo '$(srcdir)/'`threading.c @@ -288,6 +285,18 @@ lib_a-mlock.o: mlock.c lib_a-mlock.obj: mlock.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mlock.obj `if test -f 'mlock.c'; then $(CYGPATH_W) 'mlock.c'; else $(CYGPATH_W) '$(srcdir)/mlock.c'; fi` +lib_a-io.o: io.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-io.o `test -f 'io.c' || echo '$(srcdir)/'`io.c + +lib_a-io.obj: io.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-io.obj `if test -f 'io.c'; then $(CYGPATH_W) 'io.c'; else $(CYGPATH_W) '$(srcdir)/io.c'; fi` + +lib_a-socket.o: socket.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-socket.o `test -f 'socket.c' || echo '$(srcdir)/'`socket.c + +lib_a-socket.obj: socket.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-socket.obj `if test -f 'socket.c'; then $(CYGPATH_W) 'socket.c'; else $(CYGPATH_W) '$(srcdir)/socket.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -337,32 +346,8 @@ GTAGS: && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) - -clean-cscope: - -rm -f cscope.files - -cscope.files: clean-cscope cscopelist - -cscopelist: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files check-am: check: check-am all-am: Makefile $(LIBRARIES) all-local @@ -470,21 +455,24 @@ uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am all-local am--refresh check check-am \ - clean clean-cscope clean-generic clean-noinstLIBRARIES cscope \ - cscopelist ctags distclean distclean-compile distclean-generic \ - distclean-tags dvi dvi-am html html-am info info-am install \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ - tags uninstall uninstall-am + clean clean-generic clean-noinstLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-tags dvi dvi-am \ + html html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am all-local: crt0.o +$(SOCKET_OBJS): socket.c + $(COMPILE) -DF_$* $< -c -o $@ + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/newlib/libc/sys/vita/aclocal.m4 b/newlib/libc/sys/vita/aclocal.m4 index 5fb014d775..62fe272e2c 100644 --- a/newlib/libc/sys/vita/aclocal.m4 +++ b/newlib/libc/sys/vita/aclocal.m4 @@ -1,7 +1,8 @@ -# generated automatically by aclocal 1.12.6 -*- Autoconf -*- - -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# generated automatically by aclocal 1.11.6 -*- Autoconf -*- +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, +# Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -17,24 +18,27 @@ m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. -To do so, use the procedure documented by the package, typically 'autoreconf'.])]) +To do so, use the procedure documented by the package, typically `autoreconf'.])]) -# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software +# Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 1 + # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.12' +[am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.12.6], [], +m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -50,22 +54,24 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.12.6])dnl +[AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 1 + # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to -# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and @@ -84,7 +90,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is '.', but things will broke when you +# harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, @@ -110,19 +116,22 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 9 + # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ([2.52])dnl - m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl @@ -141,14 +150,16 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, +# 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 12 -# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing @@ -158,7 +169,7 @@ fi])]) # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was @@ -171,13 +182,12 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], - [$1], [CXX], [depcc="$CXX" am_compiler_list=], - [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], - [$1], [UPC], [depcc="$UPC" am_compiler_list=], - [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], @@ -185,8 +195,8 @@ AC_CACHE_CHECK([dependency style of $depcc], # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -226,16 +236,16 @@ AC_CACHE_CHECK([dependency style of $depcc], : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -244,8 +254,8 @@ AC_CACHE_CHECK([dependency style of $depcc], test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else @@ -253,7 +263,7 @@ AC_CACHE_CHECK([dependency style of $depcc], fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -301,7 +311,7 @@ AM_CONDITIONAL([am__fastdep$1], [ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl @@ -311,13 +321,9 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE([dependency-tracking], [dnl -AS_HELP_STRING( - [--enable-dependency-tracking], - [do not reject slow dependency extractors]) -AS_HELP_STRING( - [--disable-dependency-tracking], - [speeds up one-time build])]) +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' @@ -332,12 +338,14 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ @@ -356,7 +364,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -368,19 +376,21 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` @@ -398,7 +408,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will +# is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], @@ -408,12 +418,15 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 16 + # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. @@ -458,41 +471,31 @@ AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[AC_DIAGNOSE([obsolete], -[$0: two- and three-arguments forms are deprecated. For more info, see: -http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) -m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. -m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), - [ok:ok],, +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) - AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) -AM_MISSING_PROG([AUTOCONF], [autoconf]) -AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) -AM_MISSING_PROG([AUTOHEADER], [autoheader]) -AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl @@ -503,35 +506,28 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES([CC])], - [m4_define([AC_PROG_CC], - m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES([CXX])], - [m4_define([AC_PROG_CXX], - m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES([OBJC])], - [m4_define([AC_PROG_OBJC], - m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -dnl Support for Objective C++ was only introduced in Autoconf 2.65, -dnl but we still cater to Autoconf 2.62. -m4_ifdef([AC_PROG_OBJCXX], -[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], - [_AM_DEPENDENCIES([OBJCXX])], - [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) -dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], @@ -559,12 +555,15 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, +# Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 1 + # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. @@ -578,14 +577,16 @@ if test x"${install_sh}" != xset; then install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST([install_sh])]) +AC_SUBST(install_sh)]) -# Copyright (C) 2003-2012 Free Software Foundation, Inc. +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -602,17 +603,20 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, +# 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 5 + # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. -# Default is to disable them, unless 'enable' is passed literally. -# For symmetry, 'disable' may be passed as well. Anyway, the user +# Default is to disable them, unless `enable' is passed literally. +# For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), @@ -623,11 +627,10 @@ AC_DEFUN([AM_MAINTAINER_MODE], AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], - [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], - am_maintainer_other[ make rules and dependencies not useful - (and sometimes confusing) to the casual installer])], - [USE_MAINTAINER_MODE=$enableval], - [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) +[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE @@ -639,12 +642,14 @@ AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 4 + # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. @@ -662,7 +667,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -689,12 +694,15 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 6 + # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -702,6 +710,7 @@ AC_DEFUN([AM_MISSING_PROG], $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) + # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. @@ -722,18 +731,50 @@ if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - AC_MSG_WARN(['missing' script is too old or missing]) + AC_MSG_WARN([`missing' script is too old or missing]) fi ]) +# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software +# Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 5 + # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], @@ -743,7 +784,7 @@ AC_DEFUN([_AM_MANGLE_OPTION], # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ @@ -759,16 +800,22 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 5 + # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -779,40 +826,32 @@ case `pwd` in esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken - alias in your environment]) - fi - if test "$[2]" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + test "$[2]" = conftest.file ) then @@ -822,58 +861,46 @@ else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT([yes]) -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi -AC_CONFIG_COMMANDS_PRE( - [AC_MSG_CHECKING([that generated files are newer than configure]) - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - AC_MSG_RESULT([done])]) -rm -f conftest.file -]) +AC_MSG_RESULT(yes)]) -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 1 + # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor 'install' (even GNU) is that you can't +# One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in "make install-strip", and initialize +# always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2012 Free Software Foundation, Inc. +# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 3 + # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -887,16 +914,18 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2012 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory @@ -919,7 +948,7 @@ AC_MSG_CHECKING([how to create a $1 tar archive]) _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of '-'. +# Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in diff --git a/newlib/libc/sys/vita/configure b/newlib/libc/sys/vita/configure index 548219857f..e9c088dfdd 100755 --- a/newlib/libc/sys/vita/configure +++ b/newlib/libc/sys/vita/configure @@ -679,6 +679,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -755,6 +756,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1007,6 +1009,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1144,7 +1155,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1297,6 +1308,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1343,13 +1355,10 @@ Optional Features: --enable-newlib-elix-level supply desired elix library level (1-4) --disable-newlib-io-float disable printf/scanf family float support --disable-newlib-supplied-syscalls disable newlib from supplying syscalls - --enable-dependency-tracking - do not reject slow dependency extractors - --disable-dependency-tracking - speeds up one-time build - --enable-maintainer-mode - enable make rules and dependencies not useful (and - sometimes confusing) to the casual installer + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer Some influential environment variables: CCAS assembler compiler command (defaults to CC) @@ -1926,7 +1935,7 @@ IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -am__api_version='1.12' +am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2023,6 +2032,9 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -2033,40 +2045,32 @@ case `pwd` in esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac -# Do 'set' in a subshell so we don't clobber the current shell's +# Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - am_has_slept=no - for am_try in 1 2; do - echo "timestamp, slept: $am_has_slept" > conftest.file - set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t "$srcdir/configure" conftest.file` - fi - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - as_fn_error $? "ls -t appears to fail. Make sure there is not a broken - alias in your environment" "$LINENO" 5 - fi - if test "$2" = conftest.file || test $am_try -eq 2; then - break - fi - # Just in case. - sleep 1 - am_has_slept=yes - done + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + test "$2" = conftest.file ) then @@ -2078,16 +2082,6 @@ Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } -# If we didn't sleep, we still need to ensure time stamps of config.status and -# generated files are strictly newer. -am_sleep_pid= -if grep 'slept: no' conftest.file >/dev/null 2>&1; then - ( sleep 1 ) & - am_sleep_pid=$! -fi - -rm -f conftest.file - test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. @@ -2114,8 +2108,8 @@ if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then @@ -2127,10 +2121,10 @@ if test x"${install_sh}" != xset; then esac fi -# Installed binaries are usually stripped using 'strip' when the user -# run "make install-strip". However 'strip' might not be the right +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake -# will honor the 'STRIP' environment variable to overrule this program. +# will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. @@ -2269,6 +2263,12 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -2370,7 +2370,7 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. +# Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include @@ -2574,12 +2574,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# For better backward compatibility. To be removed once Automake 1.9.x -# dies out for good. For more background, see: -# -# -mkdir_p='$(MKDIR_P)' - # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used @@ -2654,8 +2648,8 @@ else # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named 'D' -- because '-MD' means "put the output - # in D". + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're @@ -2690,16 +2684,16 @@ else : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with - # Solaris 10 /bin/sh. - echo '/* dummy */' > sub/conftst$i.h + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - # We check with '-c' and '-o' for the sake of the "dashmstdout" + # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly - # handle '-M -o', and we need to detect this. Also, some Intel - # versions had trouble with output in subdirs. + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in @@ -2708,8 +2702,8 @@ else test "$am__universal" = false || continue ;; nosideeffect) - # After this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested. + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else @@ -2717,7 +2711,7 @@ else fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) - # This compiler won't grok '-c -o', but also, the minuso test has + # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} @@ -3594,14 +3588,6 @@ if test -z "${MAY_SUPPLY_SYSCALLS_TRUE}" && test -z "${MAY_SUPPLY_SYSCALLS_FALSE as_fn_error $? "conditional \"MAY_SUPPLY_SYSCALLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 -$as_echo_n "checking that generated files are newer than configure... " >&6; } - if test -n "$am_sleep_pid"; then - # Hide warnings about reused PIDs. - wait $am_sleep_pid 2>/dev/null - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 -$as_echo "done" >&6; } if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. @@ -4656,7 +4642,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but + # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. @@ -4690,19 +4676,21 @@ $as_echo X"$mf" | continue fi # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. + # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || diff --git a/newlib/libc/sys/vita/io.c b/newlib/libc/sys/vita/io.c index b4c920f826..cd42b7d51d 100644 --- a/newlib/libc/sys/vita/io.c +++ b/newlib/libc/sys/vita/io.c @@ -1,45 +1,131 @@ #include #include -extern char _newlib_fd_mutex[]; -extern int fd_to_scefd[]; +#include + +#include "vitadescriptor.h" + +DescriptorTranslation *__vita_fdmap[MAX_OPEN_FILES]; +DescriptorTranslation __vita_fdmap_pool[MAX_OPEN_FILES]; + +char _newlib_fd_mutex[32] __attribute__ ((aligned (8))); void _init_vita_io(void) { - int ret; - - sceKernelCreateLwMutex(_newlib_fd_mutex, "fd conversion table mutex", 0, 0, 0); - - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); - ret = sceIoOpen("tty0:", O_RDONLY, 0); - if (ret >= 0) { - fd_to_scefd[STDIN_FILENO] = ret; - } - ret = sceIoOpen("tty0:", O_WRONLY, 0); - if (ret >= 0) { - fd_to_scefd[STDOUT_FILENO] = ret; - } - ret = sceIoOpen("tty0:", O_WRONLY, 0); - if (ret >= 0) { - fd_to_scefd[STDERR_FILENO] = ret; - } - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + int ret; + sceKernelCreateLwMutex(_newlib_fd_mutex, "fd conversion table mutex", 0, 1, NULL); + + memset(__vita_fdmap, 0, sizeof(__vita_fdmap)); + memset(__vita_fdmap_pool, 0, sizeof(__vita_fdmap_pool)); + + // TODO: do we prefer sceKernelStdin and friends? + ret = sceIoOpen("tty0:", SCE_O_RDONLY, 0); + + if (ret >= 0) { + __vita_fdmap[STDIN_FILENO] = &__vita_fdmap_pool[STDIN_FILENO]; + __vita_fdmap[STDIN_FILENO]->sce_uid = ret; + __vita_fdmap[STDIN_FILENO]->type = VITA_DESCRIPTOR_TTY; + __vita_fdmap[STDIN_FILENO]->ref_count = 1; + } + + ret = sceIoOpen("tty0:", SCE_O_WRONLY, 0); + + if (ret >= 0) { + __vita_fdmap[STDOUT_FILENO] = &__vita_fdmap_pool[STDOUT_FILENO]; + __vita_fdmap[STDOUT_FILENO]->sce_uid = ret; + __vita_fdmap[STDOUT_FILENO]->type = VITA_DESCRIPTOR_TTY; + __vita_fdmap[STDOUT_FILENO]->ref_count = 1; + } + + ret = sceIoOpen("tty0:", SCE_O_WRONLY, 0); + + if (ret >= 0) { + __vita_fdmap[STDERR_FILENO] = &__vita_fdmap_pool[STDERR_FILENO]; + __vita_fdmap[STDERR_FILENO]->sce_uid = ret; + __vita_fdmap[STDERR_FILENO]->type = VITA_DESCRIPTOR_TTY; + __vita_fdmap[STDERR_FILENO]->ref_count = 1; + } + + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); } void _free_vita_io(void) { - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); - if (fd_to_scefd[STDIN_FILENO]) { - sceIoClose(fd_to_scefd[STDIN_FILENO]); - fd_to_scefd[STDIN_FILENO] = 0; - } - if (fd_to_scefd[STDOUT_FILENO]) { - sceIoClose(fd_to_scefd[STDOUT_FILENO]); - fd_to_scefd[STDOUT_FILENO] = 0; - } - if (fd_to_scefd[STDERR_FILENO]) { - sceIoClose(fd_to_scefd[STDERR_FILENO]); - fd_to_scefd[STDERR_FILENO] = 0; - } - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); - - sceKernelDeleteLwMutex(_newlib_fd_mutex); + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + + if (__vita_fdmap[STDIN_FILENO]) { + sceIoClose(__vita_fdmap[STDIN_FILENO]->sce_uid); + memset(__vita_fdmap[STDIN_FILENO], 0, sizeof(DescriptorTranslation)); + __vita_fdmap[STDIN_FILENO] = NULL; + } + if (__vita_fdmap[STDOUT_FILENO]) { + sceIoClose(__vita_fdmap[STDOUT_FILENO]->sce_uid); + memset(__vita_fdmap[STDOUT_FILENO], 0, sizeof(DescriptorTranslation)); + __vita_fdmap[STDOUT_FILENO] = NULL; + } + if (__vita_fdmap[STDERR_FILENO]) { + sceIoClose(__vita_fdmap[STDERR_FILENO]->sce_uid); + memset(__vita_fdmap[STDERR_FILENO], 0, sizeof(DescriptorTranslation)); + __vita_fdmap[STDERR_FILENO] = NULL; + } + + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + sceKernelDeleteLwMutex(_newlib_fd_mutex); +} + +int __vita_acquire_descriptor(void) +{ + int fd = -1; + int i = 0; + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + + // get free descriptor + for (fd = 0; fd < MAX_OPEN_FILES; ++fd) + { + if (__vita_fdmap[fd] == NULL) + { + // get free pool + for (i = 0; i < MAX_OPEN_FILES; ++i) + { + if (__vita_fdmap_pool[i].ref_count == 0) + { + __vita_fdmap[fd] = &__vita_fdmap_pool[i]; + __vita_fdmap[fd]->ref_count = 1; + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + return fd; + } + } + } + } + + // no mores descriptors available... + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + return -1; +} + +int __vita_release_descriptor(int fd) +{ + int ref_count = -1; + + if (!is_fd_valid(fd)) + return -1; + + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + ref_count = --__vita_fdmap[fd]->ref_count; + + if (__vita_fdmap[fd]->ref_count == 0) + { + memset(__vita_fdmap[fd], 0, sizeof(DescriptorTranslation)); + } + + __vita_fdmap[fd] = NULL; + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + return ref_count; +} + +int __vita_descriptor_ref_count(int fd) +{ + int res = 0; + sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + res = __vita_fdmap[fd]->ref_count; + sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + return res; } diff --git a/newlib/libc/sys/vita/socket.c b/newlib/libc/sys/vita/socket.c new file mode 100644 index 0000000000..96e106c1ea --- /dev/null +++ b/newlib/libc/sys/vita/socket.c @@ -0,0 +1,433 @@ +/* + +Copyright (C) 2016, David "Davee" Morgan + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#include +#include + +#include + +#include "vitadescriptor.h" + +#define SCE_ERRNO_MASK 0xFF + +static inline int is_socket_valid(int s) +{ + return (is_fd_valid(s) && (__vita_fdmap[s]->type == VITA_DESCRIPTOR_SOCKET)); +} + +#ifdef F_accept +int accept(int s, struct sockaddr *addr, socklen_t *addrlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetAccept(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + int s2 =__vita_acquire_descriptor(); + + if (s2 < 0) + { + errno = EMFILE; + return -1; + } + + __vita_fdmap[s2]->sce_uid = res; + __vita_fdmap[s2]->type = VITA_DESCRIPTOR_SOCKET; + return s2; +} +#endif + +#ifdef F_bind +int bind(int s, const struct sockaddr *addr, socklen_t addrlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetBind(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int)addrlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_connect +int connect(int s, const struct sockaddr *addr, socklen_t addrlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetConnect(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int)addrlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_getpeername +int getpeername(int s, struct sockaddr *addr, socklen_t *addrlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetGetpeername(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_getsockname +int getsockname(int s, struct sockaddr *addr, socklen_t *addrlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetGetsockname(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_getsockopt +int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetGetsockopt(__vita_fdmap[s]->sce_uid, level, optname, optval, (unsigned int *)optlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_listen +int listen(int s, int backlog) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetListen(__vita_fdmap[s]->sce_uid, backlog); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_recv +ssize_t recv(int s, void *buf, size_t len, int flags) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetRecv(__vita_fdmap[s]->sce_uid, buf, len, flags); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return res; +} +#endif + +#ifdef F_recvfrom +ssize_t recvfrom(int s, void *buf, size_t len, int flags, + struct sockaddr *src_addr, socklen_t *addrlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetRecvfrom(__vita_fdmap[s]->sce_uid, buf, len, flags, (SceNetSockaddr *)src_addr, (unsigned int *)addrlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return res; +} +#endif + +#ifdef F_recvmsg +ssize_t recvmsg(int s, struct msghdr *msg, int flags) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetRecvmsg(__vita_fdmap[s]->sce_uid, (SceNetMsghdr *)msg, flags); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return res; +} +#endif + +#ifdef F_send +ssize_t send(int s, const void *buf, size_t len, int flags) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetSend(__vita_fdmap[s]->sce_uid, buf, len, flags); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return res; + +} +#endif + +#ifdef F_sendto +ssize_t sendto(int s, const void *buf, + size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetSendto(__vita_fdmap[s]->sce_uid, buf, len, flags, (SceNetSockaddr *)dest_addr, (unsigned int)addrlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return res; +} +#endif + +#ifdef F_sendmsg +ssize_t sendmsg(int s, const struct msghdr *msg, int flags) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetSendmsg(__vita_fdmap[s]->sce_uid, (const SceNetMsghdr *)msg, flags); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return res; +} +#endif + +#ifdef F_setsockopt +int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetSetsockopt(__vita_fdmap[s]->sce_uid, level, optname, optval, optlen); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_shutdown +int shutdown(int s, int how) +{ + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int res = sceNetShutdown(__vita_fdmap[s]->sce_uid, how); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} +#endif + +#ifdef F_socket +int socket(int domain, int type, int protocol) +{ + int res = sceNetSocket("", domain, type, protocol); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + int s = __vita_acquire_descriptor(); + + if (s < 0) + { + errno = EMFILE; + return -1; + } + + __vita_fdmap[s]->sce_uid = res; + __vita_fdmap[s]->type = VITA_DESCRIPTOR_SOCKET; + return s; +} + +int __vita_glue_socket_close(int s) +{ + int res = 0; + + if (!is_socket_valid(s)) + { + errno = EBADF; + return -1; + } + + int sce_uid = __vita_fdmap[s]->sce_uid; + int ref_count = __vita_release_descriptor(s); + + if (ref_count < 0) + { + errno = EBADF; + return -1; + } + + if (ref_count == 0) + { + res = sceNetSocketClose(sce_uid); + } + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + return -1; + } + + return 0; +} + +ssize_t __vita_glue_socket_recv(int s, void *buf, size_t len, int flags) +{ + return recv(s, buf, len, flags); +} + +ssize_t __vita_glue_socket_send(int s, const void *buf, size_t len, int flags) +{ + return send(s, buf, len, flags); +} +#endif diff --git a/newlib/libc/sys/vita/sys/socket.h b/newlib/libc/sys/vita/sys/socket.h new file mode 100644 index 0000000000..5c0898f558 --- /dev/null +++ b/newlib/libc/sys/vita/sys/socket.h @@ -0,0 +1,274 @@ +/* $NetBSD: socket.h,v 1.77 2005/11/29 03:12:16 christos Exp $ */ + +/* + * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)socket.h 8.6 (Berkeley) 5/3/95 + */ + +#ifndef _SYS_SOCKET_H_ +#define _SYS_SOCKET_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +typedef uint8_t sa_family_t; +typedef uint32_t socklen_t; + +/* + * Socket types. + */ +#define SOCK_STREAM 1 /* stream socket */ +#define SOCK_DGRAM 2 /* datagram socket */ +#define SOCK_RAW 3 /* raw-protocol interface */ +#define SOCK_RDM 4 /* reliably-delivered message */ +#define SOCK_SEQPACKET 5 /* sequenced packet stream */ + +/* + * Option flags per-socket. + */ +#define SO_DEBUG 0x0001 /* turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_REUSEADDR 0x0004 /* allow local address reuse */ +#define SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define SO_DONTROUTE 0x0010 /* just use interface addresses */ +#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ +#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ +#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ + +/* + * Additional options, not kept in so_options. + */ +#define SO_SNDBUF 0x1001 /* send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ +#define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */ +#define SO_NONBLOCK 0x1009 /* non-blocking I/O */ + +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time in seconds */ +}; + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define SOL_SOCKET 0xffff /* options for socket level */ + +/* + * Address families. + */ +#define AF_UNSPEC 0 /* unspecified */ +#define AF_LOCAL 1 /* local to host (pipes, portals) */ +#define AF_UNIX AF_LOCAL /* backward compatibility */ +#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ +#define AF_IMPLINK 3 /* arpanet imp addresses */ +#define AF_PUP 4 /* pup protocols: e.g. BSP */ +#define AF_CHAOS 5 /* mit CHAOS protocols */ +#define AF_NS 6 /* XEROX NS protocols */ +#define AF_ISO 7 /* ISO protocols */ +#define AF_OSI AF_ISO +#define AF_ECMA 8 /* european computer manufacturers */ +#define AF_DATAKIT 9 /* datakit protocols */ +#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ +#define AF_SNA 11 /* IBM SNA */ +#define AF_DECnet 12 /* DECnet */ +#define AF_DLI 13 /* DEC Direct data link interface */ +#define AF_LAT 14 /* LAT */ +#define AF_HYLINK 15 /* NSC Hyperchannel */ +#define AF_APPLETALK 16 /* Apple Talk */ +#define AF_ROUTE 17 /* Internal Routing Protocol */ +#define AF_LINK 18 /* Link layer interface */ +#define AF_COIP 20 /* connection-oriented IP, aka ST II */ +#define AF_CNT 21 /* Computer Network Technology */ +#define AF_IPX 23 /* Novell Internet Protocol */ +#define AF_INET6 24 /* IP version 6 */ +#define AF_ISDN 26 /* Integrated Services Digital Network*/ +#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ +#define AF_NATM 27 /* native ATM access */ +#define AF_ARP 28 /* (rev.) addr. res. prot. (RFC 826) */ +#define AF_MAX 31 + +/* + * Structure used by kernel to store most + * addresses. + */ +struct sockaddr { + uint8_t sa_len; /* total length */ + sa_family_t sa_family; /* address family */ + char sa_data[14]; /* actually longer; address value */ +}; + +/* + * Protocol families, same as address families for now. + */ +#define PF_UNSPEC AF_UNSPEC +#define PF_LOCAL AF_LOCAL +#define PF_UNIX PF_LOCAL /* backward compatibility */ +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_ISO AF_ISO +#define PF_OSI AF_ISO +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_ROUTE AF_ROUTE +#define PF_LINK AF_LINK +#if defined(_NETBSD_SOURCE) +#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ +#endif +#define PF_COIP AF_COIP +#define PF_CNT AF_CNT +#define PF_INET6 AF_INET6 +#define PF_IPX AF_IPX /* same format as AF_NS */ +#if defined(_NETBSD_SOURCE) +#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */ +#define PF_PIP pseudo_AF_PIP +#endif +#define PF_ISDN AF_ISDN /* same as E164 */ +#define PF_E164 AF_E164 +#define PF_NATM AF_NATM +#define PF_ARP AF_ARP +#if defined(_NETBSD_SOURCE) +#define PF_KEY pseudo_AF_KEY /* like PF_ROUTE, only for key mgmt */ +#endif + +#define PF_MAX AF_MAX + +#define MSG_OOB 0x1 /* process out-of-band data */ +#define MSG_PEEK 0x2 /* peek at incoming message */ +#define MSG_DONTROUTE 0x4 /* send without using routing tables */ +#define MSG_EOR 0x8 /* data completes record */ +#define MSG_TRUNC 0x10 /* data discarded before delivery */ +#define MSG_CTRUNC 0x20 /* control data lost before delivery */ +#define MSG_WAITALL 0x40 /* wait for full request or error */ +#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ +#define MSG_BCAST 0x100 /* this message was rcvd using link-level brdcst */ +#define MSG_MCAST 0x200 /* this message was rcvd using link-level mcast */ + +/* + * Types of socket shutdown(2). + */ +#define SHUT_RD 0 /* Disallow further receives. */ +#define SHUT_WR 1 /* Disallow further sends. */ +#define SHUT_RDWR 2 /* Disallow further sends/receives. */ + +struct iovec { + void *iov_base; /* Base address. */ + size_t iov_len; /* Length. */ +}; + +struct msghdr { + void *msg_name; /* optional address */ + socklen_t msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + int msg_iovlen; /* # elements in msg_iov */ + void *msg_control; /* ancillary data, see below */ + socklen_t msg_controllen; /* ancillary data buffer len */ + int msg_flags; /* flags on received message */ +}; + +/* BSD-compatible socket API. */ +int accept(int, struct sockaddr * __restrict, socklen_t * __restrict); +int bind(int, const struct sockaddr *, socklen_t); +int connect(int, const struct sockaddr *, socklen_t); +int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict); +int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict); +int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); +int listen(int, int); +ssize_t recv(int, void *, size_t, int); +ssize_t recvfrom(int, void * __restrict, size_t, int, + struct sockaddr * __restrict, socklen_t * __restrict); +ssize_t recvmsg(int s, struct msghdr *msg, int flags); +ssize_t send(int, const void *, size_t, int); +ssize_t sendto(int, const void *, + size_t, int, const struct sockaddr *, socklen_t); +ssize_t sendmsg(int s, const struct msghdr *msg, int flags); +int setsockopt(int, int, int, const void *, socklen_t); +int shutdown(int, int); +int socket(int, int, int); + +#ifdef __cplusplus +} +#endif + +#endif /* !_SYS_SOCKET_H_ */ diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 609053f963..bd9fec4a50 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -8,30 +8,52 @@ #include #include -#define SCE_ERRNO_MASK 0xFF -#define MAX_OPEN_FILES 1024 +#include +#include +#include +#include + +#include + +#include + +#include "vitadescriptor.h" +#include "vitaglue.h" -int fd_to_scefd[MAX_OPEN_FILES]; -char _newlib_fd_mutex[32] __attribute__ ((aligned (8))); + +// TODO: add to SDK +int sceKernelLibcGettimeofday(struct timeval *ptimeval, void *ptimezone); + +#define SCE_ERRNO_MASK 0xFF _ssize_t _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) { int ret; - if ((unsigned)fd > MAX_OPEN_FILES) { - reent->_errno = EINVAL; + + if (!is_fd_valid(fd)) { + reent->_errno = EBADF; return -1; } - if ((fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) - && fd_to_scefd[fd] == 0) { - ret = nbytes; - } else { - ret = sceIoWrite(fd_to_scefd[fd], buf, nbytes); + + switch (__vita_fdmap[fd]->type) + { + case VITA_DESCRIPTOR_FILE: + case VITA_DESCRIPTOR_TTY: + ret = sceIoWrite(__vita_fdmap[fd]->sce_uid, buf, nbytes); + break; + case VITA_DESCRIPTOR_SOCKET: + if (__vita_glue_socket_send) + ret = __vita_glue_socket_send(fd, buf, nbytes, 0); + break; } + if (ret < 0) { - reent->_errno = ret & SCE_ERRNO_MASK; + if (ret != -1) + reent->_errno = ret & SCE_ERRNO_MASK; return -1; } + reent->_errno = 0; return ret; } @@ -41,22 +63,45 @@ _exit(int rc) { _free_vita_newlib(); sceKernelExitProcess(rc); + while (1); } int _close_r(struct _reent *reent, int fd) { - if ((unsigned)fd > MAX_OPEN_FILES) { - reent->_errno = EINVAL; + int ret = 0; + + if (!is_fd_valid(fd)) { + reent->_errno = EBADF; return -1; } - reent->_errno = sceIoClose(fd_to_scefd[fd]) & SCE_ERRNO_MASK; - if (reent->_errno == 0) { - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); - fd_to_scefd[fd] = 0; - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + + switch (__vita_fdmap[fd]->type) + { + case VITA_DESCRIPTOR_FILE: + case VITA_DESCRIPTOR_TTY: + { + int sce_uid = __vita_fdmap[fd]->sce_uid; + int ref_count = __vita_release_descriptor(fd); + + if (ref_count == 0) + ret = sceIoClose(fd); + break; + } + case VITA_DESCRIPTOR_SOCKET: + if (__vita_glue_socket_close) + ret = __vita_glue_socket_close(fd); + break; } - return 0; + + if (ret < 0) { + if (ret != -1) + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + + reent->_errno = 0; + return ret; } char *__env[1] = { 0 }; @@ -97,10 +142,14 @@ _gettimeofday_r(struct _reent *reent, struct timeval *ptimeval, void *ptimezone) } int -_isatty_r(struct _reent *reent, int file) +_isatty_r(struct _reent *reent, int fd) { - reent->_errno = ENOSYS; - return 0; + if (!is_fd_valid(fd)) { + reent->_errno = EBADF; + return 0; + } + + return (__vita_fdmap[fd]->type == VITA_DESCRIPTOR_TTY); } int @@ -134,36 +183,49 @@ _off_t _lseek_r(struct _reent *reent, int fd, _off_t ptr, int dir) { int ret; - if ((unsigned)fd > MAX_OPEN_FILES || fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { - reent->_errno = EINVAL; + + if (!is_fd_valid(fd)) { + reent->_errno = EBADF; return -1; } - ret = sceIoLseek32(fd_to_scefd[fd], ptr, dir); + + switch (__vita_fdmap[fd]->type) + { + case VITA_DESCRIPTOR_FILE: + ret = sceIoLseek32(__vita_fdmap[fd]->sce_uid, ptr, dir); + break; + case VITA_DESCRIPTOR_TTY: + case VITA_DESCRIPTOR_SOCKET: + ret = EBADF; + break; + } + if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; } + return ret; } int _fcntl2sony(int flags) { int out = 0; if (flags & O_RDWR) - out |= 3; + out |= SCE_O_RDWR; else if (flags & O_WRONLY) - out |= 2; + out |= SCE_O_WRONLY; else - out |= 1; + out |= SCE_O_RDONLY; if (flags & O_NONBLOCK) - out |= 4; + out |= SCE_O_NBLOCK; if (flags & O_APPEND) - out |= 0x100; + out |= SCE_O_APPEND; if (flags & O_CREAT) - out |= 0x200; + out |= SCE_O_CREAT; if (flags & O_TRUNC) - out |= 0x400; + out |= SCE_O_TRUNC; if (flags & O_EXCL) - out |= 0x800; + out |= SCE_O_EXCL; return out; } @@ -172,26 +234,25 @@ _open_r(struct _reent *reent, const char *file, int flags, int mode) { int ret, i, found = 0; flags = _fcntl2sony(flags); + ret = sceIoOpen(file, flags, 0666); if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; } - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); - // skip stdin, stdout, stderr - for (i = 3; i < MAX_OPEN_FILES; ++i) - if (fd_to_scefd[i] == 0) { - found = i; - break; - } - if (!found) { - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + + int fd = __vita_acquire_descriptor(); + + if (fd < 0) + { sceIoClose(ret); reent->_errno = EMFILE; return -1; } - fd_to_scefd[found] = ret; - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + + __vita_fdmap[fd]->sce_uid = ret; + __vita_fdmap[fd]->type = VITA_DESCRIPTOR_FILE; + reent->_errno = 0; return found; } @@ -200,21 +261,30 @@ _ssize_t _read_r(struct _reent *reent, int fd, void *ptr, size_t len) { int ret; - if ((unsigned)fd > MAX_OPEN_FILES) { - reent->_errno = EINVAL; - return 01; + + if (!is_fd_valid(fd)) { + reent->_errno = EBADF; + return -1; } - if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO) { - if (fd_to_scefd[fd] == 0) { - reent->_errno = 0; - return 0; - } + + switch (__vita_fdmap[fd]->type) + { + case VITA_DESCRIPTOR_TTY: + case VITA_DESCRIPTOR_FILE: + ret = sceIoRead(__vita_fdmap[fd]->sce_uid, ptr, len); + break; + case VITA_DESCRIPTOR_SOCKET: + if (__vita_glue_socket_recv) + ret = __vita_glue_socket_recv(fd, ptr, len, 0); + break; } - ret = sceIoRead(fd_to_scefd[fd], ptr, len); + if (ret < 0) { - reent->_errno = ret & SCE_ERRNO_MASK; + if (ret != -1) + reent->_errno = ret & SCE_ERRNO_MASK; return -1; } + reent->_errno = 0; return ret; } @@ -263,42 +333,13 @@ _times_r(struct _reent *reent, struct tms *ptms) return result; } -struct SceDateTime { - unsigned short year; - unsigned short month; - unsigned short day; - unsigned short hour; - unsigned short minute; - unsigned short second; - unsigned int microsecond; -}; - -struct SceIoStat { - int st_mode; - unsigned int st_attr; - long long st_size; - struct SceDateTime st_ctime; - struct SceDateTime st_atime; - struct SceDateTime st_mtime; - unsigned st_private[6]; -}; - -enum { - SCE_DIR = 0x1000, - SCE_REG = 0x2000, - SCE_STATFMT = 0xf000 -}; - -#define SCE_ISREG(x) (((x) & SCE_STATFMT) == SCE_REG) -#define SCE_ISDIR(x) (((x) & SCE_STATFMT) == SCE_DIR) - static void scestat_to_stat(struct SceIoStat *in, struct stat *out) { memset(out, 0, sizeof(*out)); out->st_size = in->st_size; - if (SCE_ISREG(in->st_mode)) + if (SCE_S_ISREG(in->st_mode)) out->st_mode |= _IFREG; - if (SCE_ISDIR(in->st_mode)) + if (SCE_S_ISDIR(in->st_mode)) out->st_mode |= _IFDIR; sceRtcGetTime_t(&in->st_atime, &out->st_atime); sceRtcGetTime_t(&in->st_mtime, &out->st_mtime); @@ -310,14 +351,28 @@ _fstat_r(struct _reent *reent, int fd, struct stat *st) { struct SceIoStat stat = {0}; int ret; - if ((unsigned)fd > MAX_OPEN_FILES) { - reent->_errno = EINVAL; + + if (!is_fd_valid(fd)) { + reent->_errno = EBADF; return -1; } - if ((ret = sceIoGetstatByFd(fd_to_scefd[fd], &stat)) < 0) { + + switch (__vita_fdmap[fd]->type) + { + case VITA_DESCRIPTOR_TTY: + case VITA_DESCRIPTOR_FILE: + ret = sceIoGetstatByFd(__vita_fdmap[fd]->sce_uid, &stat); + break; + case VITA_DESCRIPTOR_SOCKET: + ret = EBADF; + break; + } + + if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; } + scestat_to_stat(&stat, st); reent->_errno = 0; return 0; @@ -335,4 +390,4 @@ _stat_r(struct _reent *reent, const char *path, struct stat *st) scestat_to_stat(&stat, st); reent->_errno = 0; return 0; -} \ No newline at end of file +} diff --git a/newlib/libc/sys/vita/vitadescriptor.h b/newlib/libc/sys/vita/vitadescriptor.h new file mode 100644 index 0000000000..1c54fc0101 --- /dev/null +++ b/newlib/libc/sys/vita/vitadescriptor.h @@ -0,0 +1,58 @@ +/* + +Copyright (C) 2016, David "Davee" Morgan + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#ifndef _VITADESCRIPTOR_H_ +#define _VITADESCRIPTOR_H_ + + +#define MAX_OPEN_FILES 1024 + +typedef enum +{ + VITA_DESCRIPTOR_FILE, + VITA_DESCRIPTOR_SOCKET, + VITA_DESCRIPTOR_TTY +} DescriptorTypes; + +typedef struct +{ + int sce_uid; + DescriptorTypes type; + int ref_count; +} DescriptorTranslation; + +extern DescriptorTranslation *__vita_fdmap[]; + + +int __vita_acquire_descriptor(void); +int __vita_release_descriptor(int fd); +int __vita_descriptor_ref_count(int fd); + +static inline int is_fd_valid(int fd) +{ + return (fd > 0) && (fd < MAX_OPEN_FILES) && (__vita_fdmap[fd] != NULL); +} + +#endif // _VITADESCRIPTOR_H_ + diff --git a/newlib/libc/sys/vita/vitaglue.h b/newlib/libc/sys/vita/vitaglue.h new file mode 100644 index 0000000000..35dce42c49 --- /dev/null +++ b/newlib/libc/sys/vita/vitaglue.h @@ -0,0 +1,32 @@ +/* + +Copyright (C) 2016, David "Davee" Morgan + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#ifndef _VITAGLUE_H_ +#define _VITAGLUE_H_ + +extern int __attribute__((weak)) __vita_glue_socket_close(int s); +extern int __attribute__((weak)) __vita_glue_socket_recv(int s, void *buf, size_t len, int flags); +extern int __attribute__((weak)) __vita_glue_socket_send(int s, const void *buf, size_t len, int flags); + +#endif // _VITAGLUE_H_ From b4f89bc0da69c127dd922fe637de891ed6bc3fdc Mon Sep 17 00:00:00 2001 From: Davee Date: Tue, 6 Sep 2016 00:02:07 +0100 Subject: [PATCH 35/86] fix race conditions --- newlib/libc/sys/vita/io.c | 110 ++++++++++++++---- newlib/libc/sys/vita/socket.c | 161 ++++++++++++++++---------- newlib/libc/sys/vita/syscalls.c | 90 +++++++------- newlib/libc/sys/vita/vitadescriptor.h | 2 + newlib/libc/sys/vita/vitaglue.h | 8 +- 5 files changed, 235 insertions(+), 136 deletions(-) diff --git a/newlib/libc/sys/vita/io.c b/newlib/libc/sys/vita/io.c index cd42b7d51d..5e0915cb30 100644 --- a/newlib/libc/sys/vita/io.c +++ b/newlib/libc/sys/vita/io.c @@ -1,18 +1,24 @@ #include #include +#include +#include #include +#include #include "vitadescriptor.h" +#include "vitaglue.h" + +#define SCE_ERRNO_MASK 0xFF DescriptorTranslation *__vita_fdmap[MAX_OPEN_FILES]; DescriptorTranslation __vita_fdmap_pool[MAX_OPEN_FILES]; -char _newlib_fd_mutex[32] __attribute__ ((aligned (8))); +SceKernelLwMutexWork _newlib_fd_mutex __attribute__ ((aligned (8))); void _init_vita_io(void) { int ret; - sceKernelCreateLwMutex(_newlib_fd_mutex, "fd conversion table mutex", 0, 1, NULL); + sceKernelCreateLwMutex(&_newlib_fd_mutex, "fd conversion table mutex", 0, 1, NULL); memset(__vita_fdmap, 0, sizeof(__vita_fdmap)); memset(__vita_fdmap_pool, 0, sizeof(__vita_fdmap_pool)); @@ -45,11 +51,11 @@ void _init_vita_io(void) { __vita_fdmap[STDERR_FILENO]->ref_count = 1; } - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); } void _free_vita_io(void) { - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); if (__vita_fdmap[STDIN_FILENO]) { sceIoClose(__vita_fdmap[STDIN_FILENO]->sce_uid); @@ -67,15 +73,15 @@ void _free_vita_io(void) { __vita_fdmap[STDERR_FILENO] = NULL; } - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); - sceKernelDeleteLwMutex(_newlib_fd_mutex); + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + sceKernelDeleteLwMutex(&_newlib_fd_mutex); } int __vita_acquire_descriptor(void) { int fd = -1; int i = 0; - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); // get free descriptor for (fd = 0; fd < MAX_OPEN_FILES; ++fd) @@ -89,7 +95,7 @@ int __vita_acquire_descriptor(void) { __vita_fdmap[fd] = &__vita_fdmap_pool[i]; __vita_fdmap[fd]->ref_count = 1; - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); return fd; } } @@ -97,35 +103,99 @@ int __vita_acquire_descriptor(void) } // no mores descriptors available... - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); return -1; } int __vita_release_descriptor(int fd) { - int ref_count = -1; + DescriptorTranslation *map = NULL; - if (!is_fd_valid(fd)) - return -1; + sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); - ref_count = --__vita_fdmap[fd]->ref_count; + if (!is_fd_valid(fd)) + { + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return 0; + } - if (__vita_fdmap[fd]->ref_count == 0) + if (__vita_fd_drop(__vita_fdmap[fd]) < 0) { - memset(__vita_fdmap[fd], 0, sizeof(DescriptorTranslation)); + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return -1; } __vita_fdmap[fd] = NULL; - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); - return ref_count; + + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return 0; } int __vita_descriptor_ref_count(int fd) { int res = 0; - sceKernelLockLwMutex(_newlib_fd_mutex, 1, 0); + sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); res = __vita_fdmap[fd]->ref_count; - sceKernelUnlockLwMutex(_newlib_fd_mutex, 1); + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); return res; } + +DescriptorTranslation *__vita_fd_grab(int fd) +{ + DescriptorTranslation *map = NULL; + + sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); + + if (!is_fd_valid(fd)) + { + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return NULL; + } + + map = __vita_fdmap[fd]; + + if (map) + map->ref_count++; + + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return map; +} + +int __vita_fd_drop(DescriptorTranslation *map) +{ + sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); + + if (map->ref_count == 1) + { + int ret = 0; + + switch (map->type) + { + case VITA_DESCRIPTOR_FILE: + case VITA_DESCRIPTOR_TTY: + { + ret = sceIoClose(map->sce_uid); + break; + } + case VITA_DESCRIPTOR_SOCKET: + if (__vita_glue_socket_close) + ret = __vita_glue_socket_close(map->sce_uid); + break; + } + + if (ret < 0) { + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return -(ret & SCE_ERRNO_MASK); + } + + map->ref_count--; + memset(map, 0, sizeof(DescriptorTranslation)); + } + else + { + map->ref_count--; + } + + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return 0; +} diff --git a/newlib/libc/sys/vita/socket.c b/newlib/libc/sys/vita/socket.c index 96e106c1ea..3cf4871d2a 100644 --- a/newlib/libc/sys/vita/socket.c +++ b/newlib/libc/sys/vita/socket.c @@ -26,6 +26,7 @@ DEALINGS IN THE SOFTWARE. #include #include +#include #include "vitadescriptor.h" @@ -39,13 +40,17 @@ static inline int is_socket_valid(int s) #ifdef F_accept int accept(int s, struct sockaddr *addr, socklen_t *addrlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetAccept(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + int res = sceNetAccept(fdmap->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -70,13 +75,17 @@ int accept(int s, struct sockaddr *addr, socklen_t *addrlen) #ifdef F_bind int bind(int s, const struct sockaddr *addr, socklen_t addrlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetBind(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int)addrlen); + int res = sceNetBind(fdmap->sce_uid, (SceNetSockaddr *)addr, (unsigned int)addrlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -91,13 +100,17 @@ int bind(int s, const struct sockaddr *addr, socklen_t addrlen) #ifdef F_connect int connect(int s, const struct sockaddr *addr, socklen_t addrlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetConnect(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int)addrlen); + int res = sceNetConnect(fdmap->sce_uid, (SceNetSockaddr *)addr, (unsigned int)addrlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -112,13 +125,17 @@ int connect(int s, const struct sockaddr *addr, socklen_t addrlen) #ifdef F_getpeername int getpeername(int s, struct sockaddr *addr, socklen_t *addrlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetGetpeername(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + int res = sceNetGetpeername(fdmap->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -133,13 +150,17 @@ int getpeername(int s, struct sockaddr *addr, socklen_t *addrlen) #ifdef F_getsockname int getsockname(int s, struct sockaddr *addr, socklen_t *addrlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetGetsockname(__vita_fdmap[s]->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + int res = sceNetGetsockname(fdmap->sce_uid, (SceNetSockaddr *)addr, (unsigned int *)addrlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -154,13 +175,17 @@ int getsockname(int s, struct sockaddr *addr, socklen_t *addrlen) #ifdef F_getsockopt int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetGetsockopt(__vita_fdmap[s]->sce_uid, level, optname, optval, (unsigned int *)optlen); + int res = sceNetGetsockopt(fdmap->sce_uid, level, optname, optval, (unsigned int *)optlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -175,13 +200,17 @@ int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) #ifdef F_listen int listen(int s, int backlog) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetListen(__vita_fdmap[s]->sce_uid, backlog); + int res = sceNetListen(fdmap->sce_uid, backlog); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -196,13 +225,17 @@ int listen(int s, int backlog) #ifdef F_recv ssize_t recv(int s, void *buf, size_t len, int flags) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetRecv(__vita_fdmap[s]->sce_uid, buf, len, flags); + int res = sceNetRecv(fdmap->sce_uid, buf, len, flags); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -218,13 +251,17 @@ ssize_t recv(int s, void *buf, size_t len, int flags) ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetRecvfrom(__vita_fdmap[s]->sce_uid, buf, len, flags, (SceNetSockaddr *)src_addr, (unsigned int *)addrlen); + int res = sceNetRecvfrom(fdmap->sce_uid, buf, len, flags, (SceNetSockaddr *)src_addr, (unsigned int *)addrlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -239,13 +276,17 @@ ssize_t recvfrom(int s, void *buf, size_t len, int flags, #ifdef F_recvmsg ssize_t recvmsg(int s, struct msghdr *msg, int flags) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetRecvmsg(__vita_fdmap[s]->sce_uid, (SceNetMsghdr *)msg, flags); + int res = sceNetRecvmsg(fdmap->sce_uid, (SceNetMsghdr *)msg, flags); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -260,13 +301,17 @@ ssize_t recvmsg(int s, struct msghdr *msg, int flags) #ifdef F_send ssize_t send(int s, const void *buf, size_t len, int flags) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetSend(__vita_fdmap[s]->sce_uid, buf, len, flags); + int res = sceNetSend(fdmap->sce_uid, buf, len, flags); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -283,13 +328,17 @@ ssize_t send(int s, const void *buf, size_t len, int flags) ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetSendto(__vita_fdmap[s]->sce_uid, buf, len, flags, (SceNetSockaddr *)dest_addr, (unsigned int)addrlen); + int res = sceNetSendto(fdmap->sce_uid, buf, len, flags, (SceNetSockaddr *)dest_addr, (unsigned int)addrlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -304,13 +353,17 @@ ssize_t sendto(int s, const void *buf, #ifdef F_sendmsg ssize_t sendmsg(int s, const struct msghdr *msg, int flags) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetSendmsg(__vita_fdmap[s]->sce_uid, (const SceNetMsghdr *)msg, flags); + int res = sceNetSendmsg(fdmap->sce_uid, (const SceNetMsghdr *)msg, flags); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -325,13 +378,17 @@ ssize_t sendmsg(int s, const struct msghdr *msg, int flags) #ifdef F_setsockopt int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetSetsockopt(__vita_fdmap[s]->sce_uid, level, optname, optval, optlen); + int res = sceNetSetsockopt(fdmap->sce_uid, level, optname, optval, optlen); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -346,13 +403,17 @@ int setsockopt(int s, int level, int optname, const void *optval, socklen_t optl #ifdef F_shutdown int shutdown(int s, int how) { - if (!is_socket_valid(s)) + DescriptorTranslation *fdmap = __vita_fd_grab(s); + + if (!fdmap) { errno = EBADF; return -1; } - int res = sceNetShutdown(__vita_fdmap[s]->sce_uid, how); + int res = sceNetShutdown(fdmap->sce_uid, how); + + __vita_fd_drop(fdmap); if (res < 0) { @@ -388,46 +449,18 @@ int socket(int domain, int type, int protocol) return s; } -int __vita_glue_socket_close(int s) +int __vita_glue_socket_close(SceUID scefd) { - int res = 0; - - if (!is_socket_valid(s)) - { - errno = EBADF; - return -1; - } - - int sce_uid = __vita_fdmap[s]->sce_uid; - int ref_count = __vita_release_descriptor(s); - - if (ref_count < 0) - { - errno = EBADF; - return -1; - } - - if (ref_count == 0) - { - res = sceNetSocketClose(sce_uid); - } - - if (res < 0) - { - errno = res & SCE_ERRNO_MASK; - return -1; - } - - return 0; + return sceNetSocketClose(scefd); } -ssize_t __vita_glue_socket_recv(int s, void *buf, size_t len, int flags) +ssize_t __vita_glue_socket_recv(SceUID scefd, void *buf, size_t len, int flags) { - return recv(s, buf, len, flags); + return sceNetRecv(scefd, buf, len, flags); } -ssize_t __vita_glue_socket_send(int s, const void *buf, size_t len, int flags) +ssize_t __vita_glue_socket_send(SceUID scefd, const void *buf, size_t len, int flags) { - return send(s, buf, len, flags); + return sceNetSend(scefd, buf, len, flags); } #endif diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index bd9fec4a50..6c6c23aa50 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -31,23 +31,27 @@ _write_r(struct _reent * reent, int fd, const void *buf, size_t nbytes) { int ret; - if (!is_fd_valid(fd)) { + DescriptorTranslation *fdmap = __vita_fd_grab(fd); + + if (!fdmap) { reent->_errno = EBADF; return -1; } - switch (__vita_fdmap[fd]->type) + switch (fdmap->type) { case VITA_DESCRIPTOR_FILE: case VITA_DESCRIPTOR_TTY: - ret = sceIoWrite(__vita_fdmap[fd]->sce_uid, buf, nbytes); + ret = sceIoWrite(fdmap->sce_uid, buf, nbytes); break; case VITA_DESCRIPTOR_SOCKET: if (__vita_glue_socket_send) - ret = __vita_glue_socket_send(fd, buf, nbytes, 0); + ret = __vita_glue_socket_send(fdmap->sce_uid, buf, nbytes, 0); break; } + __vita_fd_drop(fdmap); + if (ret < 0) { if (ret != -1) reent->_errno = ret & SCE_ERRNO_MASK; @@ -69,39 +73,16 @@ _exit(int rc) int _close_r(struct _reent *reent, int fd) { - int ret = 0; + int res = __vita_release_descriptor(fd); - if (!is_fd_valid(fd)) { - reent->_errno = EBADF; - return -1; - } - - switch (__vita_fdmap[fd]->type) - { - case VITA_DESCRIPTOR_FILE: - case VITA_DESCRIPTOR_TTY: + if (res < 0) { - int sce_uid = __vita_fdmap[fd]->sce_uid; - int ref_count = __vita_release_descriptor(fd); - - if (ref_count == 0) - ret = sceIoClose(fd); - break; - } - case VITA_DESCRIPTOR_SOCKET: - if (__vita_glue_socket_close) - ret = __vita_glue_socket_close(fd); - break; - } - - if (ret < 0) { - if (ret != -1) - reent->_errno = ret & SCE_ERRNO_MASK; + reent->_errno = -res; return -1; } reent->_errno = 0; - return ret; + return 0; } char *__env[1] = { 0 }; @@ -144,12 +125,17 @@ _gettimeofday_r(struct _reent *reent, struct timeval *ptimeval, void *ptimezone) int _isatty_r(struct _reent *reent, int fd) { - if (!is_fd_valid(fd)) { + DescriptorTranslation *fdmap = __vita_fd_grab(fd); + + if (!fdmap) { reent->_errno = EBADF; return 0; } - return (__vita_fdmap[fd]->type == VITA_DESCRIPTOR_TTY); + int istty = fdmap->type == VITA_DESCRIPTOR_TTY; + + __vita_fd_drop(fdmap); + return istty; } int @@ -183,16 +169,12 @@ _off_t _lseek_r(struct _reent *reent, int fd, _off_t ptr, int dir) { int ret; + DescriptorTranslation *fdmap = __vita_fd_grab(fd); - if (!is_fd_valid(fd)) { - reent->_errno = EBADF; - return -1; - } - - switch (__vita_fdmap[fd]->type) + switch (fdmap->type) { case VITA_DESCRIPTOR_FILE: - ret = sceIoLseek32(__vita_fdmap[fd]->sce_uid, ptr, dir); + ret = sceIoLseek32(fdmap->sce_uid, ptr, dir); break; case VITA_DESCRIPTOR_TTY: case VITA_DESCRIPTOR_SOCKET: @@ -200,6 +182,8 @@ _lseek_r(struct _reent *reent, int fd, _off_t ptr, int dir) break; } + __vita_fd_drop(fdmap); + if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; @@ -232,7 +216,7 @@ int _fcntl2sony(int flags) { int _open_r(struct _reent *reent, const char *file, int flags, int mode) { - int ret, i, found = 0; + int ret; flags = _fcntl2sony(flags); ret = sceIoOpen(file, flags, 0666); @@ -254,7 +238,7 @@ _open_r(struct _reent *reent, const char *file, int flags, int mode) __vita_fdmap[fd]->type = VITA_DESCRIPTOR_FILE; reent->_errno = 0; - return found; + return fd; } _ssize_t @@ -262,23 +246,27 @@ _read_r(struct _reent *reent, int fd, void *ptr, size_t len) { int ret; - if (!is_fd_valid(fd)) { + DescriptorTranslation *fdmap = __vita_fd_grab(fd); + + if (!fdmap) { reent->_errno = EBADF; return -1; } - switch (__vita_fdmap[fd]->type) + switch (fdmap->type) { case VITA_DESCRIPTOR_TTY: case VITA_DESCRIPTOR_FILE: - ret = sceIoRead(__vita_fdmap[fd]->sce_uid, ptr, len); + ret = sceIoRead(fdmap->sce_uid, ptr, len); break; case VITA_DESCRIPTOR_SOCKET: if (__vita_glue_socket_recv) - ret = __vita_glue_socket_recv(fd, ptr, len, 0); + ret = __vita_glue_socket_recv(fdmap->sce_uid, ptr, len, 0); break; } + __vita_fd_drop(fdmap); + if (ret < 0) { if (ret != -1) reent->_errno = ret & SCE_ERRNO_MASK; @@ -352,22 +340,26 @@ _fstat_r(struct _reent *reent, int fd, struct stat *st) struct SceIoStat stat = {0}; int ret; - if (!is_fd_valid(fd)) { + DescriptorTranslation *fdmap = __vita_fd_grab(fd); + + if (!fdmap) { reent->_errno = EBADF; return -1; } - switch (__vita_fdmap[fd]->type) + switch (fdmap->type) { case VITA_DESCRIPTOR_TTY: case VITA_DESCRIPTOR_FILE: - ret = sceIoGetstatByFd(__vita_fdmap[fd]->sce_uid, &stat); + ret = sceIoGetstatByFd(fdmap->sce_uid, &stat); break; case VITA_DESCRIPTOR_SOCKET: ret = EBADF; break; } + __vita_fd_drop(fdmap); + if (ret < 0) { reent->_errno = ret & SCE_ERRNO_MASK; return -1; diff --git a/newlib/libc/sys/vita/vitadescriptor.h b/newlib/libc/sys/vita/vitadescriptor.h index 1c54fc0101..365a2d9ca6 100644 --- a/newlib/libc/sys/vita/vitadescriptor.h +++ b/newlib/libc/sys/vita/vitadescriptor.h @@ -48,6 +48,8 @@ extern DescriptorTranslation *__vita_fdmap[]; int __vita_acquire_descriptor(void); int __vita_release_descriptor(int fd); int __vita_descriptor_ref_count(int fd); +DescriptorTranslation *__vita_fd_grab(int fd); +int __vita_fd_drop(DescriptorTranslation *fdmap); static inline int is_fd_valid(int fd) { diff --git a/newlib/libc/sys/vita/vitaglue.h b/newlib/libc/sys/vita/vitaglue.h index 35dce42c49..69ad9e11ac 100644 --- a/newlib/libc/sys/vita/vitaglue.h +++ b/newlib/libc/sys/vita/vitaglue.h @@ -25,8 +25,10 @@ DEALINGS IN THE SOFTWARE. #ifndef _VITAGLUE_H_ #define _VITAGLUE_H_ -extern int __attribute__((weak)) __vita_glue_socket_close(int s); -extern int __attribute__((weak)) __vita_glue_socket_recv(int s, void *buf, size_t len, int flags); -extern int __attribute__((weak)) __vita_glue_socket_send(int s, const void *buf, size_t len, int flags); +#include + +extern int __attribute__((weak)) __vita_glue_socket_close(SceUID scefd); +extern int __attribute__((weak)) __vita_glue_socket_recv(SceUID scefd, void *buf, size_t len, int flags); +extern int __attribute__((weak)) __vita_glue_socket_send(SceUID scefd, const void *buf, size_t len, int flags); #endif // _VITAGLUE_H_ From 6a4dc0fab8b3fc5b82f191c9bf2c645e9029782e Mon Sep 17 00:00:00 2001 From: Davee Date: Tue, 6 Sep 2016 01:33:40 +0100 Subject: [PATCH 36/86] added measures to enforce that stdin/stdout/stderr fd numbers cannot be allocated --- newlib/libc/sys/vita/io.c | 3 ++- newlib/libc/sys/vita/syscalls.c | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/io.c b/newlib/libc/sys/vita/io.c index 5e0915cb30..8e6c0bb5a9 100644 --- a/newlib/libc/sys/vita/io.c +++ b/newlib/libc/sys/vita/io.c @@ -84,7 +84,8 @@ int __vita_acquire_descriptor(void) sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); // get free descriptor - for (fd = 0; fd < MAX_OPEN_FILES; ++fd) + // only allocate descriptors after stdin/stdout/stderr -> aka 0/1/2 + for (fd = 3; fd < MAX_OPEN_FILES; ++fd) { if (__vita_fdmap[fd] == NULL) { diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 6c6c23aa50..73246c9caa 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -245,7 +245,6 @@ _ssize_t _read_r(struct _reent *reent, int fd, void *ptr, size_t len) { int ret; - DescriptorTranslation *fdmap = __vita_fd_grab(fd); if (!fdmap) { From 2a261eeebfdab27d0648c38ae46ff4dee3e2b0f4 Mon Sep 17 00:00:00 2001 From: Davee Date: Tue, 6 Sep 2016 20:57:40 +0100 Subject: [PATCH 37/86] implemented dirent.h functionality --- newlib/libc/sys/vita/Makefile.am | 8 +- newlib/libc/sys/vita/Makefile.in | 19 ++- newlib/libc/sys/vita/dirent.c | 247 ++++++++++++++++++++++++++++++ newlib/libc/sys/vita/sys/dirent.h | 55 +++++++ 4 files changed, 323 insertions(+), 6 deletions(-) create mode 100644 newlib/libc/sys/vita/dirent.c create mode 100644 newlib/libc/sys/vita/sys/dirent.h diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 94a5a6acd0..54f1c0a8f0 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -9,9 +9,10 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o +DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c -lib_a_LIBADD = ${SOCKET_OBJS} +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dirent.c +lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) @@ -20,5 +21,8 @@ all-local: crt0.o $(SOCKET_OBJS): socket.c $(COMPILE) -DF_$* $< -c -o $@ +$(DIRENT_OBJS): dirent.c + $(COMPILE) -DF_$* $< -c -o $@ + ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index bd19696ceb..ce801542cf 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -68,10 +68,11 @@ CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru lib_a_AR = $(AR) $(ARFLAGS) -lib_a_DEPENDENCIES = $(SOCKET_OBJS) +lib_a_DEPENDENCIES = $(SOCKET_OBJS) $(DIRENT_OBJS) am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ - lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) + lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) \ + lib_a-dirent.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -197,8 +198,9 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c -lib_a_LIBADD = ${SOCKET_OBJS} +DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dirent.c +lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. @@ -297,6 +299,12 @@ lib_a-socket.o: socket.c lib_a-socket.obj: socket.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-socket.obj `if test -f 'socket.c'; then $(CYGPATH_W) 'socket.c'; else $(CYGPATH_W) '$(srcdir)/socket.c'; fi` +lib_a-dirent.o: dirent.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dirent.o `test -f 'dirent.c' || echo '$(srcdir)/'`dirent.c + +lib_a-dirent.obj: dirent.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dirent.obj `if test -f 'dirent.c'; then $(CYGPATH_W) 'dirent.c'; else $(CYGPATH_W) '$(srcdir)/dirent.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -473,6 +481,9 @@ all-local: crt0.o $(SOCKET_OBJS): socket.c $(COMPILE) -DF_$* $< -c -o $@ +$(DIRENT_OBJS): dirent.c + $(COMPILE) -DF_$* $< -c -o $@ + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/newlib/libc/sys/vita/dirent.c b/newlib/libc/sys/vita/dirent.c new file mode 100644 index 0000000000..a9c41d820a --- /dev/null +++ b/newlib/libc/sys/vita/dirent.c @@ -0,0 +1,247 @@ +/* + +Copyright (C) 2016, David "Davee" Morgan + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#include +#include +#include +#include + +#include +#include +#include + +#define SCE_ERRNO_MASK 0xFF + + +struct DIR_ +{ + SceUID uid; + struct dirent dir; + int refcount; + char *dirname; + int index; +}; + +static inline void grab_dir(DIR *dirp) +{ + __sync_add_and_fetch(&dirp->refcount, 1); +} + +static inline void drop_dir(DIR *dirp) +{ + if (__sync_add_and_fetch(&dirp->refcount, 1) == 0) + { + free(dirp->dirname); + free(dirp); + } +} + +static inline void release_drop_dir(DIR *dirp) +{ + if (__sync_add_and_fetch(&dirp->refcount, 2) == 0) + { + free(dirp->dirname); + free(dirp); + } +} + +static inline void atomic_exchange(int *obj, int desired) +{ + __sync_synchronize(); + __sync_lock_test_and_set(obj, desired); +} + +#ifdef F_closedir +int closedir(DIR *dirp) +{ + if (!dirp) + { + errno = EBADF; + return -1; + } + + grab_dir(dirp); + + int res = sceIoDclose(dirp->uid); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + drop_dir(dirp); + return -1; + } + + release_drop_dir(dirp); + + errno = 0; + return 0; +} +#endif + +#if F_opendir +DIR *opendir(const char *dirname) +{ + SceUID uid = sceIoDopen(dirname); + + if (uid < 0) + { + errno = uid & SCE_ERRNO_MASK; + return NULL; + } + + DIR *dirp = calloc(1, sizeof(DIR)); + + if (!dirp) + { + sceIoDclose(uid); + errno = ENOMEM; + return NULL; + } + + dirp->refcount = 1; + dirp->uid = uid; + dirp->dirname = strdup(dirname); + dirp->index = 0; + + errno = 0; + return dirp; +} +#endif + +#ifdef F_readdir +struct dirent *readdir(DIR *dirp) +{ + if (!dirp) + { + errno = EBADF; + return NULL; + } + + grab_dir(dirp); + + int res = sceIoDread(dirp->uid, (SceIoDirent *)&dirp->dir); + + if (res < 0) + { + errno = res & SCE_ERRNO_MASK; + drop_dir(dirp); + return NULL; + } + + if (res == 0) + { + errno = 0; + drop_dir(dirp); + return NULL; + } + + __sync_add_and_fetch(&dirp->index, 1); + + struct dirent *dir = &dirp->dir; + drop_dir(dirp); + return dir; +} +#endif +#ifdef F_readdir_r +int readdir_r(DIR *dirp, struct dirent *x, struct dirent **y) +{ + errno = ENOSYS; + return -1; +} +#endif + +#ifdef F_rewinddir +void rewinddir(DIR *dirp) +{ + if (!dirp) + { + errno = EBADF; + return; + } + + grab_dir(dirp); + + SceUID dirfd = sceIoDopen(dirp->dirname); + + if (dirfd < 0) + { + errno = dirfd & SCE_ERRNO_MASK; + drop_dir(dirp); + return; + } + + sceIoDclose(dirp->uid); + atomic_exchange(&dirp->uid, dirfd); + atomic_exchange(&dirp->index, 0); + + drop_dir(dirp); +} +#endif + +#ifdef F_seekdir +void seekdir(DIR *dirp, long int index) +{ + if (!dirp) + { + errno = EBADF; + return; + } + + grab_dir(dirp); + + if (index < dirp->index) + rewinddir(dirp); + + if (index < dirp->index) + { + drop_dir(dirp); + return; + } + + while (index != dirp->index) + { + if (!readdir(dirp)) + { + errno = ENOENT; + drop_dir(dirp); + return; + } + } + + drop_dir(dirp); +} +#endif + +#ifdef F_telldir +long int telldir(DIR *dirp) +{ + if (!dirp) + { + errno = EBADF; + return -1; + } + + return dirp->index; +} +#endif diff --git a/newlib/libc/sys/vita/sys/dirent.h b/newlib/libc/sys/vita/sys/dirent.h new file mode 100644 index 0000000000..00b1b43d5d --- /dev/null +++ b/newlib/libc/sys/vita/sys/dirent.h @@ -0,0 +1,55 @@ +/* + +Copyright (C) 2016, David "Davee" Morgan + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#ifndef _SYS_DIRENT_H_ +#define _SYS_DIRENT_H_ + +#include +#include + +#include + +struct dirent +{ + /** File status. */ + SceIoStat d_stat; + /** File name. */ + char d_name[256]; + /** Device-specific data. */ + void *d_private; + int dummy; +}; + +struct DIR_; +typedef struct DIR_ DIR; + +int closedir(DIR *); +DIR *opendir(const char *); +struct dirent *readdir(DIR *); +int readdir_r(DIR *, struct dirent *, struct dirent **); +void rewinddir(DIR *); +void seekdir(DIR *, long int); +long int telldir(DIR *); + +#endif /* _SYS_DIRENT_H_ */ From 335076337439f3f7461bfaa5587f1fec1b53b589 Mon Sep 17 00:00:00 2001 From: Davee Date: Sun, 4 Sep 2016 23:16:34 +0100 Subject: [PATCH 38/86] update newlib threading for pthread support --- newlib/libc/sys/vita/threading.c | 173 +++++++++++++++++++++++++------ 1 file changed, 143 insertions(+), 30 deletions(-) diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index a16d4eb53c..99e916eeb6 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -1,12 +1,22 @@ // This provides support for __getreent() as well as implementation of our thread-related wrappers #include +#include +#include -#define MAX_THREADS 64 +#include +#include + +// not in sdk +void sceClibPrintf(const char *fmt, ...); + +#define MAX_THREADS 256 typedef struct reent_for_thread { int thread_id; int needs_reclaim; + void *tls_data_ext; + void *pthread_data_ext; struct _reent reent; } reent_for_thread; @@ -14,40 +24,72 @@ static reent_for_thread reent_list[MAX_THREADS]; static int _newlib_reent_mutex; static struct _reent _newlib_global_reent; -int sceKernelExitThread(int); -int sceKernelExitDeleteThread(int); - -#define TLS_REENT_PTR sceKernelGetTLSAddr(0x88) +#define TLS_REENT_THID_PTR(thid) sceKernelGetThreadTLSAddr(thid, 0x88) +#define TLS_REENT_PTR sceKernelGetTLSAddr(0x88) #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) -int _exit_thread_common(int exit_status, int (*exit_func)(int)) { - int ret, thread_id; +int __vita_delete_thread_reent(int thid) +{ struct reent_for_thread *for_thread; + // We only need to cleanup if reent is allocated, i.e. if it's on our TLS // We also don't need to clean up the global reent - struct _reent **on_tls = TLS_REENT_PTR; + struct _reent **on_tls = TLS_REENT_THID_PTR(thid); if (!*on_tls || *on_tls == &_newlib_global_reent) - return exit_func(exit_status); + return 0; + for_thread = list_entry(*on_tls, struct reent_for_thread, reent); + // Remove from TLS *on_tls = 0; - // Lock the list because we'll be modifying it - sceKernelLockMutex(_newlib_reent_mutex); + // Set thread id to zero, which means the reent is free - thread_id = for_thread->thread_id; for_thread->thread_id = 0; + // We can't reclaim it here, will be done later in __getreent for_thread->needs_reclaim = 1; - // Try to actually exit the thread + + return 1; +} + +int vitasdk_delete_thread_reent(int thid) +{ + int res = 0; + // Lock the list because we'll be modifying it + sceKernelLockMutex(_newlib_reent_mutex, 1, NULL); + + res = __vita_delete_thread_reent(thid); + + sceKernelUnlockMutex(_newlib_reent_mutex, 1); + return res; +} + +int _exit_thread_common(int exit_status, int (*exit_func)(int)) { + int res = 0; + int ret = 0; + int thid = sceKernelGetThreadId(); + + // Lock the list because we'll be modifying it + sceKernelLockMutex(_newlib_reent_mutex, 1, NULL); + + res = __vita_delete_thread_reent(thid); + ret = exit_func(exit_status); - // If it succeeds, the mutex is unlocked, and we don't get here - // However, if it fails, we need to restore thread_id and unlock the mutex - for_thread->thread_id = thread_id; - sceKernelUnlockMutex(_newlib_reent_mutex); - // And put it back on TLS - *on_tls = &for_thread->reent; + + if (res) + { + struct _reent **on_tls = TLS_REENT_THID_PTR(thid); + struct reent_for_thread *for_thread = list_entry(*on_tls, struct reent_for_thread, reent); + + for_thread->thread_id = thid; + + // And put it back on TLS + *on_tls = &for_thread->reent; + } + + sceKernelUnlockMutex(_newlib_reent_mutex, 1); return ret; } @@ -59,44 +101,115 @@ int vita_exit_delete_thread(int exit_status) { return _exit_thread_common(exit_status, sceKernelExitDeleteThread); } -struct _reent *__getreent(void) { +static inline void __vita_clean_reent(void) +{ + int i; + SceKernelThreadInfo info; + + for (i = 0; i < MAX_THREADS; ++i) + { + info.size = sizeof(SceKernelThreadInfo); + + if (sceKernelGetThreadInfo(reent_list[i].thread_id, &info) < 0) + { + reent_list[i].thread_id = 0; + reent_list[i].needs_reclaim = 1; + } + } +} + +static inline struct reent_for_thread *__vita_allocate_reent(void) +{ + int i; + struct reent_for_thread *free_reent = 0; + + for (i = 0; i < MAX_THREADS; ++i) + if (reent_list[i].thread_id == 0) { + free_reent = &reent_list[i]; + break; + } + + return free_reent; +} + +struct _reent *__getreent_for_thread(int thid) { int i; struct reent_for_thread *free_reent = 0; struct _reent *returned_reent = 0; + + if (thid == 0) + thid = sceKernelGetThreadId(); + + sceKernelLockMutex(_newlib_reent_mutex, 1, 0); + // A pointer to our reent should be on the TLS - struct _reent **on_tls = TLS_REENT_PTR; + struct _reent **on_tls = TLS_REENT_THID_PTR(thid); if (*on_tls) { + sceKernelUnlockMutex(_newlib_reent_mutex, 1); return *on_tls; } // If it's not on the TLS this means the thread doesn't have a reent allocated yet // We allocate one and put a pointer to it on the TLS - sceKernelLockMutex(_newlib_reent_mutex, 1, 0); - for (i = 0; i < MAX_THREADS; ++i) - if (reent_list[i].thread_id == 0) { - free_reent = &reent_list[i]; - break; - } + free_reent = __vita_allocate_reent(); + if (!free_reent) { - returned_reent = &_newlib_global_reent; + // clean any hanging thread references + __vita_clean_reent(); + + free_reent = __vita_allocate_reent(); + + if (!free_reent) { + // we've exhausted all our resources + sceClibPrintf("[VITASDK] FATAL: Exhausted all thread reent resources!"); + __builtin_trap(); + } } else { // First, check if it needs to be cleaned up (if it came from another thread) if (free_reent->needs_reclaim) { _reclaim_reent(&free_reent->reent); free_reent->needs_reclaim = 0; } + + memset(free_reent, 0, sizeof(struct reent_for_thread)); + // Set it up - free_reent->thread_id = sceKernelGetThreadId(); + free_reent->thread_id = thid; _REENT_INIT_PTR(&free_reent->reent); returned_reent = &free_reent->reent; } - sceKernelUnlockMutex(_newlib_reent_mutex, 1); + // Put it on TLS for faster access time *on_tls = returned_reent; + + sceKernelUnlockMutex(_newlib_reent_mutex, 1); return returned_reent; } +struct _reent *__getreent(void) { + return __getreent_for_thread(sceKernelGetThreadId()); +} + +void **vitasdk_get_tls_data(SceUID thid) +{ + struct reent_for_thread *for_thread; + struct _reent *reent = __getreent_for_thread(thid); + + for_thread = list_entry(reent, struct reent_for_thread, reent); + return &for_thread->tls_data_ext; +} + +void **vitasdk_get_pthread_data(SceUID thid) +{ + struct reent_for_thread *for_thread; + struct _reent *reent = __getreent_for_thread(thid); + + for_thread = list_entry(reent, struct reent_for_thread, reent); + return &for_thread->pthread_data_ext; +} + // Called from _start to set up the main thread reentrancy structure void _init_vita_reent(void) { + memset(reent_list, 0, sizeof(reent_list)); _newlib_reent_mutex = sceKernelCreateMutex("reent list access mutex", 0, 0, 0); reent_list[0].thread_id = sceKernelGetThreadId(); _REENT_INIT_PTR(&reent_list[0].reent); From fa92db835802ac9018c704801bbfa819c537a9c7 Mon Sep 17 00:00:00 2001 From: Davee Date: Wed, 7 Sep 2016 23:54:24 +0100 Subject: [PATCH 39/86] reflect vitasdk/utils.h changes --- newlib/libc/sys/vita/threading.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index 99e916eeb6..adeb70795d 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -4,7 +4,7 @@ #include #include -#include +#include #include // not in sdk @@ -189,7 +189,7 @@ struct _reent *__getreent(void) { return __getreent_for_thread(sceKernelGetThreadId()); } -void **vitasdk_get_tls_data(SceUID thid) +void *vitasdk_get_tls_data(SceUID thid) { struct reent_for_thread *for_thread; struct _reent *reent = __getreent_for_thread(thid); @@ -198,7 +198,7 @@ void **vitasdk_get_tls_data(SceUID thid) return &for_thread->tls_data_ext; } -void **vitasdk_get_pthread_data(SceUID thid) +void *vitasdk_get_pthread_data(SceUID thid) { struct reent_for_thread *for_thread; struct _reent *reent = __getreent_for_thread(thid); From 979b14778340ee9c461538e2dac70e1d977bf839 Mon Sep 17 00:00:00 2001 From: Davee Date: Tue, 20 Sep 2016 00:55:22 +0100 Subject: [PATCH 40/86] implemented dup() --- newlib/libc/sys/vita/Makefile.am | 2 +- newlib/libc/sys/vita/Makefile.in | 10 +++++-- newlib/libc/sys/vita/dup.c | 40 +++++++++++++++++++++++++++ newlib/libc/sys/vita/io.c | 29 +++++++++++++++++++ newlib/libc/sys/vita/vitadescriptor.h | 1 + 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 newlib/libc/sys/vita/dup.c diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 94a5a6acd0..4411050334 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -10,7 +10,7 @@ noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c lib_a_LIBADD = ${SOCKET_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index bd19696ceb..d56f3d6ebf 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -71,7 +71,7 @@ lib_a_AR = $(AR) $(ARFLAGS) lib_a_DEPENDENCIES = $(SOCKET_OBJS) am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ - lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) + lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -197,7 +197,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c lib_a_LIBADD = ${SOCKET_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) @@ -297,6 +297,12 @@ lib_a-socket.o: socket.c lib_a-socket.obj: socket.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-socket.obj `if test -f 'socket.c'; then $(CYGPATH_W) 'socket.c'; else $(CYGPATH_W) '$(srcdir)/socket.c'; fi` +lib_a-dup.o: dup.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dup.o `test -f 'dup.c' || echo '$(srcdir)/'`dup.c + +lib_a-dup.obj: dup.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dup.obj `if test -f 'dup.c'; then $(CYGPATH_W) 'dup.c'; else $(CYGPATH_W) '$(srcdir)/dup.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ diff --git a/newlib/libc/sys/vita/dup.c b/newlib/libc/sys/vita/dup.c new file mode 100644 index 0000000000..9d3a6f0ef5 --- /dev/null +++ b/newlib/libc/sys/vita/dup.c @@ -0,0 +1,40 @@ +/* + +Copyright (C) 2016, David "Davee" Morgan + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#include +#include "vitadescriptor.h" + +int dup(int oldfd) +{ + int fd = __vita_duplicate_descriptor(oldfd); + + if (fd < 0) + { + errno = EBADF; + return -1; + } + + errno = 0; + return fd; +} diff --git a/newlib/libc/sys/vita/io.c b/newlib/libc/sys/vita/io.c index 8e6c0bb5a9..3b7a4d8ff6 100644 --- a/newlib/libc/sys/vita/io.c +++ b/newlib/libc/sys/vita/io.c @@ -132,6 +132,35 @@ int __vita_release_descriptor(int fd) return 0; } +int __vita_duplicate_descriptor(int fd) +{ + int fd2 = -1; + + sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); + + if (!is_fd_valid(fd)) + { + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return -1; + } + + // get free descriptor + // only allocate descriptors after stdin/stdout/stderr -> aka 0/1/2 + for (fd2 = 3; fd2 < MAX_OPEN_FILES; ++fd2) + { + if (__vita_fdmap[fd2] == NULL) + { + __vita_fdmap[fd2] = __vita_fdmap[fd]; + __vita_fdmap[fd2]->ref_count++; + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return fd2; + } + } + + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return -1; +} + int __vita_descriptor_ref_count(int fd) { int res = 0; diff --git a/newlib/libc/sys/vita/vitadescriptor.h b/newlib/libc/sys/vita/vitadescriptor.h index 365a2d9ca6..9d196fe2d0 100644 --- a/newlib/libc/sys/vita/vitadescriptor.h +++ b/newlib/libc/sys/vita/vitadescriptor.h @@ -47,6 +47,7 @@ extern DescriptorTranslation *__vita_fdmap[]; int __vita_acquire_descriptor(void); int __vita_release_descriptor(int fd); +int __vita_duplicate_descriptor(int fd); int __vita_descriptor_ref_count(int fd); DescriptorTranslation *__vita_fd_grab(int fd); int __vita_fd_drop(DescriptorTranslation *fdmap); From cd0ed97be1c16085160f591e29f95968877f99c9 Mon Sep 17 00:00:00 2001 From: Davee Date: Thu, 22 Sep 2016 22:31:39 +0100 Subject: [PATCH 41/86] cleaned up mutex unlocking paths --- newlib/libc/sys/vita/io.c | 55 +++++++++++++++------------------------ 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/newlib/libc/sys/vita/io.c b/newlib/libc/sys/vita/io.c index 3b7a4d8ff6..42d6fa902b 100644 --- a/newlib/libc/sys/vita/io.c +++ b/newlib/libc/sys/vita/io.c @@ -111,25 +111,18 @@ int __vita_acquire_descriptor(void) int __vita_release_descriptor(int fd) { DescriptorTranslation *map = NULL; + int res = -1; sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); - if (!is_fd_valid(fd)) + if (is_fd_valid(fd) && __vita_fd_drop(__vita_fdmap[fd]) >= 0) { - sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); - return 0; + __vita_fdmap[fd] = NULL; + res = 0; } - if (__vita_fd_drop(__vita_fdmap[fd]) < 0) - { - sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); - return -1; - } - - __vita_fdmap[fd] = NULL; - sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); - return 0; + return res; } int __vita_duplicate_descriptor(int fd) @@ -138,22 +131,19 @@ int __vita_duplicate_descriptor(int fd) sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); - if (!is_fd_valid(fd)) + if (is_fd_valid(fd)) { - sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); - return -1; - } - - // get free descriptor - // only allocate descriptors after stdin/stdout/stderr -> aka 0/1/2 - for (fd2 = 3; fd2 < MAX_OPEN_FILES; ++fd2) - { - if (__vita_fdmap[fd2] == NULL) + // get free descriptor + // only allocate descriptors after stdin/stdout/stderr -> aka 0/1/2 + for (fd2 = 3; fd2 < MAX_OPEN_FILES; ++fd2) { - __vita_fdmap[fd2] = __vita_fdmap[fd]; - __vita_fdmap[fd2]->ref_count++; - sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); - return fd2; + if (__vita_fdmap[fd2] == NULL) + { + __vita_fdmap[fd2] = __vita_fdmap[fd]; + __vita_fdmap[fd2]->ref_count++; + sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); + return fd2; + } } } @@ -176,16 +166,13 @@ DescriptorTranslation *__vita_fd_grab(int fd) sceKernelLockLwMutex(&_newlib_fd_mutex, 1, 0); - if (!is_fd_valid(fd)) + if (is_fd_valid(fd)) { - sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); - return NULL; - } + map = __vita_fdmap[fd]; - map = __vita_fdmap[fd]; - - if (map) - map->ref_count++; + if (map) + map->ref_count++; + } sceKernelUnlockLwMutex(&_newlib_fd_mutex, 1); return map; From 1b85d7e114059720d793fce474498e5f23168218 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Fri, 9 Sep 2016 02:48:37 +0900 Subject: [PATCH 42/86] add more network api & macro - select of sys/select.h - gethostbyname of netdb.h - add macros of netinet/in.h --- newlib/Makefile.am | 6 + newlib/Makefile.in | 7 ++ newlib/libc/sys/vita/Makefile.am | 6 +- newlib/libc/sys/vita/Makefile.in | 21 +++- newlib/libc/sys/vita/include/netdb.h | 51 ++++++++ newlib/libc/sys/vita/include/netinet/in.h | 63 ++++++++++ newlib/libc/sys/vita/netdb.c | 36 ++++++ newlib/libc/sys/vita/select.c | 142 ++++++++++++++++++++++ newlib/libc/sys/vita/sys/select.h | 49 ++++++++ 9 files changed, 374 insertions(+), 7 deletions(-) create mode 100644 newlib/libc/sys/vita/include/netdb.h create mode 100644 newlib/libc/sys/vita/include/netinet/in.h create mode 100644 newlib/libc/sys/vita/netdb.c create mode 100644 newlib/libc/sys/vita/select.c create mode 100644 newlib/libc/sys/vita/sys/select.h diff --git a/newlib/Makefile.am b/newlib/Makefile.am index 5ecce4c102..db569ad8cd 100644 --- a/newlib/Makefile.am +++ b/newlib/Makefile.am @@ -322,6 +322,12 @@ endif $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/`basename $$i`; \ else true; fi ; \ done ; \ + $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/netinet; \ + for i in $(srcdir)/libc/sys/$(sys_dir)/include/netinet/*.h; do \ + if [ -f $$i ]; then \ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \ + else true; fi ; \ + done ; \ for i in $(srcdir)/libc/sys/$(sys_dir)/include/*; do \ if [ -d $$i ]; then \ for j in $$i/*.h; do \ diff --git a/newlib/Makefile.in b/newlib/Makefile.in index 468ae9985d..87cece056e 100644 --- a/newlib/Makefile.in +++ b/newlib/Makefile.in @@ -304,6 +304,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -1063,6 +1064,12 @@ install-data-local: install-toollibLIBRARIES $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/`basename $$i`; \ else true; fi ; \ done ; \ + $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/netinet; \ + for i in $(srcdir)/libc/sys/$(sys_dir)/include/netinet/*.h; do \ + if [ -f $$i ]; then \ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \ + else true; fi ; \ + done ; \ for i in $(srcdir)/libc/sys/$(sys_dir)/include/*; do \ if [ -d $$i ]; then \ for j in $$i/*.h; do \ diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 4411050334..6d116cee50 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,16 +8,16 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c lib_a_LIBADD = ${SOCKET_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) all-local: crt0.o -$(SOCKET_OBJS): socket.c +$(SOCKET_OBJS): socket.c netdb.c $(COMPILE) -DF_$* $< -c -o $@ ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index d56f3d6ebf..d9e16f7f69 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -71,7 +71,8 @@ lib_a_AR = $(AR) $(ARFLAGS) lib_a_DEPENDENCIES = $(SOCKET_OBJS) am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ - lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) + lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) \ + lib_a-select.$(OBJEXT) lib_a-netdb.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -196,8 +197,8 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c lib_a_LIBADD = ${SOCKET_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) @@ -303,6 +304,18 @@ lib_a-dup.o: dup.c lib_a-dup.obj: dup.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dup.obj `if test -f 'dup.c'; then $(CYGPATH_W) 'dup.c'; else $(CYGPATH_W) '$(srcdir)/dup.c'; fi` +lib_a-select.o: select.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-select.o `test -f 'select.c' || echo '$(srcdir)/'`select.c + +lib_a-select.obj: select.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-select.obj `if test -f 'select.c'; then $(CYGPATH_W) 'select.c'; else $(CYGPATH_W) '$(srcdir)/select.c'; fi` + +lib_a-netdb.o: netdb.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-netdb.o `test -f 'netdb.c' || echo '$(srcdir)/'`netdb.c + +lib_a-netdb.obj: netdb.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-netdb.obj `if test -f 'netdb.c'; then $(CYGPATH_W) 'netdb.c'; else $(CYGPATH_W) '$(srcdir)/netdb.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -476,7 +489,7 @@ uninstall-am: all-local: crt0.o -$(SOCKET_OBJS): socket.c +$(SOCKET_OBJS): socket.c netdb.c $(COMPILE) -DF_$* $< -c -o $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/newlib/libc/sys/vita/include/netdb.h b/newlib/libc/sys/vita/include/netdb.h new file mode 100644 index 0000000000..b7d1c8b212 --- /dev/null +++ b/newlib/libc/sys/vita/include/netdb.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016, Sunguk Lee + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _NETDB_H_ +#define _NETDB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct hostent { + char *h_name; + char **h_aliases; + int h_addrtype; + int h_length; + char **h_addr_list; +}; +#define h_addr h_addr_list[0] + +struct hostent *gethostbyname(const char *name); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h new file mode 100644 index 0000000000..0b7c329192 --- /dev/null +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2016, Sunguk Lee + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _NETINET_IN_H_ +#define _NETINET_IN_H_ + +#include +#include +#include + +#define IPPROTO_IP SCE_NET_IPPROTO_IP +#define IPPROTO_ICMP SCE_NET_IPPROTO_ICMP +#define IPPROTO_IGMP SCE_NET_IPPROTO_IGMP +#define IPPROTO_TCP SCE_NET_IPPROTO_TCP +#define IPPROTO_UDP SCE_NET_IPPROTO_UDP + +typedef uint32_t in_addr_t; +typedef uint16_t in_port_t; + +struct in_addr { + in_addr_t s_addr; +} in_addr; + +struct sockaddr_in { + uint8_t sin_len; + sa_family_t sin_family; + in_port_t sin_port; + struct in_addr sin_addr; + in_port_t sin_vport; + char sin_zero[6]; +} sockaddr_in; + +#define ntohs __builtin_bswap16 +#define htons __builtin_bswap16 +#define ntohl __builtin_bswap32 +#define htonl __builtin_bswap32 + +#endif diff --git a/newlib/libc/sys/vita/netdb.c b/newlib/libc/sys/vita/netdb.c new file mode 100644 index 0000000000..e3116dc44f --- /dev/null +++ b/newlib/libc/sys/vita/netdb.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include + +#define SCE_ERRNO_MASK 0xFF +#define MAX_NAME 512 + +struct hostent *gethostbyname(const char *name) { + static struct hostent ent; + static char sname[MAX_NAME] = ""; + static struct SceNetInAddr saddr = {0}; + static char *addrlist[2] = { (char *) &saddr, NULL }; + + int rid = sceNetResolverCreate("resolver", NULL, 0); + if (rid < 0) { + errno = rid & SCE_ERRNO_MASK; + return NULL; + } + + int err = sceNetResolverStartNtoa(rid, name, &saddr, 0, 0, 0); + sceNetResolverDestroy(rid); + if (err < 0) { + errno = err & SCE_ERRNO_MASK; + return NULL; + } + + ent.h_name = sname; + ent.h_aliases = 0; + ent.h_addrtype = SCE_NET_AF_INET; + ent.h_length = sizeof(struct SceNetInAddr); + ent.h_addr_list = addrlist; + ent.h_addr = addrlist[0]; + + return &ent; +} diff --git a/newlib/libc/sys/vita/select.c b/newlib/libc/sys/vita/select.c new file mode 100644 index 0000000000..3e47b0afe1 --- /dev/null +++ b/newlib/libc/sys/vita/select.c @@ -0,0 +1,142 @@ +/* + +Copyright (C) 2016, Sunguk Lee + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "vitadescriptor.h" + +#define SCE_ERRNO_MASK 0xFF + +#define MAX_EVENTS 255 + +#define LOCK_ARRAY_LENGTH (MAX_OPEN_FILES / 8) + ((MAX_OPEN_FILES % 8) ? 1 : 0) +#define BIT_SET(arr, idx) (arr)[(idx)/8] |= (1<<((idx)%8)) +#define IS_SET(arr, idx) ((arr)[(idx)/8] & (1<<((idx)%8))) != 0 + +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, + struct timeval *timeout) +{ + uint64_t wait = timeout->tv_sec * 1000000 + timeout->tv_usec; + + if (nfds == 0) { + sceKernelDelayThread(wait); + return 0; + } + + uint8_t locked[LOCK_ARRAY_LENGTH] = {0}; + + int i; + int res; + int eid = sceNetEpollCreate("", 0); + if (eid < 0) { + res = (int)eid; + goto exit; + } + for (i = 0; i < nfds; i++) { + SceNetEpollEvent ev = {0}; + ev.data.fd = i; + if (readfds && FD_ISSET(i, readfds)) { + ev.events |= SCE_NET_EPOLLIN; + } + if (writefds && FD_ISSET(i, writefds)) { + ev.events |= SCE_NET_EPOLLOUT; + } + if (exceptfds && FD_ISSET(i, exceptfds)) { + ev.events |= SCE_NET_EPOLLERR; + } + if (ev.events == 0) { + continue; + } + + DescriptorTranslation *fdmap = __vita_fd_grab(i); + if (fdmap == NULL) { + continue; + } + if (fdmap->type != VITA_DESCRIPTOR_SOCKET) { + __vita_fd_drop(fdmap); + continue; + } + BIT_SET(locked, i); + + sceNetEpollControl(eid, SCE_NET_EPOLL_CTL_ADD, fdmap->sce_uid, &ev); + } + SceNetEpollEvent events[MAX_EVENTS] = {0}; + int nev = sceNetEpollWait(eid, events, MAX_EVENTS, wait); + + if (nev < 0) { + res = nev; + goto clean; + } + + if (readfds) { + FD_ZERO(readfds); + } + if (writefds) { + FD_ZERO(writefds); + } + if (exceptfds) { + FD_ZERO(exceptfds); + } + + res = 0; + + for (i = 0; i < nev; i++) { + if (events[i].events) { + if (events[i].events & SCE_NET_EPOLLIN) { + FD_SET(events[i].data.fd, readfds); + res++; + } + if (events[i].events & SCE_NET_EPOLLOUT) { + FD_SET(events[i].data.fd, writefds); + res++; + } + if (events[i].events & SCE_NET_EPOLLERR) { + FD_SET(events[i].data.fd, exceptfds); + res++; + } + } + } + +clean: + sceNetEpollDestroy(eid); +exit: + for (i = 0; i < nfds; i++) { + if (IS_SET(locked, i) && __vita_fdmap[i] != NULL) { + __vita_fd_drop(__vita_fdmap[i]); + } + } + + if (res < 0) { + errno = res & SCE_ERRNO_MASK; + return -1; + } + return res; +} diff --git a/newlib/libc/sys/vita/sys/select.h b/newlib/libc/sys/vita/sys/select.h new file mode 100644 index 0000000000..1fbae93c99 --- /dev/null +++ b/newlib/libc/sys/vita/sys/select.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016, Sunguk Lee + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SYS_SELECT_H_ +#define _SYS_SELECT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, + struct timeval *timeout); + +#ifdef __cplusplus +} +#endif + +#endif From 08624e4995630ca110c4be708e1540d9ccdf5f18 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Tue, 20 Sep 2016 23:50:23 +0900 Subject: [PATCH 43/86] Reduce MAX_OPEN_FILES to 256 --- newlib/libc/sys/vita/vitadescriptor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/vitadescriptor.h b/newlib/libc/sys/vita/vitadescriptor.h index 9d196fe2d0..90e340a7b6 100644 --- a/newlib/libc/sys/vita/vitadescriptor.h +++ b/newlib/libc/sys/vita/vitadescriptor.h @@ -26,7 +26,7 @@ DEALINGS IN THE SOFTWARE. #define _VITADESCRIPTOR_H_ -#define MAX_OPEN_FILES 1024 +#define MAX_OPEN_FILES 256 typedef enum { From e8c7d8a4ac798df6359ff9b5b509eb331f40a6ed Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Tue, 20 Sep 2016 23:51:39 +0900 Subject: [PATCH 44/86] Add custom sys/types.h This file have custom fd_set; this struct contain 256bits Now locked list can use fd_set instead of uint8_t array. --- newlib/libc/sys/vita/select.c | 10 +- newlib/libc/sys/vita/sys/types.h | 514 +++++++++++++++++++++++++++++++ 2 files changed, 517 insertions(+), 7 deletions(-) create mode 100644 newlib/libc/sys/vita/sys/types.h diff --git a/newlib/libc/sys/vita/select.c b/newlib/libc/sys/vita/select.c index 3e47b0afe1..b5eea0fc2b 100644 --- a/newlib/libc/sys/vita/select.c +++ b/newlib/libc/sys/vita/select.c @@ -37,10 +37,6 @@ DEALINGS IN THE SOFTWARE. #define MAX_EVENTS 255 -#define LOCK_ARRAY_LENGTH (MAX_OPEN_FILES / 8) + ((MAX_OPEN_FILES % 8) ? 1 : 0) -#define BIT_SET(arr, idx) (arr)[(idx)/8] |= (1<<((idx)%8)) -#define IS_SET(arr, idx) ((arr)[(idx)/8] & (1<<((idx)%8))) != 0 - int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { @@ -51,7 +47,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, return 0; } - uint8_t locked[LOCK_ARRAY_LENGTH] = {0}; + fd_set lock = {0}; int i; int res; @@ -84,7 +80,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, __vita_fd_drop(fdmap); continue; } - BIT_SET(locked, i); + FD_SET(i, &lock); sceNetEpollControl(eid, SCE_NET_EPOLL_CTL_ADD, fdmap->sce_uid, &ev); } @@ -129,7 +125,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, sceNetEpollDestroy(eid); exit: for (i = 0; i < nfds; i++) { - if (IS_SET(locked, i) && __vita_fdmap[i] != NULL) { + if (FD_ISSET(i, &lock) && __vita_fdmap[i] != NULL) { __vita_fd_drop(__vita_fdmap[i]); } } diff --git a/newlib/libc/sys/vita/sys/types.h b/newlib/libc/sys/vita/sys/types.h new file mode 100644 index 0000000000..bffff9e694 --- /dev/null +++ b/newlib/libc/sys/vita/sys/types.h @@ -0,0 +1,514 @@ +/* unified sys/types.h: + start with sef's sysvi386 version. + merge go32 version -- a few ifdefs. + h8300hms, h8300xray, and sysvnecv70 disagree on the following types: + + typedef int gid_t; + typedef int uid_t; + typedef int dev_t; + typedef int ino_t; + typedef int mode_t; + typedef int caddr_t; + + however, these aren't "reasonable" values, the sysvi386 ones make far + more sense, and should work sufficiently well (in particular, h8300 + doesn't have a stat, and the necv70 doesn't matter.) -- eichin + */ + +#ifndef _SYS_TYPES_H + +#include <_ansi.h> +# include + +#ifndef __INTTYPES_DEFINED__ +#define __INTTYPES_DEFINED__ + +#include + +#if defined(__rtems__) || defined(__XMK__) +/* + * The following section is RTEMS specific and is needed to more + * closely match the types defined in the BSD sys/types.h. + * This is needed to let the RTEMS/BSD TCP/IP stack compile. + */ + +/* deprecated */ +#if ___int8_t_defined +typedef __uint8_t u_int8_t; +#endif +#if ___int16_t_defined +typedef __uint16_t u_int16_t; +#endif +#if ___int32_t_defined +typedef __uint32_t u_int32_t; +#endif + +#if ___int64_t_defined +typedef __uint64_t u_int64_t; + +/* deprecated */ +typedef __uint64_t u_quad_t; +typedef __int64_t quad_t; +typedef quad_t * qaddr_t; +#endif + +#endif + +#endif /* ! __INTTYPES_DEFINED */ + +#ifndef __need_inttypes + +#define _SYS_TYPES_H +#include +#include + +#ifdef __i386__ +#if defined (GO32) || defined (__MSDOS__) +#define __MS_types__ +#endif +#endif + +# include +# include + +/* To ensure the stat struct's layout doesn't change when sizeof(int), etc. + changes, we assume sizeof short and long never change and have all types + used to define struct stat use them and not int where possible. + Where not possible, _ST_INTxx are used. It would be preferable to not have + such assumptions, but until the extra fluff is necessary, it's avoided. + No 64 bit targets use stat yet. What to do about them is postponed + until necessary. */ +#ifdef __GNUC__ +#define _ST_INT32 __attribute__ ((__mode__ (__SI__))) +#else +#define _ST_INT32 +#endif + +# if __BSD_VISIBLE + +# define physadr physadr_t +# define quad quad_t + +#ifndef _BSDTYPES_DEFINED +/* also defined in mingw/gmon.h and in w32api/winsock[2].h */ +#ifndef __u_char_defined +typedef unsigned char u_char; +#define __u_char_defined +#endif +#ifndef __u_short_defined +typedef unsigned short u_short; +#define __u_short_defined +#endif +#ifndef __u_int_defined +typedef unsigned int u_int; +#define __u_int_defined +#endif +#ifndef __u_long_defined +typedef unsigned long u_long; +#define __u_long_defined +#endif +#define _BSDTYPES_DEFINED +#endif + +typedef unsigned short ushort; /* System V compatibility */ +typedef unsigned int uint; /* System V compatibility */ +typedef unsigned long ulong; /* System V compatibility */ +# endif /*__BSD_VISIBLE */ + +#ifndef __clock_t_defined +typedef _CLOCK_T_ clock_t; +#define __clock_t_defined +#endif + +#ifndef __time_t_defined +typedef _TIME_T_ time_t; +#define __time_t_defined +#endif + +#ifndef __daddr_t_defined +typedef long daddr_t; +#define __daddr_t_defined +#endif +#ifndef __caddr_t_defined +typedef char * caddr_t; +#define __caddr_t_defined +#endif + +#ifndef __CYGWIN__ +#if defined(__MS_types__) || defined(__rtems__) || \ + defined(__sparc__) || defined(__SPU__) +typedef unsigned long ino_t; +#else +typedef unsigned short ino_t; +#endif +#endif /*__CYGWIN__*/ + +#ifdef __MS_types__ +typedef unsigned long vm_offset_t; +typedef unsigned long vm_size_t; + +#define __BIT_TYPES_DEFINED__ + +typedef signed char int8_t; +typedef unsigned char u_int8_t; +typedef short int16_t; +typedef unsigned short u_int16_t; +typedef int int32_t; +typedef unsigned int u_int32_t; +typedef long long int64_t; +typedef unsigned long long u_int64_t; +typedef int32_t register_t; +#endif /* __MS_types__ */ + +/* + * All these should be machine specific - right now they are all broken. + * However, for all of Cygnus' embedded targets, we want them to all be + * the same. Otherwise things like sizeof (struct stat) might depend on + * how the file was compiled (e.g. -mint16 vs -mint32, etc.). + */ + +#ifndef __CYGWIN__ /* which defines these types in it's own types.h. */ +typedef _off_t off_t; +typedef __dev_t dev_t; +typedef __uid_t uid_t; +typedef __gid_t gid_t; +#endif + +#if defined(__XMK__) +typedef signed char pid_t; +#else +typedef int pid_t; +#endif + +#if defined(__rtems__) +typedef _mode_t mode_t; +#endif + +#ifndef __CYGWIN__ +typedef long key_t; +#endif +typedef _ssize_t ssize_t; + +#if !defined(__CYGWIN__) && !defined(__rtems__) +#ifdef __MS_types__ +typedef char * addr_t; +typedef int mode_t; +#else +#if defined (__sparc__) && !defined (__sparc_v9__) +#ifdef __svr4__ +typedef unsigned long mode_t; +#else +typedef unsigned short mode_t; +#endif +#else +typedef unsigned int mode_t _ST_INT32; +#endif +#endif /* ! __MS_types__ */ +#endif /*__CYGWIN__*/ + +typedef unsigned short nlink_t; + +/* We don't define fd_set and friends if we are compiling POSIX + source, or if we have included (or may include as indicated + by __USE_W32_SOCKETS) the W32api winsock[2].h header which + defines Windows versions of them. Note that a program which + includes the W32api winsock[2].h header must know what it is doing; + it must not call the cygwin32 select function. +*/ +# if !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) +# define _SYS_TYPES_FD_SET +# define NBBY 8 /* number of bits in a byte */ +/* + * Select uses bit masks of file descriptors in longs. + * These macros manipulate such bit fields (the filesystem macros use chars). + * FD_SETSIZE may be defined by the user, but the default here + * should be >= NOFILE (param.h). + */ +# ifndef FD_SETSIZE +# define FD_SETSIZE 256 +# endif + +typedef long fd_mask; +# define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ +# ifndef howmany +# define howmany(x,y) (((x)+((y)-1))/(y)) +# endif + +/* We use a macro for fd_set so that including Sockets.h afterwards + can work. */ +typedef struct _types_fd_set { + fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} _types_fd_set; + +#define fd_set _types_fd_set + +# define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS))) +# define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS))) +# define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS))) +# define FD_ZERO(p) (__extension__ (void)({ \ + size_t __i; \ + char *__tmp = (char *)p; \ + for (__i = 0; __i < sizeof (*(p)); ++__i) \ + *__tmp++ = 0; \ +})) + +# endif /* !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) */ + +#undef __MS_types__ +#undef _ST_INT32 + + +#ifndef __clockid_t_defined +typedef _CLOCKID_T_ clockid_t; +#define __clockid_t_defined +#endif + +#ifndef __timer_t_defined +typedef _TIMER_T_ timer_t; +#define __timer_t_defined +#endif + +typedef unsigned long useconds_t; + +#ifndef _SUSECONDS_T_DECLARED +typedef __suseconds_t suseconds_t; +#define _SUSECONDS_T_DECLARED +#endif + +typedef __int64_t sbintime_t; + +#include + + +/* Cygwin will probably never have full posix compliance due to little things + * like an inability to set the stackaddress. Cygwin is also using void * + * pointers rather than structs to ensure maximum binary compatability with + * previous releases. + * This means that we don't use the types defined here, but rather in + * + */ +#if defined(_POSIX_THREADS) && !defined(__CYGWIN__) + +#include + +/* + * 2.5 Primitive System Data Types, P1003.1c/D10, p. 19. + */ + +#if defined(__XMK__) +typedef unsigned int pthread_t; /* identify a thread */ +#else +typedef __uint32_t pthread_t; /* identify a thread */ +#endif + +/* P1003.1c/D10, p. 118-119 */ +#define PTHREAD_SCOPE_PROCESS 0 +#define PTHREAD_SCOPE_SYSTEM 1 + +/* P1003.1c/D10, p. 111 */ +#define PTHREAD_INHERIT_SCHED 1 /* scheduling policy and associated */ + /* attributes are inherited from */ + /* the calling thread. */ +#define PTHREAD_EXPLICIT_SCHED 2 /* set from provided attribute object */ + +/* P1003.1c/D10, p. 141 */ +#define PTHREAD_CREATE_DETACHED 0 +#define PTHREAD_CREATE_JOINABLE 1 + +#if defined(__rtems__) + #include +#endif + +#if defined(__XMK__) +typedef struct pthread_attr_s { + int contentionscope; + struct sched_param schedparam; + int detachstate; + void *stackaddr; + size_t stacksize; +} pthread_attr_t; + +#define PTHREAD_STACK_MIN 200 + +#else /* !defined(__XMK__) */ +typedef struct { + int is_initialized; + void *stackaddr; + int stacksize; + int contentionscope; + int inheritsched; + int schedpolicy; + struct sched_param schedparam; +#if defined(__rtems__) + size_t guardsize; +#endif + + /* P1003.4b/D8, p. 54 adds cputime_clock_allowed attribute. */ +#if defined(_POSIX_THREAD_CPUTIME) + int cputime_clock_allowed; /* see time.h */ +#endif + int detachstate; +#if defined(__rtems__) + size_t affinitysetsize; + cpu_set_t *affinityset; + cpu_set_t affinitysetpreallocated; +#endif +} pthread_attr_t; + +#endif /* !defined(__XMK__) */ + +#if defined(_POSIX_THREAD_PROCESS_SHARED) +/* NOTE: P1003.1c/D10, p. 81 defines following values for process_shared. */ + +#define PTHREAD_PROCESS_PRIVATE 0 /* visible within only the creating process */ +#define PTHREAD_PROCESS_SHARED 1 /* visible too all processes with access to */ + /* the memory where the resource is */ + /* located */ +#endif + +#if defined(_POSIX_THREAD_PRIO_PROTECT) +/* Mutexes */ + +/* Values for blocking protocol. */ + +#define PTHREAD_PRIO_NONE 0 +#define PTHREAD_PRIO_INHERIT 1 +#define PTHREAD_PRIO_PROTECT 2 +#endif + +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + +/* Values for mutex type */ + +/* The following defines are part of the X/Open System Interface (XSI). */ + +/* + * This type of mutex does not detect deadlock. A thread attempting to + * relock this mutex without first unlocking it shall deadlock. Attempting + * to unlock a mutex locked by a different thread results in undefined + * behavior. Attempting to unlock an unlocked mutex results in undefined + * behavior. + */ +#define PTHREAD_MUTEX_NORMAL 0 + +/* + * A thread attempting to relock this mutex without first unlocking + * it shall succeed in locking the mutex. The relocking deadlock which + * can occur with mutexes of type PTHREAD_MUTEX_NORMAL cannot occur with + * this type of mutex. Multiple locks of this mutex shall require the + * same number of unlocks to release the mutex before another thread can + * acquire the mutex. A thread attempting to unlock a mutex which another + * thread has locked shall return with an error. A thread attempting to + * unlock an unlocked mutex shall return with an error. + */ +#define PTHREAD_MUTEX_RECURSIVE 1 + +/* + * This type of mutex provides error checking. A thread attempting + * to relock this mutex without first unlocking it shall return with an + * error. A thread attempting to unlock a mutex which another thread has + * locked shall return with an error. A thread attempting to unlock an + * unlocked mutex shall return with an error. + */ +#define PTHREAD_MUTEX_ERRORCHECK 2 + +/* + * Attempting to recursively lock a mutex of this type results + * in undefined behavior. Attempting to unlock a mutex of this type + * which was not locked by the calling thread results in undefined + * behavior. Attempting to unlock a mutex of this type which is not locked + * results in undefined behavior. An implementation may map this mutex to + * one of the other mutex types. + */ +#define PTHREAD_MUTEX_DEFAULT 3 + +#endif /* !defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) */ + +#if defined(__XMK__) +typedef unsigned int pthread_mutex_t; /* identify a mutex */ + +typedef struct { + int type; +} pthread_mutexattr_t; + +#else /* !defined(__XMK__) */ +typedef __uint32_t pthread_mutex_t; /* identify a mutex */ + +typedef struct { + int is_initialized; +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow mutex to be shared amongst processes */ +#endif +#if defined(_POSIX_THREAD_PRIO_PROTECT) + int prio_ceiling; + int protocol; +#endif +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + int type; +#endif + int recursive; +} pthread_mutexattr_t; +#endif /* !defined(__XMK__) */ + +/* Condition Variables */ + +typedef __uint32_t pthread_cond_t; /* identify a condition variable */ + +typedef struct { + int is_initialized; +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_condattr_t; /* a condition attribute object */ + +/* Keys */ + +typedef __uint32_t pthread_key_t; /* thread-specific data keys */ + +typedef struct { + int is_initialized; /* is this structure initialized? */ + int init_executed; /* has the initialization routine been run? */ +} pthread_once_t; /* dynamic package initialization */ +#else +#if defined (__CYGWIN__) +#include +#endif +#endif /* defined(_POSIX_THREADS) */ + +/* POSIX Barrier Types */ + +#if defined(_POSIX_BARRIERS) +typedef __uint32_t pthread_barrier_t; /* POSIX Barrier Object */ +typedef struct { + int is_initialized; /* is this structure initialized? */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_barrierattr_t; +#endif /* defined(_POSIX_BARRIERS) */ + +/* POSIX Spin Lock Types */ + +#if !defined (__CYGWIN__) +#if defined(_POSIX_SPIN_LOCKS) +typedef __uint32_t pthread_spinlock_t; /* POSIX Spin Lock Object */ +#endif /* defined(_POSIX_SPIN_LOCKS) */ + +/* POSIX Reader/Writer Lock Types */ + +#if defined(_POSIX_READER_WRITER_LOCKS) +typedef __uint32_t pthread_rwlock_t; /* POSIX RWLock Object */ +typedef struct { + int is_initialized; /* is this structure initialized? */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_rwlockattr_t; +#endif /* defined(_POSIX_READER_WRITER_LOCKS) */ +#endif /* __CYGWIN__ */ + +#endif /* !__need_inttypes */ + +#undef __need_inttypes + +#endif /* _SYS_TYPES_H */ From 7f67d55fc7f9877e1ff11b61f3acac4a3ad8a8a6 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sat, 24 Sep 2016 12:58:17 +0900 Subject: [PATCH 45/86] Fix can race condition code Direct use DescriptorTranslation* array instead bitflags --- newlib/libc/sys/vita/select.c | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/newlib/libc/sys/vita/select.c b/newlib/libc/sys/vita/select.c index b5eea0fc2b..dfe3ab7011 100644 --- a/newlib/libc/sys/vita/select.c +++ b/newlib/libc/sys/vita/select.c @@ -47,15 +47,16 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, return 0; } - fd_set lock = {0}; - int i; - int res; + int eid = sceNetEpollCreate("", 0); if (eid < 0) { - res = (int)eid; - goto exit; + errno = eid & SCE_ERRNO_MASK; + return -1; } + + DescriptorTranslation *lock[MAX_OPEN_FILES] = {0}; + for (i = 0; i < nfds; i++) { SceNetEpollEvent ev = {0}; ev.data.fd = i; @@ -80,16 +81,19 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, __vita_fd_drop(fdmap); continue; } - FD_SET(i, &lock); + lock[i] = fdmap; sceNetEpollControl(eid, SCE_NET_EPOLL_CTL_ADD, fdmap->sce_uid, &ev); } + SceNetEpollEvent events[MAX_EVENTS] = {0}; int nev = sceNetEpollWait(eid, events, MAX_EVENTS, wait); + int res = 0; if (nev < 0) { - res = nev; - goto clean; + errno = nev & SCE_ERRNO_MASK; + res = -1; + goto exit; } if (readfds) { @@ -102,8 +106,6 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, FD_ZERO(exceptfds); } - res = 0; - for (i = 0; i < nev; i++) { if (events[i].events) { if (events[i].events & SCE_NET_EPOLLIN) { @@ -121,18 +123,14 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, } } -clean: - sceNetEpollDestroy(eid); exit: + sceNetEpollDestroy(eid); + for (i = 0; i < nfds; i++) { - if (FD_ISSET(i, &lock) && __vita_fdmap[i] != NULL) { - __vita_fd_drop(__vita_fdmap[i]); + if (lock[i] != NULL) { + __vita_fd_drop(lock[i]); } } - if (res < 0) { - errno = res & SCE_ERRNO_MASK; - return -1; - } return res; } From c1f62e1fd946cc3f17aeb087d6f3346d801e56d3 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Mon, 26 Sep 2016 21:16:35 +0900 Subject: [PATCH 46/86] `nfds` should be 0 to MAX_OPEN_FILES - 1 --- newlib/libc/sys/vita/select.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/newlib/libc/sys/vita/select.c b/newlib/libc/sys/vita/select.c index dfe3ab7011..a7f1f75423 100644 --- a/newlib/libc/sys/vita/select.c +++ b/newlib/libc/sys/vita/select.c @@ -40,6 +40,11 @@ DEALINGS IN THE SOFTWARE. int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { + if (nfds < 0 || nfds >= MAX_OPEN_FILES) { + errno = EINVAL; + return -1; + } + uint64_t wait = timeout->tv_sec * 1000000 + timeout->tv_usec; if (nfds == 0) { From cdbaed8a8ebaf8567fd3fc50c2373d8fd6cf8e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Thu, 29 Sep 2016 18:42:34 +0200 Subject: [PATCH 47/86] Add arguments support --- newlib/libc/sys/vita/crt0.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index 8edf156c4d..d00582d3a4 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -1,3 +1,6 @@ +/* The maximum number of arguments that can be passed to main(). */ +#define ARGC_MAX 19 + int main(int argc, const char* argv[]); void _init_vita_newlib(void) { @@ -14,8 +17,27 @@ void _free_vita_newlib(void) { _free_vita_heap(); } -void _start() { +void _start(unsigned int args, void *argp) +{ + char *argv[ARG_MAX + 1]; + int argc = 0; + int loc = 0; + char *ptr = argp; + + /* Turn our thread arguments into main()'s argc and argv[]. */ + while(loc < args) + { + argv[argc] = &ptr[loc]; + loc += strlen(&ptr[loc]) + 1; + argc++; + if(argc == ARGC_MAX) + { + break; + } + } + + argv[argc] = NULL; _init_vita_newlib(); __libc_init_array(); - exit(main(1, (const char*[]){"", 0})); + exit(main(argc, argv)); } From a63af0a476b4aeb03ab8d3208d833cf3c46ba183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Fri, 30 Sep 2016 08:39:08 +0200 Subject: [PATCH 48/86] Fix errors --- newlib/libc/sys/vita/crt0.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index d00582d3a4..bc78376f67 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -19,7 +19,7 @@ void _free_vita_newlib(void) { void _start(unsigned int args, void *argp) { - char *argv[ARG_MAX + 1]; + char *argv[ARGC_MAX + 1]; int argc = 0; int loc = 0; char *ptr = argp; @@ -36,7 +36,7 @@ void _start(unsigned int args, void *argp) } } - argv[argc] = NULL; + argv[argc] = 0; _init_vita_newlib(); __libc_init_array(); exit(main(argc, argv)); From a53590e357edb152d7e623b6e0f734f4f386e8fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sun, 2 Oct 2016 10:09:40 +0200 Subject: [PATCH 49/86] Update crt0.c --- newlib/libc/sys/vita/crt0.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index bc78376f67..71ee3ea025 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -17,6 +17,11 @@ void _free_vita_newlib(void) { _free_vita_heap(); } +/* + * Code below is based on the PSPSDK implementation + * Copyright (c) 2005 Marcus R. Brown + */ + void _start(unsigned int args, void *argp) { char *argv[ARGC_MAX + 1]; From f4dbac046808922b8490ec6c9b44c883387d0c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sun, 2 Oct 2016 12:12:43 +0200 Subject: [PATCH 50/86] Add argv[0] as program name --- newlib/libc/sys/vita/crt0.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index 71ee3ea025..384924abdd 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -24,8 +24,8 @@ void _free_vita_newlib(void) { void _start(unsigned int args, void *argp) { - char *argv[ARGC_MAX + 1]; - int argc = 0; + char *argv[ARGC_MAX + 1] = {""}; // Program name + int argc = 1; int loc = 0; char *ptr = argp; From c61dcf6351eae98674156ad60a02fd308d9c02dc Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Tue, 8 Nov 2016 02:18:07 +0900 Subject: [PATCH 51/86] Change SO_NONBLOCK value to 0x1100 use SCE_NET_SO_NBIO value https://github.com/vitasdk/vita-headers/blob/2427262/include/psp2/net/net.h#L392 --- newlib/libc/sys/vita/sys/socket.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/sys/socket.h b/newlib/libc/sys/vita/sys/socket.h index 5c0898f558..1c31ad5e68 100644 --- a/newlib/libc/sys/vita/sys/socket.h +++ b/newlib/libc/sys/vita/sys/socket.h @@ -110,7 +110,7 @@ typedef uint32_t socklen_t; #define SO_ERROR 0x1007 /* get error status and clear */ #define SO_TYPE 0x1008 /* get socket type */ #define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */ -#define SO_NONBLOCK 0x1009 /* non-blocking I/O */ +#define SO_NONBLOCK 0x1100 /* non-blocking I/O */ /* * Structure used for manipulating linger option. From d9bd33eb040a64bed5b4e9325dc8ca375e191fe3 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Wed, 9 Nov 2016 00:37:32 +0900 Subject: [PATCH 52/86] Fix SO_RCVTIMEO option set wrong timeout value. sceNetSetsockopt not allow timeval struct. this problem make recv or send raise error immediately. --- newlib/libc/sys/vita/socket.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/socket.c b/newlib/libc/sys/vita/socket.c index 3cf4871d2a..3b8d3e75dd 100644 --- a/newlib/libc/sys/vita/socket.c +++ b/newlib/libc/sys/vita/socket.c @@ -23,6 +23,7 @@ DEALINGS IN THE SOFTWARE. */ #include +#include #include #include @@ -386,7 +387,21 @@ int setsockopt(int s, int level, int optname, const void *optval, socklen_t optl return -1; } - int res = sceNetSetsockopt(fdmap->sce_uid, level, optname, optval, optlen); + int res; + if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) + { + if (optlen < sizeof(struct timeval)) + { + __vita_fd_drop(fdmap); + errno = EINVAL; + return -1; + } + struct timeval *timeout = optval; + int wait = timeout->tv_sec * 1000000 + timeout->tv_usec; + res = sceNetSetsockopt(fdmap->sce_uid, level, optname, &wait, sizeof(wait)); + } else { + res = sceNetSetsockopt(fdmap->sce_uid, level, optname, optval, optlen); + } __vita_fd_drop(fdmap); From c73abdaf222cbd2ac3cbe4549ef7ad95d3b1eddc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Wed, 5 Apr 2017 19:23:42 +0200 Subject: [PATCH 53/86] Fix IO slow issues Fixes https://github.com/vitasdk/newlib/issues/18 --- newlib/libc/sys/vita/threading.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index adeb70795d..2488358c2f 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -7,9 +7,6 @@ #include #include -// not in sdk -void sceClibPrintf(const char *fmt, ...); - #define MAX_THREADS 256 typedef struct reent_for_thread { @@ -80,7 +77,7 @@ int _exit_thread_common(int exit_status, int (*exit_func)(int)) { if (res) { - struct _reent **on_tls = TLS_REENT_THID_PTR(thid); + struct _reent **on_tls = TLS_REENT_PTR; struct reent_for_thread *for_thread = list_entry(*on_tls, struct reent_for_thread, reent); for_thread->thread_id = thid; @@ -133,21 +130,23 @@ static inline struct reent_for_thread *__vita_allocate_reent(void) } struct _reent *__getreent_for_thread(int thid) { - int i; struct reent_for_thread *free_reent = 0; struct _reent *returned_reent = 0; - if (thid == 0) - thid = sceKernelGetThreadId(); - - sceKernelLockMutex(_newlib_reent_mutex, 1, 0); - // A pointer to our reent should be on the TLS - struct _reent **on_tls = TLS_REENT_THID_PTR(thid); + struct _reent **on_tls = NULL; + + if (thid == 0) + on_tls = TLS_REENT_PTR; + else + on_tls = TLS_REENT_THID_PTR(thid); + if (*on_tls) { - sceKernelUnlockMutex(_newlib_reent_mutex, 1); return *on_tls; } + + sceKernelLockMutex(_newlib_reent_mutex, 1, 0); + // If it's not on the TLS this means the thread doesn't have a reent allocated yet // We allocate one and put a pointer to it on the TLS free_reent = __vita_allocate_reent(); @@ -186,7 +185,7 @@ struct _reent *__getreent_for_thread(int thid) { } struct _reent *__getreent(void) { - return __getreent_for_thread(sceKernelGetThreadId()); + return __getreent_for_thread(0); } void *vitasdk_get_tls_data(SceUID thid) From 648a0923708fec8a1d37d792aa36d20fd1b4097f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Wed, 5 Apr 2017 19:27:37 +0200 Subject: [PATCH 54/86] typo --- newlib/libc/sys/vita/threading.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index 2488358c2f..29faf39064 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -7,6 +7,9 @@ #include #include +// not in sdk + -void sceClibPrintf(const char *fmt, ...); + #define MAX_THREADS 256 typedef struct reent_for_thread { From 5c56fbff76d7284ab9ded68e15e7d890a2f240f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Wed, 5 Apr 2017 19:27:59 +0200 Subject: [PATCH 55/86] More typos --- newlib/libc/sys/vita/threading.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index 29faf39064..f3a8d5f26e 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -7,8 +7,8 @@ #include #include -// not in sdk - -void sceClibPrintf(const char *fmt, ...); +// not in sdk +void sceClibPrintf(const char *fmt, ...); #define MAX_THREADS 256 From 5e17c235d10bac8265f85b70796a4b9ede8480e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Thu, 6 Apr 2017 11:37:13 +0200 Subject: [PATCH 56/86] Small fixes --- newlib/libc/sys/vita/threading.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/newlib/libc/sys/vita/threading.c b/newlib/libc/sys/vita/threading.c index f3a8d5f26e..050909935b 100755 --- a/newlib/libc/sys/vita/threading.c +++ b/newlib/libc/sys/vita/threading.c @@ -36,7 +36,13 @@ int __vita_delete_thread_reent(int thid) // We only need to cleanup if reent is allocated, i.e. if it's on our TLS // We also don't need to clean up the global reent - struct _reent **on_tls = TLS_REENT_THID_PTR(thid); + struct _reent **on_tls = NULL; + + if (thid == 0) + on_tls = TLS_REENT_PTR; + else + on_tls = TLS_REENT_THID_PTR(thid); + if (!*on_tls || *on_tls == &_newlib_global_reent) return 0; @@ -74,7 +80,7 @@ int _exit_thread_common(int exit_status, int (*exit_func)(int)) { // Lock the list because we'll be modifying it sceKernelLockMutex(_newlib_reent_mutex, 1, NULL); - res = __vita_delete_thread_reent(thid); + res = __vita_delete_thread_reent(0); ret = exit_func(exit_status); @@ -148,7 +154,7 @@ struct _reent *__getreent_for_thread(int thid) { return *on_tls; } - sceKernelLockMutex(_newlib_reent_mutex, 1, 0); + sceKernelLockMutex(_newlib_reent_mutex, 1, 0); // If it's not on the TLS this means the thread doesn't have a reent allocated yet // We allocate one and put a pointer to it on the TLS @@ -175,6 +181,9 @@ struct _reent *__getreent_for_thread(int thid) { memset(free_reent, 0, sizeof(struct reent_for_thread)); // Set it up + if(thid==0){ + thid = sceKernelGetThreadId(); + } free_reent->thread_id = thid; _REENT_INIT_PTR(&free_reent->reent); returned_reent = &free_reent->reent; From 46f8b2d9dc929d7d7b56bf5ade1a9029f3bdf880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Sat, 30 Dec 2017 17:00:39 +0100 Subject: [PATCH 57/86] Fix dirent errors --- newlib/libc/sys/vita/dirent.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/dirent.c b/newlib/libc/sys/vita/dirent.c index 95aa8feb6f..77fdf5593f 100644 --- a/newlib/libc/sys/vita/dirent.c +++ b/newlib/libc/sys/vita/dirent.c @@ -82,7 +82,7 @@ DIR *opendir(const char *dirname) } dirp->uid = uid; - strncpy(dirp->dirname, dirname, sizeof(dirp->dirname) ); + strncpy(dirp->dirname, dirname, sizeof(dirp->dirname)-1 ); dirp->index = 0; errno = 0; @@ -112,6 +112,7 @@ struct dirent *readdir(DIR *dirp) } struct dirent *dir = &dirp->dir; + dirp->index++; return dir; } @@ -133,6 +134,9 @@ void rewinddir(DIR *dirp) sceIoDclose(dirp->uid); + dirp->uid = dirfd; + dirp->index = 0; + errno = 0; } void seekdir(DIR *dirp, long int index) From 21cc1dd6d2707c061af09d2ba3133fb62b555e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20F?= Date: Sat, 13 Jan 2018 21:30:41 +0100 Subject: [PATCH 58/86] WIP: Add (f)truncate function with sceIoChstat* (#29) --- newlib/libc/sys/vita/syscalls.c | 54 +++++++++++++++++++++++++++++ newlib/libc/syscalls/Makefile.am | 2 ++ newlib/libc/syscalls/Makefile.in | 19 ++++++++-- newlib/libc/syscalls/sysftruncate.c | 13 +++++++ newlib/libc/syscalls/systruncate.c | 13 +++++++ 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 newlib/libc/syscalls/sysftruncate.c create mode 100644 newlib/libc/syscalls/systruncate.c diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 73246c9caa..5e9d2f02d7 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -382,3 +382,57 @@ _stat_r(struct _reent *reent, const char *path, struct stat *st) reent->_errno = 0; return 0; } + +int +_truncate_r(struct _reent *reent, char* path, off_t length) +{ + struct SceIoStat stat = {0}; + stat.st_size = length; + int ret; + + ret = sceIoChstat(path, &stat, SCE_CST_SIZE); + + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + + reent->_errno = 0; + return 0; +} + +int +_ftruncate_r(struct _reent *reent, int fd, off_t length) +{ + struct SceIoStat stat = {0}; + stat.st_size = length; + int ret; + + DescriptorTranslation *fdmap = __vita_fd_grab(fd); + + if (!fdmap) { + reent->_errno = EBADF; + return -1; + } + + switch (fdmap->type) + { + case VITA_DESCRIPTOR_FILE: + ret = sceIoChstatByFd(fdmap->sce_uid, &stat, SCE_CST_SIZE); + break; + case VITA_DESCRIPTOR_TTY: + case VITA_DESCRIPTOR_SOCKET: + ret = EBADF; + break; + } + + __vita_fd_drop(fdmap); + + if (ret < 0) { + reent->_errno = ret & SCE_ERRNO_MASK; + return -1; + } + + reent->_errno = 0; + return 0; +} diff --git a/newlib/libc/syscalls/Makefile.am b/newlib/libc/syscalls/Makefile.am index 7af4064827..fb5827df0f 100644 --- a/newlib/libc/syscalls/Makefile.am +++ b/newlib/libc/syscalls/Makefile.am @@ -7,6 +7,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) GENERAL_SOURCES = \ sysclose.c \ sysfcntl.c \ + sysftruncate.c \ sysfstat.c \ sysgetpid.c \ sysgettod.c \ @@ -19,6 +20,7 @@ GENERAL_SOURCES = \ syssbrk.c \ sysstat.c \ systimes.c \ + systruncate.c \ sysunlink.c \ syswrite.c diff --git a/newlib/libc/syscalls/Makefile.in b/newlib/libc/syscalls/Makefile.in index 1f7b81e20f..dff69484fe 100644 --- a/newlib/libc/syscalls/Makefile.in +++ b/newlib/libc/syscalls/Makefile.in @@ -79,7 +79,8 @@ am__objects_1 = lib_a-sysclose.$(OBJEXT) lib_a-sysfcntl.$(OBJEXT) \ lib_a-syslseek.$(OBJEXT) lib_a-sysopen.$(OBJEXT) \ lib_a-sysread.$(OBJEXT) lib_a-syssbrk.$(OBJEXT) \ lib_a-sysstat.$(OBJEXT) lib_a-systimes.$(OBJEXT) \ - lib_a-sysunlink.$(OBJEXT) lib_a-syswrite.$(OBJEXT) + lib_a-sysunlink.$(OBJEXT) lib_a-syswrite.$(OBJEXT) \ + lib_a-sysftruncate.$(OBJEXT) lib_a-systruncate.$(OBJEXT) @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@am__objects_2 = lib_a-sysexecve.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@ lib_a-sysfork.$(OBJEXT) \ @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@ lib_a-syswait.$(OBJEXT) @@ -91,7 +92,7 @@ libsyscalls_la_LIBADD = am__objects_3 = sysclose.lo sysfcntl.lo sysfstat.lo sysgetpid.lo \ sysgettod.lo sysisatty.lo syskill.lo syslink.lo syslseek.lo \ sysopen.lo sysread.lo syssbrk.lo sysstat.lo systimes.lo \ - sysunlink.lo syswrite.lo + sysunlink.lo syswrite.lo sysftruncate.lo systruncate.lo @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@am__objects_4 = sysexecve.lo \ @ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@ sysfork.lo syswait.lo @USE_LIBTOOL_TRUE@am_libsyscalls_la_OBJECTS = $(am__objects_3) \ @@ -272,6 +273,7 @@ GENERAL_SOURCES = \ sysclose.c \ sysfcntl.c \ sysfstat.c \ + sysftruncate.c \ sysgetpid.c \ sysgettod.c \ sysisatty.c \ @@ -283,6 +285,7 @@ GENERAL_SOURCES = \ syssbrk.c \ sysstat.c \ systimes.c \ + systruncate.c \ sysunlink.c \ syswrite.c @@ -393,6 +396,18 @@ lib_a-sysfstat.o: sysfstat.c lib_a-sysfstat.obj: sysfstat.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sysfstat.obj `if test -f 'sysfstat.c'; then $(CYGPATH_W) 'sysfstat.c'; else $(CYGPATH_W) '$(srcdir)/sysfstat.c'; fi` +lib_a-sysftruncate.o: sysftruncate.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sysftruncate.o `test -f 'sysftruncate.c' || echo '$(srcdir)/'`sysftruncate.c + +lib_a-sysftruncate.obj: sysftruncate.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sysftruncate.obj `if test -f 'sysftruncate.c'; then $(CYGPATH_W) 'sysftruncate.c'; else $(CYGPATH_W) '$(srcdir)/sysftruncate.c'; fi` + +lib_a-systruncate.o: systruncate.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-systruncate.o `test -f 'systruncate.c' || echo '$(srcdir)/'`systruncate.c + +lib_a-systruncate.obj: systruncate.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-systruncate.obj `if test -f 'systruncate.c'; then $(CYGPATH_W) 'systruncate.c'; else $(CYGPATH_W) '$(srcdir)/systruncate.c'; fi` + lib_a-sysgetpid.o: sysgetpid.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sysgetpid.o `test -f 'sysgetpid.c' || echo '$(srcdir)/'`sysgetpid.c diff --git a/newlib/libc/syscalls/sysftruncate.c b/newlib/libc/syscalls/sysftruncate.c new file mode 100644 index 0000000000..b6798adbb3 --- /dev/null +++ b/newlib/libc/syscalls/sysftruncate.c @@ -0,0 +1,13 @@ +/* connector for ftruncate */ + +#include +#include +#include + +int +_DEFUN (ftruncate, (fd, pstat), + int fd _AND + off_t length) +{ + return _ftruncate_r (_REENT, fd, length); +} diff --git a/newlib/libc/syscalls/systruncate.c b/newlib/libc/syscalls/systruncate.c new file mode 100644 index 0000000000..4a7a602a95 --- /dev/null +++ b/newlib/libc/syscalls/systruncate.c @@ -0,0 +1,13 @@ +/* connector for truncate */ + +#include +#include +#include + +int +_DEFUN (truncate, (path, pstat), + const char * path _AND + off_t length) +{ + return _truncate_r (_REENT, path, length); +} From 7a07bc81422937771b2e53857c6d428c6c26080d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Tue, 16 Jan 2018 16:14:30 +0100 Subject: [PATCH 59/86] Create memory.h (#30) * Create memory.h * Change location --- newlib/libc/sys/vita/include/memory.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 newlib/libc/sys/vita/include/memory.h diff --git a/newlib/libc/sys/vita/include/memory.h b/newlib/libc/sys/vita/include/memory.h new file mode 100644 index 0000000000..5b7d08f473 --- /dev/null +++ b/newlib/libc/sys/vita/include/memory.h @@ -0,0 +1,12 @@ +/* + * memory.h + * + * Redirects to string.h. Mostly here to help with porting. + */ + +#ifndef _MEMORY_H_ +#define _MEMORY_H_ + +#include + +#endif /* _MEMORY_H_ */ From e87a363af66c3c628ba9bb62b06b4d9faecfd321 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Fri, 19 Jan 2018 21:09:41 +0900 Subject: [PATCH 60/86] Change placeholder to vitasdk --- newlib/libc/sys/vita/include/netdb.h | 2 +- newlib/libc/sys/vita/include/netinet/in.h | 2 +- newlib/libc/sys/vita/select.c | 2 +- newlib/libc/sys/vita/sys/select.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/newlib/libc/sys/vita/include/netdb.h b/newlib/libc/sys/vita/include/netdb.h index b7d1c8b212..c4f405bd4a 100644 --- a/newlib/libc/sys/vita/include/netdb.h +++ b/newlib/libc/sys/vita/include/netdb.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Sunguk Lee + * Copyright (c) 2016, 2017, 2018 vitasdk * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index 0b7c329192..8828e8a532 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Sunguk Lee + * Copyright (c) 2016, 2017, 2018 vitasdk * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/newlib/libc/sys/vita/select.c b/newlib/libc/sys/vita/select.c index a7f1f75423..6c5aa11319 100644 --- a/newlib/libc/sys/vita/select.c +++ b/newlib/libc/sys/vita/select.c @@ -1,6 +1,6 @@ /* -Copyright (C) 2016, Sunguk Lee +Copyright (c) 2016, 2017, 2018 vitasdk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/newlib/libc/sys/vita/sys/select.h b/newlib/libc/sys/vita/sys/select.h index 1fbae93c99..4ff4a65c99 100644 --- a/newlib/libc/sys/vita/sys/select.h +++ b/newlib/libc/sys/vita/sys/select.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Sunguk Lee + * Copyright (c) 2016, 2017, 2018 vitasdk * All rights reserved. * * Redistribution and use in source and binary forms, with or without From b275e655e435241b93146c9967499f51af35234f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20F?= Date: Sat, 27 Jan 2018 21:11:56 +0100 Subject: [PATCH 61/86] Prevent strlen() from exceeding `args` (#32) --- newlib/libc/sys/vita/crt0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/crt0.c b/newlib/libc/sys/vita/crt0.c index 384924abdd..6a700e3b17 100755 --- a/newlib/libc/sys/vita/crt0.c +++ b/newlib/libc/sys/vita/crt0.c @@ -33,7 +33,7 @@ void _start(unsigned int args, void *argp) while(loc < args) { argv[argc] = &ptr[loc]; - loc += strlen(&ptr[loc]) + 1; + loc += strnlen(&ptr[loc], args - loc) + 1; argc++; if(argc == ARGC_MAX) { From 50f181fa41c263b6933c2f4d477d3856ab86bae4 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Fri, 2 Mar 2018 16:09:11 +0900 Subject: [PATCH 62/86] Free allocated memory at calling closedir (#34) Resolve #33 --- newlib/libc/sys/vita/dirent.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/dirent.c b/newlib/libc/sys/vita/dirent.c index 77fdf5593f..f20b65d318 100644 --- a/newlib/libc/sys/vita/dirent.c +++ b/newlib/libc/sys/vita/dirent.c @@ -44,20 +44,23 @@ struct DIR_ int closedir(DIR *dirp) { - if (!dirp) + if (!dirp || dirp->uid < 0) { errno = EBADF; return -1; } int res = sceIoDclose(dirp->uid); + dirp->uid = -1; + + free(dirp); if (res < 0) { errno = res & SCE_ERRNO_MASK; return -1; } - + errno = 0; return 0; } From 16da3c9ddd32a4b01bb9bcb17aadf0d0e0538751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20F?= Date: Mon, 9 Apr 2018 22:52:36 +0200 Subject: [PATCH 63/86] Add missing INADDR_* macro (#24) Useful when binding listening socket --- newlib/libc/sys/vita/include/netinet/in.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index 8828e8a532..c1c64a81a4 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -55,6 +55,12 @@ struct sockaddr_in { char sin_zero[6]; } sockaddr_in; +/* Address to accept any incoming messages. */ +#define INADDR_ANY ((in_addr_t) 0x00000000) + +/* Address to send to all hosts. */ +#define INADDR_BROADCAST ((in_addr_t) 0xffffffff) + #define ntohs __builtin_bswap16 #define htons __builtin_bswap16 #define ntohl __builtin_bswap32 From 42505001697224a7bfd008438c85256cbcc21188 Mon Sep 17 00:00:00 2001 From: Davee Date: Sun, 22 Apr 2018 10:28:53 +0100 Subject: [PATCH 64/86] Add missing SCE_KERNEL_MUTEX_ATTR_RECURSIVE flag Previously it was possible to go down a path and try to hold the newlib file descriptor mutex several times. Without the recursive flag, subsequent attempts to hold the mutex would fail. --- newlib/libc/sys/vita/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/io.c b/newlib/libc/sys/vita/io.c index 42d6fa902b..4ba2087033 100644 --- a/newlib/libc/sys/vita/io.c +++ b/newlib/libc/sys/vita/io.c @@ -18,7 +18,7 @@ SceKernelLwMutexWork _newlib_fd_mutex __attribute__ ((aligned (8))); void _init_vita_io(void) { int ret; - sceKernelCreateLwMutex(&_newlib_fd_mutex, "fd conversion table mutex", 0, 1, NULL); + sceKernelCreateLwMutex(&_newlib_fd_mutex, "fd conversion table mutex", SCE_KERNEL_MUTEX_ATTR_RECURSIVE, 1, NULL); memset(__vita_fdmap, 0, sizeof(__vita_fdmap)); memset(__vita_fdmap_pool, 0, sizeof(__vita_fdmap_pool)); From fc555af97137f68e075023123eb2eb465d685df5 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 22 Jul 2018 05:45:42 +0900 Subject: [PATCH 65/86] Add sys/errno.h --- newlib/libc/sys/vita/sys/errno.h | 140 +++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 newlib/libc/sys/vita/sys/errno.h diff --git a/newlib/libc/sys/vita/sys/errno.h b/newlib/libc/sys/vita/sys/errno.h new file mode 100644 index 0000000000..8a3f713c06 --- /dev/null +++ b/newlib/libc/sys/vita/sys/errno.h @@ -0,0 +1,140 @@ +/* errno is not a global variable, because that would make using it + non-reentrant. Instead, its address is returned by the function + __errno. */ + +#ifndef _SYS_ERRNO_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_ERRNO_H_ + +#include + +#ifndef _REENT_ONLY +#define errno (*__errno()) +extern int *__errno _PARAMS ((void)); +#endif + +/* Please don't use these variables directly. + Use strerror instead. */ +extern __IMPORT _CONST char * _CONST _sys_errlist[]; +extern __IMPORT int _sys_nerr; + +#define __errno_r(ptr) ((ptr)->_errno) + +#define EPERM 1 /* Not owner */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No children */ +#define EAGAIN 35 /* No more processes */ +#define ENOMEM 12 /* Not enough space */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* File descriptor value too large */ +#define ENOTTY 25 /* Not a character device */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Mathematics argument out of domain of function */ +#define ERANGE 34 /* Result too large */ +#define ENOMSG 83 /* No message of desired type */ +#define EIDRM 82 /* Identifier removed */ +#define EDEADLK 11 /* Deadlock */ +#define ENOLCK 77 /* No lock */ +#define ENOSTR 91 /* Not a stream */ +#define ENODATA 89 /* No data (for no delay io) */ +#define ETIME 92 /* Stream ioctl timeout */ +#define ENOSR 90 /* No stream resources */ +#define EREMOTE 71 /* The object is remote */ +// TODO: check value +#define ENOLINK 91 /* Virtual circuit is gone */ +// TODO: check value +#define EPROTO 92 /* Protocol error */ +// TODO: check value +#define EMULTIHOP 90 /* Multihop attempted */ +#define EBADMSG 88 /* Bad message */ +#define EFTYPE 79 /* Inappropriate file type or format */ +#define ENOSYS 78 /* Function not implemented */ +#define ENOTEMPTY 66 /* Directory not empty */ +// TODO: check value +#define ENAMETOOLONG 63 /* File or path name too long */ +// TODO: check value +#define ELOOP 62 /* Too many symbolic links */ +#define EOPNOTSUPP 45 /* Operation not supported on socket */ +#define EPFNOSUPPORT 46 /* Protocol family not supported */ +#define ECONNRESET 54 /* Connection reset by peer */ +#define ENOBUFS 55 /* No buffer space available */ +#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define ENOTSOCK 38 /* Socket operation on non-socket */ +#define ENOPROTOOPT 42 /* Protocol not available */ +#define ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define ECONNREFUSED 61 /* Connection refused */ +#define EADDRINUSE 48 /* Address already in use */ +#define ECONNABORTED 53 /* Software caused connection abort */ +#define ENETUNREACH 51 /* Network is unreachable */ +#define ENETDOWN 50 /* Network interface is not configured */ +#define ETIMEDOUT 60 /* Connection timed out */ +#define EHOSTDOWN 64 /* Host is down */ +#define EHOSTUNREACH 65 /* Host is unreachable */ +#define EINPROGRESS 36 /* Connection already in progress */ +#define EALREADY 37 /* Socket already connected */ +#define EDESTADDRREQ 39 /* Destination address required */ +#define EMSGSIZE 40 /* Message too long */ +#define EPROTONOSUPPORT 43 /* Unknown protocol */ +#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define EADDRNOTAVAIL 49 /* Address not available */ +#define ENETRESET 52 /* Connection aborted by network */ +#define EISCONN 56 /* Socket is already connected */ +#define ENOTCONN 57 /* Socket is not connected */ +#define ETOOMANYREFS 59 +#define EPROCLIM 67 +#define EUSERS 68 +#define EDQUOT 69 +#define ESTALE 70 +#define ENOTSUP 86 /* Not supported */ +#define EILSEQ 85 /* Illegal byte sequence */ +#define EOVERFLOW 84 /* Value too large for defined data type */ +#define ECANCELED 87 /* Operation canceled */ +// TODO: check value +#define ENOTRECOVERABLE 95 /* State not recoverable */ +// TODO: check value +#define EOWNERDEAD 96 /* Previous owner died */ + +#define EBADRPC 72 +#define ERPCMISMATCH 73 +#define EPROGUNAVAIL 74 +#define EPROGMISMATCH 75 +#define EPROCUNAVAIL 76 +#define EAUTH 80 +#define ENEEDAUTH 81 +#define EADHOC 160 +#define EDISABLEDIF 161 +#define ERESUME 162 +#define EWOULDBLOCK EAGAIN /* Operation would block */ + +#define __ELASTERROR 2000 /* Users can add values starting here */ + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_ERRNO_H */ From 3e45c76b2d9653cb01657bec80717c0bea2f0d0b Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Thu, 26 Jul 2018 23:25:39 +0900 Subject: [PATCH 66/86] Redefine err codes and remap network errors --- newlib/libc/sys/vita/Makefile.am | 6 +- newlib/libc/sys/vita/Makefile.in | 14 ++- newlib/libc/sys/vita/error.c | 204 +++++++++++++++++++++++++++++++ newlib/libc/sys/vita/select.c | 7 +- newlib/libc/sys/vita/socket.c | 44 +++---- newlib/libc/sys/vita/sys/errno.h | 201 ++++++++++++++---------------- newlib/libc/sys/vita/syscalls.c | 1 + newlib/libc/sys/vita/vitaerror.h | 32 +++++ 8 files changed, 367 insertions(+), 142 deletions(-) create mode 100644 newlib/libc/sys/vita/error.c create mode 100644 newlib/libc/sys/vita/vitaerror.h diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 80c0adc74b..0a54ca085c 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,17 +8,17 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o error.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c dirent.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) all-local: crt0.o -$(SOCKET_OBJS): socket.c netdb.c +$(SOCKET_OBJS): socket.c netdb.c error.c $(COMPILE) -DF_$* $< -c -o $@ $(DIRENT_OBJS): dirent.c diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index ba3d85a22a..c3ad3b6ee9 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -73,7 +73,7 @@ am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) \ lib_a-select.$(OBJEXT) lib_a-netdb.$(OBJEXT) \ - lib_a-dirent.$(OBJEXT) + lib_a-error.$(OBJEXT) lib_a-dirent.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -198,9 +198,9 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o error.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c dirent.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) @@ -318,6 +318,12 @@ lib_a-netdb.o: netdb.c lib_a-netdb.obj: netdb.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-netdb.obj `if test -f 'netdb.c'; then $(CYGPATH_W) 'netdb.c'; else $(CYGPATH_W) '$(srcdir)/netdb.c'; fi` +lib_a-error.o: error.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c + +lib_a-error.obj: error.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-error.obj `if test -f 'error.c'; then $(CYGPATH_W) 'error.c'; else $(CYGPATH_W) '$(srcdir)/error.c'; fi` + lib_a-dirent.o: dirent.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dirent.o `test -f 'dirent.c' || echo '$(srcdir)/'`dirent.c @@ -497,7 +503,7 @@ uninstall-am: all-local: crt0.o -$(SOCKET_OBJS): socket.c netdb.c +$(SOCKET_OBJS): socket.c netdb.c error.c $(COMPILE) -DF_$* $< -c -o $@ $(DIRENT_OBJS): dirent.c diff --git a/newlib/libc/sys/vita/error.c b/newlib/libc/sys/vita/error.c new file mode 100644 index 0000000000..acdd30bd97 --- /dev/null +++ b/newlib/libc/sys/vita/error.c @@ -0,0 +1,204 @@ +/* + +Copyright (C) 2018, Sunguk Lee + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ +#include + +#include + +#include "vitaerror.h" + +int __vita_sce_errno_to_errno(int sce_errno) +{ + switch (sce_errno) + { + case SCE_NET_ERROR_EPERM: + return EPERM; + case SCE_NET_ERROR_ENOENT: + return ENOENT; + case SCE_NET_ERROR_ESRCH: + return ESRCH; + case SCE_NET_ERROR_EINTR: + return EINTR; + case SCE_NET_ERROR_EIO: + return EIO; + case SCE_NET_ERROR_ENXIO: + return ENXIO; + case SCE_NET_ERROR_E2BIG: + return E2BIG; + case SCE_NET_ERROR_ENOEXEC: + return ENOEXEC; + case SCE_NET_ERROR_EBADF: + return EBADF; + case SCE_NET_ERROR_ECHILD: + return ECHILD; + case SCE_NET_ERROR_EDEADLK: + return EDEADLK; + case SCE_NET_ERROR_ENOMEM: + return ENOMEM; + case SCE_NET_ERROR_EACCES: + return EACCES; + case SCE_NET_ERROR_EFAULT: + return EFAULT; + case SCE_NET_ERROR_ENOTBLK: + return ENOTBLK; + case SCE_NET_ERROR_EBUSY: + return EBUSY; + case SCE_NET_ERROR_EEXIST: + return EEXIST; + case SCE_NET_ERROR_EXDEV: + return EXDEV; + case SCE_NET_ERROR_ENODEV: + return ENODEV; + case SCE_NET_ERROR_ENOTDIR: + return ENOTDIR; + case SCE_NET_ERROR_EISDIR: + return EISDIR; + case SCE_NET_ERROR_EINVAL: + return EINVAL; + case SCE_NET_ERROR_ENFILE: + return ENFILE; + case SCE_NET_ERROR_EMFILE: + return EMFILE; + case SCE_NET_ERROR_ENOTTY: + return ENOTTY; + case SCE_NET_ERROR_ETXTBSY: + return ETXTBSY; + case SCE_NET_ERROR_EFBIG: + return EFBIG; + case SCE_NET_ERROR_ENOSPC: + return ENOSPC; + case SCE_NET_ERROR_ESPIPE: + return ESPIPE; + case SCE_NET_ERROR_EROFS: + return EROFS; + case SCE_NET_ERROR_EMLINK: + return EMLINK; + case SCE_NET_ERROR_EPIPE: + return EPIPE; + case SCE_NET_ERROR_EDOM: + return EDOM; + case SCE_NET_ERROR_ERANGE: + return ERANGE; + case SCE_NET_ERROR_EAGAIN: + return EAGAIN; +// these values are the same as EAGAIN +// case SCE_NET_ERROR_EWOULDBLOCK: +// return EWOULDBLOCK; + case SCE_NET_ERROR_EINPROGRESS: + return EINPROGRESS; + case SCE_NET_ERROR_EALREADY: + return EALREADY; + case SCE_NET_ERROR_ENOTSOCK: + return ENOTSOCK; + case SCE_NET_ERROR_EDESTADDRREQ: + return EDESTADDRREQ; + case SCE_NET_ERROR_EMSGSIZE: + return EMSGSIZE; + case SCE_NET_ERROR_EPROTOTYPE: + return EPROTOTYPE; + case SCE_NET_ERROR_ENOPROTOOPT: + return ENOPROTOOPT; + case SCE_NET_ERROR_EPROTONOSUPPORT: + return EPROTONOSUPPORT; + case SCE_NET_ERROR_ESOCKTNOSUPPORT: + return ESOCKTNOSUPPORT; + case SCE_NET_ERROR_EOPNOTSUPP: + return EOPNOTSUPP; + case SCE_NET_ERROR_EPFNOSUPPORT: + return EPFNOSUPPORT; + case SCE_NET_ERROR_EAFNOSUPPORT: + return EAFNOSUPPORT; + case SCE_NET_ERROR_EADDRINUSE: + return EADDRINUSE; + case SCE_NET_ERROR_EADDRNOTAVAIL: + return EADDRNOTAVAIL; + case SCE_NET_ERROR_ENETDOWN: + return ENETDOWN; + case SCE_NET_ERROR_ENETUNREACH: + return ENETUNREACH; + case SCE_NET_ERROR_ENETRESET: + return ENETRESET; + case SCE_NET_ERROR_ECONNABORTED: + return ECONNABORTED; + case SCE_NET_ERROR_ECONNRESET: + return ECONNRESET; + case SCE_NET_ERROR_ENOBUFS: + return ENOBUFS; + case SCE_NET_ERROR_EISCONN: + return EISCONN; + case SCE_NET_ERROR_ENOTCONN: + return ENOTCONN; + case SCE_NET_ERROR_ESHUTDOWN: + return ESHUTDOWN; + case SCE_NET_ERROR_ETOOMANYREFS: + return ETOOMANYREFS; + case SCE_NET_ERROR_ETIMEDOUT: + return ETIMEDOUT; + case SCE_NET_ERROR_ECONNREFUSED: + return ECONNREFUSED; + case SCE_NET_ERROR_ELOOP: + return ELOOP; + case SCE_NET_ERROR_ENAMETOOLONG: + return ENAMETOOLONG; + case SCE_NET_ERROR_EHOSTDOWN: + return EHOSTDOWN; + case SCE_NET_ERROR_EHOSTUNREACH: + return EHOSTUNREACH; + case SCE_NET_ERROR_ENOTEMPTY: + return ENOTEMPTY; + case SCE_NET_ERROR_EUSERS: + return EUSERS; + case SCE_NET_ERROR_EDQUOT: + return EDQUOT; + case SCE_NET_ERROR_ESTALE: + return ESTALE; + case SCE_NET_ERROR_EREMOTE: + return EREMOTE; + case SCE_NET_ERROR_ENOLCK: + return ENOLCK; + case SCE_NET_ERROR_ENOSYS: + return ENOSYS; + case SCE_NET_ERROR_EIDRM: + return EIDRM; + case SCE_NET_ERROR_EOVERFLOW: + return EOVERFLOW; + case SCE_NET_ERROR_EILSEQ: + return EILSEQ; + case SCE_NET_ERROR_ENOTSUP: + return ENOTSUP; + case SCE_NET_ERROR_ECANCELED: + return ECANCELED; + case SCE_NET_ERROR_EBADMSG: + return EBADMSG; + case SCE_NET_ERROR_ENODATA: + return ENODATA; + case SCE_NET_ERROR_ENOSR: + return ENOSR; + case SCE_NET_ERROR_ENOSTR: + return ENOSTR; + case SCE_NET_ERROR_ETIME: + return ETIME; + default: + return EINVAL; + } +} diff --git a/newlib/libc/sys/vita/select.c b/newlib/libc/sys/vita/select.c index 6c5aa11319..5f3c6aa798 100644 --- a/newlib/libc/sys/vita/select.c +++ b/newlib/libc/sys/vita/select.c @@ -32,8 +32,7 @@ DEALINGS IN THE SOFTWARE. #include #include "vitadescriptor.h" - -#define SCE_ERRNO_MASK 0xFF +#include "vitaerror.h" #define MAX_EVENTS 255 @@ -56,7 +55,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, int eid = sceNetEpollCreate("", 0); if (eid < 0) { - errno = eid & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(eid); return -1; } @@ -96,7 +95,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, int res = 0; if (nev < 0) { - errno = nev & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(nev); res = -1; goto exit; } diff --git a/newlib/libc/sys/vita/socket.c b/newlib/libc/sys/vita/socket.c index 3b8d3e75dd..77c99a682b 100644 --- a/newlib/libc/sys/vita/socket.c +++ b/newlib/libc/sys/vita/socket.c @@ -30,8 +30,7 @@ DEALINGS IN THE SOFTWARE. #include #include "vitadescriptor.h" - -#define SCE_ERRNO_MASK 0xFF +#include "vitaerror.h" static inline int is_socket_valid(int s) { @@ -55,7 +54,7 @@ int accept(int s, struct sockaddr *addr, socklen_t *addrlen) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -90,7 +89,7 @@ int bind(int s, const struct sockaddr *addr, socklen_t addrlen) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -115,7 +114,7 @@ int connect(int s, const struct sockaddr *addr, socklen_t addrlen) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -140,7 +139,7 @@ int getpeername(int s, struct sockaddr *addr, socklen_t *addrlen) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -165,7 +164,7 @@ int getsockname(int s, struct sockaddr *addr, socklen_t *addrlen) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -190,7 +189,7 @@ int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -215,7 +214,7 @@ int listen(int s, int backlog) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -240,7 +239,7 @@ ssize_t recv(int s, void *buf, size_t len, int flags) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -266,7 +265,7 @@ ssize_t recvfrom(int s, void *buf, size_t len, int flags, if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -291,7 +290,7 @@ ssize_t recvmsg(int s, struct msghdr *msg, int flags) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -316,7 +315,7 @@ ssize_t send(int s, const void *buf, size_t len, int flags) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -343,7 +342,7 @@ ssize_t sendto(int s, const void *buf, if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -368,7 +367,7 @@ ssize_t sendmsg(int s, const struct msghdr *msg, int flags) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -407,7 +406,7 @@ int setsockopt(int s, int level, int optname, const void *optval, socklen_t optl if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -432,7 +431,7 @@ int shutdown(int s, int how) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -447,7 +446,7 @@ int socket(int domain, int type, int protocol) if (res < 0) { - errno = res & SCE_ERRNO_MASK; + errno = __vita_sce_errno_to_errno(res); return -1; } @@ -466,16 +465,19 @@ int socket(int domain, int type, int protocol) int __vita_glue_socket_close(SceUID scefd) { - return sceNetSocketClose(scefd); + int res = sceNetSocketClose(scefd); + return res >= 0 ? res : __vita_sce_errno_to_errno(res); } ssize_t __vita_glue_socket_recv(SceUID scefd, void *buf, size_t len, int flags) { - return sceNetRecv(scefd, buf, len, flags); + int res = sceNetRecv(scefd, buf, len, flags); + return res >= 0 ? res : __vita_sce_errno_to_errno(res); } ssize_t __vita_glue_socket_send(SceUID scefd, const void *buf, size_t len, int flags) { - return sceNetSend(scefd, buf, len, flags); + int res = sceNetSend(scefd, buf, len, flags); + return res >= 0 ? res : __vita_sce_errno_to_errno(res); } #endif diff --git a/newlib/libc/sys/vita/sys/errno.h b/newlib/libc/sys/vita/sys/errno.h index 8a3f713c06..b2cb8a5991 100644 --- a/newlib/libc/sys/vita/sys/errno.h +++ b/newlib/libc/sys/vita/sys/errno.h @@ -22,117 +22,98 @@ extern __IMPORT int _sys_nerr; #define __errno_r(ptr) ((ptr)->_errno) -#define EPERM 1 /* Not owner */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ -#define ENXIO 6 /* No such device or address */ -#define E2BIG 7 /* Arg list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file number */ -#define ECHILD 10 /* No children */ -#define EAGAIN 35 /* No more processes */ -#define ENOMEM 12 /* Not enough space */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Device or resource busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* No such device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* Too many open files in system */ -#define EMFILE 24 /* File descriptor value too large */ -#define ENOTTY 25 /* Not a character device */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#define EDOM 33 /* Mathematics argument out of domain of function */ -#define ERANGE 34 /* Result too large */ -#define ENOMSG 83 /* No message of desired type */ -#define EIDRM 82 /* Identifier removed */ -#define EDEADLK 11 /* Deadlock */ -#define ENOLCK 77 /* No lock */ -#define ENOSTR 91 /* Not a stream */ -#define ENODATA 89 /* No data (for no delay io) */ -#define ETIME 92 /* Stream ioctl timeout */ -#define ENOSR 90 /* No stream resources */ -#define EREMOTE 71 /* The object is remote */ -// TODO: check value -#define ENOLINK 91 /* Virtual circuit is gone */ -// TODO: check value -#define EPROTO 92 /* Protocol error */ -// TODO: check value -#define EMULTIHOP 90 /* Multihop attempted */ -#define EBADMSG 88 /* Bad message */ -#define EFTYPE 79 /* Inappropriate file type or format */ -#define ENOSYS 78 /* Function not implemented */ -#define ENOTEMPTY 66 /* Directory not empty */ -// TODO: check value -#define ENAMETOOLONG 63 /* File or path name too long */ -// TODO: check value -#define ELOOP 62 /* Too many symbolic links */ -#define EOPNOTSUPP 45 /* Operation not supported on socket */ -#define EPFNOSUPPORT 46 /* Protocol family not supported */ -#define ECONNRESET 54 /* Connection reset by peer */ -#define ENOBUFS 55 /* No buffer space available */ -#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ -#define EPROTOTYPE 41 /* Protocol wrong type for socket */ -#define ENOTSOCK 38 /* Socket operation on non-socket */ -#define ENOPROTOOPT 42 /* Protocol not available */ -#define ESHUTDOWN 58 /* Can't send after socket shutdown */ -#define ECONNREFUSED 61 /* Connection refused */ -#define EADDRINUSE 48 /* Address already in use */ -#define ECONNABORTED 53 /* Software caused connection abort */ -#define ENETUNREACH 51 /* Network is unreachable */ -#define ENETDOWN 50 /* Network interface is not configured */ -#define ETIMEDOUT 60 /* Connection timed out */ -#define EHOSTDOWN 64 /* Host is down */ -#define EHOSTUNREACH 65 /* Host is unreachable */ -#define EINPROGRESS 36 /* Connection already in progress */ -#define EALREADY 37 /* Socket already connected */ -#define EDESTADDRREQ 39 /* Destination address required */ -#define EMSGSIZE 40 /* Message too long */ -#define EPROTONOSUPPORT 43 /* Unknown protocol */ -#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ -#define EADDRNOTAVAIL 49 /* Address not available */ -#define ENETRESET 52 /* Connection aborted by network */ -#define EISCONN 56 /* Socket is already connected */ -#define ENOTCONN 57 /* Socket is not connected */ -#define ETOOMANYREFS 59 -#define EPROCLIM 67 -#define EUSERS 68 -#define EDQUOT 69 -#define ESTALE 70 -#define ENOTSUP 86 /* Not supported */ -#define EILSEQ 85 /* Illegal byte sequence */ -#define EOVERFLOW 84 /* Value too large for defined data type */ -#define ECANCELED 87 /* Operation canceled */ -// TODO: check value -#define ENOTRECOVERABLE 95 /* State not recoverable */ -// TODO: check value -#define EOWNERDEAD 96 /* Previous owner died */ +#define EPERM 1 /* Not owner */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No children */ +#define EAGAIN 11 /* No more processes */ +#define ENOMEM 12 /* Not enough space */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* File descriptor value too large */ +#define ENOTTY 25 /* Not a character device */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Mathematics argument out of domain of function */ +#define ERANGE 34 /* Result too large */ +#define ENOMSG 35 /* No message of desired type */ +#define EIDRM 36 /* Identifier removed */ +#define edeadlk 45 /* deadlock */ +#define enolck 46 /* no lock */ +#define ENOSTR 60 /* Not a stream */ +#define ENODATA 61 /* No data (for no delay io) */ +#define ETIME 62 /* Stream ioctl timeout */ +#define ENOSR 63 /* No stream resources */ +#define EREMOTE 66 /* The object is remote */ +#define ENOLINK 67 /* Virtual circuit is gone */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 74 /* Multihop attempted */ +#define EBADMSG 77 /* Bad message */ +#define EFTYPE 79 /* Inappropriate file type or format */ +#define ENOSYS 88 /* Function not implemented */ +#define ENOTEMPTY 90 /* Directory not empty */ +#define ENAMETOOLONG 91 /* File or path name too long */ +#define ELOOP 92 /* Too many symbolic links */ +#define EOPNOTSUPP 95 /* Operation not supported on socket */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */ +#define EPROTOTYPE 107 /* Protocol wrong type for socket */ +#define ENOTSOCK 108 /* Socket operation on non-socket */ +#define ENOPROTOOPT 109 /* Protocol not available */ +#define ESHUTDOWN 110 /* Can't send after socket shutdown */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EADDRINUSE 112 /* Address already in use */ +#define ECONNABORTED 113 /* Software caused connection abort */ +#define ENETUNREACH 114 /* Network is unreachable */ +#define ENETDOWN 115 /* Network interface is not configured */ +#define ETIMEDOUT 116 /* Connection timed out */ +#define EHOSTDOWN 117 /* Host is down */ +#define EHOSTUNREACH 118 /* Host is unreachable */ +#define EINPROGRESS 119 /* Connection already in progress */ +#define EALREADY 120 /* Socket already connected */ +#define EDESTADDRREQ 121 /* Destination address required */ +#define EMSGSIZE 122 /* Message too long */ +#define EPROTONOSUPPORT 123 /* Unknown protocol */ +#define ESOCKTNOSUPPORT 124 /* Socket type not supported */ +#define EADDRNOTAVAIL 125 /* Address not available */ +#define ENETRESET 126 /* Connection aborted by network */ +#define EISCONN 127 /* Socket is already connected */ +#define ENOTCONN 128 /* Socket is not connected */ +#define ETOOMANYREFS 129 +#define EUSERS 131 +#define EDQUOT 132 +#define ESTALE 133 +#define ENOTSUP 134 /* Not supported */ +#define EILSEQ 138 /* Illegal byte sequence */ +#define EOVERFLOW 139 /* Value too large for defined data type */ +#define ECANCELED 140 /* Operation canceled */ +#define ENOTRECOVERABLE 141 /* State not recoverable */ +#define EOWNERDEAD 142 /* Previous owner died */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ -#define EBADRPC 72 -#define ERPCMISMATCH 73 -#define EPROGUNAVAIL 74 -#define EPROGMISMATCH 75 -#define EPROCUNAVAIL 76 -#define EAUTH 80 -#define ENEEDAUTH 81 -#define EADHOC 160 -#define EDISABLEDIF 161 -#define ERESUME 162 -#define EWOULDBLOCK EAGAIN /* Operation would block */ - -#define __ELASTERROR 2000 /* Users can add values starting here */ +#define __ELASTERROR 2000 /* Users can add values starting here */ #ifdef __cplusplus } diff --git a/newlib/libc/sys/vita/syscalls.c b/newlib/libc/sys/vita/syscalls.c index 5e9d2f02d7..063f4a31fa 100755 --- a/newlib/libc/sys/vita/syscalls.c +++ b/newlib/libc/sys/vita/syscalls.c @@ -19,6 +19,7 @@ #include "vitadescriptor.h" #include "vitaglue.h" +#include "vitaerror.h" // TODO: add to SDK diff --git a/newlib/libc/sys/vita/vitaerror.h b/newlib/libc/sys/vita/vitaerror.h new file mode 100644 index 0000000000..997690c69d --- /dev/null +++ b/newlib/libc/sys/vita/vitaerror.h @@ -0,0 +1,32 @@ +/* + +Copyright (C) 2018, Sunguk Lee + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#ifndef _VITAERROR_H_ +#define _VITAERROR_H_ + +int __vita_sce_errno_to_errno(int sce_errno); + +#endif // _VITAERROR_H_ + + From ac4428bc7e33b6b17c7a66a8215e6d6c0651194d Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Thu, 26 Jul 2018 23:28:58 +0900 Subject: [PATCH 67/86] Add Davee into author https://github.com/DaveeFTW/musl/commits/vita/src/internal/vita/sceerrno.c --- newlib/libc/sys/vita/error.c | 1 + newlib/libc/sys/vita/vitaerror.h | 1 + 2 files changed, 2 insertions(+) diff --git a/newlib/libc/sys/vita/error.c b/newlib/libc/sys/vita/error.c index acdd30bd97..a1f99ee171 100644 --- a/newlib/libc/sys/vita/error.c +++ b/newlib/libc/sys/vita/error.c @@ -1,5 +1,6 @@ /* +Copyright (C) 2017, David "Davee" Morgan Copyright (C) 2018, Sunguk Lee Permission is hereby granted, free of charge, to any person obtaining a diff --git a/newlib/libc/sys/vita/vitaerror.h b/newlib/libc/sys/vita/vitaerror.h index 997690c69d..c050aa47bd 100644 --- a/newlib/libc/sys/vita/vitaerror.h +++ b/newlib/libc/sys/vita/vitaerror.h @@ -1,5 +1,6 @@ /* +Copyright (C) 2017, David "Davee" Morgan Copyright (C) 2018, Sunguk Lee Permission is hereby granted, free of charge, to any person obtaining a From 1914b9aba0b969109addc5596eb51026c6e5324a Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Mon, 21 Jan 2019 03:10:03 +0900 Subject: [PATCH 68/86] Fix wrong error code enum --- newlib/libc/sys/vita/sys/errno.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/sys/errno.h b/newlib/libc/sys/vita/sys/errno.h index b2cb8a5991..a96e0b47df 100644 --- a/newlib/libc/sys/vita/sys/errno.h +++ b/newlib/libc/sys/vita/sys/errno.h @@ -58,8 +58,8 @@ extern __IMPORT int _sys_nerr; #define ERANGE 34 /* Result too large */ #define ENOMSG 35 /* No message of desired type */ #define EIDRM 36 /* Identifier removed */ -#define edeadlk 45 /* deadlock */ -#define enolck 46 /* no lock */ +#define EDEADLK 45 /* deadlock */ +#define ENOLCK 46 /* no lock */ #define ENOSTR 60 /* Not a stream */ #define ENODATA 61 /* No data (for no delay io) */ #define ETIME 62 /* Stream ioctl timeout */ From da3bff045b69fe6b10da4ccf2aa615aa16fd3e32 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Wed, 23 Jan 2019 14:23:45 +0900 Subject: [PATCH 69/86] Fix indent on sys/error.h --- newlib/libc/sys/vita/sys/errno.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/sys/errno.h b/newlib/libc/sys/vita/sys/errno.h index a96e0b47df..1ed1682960 100644 --- a/newlib/libc/sys/vita/sys/errno.h +++ b/newlib/libc/sys/vita/sys/errno.h @@ -26,7 +26,7 @@ extern __IMPORT int _sys_nerr; #define ENOENT 2 /* No such file or directory */ #define ESRCH 3 /* No such process */ #define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ +#define EIO 5 /* I/O error */ #define ENXIO 6 /* No such device or address */ #define E2BIG 7 /* Arg list too long */ #define ENOEXEC 8 /* Exec format error */ From 74d872ef7b794a18ef3c04ec506fcfb71266d1d3 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Wed, 23 Jan 2019 15:03:53 +0900 Subject: [PATCH 70/86] Just return original error code when dismatch POSIX error code --- newlib/libc/sys/vita/error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/libc/sys/vita/error.c b/newlib/libc/sys/vita/error.c index a1f99ee171..8d0c8981f7 100644 --- a/newlib/libc/sys/vita/error.c +++ b/newlib/libc/sys/vita/error.c @@ -200,6 +200,6 @@ int __vita_sce_errno_to_errno(int sce_errno) case SCE_NET_ERROR_ETIME: return ETIME; default: - return EINVAL; + return sce_errno; } } From 87df50f1092194d5e45655e6ffe68b913dedfb20 Mon Sep 17 00:00:00 2001 From: Rinnegatamante Date: Fri, 8 Feb 2019 22:51:53 +0100 Subject: [PATCH 71/86] Added INADDR_LOOPBACK and INADDR_NONE defines. (#40) * Added INADDR_LOOPBACK and INADDR_NONE defines. * Fix sockaddr_in tabulation. --- newlib/libc/sys/vita/include/netinet/in.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index c1c64a81a4..473af7608c 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -34,8 +34,8 @@ #include #define IPPROTO_IP SCE_NET_IPPROTO_IP -#define IPPROTO_ICMP SCE_NET_IPPROTO_ICMP -#define IPPROTO_IGMP SCE_NET_IPPROTO_IGMP +#define IPPROTO_ICMP SCE_NET_IPPROTO_ICMP +#define IPPROTO_IGMP SCE_NET_IPPROTO_IGMP #define IPPROTO_TCP SCE_NET_IPPROTO_TCP #define IPPROTO_UDP SCE_NET_IPPROTO_UDP @@ -50,7 +50,7 @@ struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; - struct in_addr sin_addr; + struct in_addr sin_addr; in_port_t sin_vport; char sin_zero[6]; } sockaddr_in; @@ -61,6 +61,9 @@ struct sockaddr_in { /* Address to send to all hosts. */ #define INADDR_BROADCAST ((in_addr_t) 0xffffffff) +#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) // 127.0.0.1 +#define INADDR_NONE ((in_addr_t) 0xffffffff) + #define ntohs __builtin_bswap16 #define htons __builtin_bswap16 #define ntohl __builtin_bswap32 From 5ef24f3fdaa55706a883db107056383051a8b810 Mon Sep 17 00:00:00 2001 From: Rinnegatamante Date: Sat, 16 Feb 2019 21:18:12 +0100 Subject: [PATCH 72/86] Added missing typedefs --- newlib/libc/sys/vita/include/netinet/in.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index 473af7608c..c02cd082ba 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -42,11 +42,11 @@ typedef uint32_t in_addr_t; typedef uint16_t in_port_t; -struct in_addr { +typedef struct in_addr { in_addr_t s_addr; } in_addr; -struct sockaddr_in { +typedef struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; From cc721af61083112b77c06f78b70b46f8a842a812 Mon Sep 17 00:00:00 2001 From: Martin Larralde Date: Wed, 27 Feb 2019 16:36:16 +0100 Subject: [PATCH 73/86] Make localtime and localtime_r aware of system timezone (#41) * Add `vita/lcltime_r.c` to provide localtime_r using SceRtc functions * Use hardtabs instead of spaces in `sys/vita/lcltime_r.c` * Use `rid` as `errno` in `lcltime_r.c` --- newlib/libc/sys/vita/Makefile.am | 2 +- newlib/libc/sys/vita/Makefile.in | 11 +++++-- newlib/libc/sys/vita/lcltime_r.c | 50 ++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 newlib/libc/sys/vita/lcltime_r.c diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 0a54ca085c..a34f955fa4 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -11,7 +11,7 @@ noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o error.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c lcltime_r.c lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index c3ad3b6ee9..c8f98c1df1 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -73,7 +73,8 @@ am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) \ lib_a-select.$(OBJEXT) lib_a-netdb.$(OBJEXT) \ - lib_a-error.$(OBJEXT) lib_a-dirent.$(OBJEXT) + lib_a-error.$(OBJEXT) lib_a-dirent.$(OBJEXT) \ + lib_a-lcltime_r.$(OBJEXT) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -200,7 +201,7 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o error.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c lcltime_r.c lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) @@ -330,6 +331,12 @@ lib_a-dirent.o: dirent.c lib_a-dirent.obj: dirent.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-dirent.obj `if test -f 'dirent.c'; then $(CYGPATH_W) 'dirent.c'; else $(CYGPATH_W) '$(srcdir)/dirent.c'; fi` +lib_a-lcltime_r.o: lcltime_r.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-lcltime_r.o `test -f 'lcltime_r.c' || echo '$(srcdir)/'`lcltime_r.c + +lib_a-lcltime_r.obj: lcltime_r.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-lcltime_r.obj `if test -f 'lcltime_r.c'; then $(CYGPATH_W) 'lcltime_r.c'; else $(CYGPATH_W) '$(srcdir)/lcltime_r.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ diff --git a/newlib/libc/sys/vita/lcltime_r.c b/newlib/libc/sys/vita/lcltime_r.c new file mode 100644 index 0000000000..332f1d34b4 --- /dev/null +++ b/newlib/libc/sys/vita/lcltime_r.c @@ -0,0 +1,50 @@ +/* + +Copyright (C) 2019, Martin Larralde + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#include +#include +#include + +#include + +#include "vitaerror.h" + +#define TRY(x) {rid=x; if (rid < 0) {errno = rid; return NULL;}} + + +struct tm *localtime_r(const time_t *timep, struct tm *result) +{ + SceDateTime dt; + SceRtcTick tick; + time_t localtime; + int rid; + + TRY(sceRtcConvertTime_tToDateTime(*timep, &dt)); + TRY(sceRtcConvertDateTimeToTick(&dt, &tick)); + TRY(sceRtcConvertUtcToLocalTime(&tick, &tick)); + TRY(sceRtcConvertTickToDateTime(&tick, &dt)); + TRY(sceRtcConvertDateTimeToTime_t(&dt, &localtime)); + + return gmtime_r(&localtime, result); +} From 62f6f95222533f01f339c249b501e74d0231c38a Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sat, 10 Aug 2019 18:08:35 +0900 Subject: [PATCH 74/86] Move net functions to `net` dir and add getaddrinfo related files copy from `newlib/libc/sys/phoenix/net/*` --- newlib/libc/sys/vita/Makefile.am | 13 +- newlib/libc/sys/vita/Makefile.in | 55 ++++-- newlib/libc/sys/vita/include/netdb.h | 24 +++ newlib/libc/sys/vita/net/freeaddrinfo.c | 52 +++++ newlib/libc/sys/vita/net/getaddrinfo.c | 185 ++++++++++++++++++ .../sys/vita/{netdb.c => net/gethostbyname.c} | 0 newlib/libc/sys/vita/net/getservbyname.c | 33 ++++ 7 files changed, 343 insertions(+), 19 deletions(-) create mode 100644 newlib/libc/sys/vita/net/freeaddrinfo.c create mode 100644 newlib/libc/sys/vita/net/getaddrinfo.c rename newlib/libc/sys/vita/{netdb.c => net/gethostbyname.c} (100%) create mode 100644 newlib/libc/sys/vita/net/getservbyname.c diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index a34f955fa4..1abae1e408 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -8,17 +8,22 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o error.o +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o error.o +NET_OBJS = gethostbyname.o getaddrinfo.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c lcltime_r.c -lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} +NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} +lib_a_LIBADD = ${SOCKET_OBJS} ${NET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) all-local: crt0.o -$(SOCKET_OBJS): socket.c netdb.c error.c +$(SOCKET_OBJS): socket.c error.c + $(COMPILE) -DF_$* $< -c -o $@ + +$(NET_OBJS): net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c $(COMPILE) -DF_$* $< -c -o $@ $(DIRENT_OBJS): dirent.c diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index c8f98c1df1..e2fd821468 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -68,13 +68,16 @@ CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru lib_a_AR = $(AR) $(ARFLAGS) -lib_a_DEPENDENCIES = $(SOCKET_OBJS) $(DIRENT_OBJS) +lib_a_DEPENDENCIES = $(SOCKET_OBJS) $(NET_OBJS) $(DIRENT_OBJS) +am__objects_1 = lib_a-gethostbyname.$(OBJEXT) \ + lib_a-getaddrinfo.$(OBJEXT) lib_a-freeaddrinfo.$(OBJEXT) \ + lib_a-getservbyname.$(OBJEXT) am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) \ - lib_a-select.$(OBJEXT) lib_a-netdb.$(OBJEXT) \ - lib_a-error.$(OBJEXT) lib_a-dirent.$(OBJEXT) \ - lib_a-lcltime_r.$(OBJEXT) + lib_a-select.$(OBJEXT) lib_a-error.$(OBJEXT) \ + lib_a-dirent.$(OBJEXT) lib_a-lcltime_r.$(OBJEXT) \ + $(am__objects_1) lib_a_OBJECTS = $(am_lib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = @@ -185,7 +188,6 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ -runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -199,10 +201,12 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a -SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o netdb.o error.o +SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o error.o +NET_OBJS = gethostbyname.o getaddrinfo.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c netdb.c error.c dirent.c lcltime_r.c -lib_a_LIBADD = ${SOCKET_OBJS} ${DIRENT_OBJS} +NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c +lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} +lib_a_LIBADD = ${SOCKET_OBJS} ${NET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) ACLOCAL_AMFLAGS = -I ../../.. -I ../../../.. @@ -313,12 +317,6 @@ lib_a-select.o: select.c lib_a-select.obj: select.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-select.obj `if test -f 'select.c'; then $(CYGPATH_W) 'select.c'; else $(CYGPATH_W) '$(srcdir)/select.c'; fi` -lib_a-netdb.o: netdb.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-netdb.o `test -f 'netdb.c' || echo '$(srcdir)/'`netdb.c - -lib_a-netdb.obj: netdb.c - $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-netdb.obj `if test -f 'netdb.c'; then $(CYGPATH_W) 'netdb.c'; else $(CYGPATH_W) '$(srcdir)/netdb.c'; fi` - lib_a-error.o: error.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-error.o `test -f 'error.c' || echo '$(srcdir)/'`error.c @@ -337,6 +335,30 @@ lib_a-lcltime_r.o: lcltime_r.c lib_a-lcltime_r.obj: lcltime_r.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-lcltime_r.obj `if test -f 'lcltime_r.c'; then $(CYGPATH_W) 'lcltime_r.c'; else $(CYGPATH_W) '$(srcdir)/lcltime_r.c'; fi` +lib_a-gethostbyname.o: net/gethostbyname.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-gethostbyname.o `test -f 'net/gethostbyname.c' || echo '$(srcdir)/'`net/gethostbyname.c + +lib_a-gethostbyname.obj: net/gethostbyname.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-gethostbyname.obj `if test -f 'net/gethostbyname.c'; then $(CYGPATH_W) 'net/gethostbyname.c'; else $(CYGPATH_W) '$(srcdir)/net/gethostbyname.c'; fi` + +lib_a-getaddrinfo.o: net/getaddrinfo.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-getaddrinfo.o `test -f 'net/getaddrinfo.c' || echo '$(srcdir)/'`net/getaddrinfo.c + +lib_a-getaddrinfo.obj: net/getaddrinfo.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-getaddrinfo.obj `if test -f 'net/getaddrinfo.c'; then $(CYGPATH_W) 'net/getaddrinfo.c'; else $(CYGPATH_W) '$(srcdir)/net/getaddrinfo.c'; fi` + +lib_a-freeaddrinfo.o: net/freeaddrinfo.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-freeaddrinfo.o `test -f 'net/freeaddrinfo.c' || echo '$(srcdir)/'`net/freeaddrinfo.c + +lib_a-freeaddrinfo.obj: net/freeaddrinfo.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-freeaddrinfo.obj `if test -f 'net/freeaddrinfo.c'; then $(CYGPATH_W) 'net/freeaddrinfo.c'; else $(CYGPATH_W) '$(srcdir)/net/freeaddrinfo.c'; fi` + +lib_a-getservbyname.o: net/getservbyname.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-getservbyname.o `test -f 'net/getservbyname.c' || echo '$(srcdir)/'`net/getservbyname.c + +lib_a-getservbyname.obj: net/getservbyname.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-getservbyname.obj `if test -f 'net/getservbyname.c'; then $(CYGPATH_W) 'net/getservbyname.c'; else $(CYGPATH_W) '$(srcdir)/net/getservbyname.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -510,7 +532,10 @@ uninstall-am: all-local: crt0.o -$(SOCKET_OBJS): socket.c netdb.c error.c +$(SOCKET_OBJS): socket.c error.c + $(COMPILE) -DF_$* $< -c -o $@ + +$(NET_OBJS): net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c $(COMPILE) -DF_$* $< -c -o $@ $(DIRENT_OBJS): dirent.c diff --git a/newlib/libc/sys/vita/include/netdb.h b/newlib/libc/sys/vita/include/netdb.h index c4f405bd4a..323af729e1 100644 --- a/newlib/libc/sys/vita/include/netdb.h +++ b/newlib/libc/sys/vita/include/netdb.h @@ -29,6 +29,9 @@ #ifndef _NETDB_H_ #define _NETDB_H_ +#include +#include + #ifdef __cplusplus extern "C" { #endif @@ -42,7 +45,28 @@ struct hostent { }; #define h_addr h_addr_list[0] +struct servent { + char *s_name; + char **s_aliases; + int s_port; + char *s_proto; +}; + +struct addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + char *ai_canonname; + struct sockaddr *ai_addr; + struct addrinfo *ai_next; +}; + struct hostent *gethostbyname(const char *name); +struct servent *getservbyname(const char *name, const char *proto); +int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); +void freeaddrinfo(struct addrinfo *res); #ifdef __cplusplus } diff --git a/newlib/libc/sys/vita/net/freeaddrinfo.c b/newlib/libc/sys/vita/net/freeaddrinfo.c new file mode 100644 index 0000000000..19b8bd7305 --- /dev/null +++ b/newlib/libc/sys/vita/net/freeaddrinfo.c @@ -0,0 +1,52 @@ +/* The Inner Net License, Version 2.00 + + The author(s) grant permission for redistribution and use in source and +binary forms, with or without modification, of the software and documentation +provided that the following conditions are met: + +0. If you receive a version of the software that is specifically labelled + as not being for redistribution (check the version message and/or README), + you are not permitted to redistribute that version of the software in any + way or form. +1. All terms of the all other applicable copyrights and licenses must be + followed. +2. Redistributions of source code must retain the authors' copyright + notice(s), this list of conditions, and the following disclaimer. +3. Redistributions in binary form must reproduce the authors' copyright + notice(s), this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. +4. [The copyright holder has authorized the removal of this clause.] +5. Neither the name(s) of the author(s) nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + If these license terms cause you a real problem, contact the author. */ + +/* This software is Copyright 1996 by Craig Metz, All Rights Reserved. */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include +#include + +void freeaddrinfo(struct addrinfo *res) +{ + while (res != NULL) { + struct addrinfo *p = res; + res = res->ai_next; + free(p->ai_canonname); + free(p); + } +} diff --git a/newlib/libc/sys/vita/net/getaddrinfo.c b/newlib/libc/sys/vita/net/getaddrinfo.c new file mode 100644 index 0000000000..ad9166de67 --- /dev/null +++ b/newlib/libc/sys/vita/net/getaddrinfo.c @@ -0,0 +1,185 @@ +/* + * Mar 8, 2000 by Hajimu UMEMOTO + * $Id: getaddrinfo.c,v 1.2 2002/05/22 17:56:56 snsimon Exp $ + * + * This module is besed on ssh-1.2.27-IPv6-1.5 written by + * KIKUCHI Takahiro + */ +/* + * Copyright (c) 2001 Carnegie Mellon University. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any other legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * fake library for ssh + * + * This file includes getaddrinfo(), freeaddrinfo() and gai_strerror(). + * These funtions are defined in rfc2133. + * + * But these functions are not implemented correctly. The minimum subset + * is implemented for ssh use only. For example, this routine assumes + * that ai_family is AF_INET. Don't use it for another purpose. + * + * In the case not using 'configure --enable-ipv6', this getaddrinfo.c + * will be used if you have broken getaddrinfo or no getaddrinfo. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static struct addrinfo *malloc_ai(int port, u_long addr, int socktype, int proto) +{ + struct addrinfo *ai = (struct addrinfo *)malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); + if (ai) { + memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); + ai->ai_addr = (struct sockaddr *)(ai + 1); + /* XXX -- ssh doesn't use sa_len */ + ai->ai_addrlen = sizeof(struct sockaddr_in); +#ifdef HAVE_SOCKADDR_SA_LEN + ai->ai_addr->sa_len = sizeof(struct sockaddr_in); +#endif + ai->ai_addr->sa_family = ai->ai_family = AF_INET; + ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port; + ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr; + ai->ai_socktype = socktype; + ai->ai_protocol = proto; + return ai; + } + + return NULL; +} + +int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) +{ + struct addrinfo *cur, *prev = NULL; + struct hostent *hp; + struct in_addr in; + int i, port = 0, socktype, proto; + + if (hints && hints->ai_family != PF_INET && hints->ai_family != PF_UNSPEC) + return EAI_FAMILY; + + socktype = (hints && hints->ai_socktype) ? hints->ai_socktype : SOCK_STREAM; + if (hints && hints->ai_protocol) + proto = hints->ai_protocol; + else { + switch (socktype) { + case SOCK_DGRAM: + proto = IPPROTO_UDP; + break; + case SOCK_STREAM: + proto = IPPROTO_TCP; + break; + default: + proto = 0; + break; + } + } + + if (service) { + if (isdigit((int)*service)) + port = htons(atoi(service)); + else { + struct servent *se; + char *pe_proto; + + switch (socktype) { + case SOCK_DGRAM: + pe_proto = "udp"; + break; + case SOCK_STREAM: + pe_proto = "tcp"; + break; + default: + pe_proto = NULL; + break; + } + if ((se = getservbyname(service, pe_proto)) == NULL) + return EAI_SERVICE; + + port = se->s_port; + } + } + if (!node) { + if (hints && hints->ai_flags & AI_PASSIVE) + *res = malloc_ai(port, htonl(0x00000000), socktype, proto); + else + *res = malloc_ai(port, htonl(0x7f000001), socktype, proto); + if (*res) + return 0; + else + return EAI_MEMORY; + } + if (inet_aton(node, &in)) { + *res = malloc_ai(port, in.s_addr, socktype, proto); + if (*res) + return 0; + else + return EAI_MEMORY; + } + if (hints && hints->ai_flags & AI_NUMERICHOST) + return EAI_NODATA; + if ((hp = gethostbyname(node)) && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { + for (i = 0; hp->h_addr_list[i]; i++) { + if ((cur = malloc_ai(port, ((struct in_addr *)hp->h_addr_list[i])->s_addr, socktype, proto)) == NULL) { + if (*res) + freeaddrinfo(*res); + return EAI_MEMORY; + } + if (prev) + prev->ai_next = cur; + else + *res = cur; + prev = cur; + } + if (hints && hints->ai_flags & AI_CANONNAME && *res) { + /* NOT sasl_strdup for compatibility */ + if (((*res)->ai_canonname = strdup(hp->h_name)) == NULL) { + freeaddrinfo(*res); + return EAI_MEMORY; + } + } + return 0; + } + return EAI_NODATA; +} diff --git a/newlib/libc/sys/vita/netdb.c b/newlib/libc/sys/vita/net/gethostbyname.c similarity index 100% rename from newlib/libc/sys/vita/netdb.c rename to newlib/libc/sys/vita/net/gethostbyname.c diff --git a/newlib/libc/sys/vita/net/getservbyname.c b/newlib/libc/sys/vita/net/getservbyname.c new file mode 100644 index 0000000000..97ac4652be --- /dev/null +++ b/newlib/libc/sys/vita/net/getservbyname.c @@ -0,0 +1,33 @@ +/* Copyright (c) 2016 Phoenix Systems + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE.*/ + +#include +#include + +struct servent *getservbyname(const char *name, const char *proto) +{ + /* TODO: implement. */ + errno = ENOSYS; + return NULL; +} From c9ab72737e64931f60621c62f3d6066aaf8af40e Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sat, 10 Aug 2019 18:19:53 +0900 Subject: [PATCH 75/86] Fix part of the getaddrinfo function vita newlib has sa_len and doesn't have arpa/inet.h --- newlib/libc/sys/vita/net/getaddrinfo.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/newlib/libc/sys/vita/net/getaddrinfo.c b/newlib/libc/sys/vita/net/getaddrinfo.c index ad9166de67..f21a6b1b72 100644 --- a/newlib/libc/sys/vita/net/getaddrinfo.c +++ b/newlib/libc/sys/vita/net/getaddrinfo.c @@ -58,7 +58,6 @@ * will be used if you have broken getaddrinfo or no getaddrinfo. */ -#include #include #include #include @@ -75,9 +74,7 @@ static struct addrinfo *malloc_ai(int port, u_long addr, int socktype, int proto ai->ai_addr = (struct sockaddr *)(ai + 1); /* XXX -- ssh doesn't use sa_len */ ai->ai_addrlen = sizeof(struct sockaddr_in); -#ifdef HAVE_SOCKADDR_SA_LEN ai->ai_addr->sa_len = sizeof(struct sockaddr_in); -#endif ai->ai_addr->sa_family = ai->ai_family = AF_INET; ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port; ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr; From f0eacb8c4144c1cd854b8a350c59734bd6c7870a Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sat, 10 Aug 2019 21:35:40 +0900 Subject: [PATCH 76/86] Add missing defines for getaddrinfo --- newlib/libc/sys/vita/include/netdb.h | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/newlib/libc/sys/vita/include/netdb.h b/newlib/libc/sys/vita/include/netdb.h index 323af729e1..e0435dca08 100644 --- a/newlib/libc/sys/vita/include/netdb.h +++ b/newlib/libc/sys/vita/include/netdb.h @@ -63,6 +63,41 @@ struct addrinfo { struct addrinfo *ai_next; }; +/* Error return codes from getaddrinfo() */ +#define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */ +#define EAI_NONAME -2 /* NAME or SERVICE is unknown. */ +#define EAI_AGAIN -3 /* Temporary failure in name resolution. */ +#define EAI_FAIL -4 /* Non-recoverable failure in name res. */ +#define EAI_NODATA -5 /* No address associated with NAME. */ +#define EAI_FAMILY -6 /* `ai_family' not supported. */ +#define EAI_SOCKTYPE -7 /* `ai_socktype' not supported. */ +#define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */ +#define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */ +#define EAI_MEMORY -10 /* Memory allocation failure. */ +#define EAI_SYSTEM -11 /* System error returned in `errno'. */ +#define EAI_OVERFLOW -12 /* Argument buffer overflow. */ +#ifdef __USE_GNU +#define EAI_INPROGRESS -100 /* Processing request in progress. */ +#define EAI_CANCELED -101 /* Request canceled. */ +#define EAI_NOTCANCELED -102 /* Request not canceled. */ +#define EAI_ALLDONE -103 /* All requests done. */ +#define EAI_INTR -104 /* Interrupted by a signal. */ +#define EAI_IDN_ENCODE -105 /* IDN encoding failed. */ +#endif + +/* Flag values for getaddrinfo() */ +#define AI_PASSIVE 0x00000001 /* Get address to use bind() */ +#define AI_CANONNAME 0x00000002 /* Fill ai_canonname */ +#define AI_NUMERICHOST 0x00000004 /* Prevent name resolution */ +#define AI_NUMERICSERV 0x00000008 /* Fon't use name resolution. */ + +/* Valid flags for addrinfo */ +#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_ADDRCONFIG) +#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */ +#define AI_V4MAPPED_CFG 0x00000200 /* Accept IPv4-mapped if kernel supports */ +#define AI_ADDRCONFIG 0x00000400 /* Only if any address is assigned */ +#define AI_V4MAPPED 0x00000800 /* Accept IPv4-mapped IPv6 address */ + struct hostent *gethostbyname(const char *name); struct servent *getservbyname(const char *name, const char *proto); int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); From c915da5b20b9ed2d0a3853e92234074f6246bef4 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 11 Aug 2019 01:03:20 +0900 Subject: [PATCH 77/86] Add arpa inet functions copy from `newlib/libc/sys/phoenix/net/*` --- newlib/Makefile.am | 6 + newlib/Makefile.in | 7 +- newlib/libc/sys/vita/Makefile.am | 6 +- newlib/libc/sys/vita/Makefile.in | 79 ++++- newlib/libc/sys/vita/include/arpa/inet.h | 47 +++ newlib/libc/sys/vita/include/arpa/nameser.h | 44 +++ newlib/libc/sys/vita/include/arpa/telnet.h | 331 ++++++++++++++++++++ newlib/libc/sys/vita/include/netdb.h | 1 + newlib/libc/sys/vita/include/netinet/in.h | 34 ++ newlib/libc/sys/vita/net/inet_addr.c | 70 +++++ newlib/libc/sys/vita/net/inet_aton.c | 167 ++++++++++ newlib/libc/sys/vita/net/inet_lnaof.c | 45 +++ newlib/libc/sys/vita/net/inet_makeaddr.c | 50 +++ newlib/libc/sys/vita/net/inet_net_ntop.c | 107 +++++++ newlib/libc/sys/vita/net/inet_net_pton.c | 190 +++++++++++ newlib/libc/sys/vita/net/inet_netof.c | 45 +++ newlib/libc/sys/vita/net/inet_network.c | 102 ++++++ newlib/libc/sys/vita/net/inet_ntoa.c | 35 +++ newlib/libc/sys/vita/net/inet_ntop.c | 171 ++++++++++ newlib/libc/sys/vita/net/inet_pton.c | 198 ++++++++++++ 20 files changed, 1727 insertions(+), 8 deletions(-) create mode 100644 newlib/libc/sys/vita/include/arpa/inet.h create mode 100644 newlib/libc/sys/vita/include/arpa/nameser.h create mode 100644 newlib/libc/sys/vita/include/arpa/telnet.h create mode 100644 newlib/libc/sys/vita/net/inet_addr.c create mode 100644 newlib/libc/sys/vita/net/inet_aton.c create mode 100644 newlib/libc/sys/vita/net/inet_lnaof.c create mode 100644 newlib/libc/sys/vita/net/inet_makeaddr.c create mode 100644 newlib/libc/sys/vita/net/inet_net_ntop.c create mode 100644 newlib/libc/sys/vita/net/inet_net_pton.c create mode 100644 newlib/libc/sys/vita/net/inet_netof.c create mode 100644 newlib/libc/sys/vita/net/inet_network.c create mode 100644 newlib/libc/sys/vita/net/inet_ntoa.c create mode 100644 newlib/libc/sys/vita/net/inet_ntop.c create mode 100644 newlib/libc/sys/vita/net/inet_pton.c diff --git a/newlib/Makefile.am b/newlib/Makefile.am index db569ad8cd..f29f401fb3 100644 --- a/newlib/Makefile.am +++ b/newlib/Makefile.am @@ -328,6 +328,12 @@ endif $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \ else true; fi ; \ done ; \ + $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/arpa; \ + for i in $(srcdir)/libc/sys/$(sys_dir)/include/arpa/*.h; do \ + if [ -f $$i ]; then \ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/arpa/`basename $$i`; \ + else true; fi ; \ + done ; \ for i in $(srcdir)/libc/sys/$(sys_dir)/include/*; do \ if [ -d $$i ]; then \ for j in $$i/*.h; do \ diff --git a/newlib/Makefile.in b/newlib/Makefile.in index 87cece056e..842b322acc 100644 --- a/newlib/Makefile.in +++ b/newlib/Makefile.in @@ -304,7 +304,6 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ -runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -1070,6 +1069,12 @@ install-data-local: install-toollibLIBRARIES $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/netinet/`basename $$i`; \ else true; fi ; \ done ; \ + $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/arpa; \ + for i in $(srcdir)/libc/sys/$(sys_dir)/include/arpa/*.h; do \ + if [ -f $$i ]; then \ + $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/arpa/`basename $$i`; \ + else true; fi ; \ + done ; \ for i in $(srcdir)/libc/sys/$(sys_dir)/include/*; do \ if [ -d $$i ]; then \ for j in $$i/*.h; do \ diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 1abae1e408..4b3da34c7a 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -9,10 +9,10 @@ AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o error.o -NET_OBJS = gethostbyname.o getaddrinfo.o +NET_OBJS = gethostbyname.o getaddrinfo.o freeaddrinfo.o getservbyname.o inet_ntop.o inet_ntoa.o inet_netof.o inet_pton.o inet_lnaof.o inet_addr.o inet_network.o inet_net_ntop.o inet_aton.o inet_net_pton.o inet_makeaddr.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c +NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c net/inet_ntop.c net/inet_ntoa.c net/inet_netof.c net/inet_pton.c net/inet_lnaof.c net/inet_addr.c net/inet_network.c net/inet_net_ntop.c net/inet_aton.c net/inet_net_pton.c net/inet_makeaddr.c lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} lib_a_LIBADD = ${SOCKET_OBJS} ${NET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) @@ -23,7 +23,7 @@ all-local: crt0.o $(SOCKET_OBJS): socket.c error.c $(COMPILE) -DF_$* $< -c -o $@ -$(NET_OBJS): net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c +$(NET_OBJS): net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c net/inet_ntop.c net/inet_ntoa.c net/inet_netof.c net/inet_pton.c net/inet_lnaof.c net/inet_addr.c net/inet_network.c net/inet_net_ntop.c net/inet_aton.c net/inet_net_pton.c net/inet_makeaddr.c $(COMPILE) -DF_$* $< -c -o $@ $(DIRENT_OBJS): dirent.c diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index e2fd821468..758bdc654c 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -71,7 +71,12 @@ lib_a_AR = $(AR) $(ARFLAGS) lib_a_DEPENDENCIES = $(SOCKET_OBJS) $(NET_OBJS) $(DIRENT_OBJS) am__objects_1 = lib_a-gethostbyname.$(OBJEXT) \ lib_a-getaddrinfo.$(OBJEXT) lib_a-freeaddrinfo.$(OBJEXT) \ - lib_a-getservbyname.$(OBJEXT) + lib_a-getservbyname.$(OBJEXT) lib_a-inet_ntop.$(OBJEXT) \ + lib_a-inet_ntoa.$(OBJEXT) lib_a-inet_netof.$(OBJEXT) \ + lib_a-inet_pton.$(OBJEXT) lib_a-inet_lnaof.$(OBJEXT) \ + lib_a-inet_addr.$(OBJEXT) lib_a-inet_network.$(OBJEXT) \ + lib_a-inet_net_ntop.$(OBJEXT) lib_a-inet_aton.$(OBJEXT) \ + lib_a-inet_net_pton.$(OBJEXT) lib_a-inet_makeaddr.$(OBJEXT) am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) \ @@ -202,9 +207,9 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) AM_CCASFLAGS = $(INCLUDES) noinst_LIBRARIES = lib.a SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o listen.o recv.o recvfrom.o recvmsg.o send.o sendto.o sendmsg.o setsockopt.o shutdown.o socket.o error.o -NET_OBJS = gethostbyname.o getaddrinfo.o +NET_OBJS = gethostbyname.o getaddrinfo.o freeaddrinfo.o getservbyname.o inet_ntop.o inet_ntoa.o inet_netof.o inet_pton.o inet_lnaof.o inet_addr.o inet_network.o inet_net_ntop.o inet_aton.o inet_net_pton.o inet_makeaddr.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o -NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c +NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c net/inet_ntop.c net/inet_ntoa.c net/inet_netof.c net/inet_pton.c net/inet_lnaof.c net/inet_addr.c net/inet_network.c net/inet_net_ntop.c net/inet_aton.c net/inet_net_pton.c net/inet_makeaddr.c lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} lib_a_LIBADD = ${SOCKET_OBJS} ${NET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) @@ -359,6 +364,72 @@ lib_a-getservbyname.o: net/getservbyname.c lib_a-getservbyname.obj: net/getservbyname.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-getservbyname.obj `if test -f 'net/getservbyname.c'; then $(CYGPATH_W) 'net/getservbyname.c'; else $(CYGPATH_W) '$(srcdir)/net/getservbyname.c'; fi` +lib_a-inet_ntop.o: net/inet_ntop.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_ntop.o `test -f 'net/inet_ntop.c' || echo '$(srcdir)/'`net/inet_ntop.c + +lib_a-inet_ntop.obj: net/inet_ntop.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_ntop.obj `if test -f 'net/inet_ntop.c'; then $(CYGPATH_W) 'net/inet_ntop.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_ntop.c'; fi` + +lib_a-inet_ntoa.o: net/inet_ntoa.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_ntoa.o `test -f 'net/inet_ntoa.c' || echo '$(srcdir)/'`net/inet_ntoa.c + +lib_a-inet_ntoa.obj: net/inet_ntoa.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_ntoa.obj `if test -f 'net/inet_ntoa.c'; then $(CYGPATH_W) 'net/inet_ntoa.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_ntoa.c'; fi` + +lib_a-inet_netof.o: net/inet_netof.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_netof.o `test -f 'net/inet_netof.c' || echo '$(srcdir)/'`net/inet_netof.c + +lib_a-inet_netof.obj: net/inet_netof.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_netof.obj `if test -f 'net/inet_netof.c'; then $(CYGPATH_W) 'net/inet_netof.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_netof.c'; fi` + +lib_a-inet_pton.o: net/inet_pton.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_pton.o `test -f 'net/inet_pton.c' || echo '$(srcdir)/'`net/inet_pton.c + +lib_a-inet_pton.obj: net/inet_pton.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_pton.obj `if test -f 'net/inet_pton.c'; then $(CYGPATH_W) 'net/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_pton.c'; fi` + +lib_a-inet_lnaof.o: net/inet_lnaof.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_lnaof.o `test -f 'net/inet_lnaof.c' || echo '$(srcdir)/'`net/inet_lnaof.c + +lib_a-inet_lnaof.obj: net/inet_lnaof.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_lnaof.obj `if test -f 'net/inet_lnaof.c'; then $(CYGPATH_W) 'net/inet_lnaof.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_lnaof.c'; fi` + +lib_a-inet_addr.o: net/inet_addr.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_addr.o `test -f 'net/inet_addr.c' || echo '$(srcdir)/'`net/inet_addr.c + +lib_a-inet_addr.obj: net/inet_addr.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_addr.obj `if test -f 'net/inet_addr.c'; then $(CYGPATH_W) 'net/inet_addr.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_addr.c'; fi` + +lib_a-inet_network.o: net/inet_network.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_network.o `test -f 'net/inet_network.c' || echo '$(srcdir)/'`net/inet_network.c + +lib_a-inet_network.obj: net/inet_network.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_network.obj `if test -f 'net/inet_network.c'; then $(CYGPATH_W) 'net/inet_network.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_network.c'; fi` + +lib_a-inet_net_ntop.o: net/inet_net_ntop.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_net_ntop.o `test -f 'net/inet_net_ntop.c' || echo '$(srcdir)/'`net/inet_net_ntop.c + +lib_a-inet_net_ntop.obj: net/inet_net_ntop.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_net_ntop.obj `if test -f 'net/inet_net_ntop.c'; then $(CYGPATH_W) 'net/inet_net_ntop.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_net_ntop.c'; fi` + +lib_a-inet_aton.o: net/inet_aton.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_aton.o `test -f 'net/inet_aton.c' || echo '$(srcdir)/'`net/inet_aton.c + +lib_a-inet_aton.obj: net/inet_aton.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_aton.obj `if test -f 'net/inet_aton.c'; then $(CYGPATH_W) 'net/inet_aton.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_aton.c'; fi` + +lib_a-inet_net_pton.o: net/inet_net_pton.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_net_pton.o `test -f 'net/inet_net_pton.c' || echo '$(srcdir)/'`net/inet_net_pton.c + +lib_a-inet_net_pton.obj: net/inet_net_pton.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_net_pton.obj `if test -f 'net/inet_net_pton.c'; then $(CYGPATH_W) 'net/inet_net_pton.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_net_pton.c'; fi` + +lib_a-inet_makeaddr.o: net/inet_makeaddr.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_makeaddr.o `test -f 'net/inet_makeaddr.c' || echo '$(srcdir)/'`net/inet_makeaddr.c + +lib_a-inet_makeaddr.obj: net/inet_makeaddr.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-inet_makeaddr.obj `if test -f 'net/inet_makeaddr.c'; then $(CYGPATH_W) 'net/inet_makeaddr.c'; else $(CYGPATH_W) '$(srcdir)/net/inet_makeaddr.c'; fi` + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -535,7 +606,7 @@ all-local: crt0.o $(SOCKET_OBJS): socket.c error.c $(COMPILE) -DF_$* $< -c -o $@ -$(NET_OBJS): net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c +$(NET_OBJS): net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c net/inet_ntop.c net/inet_ntoa.c net/inet_netof.c net/inet_pton.c net/inet_lnaof.c net/inet_addr.c net/inet_network.c net/inet_net_ntop.c net/inet_aton.c net/inet_net_pton.c net/inet_makeaddr.c $(COMPILE) -DF_$* $< -c -o $@ $(DIRENT_OBJS): dirent.c diff --git a/newlib/libc/sys/vita/include/arpa/inet.h b/newlib/libc/sys/vita/include/arpa/inet.h new file mode 100644 index 0000000000..d9dae9fb72 --- /dev/null +++ b/newlib/libc/sys/vita/include/arpa/inet.h @@ -0,0 +1,47 @@ +/* Copyright (c) 2016 Phoenix Systems + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE.*/ + +#ifndef _ARPA_INET_H +#define _ARPA_INET_H + +#include +#include +#include + +#define INET_ADDRSTRLEN 16 +#define INET6_ADDRSTRLEN 46 + +int inet_aton(const char *cp, struct in_addr *inp); +in_addr_t inet_addr(const char *cp); +in_addr_t inet_network(const char *cp); +char *inet_ntoa(struct in_addr in); +struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host); +in_addr_t inet_lnaof(struct in_addr in); +in_addr_t inet_netof(struct in_addr in); +const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); +int inet_pton(int af, const char *src, void *dst); +int inet_net_pton(int af, const char *pres, void *netp, size_t nsize); +char *inet_net_ntop(int af, const void *netp, int bits, char *pres, size_t psize); + +#endif diff --git a/newlib/libc/sys/vita/include/arpa/nameser.h b/newlib/libc/sys/vita/include/arpa/nameser.h new file mode 100644 index 0000000000..bf542d95c3 --- /dev/null +++ b/newlib/libc/sys/vita/include/arpa/nameser.h @@ -0,0 +1,44 @@ +/* Copyright (c) 2016 Phoenix Systems + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE.*/ + +#ifndef _ARPA_NAMESER_H +#define _ARPA_NAMESER_H + +/* Define constants based on RFC 883, RFC 1034, RFC 1035 */ +#define NS_PACKETSZ 512 /* Maximum packet size */ +#define NS_MAXDNAME 1025 /* Maximum domain name */ +#define NS_MAXCDNAME 255 /* Maximum compressed domain name */ +#define NS_MAXLABEL 63 /* Maximum length of domain label */ +#define NS_HFIXEDSZ 12 /* Bytes of fixed data in header */ +#define NS_QFIXEDSZ 4 /* Bytes of fixed data in query */ +#define NS_RRFIXEDSZ 10 /* Bytes of fixed data in r record */ +#define NS_INT32SZ 4 /* Bytes of data in a u_int32_t */ +#define NS_INT16SZ 2 /* Bytes of data in a u_int16_t */ +#define NS_INT8SZ 1 /* Bytes of data in a u_int8_t */ +#define NS_INADDRSZ 4 /* IPv4 T_A */ +#define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */ +#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ +#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ + +#endif diff --git a/newlib/libc/sys/vita/include/arpa/telnet.h b/newlib/libc/sys/vita/include/arpa/telnet.h new file mode 100644 index 0000000000..44ffe084dd --- /dev/null +++ b/newlib/libc/sys/vita/include/arpa/telnet.h @@ -0,0 +1,331 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)telnet.h 8.2 (Berkeley) 12/15/93 + * $FreeBSD: src/include/arpa/telnet.h,v 1.8 2001/12/03 12:41:18 markm Exp $ + */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#ifndef _ARPA_TELNET_H +#define _ARPA_TELNET_H + +/* Definitions for the TELNET protocol. */ +#define IAC 255 /* interpret as command: */ +#define DONT 254 /* you are not to use option */ +#define DO 253 /* please, you use option */ +#define WONT 252 /* I won't use option */ +#define WILL 251 /* I will use option */ +#define SB 250 /* interpret as subnegotiation */ +#define GA 249 /* you may reverse the line */ +#define EL 248 /* erase the current line */ +#define EC 247 /* erase the current character */ +#define AYT 246 /* are you there */ +#define AO 245 /* abort output--but let prog finish */ +#define IP 244 /* interrupt process--permanently */ +#define BREAK 243 /* break */ +#define DM 242 /* data mark--for connect. cleaning */ +#define NOP 241 /* nop */ +#define SE 240 /* end sub negotiation */ +#define EOR 239 /* end of record (transparent mode) */ +#define ABORT 238 /* Abort process */ +#define SUSP 237 /* Suspend process */ +#define xEOF 236 /* End of file: EOF is already used... */ + +#define SYNCH 242 /* for telfunc calls */ + +#ifdef TELCMDS +const char *telcmds[] = { + "EOF", "SUSP", "ABORT", "EOR", + "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC", + "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", + 0 +}; +#else +extern char *telcmds[]; +#endif + +#define TELCMD_FIRST xEOF +#define TELCMD_LAST IAC +#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && (unsigned int)(x) >= TELCMD_FIRST) +#define TELCMD(x) telcmds[(x)-TELCMD_FIRST] + +/* telnet options */ +#define TELOPT_BINARY 0 /* 8-bit data path */ +#define TELOPT_ECHO 1 /* echo */ +#define TELOPT_RCP 2 /* prepare to reconnect */ +#define TELOPT_SGA 3 /* suppress go ahead */ +#define TELOPT_NAMS 4 /* approximate message size */ +#define TELOPT_STATUS 5 /* give status */ +#define TELOPT_TM 6 /* timing mark */ +#define TELOPT_RCTE 7 /* remote controlled transmission and echo */ +#define TELOPT_NAOL 8 /* negotiate about output line width */ +#define TELOPT_NAOP 9 /* negotiate about output page size */ +#define TELOPT_NAOCRD 10 /* negotiate about CR disposition */ +#define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */ +#define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */ +#define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */ +#define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */ +#define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */ +#define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */ +#define TELOPT_XASCII 17 /* extended ascic character set */ +#define TELOPT_LOGOUT 18 /* force logout */ +#define TELOPT_BM 19 /* byte macro */ +#define TELOPT_DET 20 /* data entry terminal */ +#define TELOPT_SUPDUP 21 /* supdup protocol */ +#define TELOPT_SUPDUPOUTPUT 22 /* supdup output */ +#define TELOPT_SNDLOC 23 /* send location */ +#define TELOPT_TTYPE 24 /* terminal type */ +#define TELOPT_EOR 25 /* end or record */ +#define TELOPT_TUID 26 /* TACACS user identification */ +#define TELOPT_OUTMRK 27 /* output marking */ +#define TELOPT_TTYLOC 28 /* terminal location number */ +#define TELOPT_3270REGIME 29 /* 3270 regime */ +#define TELOPT_X3PAD 30 /* X.3 PAD */ +#define TELOPT_NAWS 31 /* window size */ +#define TELOPT_TSPEED 32 /* terminal speed */ +#define TELOPT_LFLOW 33 /* remote flow control */ +#define TELOPT_LINEMODE 34 /* Linemode option */ +#define TELOPT_XDISPLOC 35 /* X Display Location */ +#define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */ +#define TELOPT_AUTHENTICATION 37 /* Authenticate */ +#define TELOPT_ENCRYPT 38 /* Encryption option */ +#define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */ +#define TELOPT_EXOPL 255 /* extended-options-list */ + + +#define NTELOPTS (1+TELOPT_NEW_ENVIRON) +#ifdef TELOPTS +const char *telopts[NTELOPTS + 1] = { + "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME", + "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP", + "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS", + "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO", + "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT", + "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD", + "TACACS UID", "OUTPUT MARKING", "TTYLOC", + "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW", + "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION", + "ENCRYPT", "NEW-ENVIRON", + 0 +}; + +#define TELOPT_FIRST TELOPT_BINARY +#define TELOPT_LAST TELOPT_NEW_ENVIRON +#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST) +#define TELOPT(x) telopts[(x)-TELOPT_FIRST] +#endif + +/* Sub-option qualifiers */ +#define TELQUAL_IS 0 /* Option is... */ +#define TELQUAL_SEND 1 /* Send option */ +#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */ +#define TELQUAL_REPLY 2 /* AUTHENTICATION: client version of IS */ +#define TELQUAL_NAME 3 /* AUTHENTICATION: client version of IS */ + +#define LFLOW_OFF 0 /* Disable remote flow control */ +#define LFLOW_ON 1 /* Enable remote flow control */ +#define LFLOW_RESTART_ANY 2 /* Restart output on any char */ +#define LFLOW_RESTART_XON 3 /* Restart output only on XON */ + +/* LINEMODE suboptions */ +#define LM_MODE 1 +#define LM_FORWARDMASK 2 +#define LM_SLC 3 + +#define MODE_EDIT 0x01 +#define MODE_TRAPSIG 0x02 +#define MODE_ACK 0x04 +#define MODE_SOFT_TAB 0x08 +#define MODE_LIT_ECHO 0x10 +#define MODE_MASK 0x1f + +/* Not part of protocol, but needed to simplify things... */ +#define MODE_FLOW 0x0100 +#define MODE_ECHO 0x0200 +#define MODE_INBIN 0x0400 +#define MODE_OUTBIN 0x0800 +#define MODE_FORCE 0x1000 + +#define SLC_SYNCH 1 +#define SLC_BRK 2 +#define SLC_IP 3 +#define SLC_AO 4 +#define SLC_AYT 5 +#define SLC_EOR 6 +#define SLC_ABORT 7 +#define SLC_EOF 8 +#define SLC_SUSP 9 +#define SLC_EC 10 +#define SLC_EL 11 +#define SLC_EW 12 +#define SLC_RP 13 +#define SLC_LNEXT 14 +#define SLC_XON 15 +#define SLC_XOFF 16 +#define SLC_FORW1 17 +#define SLC_FORW2 18 +#define SLC_MCL 19 +#define SLC_MCR 20 +#define SLC_MCWL 21 +#define SLC_MCWR 22 +#define SLC_MCBOL 23 +#define SLC_MCEOL 24 +#define SLC_INSRT 25 +#define SLC_OVER 26 +#define SLC_ECR 27 +#define SLC_EWR 28 +#define SLC_EBOL 29 +#define SLC_EEOL 30 + +#define NSLC 30 + +/* + * For backwards compatibility, we define SLC_NAMES to be the + * list of names if SLC_NAMES is not defined. + */ +#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \ + "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \ + "LNEXT", "XON", "XOFF", "FORW1", "FORW2", \ + "MCL", "MCR", "MCWL", "MCWR", "MCBOL", \ + "MCEOL", "INSRT", "OVER", "ECR", "EWR", \ + "EBOL", "EEOL", \ + 0 + +#ifdef SLC_NAMES +const char *slc_names[] = { + SLC_NAMELIST +}; +#else +extern char *slc_names[]; +#define SLC_NAMES SLC_NAMELIST +#endif + +#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC) +#define SLC_NAME(x) slc_names[x] + +#define SLC_NOSUPPORT 0 +#define SLC_CANTCHANGE 1 +#define SLC_VARIABLE 2 +#define SLC_DEFAULT 3 +#define SLC_LEVELBITS 0x03 + +#define SLC_FUNC 0 +#define SLC_FLAGS 1 +#define SLC_VALUE 2 + +#define SLC_ACK 0x80 +#define SLC_FLUSHIN 0x40 +#define SLC_FLUSHOUT 0x20 + +#define OLD_ENV_VAR 1 +#define OLD_ENV_VALUE 0 +#define NEW_ENV_VAR 0 +#define NEW_ENV_VALUE 1 +#define ENV_ESC 2 +#define ENV_USERVAR 3 + +/* AUTHENTICATION suboptions */ + +/* Who is authenticating who ... */ +#define AUTH_WHO_CLIENT 0 /* Client authenticating server */ +#define AUTH_WHO_SERVER 1 /* Server authenticating client */ +#define AUTH_WHO_MASK 1 + +/* Amount of authentication done */ +#define AUTH_HOW_ONE_WAY 0 +#define AUTH_HOW_MUTUAL 2 +#define AUTH_HOW_MASK 2 + +#define AUTHTYPE_NULL 0 +#define AUTHTYPE_KERBEROS_V4 1 +#define AUTHTYPE_KERBEROS_V5 2 +#define AUTHTYPE_SPX 3 +#define AUTHTYPE_MINK 4 +#define AUTHTYPE_SRA 6 +#define AUTHTYPE_CNT 7 + +#define AUTHTYPE_TEST 99 + +#ifdef AUTH_NAMES +const char *authtype_names[] = { + "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", NULL, "SRA", + 0 +}; +#else +extern char *authtype_names[]; +#endif + +#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT) +#define AUTHTYPE_NAME(x) authtype_names[x] + +/* ENCRYPTion suboptions */ +#define ENCRYPT_IS 0 /* I pick encryption type ... */ +#define ENCRYPT_SUPPORT 1 /* I support encryption types ... */ +#define ENCRYPT_REPLY 2 /* Initial setup response */ +#define ENCRYPT_START 3 /* Am starting to send encrypted */ +#define ENCRYPT_END 4 /* Am ending encrypted */ +#define ENCRYPT_REQSTART 5 /* Request you start encrypting */ +#define ENCRYPT_REQEND 6 /* Request you end encrypting */ +#define ENCRYPT_ENC_KEYID 7 +#define ENCRYPT_DEC_KEYID 8 +#define ENCRYPT_CNT 9 + +#define ENCTYPE_ANY 0 +#define ENCTYPE_DES_CFB64 1 +#define ENCTYPE_DES_OFB64 2 +#define ENCTYPE_CNT 3 + +#ifdef ENCRYPT_NAMES +const char *encrypt_names[] = { + "IS", "SUPPORT", "REPLY", "START", "END", + "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID", + 0 +}; + +const char *enctype_names[] = { + "ANY", "DES_CFB64", "DES_OFB64", + 0 +}; +#else +extern char *encrypt_names[]; +extern char *enctype_names[]; +#endif + + +#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT) +#define ENCRYPT_NAME(x) encrypt_names[x] + +#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT) +#define ENCTYPE_NAME(x) enctype_names[x] + +#endif diff --git a/newlib/libc/sys/vita/include/netdb.h b/newlib/libc/sys/vita/include/netdb.h index e0435dca08..48ab16df76 100644 --- a/newlib/libc/sys/vita/include/netdb.h +++ b/newlib/libc/sys/vita/include/netdb.h @@ -29,6 +29,7 @@ #ifndef _NETDB_H_ #define _NETDB_H_ +#include #include #include diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index c02cd082ba..a597b4c74b 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -64,6 +64,40 @@ typedef struct sockaddr_in { #define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) // 127.0.0.1 #define INADDR_NONE ((in_addr_t) 0xffffffff) +#define IN_CLASSA(i) (((u_int32_t)(i) & 0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 + +#define IN_CLASSB(i) (((u_int32_t)(i) & 0xc0000000) == 0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(i) (((u_int32_t)(i) & 0xe0000000) == 0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0x000000ff + +#define IN_CLASSD(i) (((u_int32_t)(i) & 0xf0000000) == 0xe0000000) +#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ +#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ +#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define IN_EXPERIMENTAL(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) +#define IN_BADCLASS(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) + + +#define INADDR_UNSPEC_GROUP (u_int32_t)0xe0000000 /* 224.0.0.0 */ +#define INADDR_ALLHOSTS_GROUP (u_int32_t)0xe0000001 /* 224.0.0.1 */ +#define INADDR_ALLRTRS_GROUP (u_int32_t)0xe0000002 /* 224.0.0.2 */ +#define INADDR_MAX_LOCAL_GROUP (u_int32_t)0xe00000ff /* 224.0.0.255 */ + +#define IN_LOOPBACKNET 127 /* official! */ + #define ntohs __builtin_bswap16 #define htons __builtin_bswap16 #define ntohl __builtin_bswap32 diff --git a/newlib/libc/sys/vita/net/inet_addr.c b/newlib/libc/sys/vita/net/inet_addr.c new file mode 100644 index 0000000000..a95b6e21b0 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_addr.c @@ -0,0 +1,70 @@ +/* $KAME: inet_addr.c,v 1.5 2001/08/20 02:32:40 itojun Exp $ */ + +/* + * ++Copyright++ 1983, 1990, 1993 + * - + * Copyright (c) 1983, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include + +in_addr_t inet_addr(const char *cp) +{ + struct in_addr val; + + if (inet_aton(cp, &val)) + return val.s_addr; + + return INADDR_NONE; +} diff --git a/newlib/libc/sys/vita/net/inet_aton.c b/newlib/libc/sys/vita/net/inet_aton.c new file mode 100644 index 0000000000..9013bcac59 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_aton.c @@ -0,0 +1,167 @@ +/* $KAME: inet_addr.c,v 1.5 2001/08/20 02:32:40 itojun Exp $ */ + +/* + * ++Copyright++ 1983, 1990, 1993 + * - + * Copyright (c) 1983, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include +#include +#include +#include + +int inet_aton(const char *cp, struct in_addr *inp) +{ + u_long parts[4]; + in_addr_t val; + char *c; + char *endptr; + int gotend, n; + c = (char *)cp; + n = 0; + /* + * Run through the string, grabbing numbers until + * the end of the string, or some error + */ + gotend = 0; + + while (!gotend) { + errno = 0; + val = strtoul(c, &endptr, 0); + + if (errno == ERANGE) /* Fail completely if it overflowed. */ + return 0; + + /* + * If the whole string is invalid, endptr will equal + * c.. this way we can make sure someone hasn't + * gone '.12' or something which would get past + * the next check. + */ + if (endptr == c) + return 0; + + parts[n] = val; + c = endptr; + + /* Check the next character past the previous number's end */ + switch (*c) { + case '.': + + /* Make sure we only do 3 dots .. */ + if (n == 3) /* Whoops. Quit. */ + return 0; + + n++; + c++; + break; + + case '\0': + gotend = 1; + break; + + default: + if (isspace((unsigned char)*c)) { + gotend = 1; + break; + } + + else + return 0; /* Invalid character, so fail */ + } + } + + /* + * Concoct the address according to + * the number of parts specified. + */ + + switch (n) { + case 0: /* a -- 32 bits */ + /* + * Nothing is necessary here. Overflow checking was + * already done in strtoul(). + */ + break; + + case 1: /* a.b -- 8.24 bits */ + if (val > 0xffffff || parts[0] > 0xff) + return 0; + + val |= parts[0] << 24; + break; + + case 2: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffff || parts[0] > 0xff || parts[1] > 0xff) + return 0; + + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 3: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xff || parts[0] > 0xff || parts[1] > 0xff || + parts[2] > 0xff) + return 0; + + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + } + + if (inp != NULL) + inp->s_addr = htonl(val); + + return 1; +} diff --git a/newlib/libc/sys/vita/net/inet_lnaof.c b/newlib/libc/sys/vita/net/inet_lnaof.c new file mode 100644 index 0000000000..6bd727d724 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_lnaof.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include + +in_addr_t inet_lnaof(struct in_addr in) +{ + register u_int32_t i = ntohl(in.s_addr); + + if (IN_CLASSA(i)) + return (i) & IN_CLASSA_HOST; + else if (IN_CLASSB(i)) + return (i) & IN_CLASSB_HOST; + else + return (i) & IN_CLASSC_HOST; +} diff --git a/newlib/libc/sys/vita/net/inet_makeaddr.c b/newlib/libc/sys/vita/net/inet_makeaddr.c new file mode 100644 index 0000000000..c8fce17fd2 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_makeaddr.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include + +struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host) +{ + struct in_addr in; + + if (net < 128) + in.s_addr = (net << IN_CLASSA_NSHIFT) | (host & IN_CLASSA_HOST); + else if (net < 65536) + in.s_addr = (net << IN_CLASSB_NSHIFT) | (host & IN_CLASSB_HOST); + else if (net < 16777216L) + in.s_addr = (net << IN_CLASSC_NSHIFT) | (host & IN_CLASSC_HOST); + else + in.s_addr = net | host; + + in.s_addr = htonl(in.s_addr); + return in; +} diff --git a/newlib/libc/sys/vita/net/inet_net_ntop.c b/newlib/libc/sys/vita/net/inet_net_ntop.c new file mode 100644 index 0000000000..7b25143a39 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_net_ntop.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* Author: Paul Vixie (ISC), July 1996 */ +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include +#include +#include +#include + +#ifdef SPRINTF_CHAR +# define SPRINTF(x) strlen(sprintf/**/x) +#else +# define SPRINTF(x) ((size_t)sprintf x) +#endif + +static char *inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size) +{ + char *odst = dst; + char *t; + u_int m; + int b; + + if (bits < 0 || bits > 32) { + errno = EINVAL; + return (NULL); + } + + if (bits == 0) { + if (size < sizeof "0") + goto emsgsize; + + *dst++ = '0'; + *dst = '\0'; + } + + /* Format whole octets. */ + for (b = bits / 8; b > 0; b--) { + if (size < sizeof "255.") + goto emsgsize; + + t = dst; + dst += SPRINTF((dst, "%u", *src++)); + + if (b > 1) { + *dst++ = '.'; + *dst = '\0'; + } + + size -= (size_t)(dst - t); + } + + /* Format partial octet. */ + b = bits % 8; + + if (b > 0) { + if (size < sizeof ".255") + goto emsgsize; + + t = dst; + + if (dst != odst) + *dst++ = '.'; + + m = ((1 << b) - 1) << (8 - b); + dst += SPRINTF((dst, "%u", *src & m)); + size -= (size_t)(dst - t); + } + + /* Format CIDR /width. */ + if (size < sizeof "/32") + goto emsgsize; + + dst += SPRINTF((dst, "/%u", bits)); + return (odst); +emsgsize: + errno = EMSGSIZE; + return (NULL); +} + +char *inet_net_ntop(int af, const void *netp, int bits, char *pres, size_t psize) +{ + switch (af) { + case AF_INET: + return inet_net_ntop_ipv4(netp, bits, pres, psize); + + default: + errno = EAFNOSUPPORT; + return NULL; + } +} diff --git a/newlib/libc/sys/vita/net/inet_net_pton.c b/newlib/libc/sys/vita/net/inet_net_pton.c new file mode 100644 index 0000000000..071ada98f2 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_net_pton.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* Author: Paul Vixie (ISC), June 1996 */ +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static int inet_net_pton_ipv4(const char *src, u_char *dst, size_t size) +{ + static const char xdigits[] = "0123456789abcdef"; + static const char digits[] = "0123456789"; + int n, ch, tmp, dirty, bits; + const u_char *odst = dst; + ch = *src++; + + if (ch == '0' && (src[0] == 'x' || src[0] == 'X') && isascii(src[1]) && isxdigit(src[1])) { + /* Hexadecimal: Eat nybble string. */ + if (size <= 0) + goto emsgsize; + + *dst = 0, dirty = 0; + src++; /* skip x or X. */ + + while ((ch = *src++) != '\0' && + isascii(ch) && isxdigit(ch)) { + if (isupper(ch)) + ch = tolower(ch); + + n = strchr(xdigits, ch) - xdigits; + assert(n >= 0 && n <= 15); + *dst |= n; + + if (!dirty++) + *dst <<= 4; + + else + if (size-- > 0) + *++dst = 0, dirty = 0; + + else + goto emsgsize; + } + + if (dirty) + size--; + } + else { + if (isascii(ch) && isdigit(ch)) { + /* Decimal: eat dotted digit string. */ + for (;;) { + tmp = 0; + + do { + n = strchr(digits, ch) - digits; + assert(n >= 0 && n <= 9); + tmp *= 10; + tmp += n; + + if (tmp > 255) + goto enoent; + } + while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); + + if (size-- <= 0) + goto emsgsize; + + *dst++ = (u_char) tmp; + + if (ch == '\0' || ch == '/') + break; + + if (ch != '.') + goto enoent; + + ch = *src++; + + if (!isascii(ch) || !isdigit(ch)) + goto enoent; + } + } + else + goto enoent; + } + + bits = -1; + + if (ch == '/' && isascii(src[0]) && isdigit(src[0]) && dst > odst) { + /* CIDR width specifier. Nothing can follow it. */ + ch = *src++; /* Skip over the /. */ + bits = 0; + + do { + n = strchr(digits, ch) - digits; + assert(n >= 0 && n <= 9); + bits *= 10; + bits += n; + } + while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); + + if (ch != '\0') + goto enoent; + + if (bits > 32) + goto emsgsize; + } + + /* Firey death and destruction unless we prefetched EOS. */ + if (ch != '\0') + goto enoent; + + /* If nothing was written to the destination, we found no address. */ + if (dst == odst) + goto enoent; + + /* If no CIDR spec was given, infer width from net class. */ + if (bits == -1) { + if (*odst >= 240) /* Class E */ + bits = 32; + + else + if (*odst >= 224) /* Class D */ + bits = 4; + + else + if (*odst >= 192) /* Class C */ + bits = 24; + + else + if (*odst >= 128) /* Class B */ + bits = 16; + + else /* Class A */ + bits = 8; + + /* If imputed mask is narrower than specified octets, widen. */ + if (bits >= 8 && bits < ((dst - odst) * 8)) + bits = (dst - odst) * 8; + } + + /* Extend network to cover the actual mask. */ + while (bits > ((dst - odst) * 8)) { + if (size-- <= 0) + goto emsgsize; + + *dst++ = '\0'; + } + + return (bits); +enoent: + errno = ENOENT; + return -1; + +emsgsize: + errno = EMSGSIZE; + return -1; +} + +int inet_net_pton(int af, const char *pres, void *netp, size_t nsize) +{ + switch (af) { + case AF_INET: + return inet_net_pton_ipv4(pres, netp, nsize); + + default: + errno = EAFNOSUPPORT; + return -1; + } +} diff --git a/newlib/libc/sys/vita/net/inet_netof.c b/newlib/libc/sys/vita/net/inet_netof.c new file mode 100644 index 0000000000..9495207411 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_netof.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include + +in_addr_t inet_netof(struct in_addr in) +{ + register u_int32_t i = ntohl(in.s_addr); + + if (IN_CLASSA(i)) + return ((i) & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT; + else if (IN_CLASSB(i)) + return ((i) & IN_CLASSB_NET) >> IN_CLASSB_NSHIFT; + else + return ((i) & IN_CLASSC_NET) >> IN_CLASSC_NSHIFT; +} diff --git a/newlib/libc/sys/vita/net/inet_network.c b/newlib/libc/sys/vita/net/inet_network.c new file mode 100644 index 0000000000..831b8ee44b --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_network.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include +#include +#include + +in_addr_t inet_network(const char *cp) +{ + register u_int32_t val, base, n, i; + register char c; + u_int32_t parts[4], *pp = parts; + int digit; + +again: + val = 0; + base = 10; + digit = 0; + + if (*cp == '0') + digit = 1, base = 8, cp++; + + if (*cp == 'x' || *cp == 'X') + base = 16, cp++; + + while ((c = *cp) != 0) { + if (isdigit(c)) { + if (base == 8 && (c == '8' || c == '9')) + return INADDR_NONE; + + val = (val * base) + (c - '0'); + cp++; + digit = 1; + continue; + } + + if (base == 16 && isxdigit(c)) { + val = (val << 4) + (tolower (c) + 10 - 'a'); + cp++; + digit = 1; + continue; + } + + break; + } + + if (!digit) + return INADDR_NONE; + + if (pp >= parts + 4 || val > 0xff) + return INADDR_NONE; + + if (*cp == '.') { + *pp++ = val, cp++; + goto again; + } + + if (*cp && !isspace(*cp)) + return INADDR_NONE; + + if (pp >= parts + 4 || val > 0xff) + return INADDR_NONE; + + *pp++ = val; + n = pp - parts; + + for (val = 0, i = 0; i < n; i++) { + val <<= 8; + val |= parts[i] & 0xff; + } + + return val; +} diff --git a/newlib/libc/sys/vita/net/inet_ntoa.c b/newlib/libc/sys/vita/net/inet_ntoa.c new file mode 100644 index 0000000000..211049c96f --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_ntoa.c @@ -0,0 +1,35 @@ +/* Copyright (c) 2016 Phoenix Systems + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE.*/ + +#include +#include + +static char static_buffer[18]; + +char *inet_ntoa(struct in_addr in) +{ + unsigned char *bytes = (unsigned char *) ∈ + snprintf(static_buffer, sizeof(static_buffer), "%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]); + return static_buffer; +} diff --git a/newlib/libc/sys/vita/net/inet_ntop.c b/newlib/libc/sys/vita/net/inet_ntop.c new file mode 100644 index 0000000000..5ad0711cff --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_ntop.c @@ -0,0 +1,171 @@ +/* Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* Author: Paul Vixie, 1996 */ +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define SPRINTF(x) ((socklen_t) sprintf x) + +/* + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static const char *inet_ntop4(const u_char *src, char *dst, socklen_t size) +{ + static const char fmt[] = "%u.%u.%u.%u"; + char tmp[sizeof "255.255.255.255"]; + + if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) { + errno = ENOSPC; + return NULL; + } + + strcpy(dst, tmp); + return dst; +} + +static const char *inet_ntop6(const u_char *src, char *dst, socklen_t size) +{ + /* + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. + */ + char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")], *tp; + struct { + int base, len; + } best, cur; + u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; + int i; + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + memset(words, '\0', sizeof words); + + for (i = 0; i < NS_IN6ADDRSZ; i++) + words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + + best.base = -1; + cur.base = -1; + + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + if (words[i] == 0) { + if (cur.base == -1) + cur.base = i, cur.len = 1; + + else + cur.len++; + } + + else { + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + + cur.base = -1; + } + } + } + + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + } + + if (best.base != -1 && best.len < 2) + best.base = -1; + + /* + * Format the result. + */ + tp = tmp; + + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + /* Are we inside the best run of 0x00's? */ + if (best.base != -1 && i >= best.base && + i < (best.base + best.len)) { + if (i == best.base) + *tp++ = ':'; + + continue; + } + + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) + *tp++ = ':'; + + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && + (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { + if (!inet_ntop4(src + 12, tp, sizeof tmp - (tp - tmp))) + return NULL; + + tp += strlen(tp); + break; + } + + tp += SPRINTF((tp, "%x", words[i])); + } + + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == + (NS_IN6ADDRSZ / NS_INT16SZ)) + *tp++ = ':'; + + *tp++ = '\0'; + + /* + * Check for overflow, copy, and we're done. + */ + if ((socklen_t)(tp - tmp) > size) { + errno = ENOSPC; + return NULL; + } + + strcpy(dst, tmp); + return dst; +} + +const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) +{ + switch (af) { + case AF_INET: + return inet_ntop4(src, dst, size); + + case AF_INET6: + return inet_ntop6(src, dst, size); + + default: + errno = EAFNOSUPPORT; + return NULL; + } + + /* NOTREACHED */ +} diff --git a/newlib/libc/sys/vita/net/inet_pton.c b/newlib/libc/sys/vita/net/inet_pton.c new file mode 100644 index 0000000000..3b3296abd4 --- /dev/null +++ b/newlib/libc/sys/vita/net/inet_pton.c @@ -0,0 +1,198 @@ +/* $KAME: inet_pton.c,v 1.5 2001/08/20 02:32:40 itojun Exp $ */ + +/* Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* Author: Paul Vixie, 1996 */ +/* Copied from Linux, modified for Phoenix-RTOS. */ + +#include +#include +#include +#include +#include +#include + +/* + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static int inet_pton4(const char *src, u_char *dst) +{ + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + u_char tmp[NS_INADDRSZ], *tp; + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + u_int new = *tp * 10 + (pch - digits); + + if (new > 255) + return 0; + + *tp = new; + + if (! saw_digit) { + if (++octets > 4) + return 0; + + saw_digit = 1; + } + } + + else + if (ch == '.' && saw_digit) { + if (octets == 4) + return 0; + + *++tp = 0; + saw_digit = 0; + } + + else + return 0; + } + + if (octets < 4) + return 0; + + memcpy(dst, tmp, NS_INADDRSZ); + return 1; +} + +static int inet_pton6(const char *src, u_char *dst) +{ + static const char xdigits_l[] = "0123456789abcdef"; + static const char xdigits_u[] = "0123456789ABCDEF"; + u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; + const char *xdigits, *curtok; + int ch, saw_xdigit; + u_int val; + + memset((tp = tmp), '\0', NS_IN6ADDRSZ); + endp = tp + NS_IN6ADDRSZ; + colonp = NULL; + + /* Leading :: requires some special handling. */ + if (*src == ':') + if (*++src != ':') + return 0; + + curtok = src; + saw_xdigit = 0; + val = 0; + + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) + pch = strchr((xdigits = xdigits_u), ch); + + if (pch != NULL) { + val <<= 4; + val |= (pch - xdigits); + + if (val > 0xffff) + return 0; + + saw_xdigit = 1; + continue; + } + + if (ch == ':') { + curtok = src; + + if (!saw_xdigit) { + if (colonp) + return 0; + + colonp = tp; + continue; + } + + if (tp + NS_INT16SZ > endp) + return 0; + + *tp++ = (u_char) (val >> 8) & 0xff; + *tp++ = (u_char) val & 0xff; + saw_xdigit = 0; + val = 0; + continue; + } + + if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && + inet_pton4(curtok, tp) > 0) { + tp += NS_INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ + } + + return 0; + } + + if (saw_xdigit) { + if (tp + NS_INT16SZ > endp) + return 0; + + *tp++ = (u_char) (val >> 8) & 0xff; + *tp++ = (u_char) val & 0xff; + } + + if (colonp != NULL) { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + int i; + + for (i = 1; i <= n; i++) { + endp[- i] = colonp[n - i]; + colonp[n - i] = 0; + } + + tp = endp; + } + + if (tp != endp) + return 0; + + memcpy(dst, tmp, NS_IN6ADDRSZ); + return 1; +} + +int inet_pton(int af, const char *src, void *dst) +{ + switch (af) { + case AF_INET: + return inet_pton4(src, dst); + + case AF_INET6: + return inet_pton6(src, dst); + + default: + errno = EAFNOSUPPORT; + return -1; + } + + /* NOTREACHED */ +} From 38c8d3aaea5af6c7e24dc72088bbe88798d45fe0 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 11 Aug 2019 01:58:19 +0900 Subject: [PATCH 78/86] Fix type error in inet functions --- newlib/libc/sys/vita/include/netinet/in.h | 20 ++++++++++---------- newlib/libc/sys/vita/net/inet_lnaof.c | 2 +- newlib/libc/sys/vita/net/inet_netof.c | 2 +- newlib/libc/sys/vita/net/inet_network.c | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index a597b4c74b..be944742b7 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -64,37 +64,37 @@ typedef struct sockaddr_in { #define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) // 127.0.0.1 #define INADDR_NONE ((in_addr_t) 0xffffffff) -#define IN_CLASSA(i) (((u_int32_t)(i) & 0x80000000) == 0) +#define IN_CLASSA(i) (((uint32_t)(i) & 0x80000000) == 0) #define IN_CLASSA_NET 0xff000000 #define IN_CLASSA_NSHIFT 24 #define IN_CLASSA_HOST 0x00ffffff #define IN_CLASSA_MAX 128 -#define IN_CLASSB(i) (((u_int32_t)(i) & 0xc0000000) == 0x80000000) +#define IN_CLASSB(i) (((uint32_t)(i) & 0xc0000000) == 0x80000000) #define IN_CLASSB_NET 0xffff0000 #define IN_CLASSB_NSHIFT 16 #define IN_CLASSB_HOST 0x0000ffff #define IN_CLASSB_MAX 65536 -#define IN_CLASSC(i) (((u_int32_t)(i) & 0xe0000000) == 0xc0000000) +#define IN_CLASSC(i) (((uint32_t)(i) & 0xe0000000) == 0xc0000000) #define IN_CLASSC_NET 0xffffff00 #define IN_CLASSC_NSHIFT 8 #define IN_CLASSC_HOST 0x000000ff -#define IN_CLASSD(i) (((u_int32_t)(i) & 0xf0000000) == 0xe0000000) +#define IN_CLASSD(i) (((uint32_t)(i) & 0xf0000000) == 0xe0000000) #define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ #define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ #define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ #define IN_MULTICAST(i) IN_CLASSD(i) -#define IN_EXPERIMENTAL(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) -#define IN_BADCLASS(i) (((u_int32_t)(i) & 0xf0000000) == 0xf0000000) +#define IN_EXPERIMENTAL(i) (((uint32_t)(i) & 0xf0000000) == 0xf0000000) +#define IN_BADCLASS(i) (((uint32_t)(i) & 0xf0000000) == 0xf0000000) -#define INADDR_UNSPEC_GROUP (u_int32_t)0xe0000000 /* 224.0.0.0 */ -#define INADDR_ALLHOSTS_GROUP (u_int32_t)0xe0000001 /* 224.0.0.1 */ -#define INADDR_ALLRTRS_GROUP (u_int32_t)0xe0000002 /* 224.0.0.2 */ -#define INADDR_MAX_LOCAL_GROUP (u_int32_t)0xe00000ff /* 224.0.0.255 */ +#define INADDR_UNSPEC_GROUP (uint32_t)0xe0000000 /* 224.0.0.0 */ +#define INADDR_ALLHOSTS_GROUP (uint32_t)0xe0000001 /* 224.0.0.1 */ +#define INADDR_ALLRTRS_GROUP (uint32_t)0xe0000002 /* 224.0.0.2 */ +#define INADDR_MAX_LOCAL_GROUP (uint32_t)0xe00000ff /* 224.0.0.255 */ #define IN_LOOPBACKNET 127 /* official! */ diff --git a/newlib/libc/sys/vita/net/inet_lnaof.c b/newlib/libc/sys/vita/net/inet_lnaof.c index 6bd727d724..74d2ed4710 100644 --- a/newlib/libc/sys/vita/net/inet_lnaof.c +++ b/newlib/libc/sys/vita/net/inet_lnaof.c @@ -34,7 +34,7 @@ in_addr_t inet_lnaof(struct in_addr in) { - register u_int32_t i = ntohl(in.s_addr); + register uint32_t i = ntohl(in.s_addr); if (IN_CLASSA(i)) return (i) & IN_CLASSA_HOST; diff --git a/newlib/libc/sys/vita/net/inet_netof.c b/newlib/libc/sys/vita/net/inet_netof.c index 9495207411..e07aa40dc2 100644 --- a/newlib/libc/sys/vita/net/inet_netof.c +++ b/newlib/libc/sys/vita/net/inet_netof.c @@ -34,7 +34,7 @@ in_addr_t inet_netof(struct in_addr in) { - register u_int32_t i = ntohl(in.s_addr); + register uint32_t i = ntohl(in.s_addr); if (IN_CLASSA(i)) return ((i) & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT; diff --git a/newlib/libc/sys/vita/net/inet_network.c b/newlib/libc/sys/vita/net/inet_network.c index 831b8ee44b..1feee31fb4 100644 --- a/newlib/libc/sys/vita/net/inet_network.c +++ b/newlib/libc/sys/vita/net/inet_network.c @@ -36,9 +36,9 @@ in_addr_t inet_network(const char *cp) { - register u_int32_t val, base, n, i; + register uint32_t val, base, n, i; register char c; - u_int32_t parts[4], *pp = parts; + uint32_t parts[4], *pp = parts; int digit; again: From a583e87396415f64f54cc3faf587246afa4e9967 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 11 Aug 2019 04:22:09 +0900 Subject: [PATCH 79/86] Fill h_name value on gethostbyname --- newlib/libc/sys/vita/net/gethostbyname.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/newlib/libc/sys/vita/net/gethostbyname.c b/newlib/libc/sys/vita/net/gethostbyname.c index e3116dc44f..8a435b0b47 100644 --- a/newlib/libc/sys/vita/net/gethostbyname.c +++ b/newlib/libc/sys/vita/net/gethostbyname.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -25,6 +26,8 @@ struct hostent *gethostbyname(const char *name) { return NULL; } + strncpy(sname, name, MAX_NAME - 1); + ent.h_name = sname; ent.h_aliases = 0; ent.h_addrtype = SCE_NET_AF_INET; From 2d2d3bd61e24267729fe060e69575ba7d19a1c6a Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 11 Aug 2019 06:13:31 +0900 Subject: [PATCH 80/86] Use sce functions for inet_ntop and inet_pton --- newlib/libc/sys/vita/net/inet_ntop.c | 20 +--------- newlib/libc/sys/vita/net/inet_pton.c | 56 ++-------------------------- 2 files changed, 5 insertions(+), 71 deletions(-) diff --git a/newlib/libc/sys/vita/net/inet_ntop.c b/newlib/libc/sys/vita/net/inet_ntop.c index 5ad0711cff..d45a91f1b5 100644 --- a/newlib/libc/sys/vita/net/inet_ntop.c +++ b/newlib/libc/sys/vita/net/inet_ntop.c @@ -25,27 +25,11 @@ #include #include #include +#include #define SPRINTF(x) ((socklen_t) sprintf x) -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -static const char *inet_ntop4(const u_char *src, char *dst, socklen_t size) -{ - static const char fmt[] = "%u.%u.%u.%u"; - char tmp[sizeof "255.255.255.255"]; - - if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) { - errno = ENOSPC; - return NULL; - } - - strcpy(dst, tmp); - return dst; -} +#define inet_ntop4(src, dst, size) sceNetInetNtop(AF_INET, src, dst, size) static const char *inet_ntop6(const u_char *src, char *dst, socklen_t size) { diff --git a/newlib/libc/sys/vita/net/inet_pton.c b/newlib/libc/sys/vita/net/inet_pton.c index 3b3296abd4..f092e0ba1c 100644 --- a/newlib/libc/sys/vita/net/inet_pton.c +++ b/newlib/libc/sys/vita/net/inet_pton.c @@ -15,7 +15,7 @@ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ - + /* Author: Paul Vixie, 1996 */ /* Copied from Linux, modified for Phoenix-RTOS. */ @@ -25,59 +25,9 @@ #include #include #include +#include -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -static int inet_pton4(const char *src, u_char *dst) -{ - static const char digits[] = "0123456789"; - int saw_digit, octets, ch; - u_char tmp[NS_INADDRSZ], *tp; - saw_digit = 0; - octets = 0; - *(tp = tmp) = 0; - - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr(digits, ch)) != NULL) { - u_int new = *tp * 10 + (pch - digits); - - if (new > 255) - return 0; - - *tp = new; - - if (! saw_digit) { - if (++octets > 4) - return 0; - - saw_digit = 1; - } - } - - else - if (ch == '.' && saw_digit) { - if (octets == 4) - return 0; - - *++tp = 0; - saw_digit = 0; - } - - else - return 0; - } - - if (octets < 4) - return 0; - - memcpy(dst, tmp, NS_INADDRSZ); - return 1; -} +#define inet_pton4(src, dst) sceNetInetPton(AF_INET, src, dst) static int inet_pton6(const char *src, u_char *dst) { From 0c035e4a163af356160cc35a7c5d7209b7a0930a Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 11 Aug 2019 12:35:13 +0900 Subject: [PATCH 81/86] Add NI_* defines for some libraries like openssl --- newlib/libc/sys/vita/include/netdb.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/newlib/libc/sys/vita/include/netdb.h b/newlib/libc/sys/vita/include/netdb.h index 48ab16df76..000ce347fe 100644 --- a/newlib/libc/sys/vita/include/netdb.h +++ b/newlib/libc/sys/vita/include/netdb.h @@ -99,6 +99,18 @@ struct addrinfo { #define AI_ADDRCONFIG 0x00000400 /* Only if any address is assigned */ #define AI_V4MAPPED 0x00000800 /* Accept IPv4-mapped IPv6 address */ +/* Constants for getnameinfo() */ +#define NI_MAXHOST 1025 +#define NI_MAXSERV 32 + +/* Flag values for getnameinfo() */ +#define NI_NOFQDN 0x00000001 +#define NI_NUMERICHOST 0x00000002 +#define NI_NAMEREQD 0x00000004 +#define NI_NUMERICSERV 0x00000008 +#define NI_DGRAM 0x00000010 +#define NI_WITHSCOPEID 0x00000020 + struct hostent *gethostbyname(const char *name); struct servent *getservbyname(const char *name, const char *proto); int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); From 26929d8d50b313b63a973a86a3501ce7973bac94 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Wed, 14 Aug 2019 02:02:33 +0900 Subject: [PATCH 82/86] Add sockaddr_storage --- newlib/libc/sys/vita/sys/socket.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/newlib/libc/sys/vita/sys/socket.h b/newlib/libc/sys/vita/sys/socket.h index 1c31ad5e68..116aa441ae 100644 --- a/newlib/libc/sys/vita/sys/socket.h +++ b/newlib/libc/sys/vita/sys/socket.h @@ -169,6 +169,19 @@ struct sockaddr { char sa_data[14]; /* actually longer; address value */ }; +#define _SS_MAXSIZE 128U +#define _SS_ALIGNSIZE (sizeof(int64_t)) +#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(uint8_t) - sizeof(sa_family_t)) +#define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(uint8_t) - sizeof(sa_family_t) - _SS_PAD1SIZE - _SS_ALIGNSIZE) + +struct sockaddr_storage { + uint8_t ss_len; + sa_family_t ss_family; + char __ss_pad1[_SS_PAD1SIZE]; + int64_t __ss_align; + char __ss_pad2[_SS_PAD2SIZE]; +}; + /* * Protocol families, same as address families for now. */ From be08016b3790797431cda81f36eb3b05979061ca Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Wed, 14 Aug 2019 02:36:09 +0900 Subject: [PATCH 83/86] Add sockaddr_in6 --- newlib/libc/sys/vita/include/netinet/in.h | 26 +++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index be944742b7..3f35e03fa3 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -42,9 +42,9 @@ typedef uint32_t in_addr_t; typedef uint16_t in_port_t; -typedef struct in_addr { +struct in_addr { in_addr_t s_addr; -} in_addr; +}; typedef struct sockaddr_in { uint8_t sin_len; @@ -55,6 +55,28 @@ typedef struct sockaddr_in { char sin_zero[6]; } sockaddr_in; +struct in6_addr { + union { + uint8_t __s6_addr[16]; + uint16_t __s6_addr16[8]; + uint32_t __s6_addr32[4]; + } __in6_union; +}; + +#define s6_addr __in6_union.__s6_addr +#define s6_addr16 __in6_union.__s6_addr16 +#define s6_addr32 __in6_union.__s6_addr32 + +struct sockaddr_in6 { + uint8_t sin6_len; + sa_family_t sin6_family; + in_port_t sin6_port; + uint32_t sin6_flowinfo; + struct in6_addr sin6_addr; + in_port_t sin6_vport; + uint32_t sin6_scope_id; +}; + /* Address to accept any incoming messages. */ #define INADDR_ANY ((in_addr_t) 0x00000000) From 81abbf984a9952d5f1b7a58963583f5366fa626c Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Wed, 14 Aug 2019 02:57:54 +0900 Subject: [PATCH 84/86] Initial add netinet/tcp.h --- newlib/libc/sys/vita/include/netinet/tcp.h | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 newlib/libc/sys/vita/include/netinet/tcp.h diff --git a/newlib/libc/sys/vita/include/netinet/tcp.h b/newlib/libc/sys/vita/include/netinet/tcp.h new file mode 100644 index 0000000000..424eac0db2 --- /dev/null +++ b/newlib/libc/sys/vita/include/netinet/tcp.h @@ -0,0 +1,9 @@ +#ifndef _NETINET_TCP_H +#define _NETINET_TCP_H + +#include + +#define TCP_NODELAY SCE_NET_TCP_NODELAY +#define TCP_MAXSEG SCE_NET_TCP_MAXSEG + +#endif From 53e619246fd31f1a757656722cce8cd75e0d6f3e Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 6 Oct 2019 16:03:10 +0900 Subject: [PATCH 85/86] Add some more ip socket defines into `netinet/in.h` --- newlib/libc/sys/vita/include/netinet/in.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/newlib/libc/sys/vita/include/netinet/in.h b/newlib/libc/sys/vita/include/netinet/in.h index 3f35e03fa3..d57af23e59 100644 --- a/newlib/libc/sys/vita/include/netinet/in.h +++ b/newlib/libc/sys/vita/include/netinet/in.h @@ -125,4 +125,21 @@ struct sockaddr_in6 { #define ntohl __builtin_bswap32 #define htonl __builtin_bswap32 + +#define IP_HDRINCL SCE_NET_IP_HDRINCL +#define IP_TOS SCE_NET_IP_TOS +#define IP_TTL SCE_NET_IP_TTL +#define IP_MULTICAST_IF SCE_NET_IP_MULTICAST_IF +#define IP_MULTICAST_TTL SCE_NET_IP_MULTICAST_TTL +#define IP_MULTICAST_LOOP SCE_NET_IP_MULTICAST_LOOP +#define IP_ADD_MEMBERSHIP SCE_NET_IP_ADD_MEMBERSHIP +#define IP_DROP_MEMBERSHIP SCE_NET_IP_DROP_MEMBERSHIP + +/* + * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. + */ +struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +}; #endif From abff0b343961fbabfbbe9331adf81cba73e191c3 Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sat, 5 Oct 2019 05:47:51 +0900 Subject: [PATCH 86/86] Initial implement mmap/munmap functions copy & modified from mucl https://github.com/DaveeFTW/musl/blob/vita/src/internal/vita/mmap.c --- newlib/libc/sys/vita/Makefile.am | 2 +- newlib/libc/sys/vita/Makefile.in | 13 +++-- newlib/libc/sys/vita/mmap.c | 83 ++++++++++++++++++++++++++++++++ newlib/libc/sys/vita/sys/mman.h | 70 +++++++++++++++++++++++++++ 4 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 newlib/libc/sys/vita/mmap.c create mode 100644 newlib/libc/sys/vita/sys/mman.h diff --git a/newlib/libc/sys/vita/Makefile.am b/newlib/libc/sys/vita/Makefile.am index 4b3da34c7a..236dfaeab5 100755 --- a/newlib/libc/sys/vita/Makefile.am +++ b/newlib/libc/sys/vita/Makefile.am @@ -13,7 +13,7 @@ NET_OBJS = gethostbyname.o getaddrinfo.o freeaddrinfo.o getservbyname.o inet_nto DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c net/inet_ntop.c net/inet_ntoa.c net/inet_netof.c net/inet_pton.c net/inet_lnaof.c net/inet_addr.c net/inet_network.c net/inet_net_ntop.c net/inet_aton.c net/inet_net_pton.c net/inet_makeaddr.c -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} +lib_a_SOURCES = syscalls.c sbrk.c threading.c mmap.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} lib_a_LIBADD = ${SOCKET_OBJS} ${NET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) diff --git a/newlib/libc/sys/vita/Makefile.in b/newlib/libc/sys/vita/Makefile.in index 758bdc654c..a4127bb858 100644 --- a/newlib/libc/sys/vita/Makefile.in +++ b/newlib/libc/sys/vita/Makefile.in @@ -78,8 +78,9 @@ am__objects_1 = lib_a-gethostbyname.$(OBJEXT) \ lib_a-inet_net_ntop.$(OBJEXT) lib_a-inet_aton.$(OBJEXT) \ lib_a-inet_net_pton.$(OBJEXT) lib_a-inet_makeaddr.$(OBJEXT) am_lib_a_OBJECTS = lib_a-syscalls.$(OBJEXT) lib_a-sbrk.$(OBJEXT) \ - lib_a-threading.$(OBJEXT) lib_a-mlock.$(OBJEXT) \ - lib_a-io.$(OBJEXT) lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) \ + lib_a-threading.$(OBJEXT) lib_a-mmap.$(OBJEXT) \ + lib_a-mlock.$(OBJEXT) lib_a-io.$(OBJEXT) \ + lib_a-socket.$(OBJEXT) lib_a-dup.$(OBJEXT) \ lib_a-select.$(OBJEXT) lib_a-error.$(OBJEXT) \ lib_a-dirent.$(OBJEXT) lib_a-lcltime_r.$(OBJEXT) \ $(am__objects_1) @@ -210,7 +211,7 @@ SOCKET_OBJS = accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o NET_OBJS = gethostbyname.o getaddrinfo.o freeaddrinfo.o getservbyname.o inet_ntop.o inet_ntoa.o inet_netof.o inet_pton.o inet_lnaof.o inet_addr.o inet_network.o inet_net_ntop.o inet_aton.o inet_net_pton.o inet_makeaddr.o DIRENT_OBJS = closedir.o opendir.o readdir.o readdir_r.o rewinddir.o seekdir.o telldir.o NET_SOURCES = net/gethostbyname.c net/getaddrinfo.c net/freeaddrinfo.c net/getservbyname.c net/inet_ntop.c net/inet_ntoa.c net/inet_netof.c net/inet_pton.c net/inet_lnaof.c net/inet_addr.c net/inet_network.c net/inet_net_ntop.c net/inet_aton.c net/inet_net_pton.c net/inet_makeaddr.c -lib_a_SOURCES = syscalls.c sbrk.c threading.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} +lib_a_SOURCES = syscalls.c sbrk.c threading.c mmap.c mlock.c io.c socket.c dup.c select.c error.c dirent.c lcltime_r.c ${NET_SOURCES} lib_a_LIBADD = ${SOCKET_OBJS} ${NET_OBJS} ${DIRENT_OBJS} lib_a_CCASFLAGS = $(AM_CCASFLAGS) lib_a_CFLAGS = $(AM_CFLAGS) @@ -292,6 +293,12 @@ lib_a-threading.o: threading.c lib_a-threading.obj: threading.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-threading.obj `if test -f 'threading.c'; then $(CYGPATH_W) 'threading.c'; else $(CYGPATH_W) '$(srcdir)/threading.c'; fi` +lib_a-mmap.o: mmap.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mmap.o `test -f 'mmap.c' || echo '$(srcdir)/'`mmap.c + +lib_a-mmap.obj: mmap.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mmap.obj `if test -f 'mmap.c'; then $(CYGPATH_W) 'mmap.c'; else $(CYGPATH_W) '$(srcdir)/mmap.c'; fi` + lib_a-mlock.o: mlock.c $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mlock.o `test -f 'mlock.c' || echo '$(srcdir)/'`mlock.c diff --git a/newlib/libc/sys/vita/mmap.c b/newlib/libc/sys/vita/mmap.c new file mode 100644 index 0000000000..58d25be2d6 --- /dev/null +++ b/newlib/libc/sys/vita/mmap.c @@ -0,0 +1,83 @@ +/* + +Copyright (C) 2017, David "Davee" Morgan +Copyright (C) 2019, Sunguk Lee + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ +#include +#include +#include +#include +#include + +void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) { + // can't use file + if (fd != -1) { + errno = ENOSYS; + return MAP_FAILED; + } + // can't use WX perm + if ((prot & (PROT_EXEC | PROT_WRITE)) == (PROT_EXEC | PROT_WRITE)) { + errno = EPERM; + return MAP_FAILED; + } + + if ((prot & (PROT_WRITE | PROT_READ)) != (PROT_WRITE | PROT_READ)) { + errno = EPERM; + return MAP_FAILED; + } + if ((flags & MAP_PRIVATE) != MAP_PRIVATE) { + errno = ENOSYS; + return MAP_FAILED; + } + + // can't use shared mem + if (flags & MAP_SHARED) { + errno = ENOSYS; + return MAP_FAILED; + } + + SceUID blkid = sceKernelAllocMemBlock("mmap", SCE_KERNEL_MEMBLOCK_TYPE_USER_RW, length, 0); + if (blkid < 0) { + errno = ENOMEM; + return MAP_FAILED; + } + + void *block_addr = NULL; + sceKernelGetMemBlockBase(blkid, &block_addr); + + if (flags & (MAP_ANON | MAP_ANONYMOUS)) + memset(block_addr, 0, length); + + return block_addr; +} + +int munmap(void *addr, size_t length) { + SceUID block = sceKernelFindMemBlockByAddr(addr, length); + + if (block < 0) { + errno = EINVAL; + return -1; + } + + sceKernelFreeMemBlock(block); + return 0; +} diff --git a/newlib/libc/sys/vita/sys/mman.h b/newlib/libc/sys/vita/sys/mman.h new file mode 100644 index 0000000000..09d8f14843 --- /dev/null +++ b/newlib/libc/sys/vita/sys/mman.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 vitasdk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SYS_MMAN_H_ +#define _SYS_MMAN_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define PROT_NONE 0 +#define PROT_READ 1 +#define PROT_WRITE 2 +#define PROT_EXEC 4 + +#define MAP_FAILED ((void *) -1) +#define MAP_SHARED 0x01 +#define MAP_PRIVATE 0x02 +#define MAP_FIXED 0x10 +#define MAP_ANON 0x20 +#define MAP_ANONYMOUS MAP_ANON + +#define MS_ASYNC 1 +#define MS_INVALIDATE 2 +#define MS_SYNC 4 + +#define MCL_CURRENT 1 +#define MCL_FUTURE 2 + +#define POSIX_MADV_NORMAL 0 +#define POSIX_MADV_RANDOM 1 +#define POSIX_MADV_SEQUENTIAL 2 +#define POSIX_MADV_WILLNEED 3 +#define POSIX_MADV_DONTNEED 4 + +void *mmap (void *, size_t, int, int, int, off_t); +int munmap (void *, size_t); + +#ifdef __cplusplus +} +#endif + +#endif