glibc/libio/fileops.c
Ulrich Drepper dfd2257ad9 Update.
1997-10-12 05:09  Ulrich Drepper  <drepper@cygnus.com>

	* libio/Makefile (routines): Remove iofprintf.
	* stdio-common/fprintf.c [USE_IN_LIBIO]: Define _IO_fprintf.
	* libio/filedoalloc.c: Use _G_stat64 instead of stat.
	* libio/fileops.c (_IO_file_open): Change to take extra argument
	indicating whether 32 or 64 bit mode is wanted.
	* libio/iofopen.c: Call _IO_file_open with extra argument set to 0.
	* libio/iofopen64.c: Call _IO_file_open with extra argument set to 0.
	* libio/iolibio.h (_IO_freopen, _IO_freopen64): Likewise.
	* libio/iofgetpos.c: Pretty print.
	* libio/iofgetpos64.c: Use _IO_fpos64_t for local variable `pos'.

	* manual/conf.texi: Document all the _SC_ and _CS_ constants.
	* manual/creature.texi: Document _LARGEFILE_SOURCE, _LARGEFILE64_SOURCE
	and _FILE_OFFSET_BITS.
	* manual/llio.texi: Document truncate and ftruncate.
	* manual/stdio.texi: Document positional parameters for printf.

	* math/Makefile (headers): Add tgmath.h.
	(libm-support): Remove s_lrint, s_llrint, s_lround, and s_llround and
	move to ...
	(libm-calls): ... here.  Add scalbln, s_nextafterx and s_fma.
	* math/libm-test.c (lround_test, llround_test): Test for all FP formats
	by using FUNC().
	* math/libm.map: Add fma, fmaf, fmal, nextafterx, nextafterxf,
	nextafterxl, scalbln, scalblnf, scalblnl, lrintf, lrintl, llrintf,
	llrintl, lroundf, lroundl, llroundf, and llroundl.
	* math/math.h: Document new platform specific macros from mathdef.h.
	Remove declaration of lrint, llrint, lround, and llround.
	* math/test-double.c: Define TEST_DOUBLE.
	* math/test-idouble.c: Likewise.
	* math/test-float.c: Define TEST_FLOAT.
	* math/test-ifloat.c: Likewise.
	* math/tgmath.h: New file.
	* math/bits/mathcalls.h: Add nextafterx, scalbln, fma, lrint, llrint,
	lround, and llround.
	Change second argument of scalbn to `int'.
	* sysdeps/libm-ieee754/s_fma.S: New file.
	* sysdeps/libm-ieee754/s_fmaf.S: New file.
	* sysdeps/libm-ieee754/s_fmal.S: New file.
	* sysdeps/libm-i387/s_fma.S: New file.
	* sysdeps/libm-i387/s_fmaf.S: New file.
	* sysdeps/libm-i387/s_fmal.S: New file.
	* sysdeps/libm-i387/s_llrint.S: Change to take double argument.
	* sysdeps/libm-i387/s_lrint.S: Likewise.
	* sysdeps/libm-i387/s_llrintf.S: New file.
	* sysdeps/libm-i387/s_llrintl.S: New file.
	* sysdeps/libm-i387/s_lrintf.S: New file.
	* sysdeps/libm-i387/s_lrintl.S: New file.
	* sysdeps/libm-ieee754/s_llrint.c: Remove version which works on
	80bit double.
	* sysdeps/libm-ieee754/s_lrint.c: Likewise.
	* sysdeps/libm-ieee754/s_llrintf.S: New file.
	* sysdeps/libm-ieee754/s_llrintl.S: New file.
	* sysdeps/libm-ieee754/s_lrintf.S: New file.
	* sysdeps/libm-ieee754/s_lrintl.S: New file.
	* sysdeps/libm-i387/s_scalbln.c: New file.  Empty file.
	* sysdeps/libm-i387/s_scalblnf.c: New file.  Empty file.
	* sysdeps/libm-i387/s_scalblnl.c: New file.  Empty file.
	* sysdeps/libm-i387/s_scalbn.c: Add scalbln as alias.
	* sysdeps/libm-i387/s_scalbnf.c: Add scalblnf as alias.
	* sysdeps/libm-i387/s_scalbnl.c: Add scalblnl as alias.
	* sysdeps/libm-ieee754/s_llround.c: Remove version which works on
	80bit double.
	* sysdeps/libm-ieee754/s_lround.c: Likewise.
	* sysdeps/libm-ieee754/s_llroundf.c: Likewise.
	* sysdeps/libm-ieee754/s_llroundl.c: Likewise.
	* sysdeps/libm-ieee754/s_lroundf.c: Likewise.
	* sysdeps/libm-ieee754/s_lroundl.c: Likewise.
	* sysdeps/libm-ieee754/s_nextafterl.c: Add alias fo nextafterxl.
	* sysdeps/libm-ieee754/s_nextafterx.c: New file.
	* sysdeps/libm-ieee754/s_nextafterxf.c: New file.
	* sysdeps/libm-ieee754/s_nextafterxl.c: New file.
	* sysdeps/libm-ieee754/s_scalbln.c: New file.
	* sysdeps/libm-ieee754/s_scalblnf.c: New file.
	* sysdeps/libm-ieee754/s_scalblnl.c: New file.
	* sysdeps/libm-ieee754/s_scalbn.c: Change to take `int' as second arg.
	* sysdeps/libm-ieee754/s_scalbnf.c: Likewise.
	* sysdeps/libm-ieee754/s_scalbnl.c: Likewise.

	* stdlib/stdlib.h: Protect declarations of __strto*l_internal functions
	by #ifdefs since they are duplicated in inttypes.h.
	* sysdeps/wordsize-32/inttypes.h: Add definition of strtoimax and
	strtoumax plus needed declarations.

	* sysdeps/generic/confname.h (_SC_AIO_LISTIO_MAX): Fix typo.

1997-10-09  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* locale/programs/locfile.c (locfile_read): Correct while loop.

	* db2/makedb.c (main): Add missing parameter for error output.
	(process_input): Likewise.

	* resolv/gethnamaddr.c (getanswer): Rewrite a bit to avoid warning.

1997-10-12 05:05  Ulrich Drepper  <drepper@cygnus.com>

	* libc-map: Add __bzero, __mempcpy.

1997-10-10 18:51  David S. Miller  <davem@tanya.rutgers.edu>

	* sysdeps/unix/sysv/linux/sparc/bits/ioctls.h: Remove dependencies
	on kernel_termios.h

1997-10-09  10:24  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	Add the changes from the Solaris 2.6 header files, use the new public
	defines/functions.
	* nis/nis_addmember.c: Updated.
	* nis/nis_checkpoint.c: Updated.
	* nis/nis_creategroup.c: updated.
	* nis/nis_destroygroup.c: Updated.
	* nis/nis_getservlist.c: Updated.
	* nis/nis_ismember.c: Updated.
	* nis/nis_lookup.c: Updated.
	* nis/nis_modify.c: Updated.
	* nis/nis_ping.c: Updated.
	* nis/nis_print.c: Updated.
	* nis/nis_print_group_entry.c: Updated.
	* nis/nis_remove.c: Updated.
	* nis/nis_removemember.c: Updated.
	* nis/nis_xdr.c: Updated.
	* nis/nss_nisplus/nisplus-alias.c: Updated.
	* nis/nss_nisplus/nisplus-ethers.c: Updated.
	* nis/nss_nisplus/nisplus-hosts.c: Updated.
	* nis/nss_nisplus/nisplus-network.c: Updated.
	* nis/nss_nisplus/nisplus-parser.c: Updated.
	* nis/nss_nisplus/nisplus-proto.c: Updated.
	* nis/nss_nisplus/nisplus-rpc.c: Updated.
	* nis/nss_nisplus/nisplus-service.c: Updated.
	* nis/rpcsvc/nis.h: Updated.
	* nis/rpcsvc/nis.x: Updated.
	* nis/rpcsvc/nis_object.x: Updated.
	* nis/rpcsvc/nis_tags.h: Updated.
	* nis/rpcsvc/nislib.h: Updated.

	* nis/lckcache.c: Removed, since Sun has dropped the directory
	signatures.  The old cache version is now a security risk and not
	longer supported by Sun.
	* nis/nis_cache.c: Likewise.
	* nis/rpcsvc/nis_cache.h: Likewise.
	* nis/rpcsvc/nis_cache.x: Likewise.

	* nis/nis_call.c: Remove calls to the cache functions.

	* nis/libnsl.map: Remove cache and depending functions.
	* nis/nis_intern.h: Likewise.

	* nis/nis_add.c: Remove #include <rpcsvc/nislib.h>.
	* nis/nis_domain_of.c: Likewise.
	* nis/nis_domain_of_r.c: Likewise.
	* nis/nis_error.c: Likewise.
	* nis/nis_file.c: Likewise.
	* nis/nis_local_names.c: Likewise.
	* nis/nis_mkdir.c: Likewise.
	* nis/nis_rmdir.c: Likewise.
	* nis/nis_subr.c: Likewise.
	* nis/nis_verifygroup.c: Likewise.

	* nis/nis_clone.c: Removed, replaced by ...
	* nis/nis_clone_dir.c: New.
	* nis/nis_clone_obj.c: New.
	* nis/nis_clone_res.c: New.
	* nis/nis_table.c: Fixed bugs shown through the new clone functions.

	* nis/nis_defaults.c: Fixed a lot of race conditions.

	* nis/nis_free.c: Rewritten.

	* sunrpc/auth_des.c: Fix use of free'ed pointer.

	* nis/Makefile (libnsl-routines): Remove nis_clone, nis_cache and
	lckcache.  Add nis_clone_dir, nis_clone_obj, and nis_clone_res.

1997-10-09  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* wctype/test_wctype.c (TEST): Add parens to avoid ambiguity.

1997-10-08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* include/features.h: Don't crash if _XOPEN_SOURCE is defined to
	be empty.

1997-10-09 05:54  Ulrich Drepper  <drepper@cygnus.com>

	* nss/digits_dots.c: Place `result' in resbuf and not in `buffer'.
	* nss/getXXbyYY_r.c: Make sure digits_dots.c sees `resbuf' as
	struct and not a pointer.  Little optimizations.

1997-10-09 05:00  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/stub/getenv.c: Remove unused file.
	* sysdeps/stub/lxstat.c: Likewise.
	* sysdeps/stub/morecore.c: Likewise.
	* sysdeps/stub/putenv.c: Likewise.
	* sysdeps/stub/sbrk.c: Likewise.
	* sysdeps/stub/setenv.c: Likewise.
	* sysdeps/stub/sysd-stdio.c: Likewise.
	* sysdeps/stub/sysdep.h: Likewise.
	Reported by Zack Weinberg <zack@rabi.phys.columbia.edu>.

1997-10-09 04:58  Ulrich Drepper  <drepper@cygnus.com>

	* configure.in: Add __bzero definition to DWARF2 unwind test.
	Reported by David S. Miller <davem@caip.rutgers.edu>.

1997-10-07  Paul Eggert  <eggert@twinsun.com>

	* intl/loadmsgcat.c (_nl_load_domain):
	Fix &&/|| typo when checking file size.
	Check for overflow when stuffing off_t into size_t.

1997-10-07 18:11  Ulrich Drepper  <drepper@cygnus.com>

	* time/africa: Update from tzdata1997i.

1997-10-07  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* posix/globtest.sh: Add arguments for name of dynamic linker and
	call dynamic linker to execute globtest.

	* posix/Makefile (tests): Supply arguments to globtest.sh.

1997-10-07  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* nis/rpcsvc/ypupd.h: Add missing __END_DECLS.

1997-10-03  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libc.map: Add mempcpy, prctl.

1997-09-30  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/generic/memcmp.c: Avoid warnings.
	* sysdeps/generic/memset.c: Likewise.
	* sysdeps/generic/strchr.c: Likewise.
	* sysdeps/generic/strlen.c: Likewise.

1997-09-29  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* malloc/Makefile ($(objpfx)mtrace): Fix typo.

1997-09-29  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/dl-machine.h (elf_machine_rela): Fix last change.
	The R_68K_GLOB_DAT and R_68K_JMP_SLOT relocations really ignore
	the addend, Richard.
	(elf_machine_fixup_plt): Don't add the addend.
	(elf_machine_plt_value): New function.

	* sysdeps/alpha/dl-machine.h (elf_machine_plt_value): New
	function.
	* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_plt_value): New
	function.
	* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_plt_value): New
	function.
	* sysdeps/powerpc/dl-machine.h (elf_machine_plt_value): New
	function.
	* sysdeps/i386/dl-machine.h (elf_machine_plt_value): New
	function.

	* elf/dl-runtime.c (fixup, profile_fixup): Don't add in the
	addend, instead let the machine dependent setup decide.

1997-09-20  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/m68020/bits/string.h: New file.

1997-10-07 04:27  Richard Henderson  <rth@cygnus.com>

	* Makeconfig (+includes): Add -I$(objpfx).

	* stdlib/longlong.h [__sparc__]: Prototype __udiv_qrnnd.

	* sysdeps/alpha/setjmp.S: __setjmp is the same as _setjmp.  Make
	the former a strong symbol and the later a weak alias.
	* sysdeps/sparc/sparc32/setjmp.S: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S: Likewise.

1997-10-06 21:01  David S. Miller  <davem@tanya.rutgers.edu>

	* sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h: Make ino_t
	64-bits.
	* sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h: Make st_ino
	member 64-bits as well, to match the kernel.

1997-10-06 19:35  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/sparc/sparc64/sub_n.S: Fix typo.
	Patch by Jakub Jelinek <jj@sunsite.ms.mff.cuni.cz>.

1997-10-06 01:09  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* time/README: Correct list of files from tzcode package.  Add
	contact information for tzcode/tzdata maintainers.  Correct
	spelling of author's name.  Compact lists.

1997-10-06 01:48  Ulrich Drepper  <drepper@cygnus.com>

	* malloc/malloc.h: Remove hook definition without caller argument.
	* malloc/malloc.c: Likewise.

	* string/tester.c: Correct strsep test.

	* string/bits/string2.h: Define __string2_1bptr_p and use it.
	Patch by David S. Miller <davem@tanya.rutgers.edu>.

	* math/Makefile (routines): Add s_clog10.
	* math/libm-test.c: Add test for clog10.
	* math/libm.map: Add clog10{,f,l}.
	* math/bits/cmathcalls.h [__USE_GNU]: Add clog10.
	* sysdeps/libm-ieee754/s_clog10.c: New file.
	* sysdeps/libm-ieee754/s_clog10f.c: New file.
	* sysdeps/libm-ieee754/s_clog10l.c: New file.
	* manual/math.texi: Describe clog10.

	* config.h.in: Add USE_REGPARMS and define internal_function based on
	this.
	* configure.in: Define USE_REGPARMS for ix86 machines.
	* gmon/gmon.c: Mark write_hist, write_call_graph and write_bb_counts
	as internal functions.
	* inet/getnameinfo.c: Likewise for  nrl_domainname.
	* inet/getnetgrent_r.c: Likewise for __internal_setnetgrent_reuse.
	* inet/rcmd.c: Likewise for __icheckhost.
	* intl/dcgettext.c: Likewise for category_to_name and
	guess_category_value.
	* intl/localealias.c: Likewise for read_alias_file.
	* io/fts.c: Likewise for fts_alloc, fts_build, fts_lfree,
	fts_maxarglen, fts_padjust, fts_palloc, fts_sort, and fts_stat.
	* libio/genops.c: Likewise for save_for_backup.
	* malloc/malloc.c (chunk_free, chunk_alloc, chunk_realloc, chunk_align,
	main_trim, heap_trim): Likewise.
	* malloc/mtrace.c (tr_where): Likewise.
	* misc/fstab.c (mnt2fs): Likewise.
	* misc/getttyent.c (skip, value): Likewise.
	* misc/syslog.c (openlog_internal): Likewise.
	* misc/tsearch.c (trecurse, tdestroy_internal): Likewise.
	* nss/nsswitch.c (nss_lookup_function, nss_parse_file, nss_getline,
	nss_parse_service_list, nss_new_service): Likewise.
	* posix/wordexp.c (parse_dollars, parse_backtick, eval_expr): Likewise.
	* resolv/inet_ntop.c (inet_ntop4, inet_ntop6): Likewise.
	* resolv/inet_pton.c (inet_pton4, inet_pton6): Likewise.
	* resolv/res_init.c (res_setoptions): Likewise.
	* stdio-common/printf_fp.c (group_number): Likewise.
	* stdio-common/vfprintf.c (buffered_vfprintf, group_number): Likewise.
	* stdlib/fmtmsg.c (internal_addseverity): Likewise.
	* sunrpc/auth_des.c (synchronize): Likewise.
	* sunrpc/auth_unix.c (marshal_new_auth): Likewise.
	* sunrpc/clnt_perr.c (auth_errmsg): Likewise.
	* sunrpc/key_call.c (key_call): Likewise.
	* sunprc/pmap_rmt.c (getbroadcastnets): Likewise.
	* sunrpc/svc_tcp.c (makefd_xprt): Likewise.
	* sunrpc/svcauth_des.c (cache_init, cache_spot, cache_ref, invalidate):
	Likewise.
	* sunrpc/xdr_rec.c (fix_buf_size, skip_input_bytes, flush_out,
	set_input_fragment, get_input_bytes): Likewise.
	* sysdeps/unix/sysv/linux/getsysstats.c (get_proc_path,
	phys_pages_info): Likewise.
	* sysdeps/unix/sysv/linux/if_index.c (opensock): Likewise.
	* sysdeps/unix/sysv/linux/poll.c (__emulate_poll): Likewise.
	* sysdeps/unix/sysv/linux/readv.c (__atomic_readv_replacement):
	Likewise.
	* sysdeps/unix/sysv/linux/readv.c (__atomic_writev_replacement):
	Likewise.
	* time/strptime.c (strptime_internal): Likewise.
	* time/tzfile.c (find_transition, compute_tzname_max): Likewise.
	* time/tzset.c (compute_change, tz_compute, tzset_internal): Likewise.

	* libc.map: Remove _libio_using_thunks, add _fp_hw and _dl_addr.

	* ctype/ctype.h: Pretty print.
	* grp/grp.h: Likewise.
	* include/libc-symbols.h: Likewise.
	* include/limits.h: Likewise.
	* include/values.h: Likewise.
	* io/fcntl.h: Likewise.
	* io/sys/stat.h: Likewise.
	* libio/stdio.h: Likewise.
	* malloc/malloc.h: Likewise.
	* misc/err.h: Likewise.
	* misc/regexp.h: Likewise.
	* misc/sys/cdefs.h: Likewise.
	* misc/sys/file.h: Likewise.
	* posix/sys/utsname.h: Likewise.
	* posix/sys/wait.h: Likewise.
	* pwd/pwd.h: Likewise.
	* resolv/netdb.h: Likewise.
	* signal/signal.h: Likewise.
	* stdlib/stdlib.h: Likewise.
	* string/endian.h: Likewise.
	* string/memory.h: Likewise.
	* sysdeps/mach/hurd/bits/fcntl.h: Likewise.
	* sysdeps/mach/hurd/sys/param.h: Likewise.
	* sysdeps/unix/sysv/linux/sys/param.h: Likewise.
	* termios/termios.h: Likewise.
	* wcsmbs/wchar.h: Likewise.
	* wctype/wctype.h: Likewise.

	* sysdeps/unix/bsd/bsd4.4/wait3.c: Use __WAIT_STATUS in definition.

	Implement Large File Support API.
	* include/features.h: Add suuport for _LARGEFILE_SOURCE,
	_LARGEFILE64_SOURCE, and _FILE_OFFSET_BITS.
	* libc.map: Add new functions for LFS.
	* dirent/Makefile (routines): Add readdir64 and readdir64_r.
	* dirent/dirent.h: Update readdir prototype for LFS and add new
	prototypes for above functions.
	* io/Makefile (routines): Add xstat64, fxstat64, lxstat64,
	statfs64, fstatfs64, lstat64, open64, lseek64, creat64, and ftw64.
	* io/creat64.c: New file.
	* io/fstat64.c: New file.
	* io/lstat64.c: New file.
	* io/stat64.c: New file.
	* io/ftw64.c: New file.
	* io/ftw.c: Rewrite to allow easy definition of ftw64.
	* io/ftw.h: Add LFS interface.
	* io/fcntl.h: Likewise.
	* io/sys/stat.h: Likewise.
	* io/sys/statfs.h: Likewise.
	* libio/Makefile (routines): Add iofgetpos64, iofopen64, iofsetpos64,
	freopen64, fseeko64, and ftello64.
	* libcio/fseeko64.c: New file.
	* libio/ftello64.c: New file.
	* libio/iofgetpos64.c: New file.
	* libio/iofopen64.c: New file.
	* libio/iofsetpos64.c: New file.
	* libio/fileops.c (_IO_file_fopen): Change to use _IO_off64_t.
	(_IO_file_attach): Likewise.
	(_IO_do_write): Likewise.
	(_IO_file_sync): Likewise.
	(_IO_file_seek): Likewise.
	(_IO_file_seekoff): Likewise.  Use _G_stat64.
	(_IO_file_fopen64): New function.
	(_IO_file_jumps): Initialize showmanyc and imbue.
	* libio/genops.c (_IO_default_seekpos): Change to use _IO_fpos64_t.
	(_IO_default_seekoff): Likewise.
	(_IO_default_seek): Likewise.
	(_IO_default_showmanyc, _IO_default_imbue): New functions.
	* libio/iofopncook.c (_IO_cookie_seek): Change to use _IO_off64_t.
	* libio/iolibio.h: Add prototypes for LFS functions.
	* libio/ioseekoff.c: Change to use _IO_fpos64_t.
	* libio/ioseekpos.c: Likewise.
	* libio/libio.h: Define _IO_fpos64_t and _IO_off64_t.
	(_IO_FILE): Move _offset field to end and change type to _IO_off64_t.
	(_IO_seekoff, _IO_seekpos): Change prototype.
	* libio/libioP.h (_IO_seekoff_t, _IO_seekpos_t, _IO_seek_t): Change
	to use _IO_off64_t.
	Change prototypes for function from the *ops.c files.
	* libio/stdio.h: Add LFS interface definition.
	* libio/strops.c (_IO_str_seekoff): Change to use _IO_fpos64_t.
	* posix/Makefile (routines): Add pread64 and pwrite64.
	* posix/confstr.c: Handle _CS_LFS* requests.
	* posix/getconf.c: Handle LFS* requests.
	* sysdeps/generic/confname.h: Add _CS_LFS* constants.
	* posix/unistd.h: Document _LFS64_LARGEFILE and _LFS64_STDIO.
	Define off_t and off64_t appropriately.  Change prototypes of
	LFS functions.
	* posix/sys/types.h: Add LFS types.
	* resources/Makefile (routines): Add getrlimit64 and setlimit64.
	* resource/sys/resource.h: Change prototypes of LFS functions.
	* stdio-common/Makefile (routines): Add tmpfile64.
	* stdio-common/tmpfile64.c: New file.
	* sysdeps/generic/_G_config.h: Define _G_fpos64_t and _G_off64_t.
	Define _G_OPEN64, _G_LSEEK64, _G_FSTAT64.
	* sysdeps/unix/sysv/linux/_G_config.h: Likewise.
	* sysdeps/generic/bits/resource.h: Add LFS definitions.
	* sysdeps/unix/bsd/sun/sunos4/bits/resource.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/resource.h: Likewise.
	* sysdeps/generic/statfs.h: Use __fsblkcnt_t for some of the fields.
	* sysdeps/unix/sysv/linux/bits/statfs.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/statfs.h: Likewise.
	* sysdeps/generic/types.h: Define LFS types.
	* sysdeps/unix/sysv/linux/alpha/bits/types.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/types.h: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h: Likewise.
	* sysdeps/generic/sys/mman.h: Add LFS definitions.
	* sysdeps/unix/sysv/linux/sys/mman.h: Likewise.
	* sysdeps/generic/mach/hurd/bits/fcntl.h: Add flock LFS extensions.
	* sysdeps/unix/bsd/bits/fcntl.h: Likewise.
	* sysdeps/unix/sysv/linux/alpha/bits/fcntl.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/fcntl.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/fcntl.h: Likewise.
	* sysdeps/generic/mach/hurd/bits/stat.h: Add stat LFS extensions.
	* sysdeps/unix/bsd/bits/stat.h: Likewise.
	* sysdeps/unix/bsd/osf/alpha/bits/stat.h: Likewise.
	* sysdeps/unix/sysv/linux/alpha/bits/stat.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/stat.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/stat.h: Likewise.
	* sysdeps/unix/sysv/linux/sparc/bits/stat.h: Likewise.
	* sysdeps/unix/sysv/sysv4/i386/bits/stat.h: Likewise.
	* sysdeps/unix/sysv/sysv4/solaris2/bits/stat.h: Likewise.
	* sysdeps/posix/open64.c: New file.
	* sysdeps/stub/fstatfs64.c: New file.
	* sysdeps/stub/fxstat64.c: New file.
	* sysdeps/stub/getrlimit64.c: New file.
	* sysdeps/stub/lseek64.c: New file.
	* sysdeps/stub/lxstat64.c: New file.
	* sysdeps/stub/open64.c: New file.
	* sysdeps/stub/pread64.c: New file.
	* sysdeps/stub/pwrite64.c: New file.
	* sysdeps/stub/readdir64.c: New file.
	* sysdeps/stub/readdir64_r.c: New file.
	* sysdeps/stub/setrlimit64.c: New file.
	* sysdeps/stub/statfs64.c: New file.
	* sysdeps/stub/xstat64.c: New file.
	* sysdeps/unix/sysv/linux/llseek.c: Define as __llseek and make
	llseek and lseek64 weak aliases.
	* sysdeps/unix/sysv/linux/lseek64.c: New file.  Empty.
	* sysdeps/unix/sysv/linux/alpha/bits/dirent.h: New file.
	* sysdeps/unix/sysv/linux/bits/dirent.h: Add LFS definitions.

	* sysdeps/posix/tempname.c: Add extra argument to trigger use of
	open64.
	* sysdeps/stub/tempname.c: Likewise.
	* stdio-common/tempnam.c: Call __stdio_gen_tempname with extra
	argument.
	* stdio-common/tmpfile.c: Likewise.
	* stdio-common/tmpnam.c: Likewise.
	* stdio-common/tmpnam_r.c: Likewise.

	* libio/libioP.h: Add definition ofr showmanyc and imbue callbacks.
	* libio/fileops.c (_IO_file_jumps): Initialize showmanyc and imbue.
	* libio/iofopncook.c (_IO_cookie_jumps): Likewise.
	* libio/iopopen.c (_IO_proc_jumps): Likewise.
	* libio/memstream.c (_IO_mem_jumps): Likewise.
	* libio/obprintf.c (_IO_obstack_jumps): Likewise.
	* libio/vsnprintf.c (_IO_strn_jumps): Likewise.
	* libio/strops.c (_IO_str_jumps): Likewise.

	* manual/arith.texi: Add a few words why cabs should be used.
	* manual/llio.texi: Describe sync, fsync, fdatasync.
	Tell about cleanup handlers & fcntl,lseek,write,read,close,open.
	* manual/process.texi: Tell about cleanup handlers & system,waitpid,
	wait.
	* manual/signal.texi: Likewise for pause.
	* manual/terminal.texi: Likewise for tcdrain.
	* manual/time.texi: Document nanosleep.

	* posix/exevp.c: Don't use nested function.

	* stdlib/ucontext.h: New file.
	* sysdeps/i386/sys/ucontext.h: New file.  SysV/i386 API definitions.

	* sunrpc/xcrypt.c (hexval): Make a macro for efficiency.

	* sysdeps/i386/setjmp.h: Make `here` label local.

	* sysdeps/i386/elf/start.S: Define _fp_hw "variable".

	* sysdeps/stub/fstatfs.c: Correct warning.
	* sysdeps/stub/fxstat.c: Likewise.
	* sysdeps/stub/lxstat.c: Likewise.

	* sysdeps/unix/sysv/i386/i686/time.S: New file.

1997-10-03 20:56  Jason Merrill  <jason@yorick.cygnus.com>

	* malloc/obstack.h (obstack_empty_p): New macro.

1997-10-04 17:41  Philip Blundell  <Philip.Blundell@pobox.com>

	* inet/getnameinfo.c (getnameinfo): Remove spurious `#if INET6'.

