diff options
33 files changed, 858 insertions, 61 deletions
@@ -1,3 +1,104 @@ +1998-06-01 Gordon Matzigkeit <gord@profitpress.com> + + * hurd/Makefile (routines): Add cthreads. + +1998-05-31 Mark Kettenis <kettenis@phys.uva.nl> + + * login/login.c (login): Let pututline take care of finding the + positin to insert the UTMP entry. This corrects a bug where ssh + was not reusing UTMP entries marked as DEAD_PROCESS. + Reported by Herbert Xu <herbert@gondor.apana.org.au>. + +1998-05-31 Mark Kettenis <kettenis@phys.uva.nl> + + * login/Makefile (tests): New variable, add tst-utmp and + tst-utmpx. + * login/tst-utmp.c: New file. + * login/tst-utmpx.c: New file. + +1998-06-01 Gordon Matzigkeit <gord@profitpress.com> + + * sysdeps/mach/hurd/errlist.c (sys_nerr, _sys_nerr): Make weak + aliases for _hurd_nerr, for programs that don't use sys_errlist, + but need sys_err. + +1998-05-31 Mark Kettenis <kettenis@phys.uva.nl> + + * sysdeps/generic/updwtmpx.c: Rename function to updwtmpx. + * libc.map: Add updwtmpx and utmpxname to GLIBC_2.1. + +1998-05-31 Mark Kettenis <kettenis@phys.uva.nl> + + * sysdeps/mach/hurd/read.c: Rename function to __libc_read and + make __read a weak alias. Use ANSI-style function definition. + * sysdeps/mach/hurd/write.c: Likewise. + +1998-05-31 Mark Kettenis <kettenis@phys.uva.nl> + + * sysdeps/mach/hurd/err_hurd.sub: Use _hurd_errlist instead of + _sys_errlist. + +1998-05-30 Mark Kettenis <kettenis@phys.uva.nl> + + * sysdeps/mach/hurd/Makefile ($(objpfx)librtld.os): + Renamed from librtld.so. + +1998-06-02 Andreas Jaeger <aj@arthur.rhein-neckar.de> + + * libc.map: Remove _IO_getline_info which was erroneously + introduced in section GLIBC_2.0. + Noticed by Horst von Brand <vonbrand@sleipnir.valparaiso.cl>. + +1998-06-01 Gordon Matzigkeit <gord@profitpress.com> + + * sysdeps/generic/socket.c (__socket): Renamed from socket, and + created a weak alias. + * sysdeps/mach/hurd/socket.c (__socket): Likewise. + +1998-05-31 Gordon Matzigkeit <gord@profitpress.com> + + * sysdeps/mach/hurd/ftruncate.c (__ftruncate): Rename from old + ftruncate function, and create a weak alias to ftruncate. + +1998-06-01 Gordon Matzigkeit <gord@profitpress.com> + + * grp/fgetgrent_r.c: Use &errno instead of __errno_location (). + * inet/getnetgrent_r.c: Likewise. + * nss/getXXbyYY_r.c: Likewise. + * nss/getXXent_r.c: Likewise. + * pwd/fgetpwent_r.c: Likewise. + * shadow/sgetspent_r.c: Likewise. + * shadow/fgetspent_r.c: Likewise. + * sunrpc/publickey.c: Likewise. + +1998-06-01 Gordon Matzigkeit <gord@profitpress.com> + + * hurd/libhurduser.map: New file. + * mach/libmachuser.map: Likewise. + + * libc.map: Add Hurd-specific functions to version 2.1. + Add __flshfp and __fillbf. + +1998-05-30 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * manual/signal.texi (Basic Signal Handling): Fix typo. + * manual/errno.texi (Error Codes): Likewise. + +1998-06-02 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/unix/sysv/linux/netipx/ipx.h: Include <bits/sockaddr.h> + instead of <sys/socket.h>. + Patch by NIIBE Yutaka <gniibe@mri.co.jp> + + * sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c (DL_FIND_ARG_COMPONENTS): + Finally make it working. + Patch by Mark Hatle <fray@kernel.crashing.org>. + +1998-03-22 Paul Eggert <eggert@twinsun.com> + + * posix/regex.c: Include <wchar.h> before <wctype.h>, to work around + a Solaris 2.6 bug. + 1998-05-30 Philip Blundell <Philip.Blundell@pobox.com> * stdlib/gmp-impl.h: Support strange mixed-endian double format diff --git a/grp/fgetgrent_r.c b/grp/fgetgrent_r.c index 9ac9dc1..de11326 100644 --- a/grp/fgetgrent_r.c +++ b/grp/fgetgrent_r.c @@ -82,7 +82,7 @@ __fgetgrent_r (FILE *stream, struct group *resbuf, char *buffer, size_t buflen, get the next line of the file to parse. */ || ! (parse_result = parse_line (p, resbuf, (void *) buffer, buflen, - __errno_location ()))); + &errno))); if (parse_result == -1) { diff --git a/hurd/Makefile b/hurd/Makefile index 1dd6622..40440ad 100644 --- a/hurd/Makefile +++ b/hurd/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. +# Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -42,6 +42,7 @@ routines = hurdstartup hurdinit \ hurdid hurdlookup hurdpid hurdrlimit hurdprio hurdexec \ get-host set-host \ path-lookup \ + cthreads \ setauth \ pid2task task2pid \ getuids setuids getumask fchroot \ diff --git a/hurd/libhurduser.map b/hurd/libhurduser.map new file mode 100644 index 0000000..005b397 --- /dev/null +++ b/hurd/libhurduser.map @@ -0,0 +1,155 @@ +GLIBC_2.0 { + global: + + # These functions are used internally by libc. + _S_msg_server; __auth_getids; __auth_makeauth; + __auth_user_authenticate; __crash_dump_task; __dir_link; + __dir_lookup; __dir_mkdir; __dir_mkfile; __dir_readdir; + __dir_rename; __dir_rmdir; __dir_unlink; __exec_startup_get_info; + __file_check_access; __file_chflags; __file_chmod; __file_chown; + __file_exec; __file_getlinknode; __file_lock; __file_reparent; + __file_set_size; __file_set_translator; __file_statfs; + __file_sync; __file_syncfs; __file_utimes; __ifsock_getsockaddr; + __interrupt_operation; __io_clear_some_openmodes; + __io_get_icky_async_id; __io_get_openmodes; __io_get_owner; + __io_identity; __io_map; __io_mod_owner; __io_pathconf; __io_read; + __io_readable; __io_reauthenticate; __io_seek; __io_select; + __io_set_all_openmodes; __io_set_some_openmodes; __io_stat; + __io_write; __msg_set_init_int; __msg_sig_post; + __msg_sig_post_reply; __msg_sig_post_request; + __msg_sig_post_untraced; __msg_sig_post_untraced_reply; + __proc_child; __proc_dostop; __proc_get_arg_locations; + __proc_getallpids; __proc_getlogin; __proc_getmsgport; + __proc_getpgrp; __proc_getpgrppids; __proc_getpids; + __proc_getprivports; __proc_getprocinfo; __proc_getsid; + __proc_getsidport; __proc_handle_exceptions; __proc_mark_cont; + __proc_mark_exit; __proc_mark_stop; __proc_mark_traced; + __proc_mod_stopchild; __proc_pid2task; __proc_reauthenticate; + __proc_set_arg_locations; __proc_setlogin; __proc_setmsgport; + __proc_setowner; __proc_setpgrp; __proc_setsid; __proc_task2pid; + __proc_task2proc; __proc_uname; __proc_wait; __socket_accept; + __socket_bind; __socket_connect; __socket_connect2; + __socket_create; __socket_create_address; __socket_getopt; + __socket_listen; __socket_name; __socket_peername; __socket_recv; + __socket_send; __socket_setopt; __socket_shutdown; + __socket_whatis_address; __startup_reboot; __term_get_nodename; + __term_getctty; __term_open_ctty; __termctty_open_terminal; + __tioctl_tiocspgrp; _hurdsig_fault_exc_server; + + # functions in normal name space + # Please keep them sorted by name! + + # a* + auth_getids; auth_makeauth; auth_server_authenticate; + auth_user_authenticate; + + # c* + crash_dump_task; + + # d* + dir_link; dir_lookup; dir_mkdir; dir_mkfile; dir_notice_changes; + dir_readdir; dir_rename; dir_rmdir; dir_unlink; + + # e* + exec_exec; exec_init; exec_setexecdata; exec_startup_get_info; + + # f* + file_chauthor; file_check_access; file_chflags; file_chmod; + file_chown; file_exec; file_get_fs_options; file_get_storage_info; + file_get_translator; file_get_translator_cntl; file_getcontrol; + file_getfh; file_getlinknode; file_lock; file_lock_stat; + file_notice_changes; file_reparent; file_set_size; + file_set_translator; file_statfs; file_sync; file_syncfs; + file_utimes; fsys_forward; fsys_get_options; fsys_getfile; + fsys_getpriv; fsys_getroot; fsys_goaway; fsys_init; + fsys_set_options; fsys_startup; fsys_syncfs; + + # i* + ifsock_getsockaddr; interrupt_operation; io_async; + io_clear_some_openmodes; io_duplicate; io_eofnotify; io_get_conch; + io_get_icky_async_id; io_get_openmodes; io_get_owner; io_identity; + io_map; io_map_cntl; io_mod_owner; io_pathconf; io_postnotify; + io_prenotify; io_read; io_readable; io_readnotify; io_readsleep; + io_reauthenticate; io_release_conch; io_restrict_auth; io_seek; + io_select; io_server_version; io_set_all_openmodes; + io_set_some_openmodes; io_sigio; io_stat; io_write; + + # m* + msg_add_auth; msg_del_auth; msg_describe_ports; msg_get_dtable; + msg_get_env_variable; msg_get_environment; msg_get_fd; + msg_get_init_int; msg_get_init_ints; msg_get_init_port; + msg_get_init_ports; msg_proc_newids; msg_report_wait; + msg_set_dtable; msg_set_env_variable; msg_set_environment; + msg_set_fd; msg_set_init_int; msg_set_init_ints; + msg_set_init_port; msg_set_init_ports; msg_sig_post; + msg_sig_post_reply; msg_sig_post_request; msg_sig_post_untraced; + msg_sig_post_untraced_reply; msg_sig_post_untraced_request; + + # p* + proc_child; proc_child_request; proc_dostop; proc_dostop_request; + proc_execdata_notify; proc_execdata_notify_request; + proc_get_arg_locations; proc_get_arg_locations_request; + proc_get_tty; proc_get_tty_request; proc_getallpids; + proc_getallpids_request; proc_getexecdata; + proc_getexecdata_request; proc_gethostid_request; + proc_gethostname_request; proc_getlogin; proc_getlogin_request; + proc_getloginid; proc_getloginid_request; proc_getloginpids; + proc_getloginpids_request; proc_getmsgport; + proc_getmsgport_request; proc_getpgrp; proc_getpgrp_request; + proc_getpgrppids; proc_getpgrppids_request; proc_getpids; + proc_getpids_request; proc_getprivports; + proc_getprivports_request; proc_getprocargs; + proc_getprocargs_request; proc_getprocenv; + proc_getprocenv_request; proc_getprocinfo; + proc_getprocinfo_request; proc_getsessionpgids; + proc_getsessionpgids_request; proc_getsessionpids; + proc_getsessionpids_request; proc_getsid; proc_getsid_request; + proc_getsidport; proc_getsidport_request; proc_handle_exceptions; + proc_handle_exceptions_request; proc_make_login_coll; + proc_make_login_coll_request; proc_mark_cont; + proc_mark_cont_request; proc_mark_exec; proc_mark_exec_request; + proc_mark_exit; proc_mark_exit_request; proc_mark_stop; + proc_mark_stop_request; proc_mark_traced; + proc_mark_traced_request; proc_mod_stopchild; + proc_mod_stopchild_request; proc_pid2proc; proc_pid2proc_request; + proc_pid2task; proc_pid2task_request; proc_proc2task; + proc_proc2task_request; proc_reassign; proc_reassign_request; + proc_reauthenticate; proc_reauthenticate_request; + proc_register_version; proc_register_version_request; + proc_set_arg_locations; proc_set_arg_locations_request; + proc_setexecdata; proc_setexecdata_request; + proc_sethostid_request; proc_sethostname_request; proc_setlogin; + proc_setlogin_request; proc_setmsgport; proc_setmsgport_request; + proc_setowner; proc_setowner_request; proc_setpgrp; + proc_setpgrp_request; proc_setsid; proc_setsid_request; + proc_task2pid; proc_task2pid_request; proc_task2proc; + proc_task2proc_request; proc_uname; proc_uname_request; proc_wait; + proc_wait_request; + + # s* + socket_accept; socket_bind; socket_connect; socket_connect2; + socket_create; socket_create_address; socket_fabricate_address; + socket_getopt; socket_listen; socket_name; socket_peername; + socket_recv; socket_send; socket_setopt; socket_shutdown; + socket_whatis_address; startup_authinit; startup_essential_task; + startup_procinit; startup_reboot; startup_request_notification; + + # t* + term_get_bottom_type; term_get_nodename; term_getctty; + term_on_hurddev; term_on_machdev; term_on_pty; term_open_ctty; + term_set_filenode; term_set_nodename; termctty_open_terminal; + tioctl_tioccbrk; tioctl_tioccdtr; tioctl_tiocdrain; + tioctl_tiocexcl; tioctl_tiocext; tioctl_tiocflush; + tioctl_tiocgeta; tioctl_tiocgetd; tioctl_tiocgpgrp; + tioctl_tiocgwinsz; tioctl_tiocmbic; tioctl_tiocmbis; + tioctl_tiocmget; tioctl_tiocmodg; tioctl_tiocmods; + tioctl_tiocmset; tioctl_tiocnxcl; tioctl_tiocoutq; tioctl_tiocpkt; + tioctl_tiocremote; tioctl_tiocsbrk; tioctl_tiocsdtr; + tioctl_tiocseta; tioctl_tiocsetaf; tioctl_tiocsetaw; + tioctl_tiocsetd; tioctl_tiocsig; tioctl_tiocspgrp; + tioctl_tiocstart; tioctl_tiocsti; tioctl_tiocstop; + tioctl_tiocswinsz; tioctl_tiocucntl; + + local: + *; +}; diff --git a/hurd/libmachuser.map b/hurd/libmachuser.map new file mode 100644 index 0000000..d14797f --- /dev/null +++ b/hurd/libmachuser.map @@ -0,0 +1,113 @@ +# libmachuser.map - symbol version and export information for libmachuser.so +GLIBC_2.0 { + global: + + # These functions are used internally by libc. + _S_exc_server; __host_adjust_time; __host_get_time; __host_info; + __host_set_time; __mach_port_allocate_name_rpc; + __mach_port_allocate_rpc; __mach_port_deallocate_rpc; + __mach_port_destroy; __mach_port_extract_right; + __mach_port_get_refs; __mach_port_insert_right_rpc; + __mach_port_mod_refs; __mach_port_move_member; __mach_port_names; + __mach_port_set_qlimit; __task_create_rpc; + __task_disable_pc_sampling; __task_enable_pc_sampling; + __task_get_special_port; __task_priority; __task_resume; + __task_set_special_port_rpc; __task_suspend_rpc; + __task_terminate_rpc; __task_threads; __thread_abort; + __thread_create; __thread_depress_abort_rpc; __thread_get_state; + __thread_resume; __thread_set_special_port; __thread_set_state; + __thread_suspend; __thread_terminate; __vm_allocate_rpc; + __vm_deallocate_rpc; __vm_map_rpc; __vm_protect; __vm_read; + __vm_region; __vm_statistics; __vm_write; + + # functions in normal name space + # Please keep them sorted by name! + + # d* + default_pager_info; default_pager_object_create; + default_pager_object_pages; default_pager_objects; + default_pager_paging_file; default_pager_register_fileserver; + device_close; device_get_status; device_map; device_open; + device_open_request; device_read; device_read_inband; + device_read_request; device_read_request_inband; device_set_filter; + device_set_status; device_write; device_write_inband; + device_write_request; device_write_request_inband; + dp_helper_paging_space; + + # e* + exception_raise; + + # h* + host_adjust_time; host_get_boot_info; host_get_time; host_info; + host_kernel_version; host_processor_set_priv; host_processor_sets; + host_processors; host_reboot; host_set_time; + + # m* + mach_port_allocate_name_rpc; mach_port_allocate_rpc; + mach_port_deallocate_rpc; mach_port_destroy; + mach_port_extract_right; mach_port_get_receive_status; + mach_port_get_refs; mach_port_get_set_status; + mach_port_insert_right_rpc; mach_port_mod_refs; + mach_port_move_member; mach_port_names; mach_port_rename; + mach_port_request_notification; mach_port_set_mscount; + mach_port_set_qlimit; mach_port_set_seqno; mach_port_type; + mach_ports_lookup; mach_ports_register; + memory_object_change_attributes; memory_object_change_completed; + memory_object_copy; memory_object_create; + memory_object_data_error; memory_object_data_initialize; + memory_object_data_provided; memory_object_data_request; + memory_object_data_return; memory_object_data_supply; + memory_object_data_unavailable; memory_object_data_unlock; + memory_object_data_write; memory_object_destroy; + memory_object_get_attributes; memory_object_init; + memory_object_lock_completed; memory_object_lock_request; + memory_object_ready; memory_object_set_attributes; + memory_object_supply_completed; memory_object_terminate; + + # o* + old_mach_port_get_receive_status; + + # p* + processor_assign; processor_control; processor_exit; + processor_get_assignment; processor_info; processor_set_create; + processor_set_default; processor_set_destroy; processor_set_info; + processor_set_max_priority; processor_set_policy_disable; + processor_set_policy_enable; processor_set_tasks; + processor_set_threads; processor_start; + + # t* + task_assign; task_assign_default; task_create_rpc; + task_disable_pc_sampling; task_enable_pc_sampling; + task_get_assignment; task_get_emulation_vector; + task_get_sampled_pcs; task_get_special_port; task_info; + task_priority; task_ras_control; task_resume; task_set_emulation; + task_set_emulation_vector; task_set_special_port_rpc; + task_suspend_rpc; task_terminate_rpc; task_threads; thread_abort; + thread_assign; thread_assign_default; thread_create; + thread_depress_abort_rpc; thread_disable_pc_sampling; + thread_enable_pc_sampling; thread_get_assignment; + thread_get_sampled_pcs; thread_get_special_port; thread_get_state; + thread_info; thread_max_priority; thread_policy; thread_priority; + thread_resume; thread_set_special_port; thread_set_state; + thread_suspend; thread_terminate; thread_wire; + + # v* + vm_allocate_rpc; vm_copy; vm_deallocate_rpc; vm_inherit; + vm_machine_attribute; vm_map_rpc; vm_protect; vm_read; vm_region; + vm_set_default_memory_manager; vm_statistics; vm_wire; vm_write; + + # x* + xxx_cpu_control; xxx_device_get_status; xxx_device_set_filter; + xxx_device_set_status; xxx_host_info; + xxx_memory_object_lock_request; xxx_processor_set_default_priv; + xxx_slot_info; xxx_task_get_emulation_vector; xxx_task_info; + xxx_task_set_emulation_vector; xxx_thread_get_state; + xxx_thread_info; xxx_thread_set_state; + + # y* + yyy_host_info; yyy_processor_control; yyy_processor_info; + yyy_processor_set_info; + + local: + *; +}; diff --git a/inet/getnetgrent_r.c b/inet/getnetgrent_r.c index 83e4c9e..5b2b241 100644 --- a/inet/getnetgrent_r.c +++ b/inet/getnetgrent_r.c @@ -135,7 +135,7 @@ __internal_setnetgrent (const char *group, struct __netgrent *datap) /* Free list of all netgroup names from last run. */ free_memory (datap); - return __internal_setnetgrent_reuse (group, datap, __errno_location ()); + return __internal_setnetgrent_reuse (group, datap, &errno); } int @@ -283,7 +283,7 @@ __getnetgrent_r (char **hostp, char **userp, char **domainp, __libc_lock_lock (lock); status = __internal_getnetgrent_r (hostp, userp, domainp, &dataset, - buffer, buflen, __errno_location ()); + buffer, buflen, &errno); __libc_lock_unlock (lock); @@ -78,7 +78,7 @@ GLIBC_2.0 { __select; __sched_get_priority_max; __sched_get_priority_min; __sched_getparam; __sched_getscheduler; __sched_setscheduler; __sched_yield; __on_exit; __gettimeofday; __fork; __clone; - __nss_configure_lookup; _dl_open; _dl_close; _dl_addr; + __nss_configure_lookup; _dl_open; _dl_close; _dl_addr; __vsscanf; __vfscanf; __vsnprintf; _rpc_dtablesize; _null_auth; _seterr_reply; __res_randomid; __getpid; @@ -102,7 +102,7 @@ GLIBC_2.0 { _IO_flush_all; _IO_flush_all_linebuffered; _IO_fopen; _IO_fprintf; _IO_fputs; _IO_fread; _IO_free_backup_area; _IO_freopen; _IO_fscanf; _IO_fseek; _IO_fsetpos; _IO_ftell; _IO_funlockfile; - _IO_fwrite; _IO_getc; _IO_getline; _IO_getline_info; _IO_gets; + _IO_fwrite; _IO_getc; _IO_getline; _IO_gets; _IO_init; _IO_init_marker; _IO_link_in; _IO_marker_delta; _IO_marker_difference; _IO_padn; _IO_pclose; _IO_peekc_locked; _IO_perror; _IO_popen; _IO_printf; _IO_proc_close; _IO_proc_open; @@ -122,6 +122,42 @@ GLIBC_2.0 { # Profiling support __monstartup; _mcleanup; __profile_frequency; + # Hurd-specific variables + __hurd_sigthread_stack_base; __hurd_sigthread_stack_end; + __hurd_sigthread_variables; + __hurd_threadvar_stack_mask; __hurd_threadvar_stack_offset; + + # functions from stdio + __fillbf; __flshfp; + + # Internal functions referenced by libmachuser and libhurduser. + __mach_msg; + __mig_allocate; __mig_deallocate; + __mig_get_reply_port; __mig_put_reply_port; __mig_dealloc_reply_port; + _S_catch_exception_raise; + _S_msg_add_auth; _S_msg_del_auth; + _S_msg_describe_ports; + _S_msg_get_dtable; _S_msg_set_dtable; + _S_msg_get_env_variable; _S_msg_set_env_variable; + _S_msg_get_environment; _S_msg_set_environment; + _S_msg_get_fd; _S_msg_set_fd; + _S_msg_get_init_int; _S_msg_set_init_int; + _S_msg_get_init_ints; _S_msg_set_init_ints; + _S_msg_get_init_port; _S_msg_set_init_port; + _S_msg_get_init_ports; _S_msg_set_init_ports; + _S_msg_proc_newids; _S_msg_report_wait; + _S_msg_sig_post; _S_msg_sig_post_untraced; + _hurd_intr_rpc_mach_msg; _hurdsig_fault_catch_exception_raise; + + # Placeholders for the Hurd libthreads implementation. + cthread_getspecific; cthread_keycreate; cthread_setspecific; + __libc_getspecific; + + # Function versions of Hurd macros. + __mutex_init; __mutex_trylock; + __mutex_lock; __mutex_unlock; + __mutex_lock_solid; __mutex_unlock_solid; + # variables in normal name space argp_err_exit_status; argp_program_bug_address; argp_program_version; argp_program_version_hook; @@ -566,7 +602,7 @@ GLIBC_2.1 { tcgetsid; tdestroy; tmpfile64; truncate64; # u* - unlockpt; utimes; user2netname; + unlockpt; updwtmpx; user2netname; utimes; utmpxname; # v* versionsort; versionsort64; diff --git a/login/Makefile b/login/Makefile index 40cee55..6ecee73 100644 --- a/login/Makefile +++ b/login/Makefile @@ -43,6 +43,8 @@ distribute := utmp-private.h programs/xtmp.h programs/utmpd.h README.utmpd \ subdir-dirs = programs vpath %.c programs +tests := tst-utmp tst-utmpx + # Build the -lutil library with these extra functions. extra-libs := libutil extra-libs-others := $(extra-libs) diff --git a/login/login.c b/login/login.c index 4d08dbb..a7875f2 100644 --- a/login/login.c +++ b/login/login.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -89,7 +89,6 @@ login (const struct utmp *ut) int found_tty; const char *ttyp; struct utmp copy = *ut; - struct utmp utbuf; /* Fill in those fields we supply. */ #if _HAVE_UT_TYPE - 0 @@ -117,14 +116,9 @@ login (const struct utmp *ut) /* Tell that we want to use the UTMP file. */ if (utmpname (_PATH_UTMP) == 0) { - struct utmp *old; - /* Open UTMP file. */ setutent (); - /* Read the record. */ - getutline_r (©, &utbuf, &old); - /* Write the entry. */ pututline (©); diff --git a/login/tst-utmp.c b/login/tst-utmp.c new file mode 100644 index 0000000..9ff8b5d --- /dev/null +++ b/login/tst-utmp.c @@ -0,0 +1,380 @@ +/* Tests for UTMP functions. + Copyright (C) 1998 Free Software Foundation, Inc. + Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1998. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <error.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <time.h> + +#ifdef UTMPX +# include <utmpx.h> +# define utmp utmpx +# define utmpname utmpxname +# define setutent setutxent +# define getutent getutxent +# define endutent endutxent +# define getutline getutxline +# define getutid getutxid +# define pututline pututxline +#else +# include <utmp.h> +#endif + + +/* Prototype for our test function. */ +static int do_test (int argc, char *argv[]); + +/* We have a preparation function. */ +static void do_prepare (int argc, char *argv[]); +#define PREPARE do_prepare + +/* This defines the `main' function and some more. */ +#include <test-skeleton.c> + + +/* These are for the temporary file we generate. */ +char *name; +int fd; + +static void +do_prepare (int argc, char *argv[]) +{ + size_t name_len; + + name_len = strlen (test_dir); + name = malloc (name_len + sizeof ("/utmpXXXXXX")); + mempcpy (mempcpy (name, test_dir, name_len), + "/utmpXXXXXX", sizeof ("/utmpXXXXXX")); + add_temp_file (name); + + /* Open our test file. */ + fd = mkstemp (name); + if (fd == -1) + error (EXIT_FAILURE, errno, "cannot open test file `%s'", name); +} + + +struct utmp entry[] = +{ + { ut_type: BOOT_TIME, ut_pid: 1, ut_tv: { tv_sec: 1000 } }, + { ut_type: RUN_LVL, ut_pid: 1, ut_tv: { tv_sec: 2000 } }, + { ut_type: INIT_PROCESS, ut_pid: 5, ut_id: "si", ut_tv: { tv_sec: 3000 } }, + { ut_type: LOGIN_PROCESS, ut_pid: 23, ut_line: "tty1", ut_id: "1", + ut_user: "LOGIN", ut_session: 23, ut_tv: { tv_sec: 4000 } }, + { ut_type: USER_PROCESS, ut_pid: 24, ut_line: "tty2", ut_id: "2", + ut_user: "albert", ut_session: 24, ut_tv: { tv_sec: 8000 } }, + { ut_type: USER_PROCESS, ut_pid: 196, ut_line: "ttyp0", ut_id: "p0", + ut_user: "niels", ut_session: 196, ut_tv: { tv_sec: 10000 } }, + { ut_type: DEAD_PROCESS, ut_line: "ttyp1", ut_id: "p1", + ut_tv: { tv_sec: 16000 } }, + { ut_type: EMPTY }, + { ut_type: EMPTY } +}; +int num_entries = sizeof entry / sizeof (struct utmp); + +time_t entry_time = 20000; +pid_t entry_pid = 234; + +static int +do_init (void) +{ + int n; + + setutent (); + + for (n = 0; n < num_entries; n++) + { + if (pututline (&entry[n]) == NULL) + { + error (0, errno, "cannot write UTMP entry"); + return 1; + } + } + + endutent (); + + return 0; +} + + +static int +do_check (void) +{ + struct utmp *ut; + int n; + + setutent (); + + n = 0; + while ((ut = getutent ())) + { + if (n < num_entries && + memcmp (ut, &entry[n], sizeof (struct utmp))) + { + error (0, 0, "UTMP entry does not match"); + return 1; + } + + n++; + } + + if (n != num_entries) + { + error (0, 0, "number of UTMP entries is incorrect"); + return 1; + } + + endutent (); + + return 0; +} + +static int +simulate_login (const char *line, const char *user) +{ + int n; + + for (n = 0; n < num_entries; n++) + { + if (strcmp (line, entry[n].ut_line) == 0 || + entry[n].ut_type == DEAD_PROCESS) + { + if (entry[n].ut_pid == DEAD_PROCESS) + entry[n].ut_pid = (entry_pid += 27); + entry[n].ut_type = USER_PROCESS; + strcpy (entry[n].ut_user, user); + entry[n].ut_tv.tv_sec = (entry_time += 1000); + + setutent (); + + if (pututline (&entry[n]) == NULL) + { + error (0, errno, "cannot write UTMP entry"); + return 1; + } + + endutent (); + + return 0; + } + } + + error (0, 0, "no entries available"); + return 1; +} + +static int +simulate_logout (const char *line) +{ + int n; + + for (n = 0; n < num_entries; n++) + { + if (strcmp (line, entry[n].ut_line) == 0) + { + entry[n].ut_type = DEAD_PROCESS; + entry[n].ut_user[0] = '\0'; + entry[n].ut_tv.tv_sec = (entry_time += 1000); + + setutent (); + + if (pututline (&entry[n]) == NULL) + { + error (0, errno, "cannot write UTMP entry"); + return 1; + } + + endutent (); + + return 0; + } + } + + error (0, 0, "no entry found for `%s'", line); + return 1; +} + +static int +check_login (const char *line) +{ + struct utmp *up; + struct utmp ut; + int n; + + setutent (); + + strcpy (ut.ut_line, line); + up = getutline (&ut); + if (up == NULL) + { + error (0, errno, "cannot get entry for line `%s'", line); + return 1; + } + + endutent (); + + for (n = 0; n < num_entries; n++) + { + if (strcmp (line, entry[n].ut_line) == 0) + { + if (memcmp (up, &entry[n], sizeof (struct utmp))) + { + error (0, 0, "UTMP entry does not match"); + return 1; + } + + return 0; + } + } + + error (0, 0, "bogus entry for line `%s'", line); + return 1; +} + +static int +check_logout (const char *line) +{ + struct utmp ut; + + setutent (); + + strcpy (ut.ut_line, line); + if (getutline (&ut) != NULL) + { + error (0, 0, "bogus login entry for `%s'", line); + return 1; + } + + endutent (); + + return 0; +} + +static int +check_id (const char *id) +{ + struct utmp *up; + struct utmp ut; + int n; + + setutent (); + + ut.ut_type = USER_PROCESS; + strcpy (ut.ut_id, id); + up = getutid (&ut); + if (up == NULL) + { + error (0, errno, "cannot get entry for ID `%s'", id); + return 1; + } + + endutent (); + + for (n = 0; n < num_entries; n++) + { + if (strcmp (id, entry[n].ut_id) == 0) + { + if (memcmp (up, &entry[n], sizeof (struct utmp))) + { + error (0, 0, "UTMP entry does not match"); + return 1; + } + + return 0; + } + } + + error (0, 0, "bogus entry for ID `%s'", id); + return 1; +} + +static int +check_type (int type) +{ + struct utmp *up; + struct utmp ut; + int n; + + setutent (); + + ut.ut_type = type; + up = getutid (&ut); + if (up == NULL) + { + error (0, errno, "cannot get entry for type `%d'", type); + return 1; + } + + endutent (); + + for (n = 0; n < num_entries; n++) + { + if (type == entry[n].ut_type) + { + if (memcmp (up, &entry[n], sizeof (struct utmp))) + { + error (0, 0, "UTMP entry does not match"); + return 1; + } + + return 0; + } + } + + error (0, 0, "bogus entry for type `%d'", type); + return 1; +} + +static int +do_test (int argc, char *argv[]) +{ + int result = 0; + + utmpname (name); + + result |= do_init (); + result |= do_check (); + + result |= simulate_login ("tty1", "erwin"); + result |= do_check (); + + result |= simulate_login ("ttyp1", "paul"); + result |= do_check (); + + result |= simulate_logout ("tty2"); + result |= do_check (); + + result |= simulate_logout ("ttyp0"); + result |= do_check (); + + result |= simulate_login ("ttyp2", "richard"); + result |= do_check (); + + result |= check_login ("tty1"); + result |= check_logout ("ttyp0"); + result |= check_id ("p1"); + result |= check_id ("2"); + result |= check_id ("si"); + result |= check_type (BOOT_TIME); + result |= check_type (RUN_LVL); + + return result; +} diff --git a/login/tst-utmpx.c b/login/tst-utmpx.c new file mode 100644 index 0000000..edb5551 --- /dev/null +++ b/login/tst-utmpx.c @@ -0,0 +1,2 @@ +#define UTMPX +#include "tst-utmp.c" diff --git a/manual/errno.texi b/manual/errno.texi index 5eb6eae..f006bf7 100644 --- a/manual/errno.texi +++ b/manual/errno.texi @@ -515,7 +515,7 @@ particular protocol being used by the socket. @xref{Socket Options}. @deftypevr Macro int EPROTONOSUPPORT @comment errno 43 @c DO NOT REMOVE The socket domain does not support the requested communications protocol -(perhaps because the requested protocol is completely invalid.) +(perhaps because the requested protocol is completely invalid). @xref{Creating a Socket}. @end deftypevr diff --git a/manual/lang.texi b/manual/lang.texi index 7520da2..c8d0dbf 100644 --- a/manual/lang.texi +++ b/manual/lang.texi @@ -741,7 +741,7 @@ described by the macro---thus, @code{ULONG_MAX} has type @w{@code{unsigned long int}}. @comment Extra blank lines make it look better. -@table @code +@vtable @code @comment limits.h @comment ISO @item SCHAR_MIN @@ -1007,7 +1007,7 @@ principle GNU C actually satisfies the @w{ISO C} requirements only if the target machine is suitable. In practice, all the machines currently supported are suitable. -@table @code +@vtable @code @comment float.h @comment ISO @item FLT_ROUNDS diff --git a/manual/signal.texi b/manual/signal.texi index 609e756..263b1f0 100644 --- a/manual/signal.texi +++ b/manual/signal.texi @@ -1046,7 +1046,7 @@ is deinstalled after an signal was delivered. On BSD systems the handler must be explicitly deinstalled. In the GNU C Library we use the BSD version by default. To use the SVID version you can either use the function @code{sysv_signal} (see below) or use the @code{_XOPEN_SOURCE} -feature select macro (@pxref{Feature Test Macros}) Generally it should +feature select macro (@pxref{Feature Test Macros}). Generally it should be avoided to use this functions due to the compatibility problems. It is better to use @code{sigaction} if it is available since the results are much more reliable. diff --git a/nis/nis_callback.c b/nis/nis_callback.c index 7dfab8f..9d138fd 100644 --- a/nis/nis_callback.c +++ b/nis/nis_callback.c @@ -155,8 +155,6 @@ cb_prog_1 (struct svc_req *rqstp, SVCXPRT *transp) *cp++ = '.'; cp = stpcpy (cp, cbproc_entry(i)->zo_domain); - fprintf (stderr, "name=%s\n", name); - if ((data->callback) (name, cbproc_entry(i), data->userdata)) { bool_result = TRUE; diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c index 6589b47..2e5cc81 100644 --- a/nss/getXXbyYY_r.c +++ b/nss/getXXbyYY_r.c @@ -162,7 +162,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer, while (no_more == 0) { status = (*fct) (ADD_VARIABLES, resbuf, buffer, buflen, - __errno_location () H_ERRNO_VAR); + &errno H_ERRNO_VAR); /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the provided buffer is too small. In this case we should give diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c index 5c8384f..4906461 100644 --- a/nss/getXXent_r.c +++ b/nss/getXXent_r.c @@ -245,8 +245,7 @@ INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen, { int is_last_nip = nip == last_nip; - status = (*fct) (resbuf, buffer, buflen, __errno_location () - H_ERRNO_VAR); + status = (*fct) (resbuf, buffer, buflen, &errno H_ERRNO_VAR); /* The the status is NSS_STATUS_TRYAGAIN and errno is ERANGE the provided buffer is too small. In this case we should give diff --git a/posix/regex.c b/posix/regex.c index e2d31a0..26c876a 100644 --- a/posix/regex.c +++ b/posix/regex.c @@ -49,8 +49,9 @@ /* For platform which support the ISO C amendement 1 functionality we support user defined character classes. */ #if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) -# include <wctype.h> +/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */ # include <wchar.h> +# include <wctype.h> /* We have to keep the namespace clean. */ # define regfree(preg) __regfree (preg) diff --git a/pwd/fgetpwent_r.c b/pwd/fgetpwent_r.c index 1aa70bf..534afd5 100644 --- a/pwd/fgetpwent_r.c +++ b/pwd/fgetpwent_r.c @@ -93,8 +93,7 @@ __fgetpwent_r (FILE *stream, struct passwd *resbuf, char *buffer, } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ /* Parse the line. If it is invalid, loop to get the next line of the file to parse. */ - ! parse_line (p, resbuf, (void *) buffer, buflen, - __errno_location ())); + ! parse_line (p, resbuf, (void *) buffer, buflen, &errno)); *result = resbuf; return 0; diff --git a/shadow/fgetspent_r.c b/shadow/fgetspent_r.c index fafa89a..cb14a23 100644 --- a/shadow/fgetspent_r.c +++ b/shadow/fgetspent_r.c @@ -60,8 +60,7 @@ __fgetspent_r (FILE *stream, struct spwd *resbuf, char *buffer, size_t buflen, } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ /* Parse the line. If it is invalid, loop to get the next line of the file to parse. */ - ! parse_line (buffer, (void *) resbuf, NULL, 0, - __errno_location ())); + ! parse_line (buffer, (void *) resbuf, NULL, 0, &errno)); *result = resbuf; return 0; diff --git a/shadow/sgetspent_r.c b/shadow/sgetspent_r.c index f3e322a..fd34313 100644 --- a/shadow/sgetspent_r.c +++ b/shadow/sgetspent_r.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -92,7 +92,7 @@ __sgetspent_r (const char *string, struct spwd *resbuf, char *buffer, size_t buflen, struct spwd **result) { int parse_result = parse_line (strncpy (buffer, string, buflen), - resbuf, NULL, 0, __errno_location ()); + resbuf, NULL, 0, &errno); *result = parse_result > 0 ? resbuf : NULL; return *result == NULL ? errno : 0; diff --git a/sunrpc/publickey.c b/sunrpc/publickey.c index 2519c3d..71a1107 100644 --- a/sunrpc/publickey.c +++ b/sunrpc/publickey.c @@ -1,5 +1,5 @@ /* Get public or secret key from key server. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -64,7 +64,7 @@ getpublickey (const char *name, char *key) while (! no_more) { - status = (*fct) (name, key, __errno_location ()); + status = (*fct) (name, key, &errno); no_more = __nss_next (&nip, "getpublickey", (void **) &fct, status, 0); } diff --git a/sysdeps/generic/socket.c b/sysdeps/generic/socket.c index b946c16..0a65f58 100644 --- a/sysdeps/generic/socket.c +++ b/sysdeps/generic/socket.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,7 +23,7 @@ protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically. Returns a file descriptor for the new socket, or -1 for errors. */ int -socket (domain, type, protocol) +__socket (domain, type, protocol) int domain; int type; int protocol; @@ -33,5 +33,6 @@ socket (domain, type, protocol) } +weak_alias (__socket, socket) stub_warning (socket) #include <stub-tag.h> diff --git a/sysdeps/generic/updwtmpx.c b/sysdeps/generic/updwtmpx.c index 097bf38..e76a9aa 100644 --- a/sysdeps/generic/updwtmpx.c +++ b/sysdeps/generic/updwtmpx.c @@ -21,7 +21,7 @@ #include <utmpx.h> void -__updwtmpx (const char *wtmpx_file, const struct utmpx *utmpx) +updwtmpx (const char *wtmpx_file, const struct utmpx *utmpx) { __updwtmp (wtmpx_file, (const struct utmp *) utmpx); } diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index 55b333f..f425102 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -123,7 +123,7 @@ $(inst_libdir)/libc.so: $(rpcuserlibs) # linker, too. It must be self-contained, so we link the needed PIC # objects directly into the shared object. ifeq (elf,$(subdir)) -$(objpfx)librtld.so: $(rpcuserlibs:.so=_pic.a) +$(objpfx)librtld.os: $(rpcuserlibs:.so=_pic.a) endif diff --git a/sysdeps/mach/hurd/err_hurd.sub b/sysdeps/mach/hurd/err_hurd.sub index b077d24..4a4dee3 100644 --- a/sysdeps/mach/hurd/err_hurd.sub +++ b/sysdeps/mach/hurd/err_hurd.sub @@ -1,11 +1,12 @@ /* This file defines the Mach error system for Hurd server errors. */ -#include <stdio.h> #include <errno.h> +extern const char *const _hurd_errlist[]; + /* Omit `const' because we are included with `static' defined to `static const'. */ static struct error_subsystem err_hurd_sub[] = { - { "(os/hurd)", _HURD_ERRNOS, (const char *const *) _sys_errlist }, + { "(os/hurd)", _HURD_ERRNOS, (const char *const *) _hurd_errlist }, }; diff --git a/sysdeps/mach/hurd/errlist.c b/sysdeps/mach/hurd/errlist.c index f1ca0dc..8e18f41f 100644 --- a/sysdeps/mach/hurd/errlist.c +++ b/sysdeps/mach/hurd/errlist.c @@ -26,3 +26,7 @@ #define ERR_REMAP(n) (err_get_code (n)) #include <sysdeps/gnu/errlist.c> + +/* Oblige programs that use sys_nerr, but don't use sys_errlist. */ +weak_alias (_hurd_nerr, sys_nerr) +weak_alias (_hurd_nerr, _sys_nerr) diff --git a/sysdeps/mach/hurd/ftruncate.c b/sysdeps/mach/hurd/ftruncate.c index 21987ad..67f428e 100644 --- a/sysdeps/mach/hurd/ftruncate.c +++ b/sysdeps/mach/hurd/ftruncate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 94, 95, 97, 98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -18,6 +18,7 @@ #include <sys/types.h> #include <errno.h> +#include <unistd.h> #include <hurd.h> #include <hurd/fd.h> @@ -25,10 +26,12 @@ int ftruncate (fd, length) int fd; - off_t length; + __off_t length; { error_t err; if (err = HURD_DPORT_USE (fd, __file_set_size (port, length))) return __hurd_dfail (fd, err); return 0; } + +weak_alias (__ftruncate, ftruncate) diff --git a/sysdeps/mach/hurd/read.c b/sysdeps/mach/hurd/read.c index b5861cc..f6d8f39 100644 --- a/sysdeps/mach/hurd/read.c +++ b/sysdeps/mach/hurd/read.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1994, 1995, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -23,13 +23,11 @@ /* Read NBYTES into BUF from FD. Return the number read or -1. */ ssize_t -__read (fd, buf, nbytes) - int fd; - void *buf; - size_t nbytes; +__libc_read (int fd, void *buf, size_t nbytes) { error_t err = HURD_FD_USE (fd, _hurd_fd_read (descriptor, buf, &nbytes)); return err ? __hurd_dfail (fd, err) : nbytes; } -weak_alias (__read, read) +weak_alias (__libc_read, __read) +weak_alias (__libc_read, read) diff --git a/sysdeps/mach/hurd/socket.c b/sysdeps/mach/hurd/socket.c index 015d6ea..c21155b 100644 --- a/sysdeps/mach/hurd/socket.c +++ b/sysdeps/mach/hurd/socket.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 93, 94, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1992, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -26,9 +26,8 @@ /* Create a new socket of type TYPE in domain DOMAIN, using protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically. Returns a file descriptor for the new socket, or -1 for errors. */ -/* XXX should be __socket ? */ int -socket (domain, type, protocol) +__socket (domain, type, protocol) int domain; int type; int protocol; @@ -65,3 +64,5 @@ socket (domain, type, protocol) return _hurd_intern_fd (sock, O_IGNORE_CTTY, 1); } + +weak_alias (__socket, socket) diff --git a/sysdeps/mach/hurd/write.c b/sysdeps/mach/hurd/write.c index e3b4b69..7cd715e 100644 --- a/sysdeps/mach/hurd/write.c +++ b/sysdeps/mach/hurd/write.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 94, 95, 97, 98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -22,15 +22,11 @@ #include <hurd/fd.h> ssize_t -__write (fd, buf, nbytes) - int fd; - const void *buf; - size_t nbytes; +__libc_write (int fd, const void *buf, size_t nbytes) { error_t err = HURD_FD_USE (fd, _hurd_fd_write (descriptor, buf, &nbytes)); return err ? __hurd_dfail (fd, err) : nbytes; } - - -weak_alias (__write, write) +weak_alias (__libc_write, __write) +weak_alias (__libc_write, write) diff --git a/sysdeps/unix/sysv/linux/netipx/ipx.h b/sysdeps/unix/sysv/linux/netipx/ipx.h index ec93c81..8a7b6cf 100644 --- a/sysdeps/unix/sysv/linux/netipx/ipx.h +++ b/sysdeps/unix/sysv/linux/netipx/ipx.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 95, 96, 97, 98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -22,7 +22,7 @@ #include <features.h> #include <sys/types.h> -#include <sys/socket.h> +#include <bits/sockaddr.h> __BEGIN_DECLS diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c index 521ba1a..7e5acc8 100644 --- a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c +++ b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c @@ -24,13 +24,26 @@ #define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \ do { \ char **_tmp; \ + size_t _test; \ (argc) = *(long *) cookie; \ (argv) = (char **) cookie + 1; \ (envp) = (argv) + (argc) + 1; \ for (_tmp = (envp); *_tmp; ++_tmp) \ continue; \ - (auxp) = (void *) ++_tmp; \ - (auxp) = (void *)(((size_t)(auxp) + 0xF) & 0xFFFFFFF0); \ + /* The following '++' is important! */ \ + ++_tmp; \ + \ + _test = (size_t)_tmp; \ + _test = _test + 0xf & ~0xf; \ + /* Under some circumstances, MkLinux (up to at least DR3a5) \ + omits the padding. To work around this, we make a \ + basic sanity check of the argument vector. Of \ + course, this means that in future, the argument \ + vector will have to be laid out to allow for this \ + test :-(. */ \ + if (((ElfW(auxv_t) *)_test)->a_type <= 0x10) \ + _tmp = (char **)_test; \ + (auxp) = (ElfW(auxv_t) *) _tmp; \ } while (0) |