1997-09-30  Zack Weinberg <zack@rabi.phys.columbia.edu>

	* maint.texi: Add copyright terms for libdb (Sleepycat, Harvard).
	Document new --with-binutils switch; delete reference to
	--with-gnu-as, --with-gnu-ld, --with-gnu-binutils.
	Add to description of --without-fp: a kernel FPU emulator
	is adequate (from FAQ)
	* INSTALL: Regenerated.

1997-09-30 17:29  Richard Henderson  <rth@cygnus.com>

	* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Move
	_dl_hwcap declaration to ...
	(elf_machine_fixup_plt): ... here.
1997-10-12 04:05:44 +00:00

834 lines
22 KiB
C

/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc.
This file is part of the GNU IO Library.
Written by Per Bothner <bothner@cygnus.com>.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2, or (at
your option) any later version.
This 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this library; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
As a special exception, if you link this library with files
compiled with a GNU compiler to produce an executable, this does
not cause the resulting executable to be covered by the GNU General
Public License. This exception does not however invalidate any
other reasons why the executable file might be covered by the GNU
General Public License. */
#ifndef _POSIX_SOURCE
# define _POSIX_SOURCE
#endif
#include "libioP.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#ifndef errno
extern int errno;
#endif
#ifndef __set_errno
# define __set_errno(Val) errno = (Val)
#endif
#ifdef _LIBC
# define open(Name, Flags, Prot) __open (Name, Flags, Prot)
# define close(FD) __close (FD)
# define fstat(FD, Statbuf) __fstat (FD, Statbuf)
# define lseek(FD, Offset, Whence) __lseek (FD, Offset, Whence)
# define read(FD, Buf, NBytes) __read (FD, Buf, NBytes)
# define write(FD, Buf, NBytes) __write (FD, Buf, NBytes)
#endif
/* An fstream can be in at most one of put mode, get mode, or putback mode.
Putback mode is a variant of get mode.
In a filebuf, there is only one current position, instead of two
separate get and put pointers. In get mode, the current position
is that of gptr(); in put mode that of pptr().
The position in the buffer that corresponds to the position
in external file system is normally _IO_read_end, except in putback
mode, when it is _IO_save_end.
If the field _fb._offset is >= 0, it gives the offset in
the file as a whole corresponding to eGptr(). (?)
PUT MODE:
If a filebuf is in put mode, then all of _IO_read_ptr, _IO_read_end,
and _IO_read_base are equal to each other. These are usually equal
to _IO_buf_base, though not necessarily if we have switched from
get mode to put mode. (The reason is to maintain the invariant
that _IO_read_end corresponds to the external file position.)
_IO_write_base is non-NULL and usually equal to _IO_base_base.
We also have _IO_write_end == _IO_buf_end, but only in fully buffered mode.
The un-flushed character are those between _IO_write_base and _IO_write_ptr.
GET MODE:
If a filebuf is in get or putback mode, eback() != egptr().
In get mode, the unread characters are between gptr() and egptr().
The OS file position corresponds to that of egptr().
PUTBACK MODE:
Putback mode is used to remember "excess" characters that have
been sputbackc'd in a separate putback buffer.
In putback mode, the get buffer points to the special putback buffer.
The unread characters are the characters between gptr() and egptr()
in the putback buffer, as well as the area between save_gptr()
and save_egptr(), which point into the original reserve buffer.
(The pointers save_gptr() and save_egptr() are the values
of gptr() and egptr() at the time putback mode was entered.)
The OS position corresponds to that of save_egptr().
LINE BUFFERED OUTPUT:
During line buffered output, _IO_write_base==base() && epptr()==base().
However, ptr() may be anywhere between base() and ebuf().
This forces a call to filebuf::overflow(int C) on every put.
If there is more space in the buffer, and C is not a '\n',
then C is inserted, and pptr() incremented.
UNBUFFERED STREAMS:
If a filebuf is unbuffered(), the _shortbuf[1] is used as the buffer.
*/
#define CLOSED_FILEBUF_FLAGS \
(_IO_IS_FILEBUF+_IO_NO_READS+_IO_NO_WRITES+_IO_TIED_PUT_GET)
void
_IO_file_init (fp)
_IO_FILE *fp;
{
/* POSIX.1 allows another file handle to be used to change the position
of our file descriptor. Hence we actually don't know the actual
position before we do the first fseek (and until a following fflush). */
fp->_offset = _IO_pos_BAD;
fp->_IO_file_flags |= CLOSED_FILEBUF_FLAGS;
_IO_link_in(fp);
fp->_fileno = -1;
}
int
_IO_file_close_it (fp)
_IO_FILE *fp;
{
int write_status, close_status;
if (!_IO_file_is_open (fp))
return EOF;
write_status = _IO_do_flush (fp);
_IO_unsave_markers(fp);
close_status = _IO_SYSCLOSE (fp);
/* Free buffer. */
_IO_setb (fp, NULL, NULL, 0);
_IO_setg (fp, NULL, NULL, NULL);
_IO_setp (fp, NULL, NULL);
_IO_un_link (fp);
fp->_flags = _IO_MAGIC|CLOSED_FILEBUF_FLAGS;
fp->_fileno = EOF;
fp->_offset = _IO_pos_BAD;
return close_status ? close_status : write_status;
}
void
_IO_file_finish (fp, dummy)
_IO_FILE *fp;
int dummy;
{
if (_IO_file_is_open (fp))
{
_IO_do_flush (fp);
if (!(fp->_flags & _IO_DELETE_DONT_CLOSE))
_IO_SYSCLOSE (fp);
}
_IO_default_finish (fp, 0);
}
_IO_FILE *
_IO_file_fopen (fp, filename, mode, is32not64)
_IO_FILE *fp;
const char *filename;
const char *mode;
int is32not64;
{
int oflags = 0, omode;
int read_write, fdesc;
int oprot = 0666;
if (_IO_file_is_open (fp))
return 0;
switch (*mode++)
{
case 'r':
omode = O_RDONLY;
read_write = _IO_NO_WRITES;
break;
case 'w':
omode = O_WRONLY;
oflags = O_CREAT|O_TRUNC;
read_write = _IO_NO_READS;
break;
case 'a':
omode = O_WRONLY;
oflags = O_CREAT|O_APPEND;
read_write = _IO_NO_READS|_IO_IS_APPENDING;
break;
default:
__set_errno (EINVAL);
return NULL;
}
if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+'))
{
omode = O_RDWR;
read_write &= _IO_IS_APPENDING;
}
#ifdef _G_OPEN64
fdesc = (is32not64
? open (filename, omode|oflags, oprot)
: _G_OPEN64 (filename, omode|oflags, oprot));
#else
fdesc = open (filename, omode|oflags, oprot);
#endif
if (fdesc < 0)
return NULL;
fp->_fileno = fdesc;
_IO_mask_flags (fp, read_write,_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
if (read_write & _IO_IS_APPENDING)
if (_IO_SEEKOFF (fp, (_IO_off64_t)0, _IO_seek_end, _IOS_INPUT|_IOS_OUTPUT)
== _IO_pos_BAD && errno != ESPIPE)
return NULL;
_IO_link_in (fp);
return fp;
}
_IO_FILE *
_IO_file_attach (fp, fd)
_IO_FILE *fp;
int fd;
{
if (_IO_file_is_open (fp))
return NULL;
fp->_fileno = fd;
fp->_flags &= ~(_IO_NO_READS+_IO_NO_WRITES);
fp->_flags |= _IO_DELETE_DONT_CLOSE;
/* Get the current position of the file. */
/* We have to do that since that may be junk. */
fp->_offset = _IO_pos_BAD;
if (_IO_SEEKOFF (fp, (_IO_off64_t)0, _IO_seek_cur, _IOS_INPUT|_IOS_OUTPUT)
== _IO_pos_BAD && errno != ESPIPE)
return NULL;
return fp;
}
_IO_FILE *
_IO_file_setbuf (fp, p, len)
_IO_FILE *fp;
char *p;
_IO_ssize_t len;
{
if (_IO_default_setbuf (fp, p, len) == NULL)
return NULL;
fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end
= fp->_IO_buf_base;
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
return fp;
}
/* Write TO_DO bytes from DATA to FP.
Then mark FP as having empty buffers. */
int
_IO_do_write (fp, data, to_do)
_IO_FILE *fp;
const char *data;
_IO_size_t to_do;
{
_IO_size_t count;
if (to_do == 0)
return 0;
if (fp->_flags & _IO_IS_APPENDING)
/* On a system without a proper O_APPEND implementation,
you would need to sys_seek(0, SEEK_END) here, but is
is not needed nor desirable for Unix- or Posix-like systems.
Instead, just indicate that offset (before and after) is
unpredictable. */
fp->_offset = _IO_pos_BAD;
else if (fp->_IO_read_end != fp->_IO_write_base)
{
_IO_fpos64_t new_pos
= _IO_SYSSEEK (fp, fp->_IO_write_base - fp->_IO_read_end, 1);
if (new_pos == _IO_pos_BAD)
return EOF;
fp->_offset = new_pos;
}
count = _IO_SYSWRITE (fp, data, to_do);
if (fp->_cur_column)
fp->_cur_column = _IO_adjust_column (fp->_cur_column - 1, data, to_do) + 1;
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_buf_base;
fp->_IO_write_end = ((fp->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED))
? fp->_IO_buf_base : fp->_IO_buf_end);
return count != to_do ? EOF : 0;
}
int
_IO_file_underflow (fp)
_IO_FILE *fp;
{
_IO_ssize_t count;
#if 0
/* SysV does not make this test; take it out for compatibility */
if (fp->_flags & _IO_EOF_SEEN)
return (EOF);
#endif
if (fp->_flags & _IO_NO_READS)
{
__set_errno (EBADF);
return EOF;
}
if (fp->_IO_read_ptr < fp->_IO_read_end)
return *(unsigned char *) fp->_IO_read_ptr;
if (fp->_IO_buf_base == NULL)
_IO_doallocbuf (fp);
/* Flush all line buffered files before reading. */
/* FIXME This can/should be moved to genops ?? */
if (fp->_flags & (_IO_LINE_BUF|_IO_UNBUFFERED))
_IO_flush_all_linebuffered ();
_IO_switch_to_get_mode (fp);
/* This is very tricky. We have to adjust those
pointers before we call _IO_SYSREAD () since
we may longjump () out while waiting for
input. Those pointers may be screwed up. H.J. */
fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_buf_base;
fp->_IO_read_end = fp->_IO_buf_base;
fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end
= fp->_IO_buf_base;
count = _IO_SYSREAD (fp, fp->_IO_buf_base,
fp->_IO_buf_end - fp->_IO_buf_base);
if (count <= 0)
{
if (count == 0)
fp->_flags |= _IO_EOF_SEEN;
else
fp->_flags |= _IO_ERR_SEEN, count = 0;
}
fp->_IO_read_end += count;
if (count == 0)
return EOF;
if (fp->_offset != _IO_pos_BAD)
_IO_pos_adjust (fp->_offset, count);
return *(unsigned char *) fp->_IO_read_ptr;
}
int
_IO_file_overflow (f, ch)
_IO_FILE *f;
int ch;
{
if (f->_flags & _IO_NO_WRITES) /* SET ERROR */
{
f->_flags |= _IO_ERR_SEEN;
__set_errno (EBADF);
return EOF;
}
/* If currently reading or no buffer allocated. */
if ((f->_flags & _IO_CURRENTLY_PUTTING) == 0)
{
/* Allocate a buffer if needed. */
if (f->_IO_write_base == 0)
{
_IO_doallocbuf (f);
_IO_setg (f, f->_IO_buf_base, f->_IO_buf_base, f->_IO_buf_base);
}
/* Otherwise must be currently reading.
If _IO_read_ptr (and hence also _IO_read_end) is at the buffer end,
logically slide the buffer forwards one block (by setting the
read pointers to all point at the beginning of the block). This
makes room for subsequent output.
Otherwise, set the read pointers to _IO_read_end (leaving that
alone, so it can continue to correspond to the external position). */
if (f->_IO_read_ptr == f->_IO_buf_end)
f->_IO_read_end = f->_IO_read_ptr = f->_IO_buf_base;
f->_IO_write_ptr = f->_IO_read_ptr;
f->_IO_write_base = f->_IO_write_ptr;
f->_IO_write_end = f->_IO_buf_end;
f->_IO_read_base = f->_IO_read_ptr = f->_IO_read_end;
if (f->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED))
f->_IO_write_end = f->_IO_write_ptr;
f->_flags |= _IO_CURRENTLY_PUTTING;
}
if (ch == EOF)
return _IO_do_flush (f);
if (f->_IO_write_ptr == f->_IO_buf_end ) /* Buffer is really full */
if (_IO_do_flush (f) == EOF)
return EOF;
*f->_IO_write_ptr++ = ch;
if ((f->_flags & _IO_UNBUFFERED)
|| ((f->_flags & _IO_LINE_BUF) && ch == '\n'))
if (_IO_do_flush (f) == EOF)
return EOF;
return (unsigned char) ch;
}
int
_IO_file_sync (fp)
_IO_FILE *fp;
{
_IO_size_t delta;
int retval = 0;
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
_IO_flockfile (fp);
/* char* ptr = cur_ptr(); */
if (fp->_IO_write_ptr > fp->_IO_write_base)
if (_IO_do_flush(fp)) return EOF;
delta = fp->_IO_read_ptr - fp->_IO_read_end;
if (delta != 0)
{
#ifdef TODO
if (_IO_in_backup (fp))
delta -= eGptr () - Gbase ();
#endif
_IO_off64_t new_pos = _IO_SYSSEEK (fp, delta, 1);
if (new_pos != (_IO_off64_t) EOF)
fp->_IO_read_end = fp->_IO_read_ptr;
#ifdef ESPIPE
else if (errno == ESPIPE)
; /* Ignore error from unseekable devices. */
#endif
else
retval = EOF;
}
if (retval != EOF)
fp->_offset = _IO_pos_BAD;
/* FIXME: Cleanup - can this be shared? */
/* setg(base(), ptr, ptr); */
_IO_cleanup_region_end (1);
return retval;
}
_IO_fpos64_t
_IO_file_seekoff (fp, offset, dir, mode)
_IO_FILE *fp;
_IO_off64_t offset;
int dir;
int mode;
{
_IO_fpos64_t result;
_IO_off64_t delta, new_offset;
long count;
/* POSIX.1 8.2.3.7 says that after a call the fflush() the file
offset of the underlying file must be exact. */
int must_be_exact = (fp->_IO_read_base == fp->_IO_read_end
&& fp->_IO_write_base == fp->_IO_write_ptr);
if (mode == 0)
dir = _IO_seek_cur, offset = 0; /* Don't move any pointers. */
/* Flush unwritten characters.
(This may do an unneeded write if we seek within the buffer.
But to be able to switch to reading, we would need to set
egptr to ptr. That can't be done in the current design,
which assumes file_ptr() is eGptr. Anyway, since we probably
end up flushing when we close(), it doesn't make much difference.)
FIXME: simulate mem-papped files. */
if (fp->_IO_write_ptr > fp->_IO_write_base || _IO_in_put_mode (fp))
if (_IO_switch_to_get_mode (fp))
return EOF;
if (fp->_IO_buf_base == NULL)
{
_IO_doallocbuf (fp);
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
}
switch (dir)
{
case _IO_seek_cur:
/* Adjust for read-ahead (bytes is buffer). */
offset -= fp->_IO_read_end - fp->_IO_read_ptr;
if (fp->_offset == _IO_pos_BAD)
goto dumb;
/* Make offset absolute, assuming current pointer is file_ptr(). */
offset += _IO_pos_as_off (fp->_offset);
dir = _IO_seek_set;
break;
case _IO_seek_set:
break;
case _IO_seek_end:
{
struct _G_stat64 st;
if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))
{
offset += st.st_size;
dir = _IO_seek_set;
}
else
goto dumb;
}
}
/* At this point, dir==_IO_seek_set. */
/* If destination is within current buffer, optimize: */
if (fp->_offset != _IO_pos_BAD && fp->_IO_read_base != NULL
&& !_IO_in_backup (fp))
{
/* Offset relative to start of main get area. */
_IO_fpos64_t rel_offset = (offset - fp->_offset
+ (fp->_IO_read_end - fp->_IO_read_base));
if (rel_offset >= 0)
{
#if 0
if (_IO_in_backup (fp))
_IO_switch_to_main_get_area (fp);
#endif
if (rel_offset <= fp->_IO_read_end - fp->_IO_read_base)
{
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base + rel_offset,
fp->_IO_read_end);
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
return offset;
}
#ifdef TODO
/* If we have streammarkers, seek forward by reading ahead. */
if (_IO_have_markers (fp))
{
int to_skip = rel_offset
- (fp->_IO_read_ptr - fp->_IO_read_base);
if (ignore (to_skip) != to_skip)
goto dumb;
return offset;
}
#endif
}
#ifdef TODO
if (rel_offset < 0 && rel_offset >= Bbase () - Bptr ())
{
if (!_IO_in_backup (fp))
_IO_switch_to_backup_area (fp);
gbump (fp->_IO_read_end + rel_offset - fp->_IO_read_ptr);
return offset;
}
#endif
}
#ifdef TODO
_IO_unsave_markers (fp);
#endif
if (fp->_flags & _IO_NO_READS)
goto dumb;
/* Try to seek to a block boundary, to improve kernel page management. */
new_offset = offset & ~(fp->_IO_buf_end - fp->_IO_buf_base - 1);
delta = offset - new_offset;
if (delta > fp->_IO_buf_end - fp->_IO_buf_base)
{
new_offset = offset;
delta = 0;
}
result = _IO_SYSSEEK (fp, new_offset, 0);
if (result < 0)
return EOF;
if (delta == 0)
count = 0;
else
{
count = _IO_SYSREAD (fp, fp->_IO_buf_base,
(must_be_exact
? delta : fp->_IO_buf_end - fp->_IO_buf_base));
if (count < delta)
{
/* We weren't allowed to read, but try to seek the remainder. */
offset = count == EOF ? delta : delta-count;
dir = _IO_seek_cur;
goto dumb;
}
}
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base + delta,
fp->_IO_buf_base + count);
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
fp->_offset = result + count;
_IO_mask_flags (fp, 0, _IO_EOF_SEEN);
return offset;
dumb:
_IO_unsave_markers (fp);
result = _IO_SYSSEEK (fp, offset, dir);
if (result != EOF)
_IO_mask_flags (fp, 0, _IO_EOF_SEEN);
fp->_offset = result;
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
return result;
}
_IO_ssize_t
_IO_file_read (fp, buf, size)
_IO_FILE *fp;
void *buf;
_IO_ssize_t size;
{
return read (fp->_fileno, buf, size);
}
_IO_fpos64_t
_IO_file_seek (fp, offset, dir)
_IO_FILE *fp;
_IO_off64_t offset;
int dir;
{
#ifdef _G_LSEEK64
return _G_LSEEK64 (fp->_fileno, offset, dir);
#else
return lseek (fp->_fileno, offset, dir);
#endif
}
int
_IO_file_stat (fp, st)
_IO_FILE *fp;
void *st;
{
#ifdef _G_STAT64
return _G_FSTAT64 (fp->_fileno, (struct _G_stat64 *) st);
#else
return fstat (fp->_fileno, (struct _G_stat64 *) st);
#endif
}
int
_IO_file_close (fp)
_IO_FILE *fp;
{
return close (fp->_fileno);
}
_IO_ssize_t
_IO_file_write (f, data, n)
_IO_FILE *f;
const void *data;
_IO_ssize_t n;
{
_IO_ssize_t to_do = n;
while (to_do > 0)
{
_IO_ssize_t count = write (f->_fileno, data, to_do);
if (count == EOF)
{
f->_flags |= _IO_ERR_SEEN;
break;
}
to_do -= count;
data = (void *) ((char *) data + count);
}
n -= to_do;
if (f->_offset >= 0)
f->_offset += n;
return n;
}
_IO_size_t
_IO_file_xsputn (f, data, n)
_IO_FILE *f;
const void *data;
_IO_size_t n;
{
register const char *s = (char *) data;
_IO_size_t to_do = n;
int must_flush = 0;
_IO_size_t count;
if (n <= 0)
return 0;
/* This is an optimized implementation.
If the amount to be written straddles a block boundary
(or the filebuf is unbuffered), use sys_write directly. */
/* First figure out how much space is available in the buffer. */
count = f->_IO_write_end - f->_IO_write_ptr; /* Space available. */
if ((f->_flags & _IO_LINE_BUF) && (f->_flags & _IO_CURRENTLY_PUTTING))
{
count = f->_IO_buf_end - f->_IO_write_ptr;
if (count >= n)
{
register const char *p;
for (p = s + n; p > s; )
{
if (*--p == '\n')
{
count = p - s + 1;
must_flush = 1;
break;
}
}
}
}
/* Then fill the buffer. */
if (count > 0)
{
if (count > to_do)
count = to_do;
if (count > 20)
{
memcpy (f->_IO_write_ptr, s, count);
s += count;
}
else
{
register char *p = f->_IO_write_ptr;
register int i = (int) count;
while (--i >= 0)
*p++ = *s++;
}
f->_IO_write_ptr += count;
to_do -= count;
}
if (to_do + must_flush > 0)
{
_IO_size_t block_size, dont_write;
/* Next flush the (full) buffer. */
if (__overflow (f, EOF) == EOF)
return n - to_do;
/* Try to maintain alignment: write a whole number of blocks.
dont_write is what gets left over. */
block_size = f->_IO_buf_end - f->_IO_buf_base;
dont_write = block_size >= 128 ? to_do % block_size : 0;
count = to_do - dont_write;
if (_IO_do_write (f, s, count) == EOF)
return n - to_do;
to_do = dont_write;
/* Now write out the remainder. Normally, this will fit in the
buffer, but it's somewhat messier for line-buffered files,
so we let _IO_default_xsputn handle the general case. */
if (dont_write)
to_do -= _IO_default_xsputn (f, s+count, dont_write);
}
return n - to_do;
}
#if 0
/* Work in progress */
_IO_size_t
_IO_file_xsgetn (fp, data, n)
_IO_FILE *fp;
void *data;
_IO_size_t n;
{
register _IO_size_t more = n;
register char *s = data;
for (;;)
{
/* Data available. */
_IO_ssize_t count = fp->_IO_read_end - fp->_IO_read_ptr;
if (count > 0)
{
if (count > more)
count = more;
if (count > 20)
{
memcpy (s, fp->_IO_read_ptr, count);
s += count;
fp->_IO_read_ptr += count;
}
else if (count <= 0)
count = 0;
else
{
register char *p = fp->_IO_read_ptr;
register int i = (int) count;
while (--i >= 0)
*s++ = *p++;
fp->_IO_read_ptr = p;
}
more -= count;
}
#if 0
if (! _IO_in put_mode (fp)
&& ! _IO_have_markers (fp) && ! IO_have_backup (fp))
{
/* This is an optimization of _IO_file_underflow */
if (fp->_flags & _IO_NO_READS)
break;
/* If we're reading a lot of data, don't bother allocating
a buffer. But if we're only reading a bit, perhaps we should ??*/
if (count <= 512 && fp->_IO_buf_base == NULL)
_IO_doallocbuf (fp);
if (fp->_flags & (_IO_LINE_BUF|_IO_UNBUFFERED))
_IO_flush_all_linebuffered ();
_IO_switch_to_get_mode (fp); ???;
count = _IO_SYSREAD (fp, s, more);
if (count <= 0)
{
if (count == 0)
fp->_flags |= _IO_EOF_SEEN;
else
fp->_flags |= _IO_ERR_SEEN, count = 0;
}
s += count;
more -= count;
}
#endif
if (more == 0 || __underflow (fp) == EOF)
break;
}
return n - more;
}
#endif
struct _IO_jump_t _IO_file_jumps =
{
JUMP_INIT_DUMMY,
JUMP_INIT(finish, _IO_file_finish),
JUMP_INIT(overflow, _IO_file_overflow),
JUMP_INIT(underflow, _IO_file_underflow),
JUMP_INIT(uflow, _IO_default_uflow),
JUMP_INIT(pbackfail, _IO_default_pbackfail),
JUMP_INIT(xsputn, _IO_file_xsputn),
JUMP_INIT(xsgetn, _IO_default_xsgetn),
JUMP_INIT(seekoff, _IO_file_seekoff),
JUMP_INIT(seekpos, _IO_default_seekpos),
JUMP_INIT(setbuf, _IO_file_setbuf),
JUMP_INIT(sync, _IO_file_sync),
JUMP_INIT(doallocate, _IO_file_doallocate),
JUMP_INIT(read, _IO_file_read),
JUMP_INIT(write, _IO_file_write),
JUMP_INIT(seek, _IO_file_seek),
JUMP_INIT(close, _IO_file_close),
JUMP_INIT(stat, _IO_file_stat),
JUMP_INIT(showmanyc, _IO_default_showmanyc),
JUMP_INIT(imbue, _IO_default_imbue)
};